From 484647328ee2f73288940774f26396819f513988 Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Tue, 1 Dec 2020 20:23:41 -0500 Subject: [PATCH 01/45] Still a WIP in disassembling --- src/engine/bank01.asm | 54 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 1c003e22..1ee7282b 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8142,7 +8142,59 @@ _TossCoin: ; 71ad (1:71ad) ret ; 0x72ff - INCROM $72ff, $7354 +Func_72ff: ; 72ff (1:72ff) + ldh [hff96], a + ld a, [wDuelType] + cp $01 + ret nz + ldh a, [hff96] + call SerialSendByte + call Func_7344 + ret +; 0x7310 + +Func_7310: ; 7310 (1:7310) + ldh [hff96], a + ld a, [wDuelType] + cp $01 + jr z, .asm_7338 +.asm_7319 + call DoFrame + call CheckAnyAnimationPlaying + jr c, .asm_7319 + ldh a, [hff96] + ret + ldh [hff96], a + ld a, [wDuelType] + cp $01 + jr z, .asm_7338 + ld a, $1e +.asm_732f + call DoFrame + dec a + jr nz, .asm_732f + ldh a, [hff96] + ret +.asm_7338 + call DoFrame + call SerialRecvByte + jr c, .asm_7338 + call Func_7344 + ret +; 0x7344 + +Func_7344: ; 7344 (1:7344) + push af + ld a, [wSerialFlags] + or a + jr nz, .asm_734d + pop af + ret +.asm_734d + call Func_3b31 + call DuelTransmissionError + ret +; 0x7354 BuildVersion: ; 7354 (1:7354) db "VER 12/20 09:36", TX_END From 34c989de1288fbd2ccdaa6caa8ace5f1a18a643b Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Tue, 1 Dec 2020 20:41:14 -0500 Subject: [PATCH 02/45] Still a WIP --- src/engine/bank01.asm | 107 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 1ee7282b..9d5808f3 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8166,7 +8166,7 @@ Func_7310: ; 7310 (1:7310) ret ldh [hff96], a ld a, [wDuelType] - cp $01 + cp CONFUSED jr z, .asm_7338 ld a, $1e .asm_732f @@ -8199,7 +8199,110 @@ Func_7344: ; 7344 (1:7344) BuildVersion: ; 7354 (1:7354) db "VER 12/20 09:36", TX_END - INCROM $7364, $7415 +Func_7364: ; 7364 (1:7364) + xor a + ld [wTileMapFill], a + call ZeroObjectPositionsAndToggleOAMCopy + call EmptyScreen + call LoadSymbolsFont + ld de, $389f + call SetupText + call DrawWideTextBox + call EnableLCD + xor a + ld [wOpponentDeckID], a + call Func_73d8 +.asm_7384 + call DoFrame + ldh a, [hDPadHeld] + or a + jr z, .asm_7384 + ld b, a + and $09 + jr nz, .asm_73cd + bit 1, b + jr nz, .asm_73cb + ld a, [wOpponentDeckID] + bit 4, b + jr z, .asm_73a2 + inc a + cp $35 + jr c, .asm_73a2 + xor a +.asm_73a2 + bit 5, b + jr z, .asm_73ae + or a + jr nz, .asm_73ad + ld a, $34 + jr .asm_73ae +.asm_73ad + dec a +.asm_73ae + bit 6, b + jr z, .asm_73b9 + add $0a + cp $35 + jr c, .asm_73b9 + xor a +.asm_73b9 + bit 7, b + jr z, .asm_73c3 + sub $0a + jr nc, .asm_73c3 + ld a, $34 +.asm_73c3 + ld [wOpponentDeckID], a + call Func_73d8 + jr .asm_7384 +.asm_73cb + scf + ret +.asm_73cd + ld a, [wOpponentDeckID] + ld [wcc19], a + call Func_3ae8 + or a + ret +; 0x73d8 + +Func_73d8: ; 73d8 (1:73d8) + ld a, [wOpponentDeckID] + ld [wcc19], a + call Func_3ae8 + jr c, .asm_73ec + xor a + ld [wOpponentPortrait], a + ld hl, wOpponentName + ld [hli], a + ld [hl], a +.asm_73ec + ld hl, $7408 + call PlaceTextItems + call DrawDuelistPortraitsAndNames + ld a, [wOpponentDeckID] + ld bc, $510 + call WriteTwoByteNumberInTxSymbolFormat + ld a, [wcc18] + ld bc, $f0a + call WriteTwoByteNumberInTxSymbolFormat + ret +; 0x7408 + +Func_7408: ; 7408 (1:7408) + ld a, [bc] + nop + adc c + nop + ld a, [bc] + ld a, [bc] + adc e + nop + inc bc + ld c, $8a + nop + debug_ret +; 0x7415 Func_7415: ; 7415 (1:7415) xor a From 29b3f7ffe3400eb4e4c70045d2239cc0de0f312e Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Wed, 2 Dec 2020 18:17:14 -0500 Subject: [PATCH 03/45] Replaced -bash1 with DUELTYPE_LINK --- src/engine/bank01.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 9d5808f3..d0e57fc1 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8145,7 +8145,7 @@ _TossCoin: ; 71ad (1:71ad) Func_72ff: ; 72ff (1:72ff) ldh [hff96], a ld a, [wDuelType] - cp $01 + cp DUELTYPE_LINK ret nz ldh a, [hff96] call SerialSendByte From 3aa0f86bb581f3289be567a63289551494ba3f9a Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Wed, 2 Dec 2020 18:24:48 -0500 Subject: [PATCH 04/45] CONFUSED gets replaced with something more appropriate --- src/engine/bank01.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index d0e57fc1..251cc6c1 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8166,7 +8166,7 @@ Func_7310: ; 7310 (1:7310) ret ldh [hff96], a ld a, [wDuelType] - cp CONFUSED + cp DUELTYPE_LINK jr z, .asm_7338 ld a, $1e .asm_732f From a8f619e006bbedaf6c7ccd25c1c949f073f5958e Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Wed, 2 Dec 2020 18:36:22 -0500 Subject: [PATCH 05/45] Got rid of unnecessary routine --- src/engine/bank01.asm | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 251cc6c1..03b86d81 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8289,20 +8289,7 @@ Func_73d8: ; 73d8 (1:73d8) ret ; 0x7408 -Func_7408: ; 7408 (1:7408) - ld a, [bc] - nop - adc c - nop - ld a, [bc] - ld a, [bc] - adc e - nop - inc bc - ld c, $8a - nop - debug_ret -; 0x7415 + INCROM $7408, $7415 Func_7415: ; 7415 (1:7415) xor a From 57ca3334247ef444e411911793be242e3bebba29 Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Sat, 5 Dec 2020 23:42:33 -0500 Subject: [PATCH 06/45] More fixing --- src/engine/bank01.asm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 03b86d81..ed424f14 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8156,7 +8156,7 @@ Func_72ff: ; 72ff (1:72ff) Func_7310: ; 7310 (1:7310) ldh [hff96], a ld a, [wDuelType] - cp $01 + cp DUELTYPE_LINK jr z, .asm_7338 .asm_7319 call DoFrame @@ -8205,7 +8205,7 @@ Func_7364: ; 7364 (1:7364) call ZeroObjectPositionsAndToggleOAMCopy call EmptyScreen call LoadSymbolsFont - ld de, $389f + lb de, $38, $9f call SetupText call DrawWideTextBox call EnableLCD @@ -8250,7 +8250,7 @@ Func_7364: ; 7364 (1:7364) jr z, .asm_73c3 sub $0a jr nc, .asm_73c3 - ld a, $34 + ld a, FLAMETHROWER_DECK .asm_73c3 ld [wOpponentDeckID], a call Func_73d8 @@ -8281,10 +8281,10 @@ Func_73d8: ; 73d8 (1:73d8) call PlaceTextItems call DrawDuelistPortraitsAndNames ld a, [wOpponentDeckID] - ld bc, $510 + lb bc, 5, 16 call WriteTwoByteNumberInTxSymbolFormat ld a, [wcc18] - ld bc, $f0a + lb bc, 15, 10 call WriteTwoByteNumberInTxSymbolFormat ret ; 0x7408 From 342ba196ba6efb71c03622e625a54038154a6064 Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Mon, 7 Dec 2020 17:45:21 -0500 Subject: [PATCH 07/45] A bit more improvements --- src/engine/bank01.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index ed424f14..833b0642 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8250,7 +8250,7 @@ Func_7364: ; 7364 (1:7364) jr z, .asm_73c3 sub $0a jr nc, .asm_73c3 - ld a, FLAMETHROWER_DECK + ld a, FLAMETHROWER_DECK_ID .asm_73c3 ld [wOpponentDeckID], a call Func_73d8 From b217f4509508a5c16540fa00f1ec458c8984846a Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Mon, 7 Dec 2020 17:56:31 -0500 Subject: [PATCH 08/45] Replaced hex values with constants --- src/constants/deck_constants.asm | 2 ++ src/engine/bank01.asm | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/constants/deck_constants.asm b/src/constants/deck_constants.asm index 4105242c..5efc329b 100644 --- a/src/constants/deck_constants.asm +++ b/src/constants/deck_constants.asm @@ -66,3 +66,5 @@ ENDM deck_const RESHUFFLE_DECK ; $35 deck_const IMAKUNI_DECK ; $36 DECKS_END EQU const_value + -1 +DECK_IDS_END EQU DECKS_END - 2 + diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 833b0642..53f58510 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8168,7 +8168,7 @@ Func_7310: ; 7310 (1:7310) ld a, [wDuelType] cp DUELTYPE_LINK jr z, .asm_7338 - ld a, $1e + ld a, 30 .asm_732f call DoFrame dec a @@ -8218,39 +8218,39 @@ Func_7364: ; 7364 (1:7364) or a jr z, .asm_7384 ld b, a - and $09 + and A_BUTTON | START jr nz, .asm_73cd - bit 1, b + bit B_BUTTON_F, b jr nz, .asm_73cb ld a, [wOpponentDeckID] - bit 4, b + bit D_RIGHT_F, b jr z, .asm_73a2 inc a - cp $35 + cp DECK_IDS_END jr c, .asm_73a2 xor a .asm_73a2 - bit 5, b + bit D_LEFT_F, b jr z, .asm_73ae or a jr nz, .asm_73ad - ld a, $34 + ld a, IMAKUNI_DECK_ID jr .asm_73ae .asm_73ad dec a .asm_73ae - bit 6, b + bit D_UP_F, b jr z, .asm_73b9 add $0a cp $35 jr c, .asm_73b9 xor a .asm_73b9 - bit 7, b + bit D_DOWN_F, b jr z, .asm_73c3 sub $0a jr nc, .asm_73c3 - ld a, FLAMETHROWER_DECK_ID + ld a, FLAMETHROWER_DECK .asm_73c3 ld [wOpponentDeckID], a call Func_73d8 From dec84633711c8f3a1f5c8d815fb41dfcc58a809e Mon Sep 17 00:00:00 2001 From: pinksylveon Date: Tue, 8 Dec 2020 14:35:10 -0500 Subject: [PATCH 09/45] Changed hex value to IMAKUNI_DECK_ID --- src/constants/deck_constants.asm | 2 +- src/engine/bank01.asm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/constants/deck_constants.asm b/src/constants/deck_constants.asm index 5efc329b..8c8e8c99 100644 --- a/src/constants/deck_constants.asm +++ b/src/constants/deck_constants.asm @@ -66,5 +66,5 @@ ENDM deck_const RESHUFFLE_DECK ; $35 deck_const IMAKUNI_DECK ; $36 DECKS_END EQU const_value + -1 -DECK_IDS_END EQU DECKS_END - 2 +DECK_IDS_END EQU DECKS_END -2 diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 53f58510..c18629f4 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8226,7 +8226,7 @@ Func_7364: ; 7364 (1:7364) bit D_RIGHT_F, b jr z, .asm_73a2 inc a - cp DECK_IDS_END + cp $35 jr c, .asm_73a2 xor a .asm_73a2 @@ -8250,7 +8250,7 @@ Func_7364: ; 7364 (1:7364) jr z, .asm_73c3 sub $0a jr nc, .asm_73c3 - ld a, FLAMETHROWER_DECK + ld a, IMAKUNI_DECK_ID .asm_73c3 ld [wOpponentDeckID], a call Func_73d8 From d70ce81dcd7503b7b849ccfa2a08af4979b7d4e3 Mon Sep 17 00:00:00 2001 From: E Date: Sun, 13 Dec 2020 00:14:24 -0600 Subject: [PATCH 10/45] Adding Multichoice Textbox configuration data --- src/engine/bank03.asm | 88 ++++++++++++++++++++++++++++++--------- src/engine/bank04.asm | 71 ++++++++++++++++++++++++++++--- src/macros/scripts.asm | 8 ++-- tools/script_extractor.py | 8 ++-- 4 files changed, 142 insertions(+), 33 deletions(-) diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 58367e25..a89ecf97 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -2712,27 +2712,62 @@ Func_d244: ; d244 (3:5244) farcall Func_80ba4 jp IncreaseScriptPointerBy2 -Func_d24c: ; d24c (3:524c) - ld hl, $525e +Show_ChooseDeckToDuelAgainst_MultichoiceTextbox: ; d24c (3:524c) + ld hl, .multichoice_menu_args xor a - call Func_d28c + call ShowMultichoiceTextbox ld a, [wd695] ld c, a set_flag_value EVENT_FLAG_76 jp IncreaseScriptPointerBy1 - INCROM $d25e, $d271 +.multichoice_menu_args ;d25e + dw $0000 ;NPC title for textbox under menu + tx Text03f9 ;text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst ;location of table configuration in bank 4 + db $03 ;the value to return when b is pressed + dw $d695 ;ram location to return result into + dw .text_entries ;location of table containing text entries -Func_d271: ; d271 (3:5271) - ld hl, $527b +.text_entries ;d269 + tx Text03f6 + tx Text03f7 + tx Text03f8 + + INCROM $d26f, $d271 + + +Show_ChooseStarterDeck_MultichoiceTextbox: ; d271 (3:5271) + ld hl, .multichoice_menu_args xor a - call Func_d28c + call ShowMultichoiceTextbox jp IncreaseScriptPointerBy1 ; 0xd27b - INCROM $d27b, $d28c +.multichoice_menu_args ;d27b + dw $0000 ;NPC title for textbox under menu + tx Text03fd ;text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck ;location of table configuration in bank 4 + db $00 ;the value to return when b is pressed + dw $d693 ;ram location to return result into + dw .text_entries ;location of table containing text entries -Func_d28c: ; d28c (3:528c) +.text_entries + tx Text03fa + tx Text03fb + tx Text03fc + + +;displays a textbox with multiple choices and a cursor. +;takes as an argument in h1 a pointer to a table +; dw text id for NPC title for textbox under menu +; dw text id for textbox under menu +; dw location of table configuration in bank 4 +; db the value to return when b is pressed +; dw ram location to return result into +; dw location of table containing text entries (optional + +ShowMultichoiceTextbox: ; d28c (3:528c) ld [wd416], a push hl call Func_c241 @@ -2808,10 +2843,10 @@ Func_d28c: ; d28c (3:528c) .asm_d2f5 ret -Func_d2f6: ; d2f6 (3:52f6) - ld hl, $530c +ScriptCommand_ShowSamNormalMultichoice: ; d2f6 (3:52f6) + ld hl, .multichoice_menu_args xor a - call Func_d28c + call ShowMultichoiceTextbox ld a, [wd694] ld c, a set_flag_value EVENT_FLAG_75 @@ -2820,19 +2855,32 @@ Func_d2f6: ; d2f6 (3:52f6) jp IncreaseScriptPointerBy1 ; 0xd30c - INCROM $d30c, $d317 +.multichoice_menu_args ;d30c + tx SamNPCName ;NPC title for textbox under menu + tx Text03fe ;text for textbox under menu + dw SamNormalMultichoice_ConfigurationTable ;location of table configuration in bank 4 + db $03 ;the value to return when b is pressed + dw $d694 ;ram location to return result into + dw $0000 ;location of table containing text entries -Func_d317: ; d317 (3:5317) - ld hl, $532b + +ScriptCommand_ShowSamTutorialMultichoice: ; d317 (s) + ld hl, .multichoice_menu_args ld a, [wd694] - call Func_d28c + call ShowMultichoiceTextbox ld a, [wd694] ld c, a set_flag_value EVENT_FLAG_75 jp IncreaseScriptPointerBy1 -Unknown_d32b: ; d32b (3:532b) - INCROM $d32b, $d336 +.multichoice_menu_args ;d32b + dw $0000 ;NPC title for textbox under menu + dw $0000 ;text for textbox under menu + dw SamTutorialMultichoice_ConfigurationTable ;location of table configuration in bank 4 + db $07 ;the value to return when b is pressed + dw $d694 ;ram location to return result into + dw $0000 ;location of table containing text entries + ScriptCommand_OpenDeckMachine: ; d336 (3:5336) push bc @@ -3333,7 +3381,7 @@ Script_d794: ; d794 (3:5794) .ows_d7bc run_command ScriptCommand_CloseTextBox - run_command Func_d317 + run_command ScriptCommand_ShowSamTutorialMultichoice run_command ScriptCommand_CloseTextBox run_command ScriptCommand_JumpIfFlagEqual db EVENT_FLAG_75 @@ -3478,7 +3526,7 @@ AfterTutorialBattleScript: ; d834 (3:5834) run_command ScriptCommand_CloseTextBox run_command ScriptCommand_PrintTextString tx Text05f2 - run_command Func_d271 + run_command Show_ChooseStarterDeck_MultichoiceTextbox ; 0xd860 INCROM $d860, $d880 diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index a1e504fc..98ed957a 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1023,9 +1023,9 @@ OverworldScriptTable: ; 1217b (4:617b) dw Func_d1b3 dw ScriptCommand_QuitScriptFully dw Func_d244 - dw Func_d24c + dw Show_ChooseDeckToDuelAgainst_MultichoiceTextbox dw ScriptCommand_OpenDeckMachine - dw Func_d271 + dw Show_ChooseStarterDeck_MultichoiceTextbox dw ScriptCommand_EnterMap dw ScriptCommand_MoveArbitraryNPC dw Func_d209 @@ -1048,8 +1048,8 @@ OverworldScriptTable: ; 1217b (4:617b) dw ScriptCommand_WaitForSongToFinish dw Func_d435 dw ScriptCommand_AskQuestionJumpDefaultYes - dw Func_d2f6 - dw Func_d317 + dw ScriptCommand_ShowSamNormalMultichoice + dw ScriptCommand_ShowSamTutorialMultichoice dw Func_d43d dw ScriptCommand_EndScriptLoop2 dw ScriptCommand_EndScriptLoop3 @@ -1073,7 +1073,68 @@ OverworldScriptTable: ; 1217b (4:617b) dw ScriptCommand_EndScriptLoop9 dw ScriptCommand_EndScriptLoop10 - INCROM $1224b, $1229f + +MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst: ;1224b + db $04, $00 ; x, y to start drawing box + db $10, $08 ; width, height of box + db $06, $02 ; x, y coordinate to start printing next text + tx Text03f6 ; text id to print next + db $06, $04 ; x, y coordinate to start printing next text + tx Text03f7 ; text id to print next + db $06, $06 ; x, y coordinate to start printing next text + tx Text03f8 ; text id to print next + db $ff ; marker byte -- end text entries + db $05, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $03 ; cursor max index + db $0f ; curor image + + db $00, $00, $00 ; marker bytes -- end of config table + +MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck: ;12264 + db $04, $00 ; x, y to start drawing box + db $10, $08 ; width, height of box + db $06, $02 ; x, y coordinate to start printing next text + tx Text03fa ; text id to print next + db $06, $04 ; x, y coordinate to start printing next text + tx Text03fb ; text id to print next + db $06, $06 ; x, y coordinate to start printing next text + tx Text03fc ; text id to print next + db $ff ; marker byte -- end text entries + db $05, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $03 ; cursor max index + db $0f ; curor image + + db $00, $00, $00 ; marker bytes -- end of config table + +SamNormalMultichoice_ConfigurationTable: ;1227d + db $0A, $00 ; x, y to start drawing box + db $0A, $0A ; width, height of box + db $0C, $02 ; x, y coordinate to start printing next text + tx Text03ff ; text id to print next + db $ff ; marker byte -- end text entries + db $0b, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $04 ; cursor max index + db $0f ; curor image + + db $00, $00, $00 ; marker bytes -- end of config table + +SamTutorialMultichoice_ConfigurationTable: ;1228e + db $06, $00 ; x, y to start drawing box + db $0E, $12 ; width, height of box + db $08, $02 ; x coordinate to start printing text + tx Text0400 ; text id to print next + db $ff ; marker byte -- end text entries + db $07, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $08 ; cursor max index + db $0f ; curor image + + db $00, $00, $00 ; marker bytes -- end of config table + + Unknown_1229f: ; 1229f (4:629f) INCROM $1229f, $126d1 diff --git a/src/macros/scripts.asm b/src/macros/scripts.asm index ed7b30d5..963d3e9b 100644 --- a/src/macros/scripts.asm +++ b/src/macros/scripts.asm @@ -69,9 +69,9 @@ ENDM const Func_d1b3_index ; $34 const ScriptCommand_QuitScriptFully_index ; $35 const Func_d244_index ; $36 - const Func_d24c_index ; $37 + const Show_ChooseDeckToDuelAgainst_MultichoiceTextbox_index ; $37 const ScriptCommand_OpenDeckMachine_index ; $38 - const Func_d271_index ; $39 + const Show_ChooseStarterDeck_MultichoiceTextbox_index ; $39 const ScriptCommand_EnterMap_index ; $3a const ScriptCommand_MoveArbitraryNPC_index ; $3b const Func_d209_index ; $3c @@ -94,8 +94,8 @@ ENDM const ScriptCommand_WaitForSongToFinish_index ; $4d const Func_d435_index ; $4e const ScriptCommand_AskQuestionJumpDefaultYes_index ; $4f - const Func_d2f6_index ; $50 - const Func_d317_index ; $51 + const ScriptCommand_ShowSamNormalMultichoice_index ; $50 + const ScriptCommand_ShowSamTutorialMultichoice_index ; $51 const Func_d43d_index ; $52 const ScriptCommand_EndScriptLoop2_index ; $53 const ScriptCommand_EndScriptLoop3_index ; $54 diff --git a/tools/script_extractor.py b/tools/script_extractor.py index 812678c1..ba7427da 100644 --- a/tools/script_extractor.py +++ b/tools/script_extractor.py @@ -230,9 +230,9 @@ def createList(): # this is a func just so all this can go at the bottom ("Func_d1b3", "", DO_NOT_QUIT), ("ScriptCommand_QuitScriptFully", "", QUIT_SPECIAL), ("Func_d244", "q", DO_NOT_QUIT), - ("Func_d24c", "q", DO_NOT_QUIT), + ("Show_ChooseDeckToDuelAgainst_MultichoiceTextbox", "q", DO_NOT_QUIT), ("ScriptCommand_OpenDeckMachine", "b", DO_NOT_QUIT), - ("Func_d271", "q", DO_NOT_QUIT), + ("Show_ChooseStarterDeck_MultichoiceTextbox", "q", DO_NOT_QUIT), ("ScriptCommand_EnterMap", "bbood", DO_NOT_QUIT), ("ScriptCommand_MoveArbitraryNPC", "bm", DO_NOT_QUIT), ("Func_d209", "", DO_NOT_QUIT), @@ -255,8 +255,8 @@ def createList(): # this is a func just so all this can go at the bottom ("ScriptCommand_WaitForSongToFinish", "q", DO_NOT_QUIT), ("Func_d435", "b", DO_NOT_QUIT), ("ScriptCommand_AskQuestionJumpDefaultYes", "tj", DO_NOT_QUIT), - ("Func_d2f6", "q", DO_NOT_QUIT), - ("Func_d317", "", DO_NOT_QUIT), + ("ScriptCommand_ShowSamNormalMultichoice", "q", DO_NOT_QUIT), + ("ScriptCommand_ShowSamTutorialMultichoice", "", DO_NOT_QUIT), ("Func_d43d", "", DO_NOT_QUIT), ("ScriptCommand_EndScriptLoop2", "q", QUIT_CONTINUE_CODE), ("ScriptCommand_EndScriptLoop3", "q", QUIT_CONTINUE_CODE), From 45de771f8298595664346b95c812293b1f258ab8 Mon Sep 17 00:00:00 2001 From: E Date: Sun, 13 Dec 2020 00:21:46 -0600 Subject: [PATCH 11/45] Normalizing function names --- src/engine/bank03.asm | 6 +++--- src/engine/bank04.asm | 4 ++-- src/macros/scripts.asm | 4 ++-- tools/script_extractor.py | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index a89ecf97..2f922a60 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -2712,7 +2712,7 @@ Func_d244: ; d244 (3:5244) farcall Func_80ba4 jp IncreaseScriptPointerBy2 -Show_ChooseDeckToDuelAgainst_MultichoiceTextbox: ; d24c (3:524c) +ScriptCommand_ShowMultichoiceTextbox_ChooseDeckToDuelAgainst: ; d24c (3:524c) ld hl, .multichoice_menu_args xor a call ShowMultichoiceTextbox @@ -2737,7 +2737,7 @@ Show_ChooseDeckToDuelAgainst_MultichoiceTextbox: ; d24c (3:524c) INCROM $d26f, $d271 -Show_ChooseStarterDeck_MultichoiceTextbox: ; d271 (3:5271) +ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck: ; d271 (3:5271) ld hl, .multichoice_menu_args xor a call ShowMultichoiceTextbox @@ -3526,7 +3526,7 @@ AfterTutorialBattleScript: ; d834 (3:5834) run_command ScriptCommand_CloseTextBox run_command ScriptCommand_PrintTextString tx Text05f2 - run_command Show_ChooseStarterDeck_MultichoiceTextbox + run_command ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck ; 0xd860 INCROM $d860, $d880 diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 98ed957a..da26e556 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1023,9 +1023,9 @@ OverworldScriptTable: ; 1217b (4:617b) dw Func_d1b3 dw ScriptCommand_QuitScriptFully dw Func_d244 - dw Show_ChooseDeckToDuelAgainst_MultichoiceTextbox + dw ScriptCommand_ShowMultichoiceTextbox_ChooseDeckToDuelAgainst dw ScriptCommand_OpenDeckMachine - dw Show_ChooseStarterDeck_MultichoiceTextbox + dw ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck dw ScriptCommand_EnterMap dw ScriptCommand_MoveArbitraryNPC dw Func_d209 diff --git a/src/macros/scripts.asm b/src/macros/scripts.asm index 963d3e9b..85f8764a 100644 --- a/src/macros/scripts.asm +++ b/src/macros/scripts.asm @@ -69,9 +69,9 @@ ENDM const Func_d1b3_index ; $34 const ScriptCommand_QuitScriptFully_index ; $35 const Func_d244_index ; $36 - const Show_ChooseDeckToDuelAgainst_MultichoiceTextbox_index ; $37 + const ScriptCommand_ShowMultichoiceTextbox_ChooseDeckToDuelAgainst_index ; $37 const ScriptCommand_OpenDeckMachine_index ; $38 - const Show_ChooseStarterDeck_MultichoiceTextbox_index ; $39 + const ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck_index ; $39 const ScriptCommand_EnterMap_index ; $3a const ScriptCommand_MoveArbitraryNPC_index ; $3b const Func_d209_index ; $3c diff --git a/tools/script_extractor.py b/tools/script_extractor.py index ba7427da..d8ebc06f 100644 --- a/tools/script_extractor.py +++ b/tools/script_extractor.py @@ -230,9 +230,9 @@ def createList(): # this is a func just so all this can go at the bottom ("Func_d1b3", "", DO_NOT_QUIT), ("ScriptCommand_QuitScriptFully", "", QUIT_SPECIAL), ("Func_d244", "q", DO_NOT_QUIT), - ("Show_ChooseDeckToDuelAgainst_MultichoiceTextbox", "q", DO_NOT_QUIT), + ("ScriptCommand_ShowMultichoiceTextbox_ChooseDeckToDuelAgainst", "q", DO_NOT_QUIT), ("ScriptCommand_OpenDeckMachine", "b", DO_NOT_QUIT), - ("Show_ChooseStarterDeck_MultichoiceTextbox", "q", DO_NOT_QUIT), + ("ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck", "q", DO_NOT_QUIT), ("ScriptCommand_EnterMap", "bbood", DO_NOT_QUIT), ("ScriptCommand_MoveArbitraryNPC", "bm", DO_NOT_QUIT), ("Func_d209", "", DO_NOT_QUIT), From b10768d7539d01df09cdbd2ec66a82406c382e7c Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Sun, 13 Dec 2020 14:27:45 -0600 Subject: [PATCH 12/45] Use rgbgfx instead of gfx.py and use pokered's Makefile structure --- Makefile | 117 ++++++++-- README.md | 31 +-- rom.sha1 | 1 + src/audio/music1.asm | 116 +++++----- src/audio/music2.asm | 116 +++++----- src/audio/sfx.asm | 18 +- src/engine/bank04.asm | 4 +- src/engine/bank1c.asm | 6 +- src/engine/home.asm | 244 ++++++++++---------- src/gfx/cards/grassenergy.8x6.png | Bin 542 -> 593 bytes src/gfx/duel/cgb_symbols.t7.png | Bin 2960 -> 1270 bytes src/gfx/duel/dmg_sgb_symbols.t7.png | Bin 3107 -> 1374 bytes src/gfx/duel/other.t7.png | Bin 1588 -> 820 bytes src/gfx/fonts/full_width/4.t3.png | Bin 2279 -> 1153 bytes src/gfx/fonts/symbols.png | Bin 1398 -> 726 bytes tcg.link => src/layout.link | 0 src/rgbdscheck.asm | 12 + tools/.gitignore | 2 + tools/Makefile | 16 ++ tools/common.h | 40 ++++ tools/gfx.c | 345 ++++++++++++++++++++++++++++ tools/scan_includes.c | 197 ++++++++++++++++ 22 files changed, 974 insertions(+), 291 deletions(-) create mode 100644 rom.sha1 rename tcg.link => src/layout.link (100%) create mode 100644 src/rgbdscheck.asm create mode 100644 tools/.gitignore create mode 100644 tools/Makefile create mode 100644 tools/common.h create mode 100644 tools/gfx.c create mode 100644 tools/scan_includes.c diff --git a/Makefile b/Makefile index e783e631..6d414ec4 100644 --- a/Makefile +++ b/Makefile @@ -1,39 +1,106 @@ -.PHONY: all compare clean +rom := poketcg.gbc + +rom_obj := \ +src/main.o \ +src/gfx.o \ +src/text.o \ +src/audio.o \ +src/wram.o \ +src/hram.o + + +### Build tools + +ifeq (,$(shell which sha1sum)) +SHA1 := shasum +else +SHA1 := sha1sum +endif + +RGBDS ?= +RGBASM ?= $(RGBDS)rgbasm +RGBFIX ?= $(RGBDS)rgbfix +RGBGFX ?= $(RGBDS)rgbgfx +RGBLINK ?= $(RGBDS)rgblink + + +### Build targets .SUFFIXES: -.SUFFIXES: .asm .o .gbc .png .2bpp .1bpp .pal .SECONDEXPANSION: +.PRECIOUS: +.SECONDARY: +.PHONY: all tcg clean tidy compare tools -OBJS = src/main.o src/gfx.o src/text.o src/audio.o src/wram.o src/hram.o -EXTRAS = tools +all: $(rom) +tcg: $(rom) -$(foreach obj, $(OBJS), \ - $(eval $(obj:.o=)_dep = $(shell python $(EXTRAS)/scan_includes.py $(obj:.o=.asm))) \ -) +clean: tidy + find src/gfx \( -iname '*.1bpp' -o -iname '*.2bpp' \) -delete -all: tcg.gbc compare +tidy: + rm -f $(rom) $(rom_obj) $(rom:.gbc=.map) $(rom:.gbc=.sym) src/rgbdscheck.o + $(MAKE) clean -C tools/ -compare: baserom.gbc tcg.gbc - cmp $^ +compare: $(rom) + @$(SHA1) -c rom.sha1 -$(OBJS): $$*.asm $$($$*_dep) - @python $(EXTRAS)/gfx.py 2bpp $(2bppq) - @python $(EXTRAS)/gfx.py 1bpp $(1bppq) - rgbasm -h -i src/ -o $@ $< +tools: + $(MAKE) -C tools/ -tcg.gbc: $(OBJS) - rgblink -n $*.sym -m $*.map -l $*.link -o $@ $^ - rgbfix -cjsv -k 01 -l 0x33 -m 0x1b -p 0 -r 03 -t POKECARD -i AXQE $@ - sort $*.sym -o $*.sym -clean: - rm -f tcg.gbc $(OBJS) *.sym *.map - find . \( -iname '*.1bpp' -o -iname '*.2bpp' \) -exec rm {} + +RGBASMFLAGS = -h -i src/ -L -Weverything +# Create a sym/map for debug purposes if `make` run with `DEBUG=1` +ifeq ($(DEBUG),1) +RGBASMFLAGS += -E +endif + +src/rgbdscheck.o: src/rgbdscheck.asm + $(RGBASM) -o $@ $< + +# The dep rules have to be explicit or else missing files won't be reported. +# As a side effect, they're evaluated immediately instead of when the rule is invoked. +# It doesn't look like $(shell) can be deferred so there might not be a better way. +define DEP +$1: $2 $$(shell tools/scan_includes -s -i src/ $2) | src/rgbdscheck.o + $$(RGBASM) $$(RGBASMFLAGS) -o $$@ $$< +endef + +# Build tools when building the rom. +# This has to happen before the rules are processed, since that's when scan_includes is run. +ifeq (,$(filter clean tidy tools,$(MAKECMDGOALS))) + +$(info $(shell $(MAKE) -C tools)) + +# Dependencies for objects +$(foreach obj, $(rom_obj), $(eval $(call DEP,$(obj),$(obj:.o=.asm)))) + +endif + + +%.asm: ; + + +opts = -cjsv -k 01 -l 0x33 -m 0x1b -p 0 -r 03 -t POKECARD -i AXQE + +$(rom): $(rom_obj) src/layout.link + $(RGBLINK) -m $(rom:.gbc=.map) -n $(rom:.gbc=.sym) -l src/layout.link -o $@ $(filter %.o,$^) + $(RGBFIX) $(opts) $@ + + +### Misc file-specific graphics rules + + +### Catch-all graphics rules + +%.png: ; %.2bpp: %.png - $(eval 2bppq += $<) - @rm -f $@ + $(RGBGFX) $(rgbgfx) -o $@ $< + $(if $(tools/gfx),\ + tools/gfx $(tools/gfx) -o $@ $@) %.1bpp: %.png - $(eval 1bppq += $<) - @rm -f $@ + $(RGBGFX) $(rgbgfx) -d1 -o $@ $< + $(if $(tools/gfx),\ + tools/gfx $(tools/gfx) -d1 -o $@ $@) diff --git a/README.md b/README.md index 7d8284d0..4d5df560 100644 --- a/README.md +++ b/README.md @@ -4,27 +4,30 @@ This is a disassembly of Pokémon TCG. It uses the following ROM as a base: -* Pokémon Trading Card Game (U) [C][!].gbc `md5: 219b2cc64e5a052003015d4bd4c622cd` +- Pokémon Trading Card Game (U) [C][!].gbc `sha1: 0f8670a583255cff3e5b7ca71b5d7454d928fc48` To assemble, first download RGBDS (https://github.com/gbdev/rgbds/releases) and extract it to /usr/local/bin. Copy the above ROM to this directory as "baserom.gbc". Run `make` in your shell. -This will output a file named "tcg.gbc". +This will output a file named "poketcg.gbc". -# See Also +## See also -* Disassembly of [**Pokémon Red/Blue**][pokered] -* Disassembly of [**Pokémon Yellow**][pokeyellow] -* Disassembly of [**Pokémon Gold**][pokegold] -* Disassembly of [**Pokémon Crystal**][pokecrystal] -* Disassembly of [**Pokémon Pinball**][pokepinball] -* Disassembly of [**Pokémon Ruby**][pokeruby] -* Disassembly of [**Pokémon Fire Red**][pokefirered] -* Disassembly of [**Pokémon Emerald**][pokeemerald] -* Discord: [**pret**][Discord] -* irc: **irc.freenode.net** [**#pret**][irc] +- **Discord:** [pret][discord] +- **IRC:** [freenode#pret][irc] + +Other disassembly projects: + +- [**Pokémon Red/Blue**][pokered] +- [**Pokémon Yellow**][pokeyellow] +- [**Pokémon Gold/Silver**][pokegold] +- [**Pokémon Crystal**][pokecrystal] +- [**Pokémon Pinball**][pokepinball] +- [**Pokémon Ruby**][pokeruby] +- [**Pokémon FireRed**][pokefirered] +- [**Pokémon Emerald**][pokeemerald] [pokered]: https://github.com/pret/pokered [pokeyellow]: https://github.com/pret/pokeyellow @@ -34,5 +37,5 @@ This will output a file named "tcg.gbc". [pokeruby]: https://github.com/pret/pokeruby [pokefirered]: https://github.com/pret/pokefirered [pokeemerald]: https://github.com/pret/pokeemerald -[Discord]: https://discord.gg/d5dubZ3 +[discord]: https://discord.gg/d5dubZ3 [irc]: https://kiwiirc.com/client/irc.freenode.net/?#pret diff --git a/rom.sha1 b/rom.sha1 new file mode 100644 index 00000000..335f3e82 --- /dev/null +++ b/rom.sha1 @@ -0,0 +1 @@ +0f8670a583255cff3e5b7ca71b5d7454d928fc48 *poketcg.gbc diff --git a/src/audio/music1.asm b/src/audio/music1.asm index a3a6e9e8..03c55b9a 100644 --- a/src/audio/music1.asm +++ b/src/audio/music1.asm @@ -106,13 +106,13 @@ Func_f406f: ; f406f (3d:406f) Music1_Init: ; f407d (3d:407d) xor a - ld [rNR52], a + ldh [rNR52], a ld a, $80 - ld [rNR52], a + ldh [rNR52], a ld a, $77 - ld [rNR50], a + ldh [rNR50], a ld a, $ff - ld [rNR51], a + ldh [rNR51], a ld a, $3d ld [wCurSongBank], a ld a, $80 @@ -216,34 +216,34 @@ Music1_StopAllChannels: ; f414b (3d:414b) bit 0, d jr nz, .stop_channel_2 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .stop_channel_2 xor a ld [wMusicIsPlaying + 1], a bit 1, d jr nz, .stop_channel_4 ld a, $8 - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .stop_channel_4 xor a ld [wMusicIsPlaying + 3], a bit 3, d jr nz, .stop_channel_3 ld a, $8 - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .stop_channel_3 xor a ld [wMusicIsPlaying + 2], a bit 2, d jr nz, .done ld a, $0 - ld [rNR32], a + ldh [rNR32], a .done ret @@ -429,9 +429,9 @@ Music1_UpdateChannel1: ; f42a5 (3d:42a5) bit 0, a jr nz, .asm_f4309 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .asm_f4309 ret @@ -482,9 +482,9 @@ Music1_UpdateChannel2: ; f430a (3d:430a) bit 1, a jr nz, .asm_f436e ld a, $8 - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .asm_f436e ret @@ -506,7 +506,7 @@ Music1_UpdateChannel3: ; f436f (3d:436f) cp $1 jr z, .asm_f4398 ld a, [wMusicE9 + 2] - ld [rNR32], a + ldh [rNR32], a .asm_f4398 ld a, [wddbb + 2] dec a @@ -531,9 +531,9 @@ Music1_UpdateChannel3: ; f436f (3d:436f) bit 2, a jr nz, .asm_f43cd ld a, $0 - ld [rNR32], a + ldh [rNR32], a ld a, $80 - ld [rNR34], a + ldh [rNR34], a .asm_f43cd ret @@ -569,9 +569,9 @@ Music1_UpdateChannel4: ; f43ce (3d:43ce) xor a ld [wddef], a ld a, $8 - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .asm_f4413 ret @@ -1167,19 +1167,19 @@ Func_f4714: ; f4714 (3d:4714) cp $80 jr z, .asm_f4733 ld a, [wMusicVolume] - ld [rNR12], a + ldh [rNR12], a ld d, $80 .asm_f4733 ld [hl], $2 ld a, $8 - ld [rNR10], a + ldh [rNR10], a ld a, [wMusicDuty1] - ld [rNR11], a + ldh [rNR11], a ld a, [wMusicCh1CurPitch] - ld [rNR13], a + ldh [rNR13], a ld a, [wMusicCh1CurOctave] or d - ld [rNR14], a + ldh [rNR14], a .asm_f4749 ret .asm_f474a @@ -1206,17 +1206,17 @@ Func_f475a: ; f475a (3d:475a) cp $80 jr z, .asm_f4779 ld a, [wMusicVolume + 1] - ld [rNR22], a + ldh [rNR22], a ld d, $80 .asm_f4779 ld [hl], $2 ld a, [wMusicDuty2] - ld [rNR21], a + ldh [rNR21], a ld a, [wMusicCh2CurPitch] - ld [rNR23], a + ldh [rNR23], a ld a, [wMusicCh2CurOctave] or d - ld [rNR24], a + ldh [rNR24], a .asm_f478b ret .asm_f478c @@ -1239,7 +1239,7 @@ Func_f479c: ; f479c (3d:479c) or a jr z, .no_wave_change xor a - ld [rNR30], a + ldh [rNR30], a call Music1_LoadWaveInstrument ld d, $80 .no_wave_change @@ -1251,28 +1251,28 @@ Func_f479c: ; f479c (3d:479c) cp $80 jr z, .asm_f47cc ld a, [wMusicVolume + 2] - ld [rNR32], a + ldh [rNR32], a xor a - ld [rNR30], a + ldh [rNR30], a ld d, $80 .asm_f47cc ld [hl], $2 xor a - ld [rNR31], a + ldh [rNR31], a ld a, [wMusicCh3CurPitch] - ld [rNR33], a + ldh [rNR33], a ld a, $80 - ld [rNR30], a + ldh [rNR30], a ld a, [wMusicCh3CurOctave] or d - ld [rNR34], a + ldh [rNR34], a .asm_f47e0 ret .asm_f47e1 ld hl, wMusicTie ld [hl], $0 xor a - ld [rNR30], a + ldh [rNR30], a ret Music1_LoadWaveInstrument: ; f479c (3d:47ea) @@ -1349,7 +1349,7 @@ Func_f4839: ; f4839 (3d:4839) jr nz, .asm_f4853 jr asm_f482a .asm_f4853 - ld [rNR43], a + ldh [rNR43], a inc de ld a, d ld [hld], a @@ -1368,7 +1368,7 @@ Func_f485a: ; f485a (3d:485a) Func_f4866: ; f4866 (3d:4866) ld a, [wMusicPanning] - ld [rNR50], a + ldh [rNR50], a ld a, [wdd8c] or a ld hl, wMusicDC @@ -1397,7 +1397,7 @@ Func_f4866: ; f4866 (3d:4866) swap e or e and d - ld [rNR51], a + ldh [rNR51], a ret Music1_UpdateVibrato: ; f4898 (3d:4898) @@ -1495,13 +1495,13 @@ Func_f490b: ; f490b (3d:490b) bit 0, a jr nz, .done ld a, e - ld [rNR13], a - ld a, [rNR11] + ldh [rNR13], a + ldh a, [rNR11] and $c0 - ld [rNR11], a + ldh [rNR11], a ld a, d and $3f - ld [rNR14], a + ldh [rNR14], a ret .not_channel_1 cp $1 @@ -1513,12 +1513,12 @@ Func_f490b: ; f490b (3d:490b) bit 1, a jr nz, .done ld a, e - ld [rNR23], a - ld a, [rNR21] + ldh [rNR23], a + ldh a, [rNR21] and $c0 - ld [rNR21], a + ldh [rNR21], a ld a, d - ld [rNR24], a + ldh [rNR24], a ret .not_channel_2 cp $2 @@ -1530,11 +1530,11 @@ Func_f490b: ; f490b (3d:490b) bit 2, a jr nz, .done ld a, e - ld [rNR33], a + ldh [rNR33], a xor a - ld [rNR31], a + ldh [rNR31], a ld a, d - ld [rNR34], a + ldh [rNR34], a .done ret @@ -1567,28 +1567,28 @@ Func_f4980: ; f4980 (3d:4980) bit 0, d jr nz, .asm_f4990 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .asm_f4990 bit 1, d jr nz, .asm_f499c swap a - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .asm_f499c bit 3, d jr nz, .asm_f49a8 swap a - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .asm_f49a8 bit 2, d jr nz, .asm_f49b0 ld a, $0 - ld [rNR32], a + ldh [rNR32], a .asm_f49b0 ret diff --git a/src/audio/music2.asm b/src/audio/music2.asm index e13389e9..4a8178e9 100644 --- a/src/audio/music2.asm +++ b/src/audio/music2.asm @@ -106,13 +106,13 @@ Func_f806f: ; f806f (3e:406f) Music2_Init: ; f807d (3e:407d) xor a - ld [rNR52], a + ldh [rNR52], a ld a, $80 - ld [rNR52], a + ldh [rNR52], a ld a, $77 - ld [rNR50], a + ldh [rNR50], a ld a, $ff - ld [rNR51], a + ldh [rNR51], a ld a, $3d ld [wCurSongBank], a ld a, $80 @@ -216,34 +216,34 @@ Music2_StopAllChannels: ; f814b (3e:414b) bit 0, d jr nz, .stop_channel_2 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .stop_channel_2 xor a ld [wMusicIsPlaying + 1], a bit 1, d jr nz, .stop_channel_4 ld a, $8 - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .stop_channel_4 xor a ld [wMusicIsPlaying + 3], a bit 3, d jr nz, .stop_channel_3 ld a, $8 - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .stop_channel_3 xor a ld [wMusicIsPlaying + 2], a bit 2, d jr nz, .done ld a, $0 - ld [rNR32], a + ldh [rNR32], a .done ret @@ -429,9 +429,9 @@ Music2_UpdateChannel1: ; f82a5 (3e:42a5) bit 0, a jr nz, .asm_f8309 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .asm_f8309 ret @@ -482,9 +482,9 @@ Music2_UpdateChannel2: ; f830a (3e:430a) bit 1, a jr nz, .asm_f836e ld a, $8 - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .asm_f836e ret @@ -506,7 +506,7 @@ Music2_UpdateChannel3: ; f836f (3e:436f) cp $1 jr z, .asm_f8398 ld a, [wMusicE9 + 2] - ld [rNR32], a + ldh [rNR32], a .asm_f8398 ld a, [wddbb + 2] dec a @@ -531,9 +531,9 @@ Music2_UpdateChannel3: ; f836f (3e:436f) bit 2, a jr nz, .asm_f83cd ld a, $0 - ld [rNR32], a + ldh [rNR32], a ld a, $80 - ld [rNR34], a + ldh [rNR34], a .asm_f83cd ret @@ -569,9 +569,9 @@ Music2_UpdateChannel4: ; f83ce (3e:43ce) xor a ld [wddef], a ld a, $8 - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .asm_f8413 ret @@ -1167,19 +1167,19 @@ Func_f8714: ; f8714 (3e:4714) cp $80 jr z, .asm_f8733 ld a, [wMusicVolume] - ld [rNR12], a + ldh [rNR12], a ld d, $80 .asm_f8733 ld [hl], $2 ld a, $8 - ld [rNR10], a + ldh [rNR10], a ld a, [wMusicDuty1] - ld [rNR11], a + ldh [rNR11], a ld a, [wMusicCh1CurPitch] - ld [rNR13], a + ldh [rNR13], a ld a, [wMusicCh1CurOctave] or d - ld [rNR14], a + ldh [rNR14], a .asm_f8749 ret .asm_f874a @@ -1206,17 +1206,17 @@ Func_f875a: ; f875a (3e:475a) cp $80 jr z, .asm_f8779 ld a, [wMusicVolume + 1] - ld [rNR22], a + ldh [rNR22], a ld d, $80 .asm_f8779 ld [hl], $2 ld a, [wMusicDuty2] - ld [rNR21], a + ldh [rNR21], a ld a, [wMusicCh2CurPitch] - ld [rNR23], a + ldh [rNR23], a ld a, [wMusicCh2CurOctave] or d - ld [rNR24], a + ldh [rNR24], a .asm_f878b ret .asm_f878c @@ -1239,7 +1239,7 @@ Func_f879c: ; f879c (3e:479c) or a jr z, .no_wave_change xor a - ld [rNR30], a + ldh [rNR30], a call Music2_LoadWaveInstrument ld d, $80 .no_wave_change @@ -1251,28 +1251,28 @@ Func_f879c: ; f879c (3e:479c) cp $80 jr z, .asm_f87cc ld a, [wMusicVolume + 2] - ld [rNR32], a + ldh [rNR32], a xor a - ld [rNR30], a + ldh [rNR30], a ld d, $80 .asm_f87cc ld [hl], $2 xor a - ld [rNR31], a + ldh [rNR31], a ld a, [wMusicCh3CurPitch] - ld [rNR33], a + ldh [rNR33], a ld a, $80 - ld [rNR30], a + ldh [rNR30], a ld a, [wMusicCh3CurOctave] or d - ld [rNR34], a + ldh [rNR34], a .asm_f87e0 ret .asm_f87e1 ld hl, wMusicTie ld [hl], $0 xor a - ld [rNR30], a + ldh [rNR30], a ret Music2_LoadWaveInstrument: ; f879c (3e:47ea) @@ -1349,7 +1349,7 @@ Func_f8839: ; f8839 (3e:4839) jr nz, .asm_f8853 jr asm_f882a .asm_f8853 - ld [rNR43], a + ldh [rNR43], a inc de ld a, d ld [hld], a @@ -1368,7 +1368,7 @@ Func_f885a: ; f885a (3e:485a) Func_f8866: ; f8866 (3e:4866) ld a, [wMusicPanning] - ld [rNR50], a + ldh [rNR50], a ld a, [wdd8c] or a ld hl, wMusicDC @@ -1397,7 +1397,7 @@ Func_f8866: ; f8866 (3e:4866) swap e or e and d - ld [rNR51], a + ldh [rNR51], a ret Func_f8898: ; f8898 (3e:4898) @@ -1495,13 +1495,13 @@ Func_f890b: ; f890b (3e:490b) bit 0, a jr nz, .done ld a, e - ld [rNR13], a - ld a, [rNR11] + ldh [rNR13], a + ldh a, [rNR11] and $c0 - ld [rNR11], a + ldh [rNR11], a ld a, d and $3f - ld [rNR14], a + ldh [rNR14], a ret .not_channel_1 cp $1 @@ -1513,12 +1513,12 @@ Func_f890b: ; f890b (3e:490b) bit 1, a jr nz, .done ld a, e - ld [rNR23], a - ld a, [rNR21] + ldh [rNR23], a + ldh a, [rNR21] and $c0 - ld [rNR21], a + ldh [rNR21], a ld a, d - ld [rNR24], a + ldh [rNR24], a ret .not_channel_2 cp $2 @@ -1530,11 +1530,11 @@ Func_f890b: ; f890b (3e:490b) bit 2, a jr nz, .done ld a, e - ld [rNR33], a + ldh [rNR33], a xor a - ld [rNR31], a + ldh [rNR31], a ld a, d - ld [rNR34], a + ldh [rNR34], a .done ret @@ -1567,28 +1567,28 @@ Func_f8980: ; f8980 (3e:4980) bit 0, d jr nz, .asm_f8990 ld a, $8 - ld [rNR12], a + ldh [rNR12], a swap a - ld [rNR14], a + ldh [rNR14], a .asm_f8990 bit 1, d jr nz, .asm_f899c swap a - ld [rNR22], a + ldh [rNR22], a swap a - ld [rNR24], a + ldh [rNR24], a .asm_f899c bit 3, d jr nz, .asm_f89a8 swap a - ld [rNR42], a + ldh [rNR42], a swap a - ld [rNR44], a + ldh [rNR44], a .asm_f89a8 bit 2, d jr nz, .asm_f89b0 ld a, $0 - ld [rNR32], a + ldh [rNR32], a .asm_f89b0 ret diff --git a/src/audio/sfx.asm b/src/audio/sfx.asm index 6b3e2bcd..c6821915 100644 --- a/src/audio/sfx.asm +++ b/src/audio/sfx.asm @@ -400,7 +400,7 @@ SFX_7: ; fc202 (3f:4202) ld h, [hl] ld l, a ld a, $0 - ld [rNR30], a + ldh [rNR30], a ld b, d ld de, $ff30 .asm_fc215 @@ -414,7 +414,7 @@ SFX_7: ; fc202 (3f:4202) ld a, $1 ld [wMusicWaveChange], a ld a, $80 - ld [rNR30], a + ldh [rNR30], a ld b, $0 pop hl jp Func_fc094 @@ -481,14 +481,14 @@ Func_fc26c: ; fc26c (3f:426c) Func_fc279: ; fc279 (3f:4279) ld a, $8 - ld a, [rNR12] - ld a, [rNR22] - ld a, [rNR32] - ld a, [rNR42] + ldh a, [rNR12] + ldh a, [rNR22] + ldh a, [rNR32] + ldh a, [rNR42] ld a, $80 - ld a, [rNR14] - ld a, [rNR24] - ld a, [rNR44] + ldh a, [rNR14] + ldh a, [rNR24] + ldh a, [rNR44] xor a ld [wdd8c], a ret diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index a1e504fc..8fb4d291 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -13,8 +13,8 @@ Func_10000: ; 10000 (4:4000) bit LCDC_ENABLE_F, a jr nz, .asm_10025 xor a - ld [rSCX], a - ld [rSCY], a + ldh [rSCX], a + ldh [rSCY], a .asm_10025 call Func_1288c diff --git a/src/engine/bank1c.asm b/src/engine/bank1c.asm index cff0a969..b8ac4fb6 100644 --- a/src/engine/bank1c.asm +++ b/src/engine/bank1c.asm @@ -176,13 +176,13 @@ Func_70136: ; 70136 (1c:4136) or LCDC_BGON ld [wLCDC], a ld a, %11100100 - ld [rBGP], a + ldh [rBGP], a call SetBGP xor a ldh [hSCX], a - ld [rSCX], a + ldh [rSCX], a ldh [hSCY], a - ld [rSCY], a + ldh [rSCY], a pop de pop bc pop hl diff --git a/src/engine/home.asm b/src/engine/home.asm index ff887fd1..f33ec2f7 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -39,8 +39,8 @@ Start: ; 0150 (0:0150) ld sp, $fffe push af xor a - ld [rIF], a - ld [rIE], a + ldh [rIF], a + ldh [rIE], a call ZeroRAM ld a, $1 call BankswitchROM @@ -87,16 +87,16 @@ VBlankHandler: ; 019b (0:019b) .no_oam_copy ; flush scaling/windowing parameters ldh a, [hSCX] - ld [rSCX], a + ldh [rSCX], a ldh a, [hSCY] - ld [rSCY], a + ldh [rSCY], a ldh a, [hWX] - ld [rWX], a + ldh [rWX], a ldh a, [hWY] - ld [rWY], a + ldh [rWY], a ; flush LCDC ld a, [wLCDC] - ld [rLCDC], a + ldh [rLCDC], a ei call wVBlankFunctionTrampoline call FlushPalettesIfRequested @@ -186,17 +186,17 @@ SetupTimer: ; 0241 (0:0241) ld b, -68 ; Value for Normal Speed call CheckForCGB jr c, .set_timer - ld a, [rKEY1] + ldh a, [rKEY1] and $80 jr z, .set_timer ld b, $100 - 2 * 68 ; Value for CGB Double Speed .set_timer ld a, b - ld [rTMA], a + ldh [rTMA], a ld a, TAC_16384_HZ - ld [rTAC], a + ldh [rTAC], a ld a, TAC_START | TAC_16384_HZ - ld [rTAC], a + ldh [rTAC], a ret ; return carry if not CGB @@ -231,36 +231,36 @@ EnableLCD: ; 0277 (0:0277) ret nz ; assert that LCD is off or LCDC_ON ; ld [wLCDC], a ; - ld [rLCDC], a ; turn LCD on + ldh [rLCDC], a ; turn LCD on ld a, FLUSH_ALL_PALS ld [wFlushPaletteFlags], a ret ; wait for vblank, then turn LCD off DisableLCD: ; 028a (0:028a) - ld a, [rLCDC] ; + ldh a, [rLCDC] ; bit LCDC_ENABLE_F, a ; ret z ; assert that LCD is on - ld a, [rIE] + ldh a, [rIE] ld [wIE], a res INT_VBLANK, a ; - ld [rIE], a ; disable vblank interrupt + ldh [rIE], a ; disable vblank interrupt .wait_vblank - ld a, [rLY] ; + ldh a, [rLY] ; cp LY_VBLANK ; jr nz, .wait_vblank ; wait for vblank - ld a, [rLCDC] ; + ldh a, [rLCDC] ; and LCDC_OFF ; - ld [rLCDC], a ; + ldh [rLCDC], a ; ld a, [wLCDC] ; and LCDC_OFF ; ld [wLCDC], a ; turn LCD off xor a - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a ld a, [wIE] - ld [rIE], a + ldh [rIE], a ret ; set OBJ size: 8x8 @@ -293,50 +293,50 @@ Set_WD_off: ; 02d4 (0:02d4) ; enable timer interrupt EnableInt_Timer: ; 02dd (0:02dd) - ld a, [rIE] + ldh a, [rIE] or 1 << INT_TIMER - ld [rIE], a + ldh [rIE], a ret ; enable vblank interrupt EnableInt_VBlank: ; 02e4 (0:02e4) - ld a, [rIE] + ldh a, [rIE] or 1 << INT_VBLANK - ld [rIE], a + ldh [rIE], a ret ; enable lcdc interrupt on hblank mode EnableInt_HBlank: ; 02eb (0:02eb) - ld a, [rSTAT] + ldh a, [rSTAT] or 1 << STAT_MODE_HBLANK - ld [rSTAT], a + ldh [rSTAT], a xor a - ld [rIF], a - ld a, [rIE] + ldh [rIF], a + ldh a, [rIE] or 1 << INT_LCD_STAT - ld [rIE], a + ldh [rIE], a ret ; disable lcdc interrupt and the hblank mode trigger DisableInt_HBlank: ; 02fb (0:02fb) - ld a, [rSTAT] + ldh a, [rSTAT] and ~(1 << STAT_MODE_HBLANK) - ld [rSTAT], a + ldh [rSTAT], a xor a - ld [rIF], a - ld a, [rIE] + ldh [rIF], a + ldh a, [rIE] and ~(1 << INT_LCD_STAT) - ld [rIE], a + ldh [rIE], a ret ; initialize scroll, window, and lcdc registers, set trampoline functions ; for the lcdc and vblank interrupts, latch clock data, and enable SRAM/RTC SetupRegisters: ; 030b (0:030b) xor a - ld [rSCY], a - ld [rSCX], a - ld [rWY], a - ld [rWX], a + ldh [rSCY], a + ldh [rSCX], a + ldh [rWY], a + ldh [rWX], a ld [wcab0], a ld [wcab1], a ld [wcab2], a @@ -378,7 +378,7 @@ DetectConsole: ; 0349 (0:0349) cp CONSOLE_CGB ret nz ld a, $01 - ld [rSVBK], a + ldh [rSVBK], a call SwitchToCGBDoubleSpeed ret @@ -386,10 +386,10 @@ DetectConsole: ; 0349 (0:0349) SetupPalettes: ; 036a (0:036a) ld hl, wBGP ld a, %11100100 - ld [rBGP], a + ldh [rBGP], a ld [hli], a ; wBGP - ld [rOBP0], a - ld [rOBP1], a + ldh [rOBP0], a + ldh [rOBP1], a ld [hli], a ; wOBP0 ld [hl], a ; wOBP1 xor a @@ -545,11 +545,11 @@ FlushPalettesIfRequested: ; 042d (0:042d) ; flush grayscale (non-CGB) palettes ld hl, wBGP ld a, [hli] - ld [rBGP], a + ldh [rBGP], a ld a, [hli] - ld [rOBP0], a + ldh [rOBP0], a ld a, [hl] - ld [rOBP1], a + ldh [rOBP1], a ld a, [wConsole] cp CONSOLE_CGB jr z, .CGB @@ -600,7 +600,7 @@ CopyCGBPalettes: ; 0467 (0:0467) ld [$ff00+c], a inc c .wait - ld a, [rSTAT] + ldh a, [rSTAT] and 1 << STAT_BUSY ; wait until hblank or vblank jr nz, .wait ld a, [hl] @@ -679,21 +679,21 @@ BCCoordToBGMap0Address: ; 04cf (0:04cf) ; the A + B + Start + Select combination resets the game ReadJoypad: ; 04de (0:04de) ld a, JOY_BTNS_SELECT - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] + ldh [rJOYP], a + ldh a, [rJOYP] + ldh a, [rJOYP] cpl and JOY_INPUT_MASK swap a ld b, a ; buttons data ld a, JOY_DPAD_SELECT - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] + ldh [rJOYP], a + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] cpl and JOY_INPUT_MASK or b @@ -726,7 +726,7 @@ SaveButtonsHeld: ld a, c ldh [hKeysHeld], a ld a, JOY_BTNS_SELECT | JOY_DPAD_SELECT - ld [rJOYP], a + ldh [rJOYP], a ret ; clear joypad hmem data @@ -824,7 +824,7 @@ CopyDMAFunction: ; 0593 (0:0593) ; CopyDMAFunction copies this function to hDMAFunction ($ff83) DMA: ; 05a1 (0:05a1) ld a, HIGH(wOAM) - ld [rDMA], a + ldh [rDMA], a ld a, $28 .wait dec a @@ -1322,7 +1322,7 @@ BankswitchVRAM0: ; 07c5 (0:07c5) push af xor a ldh [hBankVRAM], a - ld [rVBK], a + ldh [rVBK], a pop af ret @@ -1331,14 +1331,14 @@ BankswitchVRAM1: ; 07cd (0:07cd) push af ld a, $1 ldh [hBankVRAM], a - ld [rVBK], a + ldh [rVBK], a pop af ret ; set current dest VRAM bank to a BankswitchVRAM: ; 07d6 (0:07d6) ldh [hBankVRAM], a - ld [rVBK], a + ldh [rVBK], a ret ; switch to CGB Normal Speed Mode if playing on CGB and current mode is Double Speed Mode @@ -1361,20 +1361,20 @@ SwitchToCGBDoubleSpeed: ; 07e7 (0:07e7) ; switch between CGB Double Speed Mode and Normal Speed Mode CGBSpeedSwitch: ; 07f1 (0:07f1) - ld a, [rIE] + ldh a, [rIE] push af xor a - ld [rIE], a + ldh [rIE], a set 0, [hl] xor a - ld [rIF], a - ld [rIE], a + ldh [rIF], a + ldh [rIE], a ld a, $30 - ld [rJOYP], a + ldh [rJOYP], a stop call SetupTimer pop af - ld [rIE], a + ldh [rIE], a ret ; validate the saved data in SRAM @@ -1983,30 +1983,30 @@ DetectSGB: ; 0b59 (0:0b59) call Wait ld hl, MltReq2Packet call SendSGB - ld a, [rJOYP] + ldh a, [rJOYP] and %11 cp SNES_JOYPAD1 jr nz, .sgb ld a, P15 - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] + ldh [rJOYP], a + ldh a, [rJOYP] + ldh a, [rJOYP] ld a, P15 | P14 - ld [rJOYP], a + ldh [rJOYP], a ld a, P14 - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] + ldh [rJOYP], a + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] ld a, P15 | P14 - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] + ldh [rJOYP], a + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] + ldh a, [rJOYP] and %11 cp SNES_JOYPAD1 jr nz, .sgb @@ -2037,13 +2037,13 @@ Func_0bcb: ; 0bcb (0:0bcb) di push de .wait_vbalnk - ld a, [rLY] + ldh a, [rLY] cp LY_VBLANK + 3 jr nz, .wait_vbalnk ld a, LCDC_BGON | LCDC_OBJON | LCDC_WIN9C00 - ld [rLCDC], a + ldh [rLCDC], a ld a, %11100100 - ld [rBGP], a + ldh [rBGP], a ld de, v0Tiles1 ld bc, v0BGMap0 - v0Tiles1 .tiles_loop @@ -2069,7 +2069,7 @@ Func_0bcb: ; 0bcb (0:0bcb) dec c jr nz, .bgmap_outer_loop ld a, LCDC_BGON | LCDC_OBJON | LCDC_WIN9C00 | LCDC_ON - ld [rLCDC], a + ldh [rLCDC], a pop hl call SendSGB ei @@ -2098,12 +2098,12 @@ HblankCopyDataHLtoDE: ; 0c19 (0:0c19) .loop ei di - ld a, [rSTAT] ; + ldh a, [rSTAT] ; and STAT_LCDC_STATUS ; jr nz, .loop ; assert hblank ld a, [hl] ld [de], a - ld a, [rSTAT] ; + ldh a, [rSTAT] ; and STAT_LCDC_STATUS ; jr nz, .loop ; assert still in hblank ei @@ -2120,12 +2120,12 @@ HblankCopyDataDEtoHL: ; 0c32 (0:0c32) .loop ei di - ld a, [rSTAT] ; + ldh a, [rSTAT] ; and STAT_LCDC_STATUS ; jr nz, .loop ; assert hblank ld a, [de] ld [hl], a - ld a, [rSTAT] ; + ldh a, [rSTAT] ; and STAT_LCDC_STATUS ; jr nz, .loop ; assert still in hblank ei @@ -2228,13 +2228,13 @@ SerialTimerHandler: ; 0c91 (0:0c91) jr z, .check_for_timeout ret .begin_transfer - ld a, [rSC] ; + ldh a, [rSC] ; add a ; make sure that no serial transfer is active ret c ; ld a, SC_INTERNAL - ld [rSC], a ; use internal clock + ldh [rSC], a ; use internal clock ld a, SC_START | SC_INTERNAL - ld [rSC], a ; use internal clock, set transfer start flag + ldh [rSC], a ; use internal clock, set transfer start flag ret .check_for_timeout ; sets bit7 of [wSerialFlags] if the serial interrupt hasn't triggered @@ -2273,11 +2273,11 @@ Func_0cc5: ; 0cc5 (0:0cc5) ret .asm_cdc ld a, $29 - ld [rSB], a + ldh [rSB], a ld a, SC_INTERNAL - ld [rSC], a + ldh [rSC], a ld a, SC_START | SC_INTERNAL - ld [rSC], a + ldh [rSC], a .asm_ce8 ld a, [hl] or a @@ -2330,17 +2330,17 @@ SerialHandler: ; 0d26 (0:0d26) or a ; jr z, .asm_d55 ; skip ahead if [wSerialOp] zero ; send/receive a byte - ld a, [rSB] + ldh a, [rSB] call SerialHandleRecv call SerialHandleSend ; returns byte to actually send push af .wait_for_completion - ld a, [rSC] + ldh a, [rSC] add a jr c, .wait_for_completion pop af ; end send/receive - ld [rSB], a ; prepare sending byte (from Func_0dc8?) + ldh [rSB], a ; prepare sending byte (from Func_0dc8?) ld a, [wSerialOp] cp $29 jr z, .done ; if [wSerialOp] != $29, use external clock @@ -2348,16 +2348,16 @@ SerialHandler: ; 0d26 (0:0d26) .asm_d55 ld a, $1 ld [wSerialRecvCounter], a - ld a, [rSB] + ldh a, [rSB] ld [wSerialRecvBuf], a ld a, $ac - ld [rSB], a + ldh [rSB], a ld a, [wSerialRecvBuf] cp $12 ; if [wSerialRecvBuf] != $12, use external clock jr z, .done ; and prepare for next byte. either way, return .asm_d6a ld a, SC_START | SC_EXTERNAL - ld [rSC], a ; transfer start, use external clock + ldh [rSC], a ; transfer start, use external clock .done ld hl, wSerialCounter inc [hl] @@ -2592,25 +2592,25 @@ SerialExchangeBytes: ; 0e63 (0:0e63) Func_0e8e: ; 0e8e (0:0e8e) call ClearSerialData ld a, $12 - ld [rSB], a ; send $12 + ldh [rSB], a ; send $12 ld a, SC_START | SC_EXTERNAL - ld [rSC], a ; use external clock, set transfer start flag - ld a, [rIF] + ldh [rSC], a ; use external clock, set transfer start flag + ldh a, [rIF] and ~(1 << INT_SERIAL) - ld [rIF], a ; clear serial interrupt flag - ld a, [rIE] + ldh [rIF], a ; clear serial interrupt flag + ldh a, [rIE] or 1 << INT_SERIAL ; enable serial interrupt - ld [rIE], a + ldh [rIE], a ret ; disable serial interrupt, and clear rSB, rSC, and serial registers in WRAM ResetSerial: ; 0ea6 (0:0ea6) - ld a, [rIE] + ldh a, [rIE] and ~(1 << INT_SERIAL) - ld [rIE], a + ldh [rIE], a xor a - ld [rSB], a - ld [rSC], a + ldh [rSB], a + ldh [rSC], a ; fallthrough ; zero serial registers in WRAM @@ -9400,14 +9400,14 @@ Func_31e5: ; 31e5 (0:31e5) jr Func_31e0 Func_31ea: ; 31ea (0:31ea) - ld a, [rSB] + ldh a, [rSB] ld [wce6e], a Func_31ef: ; 31ef (0:31ef) xor a jr Func_31e0 Func_31f2: ; 31f2 (0:31f2) - ld a, [rSB] + ldh a, [rSB] ld [wce6f], a xor a ld [wce63], a @@ -9434,11 +9434,11 @@ Func_31fc: ; 31fc (0:31fc) ; fallthrough Func_3212: ; 3212 (0:3212) - ld [rSB], a + ldh [rSB], a ld a, SC_INTERNAL - ld [rSC], a + ldh [rSC], a ld a, SC_START | SC_INTERNAL - ld [rSC], a + ldh [rSC], a ret ; doubles the damage at de if swords dance or focus energy was used @@ -11255,7 +11255,7 @@ CallBC: ; 3c46 (0:3c46) DoFrameIfLCDEnabled: ; 3c48 (0:3c48) push af - ld a, [rLCDC] + ldh a, [rLCDC] bit LCDC_ENABLE_F, a jr z, .done push bc diff --git a/src/gfx/cards/grassenergy.8x6.png b/src/gfx/cards/grassenergy.8x6.png index 2046bcb71c617323295a0fd2031b25a9438addb3..5cc6b30a396edaa2437fb1df731f714252e6917e 100644 GIT binary patch delta 580 zcmV-K0=xa51knVL7=H)@0001%m5eO_000b7OjJex|NpA0s#R5000001Gg~wO0007X zMObub06_;oBLDya@<~KNR7i=XmI-piAPfX0@&7*u&@B*7DmdlTdOgFaxfaGh8w|qk zLIB*i`LBCt8ereH6xg9@%b?RI> zVBlJ9O^Pc6Q#;L;#4Q16{pn$o;le=1j{GGW19ecp860|AGalXHgMsNO$fLt2gQX|c zlPx-}?2@32KZu@8j(j(VCj;)E6O5=IfY%I#!A`(>E1p6PJiIRk^DP?7VM&NQz>L5S zXM(Z;%SMx-kmJ6fF#-0^c$z3?+dSi7f-JU?hXE0ZYaY z2CCl(8RmNK1}_G}PJ_y`m0^6ip22Qc6d4EQf2$uxOp(5CubBvG}h`G<@ zs^?eIK*R)g2$=(2^q5Z_XAn;^U6E-{S^wg2Fo5EaRyAe4&qrfWj#AQ9?Sn~04}}37 z4z{dMeM)c(z@xcmGhYNjkAZ?EkgrP&V!eC}Te6+s!l3*hxwo_#aShI(l;@+J)V>O1 zf@K)>>pgIjUkRAiVJosTToNRG=;ih}eCrIr;KpvEn##2kI0M)Jy7@f#XZry}#1NXL ST(yP(0000-W3|LUKEjv&A|__pkBQ9=r$J*B6b4F#e7 zd^4HUb>C&epO@bom%4BIiKEaVNCDYiP-=IG>Re!3?oUd$0AgiXMHvCx0 z|BPZ);Z?&!B$;0^!h(qKpW!13L2|h@!XoEEW=?IKBoi^;OXSv&Yayn45jKX8*<=pw zKyHm^lLMsPWHU+?Zwebp&dcQ^p6O*v*ubFPVN-mM>-85<7?%Mh TOZKq<015yANkvXXu0mjf#PIs< diff --git a/src/gfx/duel/cgb_symbols.t7.png b/src/gfx/duel/cgb_symbols.t7.png index 578867fcbb290b8c7440dccce382be77f217ccac..ac0f54d082a45d0322d101264b452911ff9364ca 100644 GIT binary patch delta 1261 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 Y2Ll!*A>AD*H~;_u07*qoM6N<$f<5|xU;qFB literal 3107 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 diff --git a/src/gfx/duel/other.t7.png b/src/gfx/duel/other.t7.png index 796ecf7c6a7feb9234c1f56b445d58eab30373ed..d2aa1e9404b6e43a6278752c8b45bde741819723 100644 GIT binary patch delta 808 zcmV+@1K0et473K28Gi!+004T%4nP0^01Qw}R7L;)|Ej90RaI300003qTQmRw00VSI zSaf&*H`KqMzW@LN)Ja4^R7i=XR|{h6APkf3``>w3{$P@HeQ#k~(9Pf*e5Cjx}gr`OAg@go4nLfNwjgRUC5>$>4f0(9B5={(^p*|HDGvl6+ zfbMk%;Q-wslz-sX(oPSde3|&rbtRDSI0+;PEKJ~|fS1Kd;4wA4DVD=UpcH_a#`sm& zLWP=m=?iK~xKTM5t4U1S!CGvoc6s2A_*lR2o(IQ5j*^pLIFL665e>- zCRWTld`66KtGNl<{voEn@Y)J7wAvPan+TB7M55i*Hh=GL41++U+H_v5Y`!p@_pxBM ztM%%{<3JoC8p;%X1l$R6ER~%5duClE-$Uv(4jCR{ERWN)o2g~mCfM;GE}fAcF+UMJ zJZRVlKpNMv|BWE#@p@UNlz~+ip9#3&BIdPJDu43N3PQJy{70!}1-!Hm1Pj7Vsc%uf zcSY}9UVjLpKwEAaQV~6Ae+)r8#j*MR0(>T5>=p$IdmUCN9|$!kF$?vy4_%{K8dW|@ zVp(>UuGptaL+a{X`yrH6uf1+>uXkawu>v%A-fx9Tj&~QfS#>iL4+>OpVVF;}Lij*1 zdm<_jAP1+E*%z zPsscGdw&9BaGq#`w4)!{_WYr3tm~QQ8pfB)r9bgu-0J9d#=!jb^|g;H#K3MIb2#VO z8$j@MN^+57sq@MxX6hVg1Hds)i_YTH2I?W3fnTmkn5$c_22VxO=5vNVRmg#ibn1;; z<73Zf?!)yX%zptH+p+fN_UDRb+;oUJw8i~N=SKqg=r7ETDe4@jEyuu|xa4phCyfrl zu84aTY~};Uy#X520Wu&qHb7#1t6 zVWR!Wcce#`8=n>7sVCYpZjEL98n-t9qYjCB3j#MV+JA&TxduP=Fxmv@gDw48&xw!L zh_>{}TS7eJI@Wjn7D$7RLNT@ABiKND*DSN^Q(&wQ&k?ugoWcGf_ao~&009ek4ttv% zVPVFw;Eeehh(l2+XJU_h)^~sfve9gUi)_MPBeZAnw~)C<5R+m@dq6j9MAkE6{Z8cB zuHE`wnSZF`iSJ0#XEx3ptbx=i=o0;FF4(g{+AB@>VaO(oHgpDkU9Zk(+RO)x!8xdt z+~*8qW*nKV-+T==<9bba=9OXWHS-!O`sz=dj3srR5U1^D9VfZ2HE$VRleU^m8~XgH ztY3pF96NWMcBzFrue!S4am9vKa_tfN)EwxuL4V}whuOv-ZU0Ab>Z78;4YN^Te$)gC zH=Z}Dl0MfTmImr-nz&wZ#?SaEUyV6h6F2XH%{u@_*V7a5Ipd7q%yty}tC%*xt5!F5 zwt$h}QISV>z-Ld+!bhNg43?X)(rjJ0DxxkWIkLmdXQm&qXOo$a`m75s{AtDx9q|T) zx_>k3E_bUX z=a`z;7iqr-3tWpwUqLY@@!KZ)I8k>dKfd_rn}Ti+*XsLg?ZiU;3aR#6q2phLx3?9t z*>~QGJy>(~5y;}TBAaHOdV0Z##WUGJpN=Y1(W)6UkWBb`Nd+pFpEiIU?7}t#L+0A$c(J z@CGc;Lre@cY264LzqJXF1sl&X@sg2GO7)+ytz<%W9UNzY+Dy#+>?Zc8O{oGSJ#yv% z`ag;JqoNJ_lOG@axBzvZf%vT%%WMoe+lG5ypO455VGe`go3co zd~PY;d@~tg!NWsn#(rI@oVmXGA+Bo$EY?4$NA$~e>V599XFp@(nSPs(z=&pEMq6eb z^^|iRI!+Z@k^PzTGbf)h@X6bx9%kzy>(uYAcfj;I1;kjBH2+cI!2GEA+#h3}HXzs4 zIx4Pp3^%_6SZMKV+(HsImw$SavQdk*VCPvx#Z4o5>J=M~u*L$DwCT$qG7qI~4)Y2+ zKfBIFz3b8@>h+oVCE7>+)uzZ%Y?$5vP8kupmh(I{#^A|&vK7{|MxVWt7wk3n5qmeK za-n0(c!gwMlkd*+EuH diff --git a/src/gfx/fonts/full_width/4.t3.png b/src/gfx/fonts/full_width/4.t3.png index 6ccef5db3258919a750cf5a4dfd938333d3989f6..c872a6d9cceb2afbf27e445818161efaf6ae1d09 100644 GIT binary patch delta 1143 zcmV--1c>|R5rGMi8Gi!+004|%pI86@00vM@R7L;){{R30Rl?JL00003bVXQncmOlg z(p#ng00bvVL_t(&fxTA?a$GS8v+jTCHr)qELf#~kOr6<2e=r6luzSwW8~*-1o%F@) zhmXe7HOAA!DS_DtQZS0+fgjs@<)x{YA5G7R|2{Mx1*3XwWPcZW1vaixSwQ>D$g*Tb zi;aE7>udq^$;$%&sL!oWPyokZw+RN`&SN`D!_e_#%CbXYYnT>ssz-2=j~ZDq4FwRe zsm8i#kxg(Uw-Zp1%ou|*hH9Z~r+Exa0iP<-*d9;VH5bIGNPr9eV&OK9lgVtZWf72x zIjE-@b|DCb4u7Kv#|`3C8R!)=)_7RYix3<%Y|XCVoDc%s6wrnh%MfO#GGxC2jpHti zD+tzu$6gP_O}B5n%D`9IfAAvaqbOYIw~jeoZ(C8xS+pyyjA3H|@J6n>l9L3g{Q{51 zN#+@CE>uKLc*He-dKESOo7JJL-U9(boFo@y!^FEb*MIV9IKQt!R51!9wp_HV0b4+! z$qtd78E>&;a*LCS-5y&8XR1q@9)sST9P!?v5b8q}lF-x#S)vmsCI3U~XCU3@$D+8? ze`(Q9#n|v3{lap7Y0$}}>eO?zpyMMA&E^FGTl7(x$-Us+dtmRx)g+>-fqi5mNplNB4nNJij(ZCEeRQE*hQ+6fS zf`SenTV|Bj4?PslZ!{v{Lhmt$($sRsVmL1+BXFvNWv;a3WkYZ z{%15aXA6S`w|7~GKQJ}LU_wCmH-`N3&sJc#!X=z97P4P$E1eLWnjAxwF zG}Pvlwlufu0>9_ZLy%ApS_pdbwmPMV8N>E;R!iI?1O%WKy<=4aQE+m_lEa%C4a-s0hMyG9-163Ce&8SAyen4X^*)X)iCy0fu-{f- z@Gx(HAV*O&w0!O&SJ@|Kc{m=2qg6pGw~y#y^Ze2c@21qdout002ov JPDHLkV1gRoFf;%F delta 2278 zcmVU09e6-hB%S~gP=(~{+0(PGqBVkQ`xFg z;J!Jp!u?^^>fX5vcm;>5N1BsQw2@29GHIB+xIJD$YJf?~djTF$T^uB!x^Sa;7YR&| zPkse1^6S9lCx5=Z$33%J0H|n|HYr`_FR04>0X<)? z%8*EfRI8`jzMjr1J*hGoE^al);9htkt&Svyg!`#8@i@EwZLkNJW!?;ldH6P!OlhpuaC-8x7I;)^Ydl{sxR^(TMeaAdkiM@})Q zoj0e>pczj98KfDjWEz^-XBnXgvy9V9;HSJ+=Xe4cNf|y@Vwv!@&U#`HX$7?wz#tOx zpw4}ZI5AWg73{qK4r=~g3ib2muNq=}7U=1`Mq(@@v1FaeW)fYY503nU@Z0z!{F#tcM@arx zxIcXOQ#|s*WZn~f!2P0?0i;KqrnY<z3o3feFZ*Gq|Umf7(E{YU(fa# z-IY$cNznw31l%`TQ>67F`Tk@1*M9*1+nmV+GBZfm*(jRs6I?vPEu=I7I%%W7gvk$fcujgRU;-Jw9&q4!95J$e=O?<@JC%B zaDH7nv_tufj@$!YLAoy1%E1Gl#Z*`)pG>m#!SaX$>@961$%_h}3SXy=GabJNynlk} zmhf#PnbNi_+Ea%k)8+SoSJ2)9StB>?;%X>||@Hz*{Q zM+~4GmY%-WDpP0rL`xebc`xUyr@3V+wEnAdkbJC!;^J)f2|~50CV&jMU$ip#$~V0~ zi}eHApX+=q1p9yI0fUQb98Wd3GO_IW>L3+jb!eZ+qmw}7xYXRr#InZ zJZRH>S@vzy@j`Q)?~AsbWPgR3k>tyokWYo$FZ=tGv#AjXpCYZv2QXf!ERPsKO(^9_ zdx}_-IpEFqRF#e4d$^*aS{*?1jSZIz$ON+u)>b+!)!-wCBW<)lve1e_cvMq>2+-j5 z=W_pO3?IR-cNld4J;2vGr*cqD5Hd0OMa^I;he&v*&h>`&&Lp*7FMo?)-U#lC3h=>s zb_1#jlGJ*=w0}ArbArJW_vg9Z(Dqa9_I&Lir5l6G(%Pv&)2cD$64lu$Ag%QuK0lpE}OR zkYf)cXF41dcU_zw{G_{&b1_ZgHEO@Ebo614r02?m>LMD=by&g)gL0C(wGh&92$aH%=TilQ`tU3svi2fKD7 zlcL(Jygz#|AI}C$`2jDznOn{Ur5OAP-pnE&7D;}*NSsrlS{l-EUsD8{GoZ?Jm*W!i zd(x45gPZjMV;KYjw(_n2Z9G2D-&Fpl*2miV-wghY2Y*a9GRX&%|IPG&7SNnzrFxW| z_wr0SlFuv7z4E2@+mLU{VI0~G)gS?Fc)m9tRFq=yr-(I~V3M55B|$Y{UG$7jx3s8M zhoD{pQ@t~tO0-u|CHsbYslZ>TP4?FN@YbMHUP{xcdF|1!Vh2XHd}{{wE; zMPFSPWnV#cq^-R?`-c687}Oi8;bX~T^(SbLxAJE^zW3&1u?ngUR)2z21FifS{a2lD zec(}BJDmNNbgs=)Xc`TOtx04)m7CDqA`od5s;07*qoM6N<$g6&&n A;s5{u diff --git a/src/gfx/fonts/symbols.png b/src/gfx/fonts/symbols.png index 81afc3bac8e51ffe4bb8f37c5872f08295a64c35..347001a191b650c53af1b5659fd12d6f10ce0ec0 100644 GIT binary patch delta 713 zcmV;)0yh2j3f2XX8Gi!+004T%4nP0^01Qw}R7L;)|Ej90RaI300003qTQmRw0)i>UUMUL`FCbPpF=_nKwAa-jhD)9;MXTAg4-_W$Zi6a1R>Gp~N z2>+RI3;q;o(!I#E2PzKNPXJ60_K7i6x+hUHo-R$yKf6kMY=0YFb0ByC2z!5OEM^p~ zZT8(%`ieB<4uY}U&J~9_BGB%=v(T!+B&epV8CfLd$ic9N)nO~*NPI_jdM z!p+=Cv{d+mEPvVbf(4BF5ir8hiABMDsJCt<7I7FbJzEw=ll6n-X#U^ug_7vhF(b2s zrxcqy=?u`#8Ne6_s6yO{Nzi|lwEiNt@J82NaUq_kRe|6SXECiI^+M0fU$@@wW_1 zr$SYT+4GqFeWX>EeSp-eistvn$NKe&i??@M^Wpag0J{(_V?yu_pjf2MdnGTBEtUg7WfMS(g6*m?V(7b00000NkvXXu0mjf2|`U* delta 1390 zcmV-!1(EvJ1@;P%8Gi-<002!G{&D~S00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000SaNLh0L01|Wn01|Wo-ew$u1SLD2Omk*n5?_8q$(C=w7kPPk`G5WP_V%IG+-|oa6*He8 zAJMqjy~Tbn%NrnOo4|zWXH<5f+SKqk`c(_kT{1Fz9%-;(wJN~Q`$qVn^wA-+f#<{+ z^r{tZTZt39e|%2hs{0i}7ufcKK^Jaw5%J1nUxj$j&DtpN*_*&5<0c3%NPlKSAoEGG z4VJi#zPF;XA%D(MOYnuN??v24>;6dQ^PDK|ccLwejs7U`*(>0xvskr$A|Mvd$o$j- z>ckV^eYZj7>-xtk1-@vB`fLc`tC;z`wj|aT?w4F4%WEq=Vql01%k;RpaeS8*h|M-t z>{YtLl^r}ki;aszcgS@+wPZsCb{{M2d%pT{BZgOwD1T1W9Tm*{Zey{ssdXLbtCcWO z?Bqnd@V=P&l5sy5>}~A3&2d{5$DoMog2f4Z=<2g*kWMb3SM~^XxArrj>N~PW!S1+D zT(%MT9sIt~t`%9|ZNld;`Z8jO{TUt)o*V5fmIXC|9WRV(lz$<`XmjI0~yRRQ8DbXR-1jPPAol-WO5l`19-t zx&J9EE%y-jyr8X+zl(Ld*A`iRW{bE#&KnV1`+q;f5R$M9j{)MN0D9cCs!w~ypW*)O z1epI=h!$K|-xnfce8h7QpzpSEYlloYf;<7l?OX6(jJ|7nNUR zdIbOT_-s&ttO($Di7=pAV!BC!=b$_8mt=m&^=FjWf^-DkLEnz<=x_Jg&;h?DrWldM zM1P6QeAJdtwWVhe^ZNR_#~e<8j4Sd;vidGx&99Gk48|3jp&v+!&8~#AI{9wQu1+_P zj*!R&PnpkmbAF%a8v* zVBdiFbyMw2_4M!Z&(s(0kGU|5S2eP~)~OR9DmyT_Di_=zYj$G@kMX)t<;U6&`xa1PidTc=2d`b#kAI67 z57~fj;VX+(41x|T`Bz!~7RV++Of^BT(babp+l_zLFVec3p`OVF^eZgnegFUf07*qoM6N<$f({3`8UO$Q diff --git a/tcg.link b/src/layout.link similarity index 100% rename from tcg.link rename to src/layout.link diff --git a/src/rgbdscheck.asm b/src/rgbdscheck.asm new file mode 100644 index 00000000..622023d6 --- /dev/null +++ b/src/rgbdscheck.asm @@ -0,0 +1,12 @@ +; poketcg requires rgbds 0.4.1 or newer. +MAJOR EQU 0 +MINOR EQU 4 +PATCH EQU 1 + +IF !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__) + fail "poketcg requires rgbds {MAJOR}.{MINOR}.{PATCH} or newer." +ELIF (__RGBDS_MAJOR__ < MAJOR) || \ + (__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ < MINOR) || \ + (__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ < PATCH) + fail "poketcg requires rgbds {MAJOR}.{MINOR}.{PATCH} or newer." +ENDC diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 00000000..93050b9e --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1,2 @@ +scan_includes +gfx diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 00000000..c235feef --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,16 @@ +.PHONY: all clean + +CC := gcc +CFLAGS := -O3 -std=c99 -Wall -Wextra -pedantic + +tools := scan_includes gfx + +all: $(tools) + @: + +clean: + rm -f $(tools) + +gfx: common.h +%: %.c + $(CC) $(CFLAGS) -o $@ $< diff --git a/tools/common.h b/tools/common.h new file mode 100644 index 00000000..4da0b2ef --- /dev/null +++ b/tools/common.h @@ -0,0 +1,40 @@ +#ifndef GUARD_COMMON_H +#define GUARD_COMMON_H + +int __getopt_long_i__; +#define getopt_long(c, v, s, l) getopt_long(c, v, s, l, &__getopt_long_i__) + +FILE *fopen_verbose(char *filename, char *mode) { + FILE *f = fopen(filename, mode); + if (!f) { + fprintf(stderr, "Could not open file: \"%s\"\n", filename); + } + return f; +} + +uint8_t *read_u8(char *filename, int *size) { + FILE *f = fopen_verbose(filename, "rb"); + if (!f) { + exit(1); + } + fseek(f, 0, SEEK_END); + *size = ftell(f); + rewind(f); + uint8_t *data = malloc(*size); + if (*size != (int)fread(data, 1, *size, f)) { + fprintf(stderr, "Could not read file: \"%s\"\n", filename); + exit(1); + } + fclose(f); + return data; +} + +void write_u8(char *filename, uint8_t *data, int size) { + FILE *f = fopen_verbose(filename, "wb"); + if (f) { + fwrite(data, 1, size, f); + fclose(f); + } +} + +#endif // GUARD_COMMON_H diff --git a/tools/gfx.c b/tools/gfx.c new file mode 100644 index 00000000..7d6dd0ee --- /dev/null +++ b/tools/gfx.c @@ -0,0 +1,345 @@ +#include +#include +#include +#include +#include +#include + +#include "common.h" + +static void usage(void) { + fprintf(stderr, "Usage: gfx [--trim-whitespace] [--remove-whitespace] [--interleave] [--remove-duplicates [--keep-whitespace]] [--remove-xflip] [--remove-yflip] [--preserve indexes] [--png filename] [-d depth] [-h] [-o outfile] infile\n"); +} + +static void error(char *message) { + fputs(message, stderr); + fputs("\n", stderr); +} + +struct Options { + int trim_whitespace; + int remove_whitespace; + int help; + char *outfile; + int depth; + int interleave; + int remove_duplicates; + int keep_whitespace; + int remove_xflip; + int remove_yflip; + int *preserved; + int num_preserved; + char *png_file; +}; + +struct Options Options = { + .depth = 2, +}; + +void get_args(int argc, char *argv[]) { + struct option long_options[] = { + {"remove-whitespace", no_argument, &Options.remove_whitespace, 1}, + {"trim-whitespace", no_argument, &Options.trim_whitespace, 1}, + {"interleave", no_argument, &Options.interleave, 1}, + {"remove-duplicates", no_argument, &Options.remove_duplicates, 1}, + {"keep-whitespace", no_argument, &Options.keep_whitespace, 1}, + {"remove-xflip", no_argument, &Options.remove_xflip, 1}, + {"remove-yflip", no_argument, &Options.remove_yflip, 1}, + {"preserve", required_argument, 0, 'r'}, + {"png", required_argument, 0, 'p'}, + {"depth", required_argument, 0, 'd'}, + {"help", no_argument, 0, 'h'}, + {0} + }; + char *token; + for (int opt = 0; opt != -1;) { + switch (opt = getopt_long(argc, argv, "ho:d:p:", long_options)) { + case 'h': + Options.help = true; + break; + case 'o': + Options.outfile = optarg; + break; + case 'd': + Options.depth = strtoul(optarg, NULL, 0); + break; + case 'r': + token = strtok(optarg, ","); + while (token) { + Options.num_preserved++; + Options.preserved = realloc(Options.preserved, Options.num_preserved * sizeof(int)); + Options.preserved[Options.num_preserved-1] = strtoul(token, NULL, 0); + token = strtok(NULL, ","); + } + break; + case 'p': + Options.png_file = optarg; + break; + case 0: + case -1: + break; + default: + usage(); + exit(1); + break; + } + } +} + +bool is_preserved(int index) { + for (int i = 0; i < Options.num_preserved; i++) { + if (Options.preserved[i] == index) { + return true; + } + } + return false; +} + +void shift_preserved(int removed_index) { + for (int i = 0; i < Options.num_preserved; i++) { + if (Options.preserved[i] >= removed_index) { + Options.preserved[i]--; + } + } +} + +struct Graphic { + int size; + uint8_t *data; +}; + +bool is_whitespace(uint8_t *tile, int tile_size) { + uint8_t WHITESPACE = 0; + for (int i = 0; i < tile_size; i++) { + if (tile[i] != WHITESPACE) { + return false; + } + } + return true; +} + +void trim_whitespace(struct Graphic *graphic) { + int tile_size = Options.depth * 8; + for (int i = graphic->size - tile_size; i > 0; i -= tile_size) { + if (is_whitespace(&graphic->data[i], tile_size) && !is_preserved(i / tile_size)) { + graphic->size = i; + } else { + break; + } + } +} + +void remove_whitespace(struct Graphic *graphic) { + int tile_size = Options.depth * 8; + if (Options.interleave) tile_size *= 2; + + // Make sure we have a whole number of tiles, round down if required + graphic->size &= ~(tile_size - 1); + + int i = 0; + for (int j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + while (j < graphic->size && is_whitespace(&graphic->data[j], tile_size) && !is_preserved(j / tile_size - d)) { + shift_preserved(j / tile_size - d); + d++; + j += tile_size; + } + if (j >= graphic->size) { + break; + } + if (j > i) { + memcpy(&graphic->data[i], &graphic->data[j], tile_size); + } + } + graphic->size = i; +} + +bool tile_exists(uint8_t *tile, uint8_t *tiles, int tile_size, int num_tiles) { + for (int i = 0; i < num_tiles; i++) { + bool match = true; + for (int j = 0; j < tile_size; j++) { + if (tile[j] != tiles[i * tile_size + j]) { + match = false; + } + } + if (match) { + return true; + } + } + return false; +} + +void remove_duplicates(struct Graphic *graphic) { + int tile_size = Options.depth * 8; + if (Options.interleave) tile_size *= 2; + int num_tiles = 0; + + // Make sure we have a whole number of tiles, round down if required + graphic->size &= ~(tile_size - 1); + + for (int i = 0, j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + while (j < graphic->size && tile_exists(&graphic->data[j], graphic->data, tile_size, num_tiles)) { + if ((Options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) || is_preserved(j / tile_size - d)) { + break; + } + shift_preserved(j / tile_size - d); + d++; + j += tile_size; + } + if (j >= graphic->size) { + break; + } + if (j > i) { + memcpy(&graphic->data[i], &graphic->data[j], tile_size); + } + num_tiles++; + } + graphic->size = num_tiles * tile_size; +} + +bool flip_exists(uint8_t *tile, uint8_t *tiles, int tile_size, int num_tiles, bool xflip, bool yflip) { + uint8_t flip[tile_size]; + memset(flip, 0, sizeof(flip)); + int half_size = tile_size / 2; + for (int i = 0; i < tile_size; i++) { + int byte = i; + if (yflip) { + byte = tile_size - 1 - (i ^ 1); + if (Options.interleave && i < half_size) { + byte = half_size - 1 - (i ^ 1); + } + } + if (xflip) { + for (int bit = 0; bit < 8; bit++) { + flip[byte] |= ((tile[i] >> bit) & 1) << (7 - bit); + } + } else { + flip[byte] = tile[i]; + } + } + if (tile_exists(flip, tiles, tile_size, num_tiles)) { + return true; + } + return false; +} + +void remove_flip(struct Graphic *graphic, bool xflip, bool yflip) { + int tile_size = Options.depth * 8; + if (Options.interleave) tile_size *= 2; + int num_tiles = 0; + + // Make sure we have a whole number of tiles, round down if required + graphic->size &= ~(tile_size - 1); + + for (int i = 0, j = 0, d = 0; i < graphic->size && j < graphic->size; i += tile_size, j += tile_size) { + while (j < graphic->size && flip_exists(&graphic->data[j], graphic->data, tile_size, num_tiles, xflip, yflip)) { + if ((Options.keep_whitespace && is_whitespace(&graphic->data[j], tile_size)) || is_preserved(j / tile_size - d)) { + break; + } + shift_preserved(j / tile_size - d); + d++; + j += tile_size; + } + if (j >= graphic->size) { + break; + } + if (j > i) { + memcpy(&graphic->data[i], &graphic->data[j], tile_size); + } + num_tiles++; + } + graphic->size = num_tiles * tile_size; +} + +void interleave(struct Graphic *graphic, int width) { + int tile_size = Options.depth * 8; + int width_tiles = width / 8; + int num_tiles = graphic->size / tile_size; + uint8_t *interleaved = malloc(graphic->size); + for (int i = 0; i < num_tiles; i++) { + int tile = i * 2; + int row = i / width_tiles; + tile -= width_tiles * row; + if (row % 2) { + tile -= width_tiles; + tile += 1; + } + memcpy(&interleaved[tile * tile_size], &graphic->data[i * tile_size], tile_size); + } + graphic->size = num_tiles * tile_size; + memcpy(graphic->data, interleaved, graphic->size); + free(interleaved); +} + +int png_get_width(char *filename) { + FILE *f = fopen_verbose(filename, "rb"); + if (!f) { + exit(1); + } + + const int OFFSET_WIDTH = 16; + uint8_t bytes[4]; + fseek(f, OFFSET_WIDTH, SEEK_SET); + size_t size = 4; + size_t result = fread(bytes, 1, size, f); + fclose(f); + if (result != size) { + fprintf(stderr, "Could not read file at offset 0x%x: \"%s\"\n", OFFSET_WIDTH, filename); + exit(1); + } + + int width = 0; + for (int i = 0; i < 4; i++) { + width |= bytes[i] << (8 * (3 - i)); + } + return width; +} + + +int main(int argc, char *argv[]) { + get_args(argc, argv); + argc -= optind; + argv += optind; + if (Options.help) { + usage(); + return 0; + } + if (argc < 1) { + usage(); + exit(1); + } + char *infile = argv[0]; + struct Graphic graphic; + graphic.data = read_u8(infile, &graphic.size); + if (Options.trim_whitespace) { + trim_whitespace(&graphic); + } + if (Options.interleave) { + if (!Options.png_file) { + error("interleave: need --png to infer dimensions"); + usage(); + exit(1); + } + int width = png_get_width(Options.png_file); + interleave(&graphic, width); + } + if (Options.remove_duplicates) { + remove_duplicates(&graphic); + } + if (Options.remove_xflip) { + remove_flip(&graphic, true, false); + } + if (Options.remove_yflip) { + remove_flip(&graphic, false, true); + } + if (Options.remove_xflip && Options.remove_yflip) { + remove_flip(&graphic, true, true); + } + if (Options.remove_whitespace) { + remove_whitespace(&graphic); + } + if (Options.outfile) { + write_u8(Options.outfile, graphic.data, graphic.size); + } + free(graphic.data); + return 0; +} diff --git a/tools/scan_includes.c b/tools/scan_includes.c new file mode 100644 index 00000000..0a6230bd --- /dev/null +++ b/tools/scan_includes.c @@ -0,0 +1,197 @@ +#define _DEFAULT_SOURCE + +#include +#include +#include +#include +#include +#include + +void usage(void) { + printf("Usage: scan_includes [-h] [-s] [-i path] filename\n" + "-h, --help\n" + " Print usage and exit\n" + "-s, --strict\n" + " Fail if a file cannot be read\n" + "-i, --include\n" + " Add an include path\n"); +} + +struct Options { + bool help; + bool strict; + char **include_paths; + int include_paths_len; +}; + +struct Options Options = {0}; + +void *xmalloc(const size_t size) +{ + void *ptr = malloc(size); + if (!ptr) { + perror("malloc"); + exit(1); + } + return ptr; +} + +void options_add_file(char *fname) +{ + char *filename = xmalloc(strlen(fname) + 1); + strcpy(filename, fname); + if (!(Options.include_paths = realloc(Options.include_paths, + sizeof(Options.include_paths[0]) * ++Options.include_paths_len))) { + perror("realloc"); + exit(1); + } + Options.include_paths[Options.include_paths_len - 1] = filename; +} + +void scan_file(char *filename) { + FILE *f = fopen(filename, "r"); + + if (!f) { + if (Options.strict) { + fprintf(stderr, "Could not open file: '%s'\n", filename); + exit(1); + } else { + return; + } + } + + fseek(f, 0, SEEK_END); + long size = ftell(f); + rewind(f); + + char *buffer = xmalloc(size + 1); + char *orig = buffer; + size = fread(buffer, 1, size, f); + buffer[size] = '\0'; + fclose(f); + + for (; buffer && (buffer - orig < size); buffer++) { + bool is_include = false; + bool is_incbin = false; + switch (*buffer) { + case ';': + buffer = strchr(buffer, '\n'); + if (!buffer) { + fprintf(stderr, "%s: no newline at end of file\n", filename); + break; + } + break; + + case '"': + buffer++; + buffer = strchr(buffer, '"'); + if (!buffer) { + fprintf(stderr, "%s: unterminated string\n", filename); + break; + } + buffer++; + break; + + case 'i': + case 'I': + if ((strncmp(buffer, "INCBIN", 6) == 0) || (strncmp(buffer, "incbin", 6) == 0)) { + is_incbin = true; + } else if ((strncmp(buffer, "INCLUDE", 7) == 0) || (strncmp(buffer, "include", 7) == 0)) { + is_include = true; + } + if (is_incbin || is_include) { + buffer = strchr(buffer, '"'); + if (!buffer) { + break; + } + buffer++; + int length = strcspn(buffer, "\""); + char *include = xmalloc(length + 1); + strncpy(include, buffer, length); + include[length] = '\0'; + + f = fopen(include, "r"); + char *path = NULL; + if (!f) { + for (char **include_path = Options.include_paths; + include_path < Options.include_paths + Options.include_paths_len; + include_path++) { + size_t len = strlen(*include_path) + strlen(include) + 1; + path = xmalloc(len); + snprintf(path, len, "%s%s", *include_path, include); + f = fopen(path, "r"); + if (f) break; + free(path); + path = NULL; + } + if (!path && is_incbin && Options.include_paths_len == 1) { + char **include_path = Options.include_paths; + size_t len = strlen(*include_path) + strlen(include) + 1; + path = xmalloc(len); + snprintf(path, len, "%s%s", *include_path, include); + } + } + if (f) fclose(f); + + if (path) { + free(include); + include = path; + } + printf("%s ", include); + if (is_include) { + scan_file(include); + } + free(include); + buffer = strchr(buffer, '"'); + } + break; + + } + if (!buffer) { + break; + } + + } + + free(orig); +} + +int main(int argc, char* argv[]) { + int i = 0; + struct option long_options[] = { + {"strict", no_argument, 0, 's'}, + {"help", no_argument, 0, 'h'}, + {"include", required_argument, 0, 'i'}, + {0} + }; + int opt = -1; + while ((opt = getopt_long(argc, argv, "shi:", long_options, &i)) != -1) { + switch (opt) { + case 's': + Options.strict = true; + break; + case 'h': + Options.help = true; + break; + case 'i': + options_add_file(optarg); + break; + default: + usage(); + exit(1); + break; + } + } + argc -= optind; + argv += optind; + if (Options.help) { + usage(); + return 0; + } + if (argc < 1) { + usage(); + exit(1); + } + scan_file(argv[0]); + return 0; +} From 39a28b59981b0c56b5b1d829b94c6e86c7a9c829 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Mon, 14 Dec 2020 11:09:57 -0600 Subject: [PATCH 13/45] Let rgbgfx generate pal files for card gfx and remove unnecessary gfx filename extension rules --- .gitignore | 1 + Makefile | 4 +- src/engine/home.asm | 2 +- src/gfx.asm | 528 +++++++++--------- .../{colosseum2.t10.png => colosseum2.png} | Bin .../{evolution2.t10.png => evolution2.png} | Bin .../{laboratory2.t10.png => laboratory2.png} | Bin .../{mystery2.t10.png => mystery2.png} | Bin .../cardpop/{cardpop1.t3.png => cardpop1.png} | Bin .../cardpop/{cardpop2.t3.png => cardpop2.png} | Bin .../cardpop/{cardpop3.t3.png => cardpop3.png} | Bin src/gfx/cards/abra.8x6.png | Bin 745 -> 0 bytes src/gfx/cards/abra.pal | Bin 8 -> 0 bytes src/gfx/cards/abra.png | Bin 0 -> 791 bytes src/gfx/cards/aerodactyl.8x6.png | Bin 759 -> 0 bytes src/gfx/cards/aerodactyl.pal | Bin 8 -> 0 bytes src/gfx/cards/aerodactyl.png | Bin 0 -> 810 bytes src/gfx/cards/alakazam.8x6.png | Bin 755 -> 0 bytes src/gfx/cards/alakazam.pal | Bin 8 -> 0 bytes src/gfx/cards/alakazam.png | Bin 0 -> 806 bytes src/gfx/cards/arbok.8x6.png | Bin 831 -> 0 bytes src/gfx/cards/arbok.pal | Bin 8 -> 0 bytes src/gfx/cards/arbok.png | Bin 0 -> 875 bytes src/gfx/cards/arcanine1.8x6.png | Bin 760 -> 0 bytes src/gfx/cards/arcanine1.pal | Bin 8 -> 0 bytes src/gfx/cards/arcanine1.png | Bin 0 -> 807 bytes src/gfx/cards/arcanine2.8x6.png | Bin 772 -> 0 bytes src/gfx/cards/arcanine2.pal | Bin 8 -> 0 bytes src/gfx/cards/arcanine2.png | Bin 0 -> 809 bytes src/gfx/cards/articuno1.8x6.png | Bin 793 -> 0 bytes src/gfx/cards/articuno1.pal | 1 - src/gfx/cards/articuno1.png | Bin 0 -> 847 bytes src/gfx/cards/articuno2.8x6.png | Bin 795 -> 0 bytes src/gfx/cards/articuno2.pal | Bin 8 -> 0 bytes src/gfx/cards/articuno2.png | Bin 0 -> 831 bytes src/gfx/cards/beedrill.8x6.png | Bin 825 -> 0 bytes src/gfx/cards/beedrill.pal | Bin 8 -> 0 bytes src/gfx/cards/beedrill.png | Bin 0 -> 869 bytes src/gfx/cards/bellsprout.8x6.png | Bin 775 -> 0 bytes src/gfx/cards/bellsprout.pal | Bin 8 -> 0 bytes src/gfx/cards/bellsprout.png | Bin 0 -> 817 bytes src/gfx/cards/bill.8x6.png | Bin 519 -> 0 bytes src/gfx/cards/bill.pal | Bin 8 -> 0 bytes src/gfx/cards/bill.png | Bin 0 -> 556 bytes src/gfx/cards/blastoise.8x6.png | Bin 737 -> 0 bytes src/gfx/cards/blastoise.pal | Bin 8 -> 0 bytes src/gfx/cards/blastoise.png | Bin 0 -> 782 bytes src/gfx/cards/bulbasaur.8x6.png | Bin 830 -> 0 bytes src/gfx/cards/bulbasaur.pal | Bin 8 -> 0 bytes src/gfx/cards/bulbasaur.png | Bin 0 -> 866 bytes src/gfx/cards/butterfree.8x6.png | Bin 808 -> 0 bytes src/gfx/cards/butterfree.pal | Bin 8 -> 0 bytes src/gfx/cards/butterfree.png | Bin 0 -> 844 bytes src/gfx/cards/caterpie.8x6.png | Bin 801 -> 0 bytes src/gfx/cards/caterpie.pal | Bin 8 -> 0 bytes src/gfx/cards/caterpie.png | Bin 0 -> 841 bytes src/gfx/cards/chansey.8x6.png | Bin 764 -> 0 bytes src/gfx/cards/chansey.pal | 1 - src/gfx/cards/chansey.png | Bin 0 -> 793 bytes src/gfx/cards/charizard.8x6.png | Bin 801 -> 0 bytes src/gfx/cards/charizard.pal | Bin 8 -> 0 bytes src/gfx/cards/charizard.png | Bin 0 -> 843 bytes src/gfx/cards/charmander.8x6.png | Bin 744 -> 0 bytes src/gfx/cards/charmander.pal | Bin 8 -> 0 bytes src/gfx/cards/charmander.png | Bin 0 -> 780 bytes src/gfx/cards/charmeleon.8x6.png | Bin 745 -> 0 bytes src/gfx/cards/charmeleon.pal | Bin 8 -> 0 bytes src/gfx/cards/charmeleon.png | Bin 0 -> 785 bytes src/gfx/cards/clefable.8x6.png | Bin 702 -> 0 bytes src/gfx/cards/clefable.pal | 1 - src/gfx/cards/clefable.png | Bin 0 -> 756 bytes src/gfx/cards/clefairy.8x6.png | Bin 683 -> 0 bytes src/gfx/cards/clefairy.pal | Bin 8 -> 0 bytes src/gfx/cards/clefairy.png | Bin 0 -> 728 bytes src/gfx/cards/clefairydoll.8x6.png | Bin 631 -> 0 bytes src/gfx/cards/clefairydoll.pal | Bin 8 -> 0 bytes src/gfx/cards/clefairydoll.png | Bin 0 -> 669 bytes src/gfx/cards/cloyster.8x6.png | Bin 752 -> 0 bytes src/gfx/cards/cloyster.pal | 1 - src/gfx/cards/cloyster.png | Bin 0 -> 795 bytes src/gfx/cards/computersearch.8x6.png | Bin 731 -> 0 bytes src/gfx/cards/computersearch.pal | Bin 8 -> 0 bytes src/gfx/cards/computersearch.png | Bin 0 -> 774 bytes src/gfx/cards/cubone.8x6.png | Bin 675 -> 0 bytes src/gfx/cards/cubone.pal | Bin 8 -> 0 bytes src/gfx/cards/cubone.png | Bin 0 -> 715 bytes src/gfx/cards/defender.8x6.png | Bin 478 -> 0 bytes src/gfx/cards/defender.pal | Bin 8 -> 0 bytes src/gfx/cards/defender.png | Bin 0 -> 526 bytes src/gfx/cards/devolutionspray.8x6.png | Bin 481 -> 0 bytes src/gfx/cards/devolutionspray.pal | Bin 8 -> 0 bytes src/gfx/cards/devolutionspray.png | Bin 0 -> 522 bytes src/gfx/cards/dewgong.8x6.png | Bin 775 -> 0 bytes src/gfx/cards/dewgong.pal | Bin 8 -> 0 bytes src/gfx/cards/dewgong.png | Bin 0 -> 814 bytes src/gfx/cards/diglett.8x6.png | Bin 662 -> 0 bytes src/gfx/cards/diglett.pal | Bin 8 -> 0 bytes src/gfx/cards/diglett.png | Bin 0 -> 707 bytes src/gfx/cards/ditto.8x6.png | Bin 593 -> 0 bytes src/gfx/cards/ditto.pal | Bin 8 -> 0 bytes src/gfx/cards/ditto.png | Bin 0 -> 630 bytes src/gfx/cards/dodrio.8x6.png | Bin 662 -> 0 bytes src/gfx/cards/dodrio.pal | Bin 8 -> 0 bytes src/gfx/cards/dodrio.png | Bin 0 -> 701 bytes src/gfx/cards/doduo.8x6.png | Bin 618 -> 0 bytes src/gfx/cards/doduo.pal | Bin 8 -> 0 bytes src/gfx/cards/doduo.png | Bin 0 -> 656 bytes src/gfx/cards/doublecolorlessenergy.8x6.png | Bin 538 -> 0 bytes src/gfx/cards/doublecolorlessenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/doublecolorlessenergy.png | Bin 0 -> 576 bytes src/gfx/cards/dragonair.8x6.png | Bin 755 -> 0 bytes src/gfx/cards/dragonair.pal | Bin 8 -> 0 bytes src/gfx/cards/dragonair.png | Bin 0 -> 796 bytes src/gfx/cards/dragonite1.8x6.png | Bin 659 -> 0 bytes src/gfx/cards/dragonite1.pal | Bin 8 -> 0 bytes src/gfx/cards/dragonite1.png | Bin 0 -> 701 bytes src/gfx/cards/dragonite2.8x6.png | Bin 775 -> 0 bytes src/gfx/cards/dragonite2.pal | Bin 8 -> 0 bytes src/gfx/cards/dragonite2.png | Bin 0 -> 827 bytes src/gfx/cards/dratini.8x6.png | Bin 730 -> 0 bytes src/gfx/cards/dratini.pal | Bin 8 -> 0 bytes src/gfx/cards/dratini.png | Bin 0 -> 768 bytes src/gfx/cards/drowzee.8x6.png | Bin 732 -> 0 bytes src/gfx/cards/drowzee.pal | Bin 8 -> 0 bytes src/gfx/cards/drowzee.png | Bin 0 -> 776 bytes src/gfx/cards/dugtrio.8x6.png | Bin 657 -> 0 bytes src/gfx/cards/dugtrio.pal | Bin 8 -> 0 bytes src/gfx/cards/dugtrio.png | Bin 0 -> 695 bytes src/gfx/cards/eevee.8x6.png | Bin 784 -> 0 bytes src/gfx/cards/eevee.pal | Bin 8 -> 0 bytes src/gfx/cards/eevee.png | Bin 0 -> 819 bytes src/gfx/cards/ekans.8x6.png | Bin 770 -> 0 bytes src/gfx/cards/ekans.pal | Bin 8 -> 0 bytes src/gfx/cards/ekans.png | Bin 0 -> 811 bytes src/gfx/cards/electabuzz1.8x6.png | Bin 704 -> 0 bytes src/gfx/cards/electabuzz1.pal | Bin 8 -> 0 bytes src/gfx/cards/electabuzz1.png | Bin 0 -> 759 bytes src/gfx/cards/electabuzz2.8x6.png | Bin 616 -> 0 bytes src/gfx/cards/electabuzz2.pal | Bin 8 -> 0 bytes src/gfx/cards/electabuzz2.png | Bin 0 -> 667 bytes src/gfx/cards/electrode1.8x6.png | Bin 732 -> 0 bytes src/gfx/cards/electrode1.pal | Bin 8 -> 0 bytes src/gfx/cards/electrode1.png | Bin 0 -> 770 bytes src/gfx/cards/electrode2.8x6.png | Bin 688 -> 0 bytes src/gfx/cards/electrode2.pal | Bin 8 -> 0 bytes src/gfx/cards/electrode2.png | Bin 0 -> 731 bytes src/gfx/cards/energyremoval.8x6.png | Bin 651 -> 0 bytes src/gfx/cards/energyremoval.pal | Bin 8 -> 0 bytes src/gfx/cards/energyremoval.png | Bin 0 -> 693 bytes src/gfx/cards/energyretrieval.8x6.png | Bin 479 -> 0 bytes src/gfx/cards/energyretrieval.pal | Bin 8 -> 0 bytes src/gfx/cards/energyretrieval.png | Bin 0 -> 519 bytes src/gfx/cards/energysearch.8x6.png | Bin 596 -> 0 bytes src/gfx/cards/energysearch.pal | Bin 8 -> 0 bytes src/gfx/cards/energysearch.png | Bin 0 -> 635 bytes src/gfx/cards/exeggcute.8x6.png | Bin 756 -> 0 bytes src/gfx/cards/exeggcute.pal | 1 - src/gfx/cards/exeggcute.png | Bin 0 -> 795 bytes src/gfx/cards/exeggutor.8x6.png | Bin 783 -> 0 bytes src/gfx/cards/exeggutor.pal | Bin 8 -> 0 bytes src/gfx/cards/exeggutor.png | Bin 0 -> 825 bytes src/gfx/cards/farfetchd.8x6.png | Bin 718 -> 0 bytes src/gfx/cards/farfetchd.pal | Bin 8 -> 0 bytes src/gfx/cards/farfetchd.png | Bin 0 -> 760 bytes src/gfx/cards/fearow.8x6.png | Bin 725 -> 0 bytes src/gfx/cards/fearow.pal | Bin 8 -> 0 bytes src/gfx/cards/fearow.png | Bin 0 -> 763 bytes src/gfx/cards/fightingenergy.8x6.png | Bin 514 -> 0 bytes src/gfx/cards/fightingenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/fightingenergy.png | Bin 0 -> 554 bytes src/gfx/cards/fireenergy.8x6.png | Bin 558 -> 0 bytes src/gfx/cards/fireenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/fireenergy.png | Bin 0 -> 599 bytes src/gfx/cards/flareon1.8x6.png | Bin 844 -> 0 bytes src/gfx/cards/flareon1.pal | Bin 8 -> 0 bytes src/gfx/cards/flareon1.png | Bin 0 -> 880 bytes src/gfx/cards/flareon2.8x6.png | Bin 808 -> 0 bytes src/gfx/cards/flareon2.pal | Bin 8 -> 0 bytes src/gfx/cards/flareon2.png | Bin 0 -> 853 bytes src/gfx/cards/flyingpikachu.8x6.png | Bin 633 -> 0 bytes src/gfx/cards/flyingpikachu.pal | Bin 8 -> 0 bytes src/gfx/cards/flyingpikachu.png | Bin 0 -> 672 bytes src/gfx/cards/fullheal.8x6.png | Bin 561 -> 0 bytes src/gfx/cards/fullheal.pal | Bin 8 -> 0 bytes src/gfx/cards/fullheal.png | Bin 0 -> 612 bytes src/gfx/cards/gambler.8x6.png | Bin 449 -> 0 bytes src/gfx/cards/gambler.pal | Bin 8 -> 0 bytes src/gfx/cards/gambler.png | Bin 0 -> 498 bytes src/gfx/cards/gastly1.8x6.png | Bin 612 -> 0 bytes src/gfx/cards/gastly1.pal | Bin 8 -> 0 bytes src/gfx/cards/gastly1.png | Bin 0 -> 666 bytes src/gfx/cards/gastly2.8x6.png | Bin 744 -> 0 bytes src/gfx/cards/gastly2.pal | 1 - src/gfx/cards/gastly2.png | Bin 0 -> 781 bytes src/gfx/cards/gengar.8x6.png | Bin 664 -> 0 bytes src/gfx/cards/gengar.pal | 1 - src/gfx/cards/gengar.png | Bin 0 -> 713 bytes src/gfx/cards/geodude.8x6.png | Bin 810 -> 0 bytes src/gfx/cards/geodude.pal | Bin 8 -> 0 bytes src/gfx/cards/geodude.png | Bin 0 -> 851 bytes src/gfx/cards/gloom.8x6.png | Bin 622 -> 0 bytes src/gfx/cards/gloom.pal | Bin 8 -> 0 bytes src/gfx/cards/gloom.png | Bin 0 -> 664 bytes src/gfx/cards/golbat.8x6.png | Bin 795 -> 0 bytes src/gfx/cards/golbat.pal | Bin 8 -> 0 bytes src/gfx/cards/golbat.png | Bin 0 -> 840 bytes src/gfx/cards/goldeen.8x6.png | Bin 766 -> 0 bytes src/gfx/cards/goldeen.pal | Bin 8 -> 0 bytes src/gfx/cards/goldeen.png | Bin 0 -> 796 bytes src/gfx/cards/golduck.8x6.png | Bin 816 -> 0 bytes src/gfx/cards/golduck.pal | Bin 8 -> 0 bytes src/gfx/cards/golduck.png | Bin 0 -> 856 bytes src/gfx/cards/golem.8x6.png | Bin 809 -> 0 bytes src/gfx/cards/golem.pal | Bin 8 -> 0 bytes src/gfx/cards/golem.png | Bin 0 -> 849 bytes src/gfx/cards/grassenergy.8x6.png | Bin 593 -> 0 bytes src/gfx/cards/grassenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/grassenergy.png | Bin 0 -> 597 bytes src/gfx/cards/graveler.8x6.png | Bin 836 -> 0 bytes src/gfx/cards/graveler.pal | Bin 8 -> 0 bytes src/gfx/cards/graveler.png | Bin 0 -> 869 bytes src/gfx/cards/grimer.8x6.png | Bin 698 -> 0 bytes src/gfx/cards/grimer.pal | Bin 8 -> 0 bytes src/gfx/cards/grimer.png | Bin 0 -> 742 bytes src/gfx/cards/growlithe.8x6.png | Bin 673 -> 0 bytes src/gfx/cards/growlithe.pal | Bin 8 -> 0 bytes src/gfx/cards/growlithe.png | Bin 0 -> 706 bytes src/gfx/cards/gustofwind.8x6.png | Bin 775 -> 0 bytes src/gfx/cards/gustofwind.pal | 1 - src/gfx/cards/gustofwind.png | Bin 0 -> 819 bytes src/gfx/cards/gyarados.8x6.png | Bin 734 -> 0 bytes src/gfx/cards/gyarados.pal | 1 - src/gfx/cards/gyarados.png | Bin 0 -> 786 bytes src/gfx/cards/haunter1.8x6.png | Bin 594 -> 0 bytes src/gfx/cards/haunter1.pal | 1 - src/gfx/cards/haunter1.png | Bin 0 -> 652 bytes src/gfx/cards/haunter2.8x6.png | Bin 470 -> 0 bytes src/gfx/cards/haunter2.pal | Bin 8 -> 0 bytes src/gfx/cards/haunter2.png | Bin 0 -> 523 bytes src/gfx/cards/hitmonchan.8x6.png | Bin 772 -> 0 bytes src/gfx/cards/hitmonchan.pal | Bin 8 -> 0 bytes src/gfx/cards/hitmonchan.png | Bin 0 -> 817 bytes src/gfx/cards/hitmonlee.8x6.png | Bin 704 -> 0 bytes src/gfx/cards/hitmonlee.pal | Bin 8 -> 0 bytes src/gfx/cards/hitmonlee.png | Bin 0 -> 757 bytes src/gfx/cards/horsea.8x6.png | Bin 703 -> 0 bytes src/gfx/cards/horsea.pal | Bin 8 -> 0 bytes src/gfx/cards/horsea.png | Bin 0 -> 740 bytes src/gfx/cards/hypno.8x6.png | Bin 715 -> 0 bytes src/gfx/cards/hypno.pal | Bin 8 -> 0 bytes src/gfx/cards/hypno.png | Bin 0 -> 769 bytes src/gfx/cards/imakuni.8x6.png | Bin 708 -> 0 bytes src/gfx/cards/imakuni.pal | Bin 8 -> 0 bytes src/gfx/cards/imakuni.png | Bin 0 -> 753 bytes src/gfx/cards/imposterprofessoroak.8x6.png | Bin 658 -> 0 bytes src/gfx/cards/imposterprofessoroak.pal | Bin 8 -> 0 bytes src/gfx/cards/imposterprofessoroak.png | Bin 0 -> 700 bytes src/gfx/cards/itemfinder.8x6.png | Bin 468 -> 0 bytes src/gfx/cards/itemfinder.pal | Bin 8 -> 0 bytes src/gfx/cards/itemfinder.png | Bin 0 -> 513 bytes src/gfx/cards/ivysaur.8x6.png | Bin 785 -> 0 bytes src/gfx/cards/ivysaur.pal | Bin 8 -> 0 bytes src/gfx/cards/ivysaur.png | Bin 0 -> 839 bytes src/gfx/cards/jigglypuff1.8x6.png | Bin 751 -> 0 bytes src/gfx/cards/jigglypuff1.pal | 1 - src/gfx/cards/jigglypuff1.png | Bin 0 -> 792 bytes src/gfx/cards/jigglypuff2.8x6.png | Bin 648 -> 0 bytes src/gfx/cards/jigglypuff2.pal | Bin 8 -> 0 bytes src/gfx/cards/jigglypuff2.png | Bin 0 -> 682 bytes src/gfx/cards/jigglypuff3.8x6.png | Bin 710 -> 0 bytes src/gfx/cards/jigglypuff3.pal | 1 - src/gfx/cards/jigglypuff3.png | Bin 0 -> 755 bytes src/gfx/cards/jolteon1.8x6.png | Bin 725 -> 0 bytes src/gfx/cards/jolteon1.pal | Bin 8 -> 0 bytes src/gfx/cards/jolteon1.png | Bin 0 -> 759 bytes src/gfx/cards/jolteon2.8x6.png | Bin 778 -> 0 bytes src/gfx/cards/jolteon2.pal | Bin 8 -> 0 bytes src/gfx/cards/jolteon2.png | Bin 0 -> 827 bytes src/gfx/cards/jynx.8x6.png | Bin 638 -> 0 bytes src/gfx/cards/jynx.pal | Bin 8 -> 0 bytes src/gfx/cards/jynx.png | Bin 0 -> 687 bytes src/gfx/cards/kabuto.8x6.png | Bin 736 -> 0 bytes src/gfx/cards/kabuto.pal | Bin 8 -> 0 bytes src/gfx/cards/kabuto.png | Bin 0 -> 775 bytes src/gfx/cards/kabutops.8x6.png | Bin 691 -> 0 bytes src/gfx/cards/kabutops.pal | Bin 8 -> 0 bytes src/gfx/cards/kabutops.png | Bin 0 -> 744 bytes src/gfx/cards/kadabra.8x6.png | Bin 608 -> 0 bytes src/gfx/cards/kadabra.pal | Bin 8 -> 0 bytes src/gfx/cards/kadabra.png | Bin 0 -> 656 bytes src/gfx/cards/kakuna.8x6.png | Bin 760 -> 0 bytes src/gfx/cards/kakuna.pal | Bin 8 -> 0 bytes src/gfx/cards/kakuna.png | Bin 0 -> 807 bytes src/gfx/cards/kangaskhan.8x6.png | Bin 757 -> 0 bytes src/gfx/cards/kangaskhan.pal | Bin 8 -> 0 bytes src/gfx/cards/kangaskhan.png | Bin 0 -> 802 bytes src/gfx/cards/kingler.8x6.png | Bin 767 -> 0 bytes src/gfx/cards/kingler.pal | Bin 8 -> 0 bytes src/gfx/cards/kingler.png | Bin 0 -> 808 bytes src/gfx/cards/koffing.8x6.png | Bin 802 -> 0 bytes src/gfx/cards/koffing.pal | 1 - src/gfx/cards/koffing.png | Bin 0 -> 841 bytes src/gfx/cards/krabby.8x6.png | Bin 676 -> 0 bytes src/gfx/cards/krabby.pal | Bin 8 -> 0 bytes src/gfx/cards/krabby.png | Bin 0 -> 713 bytes src/gfx/cards/lapras.8x6.png | Bin 639 -> 0 bytes src/gfx/cards/lapras.pal | Bin 8 -> 0 bytes src/gfx/cards/lapras.png | Bin 0 -> 698 bytes src/gfx/cards/lass.8x6.png | Bin 621 -> 0 bytes src/gfx/cards/lass.pal | Bin 8 -> 0 bytes src/gfx/cards/lass.png | Bin 0 -> 661 bytes src/gfx/cards/lickitung.8x6.png | Bin 813 -> 0 bytes src/gfx/cards/lickitung.pal | Bin 8 -> 0 bytes src/gfx/cards/lickitung.png | Bin 0 -> 839 bytes src/gfx/cards/lightningenergy.8x6.png | Bin 537 -> 0 bytes src/gfx/cards/lightningenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/lightningenergy.png | Bin 0 -> 577 bytes src/gfx/cards/machamp.8x6.png | Bin 776 -> 0 bytes src/gfx/cards/machamp.pal | 1 - src/gfx/cards/machamp.png | Bin 0 -> 830 bytes src/gfx/cards/machoke.8x6.png | Bin 709 -> 0 bytes src/gfx/cards/machoke.pal | Bin 8 -> 0 bytes src/gfx/cards/machoke.png | Bin 0 -> 758 bytes src/gfx/cards/machop.8x6.png | Bin 728 -> 0 bytes src/gfx/cards/machop.pal | Bin 8 -> 0 bytes src/gfx/cards/machop.png | Bin 0 -> 767 bytes src/gfx/cards/magikarp.8x6.png | Bin 813 -> 0 bytes src/gfx/cards/magikarp.pal | Bin 8 -> 0 bytes src/gfx/cards/magikarp.png | Bin 0 -> 849 bytes src/gfx/cards/magmar1.8x6.png | Bin 712 -> 0 bytes src/gfx/cards/magmar1.pal | Bin 8 -> 0 bytes src/gfx/cards/magmar1.png | Bin 0 -> 781 bytes src/gfx/cards/magmar2.8x6.png | Bin 794 -> 0 bytes src/gfx/cards/magmar2.pal | Bin 8 -> 0 bytes src/gfx/cards/magmar2.png | Bin 0 -> 841 bytes src/gfx/cards/magnemite1.8x6.png | Bin 652 -> 0 bytes src/gfx/cards/magnemite1.pal | Bin 8 -> 0 bytes src/gfx/cards/magnemite1.png | Bin 0 -> 691 bytes src/gfx/cards/magnemite2.8x6.png | Bin 650 -> 0 bytes src/gfx/cards/magnemite2.pal | Bin 8 -> 0 bytes src/gfx/cards/magnemite2.png | Bin 0 -> 699 bytes src/gfx/cards/magneton1.8x6.png | Bin 736 -> 0 bytes src/gfx/cards/magneton1.pal | Bin 8 -> 0 bytes src/gfx/cards/magneton1.png | Bin 0 -> 790 bytes src/gfx/cards/magneton2.8x6.png | Bin 663 -> 0 bytes src/gfx/cards/magneton2.pal | 1 - src/gfx/cards/magneton2.png | Bin 0 -> 715 bytes src/gfx/cards/maintenance.8x6.png | Bin 467 -> 0 bytes src/gfx/cards/maintenance.pal | Bin 8 -> 0 bytes src/gfx/cards/maintenance.png | Bin 0 -> 508 bytes src/gfx/cards/mankey.8x6.png | Bin 797 -> 0 bytes src/gfx/cards/mankey.pal | Bin 8 -> 0 bytes src/gfx/cards/mankey.png | Bin 0 -> 837 bytes src/gfx/cards/marowak1.8x6.png | Bin 731 -> 0 bytes src/gfx/cards/marowak1.pal | Bin 8 -> 0 bytes src/gfx/cards/marowak1.png | Bin 0 -> 768 bytes src/gfx/cards/marowak2.8x6.png | Bin 763 -> 0 bytes src/gfx/cards/marowak2.pal | Bin 8 -> 0 bytes src/gfx/cards/marowak2.png | Bin 0 -> 798 bytes src/gfx/cards/meowth1.8x6.png | Bin 794 -> 0 bytes src/gfx/cards/meowth1.pal | Bin 8 -> 0 bytes src/gfx/cards/meowth1.png | Bin 0 -> 836 bytes src/gfx/cards/meowth2.8x6.png | Bin 773 -> 0 bytes src/gfx/cards/meowth2.pal | Bin 8 -> 0 bytes src/gfx/cards/meowth2.png | Bin 0 -> 813 bytes src/gfx/cards/metapod.8x6.png | Bin 675 -> 0 bytes src/gfx/cards/metapod.pal | Bin 8 -> 0 bytes src/gfx/cards/metapod.png | Bin 0 -> 713 bytes src/gfx/cards/mew1.8x6.png | Bin 767 -> 0 bytes src/gfx/cards/mew1.pal | Bin 8 -> 0 bytes src/gfx/cards/mew1.png | Bin 0 -> 803 bytes src/gfx/cards/mew2.8x6.png | Bin 754 -> 0 bytes src/gfx/cards/mew2.pal | Bin 8 -> 0 bytes src/gfx/cards/mew2.png | Bin 0 -> 790 bytes src/gfx/cards/mew3.8x6.png | Bin 699 -> 0 bytes src/gfx/cards/mew3.pal | 1 - src/gfx/cards/mew3.png | Bin 0 -> 744 bytes src/gfx/cards/mewtwo1.8x6.png | Bin 659 -> 0 bytes src/gfx/cards/mewtwo1.pal | 1 - src/gfx/cards/mewtwo1.png | Bin 0 -> 716 bytes src/gfx/cards/mewtwo2.8x6.png | Bin 695 -> 0 bytes src/gfx/cards/mewtwo2.pal | Bin 8 -> 0 bytes src/gfx/cards/mewtwo2.png | Bin 0 -> 742 bytes src/gfx/cards/mewtwo3.8x6.png | Bin 788 -> 0 bytes src/gfx/cards/mewtwo3.pal | Bin 8 -> 0 bytes src/gfx/cards/mewtwo3.png | Bin 0 -> 834 bytes src/gfx/cards/moltres1.8x6.png | Bin 790 -> 0 bytes src/gfx/cards/moltres1.pal | Bin 8 -> 0 bytes src/gfx/cards/moltres1.png | Bin 0 -> 838 bytes src/gfx/cards/moltres2.8x6.png | Bin 796 -> 0 bytes src/gfx/cards/moltres2.pal | Bin 8 -> 0 bytes src/gfx/cards/moltres2.png | Bin 0 -> 835 bytes src/gfx/cards/mrfuji.8x6.png | Bin 746 -> 0 bytes src/gfx/cards/mrfuji.pal | 1 - src/gfx/cards/mrfuji.png | Bin 0 -> 785 bytes src/gfx/cards/mrmime.8x6.png | Bin 709 -> 0 bytes src/gfx/cards/mrmime.pal | Bin 8 -> 0 bytes src/gfx/cards/mrmime.png | Bin 0 -> 769 bytes src/gfx/cards/muk.8x6.png | Bin 738 -> 0 bytes src/gfx/cards/muk.pal | Bin 8 -> 0 bytes src/gfx/cards/muk.png | Bin 0 -> 795 bytes src/gfx/cards/mysteriousfossil.8x6.png | Bin 717 -> 0 bytes src/gfx/cards/mysteriousfossil.pal | Bin 8 -> 0 bytes src/gfx/cards/mysteriousfossil.png | Bin 0 -> 771 bytes src/gfx/cards/nidoking.8x6.png | Bin 810 -> 0 bytes src/gfx/cards/nidoking.pal | 1 - src/gfx/cards/nidoking.png | Bin 0 -> 862 bytes src/gfx/cards/nidoqueen.8x6.png | Bin 752 -> 0 bytes src/gfx/cards/nidoqueen.pal | Bin 8 -> 0 bytes src/gfx/cards/nidoqueen.png | Bin 0 -> 811 bytes src/gfx/cards/nidoranf.8x6.png | Bin 769 -> 0 bytes src/gfx/cards/nidoranf.pal | Bin 8 -> 0 bytes src/gfx/cards/nidoranf.png | Bin 0 -> 819 bytes src/gfx/cards/nidoranm.8x6.png | Bin 714 -> 0 bytes src/gfx/cards/nidoranm.pal | 1 - src/gfx/cards/nidoranm.png | Bin 0 -> 757 bytes src/gfx/cards/nidorina.8x6.png | Bin 723 -> 0 bytes src/gfx/cards/nidorina.pal | Bin 8 -> 0 bytes src/gfx/cards/nidorina.png | Bin 0 -> 767 bytes src/gfx/cards/nidorino.8x6.png | Bin 834 -> 0 bytes src/gfx/cards/nidorino.pal | 1 - src/gfx/cards/nidorino.png | Bin 0 -> 872 bytes src/gfx/cards/ninetails1.8x6.png | Bin 760 -> 0 bytes src/gfx/cards/ninetails1.pal | Bin 8 -> 0 bytes src/gfx/cards/ninetails1.png | Bin 0 -> 801 bytes src/gfx/cards/ninetails2.8x6.png | Bin 670 -> 0 bytes src/gfx/cards/ninetails2.pal | Bin 8 -> 0 bytes src/gfx/cards/ninetails2.png | Bin 0 -> 717 bytes src/gfx/cards/oddish.8x6.png | Bin 708 -> 0 bytes src/gfx/cards/oddish.pal | Bin 8 -> 0 bytes src/gfx/cards/oddish.png | Bin 0 -> 753 bytes src/gfx/cards/omanyte.8x6.png | Bin 792 -> 0 bytes src/gfx/cards/omanyte.pal | Bin 8 -> 0 bytes src/gfx/cards/omanyte.png | Bin 0 -> 835 bytes src/gfx/cards/omastar.8x6.png | Bin 810 -> 0 bytes src/gfx/cards/omastar.pal | Bin 8 -> 0 bytes src/gfx/cards/omastar.png | Bin 0 -> 860 bytes src/gfx/cards/onix.8x6.png | Bin 762 -> 0 bytes src/gfx/cards/onix.pal | Bin 8 -> 0 bytes src/gfx/cards/onix.png | Bin 0 -> 803 bytes src/gfx/cards/paras.8x6.png | Bin 779 -> 0 bytes src/gfx/cards/paras.pal | 1 - src/gfx/cards/paras.png | Bin 0 -> 820 bytes src/gfx/cards/parasect.8x6.png | Bin 813 -> 0 bytes src/gfx/cards/parasect.pal | Bin 8 -> 0 bytes src/gfx/cards/parasect.png | Bin 0 -> 852 bytes src/gfx/cards/persian.8x6.png | Bin 690 -> 0 bytes src/gfx/cards/persian.pal | Bin 8 -> 0 bytes src/gfx/cards/persian.png | Bin 0 -> 729 bytes src/gfx/cards/pidgeot1.8x6.png | Bin 782 -> 0 bytes src/gfx/cards/pidgeot1.pal | Bin 8 -> 0 bytes src/gfx/cards/pidgeot1.png | Bin 0 -> 815 bytes src/gfx/cards/pidgeot2.8x6.png | Bin 749 -> 0 bytes src/gfx/cards/pidgeot2.pal | Bin 8 -> 0 bytes src/gfx/cards/pidgeot2.png | Bin 0 -> 794 bytes src/gfx/cards/pidgeotto.8x6.png | Bin 675 -> 0 bytes src/gfx/cards/pidgeotto.pal | Bin 8 -> 0 bytes src/gfx/cards/pidgeotto.png | Bin 0 -> 712 bytes src/gfx/cards/pidgey.8x6.png | Bin 611 -> 0 bytes src/gfx/cards/pidgey.pal | Bin 8 -> 0 bytes src/gfx/cards/pidgey.png | Bin 0 -> 653 bytes src/gfx/cards/pikachu1.8x6.png | Bin 728 -> 0 bytes src/gfx/cards/pikachu1.pal | Bin 8 -> 0 bytes src/gfx/cards/pikachu1.png | Bin 0 -> 770 bytes src/gfx/cards/pikachu2.8x6.png | Bin 754 -> 0 bytes src/gfx/cards/pikachu2.pal | Bin 8 -> 0 bytes src/gfx/cards/pikachu2.png | Bin 0 -> 794 bytes src/gfx/cards/pikachu3.8x6.png | Bin 675 -> 0 bytes src/gfx/cards/pikachu3.pal | Bin 8 -> 0 bytes src/gfx/cards/pikachu3.png | Bin 0 -> 720 bytes src/gfx/cards/pikachu4.8x6.png | Bin 753 -> 0 bytes src/gfx/cards/pikachu4.pal | Bin 8 -> 0 bytes src/gfx/cards/pikachu4.png | Bin 0 -> 789 bytes src/gfx/cards/pinsir.8x6.png | Bin 745 -> 0 bytes src/gfx/cards/pinsir.pal | Bin 8 -> 0 bytes src/gfx/cards/pinsir.png | Bin 0 -> 800 bytes src/gfx/cards/pluspower.8x6.png | Bin 531 -> 0 bytes src/gfx/cards/pluspower.pal | Bin 8 -> 0 bytes src/gfx/cards/pluspower.png | Bin 0 -> 579 bytes src/gfx/cards/pokeball.8x6.png | Bin 549 -> 0 bytes src/gfx/cards/pokeball.pal | Bin 8 -> 0 bytes src/gfx/cards/pokeball.png | Bin 0 -> 594 bytes src/gfx/cards/pokedex.8x6.png | Bin 750 -> 0 bytes src/gfx/cards/pokedex.pal | Bin 8 -> 0 bytes src/gfx/cards/pokedex.png | Bin 0 -> 791 bytes src/gfx/cards/pokemonbreeder.8x6.png | Bin 616 -> 0 bytes src/gfx/cards/pokemonbreeder.pal | Bin 8 -> 0 bytes src/gfx/cards/pokemonbreeder.png | Bin 0 -> 654 bytes src/gfx/cards/pokemoncenter.8x6.png | Bin 529 -> 0 bytes src/gfx/cards/pokemoncenter.pal | Bin 8 -> 0 bytes src/gfx/cards/pokemoncenter.png | Bin 0 -> 589 bytes src/gfx/cards/pokemonflute.8x6.png | Bin 582 -> 0 bytes src/gfx/cards/pokemonflute.pal | Bin 8 -> 0 bytes src/gfx/cards/pokemonflute.png | Bin 0 -> 624 bytes src/gfx/cards/pokemontrader.8x6.png | Bin 697 -> 0 bytes src/gfx/cards/pokemontrader.pal | Bin 8 -> 0 bytes src/gfx/cards/pokemontrader.png | Bin 0 -> 736 bytes src/gfx/cards/poliwag.8x6.png | Bin 764 -> 0 bytes src/gfx/cards/poliwag.pal | Bin 8 -> 0 bytes src/gfx/cards/poliwag.png | Bin 0 -> 799 bytes src/gfx/cards/poliwhirl.8x6.png | Bin 761 -> 0 bytes src/gfx/cards/poliwhirl.pal | Bin 8 -> 0 bytes src/gfx/cards/poliwhirl.png | Bin 0 -> 801 bytes src/gfx/cards/poliwrath.8x6.png | Bin 773 -> 0 bytes src/gfx/cards/poliwrath.pal | Bin 8 -> 0 bytes src/gfx/cards/poliwrath.png | Bin 0 -> 821 bytes src/gfx/cards/ponyta.8x6.png | Bin 668 -> 0 bytes src/gfx/cards/ponyta.pal | Bin 8 -> 0 bytes src/gfx/cards/ponyta.png | Bin 0 -> 718 bytes src/gfx/cards/porygon.8x6.png | Bin 619 -> 0 bytes src/gfx/cards/porygon.pal | 1 - src/gfx/cards/porygon.png | Bin 0 -> 663 bytes src/gfx/cards/potion.8x6.png | Bin 508 -> 0 bytes src/gfx/cards/potion.pal | Bin 8 -> 0 bytes src/gfx/cards/potion.png | Bin 0 -> 554 bytes src/gfx/cards/primeape.8x6.png | Bin 756 -> 0 bytes src/gfx/cards/primeape.pal | Bin 8 -> 0 bytes src/gfx/cards/primeape.png | Bin 0 -> 796 bytes src/gfx/cards/professoroak.8x6.png | Bin 738 -> 0 bytes src/gfx/cards/professoroak.pal | Bin 8 -> 0 bytes src/gfx/cards/professoroak.png | Bin 0 -> 778 bytes src/gfx/cards/psychicenergy.8x6.png | Bin 536 -> 0 bytes src/gfx/cards/psychicenergy.pal | 1 - src/gfx/cards/psychicenergy.png | Bin 0 -> 576 bytes src/gfx/cards/psyduck.8x6.png | Bin 782 -> 0 bytes src/gfx/cards/psyduck.pal | Bin 8 -> 0 bytes src/gfx/cards/psyduck.png | Bin 0 -> 818 bytes src/gfx/cards/raichu1.8x6.png | Bin 771 -> 0 bytes src/gfx/cards/raichu1.pal | Bin 8 -> 0 bytes src/gfx/cards/raichu1.png | Bin 0 -> 815 bytes src/gfx/cards/raichu2.8x6.png | Bin 789 -> 0 bytes src/gfx/cards/raichu2.pal | Bin 8 -> 0 bytes src/gfx/cards/raichu2.png | Bin 0 -> 834 bytes src/gfx/cards/rapidash.8x6.png | Bin 686 -> 0 bytes src/gfx/cards/rapidash.pal | Bin 8 -> 0 bytes src/gfx/cards/rapidash.png | Bin 0 -> 723 bytes src/gfx/cards/raticate.8x6.png | Bin 702 -> 0 bytes src/gfx/cards/raticate.pal | Bin 8 -> 0 bytes src/gfx/cards/raticate.png | Bin 0 -> 739 bytes src/gfx/cards/rattata.8x6.png | Bin 748 -> 0 bytes src/gfx/cards/rattata.pal | Bin 8 -> 0 bytes src/gfx/cards/rattata.png | Bin 0 -> 788 bytes src/gfx/cards/recycle.8x6.png | Bin 554 -> 0 bytes src/gfx/cards/recycle.pal | Bin 8 -> 0 bytes src/gfx/cards/recycle.png | Bin 0 -> 600 bytes src/gfx/cards/revive.8x6.png | Bin 603 -> 0 bytes src/gfx/cards/revive.pal | Bin 8 -> 0 bytes src/gfx/cards/revive.png | Bin 0 -> 644 bytes src/gfx/cards/rhydon.8x6.png | Bin 781 -> 0 bytes src/gfx/cards/rhydon.pal | Bin 8 -> 0 bytes src/gfx/cards/rhydon.png | Bin 0 -> 823 bytes src/gfx/cards/rhyhorn.8x6.png | Bin 725 -> 0 bytes src/gfx/cards/rhyhorn.pal | Bin 8 -> 0 bytes src/gfx/cards/rhyhorn.png | Bin 0 -> 763 bytes src/gfx/cards/sandshrew.8x6.png | Bin 776 -> 0 bytes src/gfx/cards/sandshrew.pal | Bin 8 -> 0 bytes src/gfx/cards/sandshrew.png | Bin 0 -> 816 bytes src/gfx/cards/sandslash.8x6.png | Bin 789 -> 0 bytes src/gfx/cards/sandslash.pal | Bin 8 -> 0 bytes src/gfx/cards/sandslash.png | Bin 0 -> 831 bytes src/gfx/cards/scoopup.8x6.png | Bin 726 -> 0 bytes src/gfx/cards/scoopup.pal | 1 - src/gfx/cards/scoopup.png | Bin 0 -> 766 bytes src/gfx/cards/scyther.8x6.png | Bin 720 -> 0 bytes src/gfx/cards/scyther.pal | Bin 8 -> 0 bytes src/gfx/cards/scyther.png | Bin 0 -> 770 bytes src/gfx/cards/seadra.8x6.png | Bin 789 -> 0 bytes src/gfx/cards/seadra.pal | Bin 8 -> 0 bytes src/gfx/cards/seadra.png | Bin 0 -> 824 bytes src/gfx/cards/seaking.8x6.png | Bin 782 -> 0 bytes src/gfx/cards/seaking.pal | Bin 8 -> 0 bytes src/gfx/cards/seaking.png | Bin 0 -> 817 bytes src/gfx/cards/seel.8x6.png | Bin 759 -> 0 bytes src/gfx/cards/seel.pal | Bin 8 -> 0 bytes src/gfx/cards/seel.png | Bin 0 -> 794 bytes src/gfx/cards/shellder.8x6.png | Bin 693 -> 0 bytes src/gfx/cards/shellder.pal | Bin 8 -> 0 bytes src/gfx/cards/shellder.png | Bin 0 -> 734 bytes src/gfx/cards/slowbro.8x6.png | Bin 757 -> 0 bytes src/gfx/cards/slowbro.pal | 1 - src/gfx/cards/slowbro.png | Bin 0 -> 792 bytes src/gfx/cards/slowpoke1.8x6.png | Bin 721 -> 0 bytes src/gfx/cards/slowpoke1.pal | Bin 8 -> 0 bytes src/gfx/cards/slowpoke1.png | Bin 0 -> 759 bytes src/gfx/cards/slowpoke2.8x6.png | Bin 359 -> 0 bytes src/gfx/cards/slowpoke2.pal | 1 - src/gfx/cards/slowpoke2.png | Bin 0 -> 399 bytes src/gfx/cards/snorlax.8x6.png | Bin 675 -> 0 bytes src/gfx/cards/snorlax.pal | Bin 8 -> 0 bytes src/gfx/cards/snorlax.png | Bin 0 -> 736 bytes src/gfx/cards/spearow.8x6.png | Bin 781 -> 0 bytes src/gfx/cards/spearow.pal | Bin 8 -> 0 bytes src/gfx/cards/spearow.png | Bin 0 -> 809 bytes src/gfx/cards/squirtle.8x6.png | Bin 775 -> 0 bytes src/gfx/cards/squirtle.pal | 1 - src/gfx/cards/squirtle.png | Bin 0 -> 812 bytes src/gfx/cards/starmie.8x6.png | Bin 599 -> 0 bytes src/gfx/cards/starmie.pal | Bin 8 -> 0 bytes src/gfx/cards/starmie.png | Bin 0 -> 646 bytes src/gfx/cards/staryu.8x6.png | Bin 627 -> 0 bytes src/gfx/cards/staryu.pal | Bin 8 -> 0 bytes src/gfx/cards/staryu.png | Bin 0 -> 669 bytes src/gfx/cards/superenergyremoval.8x6.png | Bin 602 -> 0 bytes src/gfx/cards/superenergyremoval.pal | Bin 8 -> 0 bytes src/gfx/cards/superenergyremoval.png | Bin 0 -> 645 bytes src/gfx/cards/superenergyretrieval.8x6.png | Bin 743 -> 0 bytes src/gfx/cards/superenergyretrieval.pal | Bin 8 -> 0 bytes src/gfx/cards/superenergyretrieval.png | Bin 0 -> 786 bytes src/gfx/cards/superpotion.8x6.png | Bin 666 -> 0 bytes src/gfx/cards/superpotion.pal | Bin 8 -> 0 bytes src/gfx/cards/superpotion.png | Bin 0 -> 704 bytes src/gfx/cards/surfingpikachu1.8x6.png | Bin 603 -> 0 bytes src/gfx/cards/surfingpikachu1.pal | Bin 8 -> 0 bytes src/gfx/cards/surfingpikachu1.png | Bin 0 -> 639 bytes src/gfx/cards/surfingpikachu2.8x6.png | Bin 694 -> 0 bytes src/gfx/cards/surfingpikachu2.pal | Bin 8 -> 0 bytes src/gfx/cards/surfingpikachu2.png | Bin 0 -> 727 bytes src/gfx/cards/switch.8x6.png | Bin 544 -> 0 bytes src/gfx/cards/switch.pal | 1 - src/gfx/cards/switch.png | Bin 0 -> 598 bytes src/gfx/cards/tangela1.8x6.png | Bin 808 -> 0 bytes src/gfx/cards/tangela1.pal | Bin 8 -> 0 bytes src/gfx/cards/tangela1.png | Bin 0 -> 856 bytes src/gfx/cards/tangela2.8x6.png | Bin 774 -> 0 bytes src/gfx/cards/tangela2.pal | Bin 8 -> 0 bytes src/gfx/cards/tangela2.png | Bin 0 -> 820 bytes src/gfx/cards/tauros.8x6.png | Bin 774 -> 0 bytes src/gfx/cards/tauros.pal | Bin 8 -> 0 bytes src/gfx/cards/tauros.png | Bin 0 -> 816 bytes src/gfx/cards/tentacool.8x6.png | Bin 763 -> 0 bytes src/gfx/cards/tentacool.pal | Bin 8 -> 0 bytes src/gfx/cards/tentacool.png | Bin 0 -> 802 bytes src/gfx/cards/tentacruel.8x6.png | Bin 755 -> 0 bytes src/gfx/cards/tentacruel.pal | Bin 8 -> 0 bytes src/gfx/cards/tentacruel.png | Bin 0 -> 796 bytes src/gfx/cards/vaporeon1.8x6.png | Bin 697 -> 0 bytes src/gfx/cards/vaporeon1.pal | Bin 8 -> 0 bytes src/gfx/cards/vaporeon1.png | Bin 0 -> 737 bytes src/gfx/cards/vaporeon2.8x6.png | Bin 760 -> 0 bytes src/gfx/cards/vaporeon2.pal | Bin 8 -> 0 bytes src/gfx/cards/vaporeon2.png | Bin 0 -> 811 bytes src/gfx/cards/venomoth.8x6.png | Bin 784 -> 0 bytes src/gfx/cards/venomoth.pal | 1 - src/gfx/cards/venomoth.png | Bin 0 -> 833 bytes src/gfx/cards/venonat.8x6.png | Bin 680 -> 0 bytes src/gfx/cards/venonat.pal | 1 - src/gfx/cards/venonat.png | Bin 0 -> 717 bytes src/gfx/cards/venusaur1.8x6.png | Bin 731 -> 0 bytes src/gfx/cards/venusaur1.pal | Bin 8 -> 0 bytes src/gfx/cards/venusaur1.png | Bin 0 -> 769 bytes src/gfx/cards/venusaur2.8x6.png | Bin 801 -> 0 bytes src/gfx/cards/venusaur2.pal | Bin 8 -> 0 bytes src/gfx/cards/venusaur2.png | Bin 0 -> 848 bytes src/gfx/cards/victreebel.8x6.png | Bin 736 -> 0 bytes src/gfx/cards/victreebel.pal | Bin 8 -> 0 bytes src/gfx/cards/victreebel.png | Bin 0 -> 785 bytes src/gfx/cards/vileplume.8x6.png | Bin 662 -> 0 bytes src/gfx/cards/vileplume.pal | Bin 8 -> 0 bytes src/gfx/cards/vileplume.png | Bin 0 -> 722 bytes src/gfx/cards/voltorb.8x6.png | Bin 583 -> 0 bytes src/gfx/cards/voltorb.pal | Bin 8 -> 0 bytes src/gfx/cards/voltorb.png | Bin 0 -> 640 bytes src/gfx/cards/vulpix.8x6.png | Bin 620 -> 0 bytes src/gfx/cards/vulpix.pal | Bin 8 -> 0 bytes src/gfx/cards/vulpix.png | Bin 0 -> 671 bytes src/gfx/cards/wartortle.8x6.png | Bin 759 -> 0 bytes src/gfx/cards/wartortle.pal | Bin 8 -> 0 bytes src/gfx/cards/wartortle.png | Bin 0 -> 797 bytes src/gfx/cards/waterenergy.8x6.png | Bin 501 -> 0 bytes src/gfx/cards/waterenergy.pal | Bin 8 -> 0 bytes src/gfx/cards/waterenergy.png | Bin 0 -> 539 bytes src/gfx/cards/weedle.8x6.png | Bin 808 -> 0 bytes src/gfx/cards/weedle.pal | 1 - src/gfx/cards/weedle.png | Bin 0 -> 846 bytes src/gfx/cards/weepinbell.8x6.png | Bin 763 -> 0 bytes src/gfx/cards/weepinbell.pal | 1 - src/gfx/cards/weepinbell.png | Bin 0 -> 802 bytes src/gfx/cards/weezing.8x6.png | Bin 736 -> 0 bytes src/gfx/cards/weezing.pal | 1 - src/gfx/cards/weezing.png | Bin 0 -> 773 bytes src/gfx/cards/wigglytuff.8x6.png | Bin 639 -> 0 bytes src/gfx/cards/wigglytuff.pal | 1 - src/gfx/cards/wigglytuff.png | Bin 0 -> 689 bytes src/gfx/cards/zapdos1.8x6.png | Bin 705 -> 0 bytes src/gfx/cards/zapdos1.pal | Bin 8 -> 0 bytes src/gfx/cards/zapdos1.png | Bin 0 -> 757 bytes src/gfx/cards/zapdos2.8x6.png | Bin 662 -> 0 bytes src/gfx/cards/zapdos2.pal | Bin 8 -> 0 bytes src/gfx/cards/zapdos2.png | Bin 0 -> 722 bytes src/gfx/cards/zapdos3.8x6.png | Bin 585 -> 0 bytes src/gfx/cards/zapdos3.pal | Bin 8 -> 0 bytes src/gfx/cards/zapdos3.png | Bin 0 -> 626 bytes src/gfx/cards/zubat.8x6.png | Bin 777 -> 0 bytes src/gfx/cards/zubat.pal | Bin 8 -> 0 bytes src/gfx/cards/zubat.png | Bin 0 -> 818 bytes src/gfx/duel/anims/{51.t10.png => 51.png} | Bin .../{cgb_symbols.t7.png => cgb_symbols.png} | Bin ...sgb_symbols.t7.png => dmg_sgb_symbols.png} | Bin src/gfx/duel/{other.t7.png => other.png} | Bin src/gfx/fonts/full_width/{4.t3.png => 4.png} | Bin ...verworld_map.t15.png => overworld_map.png} | Bin ...challengehall.t3.png => challengehall.png} | Bin ...{clubentrance.t15.png => clubentrance.png} | Bin .../{clublobby.t8.png => clublobby.png} | Bin ...{fightingclub.t13.png => fightingclub.png} | Bin .../{fireclub.t9.png => fireclub.png} | Bin .../{grassclub.t9.png => grassclub.png} | Bin .../{hallofhonor.t7.png => hallofhonor.png} | Bin .../{ishihara.t3.png => ishihara.png} | Bin ...ightningclub.t13.png => lightningclub.png} | Bin ...nlaboratory.t9.png => masonlaboratory.png} | Bin .../{pokemondome.t1.png => pokemondome.png} | Bin ...ntrance.t2.png => pokemondomeentrance.png} | Bin .../{psychicclub.t6.png => psychicclub.png} | Bin .../{rockclub.t4.png => rockclub.png} | Bin .../{scienceclub.t14.png => scienceclub.png} | Bin .../{waterclub.t15.png => waterclub.png} | Bin ...{titlescreen1.t15.png => titlescreen1.png} | Bin ...{titlescreen2.t15.png => titlescreen2.png} | Bin ...{titlescreen3.t12.png => titlescreen3.png} | Bin .../{titlescreen4.t5.png => titlescreen4.png} | Bin .../{titlescreen5.t4.png => titlescreen5.png} | Bin ...{titlescreen6.t12.png => titlescreen6.png} | Bin 723 files changed, 269 insertions(+), 301 deletions(-) rename src/gfx/booster_packs/{colosseum2.t10.png => colosseum2.png} (100%) rename src/gfx/booster_packs/{evolution2.t10.png => evolution2.png} (100%) rename src/gfx/booster_packs/{laboratory2.t10.png => laboratory2.png} (100%) rename src/gfx/booster_packs/{mystery2.t10.png => mystery2.png} (100%) rename src/gfx/cardpop/{cardpop1.t3.png => cardpop1.png} (100%) rename src/gfx/cardpop/{cardpop2.t3.png => cardpop2.png} (100%) rename src/gfx/cardpop/{cardpop3.t3.png => cardpop3.png} (100%) delete mode 100644 src/gfx/cards/abra.8x6.png delete mode 100644 src/gfx/cards/abra.pal create mode 100644 src/gfx/cards/abra.png delete mode 100644 src/gfx/cards/aerodactyl.8x6.png delete mode 100644 src/gfx/cards/aerodactyl.pal create mode 100644 src/gfx/cards/aerodactyl.png delete mode 100644 src/gfx/cards/alakazam.8x6.png delete mode 100644 src/gfx/cards/alakazam.pal create mode 100644 src/gfx/cards/alakazam.png delete mode 100644 src/gfx/cards/arbok.8x6.png delete mode 100644 src/gfx/cards/arbok.pal create mode 100644 src/gfx/cards/arbok.png delete mode 100644 src/gfx/cards/arcanine1.8x6.png delete mode 100644 src/gfx/cards/arcanine1.pal create mode 100644 src/gfx/cards/arcanine1.png delete mode 100644 src/gfx/cards/arcanine2.8x6.png delete mode 100644 src/gfx/cards/arcanine2.pal create mode 100644 src/gfx/cards/arcanine2.png delete mode 100644 src/gfx/cards/articuno1.8x6.png delete mode 100644 src/gfx/cards/articuno1.pal create mode 100644 src/gfx/cards/articuno1.png delete mode 100644 src/gfx/cards/articuno2.8x6.png delete mode 100644 src/gfx/cards/articuno2.pal create mode 100644 src/gfx/cards/articuno2.png delete mode 100644 src/gfx/cards/beedrill.8x6.png delete mode 100644 src/gfx/cards/beedrill.pal create mode 100644 src/gfx/cards/beedrill.png delete mode 100644 src/gfx/cards/bellsprout.8x6.png delete mode 100644 src/gfx/cards/bellsprout.pal create mode 100644 src/gfx/cards/bellsprout.png delete mode 100644 src/gfx/cards/bill.8x6.png delete mode 100644 src/gfx/cards/bill.pal create mode 100644 src/gfx/cards/bill.png delete mode 100644 src/gfx/cards/blastoise.8x6.png delete mode 100644 src/gfx/cards/blastoise.pal create mode 100644 src/gfx/cards/blastoise.png delete mode 100644 src/gfx/cards/bulbasaur.8x6.png delete mode 100644 src/gfx/cards/bulbasaur.pal create mode 100644 src/gfx/cards/bulbasaur.png delete mode 100644 src/gfx/cards/butterfree.8x6.png delete mode 100644 src/gfx/cards/butterfree.pal create mode 100644 src/gfx/cards/butterfree.png delete mode 100644 src/gfx/cards/caterpie.8x6.png delete mode 100644 src/gfx/cards/caterpie.pal create mode 100644 src/gfx/cards/caterpie.png delete mode 100644 src/gfx/cards/chansey.8x6.png delete mode 100644 src/gfx/cards/chansey.pal create mode 100644 src/gfx/cards/chansey.png delete mode 100644 src/gfx/cards/charizard.8x6.png delete mode 100644 src/gfx/cards/charizard.pal create mode 100644 src/gfx/cards/charizard.png delete mode 100644 src/gfx/cards/charmander.8x6.png delete mode 100644 src/gfx/cards/charmander.pal create mode 100644 src/gfx/cards/charmander.png delete mode 100644 src/gfx/cards/charmeleon.8x6.png delete mode 100644 src/gfx/cards/charmeleon.pal create mode 100644 src/gfx/cards/charmeleon.png delete mode 100644 src/gfx/cards/clefable.8x6.png delete mode 100644 src/gfx/cards/clefable.pal create mode 100644 src/gfx/cards/clefable.png delete mode 100644 src/gfx/cards/clefairy.8x6.png delete mode 100644 src/gfx/cards/clefairy.pal create mode 100644 src/gfx/cards/clefairy.png delete mode 100644 src/gfx/cards/clefairydoll.8x6.png delete mode 100644 src/gfx/cards/clefairydoll.pal create mode 100644 src/gfx/cards/clefairydoll.png delete mode 100644 src/gfx/cards/cloyster.8x6.png delete mode 100644 src/gfx/cards/cloyster.pal create mode 100644 src/gfx/cards/cloyster.png delete mode 100644 src/gfx/cards/computersearch.8x6.png delete mode 100644 src/gfx/cards/computersearch.pal create mode 100644 src/gfx/cards/computersearch.png delete mode 100644 src/gfx/cards/cubone.8x6.png delete mode 100644 src/gfx/cards/cubone.pal create mode 100644 src/gfx/cards/cubone.png delete mode 100644 src/gfx/cards/defender.8x6.png delete mode 100644 src/gfx/cards/defender.pal create mode 100644 src/gfx/cards/defender.png delete mode 100644 src/gfx/cards/devolutionspray.8x6.png delete mode 100644 src/gfx/cards/devolutionspray.pal create mode 100644 src/gfx/cards/devolutionspray.png delete mode 100644 src/gfx/cards/dewgong.8x6.png delete mode 100644 src/gfx/cards/dewgong.pal create mode 100644 src/gfx/cards/dewgong.png delete mode 100644 src/gfx/cards/diglett.8x6.png delete mode 100644 src/gfx/cards/diglett.pal create mode 100644 src/gfx/cards/diglett.png delete mode 100644 src/gfx/cards/ditto.8x6.png delete mode 100644 src/gfx/cards/ditto.pal create mode 100644 src/gfx/cards/ditto.png delete mode 100644 src/gfx/cards/dodrio.8x6.png delete mode 100644 src/gfx/cards/dodrio.pal create mode 100644 src/gfx/cards/dodrio.png delete mode 100644 src/gfx/cards/doduo.8x6.png delete mode 100644 src/gfx/cards/doduo.pal create mode 100644 src/gfx/cards/doduo.png delete mode 100644 src/gfx/cards/doublecolorlessenergy.8x6.png delete mode 100644 src/gfx/cards/doublecolorlessenergy.pal create mode 100644 src/gfx/cards/doublecolorlessenergy.png delete mode 100644 src/gfx/cards/dragonair.8x6.png delete mode 100644 src/gfx/cards/dragonair.pal create mode 100644 src/gfx/cards/dragonair.png delete mode 100644 src/gfx/cards/dragonite1.8x6.png delete mode 100644 src/gfx/cards/dragonite1.pal create mode 100644 src/gfx/cards/dragonite1.png delete mode 100644 src/gfx/cards/dragonite2.8x6.png delete mode 100644 src/gfx/cards/dragonite2.pal create mode 100644 src/gfx/cards/dragonite2.png delete mode 100644 src/gfx/cards/dratini.8x6.png delete mode 100644 src/gfx/cards/dratini.pal create mode 100644 src/gfx/cards/dratini.png delete mode 100644 src/gfx/cards/drowzee.8x6.png delete mode 100644 src/gfx/cards/drowzee.pal create mode 100644 src/gfx/cards/drowzee.png delete mode 100644 src/gfx/cards/dugtrio.8x6.png delete mode 100644 src/gfx/cards/dugtrio.pal create mode 100644 src/gfx/cards/dugtrio.png delete mode 100644 src/gfx/cards/eevee.8x6.png delete mode 100644 src/gfx/cards/eevee.pal create mode 100644 src/gfx/cards/eevee.png delete mode 100644 src/gfx/cards/ekans.8x6.png delete mode 100644 src/gfx/cards/ekans.pal create mode 100644 src/gfx/cards/ekans.png delete mode 100644 src/gfx/cards/electabuzz1.8x6.png delete mode 100644 src/gfx/cards/electabuzz1.pal create mode 100644 src/gfx/cards/electabuzz1.png delete mode 100644 src/gfx/cards/electabuzz2.8x6.png delete mode 100644 src/gfx/cards/electabuzz2.pal create mode 100644 src/gfx/cards/electabuzz2.png delete mode 100644 src/gfx/cards/electrode1.8x6.png delete mode 100644 src/gfx/cards/electrode1.pal create mode 100644 src/gfx/cards/electrode1.png delete mode 100644 src/gfx/cards/electrode2.8x6.png delete mode 100644 src/gfx/cards/electrode2.pal create mode 100644 src/gfx/cards/electrode2.png delete mode 100644 src/gfx/cards/energyremoval.8x6.png delete mode 100644 src/gfx/cards/energyremoval.pal create mode 100644 src/gfx/cards/energyremoval.png delete mode 100644 src/gfx/cards/energyretrieval.8x6.png delete mode 100644 src/gfx/cards/energyretrieval.pal create mode 100644 src/gfx/cards/energyretrieval.png delete mode 100644 src/gfx/cards/energysearch.8x6.png delete mode 100644 src/gfx/cards/energysearch.pal create mode 100644 src/gfx/cards/energysearch.png delete mode 100644 src/gfx/cards/exeggcute.8x6.png delete mode 100644 src/gfx/cards/exeggcute.pal create mode 100644 src/gfx/cards/exeggcute.png delete mode 100644 src/gfx/cards/exeggutor.8x6.png delete mode 100644 src/gfx/cards/exeggutor.pal create mode 100644 src/gfx/cards/exeggutor.png delete mode 100644 src/gfx/cards/farfetchd.8x6.png delete mode 100644 src/gfx/cards/farfetchd.pal create mode 100644 src/gfx/cards/farfetchd.png delete mode 100644 src/gfx/cards/fearow.8x6.png delete mode 100644 src/gfx/cards/fearow.pal create mode 100644 src/gfx/cards/fearow.png delete mode 100644 src/gfx/cards/fightingenergy.8x6.png delete mode 100644 src/gfx/cards/fightingenergy.pal create mode 100644 src/gfx/cards/fightingenergy.png delete mode 100644 src/gfx/cards/fireenergy.8x6.png delete mode 100644 src/gfx/cards/fireenergy.pal create mode 100644 src/gfx/cards/fireenergy.png delete mode 100644 src/gfx/cards/flareon1.8x6.png delete mode 100644 src/gfx/cards/flareon1.pal create mode 100644 src/gfx/cards/flareon1.png delete mode 100644 src/gfx/cards/flareon2.8x6.png delete mode 100644 src/gfx/cards/flareon2.pal create mode 100644 src/gfx/cards/flareon2.png delete mode 100644 src/gfx/cards/flyingpikachu.8x6.png delete mode 100644 src/gfx/cards/flyingpikachu.pal create mode 100644 src/gfx/cards/flyingpikachu.png delete mode 100644 src/gfx/cards/fullheal.8x6.png delete mode 100644 src/gfx/cards/fullheal.pal create mode 100644 src/gfx/cards/fullheal.png delete mode 100644 src/gfx/cards/gambler.8x6.png delete mode 100644 src/gfx/cards/gambler.pal create mode 100644 src/gfx/cards/gambler.png delete mode 100644 src/gfx/cards/gastly1.8x6.png delete mode 100644 src/gfx/cards/gastly1.pal create mode 100644 src/gfx/cards/gastly1.png delete mode 100644 src/gfx/cards/gastly2.8x6.png delete mode 100644 src/gfx/cards/gastly2.pal create mode 100644 src/gfx/cards/gastly2.png delete mode 100644 src/gfx/cards/gengar.8x6.png delete mode 100644 src/gfx/cards/gengar.pal create mode 100644 src/gfx/cards/gengar.png delete mode 100644 src/gfx/cards/geodude.8x6.png delete mode 100644 src/gfx/cards/geodude.pal create mode 100644 src/gfx/cards/geodude.png delete mode 100644 src/gfx/cards/gloom.8x6.png delete mode 100644 src/gfx/cards/gloom.pal create mode 100644 src/gfx/cards/gloom.png delete mode 100644 src/gfx/cards/golbat.8x6.png delete mode 100644 src/gfx/cards/golbat.pal create mode 100644 src/gfx/cards/golbat.png delete mode 100644 src/gfx/cards/goldeen.8x6.png delete mode 100644 src/gfx/cards/goldeen.pal create mode 100644 src/gfx/cards/goldeen.png delete mode 100644 src/gfx/cards/golduck.8x6.png delete mode 100644 src/gfx/cards/golduck.pal create mode 100644 src/gfx/cards/golduck.png delete mode 100644 src/gfx/cards/golem.8x6.png delete mode 100644 src/gfx/cards/golem.pal create mode 100644 src/gfx/cards/golem.png delete mode 100644 src/gfx/cards/grassenergy.8x6.png delete mode 100644 src/gfx/cards/grassenergy.pal create mode 100644 src/gfx/cards/grassenergy.png delete mode 100644 src/gfx/cards/graveler.8x6.png delete mode 100644 src/gfx/cards/graveler.pal create mode 100644 src/gfx/cards/graveler.png delete mode 100644 src/gfx/cards/grimer.8x6.png delete mode 100644 src/gfx/cards/grimer.pal create mode 100644 src/gfx/cards/grimer.png delete mode 100644 src/gfx/cards/growlithe.8x6.png delete mode 100644 src/gfx/cards/growlithe.pal create mode 100644 src/gfx/cards/growlithe.png delete mode 100644 src/gfx/cards/gustofwind.8x6.png delete mode 100644 src/gfx/cards/gustofwind.pal create mode 100644 src/gfx/cards/gustofwind.png delete mode 100644 src/gfx/cards/gyarados.8x6.png delete mode 100644 src/gfx/cards/gyarados.pal create mode 100644 src/gfx/cards/gyarados.png delete mode 100644 src/gfx/cards/haunter1.8x6.png delete mode 100644 src/gfx/cards/haunter1.pal create mode 100644 src/gfx/cards/haunter1.png delete mode 100644 src/gfx/cards/haunter2.8x6.png delete mode 100644 src/gfx/cards/haunter2.pal create mode 100644 src/gfx/cards/haunter2.png delete mode 100644 src/gfx/cards/hitmonchan.8x6.png delete mode 100644 src/gfx/cards/hitmonchan.pal create mode 100644 src/gfx/cards/hitmonchan.png delete mode 100644 src/gfx/cards/hitmonlee.8x6.png delete mode 100644 src/gfx/cards/hitmonlee.pal create mode 100644 src/gfx/cards/hitmonlee.png delete mode 100644 src/gfx/cards/horsea.8x6.png delete mode 100644 src/gfx/cards/horsea.pal create mode 100644 src/gfx/cards/horsea.png delete mode 100644 src/gfx/cards/hypno.8x6.png delete mode 100644 src/gfx/cards/hypno.pal create mode 100644 src/gfx/cards/hypno.png delete mode 100644 src/gfx/cards/imakuni.8x6.png delete mode 100644 src/gfx/cards/imakuni.pal create mode 100644 src/gfx/cards/imakuni.png delete mode 100644 src/gfx/cards/imposterprofessoroak.8x6.png delete mode 100644 src/gfx/cards/imposterprofessoroak.pal create mode 100644 src/gfx/cards/imposterprofessoroak.png delete mode 100644 src/gfx/cards/itemfinder.8x6.png delete mode 100644 src/gfx/cards/itemfinder.pal create mode 100644 src/gfx/cards/itemfinder.png delete mode 100644 src/gfx/cards/ivysaur.8x6.png delete mode 100644 src/gfx/cards/ivysaur.pal create mode 100644 src/gfx/cards/ivysaur.png delete mode 100644 src/gfx/cards/jigglypuff1.8x6.png delete mode 100644 src/gfx/cards/jigglypuff1.pal create mode 100644 src/gfx/cards/jigglypuff1.png delete mode 100644 src/gfx/cards/jigglypuff2.8x6.png delete mode 100644 src/gfx/cards/jigglypuff2.pal create mode 100644 src/gfx/cards/jigglypuff2.png delete mode 100644 src/gfx/cards/jigglypuff3.8x6.png delete mode 100644 src/gfx/cards/jigglypuff3.pal create mode 100644 src/gfx/cards/jigglypuff3.png delete mode 100644 src/gfx/cards/jolteon1.8x6.png delete mode 100644 src/gfx/cards/jolteon1.pal create mode 100644 src/gfx/cards/jolteon1.png delete mode 100644 src/gfx/cards/jolteon2.8x6.png delete mode 100644 src/gfx/cards/jolteon2.pal create mode 100644 src/gfx/cards/jolteon2.png delete mode 100644 src/gfx/cards/jynx.8x6.png delete mode 100644 src/gfx/cards/jynx.pal create mode 100644 src/gfx/cards/jynx.png delete mode 100644 src/gfx/cards/kabuto.8x6.png delete mode 100644 src/gfx/cards/kabuto.pal create mode 100644 src/gfx/cards/kabuto.png delete mode 100644 src/gfx/cards/kabutops.8x6.png delete mode 100644 src/gfx/cards/kabutops.pal create mode 100644 src/gfx/cards/kabutops.png delete mode 100644 src/gfx/cards/kadabra.8x6.png delete mode 100644 src/gfx/cards/kadabra.pal create mode 100644 src/gfx/cards/kadabra.png delete mode 100644 src/gfx/cards/kakuna.8x6.png delete mode 100644 src/gfx/cards/kakuna.pal create mode 100644 src/gfx/cards/kakuna.png delete mode 100644 src/gfx/cards/kangaskhan.8x6.png delete mode 100644 src/gfx/cards/kangaskhan.pal create mode 100644 src/gfx/cards/kangaskhan.png delete mode 100644 src/gfx/cards/kingler.8x6.png delete mode 100644 src/gfx/cards/kingler.pal create mode 100644 src/gfx/cards/kingler.png delete mode 100644 src/gfx/cards/koffing.8x6.png delete mode 100644 src/gfx/cards/koffing.pal create mode 100644 src/gfx/cards/koffing.png delete mode 100644 src/gfx/cards/krabby.8x6.png delete mode 100644 src/gfx/cards/krabby.pal create mode 100644 src/gfx/cards/krabby.png delete mode 100644 src/gfx/cards/lapras.8x6.png delete mode 100644 src/gfx/cards/lapras.pal create mode 100644 src/gfx/cards/lapras.png delete mode 100644 src/gfx/cards/lass.8x6.png delete mode 100644 src/gfx/cards/lass.pal create mode 100644 src/gfx/cards/lass.png delete mode 100644 src/gfx/cards/lickitung.8x6.png delete mode 100644 src/gfx/cards/lickitung.pal create mode 100644 src/gfx/cards/lickitung.png delete mode 100644 src/gfx/cards/lightningenergy.8x6.png delete mode 100644 src/gfx/cards/lightningenergy.pal create mode 100644 src/gfx/cards/lightningenergy.png delete mode 100644 src/gfx/cards/machamp.8x6.png delete mode 100644 src/gfx/cards/machamp.pal create mode 100644 src/gfx/cards/machamp.png delete mode 100644 src/gfx/cards/machoke.8x6.png delete mode 100644 src/gfx/cards/machoke.pal create mode 100644 src/gfx/cards/machoke.png delete mode 100644 src/gfx/cards/machop.8x6.png delete mode 100644 src/gfx/cards/machop.pal create mode 100644 src/gfx/cards/machop.png delete mode 100644 src/gfx/cards/magikarp.8x6.png delete mode 100644 src/gfx/cards/magikarp.pal create mode 100644 src/gfx/cards/magikarp.png delete mode 100644 src/gfx/cards/magmar1.8x6.png delete mode 100644 src/gfx/cards/magmar1.pal create mode 100644 src/gfx/cards/magmar1.png delete mode 100644 src/gfx/cards/magmar2.8x6.png delete mode 100644 src/gfx/cards/magmar2.pal create mode 100644 src/gfx/cards/magmar2.png delete mode 100644 src/gfx/cards/magnemite1.8x6.png delete mode 100644 src/gfx/cards/magnemite1.pal create mode 100644 src/gfx/cards/magnemite1.png delete mode 100644 src/gfx/cards/magnemite2.8x6.png delete mode 100644 src/gfx/cards/magnemite2.pal create mode 100644 src/gfx/cards/magnemite2.png delete mode 100644 src/gfx/cards/magneton1.8x6.png delete mode 100644 src/gfx/cards/magneton1.pal create mode 100644 src/gfx/cards/magneton1.png delete mode 100644 src/gfx/cards/magneton2.8x6.png delete mode 100644 src/gfx/cards/magneton2.pal create mode 100644 src/gfx/cards/magneton2.png delete mode 100644 src/gfx/cards/maintenance.8x6.png delete mode 100644 src/gfx/cards/maintenance.pal create mode 100644 src/gfx/cards/maintenance.png delete mode 100644 src/gfx/cards/mankey.8x6.png delete mode 100644 src/gfx/cards/mankey.pal create mode 100644 src/gfx/cards/mankey.png delete mode 100644 src/gfx/cards/marowak1.8x6.png delete mode 100644 src/gfx/cards/marowak1.pal create mode 100644 src/gfx/cards/marowak1.png delete mode 100644 src/gfx/cards/marowak2.8x6.png delete mode 100644 src/gfx/cards/marowak2.pal create mode 100644 src/gfx/cards/marowak2.png delete mode 100644 src/gfx/cards/meowth1.8x6.png delete mode 100644 src/gfx/cards/meowth1.pal create mode 100644 src/gfx/cards/meowth1.png delete mode 100644 src/gfx/cards/meowth2.8x6.png delete mode 100644 src/gfx/cards/meowth2.pal create mode 100644 src/gfx/cards/meowth2.png delete mode 100644 src/gfx/cards/metapod.8x6.png delete mode 100644 src/gfx/cards/metapod.pal create mode 100644 src/gfx/cards/metapod.png delete mode 100644 src/gfx/cards/mew1.8x6.png delete mode 100644 src/gfx/cards/mew1.pal create mode 100644 src/gfx/cards/mew1.png delete mode 100644 src/gfx/cards/mew2.8x6.png delete mode 100644 src/gfx/cards/mew2.pal create mode 100644 src/gfx/cards/mew2.png delete mode 100644 src/gfx/cards/mew3.8x6.png delete mode 100644 src/gfx/cards/mew3.pal create mode 100644 src/gfx/cards/mew3.png delete mode 100644 src/gfx/cards/mewtwo1.8x6.png delete mode 100644 src/gfx/cards/mewtwo1.pal create mode 100644 src/gfx/cards/mewtwo1.png delete mode 100644 src/gfx/cards/mewtwo2.8x6.png delete mode 100644 src/gfx/cards/mewtwo2.pal create mode 100644 src/gfx/cards/mewtwo2.png delete mode 100644 src/gfx/cards/mewtwo3.8x6.png delete mode 100644 src/gfx/cards/mewtwo3.pal create mode 100644 src/gfx/cards/mewtwo3.png delete mode 100644 src/gfx/cards/moltres1.8x6.png delete mode 100644 src/gfx/cards/moltres1.pal create mode 100644 src/gfx/cards/moltres1.png delete mode 100644 src/gfx/cards/moltres2.8x6.png delete mode 100644 src/gfx/cards/moltres2.pal create mode 100644 src/gfx/cards/moltres2.png delete mode 100644 src/gfx/cards/mrfuji.8x6.png delete mode 100644 src/gfx/cards/mrfuji.pal create mode 100644 src/gfx/cards/mrfuji.png delete mode 100644 src/gfx/cards/mrmime.8x6.png delete mode 100644 src/gfx/cards/mrmime.pal create mode 100644 src/gfx/cards/mrmime.png delete mode 100644 src/gfx/cards/muk.8x6.png delete mode 100644 src/gfx/cards/muk.pal create mode 100644 src/gfx/cards/muk.png delete mode 100644 src/gfx/cards/mysteriousfossil.8x6.png delete mode 100644 src/gfx/cards/mysteriousfossil.pal create mode 100644 src/gfx/cards/mysteriousfossil.png delete mode 100644 src/gfx/cards/nidoking.8x6.png delete mode 100644 src/gfx/cards/nidoking.pal create mode 100644 src/gfx/cards/nidoking.png delete mode 100644 src/gfx/cards/nidoqueen.8x6.png delete mode 100644 src/gfx/cards/nidoqueen.pal create mode 100644 src/gfx/cards/nidoqueen.png delete mode 100644 src/gfx/cards/nidoranf.8x6.png delete mode 100644 src/gfx/cards/nidoranf.pal create mode 100644 src/gfx/cards/nidoranf.png delete mode 100644 src/gfx/cards/nidoranm.8x6.png delete mode 100644 src/gfx/cards/nidoranm.pal create mode 100644 src/gfx/cards/nidoranm.png delete mode 100644 src/gfx/cards/nidorina.8x6.png delete mode 100644 src/gfx/cards/nidorina.pal create mode 100644 src/gfx/cards/nidorina.png delete mode 100644 src/gfx/cards/nidorino.8x6.png delete mode 100644 src/gfx/cards/nidorino.pal create mode 100644 src/gfx/cards/nidorino.png delete mode 100644 src/gfx/cards/ninetails1.8x6.png delete mode 100644 src/gfx/cards/ninetails1.pal create mode 100644 src/gfx/cards/ninetails1.png delete mode 100644 src/gfx/cards/ninetails2.8x6.png delete mode 100644 src/gfx/cards/ninetails2.pal create mode 100644 src/gfx/cards/ninetails2.png delete mode 100644 src/gfx/cards/oddish.8x6.png delete mode 100644 src/gfx/cards/oddish.pal create mode 100644 src/gfx/cards/oddish.png delete mode 100644 src/gfx/cards/omanyte.8x6.png delete mode 100644 src/gfx/cards/omanyte.pal create mode 100644 src/gfx/cards/omanyte.png delete mode 100644 src/gfx/cards/omastar.8x6.png delete mode 100644 src/gfx/cards/omastar.pal create mode 100644 src/gfx/cards/omastar.png delete mode 100644 src/gfx/cards/onix.8x6.png delete mode 100644 src/gfx/cards/onix.pal create mode 100644 src/gfx/cards/onix.png delete mode 100644 src/gfx/cards/paras.8x6.png delete mode 100644 src/gfx/cards/paras.pal create mode 100644 src/gfx/cards/paras.png delete mode 100644 src/gfx/cards/parasect.8x6.png delete mode 100644 src/gfx/cards/parasect.pal create mode 100644 src/gfx/cards/parasect.png delete mode 100644 src/gfx/cards/persian.8x6.png delete mode 100644 src/gfx/cards/persian.pal create mode 100644 src/gfx/cards/persian.png delete mode 100644 src/gfx/cards/pidgeot1.8x6.png delete mode 100644 src/gfx/cards/pidgeot1.pal create mode 100644 src/gfx/cards/pidgeot1.png delete mode 100644 src/gfx/cards/pidgeot2.8x6.png delete mode 100644 src/gfx/cards/pidgeot2.pal create mode 100644 src/gfx/cards/pidgeot2.png delete mode 100644 src/gfx/cards/pidgeotto.8x6.png delete mode 100644 src/gfx/cards/pidgeotto.pal create mode 100644 src/gfx/cards/pidgeotto.png delete mode 100644 src/gfx/cards/pidgey.8x6.png delete mode 100644 src/gfx/cards/pidgey.pal create mode 100644 src/gfx/cards/pidgey.png delete mode 100644 src/gfx/cards/pikachu1.8x6.png delete mode 100644 src/gfx/cards/pikachu1.pal create mode 100644 src/gfx/cards/pikachu1.png delete mode 100644 src/gfx/cards/pikachu2.8x6.png delete mode 100644 src/gfx/cards/pikachu2.pal create mode 100644 src/gfx/cards/pikachu2.png delete mode 100644 src/gfx/cards/pikachu3.8x6.png delete mode 100644 src/gfx/cards/pikachu3.pal create mode 100644 src/gfx/cards/pikachu3.png delete mode 100644 src/gfx/cards/pikachu4.8x6.png delete mode 100644 src/gfx/cards/pikachu4.pal create mode 100644 src/gfx/cards/pikachu4.png delete mode 100644 src/gfx/cards/pinsir.8x6.png delete mode 100644 src/gfx/cards/pinsir.pal create mode 100644 src/gfx/cards/pinsir.png delete mode 100644 src/gfx/cards/pluspower.8x6.png delete mode 100644 src/gfx/cards/pluspower.pal create mode 100644 src/gfx/cards/pluspower.png delete mode 100644 src/gfx/cards/pokeball.8x6.png delete mode 100644 src/gfx/cards/pokeball.pal create mode 100644 src/gfx/cards/pokeball.png delete mode 100644 src/gfx/cards/pokedex.8x6.png delete mode 100644 src/gfx/cards/pokedex.pal create mode 100644 src/gfx/cards/pokedex.png delete mode 100644 src/gfx/cards/pokemonbreeder.8x6.png delete mode 100644 src/gfx/cards/pokemonbreeder.pal create mode 100644 src/gfx/cards/pokemonbreeder.png delete mode 100644 src/gfx/cards/pokemoncenter.8x6.png delete mode 100644 src/gfx/cards/pokemoncenter.pal create mode 100644 src/gfx/cards/pokemoncenter.png delete mode 100644 src/gfx/cards/pokemonflute.8x6.png delete mode 100644 src/gfx/cards/pokemonflute.pal create mode 100644 src/gfx/cards/pokemonflute.png delete mode 100644 src/gfx/cards/pokemontrader.8x6.png delete mode 100644 src/gfx/cards/pokemontrader.pal create mode 100644 src/gfx/cards/pokemontrader.png delete mode 100644 src/gfx/cards/poliwag.8x6.png delete mode 100644 src/gfx/cards/poliwag.pal create mode 100644 src/gfx/cards/poliwag.png delete mode 100644 src/gfx/cards/poliwhirl.8x6.png delete mode 100644 src/gfx/cards/poliwhirl.pal create mode 100644 src/gfx/cards/poliwhirl.png delete mode 100644 src/gfx/cards/poliwrath.8x6.png delete mode 100644 src/gfx/cards/poliwrath.pal create mode 100644 src/gfx/cards/poliwrath.png delete mode 100644 src/gfx/cards/ponyta.8x6.png delete mode 100644 src/gfx/cards/ponyta.pal create mode 100644 src/gfx/cards/ponyta.png delete mode 100644 src/gfx/cards/porygon.8x6.png delete mode 100644 src/gfx/cards/porygon.pal create mode 100644 src/gfx/cards/porygon.png delete mode 100644 src/gfx/cards/potion.8x6.png delete mode 100644 src/gfx/cards/potion.pal create mode 100644 src/gfx/cards/potion.png delete mode 100644 src/gfx/cards/primeape.8x6.png delete mode 100644 src/gfx/cards/primeape.pal create mode 100644 src/gfx/cards/primeape.png delete mode 100644 src/gfx/cards/professoroak.8x6.png delete mode 100644 src/gfx/cards/professoroak.pal create mode 100644 src/gfx/cards/professoroak.png delete mode 100644 src/gfx/cards/psychicenergy.8x6.png delete mode 100644 src/gfx/cards/psychicenergy.pal create mode 100644 src/gfx/cards/psychicenergy.png delete mode 100644 src/gfx/cards/psyduck.8x6.png delete mode 100644 src/gfx/cards/psyduck.pal create mode 100644 src/gfx/cards/psyduck.png delete mode 100644 src/gfx/cards/raichu1.8x6.png delete mode 100644 src/gfx/cards/raichu1.pal create mode 100644 src/gfx/cards/raichu1.png delete mode 100644 src/gfx/cards/raichu2.8x6.png delete mode 100644 src/gfx/cards/raichu2.pal create mode 100644 src/gfx/cards/raichu2.png delete mode 100644 src/gfx/cards/rapidash.8x6.png delete mode 100644 src/gfx/cards/rapidash.pal create mode 100644 src/gfx/cards/rapidash.png delete mode 100644 src/gfx/cards/raticate.8x6.png delete mode 100644 src/gfx/cards/raticate.pal create mode 100644 src/gfx/cards/raticate.png delete mode 100644 src/gfx/cards/rattata.8x6.png delete mode 100644 src/gfx/cards/rattata.pal create mode 100644 src/gfx/cards/rattata.png delete mode 100644 src/gfx/cards/recycle.8x6.png delete mode 100644 src/gfx/cards/recycle.pal create mode 100644 src/gfx/cards/recycle.png delete mode 100644 src/gfx/cards/revive.8x6.png delete mode 100644 src/gfx/cards/revive.pal create mode 100644 src/gfx/cards/revive.png delete mode 100644 src/gfx/cards/rhydon.8x6.png delete mode 100644 src/gfx/cards/rhydon.pal create mode 100644 src/gfx/cards/rhydon.png delete mode 100644 src/gfx/cards/rhyhorn.8x6.png delete mode 100644 src/gfx/cards/rhyhorn.pal create mode 100644 src/gfx/cards/rhyhorn.png delete mode 100644 src/gfx/cards/sandshrew.8x6.png delete mode 100644 src/gfx/cards/sandshrew.pal create mode 100644 src/gfx/cards/sandshrew.png delete mode 100644 src/gfx/cards/sandslash.8x6.png delete mode 100644 src/gfx/cards/sandslash.pal create mode 100644 src/gfx/cards/sandslash.png delete mode 100644 src/gfx/cards/scoopup.8x6.png delete mode 100644 src/gfx/cards/scoopup.pal create mode 100644 src/gfx/cards/scoopup.png delete mode 100644 src/gfx/cards/scyther.8x6.png delete mode 100644 src/gfx/cards/scyther.pal create mode 100644 src/gfx/cards/scyther.png delete mode 100644 src/gfx/cards/seadra.8x6.png delete mode 100644 src/gfx/cards/seadra.pal create mode 100644 src/gfx/cards/seadra.png delete mode 100644 src/gfx/cards/seaking.8x6.png delete mode 100644 src/gfx/cards/seaking.pal create mode 100644 src/gfx/cards/seaking.png delete mode 100644 src/gfx/cards/seel.8x6.png delete mode 100644 src/gfx/cards/seel.pal create mode 100644 src/gfx/cards/seel.png delete mode 100644 src/gfx/cards/shellder.8x6.png delete mode 100644 src/gfx/cards/shellder.pal create mode 100644 src/gfx/cards/shellder.png delete mode 100644 src/gfx/cards/slowbro.8x6.png delete mode 100644 src/gfx/cards/slowbro.pal create mode 100644 src/gfx/cards/slowbro.png delete mode 100644 src/gfx/cards/slowpoke1.8x6.png delete mode 100644 src/gfx/cards/slowpoke1.pal create mode 100644 src/gfx/cards/slowpoke1.png delete mode 100644 src/gfx/cards/slowpoke2.8x6.png delete mode 100644 src/gfx/cards/slowpoke2.pal create mode 100644 src/gfx/cards/slowpoke2.png delete mode 100644 src/gfx/cards/snorlax.8x6.png delete mode 100644 src/gfx/cards/snorlax.pal create mode 100644 src/gfx/cards/snorlax.png delete mode 100644 src/gfx/cards/spearow.8x6.png delete mode 100644 src/gfx/cards/spearow.pal create mode 100644 src/gfx/cards/spearow.png delete mode 100644 src/gfx/cards/squirtle.8x6.png delete mode 100644 src/gfx/cards/squirtle.pal create mode 100644 src/gfx/cards/squirtle.png delete mode 100644 src/gfx/cards/starmie.8x6.png delete mode 100644 src/gfx/cards/starmie.pal create mode 100644 src/gfx/cards/starmie.png delete mode 100644 src/gfx/cards/staryu.8x6.png delete mode 100644 src/gfx/cards/staryu.pal create mode 100644 src/gfx/cards/staryu.png delete mode 100644 src/gfx/cards/superenergyremoval.8x6.png delete mode 100644 src/gfx/cards/superenergyremoval.pal create mode 100644 src/gfx/cards/superenergyremoval.png delete mode 100644 src/gfx/cards/superenergyretrieval.8x6.png delete mode 100644 src/gfx/cards/superenergyretrieval.pal create mode 100644 src/gfx/cards/superenergyretrieval.png delete mode 100644 src/gfx/cards/superpotion.8x6.png delete mode 100644 src/gfx/cards/superpotion.pal create mode 100644 src/gfx/cards/superpotion.png delete mode 100644 src/gfx/cards/surfingpikachu1.8x6.png delete mode 100644 src/gfx/cards/surfingpikachu1.pal create mode 100644 src/gfx/cards/surfingpikachu1.png delete mode 100644 src/gfx/cards/surfingpikachu2.8x6.png delete mode 100644 src/gfx/cards/surfingpikachu2.pal create mode 100644 src/gfx/cards/surfingpikachu2.png delete mode 100644 src/gfx/cards/switch.8x6.png delete mode 100644 src/gfx/cards/switch.pal create mode 100644 src/gfx/cards/switch.png delete mode 100644 src/gfx/cards/tangela1.8x6.png delete mode 100644 src/gfx/cards/tangela1.pal create mode 100644 src/gfx/cards/tangela1.png delete mode 100644 src/gfx/cards/tangela2.8x6.png delete mode 100644 src/gfx/cards/tangela2.pal create mode 100644 src/gfx/cards/tangela2.png delete mode 100644 src/gfx/cards/tauros.8x6.png delete mode 100644 src/gfx/cards/tauros.pal create mode 100644 src/gfx/cards/tauros.png delete mode 100644 src/gfx/cards/tentacool.8x6.png delete mode 100644 src/gfx/cards/tentacool.pal create mode 100644 src/gfx/cards/tentacool.png delete mode 100644 src/gfx/cards/tentacruel.8x6.png delete mode 100644 src/gfx/cards/tentacruel.pal create mode 100644 src/gfx/cards/tentacruel.png delete mode 100644 src/gfx/cards/vaporeon1.8x6.png delete mode 100644 src/gfx/cards/vaporeon1.pal create mode 100644 src/gfx/cards/vaporeon1.png delete mode 100644 src/gfx/cards/vaporeon2.8x6.png delete mode 100644 src/gfx/cards/vaporeon2.pal create mode 100644 src/gfx/cards/vaporeon2.png delete mode 100644 src/gfx/cards/venomoth.8x6.png delete mode 100644 src/gfx/cards/venomoth.pal create mode 100644 src/gfx/cards/venomoth.png delete mode 100644 src/gfx/cards/venonat.8x6.png delete mode 100644 src/gfx/cards/venonat.pal create mode 100644 src/gfx/cards/venonat.png delete mode 100644 src/gfx/cards/venusaur1.8x6.png delete mode 100644 src/gfx/cards/venusaur1.pal create mode 100644 src/gfx/cards/venusaur1.png delete mode 100644 src/gfx/cards/venusaur2.8x6.png delete mode 100644 src/gfx/cards/venusaur2.pal create mode 100644 src/gfx/cards/venusaur2.png delete mode 100644 src/gfx/cards/victreebel.8x6.png delete mode 100644 src/gfx/cards/victreebel.pal create mode 100644 src/gfx/cards/victreebel.png delete mode 100644 src/gfx/cards/vileplume.8x6.png delete mode 100644 src/gfx/cards/vileplume.pal create mode 100644 src/gfx/cards/vileplume.png delete mode 100644 src/gfx/cards/voltorb.8x6.png delete mode 100644 src/gfx/cards/voltorb.pal create mode 100644 src/gfx/cards/voltorb.png delete mode 100644 src/gfx/cards/vulpix.8x6.png delete mode 100644 src/gfx/cards/vulpix.pal create mode 100644 src/gfx/cards/vulpix.png delete mode 100644 src/gfx/cards/wartortle.8x6.png delete mode 100644 src/gfx/cards/wartortle.pal create mode 100644 src/gfx/cards/wartortle.png delete mode 100644 src/gfx/cards/waterenergy.8x6.png delete mode 100644 src/gfx/cards/waterenergy.pal create mode 100644 src/gfx/cards/waterenergy.png delete mode 100644 src/gfx/cards/weedle.8x6.png delete mode 100644 src/gfx/cards/weedle.pal create mode 100644 src/gfx/cards/weedle.png delete mode 100644 src/gfx/cards/weepinbell.8x6.png delete mode 100644 src/gfx/cards/weepinbell.pal create mode 100644 src/gfx/cards/weepinbell.png delete mode 100644 src/gfx/cards/weezing.8x6.png delete mode 100644 src/gfx/cards/weezing.pal create mode 100644 src/gfx/cards/weezing.png delete mode 100644 src/gfx/cards/wigglytuff.8x6.png delete mode 100644 src/gfx/cards/wigglytuff.pal create mode 100644 src/gfx/cards/wigglytuff.png delete mode 100644 src/gfx/cards/zapdos1.8x6.png delete mode 100644 src/gfx/cards/zapdos1.pal create mode 100644 src/gfx/cards/zapdos1.png delete mode 100644 src/gfx/cards/zapdos2.8x6.png delete mode 100644 src/gfx/cards/zapdos2.pal create mode 100644 src/gfx/cards/zapdos2.png delete mode 100644 src/gfx/cards/zapdos3.8x6.png delete mode 100644 src/gfx/cards/zapdos3.pal create mode 100644 src/gfx/cards/zapdos3.png delete mode 100644 src/gfx/cards/zubat.8x6.png delete mode 100644 src/gfx/cards/zubat.pal create mode 100644 src/gfx/cards/zubat.png rename src/gfx/duel/anims/{51.t10.png => 51.png} (100%) rename src/gfx/duel/{cgb_symbols.t7.png => cgb_symbols.png} (100%) rename src/gfx/duel/{dmg_sgb_symbols.t7.png => dmg_sgb_symbols.png} (100%) rename src/gfx/duel/{other.t7.png => other.png} (100%) rename src/gfx/fonts/full_width/{4.t3.png => 4.png} (100%) rename src/gfx/{overworld_map.t15.png => overworld_map.png} (100%) rename src/gfx/tilesets/{challengehall.t3.png => challengehall.png} (100%) rename src/gfx/tilesets/{clubentrance.t15.png => clubentrance.png} (100%) rename src/gfx/tilesets/{clublobby.t8.png => clublobby.png} (100%) rename src/gfx/tilesets/{fightingclub.t13.png => fightingclub.png} (100%) rename src/gfx/tilesets/{fireclub.t9.png => fireclub.png} (100%) rename src/gfx/tilesets/{grassclub.t9.png => grassclub.png} (100%) rename src/gfx/tilesets/{hallofhonor.t7.png => hallofhonor.png} (100%) rename src/gfx/tilesets/{ishihara.t3.png => ishihara.png} (100%) rename src/gfx/tilesets/{lightningclub.t13.png => lightningclub.png} (100%) rename src/gfx/tilesets/{masonlaboratory.t9.png => masonlaboratory.png} (100%) rename src/gfx/tilesets/{pokemondome.t1.png => pokemondome.png} (100%) rename src/gfx/tilesets/{pokemondomeentrance.t2.png => pokemondomeentrance.png} (100%) rename src/gfx/tilesets/{psychicclub.t6.png => psychicclub.png} (100%) rename src/gfx/tilesets/{rockclub.t4.png => rockclub.png} (100%) rename src/gfx/tilesets/{scienceclub.t14.png => scienceclub.png} (100%) rename src/gfx/tilesets/{waterclub.t15.png => waterclub.png} (100%) rename src/gfx/titlescreen/{titlescreen1.t15.png => titlescreen1.png} (100%) rename src/gfx/titlescreen/{titlescreen2.t15.png => titlescreen2.png} (100%) rename src/gfx/titlescreen/{titlescreen3.t12.png => titlescreen3.png} (100%) rename src/gfx/titlescreen/{titlescreen4.t5.png => titlescreen4.png} (100%) rename src/gfx/titlescreen/{titlescreen5.t4.png => titlescreen5.png} (100%) rename src/gfx/titlescreen/{titlescreen6.t12.png => titlescreen6.png} (100%) diff --git a/.gitignore b/.gitignore index f7006b3d..733a3f36 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ # converted image/palette data *.1bpp *.2bpp +*.pal # *disasm.py output file *disasm_output.asm \ No newline at end of file diff --git a/Makefile b/Makefile index 6d414ec4..b78a54e9 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ all: $(rom) tcg: $(rom) clean: tidy - find src/gfx \( -iname '*.1bpp' -o -iname '*.2bpp' \) -delete + find src/gfx \( -iname '*.1bpp' -o -iname '*.2bpp' -o -iname '*.pal' \) -delete tidy: rm -f $(rom) $(rom_obj) $(rom:.gbc=.map) $(rom:.gbc=.sym) src/rgbdscheck.o @@ -95,6 +95,8 @@ $(rom): $(rom_obj) src/layout.link %.png: ; +%.pal: ; + %.2bpp: %.png $(RGBGFX) $(rgbgfx) -o $@ $< $(if $(tools/gfx),\ diff --git a/src/engine/home.asm b/src/engine/home.asm index f33ec2f7..90b0af19 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -6237,7 +6237,7 @@ DrawDuelBoxMessage: ; 2167 (0:2167) jp FillRectangle ; load the tiles for the latin, katakana, and hiragana fonts into VRAM -; from gfx/fonts/full_width/3.1bpp and gfx/fonts/full_width/4.t3.1bpp +; from gfx/fonts/full_width/3.1bpp and gfx/fonts/full_width/4.1bpp LoadFullWidthFontTiles: ; 2189 (0:2189) ld hl, FullWidthFonts + $3cc tiles_1bpp - $4000 ld a, BANK(Fonts); BANK(DuelGraphics) diff --git a/src/gfx.asm b/src/gfx.asm index d5688021..e3b97cf1 100644 --- a/src/gfx.asm +++ b/src/gfx.asm @@ -11,7 +11,7 @@ INCBIN "gfx/fonts/full_width/0_2_digits_kanji1.1bpp" INCBIN "gfx/fonts/full_width/1_kanji2.1bpp" INCBIN "gfx/fonts/full_width/2_kanji3.1bpp" INCBIN "gfx/fonts/full_width/3.1bpp" -INCBIN "gfx/fonts/full_width/4.t3.1bpp" +INCBIN "gfx/fonts/full_width/4.1bpp" HalfWidthFont:: ; 76668 (1d:6668) INCBIN "gfx/fonts/half_width.1bpp" @@ -25,17 +25,17 @@ DuelCardHeaderGraphics:: ; 76ce8 (1d:6ce8) INCBIN "gfx/duel/card_headers.2bpp" DuelDmgSgbSymbolGraphics:: ; 76fe8 (1d:6fe8) -INCBIN "gfx/duel/dmg_sgb_symbols.t7.2bpp" +INCBIN "gfx/duel/dmg_sgb_symbols.2bpp" DuelCgbSymbolGraphics:: ; 777f8 (1d:77f8) -INCBIN "gfx/duel/cgb_symbols.t7.2bpp", $0, $808 +INCBIN "gfx/duel/cgb_symbols.2bpp", $0, $808 SECTION "Gfx 2", ROMX -INCBIN "gfx/duel/cgb_symbols.t7.2bpp", $808, $8 +INCBIN "gfx/duel/cgb_symbols.2bpp", $808, $8 DuelOtherGraphics:: ; 78008 (1e:4008) -INCBIN "gfx/duel/other.t7.2bpp" +INCBIN "gfx/duel/other.2bpp" DuelBoxMessages:: ; 78318 (1e:4318) INCBIN "gfx/duel/box_messages.2bpp" @@ -50,7 +50,7 @@ SECTION "Gfx 3", ROMX IshiharaTilesetGfx: ; 87828 (21:7828) dw $4d - INCBIN "gfx/tilesets/ishihara.t3.2bpp" + INCBIN "gfx/tilesets/ishihara.2bpp" SolidTiles1: ; 87cfa (21:7cfa) dw $4 @@ -78,35 +78,35 @@ SECTION "Gfx 4", ROMX OverworldMapTiles: ; 88000 (22:4000) dw $c1 - INCBIN "gfx/overworld_map.t15.2bpp" + INCBIN "gfx/overworld_map.2bpp" MasonLaboratoryTilesetGfx: ; 88c12 (22:4c12) dw $97 - INCBIN "gfx/tilesets/masonlaboratory.t9.2bpp" + INCBIN "gfx/tilesets/masonlaboratory.2bpp" ClubEntranceTilesetGfx: ; 89584 (22:5584) dw $81 - INCBIN "gfx/tilesets/clubentrance.t15.2bpp" + INCBIN "gfx/tilesets/clubentrance.2bpp" ClubLobbyTilesetGfx: ; 89d96 (22:5d96) dw $78 - INCBIN "gfx/tilesets/clublobby.t8.2bpp" + INCBIN "gfx/tilesets/clublobby.2bpp" FightingClubTilesetGfx: ; 8a518 (22:6518) dw $63 - INCBIN "gfx/tilesets/fightingclub.t13.2bpp" + INCBIN "gfx/tilesets/fightingclub.2bpp" RockClubTilesetGfx: ; 8ab4a (22:6b4a) dw $3c - INCBIN "gfx/tilesets/rockclub.t4.2bpp" + INCBIN "gfx/tilesets/rockclub.2bpp" WaterClubTilesetGfx: ; 8af0c (22:6f0c) dw $a1 - INCBIN "gfx/tilesets/waterclub.t15.2bpp" + INCBIN "gfx/tilesets/waterclub.2bpp" GrassClubTilesetGfx: ; 8b91e (22:791e) dw $57 - INCBIN "gfx/tilesets/grassclub.t9.2bpp" + INCBIN "gfx/tilesets/grassclub.2bpp" OWSpritePlayer: ; 8be90 (22:7e90) dw $14 @@ -122,35 +122,35 @@ SECTION "Gfx 5", ROMX LightningClubTilesetGfx: ; 8c000 (23:4000) dw $83 - INCBIN "gfx/tilesets/lightningclub.t13.2bpp" + INCBIN "gfx/tilesets/lightningclub.2bpp" PsychicClubTilesetGfx: ; 8c832 (23:4832) dw $3a - INCBIN "gfx/tilesets/psychicclub.t6.2bpp" + INCBIN "gfx/tilesets/psychicclub.2bpp" ScienceClubTilesetGfx: ; 8cbd4 (23:4bd4) dw $52 - INCBIN "gfx/tilesets/scienceclub.t14.2bpp" + INCBIN "gfx/tilesets/scienceclub.2bpp" FireClubTilesetGfx: ; 8d0f6 (23:50f6) dw $57 - INCBIN "gfx/tilesets/fireclub.t9.2bpp" + INCBIN "gfx/tilesets/fireclub.2bpp" ChallengeHallTilesetGfx: ; 8d668 (23:5668) dw $9d - INCBIN "gfx/tilesets/challengehall.t3.2bpp" + INCBIN "gfx/tilesets/challengehall.2bpp" PokemonDomeEntranceTilesetGfx: ; 8e03a (23:603a) dw $4e - INCBIN "gfx/tilesets/pokemondomeentrance.t2.2bpp" + INCBIN "gfx/tilesets/pokemondomeentrance.2bpp" PokemonDomeTilesetGfx: ; 8e51c (23:651c) dw $cf - INCBIN "gfx/tilesets/pokemondome.t1.2bpp" + INCBIN "gfx/tilesets/pokemondome.2bpp" HallOfHonorTilesetGfx: ; 8f20e (23:720e) dw $79 - INCBIN "gfx/tilesets/hallofhonor.t7.2bpp" + INCBIN "gfx/tilesets/hallofhonor.2bpp" MedalGfx: ; 8f9a0 (23:79a0) dw $48 @@ -187,15 +187,15 @@ SECTION "Gfx 6", ROMX CardPop1Gfx: ; 90000 (24:4000) dw $bd - INCBIN "gfx/cardpop/cardpop1.t3.2bpp" + INCBIN "gfx/cardpop/cardpop1.2bpp" CardPop2Gfx: ; 90bd2 (24:4bd2) dw $6d - INCBIN "gfx/cardpop/cardpop2.t3.2bpp" + INCBIN "gfx/cardpop/cardpop2.2bpp" CardPop3Gfx: ; 912a4 (24:52a4) dw $5d - INCBIN "gfx/cardpop/cardpop3.t3.2bpp" + INCBIN "gfx/cardpop/cardpop3.2bpp" Colosseum1Gfx: ; 91876 (24:5876) dw $60 @@ -203,7 +203,7 @@ Colosseum1Gfx: ; 91876 (24:5876) Colosseum2Gfx: ; 91e78 (24:5e78) dw $56 - INCBIN "gfx/booster_packs/colosseum2.t10.2bpp" + INCBIN "gfx/booster_packs/colosseum2.2bpp" Evolution1Gfx: ; 923da (24:63da) dw $60 @@ -211,7 +211,7 @@ Evolution1Gfx: ; 923da (24:63da) Evolution2Gfx: ; 929dc (24:69dc) dw $56 - INCBIN "gfx/booster_packs/evolution2.t10.2bpp" + INCBIN "gfx/booster_packs/evolution2.2bpp" Mystery1Gfx: ; 92f3e (24:6f3e) dw $60 @@ -219,7 +219,7 @@ Mystery1Gfx: ; 92f3e (24:6f3e) Mystery2Gfx: ; 93540 (24:7540) dw $56 - INCBIN "gfx/booster_packs/mystery2.t10.2bpp" + INCBIN "gfx/booster_packs/mystery2.2bpp" RonaldGfx: ; 93aa2 (24:7aa2) dw $24 @@ -253,7 +253,7 @@ Laboratory1Gfx: ; 94000 (25:4000) Laboratory2Gfx: ; 94602 (25:4602) dw $56 - INCBIN "gfx/booster_packs/laboratory2.t10.2bpp" + INCBIN "gfx/booster_packs/laboratory2.2bpp" CharizardIntro1Gfx: ; 94b64 (25:4b64) dw $60 @@ -281,11 +281,11 @@ AerodactylIntro2Gfx: ; 9696e (25:696e) Titlescreen1Gfx: ; 96f70 (25:6f70) dw $61 - INCBIN "gfx/titlescreen/titlescreen1.t15.2bpp" + INCBIN "gfx/titlescreen/titlescreen1.2bpp" Titlescreen2Gfx: ; 97582 (25:7582) dw $61 - INCBIN "gfx/titlescreen/titlescreen2.t15.2bpp" + INCBIN "gfx/titlescreen/titlescreen2.2bpp" CompaniesGfx: ; 97b94 (25:7b94) dw $31 @@ -301,19 +301,19 @@ SECTION "Gfx 8", ROMX Titlescreen3Gfx: ; 98000 (26:4000) dw $f4 - INCBIN "gfx/titlescreen/titlescreen3.t12.2bpp" + INCBIN "gfx/titlescreen/titlescreen3.2bpp" Titlescreen4Gfx: ; 98f42 (26:4f42) dw $13b - INCBIN "gfx/titlescreen/titlescreen4.t5.2bpp" + INCBIN "gfx/titlescreen/titlescreen4.2bpp" Titlescreen5Gfx: ; 9a2f4 (26:62f4) dw $dc - INCBIN "gfx/titlescreen/titlescreen5.t4.2bpp" + INCBIN "gfx/titlescreen/titlescreen5.2bpp" Titlescreen6Gfx: ; 9b0b6 (26:70b6) dw $d4 - INCBIN "gfx/titlescreen/titlescreen6.t12.2bpp" + INCBIN "gfx/titlescreen/titlescreen6.2bpp" DoctorMasonOWGfx: ; 9bdf8 (26:7df8) dw $14 @@ -857,7 +857,7 @@ Duel50Gfx: ; a81f8 (2a:41f8) Duel51Gfx: ; a836a (2a:436a) dw $36 - INCBIN "gfx/duel/anims/51.t10.2bpp" + INCBIN "gfx/duel/anims/51.2bpp" Duel52Gfx: ; a86cc (2a:46cc) dw $0b @@ -926,935 +926,935 @@ SECTION "Card Gfx 1", ROMX CardGraphics:: ; c4000 (31:4000) GrassEnergyCardGfx:: ; c4000 (31:4000) - INCBIN "gfx/cards/grassenergy.8x6.2bpp" + INCBIN "gfx/cards/grassenergy.2bpp" INCBIN "gfx/cards/grassenergy.pal" FireEnergyCardGfx:: ; c4308 (31:4308) - INCBIN "gfx/cards/fireenergy.8x6.2bpp" + INCBIN "gfx/cards/fireenergy.2bpp" INCBIN "gfx/cards/fireenergy.pal" WaterEnergyCardGfx:: ; c4610 (31:4610) - INCBIN "gfx/cards/waterenergy.8x6.2bpp" + INCBIN "gfx/cards/waterenergy.2bpp" INCBIN "gfx/cards/waterenergy.pal" LightningEnergyCardGfx:: ; c4918 (31:4918) - INCBIN "gfx/cards/lightningenergy.8x6.2bpp" + INCBIN "gfx/cards/lightningenergy.2bpp" INCBIN "gfx/cards/lightningenergy.pal" FightingEnergyCardGfx:: ; c4c20 (31:4c20) - INCBIN "gfx/cards/fightingenergy.8x6.2bpp" + INCBIN "gfx/cards/fightingenergy.2bpp" INCBIN "gfx/cards/fightingenergy.pal" PsychicEnergyCardGfx:: ; c4f28 (31:4f28) - INCBIN "gfx/cards/psychicenergy.8x6.2bpp" + INCBIN "gfx/cards/psychicenergy.2bpp" INCBIN "gfx/cards/psychicenergy.pal" DoubleColorlessEnergyCardGfx:: ; c5230 (31:5230) - INCBIN "gfx/cards/doublecolorlessenergy.8x6.2bpp" + INCBIN "gfx/cards/doublecolorlessenergy.2bpp" INCBIN "gfx/cards/doublecolorlessenergy.pal" BulbasaurCardGfx:: ; c5538 (31:5538) - INCBIN "gfx/cards/bulbasaur.8x6.2bpp" + INCBIN "gfx/cards/bulbasaur.2bpp" INCBIN "gfx/cards/bulbasaur.pal" IvysaurCardGfx:: ; c5840 (31:5840) - INCBIN "gfx/cards/ivysaur.8x6.2bpp" + INCBIN "gfx/cards/ivysaur.2bpp" INCBIN "gfx/cards/ivysaur.pal" Venusaur1CardGfx:: ; c5b48 (31:5b48) - INCBIN "gfx/cards/venusaur1.8x6.2bpp" + INCBIN "gfx/cards/venusaur1.2bpp" INCBIN "gfx/cards/venusaur1.pal" Venusaur2CardGfx:: ; c5e50 (31:5e50) - INCBIN "gfx/cards/venusaur2.8x6.2bpp" + INCBIN "gfx/cards/venusaur2.2bpp" INCBIN "gfx/cards/venusaur2.pal" CaterpieCardGfx:: ; c6158 (31:6158) - INCBIN "gfx/cards/caterpie.8x6.2bpp" + INCBIN "gfx/cards/caterpie.2bpp" INCBIN "gfx/cards/caterpie.pal" MetapodCardGfx:: ; c6460 (31:6460) - INCBIN "gfx/cards/metapod.8x6.2bpp" + INCBIN "gfx/cards/metapod.2bpp" INCBIN "gfx/cards/metapod.pal" ButterfreeCardGfx:: ; c6768 (31:6768) - INCBIN "gfx/cards/butterfree.8x6.2bpp" + INCBIN "gfx/cards/butterfree.2bpp" INCBIN "gfx/cards/butterfree.pal" WeedleCardGfx:: ; c6a70 (31:6a70) - INCBIN "gfx/cards/weedle.8x6.2bpp" + INCBIN "gfx/cards/weedle.2bpp" INCBIN "gfx/cards/weedle.pal" KakunaCardGfx:: ; c6d78 (31:6d78) - INCBIN "gfx/cards/kakuna.8x6.2bpp" + INCBIN "gfx/cards/kakuna.2bpp" INCBIN "gfx/cards/kakuna.pal" BeedrillCardGfx:: ; c7080 (31:7080) - INCBIN "gfx/cards/beedrill.8x6.2bpp" + INCBIN "gfx/cards/beedrill.2bpp" INCBIN "gfx/cards/beedrill.pal" EkansCardGfx:: ; c7388 (31:7388) - INCBIN "gfx/cards/ekans.8x6.2bpp" + INCBIN "gfx/cards/ekans.2bpp" INCBIN "gfx/cards/ekans.pal" ArbokCardGfx:: ; c7690 (31:7690) - INCBIN "gfx/cards/arbok.8x6.2bpp" + INCBIN "gfx/cards/arbok.2bpp" INCBIN "gfx/cards/arbok.pal" NidoranFCardGfx:: ; c7998 (31:7998) - INCBIN "gfx/cards/nidoranf.8x6.2bpp" + INCBIN "gfx/cards/nidoranf.2bpp" INCBIN "gfx/cards/nidoranf.pal" NidorinaCardGfx:: ; c7ca0 (31:7ca0) - INCBIN "gfx/cards/nidorina.8x6.2bpp" + INCBIN "gfx/cards/nidorina.2bpp" INCBIN "gfx/cards/nidorina.pal" SECTION "Card Gfx 2", ROMX NidoqueenCardGfx:: ; c8000 (32:4000) - INCBIN "gfx/cards/nidoqueen.8x6.2bpp" + INCBIN "gfx/cards/nidoqueen.2bpp" INCBIN "gfx/cards/nidoqueen.pal" NidoranMCardGfx:: ; c8308 (32:4308) - INCBIN "gfx/cards/nidoranm.8x6.2bpp" + INCBIN "gfx/cards/nidoranm.2bpp" INCBIN "gfx/cards/nidoranm.pal" NidorinoCardGfx:: ; c8610 (32:4610) - INCBIN "gfx/cards/nidorino.8x6.2bpp" + INCBIN "gfx/cards/nidorino.2bpp" INCBIN "gfx/cards/nidorino.pal" NidokingCardGfx:: ; c8918 (32:4918) - INCBIN "gfx/cards/nidoking.8x6.2bpp" + INCBIN "gfx/cards/nidoking.2bpp" INCBIN "gfx/cards/nidoking.pal" ZubatCardGfx:: ; c8c20 (32:4c20) - INCBIN "gfx/cards/zubat.8x6.2bpp" + INCBIN "gfx/cards/zubat.2bpp" INCBIN "gfx/cards/zubat.pal" GolbatCardGfx:: ; c8f28 (32:4f28) - INCBIN "gfx/cards/golbat.8x6.2bpp" + INCBIN "gfx/cards/golbat.2bpp" INCBIN "gfx/cards/golbat.pal" OddishCardGfx:: ; c9230 (32:5230) - INCBIN "gfx/cards/oddish.8x6.2bpp" + INCBIN "gfx/cards/oddish.2bpp" INCBIN "gfx/cards/oddish.pal" GloomCardGfx:: ; c9538 (32:5538) - INCBIN "gfx/cards/gloom.8x6.2bpp" + INCBIN "gfx/cards/gloom.2bpp" INCBIN "gfx/cards/gloom.pal" VileplumeCardGfx:: ; c9840 (32:5840) - INCBIN "gfx/cards/vileplume.8x6.2bpp" + INCBIN "gfx/cards/vileplume.2bpp" INCBIN "gfx/cards/vileplume.pal" ParasCardGfx:: ; c9b48 (32:5b48) - INCBIN "gfx/cards/paras.8x6.2bpp" + INCBIN "gfx/cards/paras.2bpp" INCBIN "gfx/cards/paras.pal" ParasectCardGfx:: ; c9e50 (32:5e50) - INCBIN "gfx/cards/parasect.8x6.2bpp" + INCBIN "gfx/cards/parasect.2bpp" INCBIN "gfx/cards/parasect.pal" VenonatCardGfx:: ; ca158 (32:6158) - INCBIN "gfx/cards/venonat.8x6.2bpp" + INCBIN "gfx/cards/venonat.2bpp" INCBIN "gfx/cards/venonat.pal" VenomothCardGfx:: ; ca460 (32:6460) - INCBIN "gfx/cards/venomoth.8x6.2bpp" + INCBIN "gfx/cards/venomoth.2bpp" INCBIN "gfx/cards/venomoth.pal" BellsproutCardGfx:: ; ca768 (32:6768) - INCBIN "gfx/cards/bellsprout.8x6.2bpp" + INCBIN "gfx/cards/bellsprout.2bpp" INCBIN "gfx/cards/bellsprout.pal" WeepinbellCardGfx:: ; caa70 (32:6a70) - INCBIN "gfx/cards/weepinbell.8x6.2bpp" + INCBIN "gfx/cards/weepinbell.2bpp" INCBIN "gfx/cards/weepinbell.pal" VictreebelCardGfx:: ; cad78 (32:6d78) - INCBIN "gfx/cards/victreebel.8x6.2bpp" + INCBIN "gfx/cards/victreebel.2bpp" INCBIN "gfx/cards/victreebel.pal" GrimerCardGfx:: ; cb080 (32:7080) - INCBIN "gfx/cards/grimer.8x6.2bpp" + INCBIN "gfx/cards/grimer.2bpp" INCBIN "gfx/cards/grimer.pal" MukCardGfx:: ; cb388 (32:7388) - INCBIN "gfx/cards/muk.8x6.2bpp" + INCBIN "gfx/cards/muk.2bpp" INCBIN "gfx/cards/muk.pal" ExeggcuteCardGfx:: ; cb690 (32:7690) - INCBIN "gfx/cards/exeggcute.8x6.2bpp" + INCBIN "gfx/cards/exeggcute.2bpp" INCBIN "gfx/cards/exeggcute.pal" ExeggutorCardGfx:: ; cb998 (32:7998) - INCBIN "gfx/cards/exeggutor.8x6.2bpp" + INCBIN "gfx/cards/exeggutor.2bpp" INCBIN "gfx/cards/exeggutor.pal" KoffingCardGfx:: ; cbca0 (32:7ca0) - INCBIN "gfx/cards/koffing.8x6.2bpp" + INCBIN "gfx/cards/koffing.2bpp" INCBIN "gfx/cards/koffing.pal" SECTION "Card Gfx 3", ROMX WeezingCardGfx:: ; cc000 (33:4000) - INCBIN "gfx/cards/weezing.8x6.2bpp" + INCBIN "gfx/cards/weezing.2bpp" INCBIN "gfx/cards/weezing.pal" Tangela1CardGfx:: ; cc308 (33:4308) - INCBIN "gfx/cards/tangela1.8x6.2bpp" + INCBIN "gfx/cards/tangela1.2bpp" INCBIN "gfx/cards/tangela1.pal" Tangela2CardGfx:: ; cc610 (33:4610) - INCBIN "gfx/cards/tangela2.8x6.2bpp" + INCBIN "gfx/cards/tangela2.2bpp" INCBIN "gfx/cards/tangela2.pal" ScytherCardGfx:: ; cc918 (33:4918) - INCBIN "gfx/cards/scyther.8x6.2bpp" + INCBIN "gfx/cards/scyther.2bpp" INCBIN "gfx/cards/scyther.pal" PinsirCardGfx:: ; ccc20 (33:4c20) - INCBIN "gfx/cards/pinsir.8x6.2bpp" + INCBIN "gfx/cards/pinsir.2bpp" INCBIN "gfx/cards/pinsir.pal" CharmanderCardGfx:: ; ccf28 (33:4f28) - INCBIN "gfx/cards/charmander.8x6.2bpp" + INCBIN "gfx/cards/charmander.2bpp" INCBIN "gfx/cards/charmander.pal" CharmeleonCardGfx:: ; cd230 (33:5230) - INCBIN "gfx/cards/charmeleon.8x6.2bpp" + INCBIN "gfx/cards/charmeleon.2bpp" INCBIN "gfx/cards/charmeleon.pal" CharizardCardGfx:: ; cd538 (33:5538) - INCBIN "gfx/cards/charizard.8x6.2bpp" + INCBIN "gfx/cards/charizard.2bpp" INCBIN "gfx/cards/charizard.pal" VulpixCardGfx:: ; cd840 (33:5840) - INCBIN "gfx/cards/vulpix.8x6.2bpp" + INCBIN "gfx/cards/vulpix.2bpp" INCBIN "gfx/cards/vulpix.pal" Ninetails1CardGfx:: ; cdb48 (33:5b48) - INCBIN "gfx/cards/ninetails1.8x6.2bpp" + INCBIN "gfx/cards/ninetails1.2bpp" INCBIN "gfx/cards/ninetails1.pal" Ninetails2CardGfx:: ; cde50 (33:5e50) - INCBIN "gfx/cards/ninetails2.8x6.2bpp" + INCBIN "gfx/cards/ninetails2.2bpp" INCBIN "gfx/cards/ninetails2.pal" GrowlitheCardGfx:: ; ce158 (33:6158) - INCBIN "gfx/cards/growlithe.8x6.2bpp" + INCBIN "gfx/cards/growlithe.2bpp" INCBIN "gfx/cards/growlithe.pal" Arcanine1CardGfx:: ; ce460 (33:6460) - INCBIN "gfx/cards/arcanine1.8x6.2bpp" + INCBIN "gfx/cards/arcanine1.2bpp" INCBIN "gfx/cards/arcanine1.pal" Arcanine2CardGfx:: ; ce768 (33:6768) - INCBIN "gfx/cards/arcanine2.8x6.2bpp" + INCBIN "gfx/cards/arcanine2.2bpp" INCBIN "gfx/cards/arcanine2.pal" PonytaCardGfx:: ; cea70 (33:6a70) - INCBIN "gfx/cards/ponyta.8x6.2bpp" + INCBIN "gfx/cards/ponyta.2bpp" INCBIN "gfx/cards/ponyta.pal" RapidashCardGfx:: ; ced78 (33:6d78) - INCBIN "gfx/cards/rapidash.8x6.2bpp" + INCBIN "gfx/cards/rapidash.2bpp" INCBIN "gfx/cards/rapidash.pal" Magmar1CardGfx:: ; cf080 (33:7080) - INCBIN "gfx/cards/magmar1.8x6.2bpp" + INCBIN "gfx/cards/magmar1.2bpp" INCBIN "gfx/cards/magmar1.pal" Magmar2CardGfx:: ; cf388 (33:7388) - INCBIN "gfx/cards/magmar2.8x6.2bpp" + INCBIN "gfx/cards/magmar2.2bpp" INCBIN "gfx/cards/magmar2.pal" Flareon1CardGfx:: ; cf690 (33:7690) - INCBIN "gfx/cards/flareon1.8x6.2bpp" + INCBIN "gfx/cards/flareon1.2bpp" INCBIN "gfx/cards/flareon1.pal" Flareon2CardGfx:: ; cf998 (33:7998) - INCBIN "gfx/cards/flareon2.8x6.2bpp" + INCBIN "gfx/cards/flareon2.2bpp" INCBIN "gfx/cards/flareon2.pal" Moltres1CardGfx:: ; cfca0 (33:7ca0) - INCBIN "gfx/cards/moltres1.8x6.2bpp" + INCBIN "gfx/cards/moltres1.2bpp" INCBIN "gfx/cards/moltres1.pal" SECTION "Card Gfx 4", ROMX Moltres2CardGfx:: ; d0000 (34:4000) - INCBIN "gfx/cards/moltres2.8x6.2bpp" + INCBIN "gfx/cards/moltres2.2bpp" INCBIN "gfx/cards/moltres2.pal" SquirtleCardGfx:: ; d0308 (34:4308) - INCBIN "gfx/cards/squirtle.8x6.2bpp" + INCBIN "gfx/cards/squirtle.2bpp" INCBIN "gfx/cards/squirtle.pal" WartortleCardGfx:: ; d0610 (34:4610) - INCBIN "gfx/cards/wartortle.8x6.2bpp" + INCBIN "gfx/cards/wartortle.2bpp" INCBIN "gfx/cards/wartortle.pal" BlastoiseCardGfx:: ; d0918 (34:4918) - INCBIN "gfx/cards/blastoise.8x6.2bpp" + INCBIN "gfx/cards/blastoise.2bpp" INCBIN "gfx/cards/blastoise.pal" PsyduckCardGfx:: ; d0c20 (34:4c20) - INCBIN "gfx/cards/psyduck.8x6.2bpp" + INCBIN "gfx/cards/psyduck.2bpp" INCBIN "gfx/cards/psyduck.pal" GolduckCardGfx:: ; d0f28 (34:4f28) - INCBIN "gfx/cards/golduck.8x6.2bpp" + INCBIN "gfx/cards/golduck.2bpp" INCBIN "gfx/cards/golduck.pal" PoliwagCardGfx:: ; d1230 (34:5230) - INCBIN "gfx/cards/poliwag.8x6.2bpp" + INCBIN "gfx/cards/poliwag.2bpp" INCBIN "gfx/cards/poliwag.pal" PoliwhirlCardGfx:: ; d1538 (34:5538) - INCBIN "gfx/cards/poliwhirl.8x6.2bpp" + INCBIN "gfx/cards/poliwhirl.2bpp" INCBIN "gfx/cards/poliwhirl.pal" PoliwrathCardGfx:: ; d1840 (34:5840) - INCBIN "gfx/cards/poliwrath.8x6.2bpp" + INCBIN "gfx/cards/poliwrath.2bpp" INCBIN "gfx/cards/poliwrath.pal" TentacoolCardGfx:: ; d1b48 (34:5b48) - INCBIN "gfx/cards/tentacool.8x6.2bpp" + INCBIN "gfx/cards/tentacool.2bpp" INCBIN "gfx/cards/tentacool.pal" TentacruelCardGfx:: ; d1e50 (34:5e50) - INCBIN "gfx/cards/tentacruel.8x6.2bpp" + INCBIN "gfx/cards/tentacruel.2bpp" INCBIN "gfx/cards/tentacruel.pal" SeelCardGfx:: ; d2158 (34:6158) - INCBIN "gfx/cards/seel.8x6.2bpp" + INCBIN "gfx/cards/seel.2bpp" INCBIN "gfx/cards/seel.pal" DewgongCardGfx:: ; d2460 (34:6460) - INCBIN "gfx/cards/dewgong.8x6.2bpp" + INCBIN "gfx/cards/dewgong.2bpp" INCBIN "gfx/cards/dewgong.pal" ShellderCardGfx:: ; d2768 (34:6768) - INCBIN "gfx/cards/shellder.8x6.2bpp" + INCBIN "gfx/cards/shellder.2bpp" INCBIN "gfx/cards/shellder.pal" CloysterCardGfx:: ; d2a70 (34:6a70) - INCBIN "gfx/cards/cloyster.8x6.2bpp" + INCBIN "gfx/cards/cloyster.2bpp" INCBIN "gfx/cards/cloyster.pal" KrabbyCardGfx:: ; d2d78 (34:6d78) - INCBIN "gfx/cards/krabby.8x6.2bpp" + INCBIN "gfx/cards/krabby.2bpp" INCBIN "gfx/cards/krabby.pal" KinglerCardGfx:: ; d3080 (34:7080) - INCBIN "gfx/cards/kingler.8x6.2bpp" + INCBIN "gfx/cards/kingler.2bpp" INCBIN "gfx/cards/kingler.pal" HorseaCardGfx:: ; d3388 (34:7388) - INCBIN "gfx/cards/horsea.8x6.2bpp" + INCBIN "gfx/cards/horsea.2bpp" INCBIN "gfx/cards/horsea.pal" SeadraCardGfx:: ; d3690 (34:7690) - INCBIN "gfx/cards/seadra.8x6.2bpp" + INCBIN "gfx/cards/seadra.2bpp" INCBIN "gfx/cards/seadra.pal" GoldeenCardGfx:: ; d3998 (34:7998) - INCBIN "gfx/cards/goldeen.8x6.2bpp" + INCBIN "gfx/cards/goldeen.2bpp" INCBIN "gfx/cards/goldeen.pal" SeakingCardGfx:: ; d3ca0 (34:7ca0) - INCBIN "gfx/cards/seaking.8x6.2bpp" + INCBIN "gfx/cards/seaking.2bpp" INCBIN "gfx/cards/seaking.pal" SECTION "Card Gfx 5", ROMX StaryuCardGfx:: ; d4000 (35:4000) - INCBIN "gfx/cards/staryu.8x6.2bpp" + INCBIN "gfx/cards/staryu.2bpp" INCBIN "gfx/cards/staryu.pal" StarmieCardGfx:: ; d4308 (35:4308) - INCBIN "gfx/cards/starmie.8x6.2bpp" + INCBIN "gfx/cards/starmie.2bpp" INCBIN "gfx/cards/starmie.pal" MagikarpCardGfx:: ; d4610 (35:4610) - INCBIN "gfx/cards/magikarp.8x6.2bpp" + INCBIN "gfx/cards/magikarp.2bpp" INCBIN "gfx/cards/magikarp.pal" GyaradosCardGfx:: ; d4918 (35:4918) - INCBIN "gfx/cards/gyarados.8x6.2bpp" + INCBIN "gfx/cards/gyarados.2bpp" INCBIN "gfx/cards/gyarados.pal" LaprasCardGfx:: ; d4c20 (35:4c20) - INCBIN "gfx/cards/lapras.8x6.2bpp" + INCBIN "gfx/cards/lapras.2bpp" INCBIN "gfx/cards/lapras.pal" Vaporeon1CardGfx:: ; d4f28 (35:4f28) - INCBIN "gfx/cards/vaporeon1.8x6.2bpp" + INCBIN "gfx/cards/vaporeon1.2bpp" INCBIN "gfx/cards/vaporeon1.pal" Vaporeon2CardGfx:: ; d5230 (35:5230) - INCBIN "gfx/cards/vaporeon2.8x6.2bpp" + INCBIN "gfx/cards/vaporeon2.2bpp" INCBIN "gfx/cards/vaporeon2.pal" OmanyteCardGfx:: ; d5538 (35:5538) - INCBIN "gfx/cards/omanyte.8x6.2bpp" + INCBIN "gfx/cards/omanyte.2bpp" INCBIN "gfx/cards/omanyte.pal" OmastarCardGfx:: ; d5840 (35:5840) - INCBIN "gfx/cards/omastar.8x6.2bpp" + INCBIN "gfx/cards/omastar.2bpp" INCBIN "gfx/cards/omastar.pal" Articuno1CardGfx:: ; d5b48 (35:5b48) - INCBIN "gfx/cards/articuno1.8x6.2bpp" + INCBIN "gfx/cards/articuno1.2bpp" INCBIN "gfx/cards/articuno1.pal" Articuno2CardGfx:: ; d5e50 (35:5e50) - INCBIN "gfx/cards/articuno2.8x6.2bpp" + INCBIN "gfx/cards/articuno2.2bpp" INCBIN "gfx/cards/articuno2.pal" Pikachu1CardGfx:: ; d6158 (35:6158) - INCBIN "gfx/cards/pikachu1.8x6.2bpp" + INCBIN "gfx/cards/pikachu1.2bpp" INCBIN "gfx/cards/pikachu1.pal" Pikachu2CardGfx:: ; d6460 (35:6460) - INCBIN "gfx/cards/pikachu2.8x6.2bpp" + INCBIN "gfx/cards/pikachu2.2bpp" INCBIN "gfx/cards/pikachu2.pal" Pikachu3CardGfx:: ; d6768 (35:6768) - INCBIN "gfx/cards/pikachu3.8x6.2bpp" + INCBIN "gfx/cards/pikachu3.2bpp" INCBIN "gfx/cards/pikachu3.pal" Pikachu4CardGfx:: ; d6a70 (35:6a70) - INCBIN "gfx/cards/pikachu4.8x6.2bpp" + INCBIN "gfx/cards/pikachu4.2bpp" INCBIN "gfx/cards/pikachu4.pal" FlyingPikachuCardGfx:: ; d6d78 (35:6d78) - INCBIN "gfx/cards/flyingpikachu.8x6.2bpp" + INCBIN "gfx/cards/flyingpikachu.2bpp" INCBIN "gfx/cards/flyingpikachu.pal" SurfingPikachu1CardGfx:: ; d7080 (35:7080) - INCBIN "gfx/cards/surfingpikachu1.8x6.2bpp" + INCBIN "gfx/cards/surfingpikachu1.2bpp" INCBIN "gfx/cards/surfingpikachu1.pal" SurfingPikachu2CardGfx:: ; d7388 (35:7388) - INCBIN "gfx/cards/surfingpikachu2.8x6.2bpp" + INCBIN "gfx/cards/surfingpikachu2.2bpp" INCBIN "gfx/cards/surfingpikachu2.pal" Raichu1CardGfx:: ; d7690 (35:7690) - INCBIN "gfx/cards/raichu1.8x6.2bpp" + INCBIN "gfx/cards/raichu1.2bpp" INCBIN "gfx/cards/raichu1.pal" Raichu2CardGfx:: ; d7998 (35:7998) - INCBIN "gfx/cards/raichu2.8x6.2bpp" + INCBIN "gfx/cards/raichu2.2bpp" INCBIN "gfx/cards/raichu2.pal" Magnemite1CardGfx:: ; d7ca0 (35:7ca0) - INCBIN "gfx/cards/magnemite1.8x6.2bpp" + INCBIN "gfx/cards/magnemite1.2bpp" INCBIN "gfx/cards/magnemite1.pal" SECTION "Card Gfx 6", ROMX Magnemite2CardGfx:: ; d8000 (36:4000) - INCBIN "gfx/cards/magnemite2.8x6.2bpp" + INCBIN "gfx/cards/magnemite2.2bpp" INCBIN "gfx/cards/magnemite2.pal" Magneton1CardGfx:: ; d8308 (36:4308) - INCBIN "gfx/cards/magneton1.8x6.2bpp" + INCBIN "gfx/cards/magneton1.2bpp" INCBIN "gfx/cards/magneton1.pal" Magneton2CardGfx:: ; d8610 (36:4610) - INCBIN "gfx/cards/magneton2.8x6.2bpp" + INCBIN "gfx/cards/magneton2.2bpp" INCBIN "gfx/cards/magneton2.pal" VoltorbCardGfx:: ; d8918 (36:4918) - INCBIN "gfx/cards/voltorb.8x6.2bpp" + INCBIN "gfx/cards/voltorb.2bpp" INCBIN "gfx/cards/voltorb.pal" Electrode1CardGfx:: ; d8c20 (36:4c20) - INCBIN "gfx/cards/electrode1.8x6.2bpp" + INCBIN "gfx/cards/electrode1.2bpp" INCBIN "gfx/cards/electrode1.pal" Electrode2CardGfx:: ; d8f28 (36:4f28) - INCBIN "gfx/cards/electrode2.8x6.2bpp" + INCBIN "gfx/cards/electrode2.2bpp" INCBIN "gfx/cards/electrode2.pal" Electabuzz1CardGfx:: ; d9230 (36:5230) - INCBIN "gfx/cards/electabuzz1.8x6.2bpp" + INCBIN "gfx/cards/electabuzz1.2bpp" INCBIN "gfx/cards/electabuzz1.pal" Electabuzz2CardGfx:: ; d9538 (36:5538) - INCBIN "gfx/cards/electabuzz2.8x6.2bpp" + INCBIN "gfx/cards/electabuzz2.2bpp" INCBIN "gfx/cards/electabuzz2.pal" Jolteon1CardGfx:: ; d9840 (36:5840) - INCBIN "gfx/cards/jolteon1.8x6.2bpp" + INCBIN "gfx/cards/jolteon1.2bpp" INCBIN "gfx/cards/jolteon1.pal" Jolteon2CardGfx:: ; d9b48 (36:5b48) - INCBIN "gfx/cards/jolteon2.8x6.2bpp" + INCBIN "gfx/cards/jolteon2.2bpp" INCBIN "gfx/cards/jolteon2.pal" Zapdos1CardGfx:: ; d9e50 (36:5e50) - INCBIN "gfx/cards/zapdos1.8x6.2bpp" + INCBIN "gfx/cards/zapdos1.2bpp" INCBIN "gfx/cards/zapdos1.pal" Zapdos2CardGfx:: ; da158 (36:6158) - INCBIN "gfx/cards/zapdos2.8x6.2bpp" + INCBIN "gfx/cards/zapdos2.2bpp" INCBIN "gfx/cards/zapdos2.pal" Zapdos3CardGfx:: ; da460 (36:6460) - INCBIN "gfx/cards/zapdos3.8x6.2bpp" + INCBIN "gfx/cards/zapdos3.2bpp" INCBIN "gfx/cards/zapdos3.pal" SandshrewCardGfx:: ; da768 (36:6768) - INCBIN "gfx/cards/sandshrew.8x6.2bpp" + INCBIN "gfx/cards/sandshrew.2bpp" INCBIN "gfx/cards/sandshrew.pal" SandslashCardGfx:: ; daa70 (36:6a70) - INCBIN "gfx/cards/sandslash.8x6.2bpp" + INCBIN "gfx/cards/sandslash.2bpp" INCBIN "gfx/cards/sandslash.pal" DiglettCardGfx:: ; dad78 (36:6d78) - INCBIN "gfx/cards/diglett.8x6.2bpp" + INCBIN "gfx/cards/diglett.2bpp" INCBIN "gfx/cards/diglett.pal" DugtrioCardGfx:: ; db080 (36:7080) - INCBIN "gfx/cards/dugtrio.8x6.2bpp" + INCBIN "gfx/cards/dugtrio.2bpp" INCBIN "gfx/cards/dugtrio.pal" MankeyCardGfx:: ; db388 (36:7388) - INCBIN "gfx/cards/mankey.8x6.2bpp" + INCBIN "gfx/cards/mankey.2bpp" INCBIN "gfx/cards/mankey.pal" PrimeapeCardGfx:: ; db690 (36:7690) - INCBIN "gfx/cards/primeape.8x6.2bpp" + INCBIN "gfx/cards/primeape.2bpp" INCBIN "gfx/cards/primeape.pal" MachopCardGfx:: ; db998 (36:7998) - INCBIN "gfx/cards/machop.8x6.2bpp" + INCBIN "gfx/cards/machop.2bpp" INCBIN "gfx/cards/machop.pal" MachokeCardGfx:: ; dbca0 (36:7ca0) - INCBIN "gfx/cards/machoke.8x6.2bpp" + INCBIN "gfx/cards/machoke.2bpp" INCBIN "gfx/cards/machoke.pal" SECTION "Card Gfx 7", ROMX MachampCardGfx:: ; dc000 (37:4000) - INCBIN "gfx/cards/machamp.8x6.2bpp" + INCBIN "gfx/cards/machamp.2bpp" INCBIN "gfx/cards/machamp.pal" GeodudeCardGfx:: ; dc308 (37:4308) - INCBIN "gfx/cards/geodude.8x6.2bpp" + INCBIN "gfx/cards/geodude.2bpp" INCBIN "gfx/cards/geodude.pal" GravelerCardGfx:: ; dc610 (37:4610) - INCBIN "gfx/cards/graveler.8x6.2bpp" + INCBIN "gfx/cards/graveler.2bpp" INCBIN "gfx/cards/graveler.pal" GolemCardGfx:: ; dc918 (37:4918) - INCBIN "gfx/cards/golem.8x6.2bpp" + INCBIN "gfx/cards/golem.2bpp" INCBIN "gfx/cards/golem.pal" OnixCardGfx:: ; dcc20 (37:4c20) - INCBIN "gfx/cards/onix.8x6.2bpp" + INCBIN "gfx/cards/onix.2bpp" INCBIN "gfx/cards/onix.pal" CuboneCardGfx:: ; dcf28 (37:4f28) - INCBIN "gfx/cards/cubone.8x6.2bpp" + INCBIN "gfx/cards/cubone.2bpp" INCBIN "gfx/cards/cubone.pal" Marowak1CardGfx:: ; dd230 (37:5230) - INCBIN "gfx/cards/marowak1.8x6.2bpp" + INCBIN "gfx/cards/marowak1.2bpp" INCBIN "gfx/cards/marowak1.pal" Marowak2CardGfx:: ; dd538 (37:5538) - INCBIN "gfx/cards/marowak2.8x6.2bpp" + INCBIN "gfx/cards/marowak2.2bpp" INCBIN "gfx/cards/marowak2.pal" HitmonleeCardGfx:: ; dd840 (37:5840) - INCBIN "gfx/cards/hitmonlee.8x6.2bpp" + INCBIN "gfx/cards/hitmonlee.2bpp" INCBIN "gfx/cards/hitmonlee.pal" HitmonchanCardGfx:: ; ddb48 (37:5b48) - INCBIN "gfx/cards/hitmonchan.8x6.2bpp" + INCBIN "gfx/cards/hitmonchan.2bpp" INCBIN "gfx/cards/hitmonchan.pal" RhyhornCardGfx:: ; dde50 (37:5e50) - INCBIN "gfx/cards/rhyhorn.8x6.2bpp" + INCBIN "gfx/cards/rhyhorn.2bpp" INCBIN "gfx/cards/rhyhorn.pal" RhydonCardGfx:: ; de158 (37:6158) - INCBIN "gfx/cards/rhydon.8x6.2bpp" + INCBIN "gfx/cards/rhydon.2bpp" INCBIN "gfx/cards/rhydon.pal" KabutoCardGfx:: ; de460 (37:6460) - INCBIN "gfx/cards/kabuto.8x6.2bpp" + INCBIN "gfx/cards/kabuto.2bpp" INCBIN "gfx/cards/kabuto.pal" KabutopsCardGfx:: ; de768 (37:6768) - INCBIN "gfx/cards/kabutops.8x6.2bpp" + INCBIN "gfx/cards/kabutops.2bpp" INCBIN "gfx/cards/kabutops.pal" AerodactylCardGfx:: ; dea70 (37:6a70) - INCBIN "gfx/cards/aerodactyl.8x6.2bpp" + INCBIN "gfx/cards/aerodactyl.2bpp" INCBIN "gfx/cards/aerodactyl.pal" AbraCardGfx:: ; ded78 (37:6d78) - INCBIN "gfx/cards/abra.8x6.2bpp" + INCBIN "gfx/cards/abra.2bpp" INCBIN "gfx/cards/abra.pal" KadabraCardGfx:: ; df080 (37:7080) - INCBIN "gfx/cards/kadabra.8x6.2bpp" + INCBIN "gfx/cards/kadabra.2bpp" INCBIN "gfx/cards/kadabra.pal" AlakazamCardGfx:: ; df388 (37:7388) - INCBIN "gfx/cards/alakazam.8x6.2bpp" + INCBIN "gfx/cards/alakazam.2bpp" INCBIN "gfx/cards/alakazam.pal" Slowpoke1CardGfx:: ; df690 (37:7690) - INCBIN "gfx/cards/slowpoke1.8x6.2bpp" + INCBIN "gfx/cards/slowpoke1.2bpp" INCBIN "gfx/cards/slowpoke1.pal" Slowpoke2CardGfx:: ; df998 (37:7998) - INCBIN "gfx/cards/slowpoke2.8x6.2bpp" + INCBIN "gfx/cards/slowpoke2.2bpp" INCBIN "gfx/cards/slowpoke2.pal" SlowbroCardGfx:: ; dfca0 (37:7ca0) - INCBIN "gfx/cards/slowbro.8x6.2bpp" + INCBIN "gfx/cards/slowbro.2bpp" INCBIN "gfx/cards/slowbro.pal" SECTION "Card Gfx 8", ROMX Gastly1CardGfx:: ; e0000 (38:4000) - INCBIN "gfx/cards/gastly1.8x6.2bpp" + INCBIN "gfx/cards/gastly1.2bpp" INCBIN "gfx/cards/gastly1.pal" Gastly2CardGfx:: ; e0308 (38:4308) - INCBIN "gfx/cards/gastly2.8x6.2bpp" + INCBIN "gfx/cards/gastly2.2bpp" INCBIN "gfx/cards/gastly2.pal" Haunter1CardGfx:: ; e0610 (38:4610) - INCBIN "gfx/cards/haunter1.8x6.2bpp" + INCBIN "gfx/cards/haunter1.2bpp" INCBIN "gfx/cards/haunter1.pal" Haunter2CardGfx:: ; e0918 (38:4918) - INCBIN "gfx/cards/haunter2.8x6.2bpp" + INCBIN "gfx/cards/haunter2.2bpp" INCBIN "gfx/cards/haunter2.pal" GengarCardGfx:: ; e0c20 (38:4c20) - INCBIN "gfx/cards/gengar.8x6.2bpp" + INCBIN "gfx/cards/gengar.2bpp" INCBIN "gfx/cards/gengar.pal" DrowzeeCardGfx:: ; e0f28 (38:4f28) - INCBIN "gfx/cards/drowzee.8x6.2bpp" + INCBIN "gfx/cards/drowzee.2bpp" INCBIN "gfx/cards/drowzee.pal" HypnoCardGfx:: ; e1230 (38:5230) - INCBIN "gfx/cards/hypno.8x6.2bpp" + INCBIN "gfx/cards/hypno.2bpp" INCBIN "gfx/cards/hypno.pal" MrMimeCardGfx:: ; e1538 (38:5538) - INCBIN "gfx/cards/mrmime.8x6.2bpp" + INCBIN "gfx/cards/mrmime.2bpp" INCBIN "gfx/cards/mrmime.pal" JynxCardGfx:: ; e1840 (38:5840) - INCBIN "gfx/cards/jynx.8x6.2bpp" + INCBIN "gfx/cards/jynx.2bpp" INCBIN "gfx/cards/jynx.pal" Mewtwo1CardGfx:: ; e1b48 (38:5b48) - INCBIN "gfx/cards/mewtwo1.8x6.2bpp" + INCBIN "gfx/cards/mewtwo1.2bpp" INCBIN "gfx/cards/mewtwo1.pal" Mewtwo2CardGfx:: ; e1e50 (38:5e50) - INCBIN "gfx/cards/mewtwo2.8x6.2bpp" + INCBIN "gfx/cards/mewtwo2.2bpp" INCBIN "gfx/cards/mewtwo2.pal" Mewtwo3CardGfx:: ; e2158 (38:6158) - INCBIN "gfx/cards/mewtwo3.8x6.2bpp" + INCBIN "gfx/cards/mewtwo3.2bpp" INCBIN "gfx/cards/mewtwo3.pal" Mew1CardGfx:: ; e2460 (38:6460) - INCBIN "gfx/cards/mew1.8x6.2bpp" + INCBIN "gfx/cards/mew1.2bpp" INCBIN "gfx/cards/mew1.pal" Mew2CardGfx:: ; e2768 (38:6768) - INCBIN "gfx/cards/mew2.8x6.2bpp" + INCBIN "gfx/cards/mew2.2bpp" INCBIN "gfx/cards/mew2.pal" Mew3CardGfx:: ; e2a70 (38:6a70) - INCBIN "gfx/cards/mew3.8x6.2bpp" + INCBIN "gfx/cards/mew3.2bpp" INCBIN "gfx/cards/mew3.pal" PidgeyCardGfx:: ; e2d78 (38:6d78) - INCBIN "gfx/cards/pidgey.8x6.2bpp" + INCBIN "gfx/cards/pidgey.2bpp" INCBIN "gfx/cards/pidgey.pal" PidgeottoCardGfx:: ; e3080 (38:7080) - INCBIN "gfx/cards/pidgeotto.8x6.2bpp" + INCBIN "gfx/cards/pidgeotto.2bpp" INCBIN "gfx/cards/pidgeotto.pal" Pidgeot1CardGfx:: ; e3388 (38:7388) - INCBIN "gfx/cards/pidgeot1.8x6.2bpp" + INCBIN "gfx/cards/pidgeot1.2bpp" INCBIN "gfx/cards/pidgeot1.pal" Pidgeot2CardGfx:: ; e3690 (38:7690) - INCBIN "gfx/cards/pidgeot2.8x6.2bpp" + INCBIN "gfx/cards/pidgeot2.2bpp" INCBIN "gfx/cards/pidgeot2.pal" RattataCardGfx:: ; e3998 (38:7998) - INCBIN "gfx/cards/rattata.8x6.2bpp" + INCBIN "gfx/cards/rattata.2bpp" INCBIN "gfx/cards/rattata.pal" RaticateCardGfx:: ; e3ca0 (38:7ca0) - INCBIN "gfx/cards/raticate.8x6.2bpp" + INCBIN "gfx/cards/raticate.2bpp" INCBIN "gfx/cards/raticate.pal" SECTION "Card Gfx 9", ROMX SpearowCardGfx:: ; e4000 (39:4000) - INCBIN "gfx/cards/spearow.8x6.2bpp" + INCBIN "gfx/cards/spearow.2bpp" INCBIN "gfx/cards/spearow.pal" FearowCardGfx:: ; e4308 (39:4308) - INCBIN "gfx/cards/fearow.8x6.2bpp" + INCBIN "gfx/cards/fearow.2bpp" INCBIN "gfx/cards/fearow.pal" ClefairyCardGfx:: ; e4610 (39:4610) - INCBIN "gfx/cards/clefairy.8x6.2bpp" + INCBIN "gfx/cards/clefairy.2bpp" INCBIN "gfx/cards/clefairy.pal" ClefableCardGfx:: ; e4918 (39:4918) - INCBIN "gfx/cards/clefable.8x6.2bpp" + INCBIN "gfx/cards/clefable.2bpp" INCBIN "gfx/cards/clefable.pal" Jigglypuff1CardGfx:: ; e4c20 (39:4c20) - INCBIN "gfx/cards/jigglypuff1.8x6.2bpp" + INCBIN "gfx/cards/jigglypuff1.2bpp" INCBIN "gfx/cards/jigglypuff1.pal" Jigglypuff2CardGfx:: ; e4f28 (39:4f28) - INCBIN "gfx/cards/jigglypuff2.8x6.2bpp" + INCBIN "gfx/cards/jigglypuff2.2bpp" INCBIN "gfx/cards/jigglypuff2.pal" Jigglypuff3CardGfx:: ; e5230 (39:5230) - INCBIN "gfx/cards/jigglypuff3.8x6.2bpp" + INCBIN "gfx/cards/jigglypuff3.2bpp" INCBIN "gfx/cards/jigglypuff3.pal" WigglytuffCardGfx:: ; e5538 (39:5538) - INCBIN "gfx/cards/wigglytuff.8x6.2bpp" + INCBIN "gfx/cards/wigglytuff.2bpp" INCBIN "gfx/cards/wigglytuff.pal" Meowth1CardGfx:: ; e5840 (39:5840) - INCBIN "gfx/cards/meowth1.8x6.2bpp" + INCBIN "gfx/cards/meowth1.2bpp" INCBIN "gfx/cards/meowth1.pal" Meowth2CardGfx:: ; e5b48 (39:5b48) - INCBIN "gfx/cards/meowth2.8x6.2bpp" + INCBIN "gfx/cards/meowth2.2bpp" INCBIN "gfx/cards/meowth2.pal" PersianCardGfx:: ; e5e50 (39:5e50) - INCBIN "gfx/cards/persian.8x6.2bpp" + INCBIN "gfx/cards/persian.2bpp" INCBIN "gfx/cards/persian.pal" FarfetchdCardGfx:: ; e6158 (39:6158) - INCBIN "gfx/cards/farfetchd.8x6.2bpp" + INCBIN "gfx/cards/farfetchd.2bpp" INCBIN "gfx/cards/farfetchd.pal" DoduoCardGfx:: ; e6460 (39:6460) - INCBIN "gfx/cards/doduo.8x6.2bpp" + INCBIN "gfx/cards/doduo.2bpp" INCBIN "gfx/cards/doduo.pal" DodrioCardGfx:: ; e6768 (39:6768) - INCBIN "gfx/cards/dodrio.8x6.2bpp" + INCBIN "gfx/cards/dodrio.2bpp" INCBIN "gfx/cards/dodrio.pal" LickitungCardGfx:: ; e6a70 (39:6a70) - INCBIN "gfx/cards/lickitung.8x6.2bpp" + INCBIN "gfx/cards/lickitung.2bpp" INCBIN "gfx/cards/lickitung.pal" ChanseyCardGfx:: ; e6d78 (39:6d78) - INCBIN "gfx/cards/chansey.8x6.2bpp" + INCBIN "gfx/cards/chansey.2bpp" INCBIN "gfx/cards/chansey.pal" KangaskhanCardGfx:: ; e7080 (39:7080) - INCBIN "gfx/cards/kangaskhan.8x6.2bpp" + INCBIN "gfx/cards/kangaskhan.2bpp" INCBIN "gfx/cards/kangaskhan.pal" TaurosCardGfx:: ; e7388 (39:7388) - INCBIN "gfx/cards/tauros.8x6.2bpp" + INCBIN "gfx/cards/tauros.2bpp" INCBIN "gfx/cards/tauros.pal" DittoCardGfx:: ; e7690 (39:7690) - INCBIN "gfx/cards/ditto.8x6.2bpp" + INCBIN "gfx/cards/ditto.2bpp" INCBIN "gfx/cards/ditto.pal" EeveeCardGfx:: ; e7998 (39:7998) - INCBIN "gfx/cards/eevee.8x6.2bpp" + INCBIN "gfx/cards/eevee.2bpp" INCBIN "gfx/cards/eevee.pal" PorygonCardGfx:: ; e7ca0 (39:7ca0) - INCBIN "gfx/cards/porygon.8x6.2bpp" + INCBIN "gfx/cards/porygon.2bpp" INCBIN "gfx/cards/porygon.pal" SECTION "Card Gfx 10", ROMX SnorlaxCardGfx:: ; e8000 (3a:4000) - INCBIN "gfx/cards/snorlax.8x6.2bpp" + INCBIN "gfx/cards/snorlax.2bpp" INCBIN "gfx/cards/snorlax.pal" DratiniCardGfx:: ; e8308 (3a:4308) - INCBIN "gfx/cards/dratini.8x6.2bpp" + INCBIN "gfx/cards/dratini.2bpp" INCBIN "gfx/cards/dratini.pal" DragonairCardGfx:: ; e8610 (3a:4610) - INCBIN "gfx/cards/dragonair.8x6.2bpp" + INCBIN "gfx/cards/dragonair.2bpp" INCBIN "gfx/cards/dragonair.pal" Dragonite1CardGfx:: ; e8918 (3a:4918) - INCBIN "gfx/cards/dragonite1.8x6.2bpp" + INCBIN "gfx/cards/dragonite1.2bpp" INCBIN "gfx/cards/dragonite1.pal" Dragonite2CardGfx:: ; e8c20 (3a:4c20) - INCBIN "gfx/cards/dragonite2.8x6.2bpp" + INCBIN "gfx/cards/dragonite2.2bpp" INCBIN "gfx/cards/dragonite2.pal" ProfessorOakCardGfx:: ; e8f28 (3a:4f28) - INCBIN "gfx/cards/professoroak.8x6.2bpp" + INCBIN "gfx/cards/professoroak.2bpp" INCBIN "gfx/cards/professoroak.pal" ImposterProfessorOakCardGfx:: ; e9230 (3a:5230) - INCBIN "gfx/cards/imposterprofessoroak.8x6.2bpp" + INCBIN "gfx/cards/imposterprofessoroak.2bpp" INCBIN "gfx/cards/imposterprofessoroak.pal" BillCardGfx:: ; e9538 (3a:5538) - INCBIN "gfx/cards/bill.8x6.2bpp" + INCBIN "gfx/cards/bill.2bpp" INCBIN "gfx/cards/bill.pal" MrFujiCardGfx:: ; e9840 (3a:5840) - INCBIN "gfx/cards/mrfuji.8x6.2bpp" + INCBIN "gfx/cards/mrfuji.2bpp" INCBIN "gfx/cards/mrfuji.pal" LassCardGfx:: ; e9b48 (3a:5b48) - INCBIN "gfx/cards/lass.8x6.2bpp" + INCBIN "gfx/cards/lass.2bpp" INCBIN "gfx/cards/lass.pal" ImakuniCardGfx:: ; e9e50 (3a:5e50) - INCBIN "gfx/cards/imakuni.8x6.2bpp" + INCBIN "gfx/cards/imakuni.2bpp" INCBIN "gfx/cards/imakuni.pal" PokemonTraderCardGfx:: ; ea158 (3a:6158) - INCBIN "gfx/cards/pokemontrader.8x6.2bpp" + INCBIN "gfx/cards/pokemontrader.2bpp" INCBIN "gfx/cards/pokemontrader.pal" PokemonBreederCardGfx:: ; ea460 (3a:6460) - INCBIN "gfx/cards/pokemonbreeder.8x6.2bpp" + INCBIN "gfx/cards/pokemonbreeder.2bpp" INCBIN "gfx/cards/pokemonbreeder.pal" ClefairyDollCardGfx:: ; ea768 (3a:6768) - INCBIN "gfx/cards/clefairydoll.8x6.2bpp" + INCBIN "gfx/cards/clefairydoll.2bpp" INCBIN "gfx/cards/clefairydoll.pal" MysteriousFossilCardGfx:: ; eaa70 (3a:6a70) - INCBIN "gfx/cards/mysteriousfossil.8x6.2bpp" + INCBIN "gfx/cards/mysteriousfossil.2bpp" INCBIN "gfx/cards/mysteriousfossil.pal" EnergyRetrievalCardGfx:: ; ead78 (3a:6d78) - INCBIN "gfx/cards/energyretrieval.8x6.2bpp" + INCBIN "gfx/cards/energyretrieval.2bpp" INCBIN "gfx/cards/energyretrieval.pal" SuperEnergyRetrievalCardGfx:: ; eb080 (3a:7080) - INCBIN "gfx/cards/superenergyretrieval.8x6.2bpp" + INCBIN "gfx/cards/superenergyretrieval.2bpp" INCBIN "gfx/cards/superenergyretrieval.pal" EnergySearchCardGfx:: ; eb388 (3a:7388) - INCBIN "gfx/cards/energysearch.8x6.2bpp" + INCBIN "gfx/cards/energysearch.2bpp" INCBIN "gfx/cards/energysearch.pal" EnergyRemovalCardGfx:: ; eb690 (3a:7690) - INCBIN "gfx/cards/energyremoval.8x6.2bpp" + INCBIN "gfx/cards/energyremoval.2bpp" INCBIN "gfx/cards/energyremoval.pal" SuperEnergyRemovalCardGfx:: ; eb998 (3a:7998) - INCBIN "gfx/cards/superenergyremoval.8x6.2bpp" + INCBIN "gfx/cards/superenergyremoval.2bpp" INCBIN "gfx/cards/superenergyremoval.pal" SwitchCardGfx:: ; ebca0 (3a:7ca0) - INCBIN "gfx/cards/switch.8x6.2bpp" + INCBIN "gfx/cards/switch.2bpp" INCBIN "gfx/cards/switch.pal" SECTION "Card Gfx 11", ROMX PokemonCenterCardGfx:: ; ec000 (3b:4000) - INCBIN "gfx/cards/pokemoncenter.8x6.2bpp" + INCBIN "gfx/cards/pokemoncenter.2bpp" INCBIN "gfx/cards/pokemoncenter.pal" PokeBallCardGfx:: ; ec308 (3b:4308) - INCBIN "gfx/cards/pokeball.8x6.2bpp" + INCBIN "gfx/cards/pokeball.2bpp" INCBIN "gfx/cards/pokeball.pal" ScoopUpCardGfx:: ; ec610 (3b:4610) - INCBIN "gfx/cards/scoopup.8x6.2bpp" + INCBIN "gfx/cards/scoopup.2bpp" INCBIN "gfx/cards/scoopup.pal" ComputerSearchCardGfx:: ; ec918 (3b:4918) - INCBIN "gfx/cards/computersearch.8x6.2bpp" + INCBIN "gfx/cards/computersearch.2bpp" INCBIN "gfx/cards/computersearch.pal" PokedexCardGfx:: ; ecc20 (3b:4c20) - INCBIN "gfx/cards/pokedex.8x6.2bpp" + INCBIN "gfx/cards/pokedex.2bpp" INCBIN "gfx/cards/pokedex.pal" PlusPowerCardGfx:: ; ecf28 (3b:4f28) - INCBIN "gfx/cards/pluspower.8x6.2bpp" + INCBIN "gfx/cards/pluspower.2bpp" INCBIN "gfx/cards/pluspower.pal" DefenderCardGfx:: ; ed230 (3b:5230) - INCBIN "gfx/cards/defender.8x6.2bpp" + INCBIN "gfx/cards/defender.2bpp" INCBIN "gfx/cards/defender.pal" ItemFinderCardGfx:: ; ed538 (3b:5538) - INCBIN "gfx/cards/itemfinder.8x6.2bpp" + INCBIN "gfx/cards/itemfinder.2bpp" INCBIN "gfx/cards/itemfinder.pal" GustOfWindCardGfx:: ; ed840 (3b:5840) - INCBIN "gfx/cards/gustofwind.8x6.2bpp" + INCBIN "gfx/cards/gustofwind.2bpp" INCBIN "gfx/cards/gustofwind.pal" DevolutionSprayCardGfx:: ; edb48 (3b:5b48) - INCBIN "gfx/cards/devolutionspray.8x6.2bpp" + INCBIN "gfx/cards/devolutionspray.2bpp" INCBIN "gfx/cards/devolutionspray.pal" PotionCardGfx:: ; ede50 (3b:5e50) - INCBIN "gfx/cards/potion.8x6.2bpp" + INCBIN "gfx/cards/potion.2bpp" INCBIN "gfx/cards/potion.pal" SuperPotionCardGfx:: ; ee158 (3b:6158) - INCBIN "gfx/cards/superpotion.8x6.2bpp" + INCBIN "gfx/cards/superpotion.2bpp" INCBIN "gfx/cards/superpotion.pal" FullHealCardGfx:: ; ee460 (3b:6460) - INCBIN "gfx/cards/fullheal.8x6.2bpp" + INCBIN "gfx/cards/fullheal.2bpp" INCBIN "gfx/cards/fullheal.pal" ReviveCardGfx:: ; ee768 (3b:6768) - INCBIN "gfx/cards/revive.8x6.2bpp" + INCBIN "gfx/cards/revive.2bpp" INCBIN "gfx/cards/revive.pal" MaintenanceCardGfx:: ; eea70 (3b:6a70) - INCBIN "gfx/cards/maintenance.8x6.2bpp" + INCBIN "gfx/cards/maintenance.2bpp" INCBIN "gfx/cards/maintenance.pal" PokemonFluteCardGfx:: ; eed78 (3b:6d78) - INCBIN "gfx/cards/pokemonflute.8x6.2bpp" + INCBIN "gfx/cards/pokemonflute.2bpp" INCBIN "gfx/cards/pokemonflute.pal" GamblerCardGfx:: ; ef080 (3b:7080) - INCBIN "gfx/cards/gambler.8x6.2bpp" + INCBIN "gfx/cards/gambler.2bpp" INCBIN "gfx/cards/gambler.pal" RecycleCardGfx:: ; ef388 (3b:7388) - INCBIN "gfx/cards/recycle.8x6.2bpp" + INCBIN "gfx/cards/recycle.2bpp" INCBIN "gfx/cards/recycle.pal" rept $970 diff --git a/src/gfx/booster_packs/colosseum2.t10.png b/src/gfx/booster_packs/colosseum2.png similarity index 100% rename from src/gfx/booster_packs/colosseum2.t10.png rename to src/gfx/booster_packs/colosseum2.png diff --git a/src/gfx/booster_packs/evolution2.t10.png b/src/gfx/booster_packs/evolution2.png similarity index 100% rename from src/gfx/booster_packs/evolution2.t10.png rename to src/gfx/booster_packs/evolution2.png diff --git a/src/gfx/booster_packs/laboratory2.t10.png b/src/gfx/booster_packs/laboratory2.png similarity index 100% rename from src/gfx/booster_packs/laboratory2.t10.png rename to src/gfx/booster_packs/laboratory2.png diff --git a/src/gfx/booster_packs/mystery2.t10.png b/src/gfx/booster_packs/mystery2.png similarity index 100% rename from src/gfx/booster_packs/mystery2.t10.png rename to src/gfx/booster_packs/mystery2.png diff --git a/src/gfx/cardpop/cardpop1.t3.png b/src/gfx/cardpop/cardpop1.png similarity index 100% rename from src/gfx/cardpop/cardpop1.t3.png rename to src/gfx/cardpop/cardpop1.png diff --git a/src/gfx/cardpop/cardpop2.t3.png b/src/gfx/cardpop/cardpop2.png similarity index 100% rename from src/gfx/cardpop/cardpop2.t3.png rename to src/gfx/cardpop/cardpop2.png diff --git a/src/gfx/cardpop/cardpop3.t3.png b/src/gfx/cardpop/cardpop3.png similarity index 100% rename from src/gfx/cardpop/cardpop3.t3.png rename to src/gfx/cardpop/cardpop3.png diff --git a/src/gfx/cards/abra.8x6.png b/src/gfx/cards/abra.8x6.png deleted file mode 100644 index 336068c7dc396b0ccb9453acc93e3ba150ae3904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmVEc_LuDlN)QwUx*noOCm7*NFR6i=&X7=ap3XK2=>zxWd%pK` zeg}TQ{}egzxMYW{2NWwR+!h!}mT*)BNMlP0L6&dJIrLD{7iP`@CVu>tf3whp%bl7c zoN~ETC&wjd!)NtnNAe9qqJ%gOI<^#xpG)^})t3wi4?_Ebd7UcsreN>}3y9$gMRQnz zfnRYs*C-Bscb6XE*ZSh|;W)>qeT&jd_~%gP%kKg;3aa)Lo$eC>2*=&L;p0P)czejC z0#_q2#fO8zYr&ukl?ue(2n;^Ltu)z_iV0ynj1(N*lN+fz_Qx+91N;{bWk2ehpkoMrl)b3=Q$8@!|1bl@b?sS-k-?P!7wcr4N+0rIQIX z(%|a}_HMRziP9Fw*a{CQSNsfp;Xzw!Y6tdZIySjGr=R8rBPq55J6ocR#gysiJovmR8p`9a?jeRu5Sxd61rBY{97&DNVNL z8=-rQecO=SW*W`Z>9`|wi?I<&QZz}o*x$T^dX%iL-56ZgC{D;7%`31#WV8w*LI$*;kAiadIwLP(HK@GaCgwv>^+XR=r9AbEw5RDP3- z13s_l@>+A7tcxg8)Z;OCiLQd89MD#J+#sTXD00082Nkl{%JRAM>!JM{I@h@ukL#7V+z z=gO{NLEP2uEZj@F5$1yi4XLfR;BI!qKiBR4I#(sCFPxX}`JB%=55EKWUtl|QPn5%Q z7Ey}hs*r#THBc5_LNsHE1?O6*uniwXkq@zmTHg6K zyZ&v5pwv!j_-D98O8A&`FJg4FU%Tc0tEkWM+8_s+fM++Vb5$yQmmtHgc&-y$?!&^y zFLtfpX6v@G`15CR;|2b4@bznV5f>#`-cyVUpS-Aj78v1YkD#`3cZx@R>VTB3+v9oS z@rbx0p*rY*jGr@!U`qDv5|5#wIYv=%jFo7qMe2UQS(8UoNGHD6}M31CEVdvy!k&VRI$ z&fZw@X`QG5gX4A5N(Or4J48)oMQJ#nw2-CVcq=Q+EdX_)yh?~=e1~w~0XR~o2uWf$ z&F7fI{Q#g#QKW)JP+ikTh~j2t#iPFRf)qk|Y`O{(s6x?VAFjX0FA2?MgjtN71fwJE z>%^2*y^auRf?AWpN9q8ebnBfD@?w)|_1Qx^?p>^#y*PA9ak3-rc09yKc+MK*=m*{O9pa77NNW7LI=&@9q^`m*02P{lx8pX8iF zQtZKCazqs;Ih|NT%&!Cmq-tiA&AN4P$w?xFX2rH3K!qj3->?Y<2PKz V)vD*bq3Hks002ovPDHLkV1mmzZDard literal 0 HcmV?d00001 diff --git a/src/gfx/cards/aerodactyl.8x6.png b/src/gfx/cards/aerodactyl.8x6.png deleted file mode 100644 index f250570234e1dd95f538b0169a6e6f5141efc632..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVF=R-Tngy~;k> zr!GYqkUBT2t1gi^2m?a~29|6{2qbP|Eb4NW8zo5Z;<&`>(x@=PfL`QAFqoPhz7P1n zg+b(c%R_3pRksQ_V3OI6maq{P08Bg^g@lM$A}hi<91@(rr=3EO5uBp};5{+D$M-Rg z<&3*pq5^TZrGaw!rBepFKsDX+lrURi@39G{l%kUMy|!{j&9%vTa31wxrD?C`8WAYf z4$f-#A=jpHH+J-e3!Gi11CY^^R%IJ}K!Y&htFHk0&)G#{>OJ#|X}6*QHb}Vr#`@H{ z=0p`My#Y~UyNsS?(OXKyH>jTngI~HI4;xFt@JC~dj=~n1h+(= zs;HlKCo_N;RzQ1+nHR1rWl*L2Gz7*%iXTzu~XzZga|> zhidO3F8~Y)ql?GUahU9i6TtTVzWw8(`KtGBs2)Dbz63cbaJ=a3Dz-?5Vg(=^S^4r} z>Uv@OxduSk(lSUICC`hi>w(4(mFeIEwp#?vAF72Mjs05@>+#oMoYK96Xa0W^DxZ-Wn7F>D(LG{e$wJ~qbDD*p^0 p`qsv;sAd58RrkaO0A%>De*u{#^}f?qu9*M;002ovPDHLkV1laCWIO-> diff --git a/src/gfx/cards/aerodactyl.pal b/src/gfx/cards/aerodactyl.pal deleted file mode 100644 index 40075fb19c43e47ae9642c049a2d90c8582dbb91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmdm$CB@KVz#sqs3@QQ( diff --git a/src/gfx/cards/aerodactyl.png b/src/gfx/cards/aerodactyl.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bbc9e49bd4f12bd0788eabe464d75c9c27db5d GIT binary patch literal 810 zcmV+_1J(SAP)0008LNkl347 zF>D)E90%Y(cmSnVP7E+Yl`fS-9p|1zqSW#&6&;z31VUoV!oZM$fxsbUsp=}7D=|cL zsm|8f>Q!pw7x}Kf1?8Uogeo@Di^789%lXP4ESks*-~XXPv?XT zd6*X&3sE4jKrp;&GtgRiA#5wCP^P2RzgcDp-9)x!fn-nAp2%G^ys#=$7SaOZ>4*X5 z<;~2Dm_>8vDB;353VQdAsHPMxoNhAYS#x|=KaE!XE|reco27<`I3Gr9v&R&k)x5r! zv6U29TXs66oA*YGL&%Pb0#}~jAcXI(t+>XtXMAc5M}CJ+bZ~gB{H1)8`HRw7$q8tL zy7JgCmd>62lY0iK9~;$*Ob!mZ{n9zVo)aLLwP`v|y67$r_YAtYC1feOiu+xsU$26+ zky~Jio4T%>9y3M7#xwglGgrHdA?E{TQ3+_B2c1#tsk<+PLGi2jl=a88{C2?i9!iUV zmd+L3_csG~Uu=Mi%UShMN!WB58oAn2JnXVcT`G|NJrngXO~RH$@J@bZUgJ+h6)dJ=qdoK`Ljb)_S|`W!#$z4}|Qmmbcz+drR}l z%aDO0#l!4HyM3gzr7H{+{v>xBFWMgtP(hK)m?SFL9NhVQ5THb6fe=rwrmsKv=xj1U zc@cvE6g$uEe66esuv375S9p2ro$q?F^i^PklzkW9M1PJv6a{vaO;;bsIBEFj@@M=J omnWal+y)?*`WprQXA|D?AMBY2VjEd+_5c6?07*qoM6N<$g1Ik!$p8QV literal 0 HcmV?d00001 diff --git a/src/gfx/cards/alakazam.8x6.png b/src/gfx/cards/alakazam.8x6.png deleted file mode 100644 index de51bc8621798d95701fdb319e5879f0c7b80511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmVd*Vyflecxn)5h7jxfkrX2*(?}{%{%d1gc{An z*=Uqp1YKI_CEZI8f?}drsx);~ST8NOTFtc=PcktHwl&RC=v7ceFgYd0Q;4pf^?C3a zPjo0n3&FVfnbE|300J&`HHd+`9cC+l1nAHCMZyAG7*6LP9h#{=6BdBZTj1$reSKf~e1T{J;)2n26Af!ewy-ul z2hnDP?%n#@;{M^hnhOx_ujQusdBhfp-Lk+Ep1SUlb~ZFUMHIicRz z;Jr%a)Wj2Op=cHockp%b*tcHoKfy;2UA*D_^M>rs0K?+Hm#j>z(Ks2-pSeg!}$h z|GvvV*MB+!vVf76zPn9FgG-NwA}|28qwjC_BzsSPmycjAn7O_0_v%U(XEWif03d3Q z6OJF(Xr&NafDLE=&qXQcKuAG`@sTYRa*lCY53j&i1)I!R6uXe=!Sx?=00{3!Q{66M z_RD(HH4p^3AEKU!_3sevcT5_D6aSPu$^jNe7I)pjeTW%N?pUhE!NSP%p#hu$QR&Ub zsp>2iZl_#dEsSK}UQ9Y6YPZU(v0)$>ZQka;LpU=z4sW;s@tnsSYrIMS{iQoLtscm- lp9Ox4yK?dL$>9-v>H{J}#5s4T={*1d002ovPDHLkV1mS@TV4PF diff --git a/src/gfx/cards/alakazam.pal b/src/gfx/cards/alakazam.pal deleted file mode 100644 index 9905df9855290ff11c07f91cd798bb6daa6796f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezG9M3#ekc9yN4y^)D diff --git a/src/gfx/cards/alakazam.png b/src/gfx/cards/alakazam.png new file mode 100644 index 0000000000000000000000000000000000000000..099fd6603f2c7aae2d7d64f0947c172b00281d2e GIT binary patch literal 806 zcmV+>1KIqEP)0008HNkl347 zO=w(Y6b9hahOCUqswot);I<$WQ-5gETwHb2ZCcwY=*EGzqme3#CenfnH)A$J%P6=B zHkui8W1}GRHTT2@B1|T8Q?wP@+K~o~WRi0xT*t;aH{a{N&qH_uHHBwerhwpr-uK)%zSK)Lij`WjL zRfmovJW`}`70%}agqdz)eG3`zVS$T?=YGDg)liw-TlAJ zRM=l8(K}9)*Jv~wtDw^)a~t5+T6b;t~E2y3qWveTl(9-J5hPpmB6GPf@2HEmOD4S7f}N9ZmP}eS>6boVc<}B*eRa?`1Y{Qa+Ca}*HT5hGcLW}AO0$ia~O?|rgLoZ@xQeU4e2MJ_kuItk(K!*KOt(C+u^bhS^ zf{~#5S$Vmv{8EVZbG|`_Z(hvb$wwHN?*IK9PLuel_Wc9dAR3rHJUfps$*l17OCQzB`m#~)|(Z+_vOmB4Q{$(+VD k;EiCl8jM_@nI=5pe`AU`=S^0{{Qv*}07*qoM6N<$g1u#cOaK4? literal 0 HcmV?d00001 diff --git a/src/gfx/cards/arbok.8x6.png b/src/gfx/cards/arbok.8x6.png deleted file mode 100644 index 4d0bccb355a34a6486c33eabc6fb2b9e0fc3b64a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmV-F1Hk-=P)V0;bqG{p#6N@Q<}VE>O6WU)+Jt^$&azp+=Xvf zgGl5o2A=N%qLUkYERR0bA_qJnPc*izkNc1)+Eea6uXvFzd|jt`^d%BaaPCfSIb0Yl z1>;B*X4?%NfoxfCS4*Ob-t@U$?ZOkewQ7a4(bO8m-2A3-%`iA>uaqZq%aBN8NRu_~ z;~(d~sDv+z5S0g!DqV_PABd(*L8lN$PpL=Vqv6>H{&g!j9)$Ga@k)NgCtSN9c3&zc z1?e2}bfx;*W;2UGtHdCV4&NPP{Yyr}dA`H_LBZ4eev#eY(lUX@OL3@zFq{A7H|6%0 z@kz3=zxVzcqS>jp4`=(=V`q+kdd0n>AR>(Rc(UnBkz{Xb!u|6R;!@|EkYq7@LK;tf zk7GC@a9nz&C>JCO;q-0>36gq#Z>s`L3b=p0)~cY3VesC&)A2WgJLyb#S4KM_umAmB z+3r6hdpo6P74Q@t`)zma?$66@OFvzdK?pyZoNC+d{>UU%CsBc*$oSc%Cr;KJR^MEa zA$g}mx4K<=F*iuw8k&*8Yv-}yEV_ki01JDy3`n2Be|Z##uBuJ!)mIQPpBIih}`Q_$l{P`NsX#h}1q{I6B`* z1W(H7NWP-Q_CI6j@T6Ga5x_Za?fS!a7+!6H+o1p!l8^rhJoJHdyRGa00091Nkl347 zQD_rq902gYDHhu40)q-;*f-~cFoQ~`Y;rzr3`INGotR^-_;A6THn@jDtu%!`$@<_+ zV=p(_f@`wm)}Abc)_kmAwCJcxTNq7D9kpyr>fJS8GD;eAcgZpC?OC0 z{=_BzQes*LJ0z-z4N+`J-wN@D2uAo-gplcp^?Bi!j#yEK@<6_hSX0%eaCL7mLZLiU zDlt|ZUuS}{HyEuzgACLWckbq!k*PDH?7-S|kLl>+@mUfXz4J|91#$_2pyO;J7N@#f zNgP&HfxXi#H;aW1d8Q7zC_f1;j@H0*?7W}GVKtZYq6_Vb0VB2)spKIS8{3g&tR}%v8Yq^+_l`U$?IuH(-w@Qeaz)&CSf}?pSIF z(GwwH%`KdsB`brHkK5Po9-`pT<28$%?Nm}#-yUl*1O^%T{IGVmQ@WM)wY2`;3&rH* zU$2rYJ%#&Ee!K?PG$`3~>&;~PW+}UtnTAh}K;GQ?8%^CZ9-A|nukabXv|TsdAJte@^88skEn4Mw<>hjQzX+>oC7^UvF%gABDi7 zxZSdQn%}q)-W@!3TL;FRx$NX_$Hvbh3v#&-*qV+ffj)i|;E2DgUk9@>QNFMN^mby2 zy;vOA!BOsFH#Y>aU=@d311VsulJnhjd~;Rx!k2~UHaI*_hY!l$Px}4_sagBpz#DxRy0qq=oCY1ue5qLi0%T*rfxSjo9DYX1R zV7r+i)gy>52Z75+pAvZOMYo+I;&Arh2i2o>U>o2`&ie^{!=dY?d9Vm36`l`L90HG) zz6drmYy3L`OYoAvd=U`Q=EYhs;waC{WESu}ZvlrD?B=XgQEmVL002ovPDHLkV1l2w BmDB(L literal 0 HcmV?d00001 diff --git a/src/gfx/cards/arcanine1.8x6.png b/src/gfx/cards/arcanine1.8x6.png deleted file mode 100644 index 31cb8b0efb2e80b8741b699a304d3f2f3e7e2cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmV6k=Kbzb$>K`e{;tA03$ zwc@1d#*wa*kkXKf?Yd}&qCHg73%d!W5rk2q6BiOxh=x(hL3cZ2ecT*85B{-yAb&Qt zF+ueVf0Q2?@8U9%g}=%Z2bid5EFuKQFDj7*$b#c9wO7p9YMCYYKbDSuBrcWO)wGa2)v6g8`B(X>HM=bwa1^241}R{N+q%t!EDtrLkhst#f6@m+gRI?kM0`IMkayulyX$Dm`0Q@m8lan12&mkbA||n32^f4tdJwn*T}amSWx~opwRV zO)De$-1U8O%($VG1*vbEkNDo}F7@;lPbUlV{zH{okV{3>Jv*+rJ1wAjw{y?;B68$X z-9?wuKvPm%8eC6=Vu=m5yE6`{zxA-@zwYK}th=C78q&dJVKP6skM~eXmrHR-nPlOu z=eQL;m*(0;7D}3vgI&4Kc=m$7$tJQOH@1ygp7X>TTXo8zgat{}PI2Q{EEm0F%xmmU zLk?{|Ipgu|l;_<4XpPQ{Lt+b*@WZ3)4ZW?$da9&>&}J#xS}Ae2rF3)%Kxn-t>&Zvb zR%)1>453JNEO&Q9b(E+j%u%$UddD`RM>?a1?+ity>!L!?(5Mh(2^5vGC}XUB8!Lhk qfIOrNAxIQ){KDE@_6Gn7|MwFkB_Ru--T5B?00000008INkl347 zZD>t#90&04|98(7Ij4L6y12aZ@Pd|Xb`DbG{+Itmp0+#{FI*9Mm?jS?$~h}kUCf&`cev|d<>$IJb7PMnYvd>fkA|3p2)RN-C35)Tz_|-Hk8>LU zeQCLe@p|7TrCzC=0w@e|z4_zAlI1h&s*>+BITe4QmEZy5vra(BxK!x7SP31Mi?s@q)dR9M^Zb6)!(~1lrDS6Evy~^qzK=sYBo(E7qXfHe4hvW5)^OuN=2q@7W z*tDqFwWl6d8;~W#7or%*$&bA6eIQA$>4YBeCZirSFFet&% zjiP?p6SRGO0)WD~$L#Zwv(7_VVO}Nz#m&_EZA@=VFvSfpMPQ$ru0%6#u+DVE5V;gJ z$8HDgrS7b@SnMLp5-N%ZMQo~zwT3V=a0$m<I zS1v?sAWO`8lJM8mh(cymlgI5w3LlIKQ^gI)d-3Eu1&~p(@n&Y!?k)nIecuTXzBRBz zL#Z|;5l@u@1UnpJahU5gr%M_jUZR@OU?oGXL! literal 0 HcmV?d00001 diff --git a/src/gfx/cards/arcanine2.8x6.png b/src/gfx/cards/arcanine2.8x6.png deleted file mode 100644 index 64fc0bd3eea6062056a5590d0ceebaaab83d0b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 772 zcmV+f1N;1mP)%_B>+#YciW`R$9y-P@HFor^b@n}2S0qJ*Yi z;G&7H+id;tL)Oqxg31OLYZJ$yVNynug-k0%L&V}lNXC+qJQW(`uu?ISrp}UP1_Fxu z2+m_OlZ_1}bSgeXrC)fkflMz1Rx3aXMS&;zK99yG2`pEvKKLGYlQJui0PiEHC?UFP z1_K95mi(-0gx54WYC(0FJ~@5ePtP8 z;z@^bZ8!|IvAe`^ELXs{7}Cr9K5D1yL*b8d4w|NeN=}Rg@_*_ zQJ$kps2flLh1nSVdV>G}h+S#PtCeq)6I00000008KNklSZ)X9EVvLh@XS)+OXm7ZU4@-H_zKS{Qh6(Z~)INV3RZcXXpHWKlKmR z^iB=K1|9Oqx}8#b&*`Gn3oI0xPCJi)x+aP>baECLrPlytv{S`#Dt7(%Qvku+dXJ_g zR4at`=(ZyJ;*>zBwZukfI?+p`arfKyg|-yvAV@AQc4$YXvVa#g8ALUq zwsX-rUX3yYG!RH!utH=2aE`|{aHxS(A)^~?HZdSbBp`SpsVdL$7i<$vY**u_qAsGJ zhlX|_k}KI|1Lks?Jjta25ZhR?$7c1x_s|^Bh>In89|={B(=H*AY*0Pye-)}6yPYM# zqZ;;@i?!}5HkUP08H{4Bf* nST3WYqhX*97+x5Lv)|(%(q)Zp$6ma+00000NkvXXu0mjf_&swz literal 0 HcmV?d00001 diff --git a/src/gfx/cards/articuno1.8x6.png b/src/gfx/cards/articuno1.8x6.png deleted file mode 100644 index f9c54c44f963261db75762dbdbfd48573b3b34f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)yD6IlQU@NY70e60^B6th@=z_X2l8u2+JYsIlMRjUXkO>CYT zg(7NZcdLipzhDO|B06A#4Vd=QL##RqS}ztUI8wE(PSb-2kG5);wTIU zmQfb!9C4;CM?8uKRR!TSeh}7M$Fo9cMLA_E`&*brPg8pQ_s!F833LoNUbll&UEKa-VT%EwD*W(SERggsXNzu>f8K@KF{(&7YkiW z>0IG_tzHZkO`tVaIjX0#;%1w$e^EjL_=V%ayKJv9FY<%q6d<*c+}U@fUzf@!3Ym)m z0NyOt=~pLag(wbU4*}ChL}zlU&Jea8oBfyqXmdGB{FkF5-!aVZ5fH^Mee&dh(|e0_zleme*3v{?1uSa1psx-+UA|F z@5Z{E_Y%?p>Y%r6+FtouoHiOAm7ocr^sr}NvdP3;0zMdFy4<~38QQSLs280ab=wi{ z+W&0irycPZrOI&*5OAe^@&3>TwXr&qb-`E@F#F8An;KuLde>b5fLi;jGPF_oR;o0+ z03-cUdHUqxrIk15E)+O02BUExoPT)n$LY?j;AmoGVh(EC=!3nK-vCmJ4(c=V8bE2gwX!lP+YcvlDgb8k&t_AUN06`-8L0!P*5d9yI}g-U7xz9e-Mbi~so- X!O;YHbd%`000000NkvXXu0mjfUMzCK diff --git a/src/gfx/cards/articuno1.pal b/src/gfx/cards/articuno1.pal deleted file mode 100644 index a7ba53f0..00000000 --- a/src/gfx/cards/articuno1.pal +++ /dev/null @@ -1 +0,0 @@ -ú¬~„U€ \ No newline at end of file diff --git a/src/gfx/cards/articuno1.png b/src/gfx/cards/articuno1.png new file mode 100644 index 0000000000000000000000000000000000000000..e03d8214939d96103d3a2bc96afbd2ac89a91a7c GIT binary patch literal 847 zcmV-V1F-ywP)0008wNkl347 z&u)hQcgR8P-w4m z7=H2`1wd>9I!q0|`HVw}?mSj1S-z_CY26=xNX@tdk4r90$oR$9I6Zn_ZwoEtXo{$- zV@cYKVe7j~O7=jNJ?Y}nV$n)V3J+&j z2CD4#OW|O{^`KMjL1ATJuJrv;t%QH##6z03DrNY;# zEjF3=K`X7yk72dUjxRI!^F&hwvvAqiUA_?Xvf|{h1gX?m>HO~8XWiLLg~~Yt1ir=| zhNp-68Ou-Nh9VJ;v4#4c?SQ#%tN+y+L9S)X%6w~-6&J_(hl*5U7D`<1?`7`AnkhJm z)iB2r@8tgCRBH%LjpRn^r$Y7ogVTS0%Y$Z{lMi!q?dMOw$oz1^e~kc=j-R@Fd*6}P zyz{ya-63ovT>kq`=K1_!u;Ijt)&VK6SngR@4fQo(l29VlZ}wy+?*A2Ru?0@scc9(+ z<-pjNzc=5`WiE4q0#BBD4o}>VH_~Hen}k>g`VUw~YQx=W>!eNiUz~a&GjT83k;|;v z1fiz&j9zAru-q@=25s=j4ofTuR zWh_=$48ke<>azf9Jr1@i`YD2xOCHf)ed$W06ayrD{<6Q`<{dP=MDJ`9WHf66u{LL> zH9!!Y(OHF$o#>cm$fh$wz|E=v5c1&6JfxudYBb-zE3QSGq2O&F1ju8+2&7{UMzBG6 Z%74S{_@|1Q@^SzG002ovPDHLkV1gO|oyhAhb z;6>0zGmR)eXvHeM%AA2a+63*Q+VG5qI&*pi1@FpK0xjqAOjLIEKE2bf>b-k^{Lk~8 z_Y2_PQG^FWp2P}DQ3f)}W--J$MOZ`}W-xBsvF%xqQ%(DkdKma@+sA%{P!Y_{#~t>G z&Q}}JyrLW5q?=xR&Y-GO8%d5=4Vu4`GYl%C8CK2`6{4qZsfjY)1#uyvp0yn}dt=<| zeTdv$j04YYD=qtg81^&hFDg+s{e{solqYzhBz4Vt0P-whu)B~NYK#Mw(?=LMRF`y? z>-*phUn5dB@AawO51~{LP^i)pNoQ9rM%OtgxhLS}6jv0agR@r69tU~#VS>L$stweg z;a{N~RLUCm6H(tZ+L6dCQK6`@{v0-5m>6r60ZRb#$6Qy-1)|orca$RO0x<3-T@huv ztnKToOj1BHLd zT*FakJ7J5E+BisTPUGKRrp~EO23ri0te?{OfnOZ~iEYCd11s9Nm;0f|+H3(-;tAR^z}7TZ?D3Kp!OQCsk=aEvLTD5XRgM$+ zF3@Q<;u55L%tL-$NBr zhi1Mkn4;ucvb%1u(_h~-k+x!KOApEq6?H@L8l3Ioye1tXyKTeF5}uFeEK(;VYiK`l zxxMUK%Fw7h3%W3{?=P!>FMJJiRVc-u?A>;@Qi0VvEw<;^La>>Ck_# Z;|~NssIJ!0008gNkl347 zTS!xJ90&04|9Ae`y4cP{#Z=P5FiA*TVT856Y!O7|d8j1wA*l$8K#QWnXyhKcP((NK zsS5;ALRx_s#`&8opUg$r^}&tIE}EWs$#iG?m-JMh4^#M02!Cm-5M&G*!UOP1o=q48Q_Ayyf!A|&>(@Ov73Ol`l^@Aof-iMpFfR1WSwJe9tgnr(J!R{l3Wt= zK$y1X9H6FZFd6U@rnT&o06MD?(+L36tZV@34ZN-b|q#teqVnnr|TU#gi!H^ zUckz1{iX+fMC*Xi;T}D|@bk(YgHh1jtZr$&yAWQY6UvXprG^B6`UBqbf&;E8oGUNyYhoa)8c%nE%D=ROQHoA&bBv#RV!Z=eP3VEe7YPWME7>&edtZ)sdhi}^wZ zf1m#BUSh+EutD}fRF@^yef`Dwx^i>0iE|&>eEVMKq(zl`KC}shpsCC8Hr3-)_QLe7 z8d-YA@Z|Le0>x}*hiBN}x)n>-B4<8gscXSdqtQfTB6ajuZ5B#{KAU4ya9d{CTHnGN zU#6_I%iBkY!PhjOmCIp^ffsW@3eN7N-AE+oLT}3%)S1G+egnElDg3`7e0cx>002ov JPDHLkV1mr`gyjGL literal 0 HcmV?d00001 diff --git a/src/gfx/cards/beedrill.8x6.png b/src/gfx/cards/beedrill.8x6.png deleted file mode 100644 index ec6af50e58337b3ebc947263a42753088152f80b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 825 zcmV-91IGM`P)p0(N4KvCBC{ZHX7($~XaW8F5KZ46qfyGeOJuA0D z%?{?B82wM-%zvlG~(;nYiL|kbZrCR$8bLNltYj5^KRbZEoRyV(E+MBHTx@x$F zNJu|2yf3h-`-^nyB?nM)`k%4kKNlwDrMfFRBQPBY|D)hwq$@;!vPX$B-Sd0yx4+fz zx|@CI*V_o}VDGuJt#c0bnIke}Q1Xe9Xoj-RiOf5kBvLs?)utrQmo^NPKirt;k*%{y z`d)MHz}l8Ey5%JE^ovG9m2fuNMZjT1u4qE+$L7>=U9{jqb&2ld|{c_-@lJ=o!0jfZPE^V-s(@+wD_D9Q*=gL z2W$;1`~hR#UwJx^C1Po8Egg`ZOtI83y(Xx~EPVbe+D-v*53a8SN&Amq`NQ?a?5?c+ zDpw>_j6dC2ynJZR&5Bf?e*<@+uT*9&yzF`j$p;6DH|s!wC-G)yvFZI8^1|&iD+t8$ z7O~`ov;VNfiXjCA!gG9k`^2X5v~bd2Bg=lHuuP@%p7001BW)Xf$`00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008`Nkl2$~ ze`u6-90&0C_w#(mmUrWxhdn20sTtGC9l7aAeMA#{b9>s z{SmQ?5o{C|F4vyZJrBFvt?qmK_P4JWQ+N~&Y|nes zQ`SXyTD3DqHDpLrH;nK6{_B$fRFZh72dgF!o0I3l_0R<-)GtcPBfVcK8F-xO&3u6p zUZJsJvFVOY`cJRBL^{hjQ+~&Fd-%iWMqi8r^Xi|AL-92`7v9Y^uQJ;-VqgV?#A>&< z^-4JMq<~TncQojH2kVNO|T6EkD;_bowDR1vxd}-^6T1LFI0}T_7%~P?|_ZEYVjyX>iDVSOY>(Ar_l1(G0gWen| zM5OrjOWrG%;*tiBd!c9TB^mpr>gu$}%Yiug_dYYPp1ygiyJ$o_mG?+D;GObjkD#jc zr*b=j#D7kllq=YFPh~1u`7-Badv@sobnXP8?>{~c3Kw?2wm~l@%v8{PLYv_P(ROp) zuE2$an}}DxT^oekJ3n-JW2jWAFuUIGaiM1aTf6Y6ZWz|>s3x@&oMtDoQj=)`O z92fxny?$&aN-jc17MKHco)0f~=nrq;qf!?nP+%e^5<~|DA56jl{!MKj4Y$yuZ$1CK v09bf%cyelUxr00000NkvXXu0mjf_R5-} literal 0 HcmV?d00001 diff --git a/src/gfx/cards/bellsprout.8x6.png b/src/gfx/cards/bellsprout.8x6.png deleted file mode 100644 index 6dd629702e3b0b0773742b07675c878d9b9fe4e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)DW`K~yNuZIaDT6Hye!Z>2-T7~o-xDY}4wjj%AdfJ9h`I77ms#^T(TnGzGU zebB~eV&aM|`~e21_JJEs+jJh-1``wPppf_xG%>DN823gCPKyf{P#GVn8{=7?{BrKi zxfkGHHLAoDqB_;{cG+>9Do8Pq5gBslKvk&23xs%$WWusmomFQAU{sQ4G}IRU60Sx< z+%!aAl=FLzvsXO`RuYV~<<`EP=>JZw_p zq4<(8qPug;;2xYFLe%uNL!8a>{VC1p!(ev4OU=?NrG!|lNfd@SmX>_%l9|szo6nDO zC^XTjN@{=7%0X9D7hB-fwVFze%|u2E=?cctD+(>tm#CcvzoB6U(cauEoH2Dl_@+k{ zRl!wf=fU}Gq?iK#^tgsfq*B8x@RJ{8kS;xUEXv;8XYeXlqW# zac#QJASW%3@NRf$-S(`df!K|>wr26300b}`mMZ}%|fk;Ml}^Op5m z)!35&ss}IWx9zgmo4~QzU?UJ=oUp8AIb^c?9c%Dk{Q@qLNr}C$!R!D4002ovPDHLk FV1gUhao_*| diff --git a/src/gfx/cards/bellsprout.pal b/src/gfx/cards/bellsprout.pal deleted file mode 100644 index ede7e7ba26e560cf797edcd064fa3317cedbe611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmewr9?!gjseu6i5GVrP diff --git a/src/gfx/cards/bellsprout.png b/src/gfx/cards/bellsprout.png new file mode 100644 index 0000000000000000000000000000000000000000..044fd5b9521fc14a7ba3402bd4340c117f9973dd GIT binary patch literal 817 zcmV-11J3-3P)~800002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008SNkl9M#J;wOm2T2LU#ng^$1fkgGkj+T#Fm0Zi#H0)U`AN+ z0e}bGjBpSs64)#ctl$gI>v}S!s$I|p-5@4hXUIge|39(5$a#|$*lAz54WP{f8_ssh zG<G?N__nLG6Kt5KSk8DJ8rC_;v&5e1W@#oEr2B*dqzitOz%Tq$9Mf zEcwIxp!sOld1RW5c}9YRMA;3^r-@2g!vSN5pTzwn0{l~oH)D+Dj%Xx)AQ%A=o3I@n zvA-H22|wwBrf$q#*J+VALxPR^Wie0 zX#~~?9V8oF=COvw=#?oe${zYtas= ziFVH0B3`kLY@^YOHkU!g_8o@d@@32+U4 z496MEtkc9wi6ns6(rEUc8R%YR?EXDA3a&X|S@5geuy0Lb{&Nhr z-(4*|hN^{lc9#@%lhU1~3QQOIymEtopE;OhnXgj#?bsv1PRz}8nmRuFDWJw>I9WS& zY(HZTKP+I@&Z!sTs2zQax>b2Elb$c3wR!7RMe)_^ vDI6axE($J%Z>rkk6f}BuCh+$gw!X(7S3I+q`C@Wa00000NkvXXu0mjf2rG8L literal 0 HcmV?d00001 diff --git a/src/gfx/cards/bill.8x6.png b/src/gfx/cards/bill.8x6.png deleted file mode 100644 index f730116013de55cd174f3605e3d65469113674c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519 zcmV+i0{H!jP)R(M?H;27^#=>~->^iFF|4a>G5}oO6TF>dEDEhg-Dn=)@$HI2yw6 z=P-0gspIOV8Nd4f8~;XfvD&X_A*{@|6^iezQ0%GnBbw{+s)(`whr$4+KO>>21>lK+ z=q#oT__s-#fbF2gBhFq z@8X2wc2#Dfl$TKluP=}@ZX|md!$5!_Holi4DK%-=LbKNbZ9Qk>y;y5IRW*t*8oA#? z<**WC%I<}HJxO_aJO#xc=G(uN{ZlASg;Zi#VWJ`sT95alWBC|^lqAN!HXe>ZkOAaD zl-Nh5l35Cza??i=t&Qw+RKd)1b;B%2lDJsJ4^woSKwZ@8oY6f&K4LC zxfi}l7GMBBO$WSUc64=v!KH_pYZ`r2s`s3tE(gDd=LTL@&o}%f_qaOCU@HIs002ov JPDHLkV1n=t=LrA+ diff --git a/src/gfx/cards/bill.pal b/src/gfx/cards/bill.pal deleted file mode 100644 index aab40250b66bba7ef1a2946306a69893cff2b527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#K8ryhlYs#M4|oD< diff --git a/src/gfx/cards/bill.png b/src/gfx/cards/bill.png new file mode 100644 index 0000000000000000000000000000000000000000..d915777270d8146bf2106d6dc1d0ea1099762863 GIT binary patch literal 556 zcmV+{0@MA8P)0005MNkl_+i3M2a^>UH4JE>LZ-7%T^{T-6Tf0 z3OPmuF4LYOESj%Kf1rfc$DC5S0OV#}~~-lrno)NK)uFM1>hp zvd}z(Qo>7C{=%7b(CCI=K6Z(cOHj0_M@Y-?MPFd76Gd%Egy=?0+0|irO%}12Y-6$O z=yoEp=|1A7cI*Y|JV%{HOsQQ}*&U5IG1U=L=R-SeSpJN}{MTtBvATg|FX83roG#Oz zSZv38DMHx=KQ^|P5gE2{UG{Q&W86HLMthNe=GR6TVK{R7?)8Jpi72yM>#~sWa{K@$ zS9)!%DQ^!j%)5!isEHiYCAbsqMWfae1v^d*ZGE3SgKGg;>0bQf$~^ zus^n+-(K`L z){na6RYxKo`*o!j8=w63Xpl?e?NQl@k$;Ds9xIE ztkyHUlb5xrrrC%$U)D3Q!(Wd|UF-md?`3CG^S#x}T3ZN-@crXREt-?@te4{#RPAQ- zjk<1KMYFBq(2-Q$?YBp2K@y#ni;LF*Ro^i0tLsh@{kT$$Jiu?ZVsGImgKt)flWBm1 zp~o3kO6hUl)NF(wPG2hZj%V>!H^T=zlh(F6?LQk*&rE?Z=9THTTJ$&7*;nTca5$%Z zPpQ)<>lgLR1o6e4opwd3)Ad(>FOLR*8HE;KD}T6uP~FW;1p1))Ei9|^1IsW&Y~8*4 z;-R|ksbpw19)NrIm2S;z{oaS0B`b0007^Nkl$`-S?;+sogECBQ@MxTHprktmt?x{vWzxptaX(?Ww1lRrb&wr zfr{;^bl{8Km%>6Wc2)2tIG*I}waEBM`t9ED13v@(7vrQTVi^`ONrDMUQnRZmNg|d^PMiuX)K{% zi7`+*`{%2dPt8*ifY<)~1D4O4KlVR^9PRZfiE zSYmc(zu!QKj<+#4)*c3!iY$GP<(}jHcx5y~f?_yu!;)}Xzg-zy)c`TG+_k7|E?$|# zB7qiu^)YaV&)t)*MFA$3RL9tCKW}nur5ZXb&#K2LwNJ6}$NGqfxz7FvVDshq+Sp17 z{pY8n{tVbWfAr;bqeU?Fe8t}(n)`dxLo0=5-WvW&USoYvWvP!Ok3K$mi{%cSrW(B? zqK}VqRi3mvx0Y^{=lNi3W<6Yb+U|U7e;RT`Bz%%8+aYaxbZPk>@^?|xxNsKj3p;u+ z7!fMuer5Z>o#c*dSLq>Co^P!j+3e*GB_rJUqx3MnaB!C{>U9rM>JQ{ne(<-vuj<)K z1V$;hZui`N@7CdnH6N_gyX*F5HNKXqmrG=oh;o*dBUsf@6cPN)|Eu}<_sa_ep8x;= M07*qoM6N<$g2jbvsQ>@~ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/bulbasaur.8x6.png b/src/gfx/cards/bulbasaur.8x6.png deleted file mode 100644 index fdb0552361f95e2fdcc403a977f712aea6603881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)<%GL0oWmCl2N+169q2e-|Mor!o6!h$8d}ot}`YAgLF-Cz1(U@OC93CXZ<(^MLq|D-%5cgn6 zWPa8Ml@|muS3(}ZaoXG*%mcAIoVMMV^Wr#Z(~WIFTp(C8y=oF4xSP9Lzk?u%6!jhj z^M#pcgZ=^plXDi|kci`0GM>pCZUn(?_n@vJ4&CFu@=FRtEbt&AX3LD!t~bGVFd2kB zh=@aSRo9RD)^{M7nS>nkmA7jet{ppk5G;yp3+{x1#0?MX18-kJ6*pqDNkrCCo^;o5 z;}uBA`8N{n&|;oMQ*d`3NNC{om&woC4$nmIu|ORxN+bSymK=}CwwZVRwPP?@y`QlwVueR)RUq#?=P({1FEf z%lD0GIEtx6I-F`h>HyL-f;NojE8<2t*WM8V;bb+QmGI|dC3Ys!9&vzKix};d`16<2 zzcn7N7NG!#aZ+XW$!TTKtc0sYFstMFRT3YP`m&*xFfoBi`}zP85wCE2MObt|X`62W z=5jc3m2asCmx)k1uShFI$A2=k#b2-Xz0Dz&mq|IY#c04CanKEO0008@Nkl347 zT})F~00;2@u`R9-;;qnVjKeuUxjtxSd@)8Y%N=ZP53TkV5KVlLX1yesN{lg$G59Sy zKN9H>9tNS*_MF;^iBa0vUKRY<7FRX62oJmnvFDmrMPs-|uKMcl2lFe?*^L0D*-=r9 z&Gt9YZg3j2sx-IzciNlu`Y6M#M2owkQEGTW+b5~7zZv-wHC)qp%Qi*Dh)N?2JiL%P z|MIvS^NCc9vThiu4)vF762yZU8l;qg8$NGD11hUIPbQu+=#1tg8gLFloknOKhIbqM znFbO@DeLSES->;tRQ5cqF_iK)QMd%2G>x3SUUp$qqO+-eJ`6)=5E~R&rtQ8SaW#x$ z>Lt11_Mpt=vD;5{!$@S}5GA1MCsMDjV&M8r9G}_71m}h2p{4j>8t3p?l{(ZkueW_E zi~`j_U>V*#(6jC6iBrfcYBuzzIpf|Ehgh?0C5DLLeZl>znhi`(#3d5{n2nA9yx$HYh9&YHT&x4NPihV$h+j<1};?i)GNvFD%Cm^ z%}noxN!mi`^CkCBhAx2@vgQU(6O>K}dtzMyj+rTd*U*izrG9H{pvNBr_7w(-?1yK7rMWlI`TmNMKCI`2SPV zG(ci|ZFhFO))@-ykF&`zRORE?zf(W>o5AVXbu-f?9ohdj-Z}6l!Z3RA@J%d^9n8JI sUQX;?44g)xRGT>`$tnG+%3yxw6JGOo;vLmYk^lez07*qoM6N<$f-K3AX8-^I literal 0 HcmV?d00001 diff --git a/src/gfx/cards/butterfree.8x6.png b/src/gfx/cards/butterfree.8x6.png deleted file mode 100644 index 5c02eb18a1450e45584c76e7fdb44d6551cae5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)!Ft= zIivUNp^*vIOS77&J@lz~&z<-7jqRu_DiDl}qNkvTtcPxK?$SZEo$kMn$NK%?KWj9` z@)gQCxA8Xtb(B(*Qp>`>1k{hDEZwx(A2tL9$dpo3bL+N+mnFV5NcpAGPptk9hHV9v2W$Kr>?;MG)@H;Ox?Q z6yUSDY2kG1wnlt}b10y>z!<}?1Ww|t(Srhf_{V(2QNTcPFACUVplw<2_c;o-gdP+i z>-gLAUWf5r*!7Zf*U>IsgQ^?&E@0-MnQ2-+pL0U>1eQ*) zQIM&rQ{8}2wbd>1=1q_-BSEzOk$10^JQ-L}bQW+~e3$2hQ zKb*f`1M-z;YRcrdBguP4@?xeHc1f?){k)t5|D+tbp=Mz7%2+mG+w)GpC+&FBc?ta9 zhK_@8t+_MP3ojQ-oj0MO-9_lfsprMwoubc82cRKJ5@X4ZndRs|7idc4z}u&eb$ZXu z?5Mbd{;B=}SaEnrjfK~|KX7?Nqnc~cgz3a z(Sx2|U4YYjh{o0au@9+&O9~$whni&l2#HS`;2S6Pzib!3xDCmCN#GYV|F z7D-iD%EY5E5;NfBgbaSC+SKo+Lv600000008tNkl2$~ zU1(ER00;2@IrpR$bL%~qCU&yIR_#DWN21m3L2GW8h>F!F*ud1m@+62N@wFD(G5Rok z+S@<}^I;#X-Ih#2v8lbmRCKhMK>Vm6C@5X+jXBq}HBC->roQ?65ry}$`7;7!DwY9+ z0-!NPOxQ6f2)x7UZ1=fd+X>^1$+c`4_u}!mf543q4h$=yQ39d@ z(N{GxJ5}DaKLb#i30b)1PLv~7F|Aj@7;KyPb^7={4Aih7{*Yt zJyo+Is4>}TrdPJL{rIr=$=vdkPSKpIH@^LfJaY$6h+@=XKKnlz=|7K$?9mKRJp=ojIy_TVFojvain}w`Zu&5B7 zL+-mZGS`#rv=1&bNffxJ?$VBz9YKFB7A+&zV=Y>oEFRk&nzrgp=Jb6fuvMb)zW)Jj W%s4pkJH*5Q0000eePV6NUfvB@c~^YMO>fHEN%dP;WP8sEGxp7=?mGXpA9l!x@^!G~Fer zX{h_K#h{#W#U|1^t`C}PrD!0}?Rp?RVBXmYp@N3dWf7Rp_y0USQp1Z1V>ZDThx$gh zo8Jhu$gbHQ)HQa=wfNz>fH_&QiJWW26FbpT733-(2-qHrtmO6+I2dHeCzDY3WjS4f zN3U9fbqk$6BfsEP)wGII}i0 zA-4MTmdf*j70k+k5qbnFcX0ZwEm$6e_z$N?4eUPG&UIrI8o7io&8f;r_*{@P9*2tM z&cxhKxRr>V}k$BnwF@%|h-jubm1Y*2wW7W~lGHxja)q~H;{A}o(TrTiT1K9wl zqD`{duTQ3r<&=z@{)Cf>zr{xr9bRvsz?QPnDX363b4BV9p-$jSTz>%7ee?bwWF5qc zM*5pryRDFPd5g~(9`C*FQdzQy-UYn5IcwfMw6g!BL@t68qt**r((Btc@*!D@fs^=$ z=jY!#Pqy|XFA&lNPARgG(4V!n9rk)leHeoy@=StW3!EzV0SK3))^L)f;^)tKvFD0s zSuLiZo{)YrO#CI|V`YBT_TUj*!)19Lz}P`K3GOTjM=qs1qox_<-J1`fNsojjluQgG fs?$8S_jABMWi6?rMnd@G00000NkvXXu0mjf80LNL diff --git a/src/gfx/cards/caterpie.pal b/src/gfx/cards/caterpie.pal deleted file mode 100644 index 13c199409c4119552507525a1860c2ba8712eb97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezG>>#SS001BWkv;h100002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008qNklu^ zxn~ACRi!{Uv!~L5uQT6bL?#3Af<`^vd)R9JicutOURbKGaqr=e7goc%g>}G3ivDy! zzg_<=iiBD|R_#2luOvqf_uaEo!RfcsqF-MbSF=~F1{J(8ThZL1PbbBh^>>D4%<_R@ zwrQ>xVeo@-;B=Mq#Fo29z|qMGA_~W0o@jU#TGqpn$rz!;4;wY(zQ&@+G}qT+cIxuO zvP#4YkMe0<&vq##!~@HTs^0UtyXkzoKc=vOr;w91dRc6lG4s*{Rj>@!+J@<^>nSsz zBpFF%XTT6$qJK24=aWYb2Vns)9#;)W=6>+K?j?u zzgsZ%DAq0vdtjFN5dAx4$MX}kHlul9wf_chXo{Xtw+&Lez{?<~NNu#~WNYxdQ>o3c zO8DYCWNYtupGw8;w9XZ3feoe9X=8caTrx-<5j$b^c|+nDFE{m#d3J zoEE<36K_sUZKYDXNesZI+U#S4@z2{y(==X%tZb|KH;;AfQuy T6PVi}00000NkvXXu0mjfmP>@@ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/chansey.8x6.png b/src/gfx/cards/chansey.8x6.png deleted file mode 100644 index e63a2462d76540c9946cc3c69164278edd358a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmVH~Q+EId@bByU#RyI5@7E-BGrI1u+aNJBf(PAux}Rofs&OVO z8|h6CUPcw~1_@r=rlZ+G5C+ASwa66okmkW&Dyd~eR-u2utnEc9KQtaJd#~@idiL|d z2W%wOjwI!PrIeBw?hJR`D+mz|HnbKA#I2&z;Th|K{n%0}eHaNhrLlkNJ~s+N>qZHV zJgAiFkx@xmBWn_gquO=jIg+ckKtm&@l&aQzl8^pflBxuuyA^Rc^m{Z1T&)GHbFZz@ zUg-B2{G<*liL~w(!yI>*mF=Z9t>yU)9-e(C04dF|Qpcoh)!STSop{xxe}-Y%T!x)@oL>Pb+C z=gpp9w3P(vC{O)hjCpnYEA8&q5HYAF+w;8n@=#Lhj{x`U;wKe+-^8xz;SOA=bawAW uo3NSLScNJBVs`@DliaQ@F6@WE2mS~AW?=@1LC*95000000084Nkl347 z&u@!y90&0Cv*(dHDEVgLvKfEC5)+Ng8tWr@x*kXn*<@siMB<AI~lfIeSy zQld>nnY0aH@76&@d1x8Q>MN!lhIsEvsS(`W5X^^7I}GbAy(5L1j1qjM2Zt8l)!>Z1ar>UX@@zv}hyYq_;PbS{FQo;Ecm^ zhCibYZnnyZR)uQ|(bY38p}fW%w!2)n9Vb3Pm%&Z$N53(e*ds)DUS`2M2qSEbW#PoK zC6&bz*LPvS7)=;LoQ^K#;Hlt)-Di#6x15o?=XqS~@#~Hgh*?qkY<_3tKkOrs++H2je@ga7jv XiCCN(^@_mX00000NkvXXu0mjfDl~F< literal 0 HcmV?d00001 diff --git a/src/gfx/cards/charizard.8x6.png b/src/gfx/cards/charizard.8x6.png deleted file mode 100644 index d5d22efeb6e3663612f4b9fbf9e009918028e8ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)Y%_KP^W1MeX14yb40I2XDr{ zezK4g+vf3k3xv+G>1MY6`m?{=<~hRxp>xb?8i`Tv+qiksutBK8tQHw5Z+?={^Hc`O zD(r5Hgu0o24X0@gM5wyuOGJ0fkTZ0F&Vnd4zq~=#l7-SU=tHv@uewfogB%i+%6dA} z=P}NFf5i)brwa^k9&$~f>bm!oKlS0|ow}4iuR^H#{+&nN2|GC$*jsuUg6q0>b{uw;~2aN{yF?&MaKc_^tI6H84hLt~Ex^3M)GszpQ?vgHW1NhJT6) z(%>z#H)la8&BaS*RQ}4XJ5N&pp){9lnT3_W?+&gMd5~;4*A`|H1=qbE)b9f1#EWC9 zisWP8e-dgk_gwN1f$j7BT=& z>On{Y%uMAGGr0*s5^AgA`KuEt12QBJ5EW+iP{4ycfCEuL6O^>nSA(Ml{_}?bwbS$< f9-zOi;s4$PS_2}pPM?eh00000NkvXXu0mjf`0008sNkl347 z&ui0c902fd=|mB=2EigI1ux8RjqB}E51}yKWe6RE@BXMQQO(MtGa(3WzLn~4XSlJ}|VyqXg1XFmAwt%^5 zA$y%^qS6yrZ_;UCW{S%Wvf+9mw-vS3Y50;B#OxrObIr_9wG#B;3*op?zWZ2n39j4a z#{tuVu-81Tt&H_0?cyy1+!V*{-x*$z>VbgNuT{Yn1Yv)lD1Az=Nu*wVng@3?$H~f% zaWfT^NM5@P%|u_)Ub>c9Nax0S^2OiK1PBHWs3IXb;>ex{%}_J(V~{pDGe@la_eH25 zG-1QZ;pKo?AWv&&Rj4!5M?gP9Ome>8J_IvNQvvaAK|(S-aK8vuO4TieV-uNWfeiI` zRB$L&H_qLixKiO_Lp7?xBBiC+BD>>`_6=Sb`A-8zX~|r<)N<{>S|SZh1EaLm%qeZ_ zg^(1t)esn^rFu*$i~<)9oXUH^%H2}booN&V;W#AsA+U#=o*D+$cW~Tx2{AL+Dl!iBc;RVi-7pPji|e3)eai)Tm?itP)Oo6WRUbTM1mxxAWR}gbZ#k4NOD#nmBuwJ1kRTbPY3uiCyK142n`X{bU_;s})Xo|Kmilj@AaU>vW z6EWK17}u91P{qb}8|Rx-Nn$mCdBUwbh<<8N&se-R|CwmXgLl~D)I5x3HL|E;Rw0_x z;5cautW}Qd-0^~MN0QzCUf^$0jKitWrYm_Q-oqxU!i>2VZ?C5W<3rA+DWZ$|%>x$# zQ2Mgjz?eHA>YcxK_zOU8@ZAdMvEWH%?cDY5j{w>Bh&b<7Ph5(WFS^D7N|c5W=U-JL z;t}-D%24fxTE;@^v?t(GJfl{S{N`FgU>pNJeC05MG-kdbV&JMh=>$_L=179?hb8Pp+c-r ziMtFT#-Dr=MCE0rXHXC;7&N|qZvm(nb@uo)RAZ{fZ{0Tol$F@KWRny$(YL;{BM}Sa zlsdX_AU{A~_VyKbtcm7IIy)pBL)i1DviQ8E0Cw-PdEbl<;NaHNihWk7gM&@wSE_63 zB)7fOc4i1{kke4)g$IVRd>n3UL9-Q#8j8K-^cf^&sHMrN`XTFXE}~~_OhSKit9Taw a{f@u##?5w3Q!GgU00000007?NklG! zPe_wt9LK+}?^N;+`LLEyi3tkb+Jqg9q75GqVlS@t{`QuxgwRor(8~yd(nCaA)=bpa zASw)n1)fw)a!=rbP@xX5qJ>_vlF%eGv8GQ4_2T#V;dA(0zL0wcft}?k0C%Z7K&Aiy z3_Cz=Rt4vrTXu~c((M3X!{Ke5>H06@7KgMh^X)4%Eg=iF6n-8M{P z%Lf36gdo6}mFSI+3NkZ$uUDg=<6pET@1i61Cd@d0W+A21vW>pIWU+*Sze&u6E| z19bY45m6!FXycXB9?m1SJ6RDG0?BKPndQJU<=*$_J}jIYN^u_cS$J8|!!Lyr8{U(- zj5)pU{Mj!bv>%t)jJiFXhxPYQ-E+1`mBgZdRAa0_PZE8m+7bg()pCM!O)m}l0{&oK z9ALt!RWZrVI##3jB)NgJym(ioMtYw2;!5@~O(L>iIf^0BzY%oBfGV+Bzz zd6Q>O^h?avb+!dm(w(}>?%qg9%r8be3}Jc&j5^({2N`amDf}A zYZMw8q(mIcqf52u45Und!{BhIUX86=8$`jH8k4Gr28ayoy~lr&_%Evct~l8M0000< KMNUMnLSTXfGG2-R literal 0 HcmV?d00001 diff --git a/src/gfx/cards/charmeleon.8x6.png b/src/gfx/cards/charmeleon.8x6.png deleted file mode 100644 index c996d81530e5c28a592d7b7f36de10a6c0031eda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmV-tFzZVFWz~_uT#X z^M9WA&kOK>9m~>cm4o(srW@*~?2m=I<*?n?BoL5wv!&<>QkBwK5l&*9(h{chysgkB zIAa41W!YCKQ2JE_f-weSy6m$RTL2{8NGVBn$-ezuPTgey2N*D%SoN>~+N2&zJ?;)% zDX`kH6%lIcuCumcU!?#I=?I(J&0#*5%kHa8p(E8&h?uVweyg^}Q&a_OL&tn}CtLaH zhL$v{b#II$j#ge)p77tG6R)U8TVw;rzwf+-&I~josv5Jvl<$?hW;+8yqBmXyK7e~G zU;MXcF0$jxamtBAj+Gzqy@m-5znV64ra%)3^RrMoagFT}U1y1buG7xrh+EJ$HnMIf zAqd9eZuh4#b{4IgL{kdK4gB#8$P3LA$>q$|giH_nr=9~hK)ftPGo+{V@_S(zU>F^d zp}F~>Y>}u3+yG6N!hlyzPf{oHvLAqZbh%#~j639y65^;N0$;k>KZ_$)(g-0&mz+?; zEBCH=^*<#>iPv90x?FtbOEgjr+j3S=PaM*hAe0007{NklulA)Kz8zZXD$gcK%WkuF%00qfataqq6QxBBpvykkK$Ioc0t1=Lh5ZH}7@_&Fla^9g+kP_rsQ(Rnz8VHoCu+og zw=^&Cuzh&5$-^5E3h}25$Cu~KN3?|{Mnw^pzalom+UR(Tm4smkU3H76N7-AXY7(0P z91-y7bs$%zT+HL)+d?Y*Ob=cIbDCsXihM#0i1u^F1keer#3p-tk}5}{Ia&a^`8rPV z1)mFwMD0jZFmJz_)u+N0^^Ar%rs+^}JelpoaV{t%5Tl)C*e@yfpDlIOHem@-&85L0 zlSBTY^=5$%TR?*?GHIWha6HtN0hU2W5s2iq-|3+nbBd3FcmZ}U$$aar^MzGKA#4mw zoq>iyYBDga;b=D$C7BnWt|S;3r~qc~@omMaKPdiHj3Xww$X-_a1OC--ea({GnaB>A P00000NkvXXu0mjfVF6hH literal 0 HcmV?d00001 diff --git a/src/gfx/cards/clefable.8x6.png b/src/gfx/cards/clefable.8x6.png deleted file mode 100644 index 014b1b9d85e8454d446ef3db1ac8615c6cb20821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmV;v0zv(WP)HqlVKbO@b9xdqcImg58HbvG+);3h2|D3M1(!%^Cr~HE%)Zd z{R16hMIJ**gBqnt(7}_vN{nBU2QPC-&alh6EShxf&_V1n$&)PVUEb>R!GBoJ=ryF1 zj84VOTtot_=}hZ_-B#`36YYWjkoC&6EaF})CZ%kEHI>!{&cnL2uI>CJjDTcP+RlXR zZ+(f{0)f0fW!w4bUn8w>%AU}WGATVZf7|~pDf=3TI_-S=_YbS=dq2}GOlSo76i;C2 znBE@D=F&m{PIGc&VfKLDEj`zxTEmPSrW4jm*&^$-loA*)_9oXt?n=G9nzDDbf~j?` zE3`s&dX$VD3IP~So<5Y1OElE9ceMtjl(8+V+oHjwloCMH$&*`OCYn!;9Tfl>(00Ww z)dy+*QY)E;$8kz)PwST{zR;b@09;8Uc5#VbQT5r;=ctB&D$oYa5Yg=T9snlMyZw{i z5K&-E3k3lLYUioLP%U`09_gzc5K;N@!-UodOJL{7A|m&7z5#(W7jhs}p*a9m3HMZqXr+|k3;=`a->njnTgpIj zc(|%niO9V^D!2d?M{27|L~cA21Rwy`j>L&*(MrYz{wfal6VZ#!L=YaX1jMHUqSAg7 z-~c!j?r#&_SZ%<=#2LX@4-r`}6+;IH5Z(;!-^rjupd)kl+Wv9^3MNkY&t6&Wt^ufk zF$O8*M~t`NW6Z>ftHpE}2+g2_XB9&0Ut53=K8_$@0!DT*3s2V!;zCp;j9WQJn1Bxm k0w&0007qNkl347 zv1=1i90%|p2B%81SUNbkiV?e*#bTqBG>e0xKZ3MpCkH`lt3*L76~~Ge2mgU|sTWPv zDCj-)1w@JllSa7Ba9Yvf65cDu5Xnp4*VEC@hwvY=#c(TBZne4G2#PHQvI+O5$a^sv z>s}QR>JQs3RaPsw+h{1I#>gh55P4(TB6mV~g;ffB$|~i#Yicuopy_Gq6~u4PE8N`i zBHpfeYl4)jsz|CI>+h|qFJshnV}&y9_OpXyONsoNpq^PaHN4%)r$-ixWvvNrV)gj^ z;s~EScS$@If`Zm?x#rJgefEDUr9d0u{?$_*XC|4Qu6W}@QXoX}S7(Nke52YL)|wEy z1wNA9nd7$!Z(In1QmQfOZ~OeNs+0nu=@!^Y&N44l9uMU~swcdRlS{tig%9y+83ed) z?$nj!d#=xKS4towRoM7=j?Z)Y^3cJiAPt%4f;0rc$W)q{ zo##)r(FAEwnM^aYQ!jM^(twS%>dZXnSL+&t$jYltX1+L8>jDHLHT0no=G`;D3X3(^7v7y#|5&glITBBb$G>E6rH*%~AQ!ax1*Z>G0X05W8) zh0^LU9>y`SHX!`-dZpY3I!gcnW?iClVqY8>U|^^V1VFexw~olKC8}$kQ3xLuT^#@e mP!|XQ_d!tH~6KNR0;a_H=MDvxINEAJpiU$!P)8b)a3*R8qt*`}~I)R>x z+oLDXYupwVcFR^O9^zFkbdKvKn>ozb^cE%V{so0<)v9537gj0byqkpH`aB#_F6GEU z3$Syiat?6!Y_gojx5-;yv_rCKul#rStK%SfpSjPi1g}+M2%8VqDJjvZV_ickY zE_w|uhGaiQE|cE1GT%VV_i|7b7l-0~#xc+7svL;GpBOe^5@`|1AZEnOiB76=fa$q; zhPFg^f0aHaU^B2Ky4RI2SSiPMKrt!$Lswp-Ow0r{lTwwgB)-vlVeEiHr5!mhZ|Y|{ znxT?4|)j&F1uD3gA$QdlJ3O_Lk;IT$rL|RzK^P z5;WJtF~Ff>RzK^v+5X02f7bvS`DOhz5@`qPVXNCym z2Z6(oie$%<{r;_A0tfQj*JnlkyCKiQmHExzu3{!Ak*{}UH(R;2G@HWn(iIu{S-gej zssja-3|X1yFUEAGHyC?k9{&t?B&dGj%|KUcheiOKYV>p+?b`WmX>a$~@Nm0KC!K400 zt?uXoYQZU}kC%h_usJ;!s{;51CffHl=lf4xi-B?b0+YcMw3|2nwrwcSxXyN=BkAp@ z4p8CjTAcQlU1n@z7g{jmI`I@Hy$5iI3ga#(b&U1O88b+2$T4DKC2)tM{s#{L6{S4_ RK}rAs002ovPDHLkV1i2EJC^_e diff --git a/src/gfx/cards/clefairy.pal b/src/gfx/cards/clefairy.pal deleted file mode 100644 index 1b277095328726340e8ca3dd7d984e8bbc2b04f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gmUogeWMKdR2=oDa diff --git a/src/gfx/cards/clefairy.png b/src/gfx/cards/clefairy.png new file mode 100644 index 0000000000000000000000000000000000000000..eda9e4d3b326e47b47f8c24b00ea910eb05093e4 GIT binary patch literal 728 zcmV;}0w?{6P)0007ONkl347 zL2DFu0Egk5sr%a&?L zZJ-C>@{4AAib)xLr+tcNNl!Bpd`g)K3cN&;1uh^crb?WiW+{!k&7n$qCEm=jFUG7`v`N^>OEUJpsYcoVD@v<%Q?F z1_abclB`oVcUA$xnp2hD(^6~aYsM(0?^flVu}-aT;>2i|X3;yAoKetP@ee>L{i1g) zIcd!<->%G+i1uVHIpRr;V8w6N+5(D1vTn=_W)FgA!<_WGIMDO=QPV6}%)X zcu?#o$VX5~AVYf8VkX6dCzCy7dr+iR$)yKBfI>v3!GoX)8E2Et*6RQG_`ToEd&2@?R?)64YkL4g%hJ*^G)V*JV4=`HP z697hmL@aG6+?^s^#u&?rT}sIUZ()?zC1OBGB-SxTvPJQU38%!CjwFCe?plw2j=B|6 zyn@t*Bp{v=V#4aTDrtk*01I^6s$Lwi3aRBCrwk@zug(4$-m0%v7KtR59p|y-y1yNw zH}aG=d}7z+{9CIQ5Ep1u?6stNcqyW*+$dETxx17qV?T%`2E~ymd_?z3C z^@9D1+prF^Q|=o!N;Eq)NE`mf3_{+@JvojoJTki}O=C2cZJw%6S4c=4A`ye+q#>9# z=fz=9kE<95jzV^rOiLx1I~o8~6JAlDI|x$9^iAgu8KmGKQ$h|&g4qB4jz51VSv|#^ RFs}dr002ovPDHLkV1fmh8bkm9 diff --git a/src/gfx/cards/clefairydoll.pal b/src/gfx/cards/clefairydoll.pal deleted file mode 100644 index 2d980d80ce5c08b5b2b97cfcbf0ee11538f9636b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gmUo=0z`+0j3a|m_ diff --git a/src/gfx/cards/clefairydoll.png b/src/gfx/cards/clefairydoll.png new file mode 100644 index 0000000000000000000000000000000000000000..e607ea1d4a7e7367f41ca8c5fd30e6af190d7fd9 GIT binary patch literal 669 zcmV;O0%HA%P)0006oNkli%fdw*gbf9fIMQ$sHWVm{eHs{k zPi*AaLxfO zv(k|VMB}1v+YVS58qOByLSFHFBSLg$%0?g1Wv{wV&&ASZR{bp8yfkpw0f^AT+j84t zCg7pI+AV#H(K0L64Pza8l-}tje-o{+T|Qva*fWeLT~$3}Fgst@^}KH^_XxSD6$9hD zo`c0~T3eCE=CrYle<-DTk$(*uYvkQ?Y8X|={iN$c8Vm41*B@h_<2zv| z#~EKLdmMVD1y%c4cowPQ_=>RPPu(@6ykn}dBL3`qRXP5~>PDev-X$h(;q;XkmMNTE zrig9J-1PI#Tv2@OxsX~xMUAq&Vxp+8Sl4c zlFb@frqd3ZGe^v=_It*hQFnl5Xgx-0zd`bpHd_4?AOZqHO1eKj#Hx;YGPmVGe`c@M0nrLQX?oAkwl!3?Nj4yb2@)(e_TM2Dr=?3DE=TCKmX$EkeL$ zlaTs`-#Z*{u09_wg*$507j?~_7C-+u-Wc+4J;p;dYZ8qNTEy z3r5_OMXRmUKtnC&LY9c8FA~=D(} z;|)B1sJXk$uy(1s0jd(WZn(KTG;3OQ!Y4^M@NAcsAQz31iX?Mbw7!>^3N8nfP#*W5 zd+?84T6SFwQc*-NTFwG7PL9%QI>k+&Wv}26-Q*avxiwDUz0t7?WUGe;ncop5B2$-G zaER_P5$6>(xeyX_|#ALUxnJqi!kX<$)TcXoXaH4Vd;5EI2;*Q~- i`iG&x9Ol5S->?5e`*ZFSJ+}`40000jKs6YT9H>7+100002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00086Nkld+MQypwPW}XeDlf zS>0PVWTPfRZOQ6E!J9N~51Wt)<{~ldbT;06hj&#;pU_>=h##rCwc&}IV3pgST&>TXwDwymMr>z)8)N3OgK=WFKdAQSyE{4g zj!0W<(%4#c8)w7dOjR~hbvkRtZpai=myt8nrrXCUz9L5WNqt$FHye&FCasz6kP9z&*#8hsZH`%1Ow`J_T*dL^*OS@$JA?fXM2_xCm zE>kt#J;}@Eub5O)w*%88y&oGW%W_d5PMf+*Ea7<;s?22-VdRkD_Yrxvfij+pgwvWe zq(>!2jFUqsRWaPF`O-8yL@zlAd3WEnondqA!m^b+{_^9N*3ywjoN`zmiPRlhVI77% z0*lC30G&#Gp^p?#1B-BC9r8LS`ru5QWs7C>hMj2LJ9tG7gE}X9r~b|-K@M{4*6;rw Z{{cbLi86)*p^E?j002ovPDHLkV1i`YWkCP{ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/computersearch.8x6.png b/src/gfx/cards/computersearch.8x6.png deleted file mode 100644 index 79f1c78c06679759684296de842497f4a04c23b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 731 zcmV<10wn#3P)FK#;_OpB+{Kx-401yg z`te{7LC}Ny2PhbZ5QG?}uvcMU3QB3+eps6+B_<(6DV2oQ?g|!eUYlmdHxKhN=X~e; z&iM|&-oO^qXbBgw6T&Fu1FTWQ_RCTpp+Q1ne_>yRHRCvAlaJ>G#0FFLypt_k(-H!3 z$d0;e!zH1I)C5Gd@!*4@-eXUq-E@2UujmOy=C-3`1{Dn|rGbKR}0 ziSfE!6`!DJs_Uvr|2!U~lo2p18W;2YmnSA}wqr>Rz`Wn`{oQwdl$vzS%t8n#(O?@?S49)$$ky07GIomcSRx= zutJz+r*p@ar$k~_)WsaYdO!6nL)mtAj$tNt(ddbVL(T&LZ7#^M#>) zb$H@Tfi9E)ndq=yHWD6v(y**1)vd;CjGSem2)?dvi?s5h)=`2w5oqeRIyseKEJmt2 z`ic#CTZCTxX6FVTbw*a3u_pY`n`*hRE>SdI-A@GsP-!jCjf5|Fdg_PXD-|s{#WV5e zR`FmoDIj2yZV%^wfVdHOW(yS&?m@l-k=ZCrTS^6$CcC#h{pFRgC{;x04I2MkOj9LF zMJL3>u6J|8_HRg2C4$iWY@T7Y2}cdZflOTDilTf0007+NklS;&3Ldik~E0lu07*wXSHdhdT?7i-tX2z#F%*&kfo$ov6JHY=7peAzh8i>eC zP?pF5b+K)vWo?JxB*E}|vvYt;f`fF*lQ%a(!$2?72hH)IE7ORAD3s0EUO z1}H)}bxKeW*zBd|oxn%ERZCUxstAg))O4s=OI=VZ-vq_@%!8+)mYH3ZjG&m98JP1Q z{G7xX5wMmfD|gb*o0}gFQ%MaRWshv9`=O*@7@?#{Y)FU90ug)m?)``Yv5mf!F59!;v2Oc+2blZYy+5Z20j&zJH>k*E`O zF$YI|C+?T?m3(h4qDbuG;!jmS^qZW!wMis*v5ktrG5$<9vb9X@Ld|#?4)Uz7*NJ*k zjLvxtFEKga=rgEmWJC)!vG>)>I!E|^Vqmw|98?73%hk#dwlXZCi7 z^AGbN=X$5S3ppS5m0XD*3eHFQ7Fft-XX8x}`P%U(x-b|68#}x{GO9!9-IgPifLZLj zv(g@KyE;{_CUwk7Z-l%>i5PvXZp+-|jnOv31{rtNZ5{FhRL zUmuK>j#F3o;Y`eeur9RGGT(y*1lZ~u+?CHL9S>ZN&99 znNFFO>YGqR`WTp!)?OSq>4YrxO$IV`t%K>4K8Sht#X%`U%AlZZZM-+heAt0-Z$5tK zyXV|{5ZWCcU>`sVfM@MM4A5Wt(FJ%SxIv)XesGiMp#<0pI0QGw0f4J8*oMekq}-g#OH_JT)iBCd+SL`#6TPvEsLRmMf77LKvf-LLRUx& zv^kgo$PR|qe2OJ_1xmo$_`I$-?OQ^cKi~+x`8+)*4PhVcE^gOB1we*Hc&+y3^dbZW zyM1brhc9)wXn;XI$f?3Q{#FO+g4l!~4k7xNIo>9$i%U%n*STmxmSv|Gh*$Kd(Ue^W z#xsED+I1~4fiW)b5L^1=#52aKL#EMa>*ti4#{}Zhi(`Oa?%&dCN7dYa;{J!>TD|lu z7b70T6u(&A3~Ktq`Bwm{Mcnm23DzW4IYB*65#nw8?6r5mCr$!MA;fe>+Zg}NKzu6LDgvBU#%uF#tdyCW8{=Lj_I=Ne&cVq|BIBji4I$3IA}BV3J(iqHT6002ov JPDHLkV1mxE5n}@c diff --git a/src/gfx/cards/cubone.png b/src/gfx/cards/cubone.png new file mode 100644 index 0000000000000000000000000000000000000000..d914d25f943c4f3e7c738e05035883655a97a206 GIT binary patch literal 715 zcmV;+0yO=JP)0007BNkln_Mk&k}pCdl#lMZG(bqK>Zn+05P!sOOA=pc_pq~M#D>d@)ZRv6aQ z?nR-XR9uw~Hes-Vsdk$mDBU#Pn`A!hK)5%5e&>JBxgW^f6{rdNO-KW% zx*f;>`b$4LfJ%fGD0I34EfVXL09yfv&}K9M*`vZSUDc>yrC#4)W~y|OLB{t0%& zI{{=uG^mgpSvdRjc@=K=WGImbd1*Ezm#Y@Bf{6eDe!(a|BQ4P8U>qQ^SnjP0me5cr z0lm{Btl+e72`TlbBdo<@be$BG>a@F@T?ZAwWGtd#wJ)ZIprY9AQ;QfJ^}$O980tY* zReJDYA4soc4;*v|xi+AwHeqdCdUD>U6{4ajI=w(H$X+R=?K&_X2R!QXaoNWh@kN+obot*dk!u#WS;z3OD#lEfz#}2hXaPXIyWeoCY=f5l9LlCX!tD^gaV}!-}G!RYHtr<>r8)nmkCv zlz2>TipR}%0bQz#99bn2!FygbQJ`Q3>k@|+rOYQW^L`r=-=;hb={~uZc!>>%+yI`5 z&?@Fpt8{M`Z$^iLgUY$@aj}H9bSQJDr05_>V_h2Ph}_NgnEUP{at7_KVsV`iB$yNZ xbSF!#qDB1u3Lg8o=5(8w+quU@vLCyj$3HzE*~Ger_8ac-5<|9|2IMSUy@Ye{zK#U2OOCa z-=7>eP=v-S_e6menFE3IL1E4f#6oA#;ViYKw*d#{PojJyV~th5Q?bcc5rn?{^QZ42 zSUL27iAT>9sVO@#K15X=#|>iL^@SKs7~$Y7EJOMgWgue5?W9Ju#w=YsXM^k|*bAJg zw929xH?v2dt@6u9h555aTcH84-|t#sa0V8*B})&o!ks~&heEDP(NikWbK<~;2lzHUfD3Wy7p9i4 U3_Uwh&;S4c07*qoM6N<$f^`zgi2wiq diff --git a/src/gfx/cards/defender.pal b/src/gfx/cards/defender.pal deleted file mode 100644 index 541b6837b38b35e111af0017fc3003714ad943c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#57s%jnU=RQR38?|9 diff --git a/src/gfx/cards/defender.png b/src/gfx/cards/defender.png new file mode 100644 index 0000000000000000000000000000000000000000..bdeb050a9846bf5510b99d4a0483954b159c1a2f GIT binary patch literal 526 zcmV+p0`dKcP)acH?Y00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0004@NklZ?PA+L!!wSlAv_$r;Ah2k#EckR z(+RduRXNTH&A{zTlT_d+bl+hHlFuy)ZN9IAQUB(L`VZj$I!+Z)gu53vZAOM_;AN>?JAYb zw){z8bECdgl>x{Ia)rQpxahYe0J5>%B?X)j2jC(m=jjn#BTHq)$07*qoM6N<$f**L?BLDyZ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/devolutionspray.8x6.png b/src/gfx/cards/devolutionspray.8x6.png deleted file mode 100644 index b3b69a40ecedbfa08e23e66787a6affe6592904a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmV<70UrK|P)|DCKppJYW26fYwftINQ;Lii{(qXk>!TGo92!&Kts}dMSMl#bP;vYHt za3wuC4p;HpUP>4zJY%7zA4tQ!t#!d7&81F<0(so*gayz{{=SL;N&<-3upp#-r2zbG zqhZB9WPKC%|{Jg@=vUGRehRAK>8 zj0oV_1J13tpctj#jXpz&U%m~M0zj9(gzK>3hn}t``y5O)_D~q>Ce~YQKR&~{f%x8Z zKv_2xBx6~}@(BZjGL|z)F*U=~IQUG{7|p7NrWzcOq-vigP)0004ml)0|;V~B3gO@cVSbck=-VZ z79l2SEbIh9Z~|*2HtNbcGrP&o=4W8eeEet5nG2i|;ki;di)~c~y1)}5nGCtv^R&+# zutU`MX*+cI$M@A^?h2F~ikY(D_fjq$}GKrsM%Nqh!Urs_ajF8c+bCO4)qP?SKE ztuZfwBnPuTusb85UkZ^RP@+UZB0U5x%-kx7``{7TYsjF9d}jn4_X1$q2kxz>aQwo+ z0(*vEarsH)OF)9Xgy%?Nf}JjBNe-?Ye<(_ImFg+J4jocmgIKFBDClYz7PWM0op2B> zP^*frYG|qk M07*qoM6N<$f`9AQN&o-= literal 0 HcmV?d00001 diff --git a/src/gfx/cards/dewgong.8x6.png b/src/gfx/cards/dewgong.8x6.png deleted file mode 100644 index c4be81b50520c8c65c8508c8267bfd31aae434dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)DW`K~yM_U6Nf$lTjGQ4<-gv(c{p-h=`za!sgIjF z^E?Rcj>5m;_p{+fOS92PAV?V#qm)vI-D8J?)+0qUY5#?fi2QxHr3YgZDs?3zHcGEJ zj?Hb-`o=aTkwzLX0oZfjo(Se~fxYjVn`$kRkFEMUQpptcF zC4_cPTSJ>V8cd<1Z~b>MCh_YF>Xsrd0(ix2orH?*J`FX907}*uh9VfBP+n8xHVG&U zw!Ro4)x1BaJ}3b#zfU_cHd}^kbfTDqXQQ@0N=PV5yXdyz8g7R^%CZ6jSha1qUG}HG z?iJZ;_^br94tFdXoVjpt<=#Yr7z2a3H`4C%QQ>244aj*!>+8r?E>=N~sQeF#+81~&iz002ovPDHLk FV1i}DWbyz2 diff --git a/src/gfx/cards/dewgong.pal b/src/gfx/cards/dewgong.pal deleted file mode 100644 index ae4ee37915726d3f6032243729b1f12bacee25aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexW@8itk$RGd!4@&}G diff --git a/src/gfx/cards/dewgong.png b/src/gfx/cards/dewgong.png new file mode 100644 index 0000000000000000000000000000000000000000..21d8f4912954f56bcbbecf848bcb29ed260e4f91 GIT binary patch literal 814 zcmV+}1JV46P)0?wZJ00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008PNklMt0i`m7LIl);$L_|W$Jc=KXn5^ejFT(%L;r#gVoQHFsgVMW#lBP_PiPQzX zy@3FOpeZ%dP)ePmRfL5Oprl42?&n_-KBenv;oOg=?Fy}%(x=YP#Tj%UC`SpiX^)$| zHOMXHVZOL3M@d5RbD)O9QWRzpFs4HGY|i=b8h_CR&byRoCX09&qwQrLeMW>DQQ05XAUC(=ZU+WQPgRU(GUVKlU3-_a{h7Zah!KaAQ^HusTmu=jVl8N2}JQN z+RnMpTQ?j*NCC%c+)b1*y@s~YZNpyI34Khi8yk3H+pyWiE9TbRwH)0W2}GSXwZ>5T z@<;CN$_1nbgV-`_iMFWCsqC8s!PQ6ATSGdJJP6pL-&UNnpwwa`mkVtFh-E)o^#C z9F4(Syq>U3j8^y*Z2{syGw>LmKN)LPqh-S3{zeD-&Qm1|2;rI=32dDYRHJ#?d-uM4 zv@iq7ghLe}2ijmm_k1!{fkA<>QXg=D5!Q8_+q|d}1XW(F-+|yRQu{WQs~8M(ywMNF zP5Ix+l~R>5y(Yw{A8J%>9=VRA*nq62@qlFL(F;NZ;j(ThFGimso|<)CA_U{JhB9+} z{wf%iGCvrayv)*q(=b6Btix5`O`H~OFj`;PG9dNw>o^Pv`BW`5N9q~$kxKe!0bKKu zVa^x9pq0&f01YR}xHOgQj?Q%m0F37MxsMM09_pEZX{C5J=8F#F1S+o z01W*M3`IB@SV~FGturtXd{WFn#V0@l7A8XfM9vZ%!Hq-ar?>-9>bc}ahAR1=Xfu>()tvtJ~@(4 zd|7Oh%S>Q1>}ah&a*p*Z)6?Hj)g<4qAhMD%sTsmrCk(^xYJQ~Z88w`c!xC%g%2IM* z5+caa@0P(;_vtMrX`o~MrUIN5qn^Sh_0SPVBqHqIyaeh_K?}0v`v;>IY-Kd+^p(S~)L9i~$vMuYEZ;i!*BQPzX4bdbKA z(gIsC`E^djPd!T)j%cQX9&D${EH)cH3ffEZYzUiYx^rTQr$2OHiLJ}*+jz=DOlR$O z)~3z%iI^YZJpbx-3deiXjm&)TEAeZ$l3-X6FZ4A3j40qzTgO9O--%x{##wVCYf+cg zFqFC}1S;otzXx}B@0=VncaO1_U~WW?<0p?=LI{b7UX9KcfbBhJtSlKt#r_Y1QbH=v zRZDF}x#TgR|r^R~OR wfJ+-fRj@@JEAL64j(6cG3ekQKT00073Nkl5=E%kWkF!jljt$V-wz4v?v=2pODz!?kqb90qYpnx+Tfa8Qp zeTyRA!b6zE0b^`lt%{ZIViJFbbIt?TeW_OQr@P4cCQK4?_)pcfJR%pHhm)woIe(@U zj$D`5@4$qU{9uZxFB$XL8k~2cC~99gyJF;0!Fh66;v9?g(%)x35#(sKb5n>P^c9da z<^g{-HA+{lZo&!G;Gse!B5KdQ1*%R#3+ZK&>^J&w>{6=>{|V1~Ohmw4rgl+Z9jxrd z%hpkwIY!Mn|IIQSalh6KPpxBP&#M#BXg=^N$EeW=-7Prwn%;Vy7W5T!791k(@tQYt zgf$*-!I9_J0(P39q*?qAYjCo`JKL7{c%R3XI9_reuGCe8Uai}8yEI&j2-rn%9%Y@% z@q)EO2F<&EGXCqwYZdX1*PSPb(kyZ7_=;!WgV$OsJvepyROKRyQa+FpMfs<-1-}k| zZ|~@$r*&WIA|%Jor!RdeWr~Q|n9kN1-FvTfo@$CIT?Zp6B~y_VB28s!Kx-jzcs(9o z3ppebid0x4BghsKV7CtRl(ce8t>mCk*qpTYOO`T&3%pU(<=B!px*{kk(kv^p*)61W zK9#AKWhS#yN-!n$U`$C*g;Z7OeWPcQQ|q$IP=T@{O0CISY8=|Uq*+o66f_VD%UVZn pblyu7I^LP1GNAn*NC=o)@el8b$9<;Q}BUhNVgC?c_`GhV^D)+5<;n@-s_zuJ5KutNym@h-Rbn6 z2>CZ9=T1DdtPPXX1fbEO1$8ks0HTl! zJ2xVhbY!Wa1V0;orX3jt!VJnb=^IEJj8(Ws{4vO7!HTu>8dvBlvan| z#)jLo+NjPs_kLx@a8!^uUPBwDP4~64Wkq@y&iP;?tK3$i_lhZ9TAKj#{`$0h3j8FD zl6^{xQ$tCK`Y;pl5>m1zI3m_TXG;XO!n1eH&JhxZ)vOW{CaPQBHg`3JP)0006BNklBjE6vy9HQYj(95~;}8;z9>cretftGMvd2u(4lni3v2tg-%_n-V>-hfkAvL2hi_yvf;Z@ z27Z3ZvQznH9=mY%qNDQ)HpMeDcnxQ0(o_p%-PZ$_gEcF~b1?&!oi<|V7;rQOWrCQx zR|cGTW@_0%bxK!!V^EVa2~+f#psU(2S+)^dH8~=SQv=cUI7@QF6?TnQYciN$1OZ@E zDv0NLjMpv8007I}s%?3?nu8U65g$3S90+&_fNjaT8PGEj2y(uaWMJN=7#O1`a^Mqf z_>6~;1FW^QA!Sd4uTd0j>*E3VoOh!S@T*uXK9(oiXiM2GJ{cQPC9MNl;yiqi8O6eg z!gvjB4ECe<@m}icT{!2ZgRF9Uw%*H;^89!L%=_!p@+k;x&$YLt98L{FDd@vYz(=TI zJ#gB_=y%@4aan&11S@63tol2G>W>~gQoXC)aVeV(Ei@oh>I;MZ%ln;8Enusf!04%N zheF~v$Ms!ukmyqWND5*BLxs4Wb^l-8VW9&^MYVnLM23OTB4Wq*angbZ1Erx*F#G$ z{sR@SH5Ei?jTdkA?Gj>hQC>)6O(cbo9(wiQrBJuwZE8-MkagaRw5W5K;eGR)Z-;%m z0RKj4`>)u7FjHZ>qq+k(EETJ_M>PjwTXlNpMCi?T8ZAs*csOxtRO0O1V`YLyYp!+S z5q0gpHasUnuUoT~anO9}P*r=B+n-+0hVn6=i3l^N7hAaN`*OQ^R|@ug(#$IZ$B#>a z9qPC^5_nq)<@#}+`GT=s(K~?zH5#~RL)2vlymSXN#!58eR5#-6OEK7j8JE=&mwJrn z?a&VI!gRt09cS8>^~A9riY`oP4kk0tZf3Bs*2OkE1@V>Z`FEfWzg-@^0& zej=KBz>2W0UmfYuuA5!}rorgdv}tBYo#1k=BqEh!WxR=t2EqQz6VpHA;T)?V^%hzNRl z{%rQBdmXf)Ut9a8gsb|}-eu4@--B@_9O+Abjc$TsK*CTQ>IpFjYM$?V14XoelJSR_ zdh{#a*LD@5!eMLls=(Ghzy(yS0I?|&eeR%zB?rncWbcc#K zORSs40bJv}%vL!6*!&TjoD5{>PL_+9W$az^>vOtq`e0mFc-4NN8uZA^-pY07*qoM6N<$f(@E2YXATM diff --git a/src/gfx/cards/dodrio.pal b/src/gfx/cards/dodrio.pal deleted file mode 100644 index 52095383b3962b67aef12223a713932941a526f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezGyq`&mk%IvM4%7lC diff --git a/src/gfx/cards/dodrio.png b/src/gfx/cards/dodrio.png new file mode 100644 index 0000000000000000000000000000000000000000..4792c45d0dc14216b1e8dc9564b545e5e1a2d02c GIT binary patch literal 701 zcmV;u0z&0006|Nkld-Gy#K?ECn75fi(Deb|vhzIFH zrh%r%=AxlZ#1br_jUenf$_gc=C*#`ZyccP)bC}_M^P6vneY+qp1$5{Civ{Qi9kw~B zv+&K)vHE#X*P&zUPV}7UKDth$b0-%bR)ZS3hB)_FJE75x>0EfUOgj>U&WY~hWHWav z15gfGy+=NA=NYZ29&?+BjUv?PED zF~g!GP^ZQuZrieDiV0r$1c49*8nLoV4RNd3OTvLE(umcl;3c~|%VTg@x22B<3CDS5 zId54Ejsgp7n=ii3&*$&Ezjy&U$syeO)0@Kb`sCII5uN-Otc2xNMAz>-im=k771=vO zEK78YMA-Yd^>X(KBKqj?Qz9m@w)26`D9_ww<Y72jzt#L%59z~L2ZK?!pwt43cDt>UnJU#U#J4xaK@mk4@!&@7L|zRMs4nUxz_ z_~}=tf6IXLX?d!JF~15Kx(SLf2_ZJ_*IBq17yw3C6G=(Q`$z0?&Ramq^C zmohZb4l(Gdo|lSfqRm)5!6?!xCQKGr9y#U1(?fd?BLgB9(!@}G*)4|Q2j_XQ#`)dU zwf*Dc{wDaiQN*$k4^lUu(|ywiW17s!Mk3tHEe`h328fS` literal 0 HcmV?d00001 diff --git a/src/gfx/cards/doduo.8x6.png b/src/gfx/cards/doduo.8x6.png deleted file mode 100644 index fad24674e638e7f822ad489e199d9d5e2fbb0138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)6LA#BUu>^p2hR>yq)Q!(l;WR72;@?#Lpzj+_fE{@l0$H) zvrDQX6dVlLB}LG|N_YoJ#%M~fi0%$LIyeX=mAe!b+ROEx?{}BfsBby=^11JO_kHgG z{;jOrKCZXS5zP62Do{eUJyhN>5yvqP5zK+qUml!PpJ47=^oamQ22e^g(dx-#JN00W z_lp9jE)kdj`g;SHDfNnA_LSQ_so`?sp$5zDoT$GtR#cyD(Y}jEG`@+&M?`g>h-%Ws z>uSXYbLcA512qSKKrFyC18_pLgO7-30B$=Dh-psRYes=8pdnguLTov!<3xD_5l3oj z(tVAV5&-dr5CFg4mGY1ZH)}9Uo~GT(!-}-B$*sW!aKB-7f%!4oNggJ{CRTGDS9v1t z!d$=^+sU?rM6j-a=?6b?RfbLp5hO~`C5mH#)j9%YI(S8@69)2ywtRjIa^-X({1qw5 zG>%pB+fP?GeX;_e5+qySqGV7I0!B7ERdf<)i zPILEA@9O#TUJEWhIciS51iivu%%K;-xrL+hj!yJ6q(<043r0r|ZC(SJIH^xCb@jEw zGqQ2=)RDAc^5F(GE|VKm|AHo#N~PzgH(bBRawFAsm{=qV#IQ3UCKvB|9Fkk#V|4*7 zI8U-@rWd{YXATM07*qoM6N<$ Ef_W$tk^lez diff --git a/src/gfx/cards/doduo.pal b/src/gfx/cards/doduo.pal deleted file mode 100644 index b3e7b2094d3a7015881c286ca4fa890dadaf3526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyL9WOjpkbwaJ5Dfx@ diff --git a/src/gfx/cards/doduo.png b/src/gfx/cards/doduo.png new file mode 100644 index 0000000000000000000000000000000000000000..31b44af29659570e656d931204f9d92692a859eb GIT binary patch literal 656 zcmV;B0&o3^P)*N_AOHXWGq}U<00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006bNkl~4!(Tu``&%uJE&uYo|`+Wt3V2C_P?^U z(8~>#GfWtUfgu90r2g|jTmu3aSPTeD9UMXlQD84EkLkn%Fvgn#CoU=YN`;pLUZTV+ zh4o)<=6A$Pv40$D76H@Mrek^zTw-pk zO-L9qk+Uu`|4`~hy{^QxEA6A8O;r^!dqzym)E9P%Isr2ul=Y zI>`$%bV7(AQL0d)I1-@OVQJIDSERD0C12Q*&(EV7EaS)qXqB0eyPx>`iVWGa6>XPHiHO&-X_P zTQ^l$g=4^UQuwwyQkx2i?wM3Hi|k>4f3$^prTk=?3)p&hy^ampI63-A^4NYfN5zli z8Z@||o#jU3_Rl%jPD5^_atAvrM3xw44~gxSXAVqqOB2u+kjGb&MT2hHnmBjf6Tva` qt=MwtNMF;!AP*fJ%rcJu9)AHCt0Q2iyh+Ib0000k)cz)$_?kB5Dtx>Y zhiNFSig3DY?L)G7pLUcwPb^`c85bX c^Z)*i-&$JBMVDSC?EnA(07*qoM6N<$f+C&kGXMYp diff --git a/src/gfx/cards/doublecolorlessenergy.pal b/src/gfx/cards/doublecolorlessenergy.pal deleted file mode 100644 index 85c7d41c94b5074cd89287599395c30fd43d915f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgztyQnv4sHu6r2O6 diff --git a/src/gfx/cards/doublecolorlessenergy.png b/src/gfx/cards/doublecolorlessenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..767be487d10974deb04cc5848d2132a3fb3d69f0 GIT binary patch literal 576 zcmV-G0>Ax0005gNklljA6bJDCg>xjzz@3C6MIE{zq?&<`z!^QWbRZTs5fcot8JU@Yk5DN=wYo>-`VCmf zm*|iU209msAwntU-T4wq-*VPpPro}oJ)^x*xTsxKQ9AG+Z*X4v(kAog7^}utB!>Px z4IPD++m6ndWJ3REsC$yG8&e|a_?nR`K+r#+vt5k%Tu!=-KAecdbp1*ck?}^ZG~m0%V5H;2>Ev=jDmeDq^Do z7@1$xuO*qjGdSp3+cY1v?^sPaKw|A@P)34{LNWqtc|K(>*vPelFZr~d2sTDUCUP63 zW8bm*$kquN5WQ@sDH}wTm6|Jdo5DsK^Kx-YZe3G0sOWas7r*1?@9`Hab1~ch99{nFC-GQPIh$Ht)Ud;TZ@K(>A&^NU1Il6P0 zzf8qqqJclAPzgn9wk?_qBId?6LlH@uVj65FLPmc=)Wlg3hW%iSUC&MJ2cO^W!;AOx z`Fx%OID8Pl(a}1dQai&b0t_uMa!S+HP5Dtcr-;@A@obLg!%>17ZMJ=pBf)SkfUjV@ zCx+%^_3__Mgb)>_`{Gs3lg4Q(D$I;|o(s>-2<)H#8QzC&xfNGY(2UDNF-Ex?TRC6M z&{H8@ixX)zyLKO&w>Vr| zDAM@ecG#Kd0@hZ7B)grKh3lUsE)FM_87j<2wYEGV`UJ4(Afi&KzLcOl1%@e#yj6`T z^b^@`WH8grAc5uMX)MxNJT4HagEB5|=2=kXRaBgY<&uJ30S=c{FN=)tDI6(J))NH~ z_kLBd3@oL%$@1jc*e29W8^7154a3+nINzv|hepHLZYym4TKJLI_6oagFTZg_VMMF1 zXVmx!j;Ob97HPo};_>zP`{Ur8D$MvvkVx{3uP4$SfSQGQ&v7{*N&0qbAfnPfe4#fZ zdX$h`8Co#=;5Y7!s0ppSmERqRn17I*m>t%08tH1yE=B0}O8C_5$nCe?-qO=q!(SA+ l^=soJ}{*;00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00087Nkl+@3aiMRGsF@tjkIo^Zhn#$@&xUfsw z8{6pe5hJ}&{qPL=0r}2gNC=5|ZsD_e(?Ksodcqr%6qy)n7u??qA{7iGgqT>XweU#= zLt2ae9qeVVyV9z|nkbSi+k_bAWP2~kfG#4;63jYk=h`FY z80a%)eO!Fz5-D>@HPCzf-f2XJ=q43cIu6Nwc(L42J{6bLN)rVR?`z>u*SL8bf!f84+~6wOXgp=pFO#rfU(2K=g|>YJQ;Jskd*s zzIac-N-G?xY6XCD(4*a8g?WIoDNFg$hT~R#w@@;5s^p?0-Ea)jzSvMR;X^wp z9vz7cdLY$iX^Ef^lBJgDh<`K;D-DhDUs70>xiaT~UtoPigI9YvA41RVtWfAft9aTY zxcSX#tz^JoctMi8xtFu?Xl%N&-p^jpj^=Fcd3I$qw*9RVB1K`Vdfi#cBa{#P)-UhCeE9r+za;zs z?q@-srF3%wf0L8h5xF(mvOJwPo`iVb@r@XwA!uJjs7(;c`z3o@Q>R6%TC9W_N|*x? zDRGe*eh2%!Q|FiBo3}j<)X51_Klp|Z(CCYa)c1El2~+Uu+5NGK^QbU^tQwdwPJHl*uZou>arfaw3o^x4V-q*^w$t0 z!YMQE=O2t*B9m9(`0xM#002ovPDHLkV1js2F5LhC diff --git a/src/gfx/cards/dragonite1.pal b/src/gfx/cards/dragonite1.pal deleted file mode 100644 index 9b3e0495fa4d649edbb1cbc3390abeb9a480c082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLJztPTiGcwC4{`!Q diff --git a/src/gfx/cards/dragonite1.png b/src/gfx/cards/dragonite1.png new file mode 100644 index 0000000000000000000000000000000000000000..205b109a248682929087df361e87086371ccc5ac GIT binary patch literal 701 zcmV;u0z&0006|NklD5BkVFeCrKj(g;i;C*ah1@SP)%656EqyK^=m+%C= zb`7ji5hTs*p-5p&I(nJ2C5ojWGvn>O*tK21hrHy&=ldh!8$j;_n3?k^U7f(aip2aF zT^mW$4BR$;Ok7v=jUizH$&O7(5)xANQ+5vmVv1#@cnUX+u}5uU3~X-r6{MAT);%9| zuWM}U!35D?`-Trl__;##H#fi-Gw|v24bVYQhW~*GLiW>Nw}FZ>-)@0QJBQM*&ThcU zR_`4e{`5y56bZqXl*%ttkKjK;Pn+&><8731a4HDGz0k-!4k}Si5SD#oGw{XzzM4t+ z6Lm1gM@@6)tfu4aw!{s+AbH|gMXW1X=QUzY&}y_*)D+h6M=*qN4H9wnNlwl}0@s0s zd9;R78tncGLN>W8xxUJ2*XnRS?Q_!TcXjGX2py^2t$V3Vs1gNtvp*n5# z4-c(KA%u+*u)sd0Vm`cJMbZ%RNo(f5*Ek7NE24G`QUXmTTrB0IK?|w#55$(ld3d5M zFyIt%6^s~&%XwMaLb)z~TlPF{s3$VWp`24>T^I-i<#F$@kMdoC#26UI9*E#F^9sr~aORb4#A%BDHJs1<}mSl%pxdU#T)oKG$rL4%xiZ`{ j&DGfTf^Kl*?(gvz`C{6Q{y$0#00000NkvXXu0mjfwiY`* literal 0 HcmV?d00001 diff --git a/src/gfx/cards/dragonite2.8x6.png b/src/gfx/cards/dragonite2.8x6.png deleted file mode 100644 index 9d15c00f45e2968ab0b1ddcba601e9f9f01a63cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)DW`K~yLeb-`aq6LA0s@bB)<^&>~ywVmY_bQ{q_M*F$-4~n+MEuscl-B0_o zVZyRn52@f=)L|Az3;MI7dOa=1%XqFCj98yd-VC>zc`>m zt@8j-0SKZ95I`>icuokd&x%li<|P#XD!>K09nWEKsR)b!PO4H-RfTewq+uBcrKXd^ z1p1b z30ol^=Q?aIn;f)0HCb7?rrQO3%yxX_Ge5b*p=rG-mV{(T`ulB;`!8>55X5}hF_vOQZ2A4`-E!x*%xJa5 z*!dGbp_FDe9th^IKgoY=ZA-Bt6qcOaxgn=F+}O<8OQ|GQu;fMUO8!n%+{D@#)3LhL z(-8N^I<6-+F&1ytv4VAb{6!Y|9R2g<%mW-ymIWCSNP z7H2vXclX1)`C-q4rU_YMng&UmG}7cuzv0bBHJ#~@<;jS9K3G20kcg&bw+oV1G^ZU+ ze_VCpFwp)MvRpJn%|5H|82>P~+zmjQ0z!MNt=fW2Q6ssgfY0_K?op# zI{}U`&*~I_Y6w)dEYW&9;1Eq?074mnurvS_PA-)3kH60H_84jKZ&m;R002ovPDHLk FV1jgEU?Bhi diff --git a/src/gfx/cards/dragonite2.pal b/src/gfx/cards/dragonite2.pal deleted file mode 100644 index 1313288cc3b1d150dff7298d09d3a079e9cd17eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmazyp3f-C$ie^s2!jDl diff --git a/src/gfx/cards/dragonite2.png b/src/gfx/cards/dragonite2.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba22a7df0ac4fb1726255c0406416a3ca42084c GIT binary patch literal 827 zcmV-B1H}A^P)C500002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008cNkl347 zZ%7ki90%}U9B34&AQYIeKnUB!7Zyp1ol#KlN~ok3^va^vA83-4$rZg5vR<^x1e2{l z`kZC3BHGbh6!dTFS!6FFwhMBmw{=@+Jk7h?w_fzB&xi0I!aowALto4ipaXDh8xVl% zAz-@@e8F!+2j2g#BtQowhrhsfD3awN>;wv2=eDjpuFIB2KP7N37bM6)-(*Ck7#9+k zD+`r!G+JWj1bvh7j>iDVR?9?|`6yR0V}69ac`wgZL`A*qpjaX(&xYQbnNGg@` zB{NC&Q{*@Q8pu;ITDrM&t#tkQyr%UBS%@sfQa8MuKd|+fW=ZGSMKTy0O};pIaBFUq z^#@sq48}qS605uyzOQi`?xQLhjqXd&7Rq;%RL@wDdFb`hWgCAKRt4J2-He^Tv78L| zns@h;-V=Mg>&8Zd%tHnXH9q^`Q|FGqVI%Hfh-O*ntk&&4JZZmWql~Ha)qQC$l8z3a z2)|`4GN#fj8^}bS%-k;}PO-mKGR7|l#wG@beUF;brfFu$cvuoHGV@ z?>~gkxb1Z*1UR;Fx9iBz(A`+k*XAOmglKs%7-ZTz{1O(@*QJM(b_Dom^f&-}l zNQg^*l>?+J4%dlnYVMi0Wu=E47Xas13OWjs;{xG7e*m`32MC~ACo%v4002ovPDHLk FV1h=sZ>0bL literal 0 HcmV?d00001 diff --git a/src/gfx/cards/dratini.8x6.png b/src/gfx/cards/dratini.8x6.png deleted file mode 100644 index 1c66ac3c346612b0498bc51defd2b072030e7536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmV<00ww*4P)Bgw1TxLp?|qnqajcfrcVQTD)krv@3){Kw4?@oEdu2ciG3s zZ@+o(dkFnslB&}h8#jqlqD=xxm{oeyB8xw1a}Tu{CjCx@bdnvwNh3i8MpWe_smh$_ zDlnlIY3ge-9v#(?#EG>Y-^dL{P}4k?Qe#(6?|yB{*vL~MWnk3_mk+~78=UCUb673+ zeL0Nn?x<{zfMFT9a;@Ks*?UHcJ{u_Lo<7x>o}PUbqLXSUKxi#~_AbxB8trTpa2&Td z?<4(@Ujvq@+ng{`pHy^p(IdpPQTxPRPS;lt(agL0M1gv+IV`6WZdMz_BbJQ>tm~%J z4eQ^x>+>b^CCkGiP6WQ~FS-1cHZz&iA9lm@rHl1?A+x{}Go8*qPi9uioDeWI(N~M- zhRfhGfe{!#LaFO+)8m964f@65)naI(Sz-bb*fD&Uin3+CP?RWYk;L=s(T?Tu$Z;Xb z4~6k#8K*(3_%;+;NEF2tS;~Ueeb7t$Gn5z!Z{R7=%J38?Xr_WP^!8(%3)_n5XCCPW zy&Pz7>OXc^grYdvkfa)D8Q0!4xkr`~H83SYg7G-@h*RNyD{M*`5>y0*5eKk83tRC_ zaloW^5yie`bgBkhc~T5L;2x8Nl&i2qNIu9W6_m-0)0~6fROlV#L|P@qyKqd;!wFIB zpaI=)Y^}00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007$Nkl4Jg4w7}FR~#+Mh8WhPTE0=2X|1Gm(cFuWr;Kn-8>3Ad0i(1JC+4R zD6Pw@e+IiXb*&UPnz}zK6$Ty#b3-G<9lY3-#rNKJ+V7GdUq1Q1-~0X&@JsK*X#(5Xg)e`*F8eI3CWw$#u_08VZI#wOM(k)wY(zJ%v=zI82A!j>$|{b0 zTIY&VreIwql~kQUbzvKPnM820{!peKRE z>I>#Ei%>KSL4*=DI;m^UrUl;woF&5MDkCxm5?@0LSx@cwE_)=PHvnmr@27WZ;3b=W z7JO3GZ&2d5X@*rS-3@da6V5S#Qvh6@kD(R!B#*rx@aQH&V_S~%&Z9&z;vKf`qhjPF yG4pL1I+_u$a>P97dnFQX86s}UbUirzd;ABEU9!Y@H9S550000c9RGk(wg`}_|EG+AyS+HrW?qW;xllA3b(S*)W zEgn2b&>loRda;xhwZ7ptIpmhb8m3>N+v9Aqm|$sHVkBX@D@Y?6g^>B6M5KQQ5FDX z!oU}K*4^d=0IcpTnj+pxJC*>5hp&RQFCxJ}J9Y&uwlL+6BT|2~+2;|{5wo*ADI)S| zt#Z;u>7IIHMnps!8}xkyGxOeGo{$-tk_{$YaF=G}!8R#3n{u1o9>&H`_vG&@lVa?M z+njWX-+#5+eD(#}3%(3o`$+eJ>q}d%Ax}C(A_L-*Sp0D~ZiqbeQ}QBH_b^%s__pBR zd!L#P9*K+5w4;m-)hZQ!t-lFcsHq&$@&1k&@=y3!iYS${djH67i@aDIiPv(d<63jE z5s1jLKKuLxssyop-8HGClBKix1YLh>twt}o<{kZub4=TGY*oa>^vt4zDT0qn?BZtn_$}>T^Gy;HS+&wrORL|53P8tA=cPp27%71N^OKAYW zyWxyf^VNdA4uH+eeSOovTf$iM&q4DSKa diff --git a/src/gfx/cards/drowzee.png b/src/gfx/cards/drowzee.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6544052952745df2cd8565af3c136c6cc091de GIT binary patch literal 776 zcmV+j1NZ!iP)0007;Nkl`<@ci#M+~;Xeq%P>`8*;TS0Z1_4=l z4AUt(uPp$$OhD!$knF`NhXLyx0huvi(<${?;eu{<5nuq=%#|xM3rE~z5CDsuDU#Yc zl6Vk|69BheX&?`Osq6Zl&k}$g?RSDC9^H5d6bOL8F_D*fVB0SY0stgQl9{_t>{u>| zhVoXES!uGD8acWq)mJi0TlV}E!9W#E9?_UR{f^Wj z3z%E;`u+Iixgt49jKxuy-L|pCx2TUpBt+aedXuPNZf{-5dE+GB>N=*~5;HgJ^PS5i zfF&7Yol+b435Ft?N-bjfuDzzbWFGr4DW5Xs^_0l;lWs+ZWp? zD1KC z7vL&3TA@0CPW=E9L_o_sz4Y>zrv01_5Rg9;DOBN~MTtMFwDZ5N1?bfP0000qB;hh97>SfO~?K#N_XZ%}&BWXmgBK@rx0 zJ$mzK!F!Qb)?Lhmh2|~PA_%jA3OfwilZX8Y4qT~kLGa*G^7_76xB26_Bs_ec&+~m> z5`cdz9|SD$`x6@U1D}RtSYopZCzLWajT-)GZ66V#02n8zASk61pK+1zcj(L!P5^kH zvQQ9Wv`fnQzZ^qC?r|dIBRQd9nM^-9n)K+*F@^X}7e#5NAVzoAmb)(%zUK2RSe7)N zZypoeF(#h7ylKuFODz1+BCXpG|8RVGKlfCNDaQn*!}b?P$ES{9KpaQ4A#vgu5~rr$ zB()RAZsnaNWyw||ItyRR4|1Rr;;k?d{fh4oHd;8{84>faElx|xka+SP_UkMfknqyxK%J zUOZZdeCH!~l+(r6u9;80S%+Ms5jl7cQ~>+{WNbu^w-wh~u+FbS4CBbrC^pemKsKmI zj~q_gH5ax(6JJE+@Jb%KPE7!1-i#cCxK_ch1IX-P=y_sGli%4sK$5wTt(4Q8u+Olc z022E;DpsN#n)YO0gQS0p)g7Z){%{cLrqy?Sk3PpIb>`_cH?dhBLit5$^2np rRaw!IbwsEL8@9|L+eRAt@9+2x+kTMM??-b=00000NkvXXu0mjfO*kfu diff --git a/src/gfx/cards/dugtrio.pal b/src/gfx/cards/dugtrio.pal deleted file mode 100644 index 6d8c3d2978cf567acbdd946611ae9cf6af5b3200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezGJYP^$kc9yN4s!w> diff --git a/src/gfx/cards/dugtrio.png b/src/gfx/cards/dugtrio.png new file mode 100644 index 0000000000000000000000000000000000000000..41d93d6bf9cbd24edd529806653b3f056ac730d4 GIT binary patch literal 695 zcmV;o0!aOdP)0006?Nkl2|aj9pofBitp!19ptE5McD*#k1j${9M{gb@GzC$xinHym z9)hx?yRAf_y-2_adh(J(V%Uv`igeo@-)z#>`YyXXzW2@V4Flr8f~Km1s^wBd&8Zqu zCSV&zrKAV}7)u)3Y0VD_MFM~Xkpv+mr2&dGEl)-cB_#y*2`G|~qYJd&Jmbhv`U(jJ zM_N(=oldTwPR)^#V@&MNF7PDH7|7AtwXKEwAs%ye6s%2450{S#bWBj)*jjc*jcrga z6lme?^M4#SZXP}M55i-Dkj&y0(_^O&HA_u1u*BfRk)dYAdrvDTj+xpmJ8sjZL9z=T zi;GNpl`H-k^J(ggFUoBR%}_mh1LuD8G|f*ybIzElQP%lUdFkw~(RtXR zNYL`eQT&L1y0%z=c5yDdLhIl5tA@Qxo?e1h{vtZc8~fEF|M1}1Dm3%g(NXU>AGAlJEhaMB>ml zbpDYz0>VQlaZqa5J6c&l1d|zEm!}l*&ZY$P!4U0Qy^DnP2hIzK;c~iBOLF-BlPMqi z+B>Mk=qP+Y2<4-TxHueNN1}R zUoCqvPY9PWY;vW{EhZg7&z8eMb9(5An4Q?&*A>QH?n4~m$7Mmd>2Z5V1f026gpg%% dpUd^n)L*JVY)eafzhD3W002ovPDHLkV1hT*JHG$` literal 0 HcmV?d00001 diff --git a/src/gfx/cards/eevee.8x6.png b/src/gfx/cards/eevee.8x6.png deleted file mode 100644 index 3114928fa0b2105fd98ea8bf4d04cf24b6f29562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmV+r1MmEaP)E)?5*M#|%+1OMm1%at5XGnfZ8P&vZP_r^6AQ-FStJI{Z!l96iyL61k&eR6W%I;V z)f9Q+qBH2c0{`p$L{|xu$~TuND!2k|v(L6eRd6a7775XHM$qL7)`>2+*e|ARaT?mC z%*V=b{aT#f;E8m&!U(CU0MH=%T=Y+5z1B-&QZK+oVb`U&L{^8NzFjr-LhE!xZzZwM zD)sXlIZ2%_3YQeObdSWqGq#hXwCb7hE!I80n_PjeUpqNcs_&yh=dFQ#8iU}`?zSQB z_QmPtKqJSkKugA#H8O#vNL+aEJiG|@BOOAp!;*|^4*@FRS*;q|8 z!Y_Iy9rT?TC!fAd@&dHSy>YV=_6ZTa+E2zEia)m%SZaIxJl$KN8ldMQIsAQjw6QXvcvR_-aVXDFn=7G`&Rbcenaise+8qjyW>O_g=f& z++=I^CWP^r;|6KBdw4&(*^RN^=Ud8uKh#7vQ3_*(_JCj&-A*QBq7(%*kt3{SZ zv}YoRv40+B;R-TvpG&6LvQ5WgH+n`@Cpvz@Mi{8U=!iT;?(ol}YOM|yDp@DmyXCF% zO$azl?HEapSAI@7W*IuHylI-h2^q`Va!JdwR~UgtI!)ygI&%5^=YYRorMH9V;jLQ$ O00000008UNklHf zPiPZq9Eb7mnCVtsZRRC;4|W%iJ*&_|qnHVOM?qSdA@iHD+G8edQYm^D6!9upLRwx^ zLD8nph>EaY6iW)Z?4pnnr&3w;VuZwie?Y;Q8V}xl&Y$ap{%@f!Y+-6bX8?p@xQK|z zQV0zD6tcLB(2}GYWswnw499b7m-~gVR*u@-wfD6*+oQG7A#H{WzTcR zsk+!)yl_diIG-w==T`^(3f`SSjuVkH+2?uCDqhX9?W$oE6z)q}(rN*Zx;l z&|VpvAd0mYo9BL9`>!~I^&MjqGP(7L+@~+^k5C1TJ)`5?8GTfyPvPevn8DjzGs|<~ zykB%ICc2VpFyxQM++uOJ`4|%p#(cM{ZF2v!o4b zLOu%13^^smvDqWHjv`bvK;gx}Gk0EBSOPD! x3}fsMDOWP8l@wXjpaJ0dJXuL7Rsz58@e?K}MV*011m6Gv002ovPDHLkV1n~XclQ7Q literal 0 HcmV?d00001 diff --git a/src/gfx/cards/ekans.8x6.png b/src/gfx/cards/ekans.8x6.png deleted file mode 100644 index 416e07326eb6bb8b9355fd708c9fb1538da28405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmV+d1O5DoP)K~yM_Wm8Q|6G0SywFM*ovB8oQPfBd09Jm-F1fl4b7zkKmXJJ<_CfzB! zn4kyrs6fvZH;S>j3G@tf~`dEfWm z0Q_4qhf*p`$KV1HMFC=hF@Z0=U+B81xe}nR%SX20=(=g39V&go*CA5hBPA`ggUAI=^37D$t~GElMFw-?Yx{}h1;h95`Rw_j~ zomIOL$04}0u!+8Cz63td@w>W%yJ?8n&Tv@*56;9@A^h#zu6Col_@~07*qoM6N<$f@y0008MNklLRVA@%HAd5{b6OD|b4S;~v z*hpz(-=q#yGGKg5>=>NKjk2YwJ<@UI59<2rI2L`a>L6Qi*Zr#cK_Q9{Q*}%-a=7zU zHKY*Qz1&wvtpv)m7F30=ntDx~XMv5O4bp<2xqT5Q(H-*vK^UvqDJ)0#& zGVwc;m03c&;a@R}UJGQb+36`c$Hl?!?ZY;k9#}Ny?qwwdT1Wr(bG}_#%fOb zg2ET(4{Xg7C4mZ>Iuek=?e`f6WB>Y^Vn3bl-uFD1KCe1Y6u}> p5YVwQCItWndxZ(L!f5~Z_y^pRwO}nv6`%kB002ovPDHLkV1fm`aS{Lk literal 0 HcmV?d00001 diff --git a/src/gfx/cards/electabuzz1.8x6.png b/src/gfx/cards/electabuzz1.8x6.png deleted file mode 100644 index 75ed8f562971a4bd91ef71c64b6bd520de07f80d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmV;x0zdtUP)c1id6hAS-B8K6uDo>lQ`y`QU#H z00E4SF#eLj=$OWDJRm8@i^?3uA5}0qW&j?)FhG@%0+|(&gokofFgl}y$-pBfs>;}# z(B&uNX!8lrEn#4MA{IuQ*c3LT*Ij9CR)mM+`rO*b6ECz3+7g@dsFn9e%L;`@`e3>N zO|>f)5JZR}Qf2vEB!0m*Hbf=`e-T17^kGfLA7a*u!5NYM;7w(rvVCpAw=S~g+pei>}W(30r0D8?wknCtdg#r*< zW7y|6Z%o*61ppy}Ys$TWrNwLgLw9#5Lgqck_@Z|g%+cO@S^#)Oa>{BZ%2ZIBtbIp| z(lAbAeR7ro;ddaHzVnRf?XD*OC@mn3QiyZWc`As6R{565>hE!L7G;A*$1*E+WUn6rrkVOj*C~J1M3GAK}C_G%hnR@TC zL(?&|b#eyk#g`*y4sG14tg95$c}GGUYYopS#R=~5paoBdYt2B%-XJV^M2H2kKsx)} mb$BR{fsSAmLHuJFEk6N~O5C;Sa$%hS00000007tNklsB?qqh(K6LL%dSy%<`VzJfw8lSh z1N?&syMB{6yy1VB@@`tu9{02>wQzPj@VrUIE?5t@;IT99+$iWBp{Y9?uhZ3pDH z(dkAu5L8Nl$SN3B9_@>k-xq^9uD$GRYfkftyzsS|QYolec>8DHSyoIq(l`OFEZDxw z0e19E@=>W7Mo*ymG7iDeRu?g58eomOHC_O&&x1NIR&199kD0}mKrh=z#w pHqlTAkY;IO)I(73fP-44$6xexAZsMWSu6km002ovPDHLkV1n*aPKW>i literal 0 HcmV?d00001 diff --git a/src/gfx/cards/electabuzz2.8x6.png b/src/gfx/cards/electabuzz2.8x6.png deleted file mode 100644 index 8ca64a847ca98d02c57e74176df8a172e7e7cbb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)r75dG34OoSgf@|0)^% z)e8F$P%Jubvs18Bb!^cA#Gu?W*E@hyfB7*dqmGHEW4XEfnXNcqOXludZO{!2t;$=n zD{h&P?CcFB;+34RBAk7K=t% z`H{)g;V%#O-NU0hsWO>uE#2GN3K^+a9uYmTJj1g;FW)=n`sRd=z2al7M?*b58HSfV zuuTsYwr@JTphJ`=5rcdMh$QC5>D32Iz)p>G1Z^qoCrVqhX6J!{8^Dk%1k>tqsSIQQgi@O-1RK!00bwcS z2SF0006mNkl z+Spad0Fvt|F{MOI28on3lI29kjt}?7ag=h0BkS{d*yj@b?~wQ*pl2YUj(G+u6+=&s zK#<8BrZWQ05lg#sBVb4mZdi;CA;>)0v)1e85S%}`zidvZB>-0w<$Yv}B&`Nm>pBQ*Q4gN~9vo`;RD+lP7)4Jc)5?7nGM>Cjt(Zv=r!W$76b9B@_VV6d-6e?Aa{4i$uTlupxg?R0WtPeZIos{N0|k zKHqRaekbVy$i&5Z?rZnDgf)4*C}8YPc7L<*#{cQbmuESQO|MkE5~$S0t%-9Q(Qm&P zf7>l#GaI%~$h1rjq~dd=FKx}!%xg=p6Xes(j*sS|iuN2mY_*!Cx}+hRu7)5-JFTwz zh_sHq82I0EVCc>cwtiIRF_Xi;s6_CMx4;w+wn`KIk|vL7EQS(Z4QQN^-e#WSC%b%y zq}k#y1-XLy%k|dc3hwxN@4WKFt5mS7T zabXjdE4An<1+?)v+{JtOBo1!h+zJxjKJ)uGCt9R{-LfA6d>>>44Pca_UAAZh&Vsvw zI-wTEu=ZF~>#ja1aST=T$D|qeNQzf{I*rGUo`1SQMwC91{Xzf$002ovPDHLkV1mtw BD%}78 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/electrode1.8x6.png b/src/gfx/cards/electrode1.8x6.png deleted file mode 100644 index cdc1fcabf1ae878f73577ccb6af1e2e42f399e2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 732 zcmV<20wev2P)FH36h?);F$pB-&l$2T#H9{uTY<`>(;$PiTtze!sCS2qO&yRp zK|j$ix$GDQbt%4M(Oy_uDq=w7rdJpotka$Kcu#M_ zNHms>!zH#oW4DPIB;pwSA><6*r(q15tdhfObpVmei*`FF;z;sLHNTM_fvL%qwlc)>^DlKWCsx8l9gU(~r|-|%f(%JQHu2Pk0007&Nkl|D8+g^6KdXyQ~h5JI#i9k4Eh*0xEbto%z@s5>>7rp0L! zSRj<%fhj~x7)_iKWK&I832E54kS08mTK{4)LZ9~yJML~yzIV@g=MC^910_w%#q7!e zYGzw}xRe2=*D#i>0Gu)thL`EU$Bbxr95}Cbwis$T40~oU7kknL(6JgbEF!kddM)#~ z0N{GWr|gmrYb(K=eg*)frqgj`S=hSYFnha7f=l^j;AU75I8EQjJ<>VD+9bk^=bn+E z{Bd=693-=_{l11WK%LalFRi1R6*)q(Ae1l4(uh9`d+&_7f*_*l>sz>B>rbxuDPdhYGlp$qD2bl+v#XZg2(ioc;EUicWE^AcNHW z);E@Kl!;)2`)dUvmKC2}7-a*LbpA61ZC(WF=CUC6%pvN_6Z-&x=v}B}BF=}<;v9>DSh;bLh%|~R?us38y1qy%1bUb4hc&vs z*CF&S7N#7=bK&9$mr<0wknp&?&WZUzPLy1meku8*LRg3(l{{9S`=)3Pu{07I06T@) z=|41CkEjz=VGduY7H72ctg1}_Bg1KAXwgm|r`wj*S$u7OK(zC3rflki(f*WMx6!~) z@fp#nn!}lKJJ0QW%j9*@X%wSqxf$x!Yw@e1(@;c>*iq<;WD|zYN#hG9yn$u z9D-X5sE=1#(rJ^3-3}7?A9frqeUkVX?RK&r#G`k;JdvqpZEU( zr>*VhkjWMVu^wnp3Zj@m9$BDK=z`P$nHn1|kNQOV!Fw?%N6>r5K|XB}RgA8SP6yB* z)1<6~ ziUK(6mXOFwy@zfzg^f>x+@;d3W&jgk#THt+JDXluw@*JnqGCi&9@V3@41AbfHzPmk z;<%bt5@MW3qjECXaWA~BLBKR^UQWvbcHFUQU1P#w;lZT8;=1nn8lNDcSV+!WKU{a> zZe1uKZ&P`4v+@gUaD%HT#I(Ef%@P~zo>6+qc zVK2Mx{hg3_9#$EMgvh*^x|v|YSUeGmFEU(3{ujKNGz$Vo@*lCrD~74Hp9mA){4UQD zhu+^Lri!aR2XvdQS5Jy~8@_TN3ab7zQc83P6wp(~oELSG+pnQ*mkBXf43Sbbs0n^I zQ)-=i_d?)fkVXqv5&rdSMYdAV@EyK%O8>2We(iZ)E;y8?1b>h}G`GhDr%>t^Z(WmS z=Ky)RYNJnH%5m=;H~Hlk(f*;Y?tD|xH$O>d*Vh|{L@Qq|0TFvO>IVTQhvx9tp0d9V W#1KIPln*oj00000007RNkl0r5!B{H`TyFrIKgoj*cg{}%6Txg<05SWe! zg$UCh{P$o&EaS9?p+Ho~gRrafS3|A%&(7=3ssz5<|M9)|cyHbSoe0=Fx8!pGG&U$A zAwcJ9RG<=3BELl{B2bmN#mu~k7`ENe%W47E|4J&j9%4G!`XP4+RvVEDyOCqa9HR=s zx+Drb^fH((-&P9}{3l9GAbNigpZbGJLtWIV8`GIMN0&qmJioH*VVVUT?EOs=>arf- zNGxE=rCEZgrX9S8*JEPr_%4tn2h;d021zXwpd!^>Xy8Z;ZW0@T48M8J1g_en6_ixC zfgcY+-_>P;K!o050vnff4;*Z6<8h?c!ZxU-gXW_^sZ#@GGQr>a(0o^IYDu|5fu7~j zFjIvt`{yl#H2A*5%Q+aME_*JOjM$J2o==-Ywr&41czP${NJeN+)egI&H^>A$VGHhHd+0S8P0p zyR0-pGpxy^Ut=Q}Jp#G=W$vQ>18dS{ped*x8v`!a@T1)$Fk`*w=KM^R}=Py?y-MBk%0&sDPq=b{d$3J%o?B6m%=+*!L N002ovPDHLkV1jQ#MR5QC literal 0 HcmV?d00001 diff --git a/src/gfx/cards/energyremoval.8x6.png b/src/gfx/cards/energyremoval.8x6.png deleted file mode 100644 index 1958df739f9ad19d0034e17260bf8f15d4508c14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)XJxhe{!759KAGDUJ4GiS**#LtB!!c$I|NxN_hEFDaPr z$%7^eUOi#bZTj%g9twfwz};x^Pr!qTKQ293W1EBKlJBhn&zm%_wAyblSBvuKKlv~^Ml?m? zJFH2}vGk*?xy@Jt?G7aJoEJXcjK0uc);K=Wf1laITOrWZFR!8f!E5iX!xEKu&$>KN z)SgFR;RK-8%EST(+1a|bL&$p>CdC#+ZY(we&@!IIATop{ehC1IV-D8{)FUTBAM%d? zR)(0006=Nkln0u)fl5SGNNY`xP&3#%mp$#4w?uGzN< zwz89OSlHWu0UId!PO8o3}e(m@9#{QWsS_iJ`T=0Qykj zP;H>6dJYsTPW2wniQ3S*fw~F+WVx__W-WK$D1Z;77|8 zs-!0gbDYg!msdeiggKh$XRHuhOQPJM3`0Mh!H$$%hknqT_?jb40rr9@@~=y%7`Q#J?0bKEWij_aj!Y>vql_=|8OE07=XRfv3s zR-P3CpF$y?;+v$!@iz;1`*NZ1N%mr!zbStA_F>;JQ6yJyVOP+a-hRIxEooh+U=;OO zsnrKRn=kF3O@=4z?du@>qr+FP^>w#s{h`W_f19JCX@40gs8msY)iNhT#+1i58mWVV z^^&zi$9>UeMb)%^9T!tDp1f|Ll{H7I3yfLGDEwhiY7M1z$C)tL&zj?6r>po|s2bF= zrpf;4@P!q|f5jqX7yxa4JnR>_!urAy$f%IoJ# bz+8#{5|{wBOX|H+00000NkvXXu0mjfKz~I6 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/energyretrieval.8x6.png b/src/gfx/cards/energyretrieval.8x6.png deleted file mode 100644 index 270f96703ea68930c03ebbdc897ed0579d0b5029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)#{q1+fum-~&+g8rmx!s$*3dUgr$L1hJa z5tOt;Py-m^lpF%D&jy&n^nvxhL<2}%FbYJ$l4z{{!=(2;@QM&*6a=tt5aAm})*r%p Vmki(R{=)zO002ovPDHLkV1k6`%<}*M diff --git a/src/gfx/cards/energyretrieval.pal b/src/gfx/cards/energyretrieval.pal deleted file mode 100644 index 770704bd0b9a1a2a17986f5ea2573db3f14ce6e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexgzs89tgFyfQ5<>#< diff --git a/src/gfx/cards/energyretrieval.png b/src/gfx/cards/energyretrieval.png new file mode 100644 index 0000000000000000000000000000000000000000..93154be034d75957308de145a651ae08bd7c3fa2 GIT binary patch literal 519 zcmV+i0{H!jP) zsDNMq&;S4+|KQ|Y00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0004+Nkl2n`vOu~0_XSj$*5 zsNrYK!iLF#!Kl65zuG}#PQ(%N-^a)z!pOuI`=6af6%Din0P{(JD(#*ML9uLc7EFZUdm`K$5LX*BIESFI53j5wG8}E!_h_{iA9PBXlN7PMkjv>gTJO z3_=oCVtPU@yn7jy>^X|)u2HEo$L3{QIVFW2J$rfxk|_YBHZH`tWzo8xhs~}1!mZLW@4A0i@a3_JKEN z1=Qeoz`5<90dy8Hy3}G$&{+A09xxd5g};n$0IVBy^;^23^$Wv9W)x$9E!zM9002ov JPDHLkV1nYU-mm}w literal 0 HcmV?d00001 diff --git a/src/gfx/cards/energysearch.8x6.png b/src/gfx/cards/energysearch.8x6.png deleted file mode 100644 index d5d5328bd595fcfb583103eae8fe7e6a487b3d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~OrP)@G80Ap~~W@y+b!ifjFL`{l#uy?wic z98FySfRHLnOxi+#;3hLu*a(cJz{r$nahFeX0RpZ(Bu4iW0G8mhj8Pi6PR;d&h&WGj zh7e&F31C9SOA~ZZH#){CP|n4?`Wy*57J3&%)SOJvA#s4uu#o(lh0@Zp$_O0vASTVm zy7prLHAzU;auq|c)Dn}WMq5R$2o&?-G2;#)xk`T~fR&{|Vq&dbEmq{_WFY#Jj&N!!f$_?kn54ze iQ;TAl7O(%WIGTTlOu0)+jEP)0006GNkl)XxC!*kA@WFR>b=yF8l4AR)pM1GbfAYg|?>4}9XEqZ1)NwY!N3p~ypA*`7pxLYRzB?tSUKn@i+ ze}zIN1kd#E5TS}(??MPDi(!&Q*gpkYz)f`7TWCpPz-g!G7u+73FM+GQ^OGJ488l19g-h${X6_=fA zekdez$;dHYzqkR*O$)eYTo~`IJ*-)NOR$^}N>6zeKHY}Q30hO{TZYMxdwTn=K57mZu#bu2%Y8{wLyVXK54Z zLR9HZN9DT2l?}^GX|qqA$#Wk zaqI3@TAZ7j!hiOAK_sRq_Zy2TRa0O*dzVW6dC~Y7r9@#~ocy^c%JbsJ{}o3+kAMDh VJJW<=yv_gs002ovPDHLkV1oVF6|DdO literal 0 HcmV?d00001 diff --git a/src/gfx/cards/exeggcute.8x6.png b/src/gfx/cards/exeggcute.8x6.png deleted file mode 100644 index 585aa5d43273bc6f04a0750960227df1b1550175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVo0!ri~k%&KL3rbJ(2a=K-saqbF*QoF;H=_Fq8|CCY7#RM_bM^VkEgS zgajvsze3%}`C9PL?+u`X0snDe?3Z;SOl$YkNJuj#sGC^HJHf*XJt4w^5^=M3-ok>^ z)Z3LMOs^7D*x4ORvs>VVJ|w)eX@A_Fkngx8et)J&8bR5F{Rt7qUo+%nN0P9zEy)_% z0Op_H;I}61&Na7PJ2FQPs9F{!mk8^m+`-lj>O@Whb zc$7&Y^(h7IV$DOCGJr3EMAU|MIJE$tYcSW2|Dqw`b{{c;d{wR{*h?CTQMc|i$hXL^ zzFlJc)8h198P>T0T4*!HzkN5w!0+K>0CH=`Kmp$)fp(B}*j=km?ngpG0_Hzsam-`w zM?!SsW_ndbLbgsKA@nQ=UON^gPIOwH5@YYHYDpR~i6C&3AmdFt?{(@PHDGZ%-Vyeq zW9#vsd}Zu9BiOB$0HEXTOt?$y?p~JkJ?(|kjBS;MbT1Vlbi-PjWMd)00086NklU6n+pB1JFZgY=k!SGu-L zSPNZbsYx$I*V?t0CXTq$edw+EkQ591!_d4PSs-~HKKKqle&2V_cRtV#1!O$`g%>0! z1Z0Rps-w=2idRd;N&f3o9(tr3RNitAg8BJ3@pkcuwQS(8o;-wwI5Q zL&e}vR1i@0er0mT1nOkK7f?DY)5{T2 z7AJ@ZcUppugq?d5<)yMN9js!Y2Fv;c?7ymN-{)+ga7mkzUqEcX`9i8{)4@uA(lWd; zfEfC+Tl=`&3%RsUM)jQ%#hpc-mvpe+VwQ0)bD@A+MNyPYAQ>(7{B@ZDPTS=9xDGPr z<5#p#3SxLi6>x#7^~cWCHRUnIYca$@H#veIe(022il_;Q3n7rK!L?|I137Ic7R7i7 zGOj>F@b^ja0XPMp61Pzc19>!@xbN=*@63g17|B zKyQ1gN5!MVzYw{_xiLNU!%lYOid5ZVksBw1Cj#5gQgWazHBN*OqfK{%Km?cSB|@BP z6~hTi^0E+1--g`ewQZgs$_gmTy~xo`XCKWL@2yd?+cD<}lcW0X5yP(Yr79*;X+M(V za+ha@nVxRq3sdv@{TZv?AJTHGTZ7uv{v_w@E@WBjs2NzZ%j2n_YK=scjT%b>Z-T?$ Z<1fUyP=B%+Jq`c>002ovPDHLkV1m*+XA1xT literal 0 HcmV?d00001 diff --git a/src/gfx/cards/exeggutor.8x6.png b/src/gfx/cards/exeggutor.8x6.png deleted file mode 100644 index 6687638d04f20a8dfd1f0ed23f65f1d6cc262ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmV+q1MvKbP)RO1Yr?jmoYzyELI~9g9&tINkA|3l^`0Sda!La@+_e*hYCqb=Y3%~{-&&Fi91XB&R}ew z`i_AuKb8xIM%B(~jF6-SXw8qmZ~icZqQ3{^)>S)GB@#Y}Ml^gMY;zVK9Ntfn zyf>~4w_E}uU$p&Heazg2oiMctTB*VAQ?1P2wN_n>1KQ*PD@%xSs8HP1w2A|c_ge@{ z`1OYLZk1>P8SGN*iK~QW=Z_XLfSd#~+S*6h#zAfKWkjL!Da?ai%VUAzZ)CqLrLj zG4;+>4ZM(rD_K0KH;PG3gb&J+Ao3zr6b0)rLN6lKd&-jD`C2dk=noZoGuL@mEo1-y N002ovPDHLkV1j{UXypI^ diff --git a/src/gfx/cards/exeggutor.pal b/src/gfx/cards/exeggutor.pal deleted file mode 100644 index 5296d4360820c47e0cd5fe153b912ef42e02a84f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezGEYBn=$ie^s3n&4O diff --git a/src/gfx/cards/exeggutor.png b/src/gfx/cards/exeggutor.png new file mode 100644 index 0000000000000000000000000000000000000000..1403e38f348e90243177b6ad00eeabec6fc7a023 GIT binary patch literal 825 zcmV-91IGM`P)jKARqt$>AU6_00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008aNkl#4pk7e43n{hsgldoIxb0*F=nvx+Y+ zH(6QOj7Ndog|Zg2HYOlm;;hoCq7z04y4w2bDx&?wn=$O-^_8SCj=kQU8%p4c{YUG-7vn< zGOg!@I{waaSKR{v_zHSVl>|;y-9h|VHFQNRC~3N+ZN@mpIbq{MFQpZ~cVQ-qF=oc6 zheCUCd|K(_f(!&okZCQ*$W_w@Ob(0(BR<$VtF0l|z24et&^?GFpCMzOYzqeb&eai? zAqf4jX`VQ>bId0kJCjrTGqF)5)3F}{&gFnm0?SZ4s^QxKxu+n zgsG|LmSJGmXhBhws#3oBYl`gHF56fN`)Phx_`*z>^bIt&&OlD7rFjQrDqoQ z!BGz@S|)Ok7bH;@F~@PNj|yF6ih7QbBRbfa<)8Qia8t=i!(@Q~00000NkvXXu0mjf DkJx(s literal 0 HcmV?d00001 diff --git a/src/gfx/cards/farfetchd.8x6.png b/src/gfx/cards/farfetchd.8x6.png deleted file mode 100644 index b156585aecd42db13f56098ed3034d7d285809c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmV;<0x|uGP))vrZmnpF$4onLQGanXg+&GYiY#E6JIvC542AJe>6&-2f3j>%- z9q>rEcJ>^CQHZq{7P`UQ_SPN#aU_B@bsVgp8dwS9PY#Myur_}LVxMhuz7NwffcJ&X z9s^b|cprA5x}F=&ADe{u+VIQ(2?*?-8CAZQ(2Lb8jL+E3)Y;u|&t!-(HsIU~;~$K$ z@3HL==%5sSOdSok0#|6R0sr?P+W-In07*qoM6N<$f(rdV A@&Et; diff --git a/src/gfx/cards/farfetchd.pal b/src/gfx/cards/farfetchd.pal deleted file mode 100644 index 26816358033be378252b541364fb6abe6192809c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#E+r%?$iM&q3*G^# diff --git a/src/gfx/cards/farfetchd.png b/src/gfx/cards/farfetchd.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5d678976afa613199484494b7ec3b89e35a390 GIT binary patch literal 760 zcmV0007uNkl0t0``H1Y@HBQIoM+h!SoJr z2|)gx$Tdq!01UZ-J4pE5+uo#5F_;fs2SOiqdM$_nmBgn6A=npKO`CjJVeTi=aVUD@ zEhQQ4xL#eOTh&ud=VlE{igt8eu7vxuJ%l0p@WGwo+*cK1chc8Ri7 z%=i{3o)k%1Iu=lc0gFx=f8r1eNFpU2oNLY=j5E?L9dT620qA`jaLZI%np}bl$ZUoO zRzYvAHXP+iNfZ$N3hH4S)D$Ww=V_vV27f^2q@oWl$+R5cY`A^JfF2oqNmdc28J&)N z8;5k)?8pKtQdwP_#+A#kELWFge9j*y-Z$q~#`B!>1@~S!J7eT3Hx-wV4k6&k*!SEP z$W?=AJRN82{!+D3Pdd2FKfJfR?bJFg&f{K{&{}%;wPXKxz@r*2*jJpY`1d|QuRnQ;fh|ZL03nx@0V`Q_w?Gj&s1fmom>X qPQz~y60!}N@(2LMnlgJ&A&p4WyBXmZT3zi-PDJWiAp(TAAb}G5ZPM8f%3Z>LkD0uF{L)Z%#N%Z{@fPyLU>H}k%E z?*W`n&f+ow5iH<3w@Q!-s0=}26RJ_81UVBW(RIzh;}UK`%5f<*x0oh$YH0K)rhhm8tCXQ2 zf_Cio!IaliDM{DZ(dWA_(}Q-T(uP9Jho|q=c+Oz^QboSuUl0ST+TqTAT&l<_PUm@T zKz&F%>CR~0IFVI0?@go=Vw22z3lZ*Q$Q0z)wc3B=+%hRis7UY@eN@7??T$?U^_o1Na zjB#i9+ahkvl-|e&xt>EPz4J%G^%=Z+0);>~j&BU!kiyvM?qO zT*KCQM?u_JJ~zJvNg)Vxz3N-U_1EduCy*DyvUR=v0`cS5__bL`5)m-Z_O57_a`V+r z5fo1dO*dHW@NoChml}Ygn<7*(`}>bSltdb`nj<2W#`gHith)y(G(@EGV`%C|oK+!d z5i?S0-=B&FP7AUI+L4N1EM_Q`e<8>s6>>50jB{UJv9zAbrAu)thn)==_EhR;^E_NS zqG3;Esgnzdr0u#rm7Q?M+p-GNdny${L!v;4-BaNtB2MQYiSg%wHwZ+g00000NkvXX Hu0mjf$0007xNklmcuSUjZvFGPBTE!1d@Ul(R8!e zm{hrBDOOA{wU}#+m=0)^U_=m@Yz{RX!&G%<#RN+<&t?9rl%N7qs{3weL+Pow5Qg1> zYi}MjkMvk21(mKGKDp%uHH!`l6>*3B1O9qml4!$$P!UzMzwk3_9p-E)Kik>&2YtvPc;7>$Al)R4F6`v2P>Jth<+Fs5myIMBBf-h*N9sUC|&_ z(Kuso&-ysMhF|)iBH5N0Q09z}Q{Ja<+oFZKMoo4;a`pC>c0@w8bcZB;#HsmT%L~v3 z;8ax#cMzxVHD{kf6~NGKJM|Fp#+BgnDzrIBRMC~Mj^Tf}KUM}`0dQ=K<_8BypI^;~ z;M*odD(3NV|4kQ~PKMS$AA`~ZE!PINxj95I}p%E3Xv#IWlU#hyy;ca=m-#~tjcEF^0Y(biS9r!p4p tcuG{Ec2A`UEFvnL>pd01W8(Dp_y_yV6`z+ilji^c002ovPDHLkV1i^^RhIw& literal 0 HcmV?d00001 diff --git a/src/gfx/cards/fightingenergy.8x6.png b/src/gfx/cards/fightingenergy.8x6.png deleted file mode 100644 index 2c63c5b54326f840958eafd578004da4bb76d9bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmV+d0{#7oP){QF607vTB4Te?}b)z&|Jhhyc3 zbm`YMOlN*tTl@7gG&1UjMsK90rT+|b-{DhZj>yzJF>=Gq_|M3Ym15eCMs6B;k$+Eb zV0A6e6^#b%-1Y(oBgOi9^5Zz8(J*IgSR7I}81tKp53qRiqN;cJQqO)zeyaRHF=t~YoiXa3CvHW<>7f(v?se*?%SC=7ce z<%ie>lg}M{qu|G*y%_eEI_Jh2nmI`TUdr#y6&4#JWPw zh(BlZN(@9S70ER2rif8Ba=9c$cU>znFe}wK@*U6TFWA?aTez+HlmGw#07*qoM6N<$ Ef{Ezh5dZ)H diff --git a/src/gfx/cards/fightingenergy.pal b/src/gfx/cards/fightingenergy.pal deleted file mode 100644 index 8680b0c3c3976779f8ebe4682b87beae9a7b8468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLEzc;*z`_6k30005KNklB(y8wX9G7&H;Xu%`im2|wtmp$ex1X1<0n?BU(Z9M z!f0spMx87C&(MbvJvG)ufXNf1)Br&LjEcZo!0Bj|I*|wY=kx|;XL6n4XyC-%UeI9F zl%DP0Tvs?6`qP|O-!U4D_3_15Ufn%pX)wwc?LDu4u+D=~`QV<5X)wxJ-#E;JK`;A8 zg~2F>MjQ~suG*?@B)14g*-CZvI=Tg0~FwGV7oOf1@hV0lkW(&bE zO&fxAFos4Fj3a4WFjp|?4VW?Cymf&JhBTz$g5H1wX1R$A4c@3>zjeXxeFWYpVDI*^ z<;SHdA#sKQXd32U8z7T9LxR~Y^UqqLj>TBWKJQE8_s59L#2FIobzOJ)4t-<0mH>{L z<}*-EN{lKJ1iB6s+ER&8qB|`z(W_;x#3+bNESbW@H@2r@eINrwuQ%&V3?j-c$|UZj sh><07xFjWaTr)AK%I!Gv9?yS|zpUqD#Rc`n9smFU07*qoM6N<$f-fTY6#xJL literal 0 HcmV?d00001 diff --git a/src/gfx/cards/fireenergy.8x6.png b/src/gfx/cards/fireenergy.8x6.png deleted file mode 100644 index 2cb341918a0f6908addbd82e68a6f523f50e7b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 558 zcmV+}0@3}6P)C%8HxLGqG75AFfn&u~%4FVjtP z`3}djiOQ1ZynvD0q}1!?JTo1ks=AKW2okOSGm346ca0e$sr-%+6-0#pi~vbWQk%UI z6*)iDywe&VQ;+Yd+8b&oFQtsJGXh+Dmrr=Oy-`f1>_@8VjM-1ulLv_D+8EIdcUVdl zi7~<(*Si3$;*Bw))zm+Sx!xwmz@_U6IH^KqjCeI20=!V$(ir$^at3gMQW>K-w7+r3 zZ&`N6*nSUid@ehqI21O3C!}r-KO2ju027dUZ@_@R%#vgb?sxz;97tMs20%|h->2Ld zO977oo;{>pYtSznhF?y<9+5W2asd5P0nbUd2K})tYaw7>P-6siE#S2a*1V#|i0Sqb zI16EA5#_a!5sfY9jol~A*0sTfmE}10kyb^?hR^?eEga|Ny9%>iZE)ds(3|u=tEOW# z;{x%lZwV9BY=jjfk07*qoM6N<$f_#ej8UO$Q diff --git a/src/gfx/cards/fireenergy.pal b/src/gfx/cards/fireenergy.pal deleted file mode 100644 index 3cc39b1595b0c621b93f5991cdbe85d1ecc5a908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#Amp7DRU||3N2$%s) diff --git a/src/gfx/cards/fireenergy.png b/src/gfx/cards/fireenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..451dd4f919cfa9cf62a4bae8d79f5bf60ad6350e GIT binary patch literal 599 zcmV-d0;v6oP)0005%NklBjE6bJBkLGqA5(ScvSY$L|jA9nihNdQvBK!=BkZg)3zugUGC>u*ywb z(KqY4?HEg^?P!c767oO8>pFPXm?47n?-;QM0Qk>H5R?Mh+Z(ax^FijE#&{iOybtBx zkR5fR)CgN6!G3n~gDSy zo}STEbR%ovFwZnyI%8>#(O|wN`XaloHSp8ooahpjw1#(6KI4vu%59Bh`IhMFOtpr0 zqf4SpE72Hfu+-m)7No@9pbfuSrNA28@rO#fRnTt@qMfE~3cfXlntl>}`wgAOfJY^* zUtB!D24RiihPD@)zJh2Bcu-Z0?gS)B$6R;NTY(6I}%{__YxLEUV%} zxdjaRwZVl!RTSm5ke}#%Xa2+ zrQp^nFH^ce^wLY4+pM(4?DTnwFbO->B44vZ)X4@rtlOrZX16s?uI+r$YyE!kpJEmv zV}S3Q;6)D~bR38Efv|yL&Lopb*^9%7gPjD8L}!HRKuZEO{!TbS<3-43E(fxJ=r`DF zg{{VOhThaK0vWpF4uAJJYz(7QmK0It)p0VC#Mhu2HIBEYNfr-O^AjVZpFo37iq8e| z|t13x$07rD0dC3o3923n|n5dymtA$xsaRNo(nN){JmYe#PR{Fc% z0yW6wR7}*l9NDL^Y!hq<^u-8{kld8^c~Ww4u>FfYrDF9fSyTI?!ky%xOd?|hKN{kp zs8bsaUWbjomNb#GcsNxQSGtl-P-ct>SzhKgzgwPPSP1%oLWwc?o*Y^#FIVhrvkNFO zBMj{L5c-HOE=C^){6HbMz&$Oz8j`=|6^3y^339i|y56NBJehCL^bG@rkVU?{q<)(` z{H%RJc0q|7b;`G);85j2dH?4QKTw$lx{|Ad;%67rZ&bz#lpCQJxZps+gLUNzp7w(V zA=EZkM^P8*%k!swR?vtvvb@*#P`kw{<>8DUG{_)YHVf({_+FLI_q#yD`ZBbT&fYqd zi|n=EoP!cibOH&lR8DtrRND}DL0L

y)4;xMu~fP|SWPzH2l0PuCI|V@?dHE+~F% z@Db|Ry)4F@XlnPvmPX_FZ>nxc#yEt~*A(n$3^u1&xH60JRj+%<3OW?N(N>>3a0PR# z#D?w|REV}?N?X&dh&QAdY-Jf!WWKpu ztEYo*mUTfXS@e!zlVSR(=vb7b80=L%HgktJe7}fgJa)Skv{4d8WZpEqO8P4X|M~;i WNThZ(lnq7z0000mW~Dh diff --git a/src/gfx/cards/flareon1.pal b/src/gfx/cards/flareon1.pal deleted file mode 100644 index 2c9594a3d7fc7b7f4f160a4c2761d6430e4b1b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLy`O150|Ns95$yuY diff --git a/src/gfx/cards/flareon1.png b/src/gfx/cards/flareon1.png new file mode 100644 index 0000000000000000000000000000000000000000..0faa4679df5132464b1f121252e62fe06c5b3e52 GIT binary patch literal 880 zcmV-$1CRWPP)00096NklLqSOIfw`NExjK++3#aLw|1c_n$9BHbc(n9Nni!l)mltssuLDBLTgDT8FFuafN{@s7b@pj^m`d3Xc3+?>OXIy#NGZr;VR;*sX z8B$uQ?HqUZA7G&T;JYGg@hGwC|`=qv0QLqOO*FSEM@vKwUSTmexD8a_W=N7l3)0J%z36N<=E z!%I>Sdf|(sHXD!y)cMJy2HMBNyB&T#fr#z!V`%Gy$H2o34JCk1RdT7N)}+~f8Rngx zI-oSDLce4pTMWH06Sc4!j^aPS&2R_c6e z?b&$sRL#ydrH8g(8s`U7i^m#uxr7)5*@N*Bv^KJK`rDL|lj@X-Vcd~5D9bknrd0Qw zL6~DC9NHIelBbz5vM6Um#F)@0mbjkUHl|Y5cwtU(Y9&^ux$sPFne<=Gf(5s^5VMB} zKJmOP*>Cc~OsBD>i;V+n`h_OQa2+h34TNj*hJZqdXB>nV7Ei{UAU`VAY!o8x%3k`S z#hc{8N=4W(-mZriVl2?jto~F)gUeGHgao!;>KIUuTt)l})8Cv86HLI~5m(2*qis(E zIS-TzGWxwe>Yi`pB!!`nM-swd=SKlC9|hF8JFxHLGZ#Xq`AsbB$oG> z@uksW-w#Oj8v@98_9+HkX{7nbfq)mLvJl527*Ge%!V@XH%%aa?Kqw z3MyZUh^YR84SJ}Min>8?d$<>FR7O9fpg?8Eb}fw&*U*ZJT8V;w?$~a$wL6~P>+=DA zRnn=GEwiC%srHob z!iq|&VUzg*>ausum%gv9&Hw<+1p00rI(b7hO+ zWuf&qZ5QCA0bDr!i&pp8`-?IFGJ<(cS94EZCX9cw3;@fud>a`>iiSHg~ND&(GW~CUxZJZ8%(tEy2X~Z)I2qJaK(s7xkkw$pHpQ05j#%*PCzVdM7 z!56Z7hDK*T_Ws!HmR$MYdi1yRk-VjOy0NBPEmV))R{nfeer_QuYULvv7#oVv@`s&< z69QPEzRgVNQEtyYHdhz>^b4M#K{+E?d9lYq9fQqjwN?ZttPGxdj5z_-I%1+-nD zGa`yn0008$Nklw`Vn!8SZ~z_^?Gq8Kjmo z+iqo7*E&;62<^6GQGs2YK(cLiotZd+mpQY)W_$EJe)#e`zlU=GR~%Tpq1yN6QP&Oq zE)}g7_#s48B)I5GHjHt}yK5mwBD;I7mK4*gW*c+57mA1~GGzz%Os;OM7bP$V+GIB|sJwqp^aE5=K*ll^p^gpaw$P9t+-n_JXd0e7+iNz5YCTZtg_*+A zhbz;M4Rd`c;0Ko%@SFWGzRegktHc2hl%>H6%wKrWqemW8g*u&0(oSKVc;$VLkM`OJ zJta_?F<9R9tN7l_AAtV_GrpG{9xQ%r`WbZ~40zEfly?)WZNC=smw?iwUDHkGE8Kjv z9e@Lw_7-==FFy+I$zBbVfYKw$YvbheKpi*YF9D7n*EKCJ2Dr?0$A4hc0!sR5o8X%Z zdi-I~)uxm6F@3bcjm-mP9_L!zx>+OhL&3%czCGYi!@|CI-D2WNG{}%YTH{dwU9?M= zz8u;gV_IjqQ{X=OW&Gv%=n<(-8?N;@fXcdr79Z}Dd|GF4wFP-X-$+{gdP>Xu97YwYIN?yP$w*6Ut((*a__Q5;uPu}Dc)N3dqGwB f^oWJ9@_YOPk4n{`y-wcv00000NkvXXu0mjfG;E4z literal 0 HcmV?d00001 diff --git a/src/gfx/cards/flyingpikachu.8x6.png b/src/gfx/cards/flyingpikachu.8x6.png deleted file mode 100644 index 14168a3a3598cd58572df556303b992b658ac220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)^KqPS%@^LH`_J7i9?oe zLv0i4F5JCzuO?Bk^$MOAqmP!4VcOS_f5^WKEvT6icj(@NfP05U7;hskQV|<6&ONn^m$&i9O9F#-%HIS>tVBRf!VQAg43__00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006rNklmA;`gN zo@MB^E+EM=?vGcrJ?O#|uwXS>&%1KK#g-<&ip!d!8wX1gWppN~u|f5KKK}X8kPz5v zVtCcM8@sSi+zdKzP4Zezg(<%29JY6Fm9CpOPH~h$3C2;_e$x+|;*c0>h@BnW{1wNE zNGX)~jF_sB@57M6i{-#R!+a_a;=QIw!)4FP;9j-X_f12TuAF%EguzkmpqEM^Y+jP3%pE$M48aD_jBy#Z9%Z9VIJOKHomF zP8nRP^Bsenu*+9-aE!ti?x^~sFMAmfau`m;=z{`yM>U3xm9bX^MDrPlWaZPtya#>V zg;YFdXd;_ZCwFQwAH#F_IdsK>J9eCRh23V@5h#bp32I!UtOBsNDJEm!dnChXkZ?D>4(si zT*SjdEn5&dxgYHSAG>4^^?nN)6r(y$AY~#Gy%qAetVPW6?_V?a@W`y|P zLd2($eq;q7+$bhe_FbZa;RwK)`^O*75jg;;JzGb7k^#~moR)~t8W2`$_X_UJfj(XP zJct!$2KjLHmst0m%s?;p4@GH8;Fd<-_uq)ZnPa6CtR8%8i=rX)=Q7q`U)+Bc6{Z9d z?ezatcGpB?W@u>URs>H4iVhCd=ypzqjU(wdjD!kR7LUFwD5_VM?bsy(qIL- zBd}u93m4DUO3t)LaOa{UcGcr^kB4xy;^=E7UxakWG(gR(PPllE=y5DoeELyYYI9~Z zLA7Epy!jwK1RetG?_TEHBgnCX0cw8lT7bJ~MUMd}d(smN8VGK8Dx2tY40005^Nkl_NPQM*oOjmNyWEP>_Al z2^CQ&SOtrhK){o1%4|t2g-(+3z5S|m4#V>1x4-u>BkZLm@()CO=h0RKLLGT7fXo91 zrLL5omG>UuGxby zCrk*hH=fvWM&KSHk802DbS2KE5F9pyLttUMzii=}j{N0k&&bhFgc$6I?@= zmyD~IDG z3*`vDFE#C!{IIM9oyMeCzdf8ybUHBtptI2Q&z2FD6((fG{Tsv67WYi0Q=_EV^nZP# zOQ3tBDngbCl zHf%|vR5o>Vqq~h09tkRw5N`0y>^t}XT06Ta zI>*7KeFw2~$=EmW1tK_fD8zFUlQw+-e@Mdl`OkO%8-V{)wl{l_){Qjw>Vf7HU6ZiCc{8$zXhPvlIeT++pw_t1GPVcvnK5W39$JwSd%>M{y?KM;efFF*!uxrSL z-oUCRTjBA1LKieB9iq$k3Ap8qXh%og2Ruadiw$P2mq0G%J9dNtA}#^WC29hSjc&!z zL^*)85-Rjplry-{O}0{sG{6ush~!~3^7A8D=WkZ52^zlS&?HDSl!Rjf`Nu>_S_Bvo zNttNNFo}Tm035A_K}rEM975?7*%gD?lop0#He1prHzL2di5#fdT-4EkzL^|s8AE_Y rMXgj$vdt;@C&rdCJp!&t!@hn2dM$W&g#tcD00000NkvXXu0mjf$vwo> diff --git a/src/gfx/cards/gambler.pal b/src/gfx/cards/gambler.pal deleted file mode 100644 index 58f8ec9fc0561d093e530ca142356c63c1de5f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma!dp2fhx$iM&q2y_8H diff --git a/src/gfx/cards/gambler.png b/src/gfx/cards/gambler.png new file mode 100644 index 0000000000000000000000000000000000000000..aa67e41a9d3bd64f8567ed88d42fcd4206e213c8 GIT binary patch literal 498 zcmV0004nNklYU6vi(&I0)ti`UZ}nbHsOO7Y8#dx;Xpq0epv!dM*UPLAXbn&O)h^xLL4MDksID zLlQim6Pvct*$ke~95j9KOc5+^YRKpE;jk8W@)`FFN47-zc4wkD)hj%Z$3S^)?E*Hxy9KCkV z@E+sZfq1)n##uaf5Eaqe%PGARr4=XutZg%9h_QeoqJ)Ur%nxE!hXd860E=ie0Iic$ z9&BNi0YADjTh5_1+$TyRd4N>nkP=|4H#o3pzEbg#I#ARXN3I6eL#=3vD4_^Znu(Sf z>PW!GoLegy=p6G`jwC}x#UcYhr;?0ZZ%(C~3Ph5jlSn}avDUJNQvJ$lsz3rw)uMH- oN-DGp%>^`d+D8Hn**|~sHw&PIsp-YNNdN!<07*qoM6N<$g8HhHp8&MR1;eR?exS5c-nBYe76%wqtQM}R{x@l4AIb@TIub|W+ z8%z2!-3Wb$h*~$5HaJ6|H1FWT;Km^xQz)hVKK_&HvtI5i-GO*ORf`WrS9`@#p#nsy zwMECSt)67-vnG|K`6?fdXcQV$sBG;FtvS0Kf9v%!p)#3FOte+cvLXbba(ASudAE78 zIh{_0%5LzU=(=4mR0Rw1s!gdKCM#J_1!(i=pyk>%RqbQ^PsUVSvNN^e0pdPaJX^g{ z4Sno#XpDKbWG`xiQ{aBnv(PQdX^!!}ld@nZA)Ha!b}aO!L31qaaY`kPzV1H`PN`hE z13<`BLkwOpqm6+iy8Wxy0GZhTr*K<@b zK{W^BnCO6-gA-N3a-UqVVB6iEKzzKxiy!CbpFjFcRY=#4Z;bnL{wb;3iKXwxWVA)#W7cszegiBkUPs_ImQfBgatqqvSrji}`S0000hWMBXQ23P>~ diff --git a/src/gfx/cards/gastly1.png b/src/gfx/cards/gastly1.png new file mode 100644 index 0000000000000000000000000000000000000000..4bac9e62bc33778e1e89ea52dc92c7271a482a0f GIT binary patch literal 666 zcmV;L0%iS)P)7;00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006lNklry*?^e^llGq7B5a{Y@6UUS>Cmdh#LVq0(#=h@6 z;hqTr)mgrw96c0(nX3YJ*X2u`IMW;sCBQ=FJ4`epTD*dm%`D3YU$G+sW(4Q1i}@+% zY(&(GtsMbd)!y|l(W5yQb)y;e{183Fq^JcIFxIm<9%U^gKI0+g$Xkvms&}`C&I8Wn z4W22)_)18igg1DBio$)&i0dV+Vy(9g`GTWM34Z@jd3VLsldHv#z9k-iRfHzA)zj2D*)^OF@5caO(jerXlbY zG~*Z@0Rz3sMkVoMaW;i;DIJ0Hu9YA>wmx8Vii zT*5OsaUQebiE;ypV42$gVxo4ouP)?I?azy|?j8D+SMRxPd$2KQDD;ezy12*E5cSUxQ4=sRN*cYQtVxn?m^~dMg0)8K<06(4 zn2x9;UU`%_)K%1SijIlLY9fp!$jDmSVqmF>ECUX@0zy8x4V?ht?sYeDpz%P@dwrNh z%vvnb{z(}a$cOx%UBpbBfs-{bV8v$)Ar@5zmn~fi!V`Z`l&L&~A4vVAuEqhP)col~ zm4U<1hh!Cl*HvR_T=R`H}j&M&+=xSyw ztgyfGLHItYwM-DNd_|{?pNn9&pE$h$VoN=~v{%1b#zpq)2K$y7_JqILhAD-Cyx(cg z*zNY}$~N4QN?;Unk8C_oPHm(-r9=nf@bA*4oHDlsC?(kH?@cjihzkTMDX<9U=pOH(~^dratTf>WAfdg=%ZY;%mr-(BfD<^jK)K0*R(v5C7fV!kUG58h) zG}g<|7~BDI-xKqM17+ZpuJRQYVuv6}MFv__fWdP)-jb`A00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007@NklGT6bJC9rl158G>Li>wRH~RAHs{|8u^FK!|pb3bnK)!Q?8f(T%)#RLxsR4Cw8{W z?zS#7Z=pJL8=~DvN)hzX5`u>!6dPoe3XDXj-@0Ys@A%>Sq*Uc#%S~pSlNNHL0tTrilVSH8*H*wXi;_V?KeNkUW@F2OuZcq2yLX z^gopSVa!9HDtR~tob2ymV9`v}a78L8Miic|Nka~WC!#BvKp$cc#}f0Gl(8|_Y&=zp z*f+``%L)iopAd!-i)02LIZ=zygLp(&K^?{`u-+xgqeMaAPbW}jkQ2lqmDf9+xAh4k zx(t?4MC6&sKu28yQ929XRDqMi9p~)j#kh)6Em#V=vENFYJKsZy!Z<7%nhI^!^Loy@PwE?;3#KEX!+tdqf7aEKUKMwE=;d&k+oSxtG!cZ+<-J?GOq@d(_+ z#&G9U^bj&A3XOruPAA(FC?rZnZ+VmtLiIEq!iG=m9=T2i3N-~-jg*sKoC>7E(E?b? zOkoSl0)Ii%iWo>ijs5~DLJ=Zx$`NSVEPx{YPmm%bYRbRF@$c~mgsF_rcfysA00000 LNkvXXu0mjft=wT^ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/gengar.8x6.png b/src/gfx/cards/gengar.8x6.png deleted file mode 100644 index 53d9bf9f7b0ed5cbb5a951bdb4230fa97618c9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)kVy!e^bWAqA<%IXMqz!s6u~qnyV_6 zjele%ZY>5@E6+G#Ox=G=#6-?~QWR-1DT7A$ZTrfthsR@00079Nkl347 z&uSA<6bIl#vl0K`BPekru{6>wTujNli7y~j(1l{aF5HB=$OE`g>_##&l?I9S)Q-5S zw)C!wAd*UjDot`u?Omki+}@wF_WKC`A>$B7K}NZgot@oiBq%LdhRgyIe|_utH}t z7Pr-2%|%9YQI-fLcdy##lEV~ayi~Y{%U?xA6YCp^0`77BYsS2R{UeYbX_){1c94tc zoE~-vrJIAj+gx(c3K?4n8+(tW-zFNzevmz0Iri$0J)y_rofJf7U6d_=~%gn6C4m%PF_^Z zb_D?Gj5vLFq4O$EKd*KG!Y%;GJQM=HPrs+7a^j$yaJ#X@S z0RP8t7`bd#GZBqKR?8M)UlnH&(Ued_)Ug8IoUY{+TBh`wf@423&|WB`DdS5?*0qAU zLEr*rdFch^A6E|gjd^Id-|BKwk|fP>?KKvm8%-Rh0OrVnzb~EY28Ke zW>J>KVd(dziAVF!gTIV8Bc(!YUpm;7GHoK4r=pl9LA4ZgkN#Y@J1k5*Tp- z>c@?atS9rVvC$r<{%-skfT?wfpUWFF;iASA~a6zuT(p-nAot zB|Hrd&HB1D5cL06pZ?*4Bm@V#c{&$k0}i}%R_SpyKr4q*>hyIY;_bs+ymmXdI2s;m zzV5_$7q?e{7HH-$F~J50pzgENV|`YEZI(R5f+KK&`BwsI%1ns+ma8QMAW-t zvaE8pTT@S-Vh1CayF`WJrrUDjlzWhG>3A?Bqix@7tSLiHhj>>f-TD`eBD7m5P1L#v zdpqKjIn*oARz*5g+aGH95)|9aLI(UM%2B2vbS&YC9WC30KZ}p(BE!@RY>&gTZ>$?} zAu;FVI|vgvkuxjc`;~tooGCqDo2g}Y7OENWA(oTLiJF8IfL^rhUkt;<`AOHX$h%naz00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008!Nkl~fg7v#Z}2g(cYM=i zYHrjjC_?&3Leq-Hg@sOwQgGFjPB2wel(d=g)@ASdyT9{;?;LPeJt**eFccCwMBX0~ zLq7QA!sCd@sVE`}=!Q~I5Cbyt5OPAsTN}bK>GvR~;1N|3L_fDeU^9jc^(ZmUxJL_o z3rw=Vf)Z0zRjgk>h&~uY4tt4CT$wvmaIa*r5r}bEZj8{RIOc;=2o*)^bq0$OS{6$! zQ1BqOsnM)86v@p;IYtBnMAITPCwX&~I~y8U24MW$ern@ruJQn*P!drgQ7hB_@XAZ) zIflW+o@pAPY3b2L=l%~y6uG%Qq?Kk+e_*v-(j-Qdy~aK(i74&6v2!IOR1Tk5SYYL( zbqhOsTA;WwEv4pZLX#zL>V4r4l)`u~`luTFonCgQK0*iUvDhE!8K~pCEzZ2Rc?*<| z^f>#gm0e~>!=|B;)c+oTtx9(Dq1n9y#XOau;L^|8gB5Vke*GS}nK=n{5wt=6mPe|KFm0k5ecDYmy!_ToEd7M4NiuzN-8D>%o1b-O2IfqR zcUrjt=g;<98MaGc&8eifR<+Y71NkpHG=PH`Qx6Q@vxf{rNldxn*G7}lrfPDgsLS&3 z+bEc)cdPV(t=*bXjo7uT5|rAn%KBldHGd$4w7+5Iq^Vd}jcUSpQc)z6x#fh|Gpj#+ zdt8$V{&(w%KdbZ`GZS5H3Nrg8zESR*e`i!bkl$;N_rWBf+PPHeAD&2b1W|CqlnY7U z(qMLRTTYwe{9!0?sHE)0?5lV=`P##XLI}^2!?yiHw?^u~c5Do>Io?_`Ca9f%5#-!Z zTpu{9Kk*)GY+JIv`CVZsB6?!6&gHn8cZLzz6rShs{9P9zdHWZC+y_NrJrk|4J-y(d dz=+l7@eekcj|^{GMDhRt002ovPDHLkV1hzNg>3); literal 0 HcmV?d00001 diff --git a/src/gfx/cards/gloom.8x6.png b/src/gfx/cards/gloom.8x6.png deleted file mode 100644 index 973001b76065e94edcd7936b2964714bd3926790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmV-!0+IcRP)?WWdVd>1^KiT0<_v1%`36VV7tr7wqe zdw*;tLLmmfOL5sXzmnKdWc%(N4sc@KhSO0bL=-kT(uDSaLB175{Xh&k+5nbA85H3A zVvDar!d+z3U4mwflQ=Jh+(U>auhB`9B+dlB>}%j4m=r=hTuB!TYC;Mo1aj70l@sTraO(AS z$8pj$);b9(u3bk)HKY|fNO5wlOd|eKNiGjn22uoD0&RKJPSQI1=wuxycN?oktWv1X z%2H4pS^+eaBEu-disO+LkHDJ>2F5+v$q`Tqk|E0006jNkl6yeNVmyog0S>A@a*kvE}R z2tv&W8&JF`2?51}f?yCKAG_NIiSDj>zL_*3_U&Hw?Qj13hFOODioLb|t4pk9%#>}U zX2n7}U6>Ka7&}lm=ceMqa-82eZ{3`V{OQE^O2&|TqGZ+UCx6dp4*FV{oTm=eSO6~{5-4vEvdieXaEinaUa~IskTMRtxa+g%CGB>lDnfX%hVc=}yuNAh;bM39npU^*paf&v9;~#Peq$ zsgkrJLM6Ve*GRCV)xlO$X8=XWZH%`P`2qbw^wR5iUi%SL8c?CoNY<2~G2$l1phQ9@sc6Kef1B)TjU$q2c+8o0000{QTRJ0yiJv5FBL45zVf^^PAt?+<)= z0RL7IA!_2$TZKYYx7dIP!4eBOFI(PBTY6lzPeJ86!-&*6cj6QJN2P}z5ISC=#+CZp zSFC~aZ{qzRNkK$ODt=^Wsfz)j9|YdUkSnl^XOc@Q+OAQ_P^tIkX2qlPv z+8y41IEO=aE~-Ek4`(%7s=fYkaX9`aA_7BPil>Cu>p6Tq=AH}^-mmHZY8W?K_STO{ zq5@3WPj;TjQhr%oTo7Of|LFlcC;1?JYx>JPxBd2H;1j^56g>P0w{k zwgJOj&$Sdree|uO+-EO<5DvenCQO7V-Td?2AJBF~r-)(up2$KrB}0j<9x-WjoI(Rl zJZs2M3WF9=+{jO{W+jkNq3mI{dV1d0GZa$m0?|(J-}dNKNY)hcsrHF-)Syo8HJ@gZ zzBIt@kz%I7-t0A+DXgBn<2YMaVX+f}wbj#^Ogg*=O%mmR3PmxU9A~xj2hs#Ux%}UE Z{07=39q3!yiirRK002ovPDHLkV1iKhZ=(PJ diff --git a/src/gfx/cards/golbat.pal b/src/gfx/cards/golbat.pal deleted file mode 100644 index 4d5810906e153725298bc6568d85f7d18550313f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#5=gDFSWe@-W3AzEb diff --git a/src/gfx/cards/golbat.png b/src/gfx/cards/golbat.png new file mode 100644 index 0000000000000000000000000000000000000000..239d6620388c0817ec663a6fa57a608afad9e1fe GIT binary patch literal 840 zcmV-O1GoH%P)0008pNklF|9Ki9P1njaAjuO8oa`T&>Wh~z<;UzcPh@I6v38xFUO*$gE}Wou z%;FS1>ka3M-JW2*y35`|K;hUpgy6kse{=-(9a` zoiw~fxGhjnlkKOrHtxj-Nj+c}x**?j#AvhkR>Q^9jU6SsJ8iHd}%` zHdSp`q(w3Kh+87c;9DpZY82v+m{WMpNjRRUs@NvPiYRH^ST!wp<%yF*l!dGCu`fD< zH$JGiv;L@M(F{wK|WS%377=G{67?sj}{F9uj-?*CwbGGXrZiPxG?FL zX-JlY;)M));>~4ZJsAxVTVCA74hv>v(hqa;%Goq29Rl)XFMRGN!sdpN)Oz3)7`hdq zWC3?9E)}FYaMS4%^GLA_hNm_k`X9z`XqZx^!WqjAMl4vhj1LNSwqvG$ngvx0ev4ii zF|PVs_>`H88L)glINw|^X(7xQv$^C5yD6KNa=;Ex@|p@dGQ_Et&w=CVx0{!rNx+l;aVFV!@(p%)?l zLP5PLDR_CAgzZ1zLE>e21Cw>VNG7xqmE;hA6dSxKlzJ&+X=9Vpp-$$z<8^%={3f}{ z0h^VIr#eop7+6R#b0BT$3K{xf;kx7SNZB?Hs7z(u*}-Mo^;QcB zm*P>p6!NcA&K}gKYH5zypTEob_A}Q4`H5%yA0HaW51HGW1Plk-UNNHZF*7H* z1W+wu(+_6$nNzz4pju-6w8_l=qJP+$1@tl{YE9-sPg6X^096RF{(}4bzRTS%01CyQ z@D@*@8gD>_DuggU8@G50^$6DHKtxAFUml&~87-9>`tCy&!e858?)rzDe+Q3w4@6|s wiBeVSp5{500087Nkl347 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 diff --git a/src/gfx/cards/golem.pal b/src/gfx/cards/golem.pal deleted file mode 100644 index c0ec4819cb22ad80e200d0b027a4a19a865d6e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexwJXKMOfq?-44e$a3 diff --git a/src/gfx/cards/golem.png b/src/gfx/cards/golem.png new file mode 100644 index 0000000000000000000000000000000000000000..cffba366fcc1022ce3edf99c935710fef99dbb99 GIT binary patch literal 849 zcmV-X1FrmuP)0008yNkl347 zPe@a7902g|^SO5Dk42hfd5MU6QBV>cBwW^vAnApBds*`j#HQ~B7DaThSl#MiNxA9f zrGsy=@2?(p=+J&)6D`U9XEUs{lY`#q_a-ugw)x9C_W1z+4_HX(ph-eq>?gC$=zYkO z1i?fiq+Y*{L7GMo!M?1!|DNGLU8of3vIeh926UB-;a-IY`!Pu7El|9At( zvOE0PCjvwEGaL#jdQaUh%^Yxog^0SQ0N%bRVO&1~*3(El+E>n{p2gZkEHMaEs3W>W zUviHRF`T#$X|2oZgqC2C`!L>YHo=m4sCe;G^WfXx?jJT@Yg8IEo@(58UWDxzJ zxh}V6#R^&XS3;T@Cxs#5eSYllNJ%_02o{EhN?g^W?>;K?4MQboU^;5_l?o@G*S=7% zG_<>&U?KK`GkcDuW`0zmrxMZuU51&KwmiQ)zU{`1N=V1BS6p+Nx6!51t%BSE(^}-Z zD3anLvk$HHYyB`6&=0N#`^f4%Rg;c@3aRGE!Buco$OMbC@8|nA!IanESiP>`2=-KW zXJ1}ZVLGfeRv&&Qs1H;&zR__OzJ`>>7H`3=K2$j0CaJ)bkf^FfC3uT1et5CFA2KmR zF3uK}OgDX!+M^SgMwH)vd#;u(u^fLz2v~?s;_yN-$LS2;nI~Xbb0XMdMK#O5WGBoF zSQu)8?#Fe!Ser`iO%TXD^@u|2uV8`m{lN)Bz%t~{vD3Wu@j@Y3kdT0t5(Y+EvwWc` zSK~9gY_LwnNGOcC+oR}mXai-hDK&>Vj8u5hSOKN5Rzf6% zK(Zoor?;wEsK;0rGG@ak!?Obaiq#_$Lg1y*uEnEwI;)1Z3}xB bfdA(YxzV*C*zJ3600000NkvXXu0mjf(vOGo literal 0 HcmV?d00001 diff --git a/src/gfx/cards/grassenergy.8x6.png b/src/gfx/cards/grassenergy.8x6.png deleted file mode 100644 index 5cc6b30a396edaa2437fb1df731f714252e6917e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmV-X0c_!FWzP%DW0(b>2 zg+2jnsp-269RpMu>?RI>VBlJ9O^Pc6Q#;L;#4Q16{pn$o;le=1j{GGW19ecp860|A zGalXHgMsNO$fLt2gQX|clPx-}?2@32KZu@8j(j(VCj;)E6O5=IfY%I#!A`(>E1p6P zJiIRk^DP?7VM&NQz>L5SXM(ZT^ltEA0FH3%zfDpXrtY*I176HN2;5=<+oW3tPO++aMwAGb z1j(Ty*qd{VkQj)$&*iG;SJFVl1a=6S16}l(PaS6vPcmJRX---H;&3p4;*eG~WxdZw zV^EG#(pBw)NktEZ0UQpttWSMPa0|erxo0z91VN91f+dizOAKPYd<9;?&Y+a%qn*^g3S)w081?ILlV1s#)nO~LGh7lRedy)(IDG32z~IJiqMFLJ6F39c f|GN1+_-Fe8M8pu9rCha!00000NkvXXu0mjf@tyWT diff --git a/src/gfx/cards/grassenergy.pal b/src/gfx/cards/grassenergy.pal deleted file mode 100644 index e4d0aaa5d4f45eaba1fd3a402d0f9fe6ea3f586d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexr?7-Z>*uVe)4W|Na diff --git a/src/gfx/cards/grassenergy.png b/src/gfx/cards/grassenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..e76556f9add73e88bffe7201ee561f523a5547ab GIT binary patch literal 597 zcmV-b0;>IqP)0005#Nkl;3Zv;y?aq%{{RoE7)119#T4|u zJp^I@1ozOBCx5VoEgn|gLOafTd8zBp<%KVk&jj8C=vu+ILtR5R?3#y%aH>qnATsAY zm=~s8(KF{u+mTAA>8On?67oO8>o|DT$Pq#MSB%610Q_fU2ugwMZjHqAd61b?8%N<- z4K6~tHDp_<(M61nkzsEcPjeiMd0Ya~092lR!c7g;0SDJmM# zQQWmg(to$A9@D2zWDVSVO|Kr^JxQfC;(kS675(hE*1%(;%Mtxi(i+}52SjV-HpYym z-!Jd1RbzMyTD=_*DN!54pdy-7I%td~(Sk2+4A#&cIyi-%HI}RDqX~R#+@|S=_xI^D zv}*%y(pfnr4umys(W>NEauBrvH)x}c*aKr^uv-xiT0e8Z7%{Y#I`|bN;A6kxd>jegYcu?da8;BUGL`rVpO<^PSdATygeZ6cU j8<^HRY>L0*`tR`hFU^lrUTAO>r|p^k(uw8)E*UER^hShCJ& zG-?RO`ECg$^Nk6?$tz=gLof!7(Iv*HOq0G~g0x!?*rbUNS7ihZ*cnl z&-Z*jco=)?m|{m^i-n{Q)wf$5-i%_quqr-a#Q;fb3@(=L9{xBV_%U@C0Di6LeCIxji%*OU7;K1Zt z2G4%^j5ez76M^f(^ac4ITitn}{(Ebl;$GJrsM^zRyl%E8?i5CpEwTwNzU|tuexdCc z_CasvtqdnJM(-cgI+?R*YGPdQo{-f|s6Q_+>jTE+063B=AWlT2$8_jx$tm)4*bZ`< z5j|{KK>{|2^+(m8A2D+1QrnO9#lY9KfKLl zzu_NPnp|FSz}YqRf`OU7lRqX3>;qwP$?$jJbp7Vk){(e8IH?muKuNcLNN)W3Mh^CN zn-rND|1|W(p+8eI87T~ok>=iU{85Sx|k`nBoKQ^gMHSsr%0k>;Di zg#u;hiH;@CItQ~m-`{P=T+2uzCP*xZ^VO2GoT)P@JuOXeO2+#l*^B9kEB$F@b9SAh z>V*a>pQ<-sIzvXX`xYUbX;s|Ybi5-~tjsGQTw15M6KCqt_cD*z-^`W?yDNV0C;t`f zi{abWG>F7kKb4f?+`pT|RptKawiDd)Z53AIbB_>tM+p{K@6qFcAN>XOw#LhmV4c@A zBmQo@RPTPVPGsu_R|Vb(Ugz4_Dup(_1#s9htfAWQkb*UbY?rX0=Jqt7(_pwkA#zO8 zdWO{;lT+2Xt2^k*!AGenhq5Yql$;@JG1XVd4p-xVTD47xd@$a^!~O?kUProuDGk5? O00006%*r diff --git a/src/gfx/cards/graveler.pal b/src/gfx/cards/graveler.pal deleted file mode 100644 index 50d56dc42d6826465f03240b2e97d9afcb8f9cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#K2@ diff --git a/src/gfx/cards/graveler.png b/src/gfx/cards/graveler.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8399838da58262690543d9f475bc1805c32ef2 GIT binary patch literal 869 zcmV-r1DgDaP)0008`Nkl2$~ zQD_@=90&04|DWGA-I|&^nu{AUT-{)ERa5DNxMk~QO-4ue5Y$dZgernV9D5P*LAE*u zzF1hHZ%!QIL{aP&>Xi0suB;DZ$!G@aw9{cwaZ8)@{#n}E=Kkm3=Y2j*;bC<9g3!y* zDV1mNn9e!0L7_)rm<%vV0B5OuHeV295Bxnt{=4Xi+$Huv=Za+`z-2|b?P z-h7Q%!l{8G(#B<5_g|K)Y^P8iyz%XL&~ViiHGZ{#C@g+&_Qb0{S0}t{)a)UP5iw15 zEKY}?;74RpTkQkImj87=v-sGqPBn-<^^1X8%i5FE~PWE?Z@hxiXOD8 zbdmUS-B^(bf9H3(bI#!=IPxAq=PJP;F5I^KFtH5oLPkUJ0pRKvvO*~B0RWbs!NX*mZoyb9y;EhBhh={$;(!G>4nX|4voH3 zPjR%JuHZ}6J!0*l1wTvNt2dqa=wZ(rF5SXb6J*RoyB}vQY`S}-YiAT(?f3c}3@)5` zu8>sklEnju{f<-NeZ&7u7X8@~mlT@9<_Gc*o_Q(*{jN^JSI(m?ZsCU=Q-isn29C+l z^^15sIX0g@?n3V8Dlok_v~K(Jp|#VA_24I7i)xdhPbdNbG4tzsH&<)3*~Ry6>ZOR` zH|i~HGDj+j=TGvD;~eSK0o`IWtdT8^8M z-SYhURKh$WKJ&dHc7|8J2}`NF4)+M3HhTW6 zj(5oVgO33Y-G?#Leq~0WEh_a0A?0OmgubuBi8P2Zide`sGJ%{k`+A(_k)00000NkvXXu0mjfWRs_l literal 0 HcmV?d00001 diff --git a/src/gfx/cards/grimer.8x6.png b/src/gfx/cards/grimer.8x6.png deleted file mode 100644 index 19a67379e112e73d978406326cd50bb8d77f02d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)=4^}*4G6T@7 zo_^XyNTS{I$j~FU&6Pm&O+NrIEZ4+iydV1npI)L6fE!R<39`IOfYJQejHgihLsg=T zJwim8;JS$y`*?;bMn5uqNNo={U=P|$VZ$*#w7yzHSHSl;#>dxJQ(sXrPkY3aiRE1G z`V>u=_Z4sMmH!ji!{D`m))S!R?@(8w3?%+)++M@UCFV1FaHCseo8(7N0007cNklt7cFKb6$fJb zHfN})!)mEX)9w)2A(2sOslyaAGMj;=?mAy@zF`S`yvz6J_x|tyhCy^+p&e=Lv0-TV zauh?wW5^Li(bV5}bMYvSV?Ksfq*vpHUKoWphQ5wW)AR`3!LjN>Mpp6&As&g~0LHz@ zyd#L_s)l)v11Ji_v^2h^6{L|c3I_ss44JkdI=YtRBauiTe6<&?rH%1jy^zMptK(yk zVAC3ev-5CkhBaz=4jf z>q64I4GVq9B4qB3razTfrL#=XNgY#&yDpW$W{PSZdf6;%}pvCfxTKV04e$k() z_mb`^`IoIrv7XdQPig{D$Jte0oNRdafe9fX%0y`+_ga}SkU(@s`FwMOkjxVENO&H( zIy*#V-}D@!u48Xllvez;w}6--Dxvflt&Wr(OCi*i{j~{3C{v}X5QH2hq7K?~gsr{Z z>k%VoU8|%l6}KP<1rOCJ=B!dv%bqtveUI-}wy7m`0*EdzM@}7VYixYppMbSpK5^+m z@V@{#L`$y7vlTD=BX+GinK>ZaHCyZL?kVuFN9uq_GaAw*L!GvRdWBl_O6f zCZl7APBCYKMYu2vBM+lRY_FHdi}W5`j6jz49->%L}W*EQcbCdtt*_1|}&;&i{i&h}?GJUn5!k-8mD!OfXD2-3=t z`Ix`31QyZ|Bs+x2XW9)Xaohz#Zi+1Px__FqRsq36!6fhLP9Mou8=T*CeU_y|X%tDe z0`_QT@RhzH4LPbw-Un>^!oBZi_%_+-B)JGks{4^iR;EwLTcCy`R|WYqx#}SKu@?=4 zgVzOVrCvG&nHqo^dGb_{>*Gs}PJURKLha)hH%MB>NTbZzR6W$b@H9z^_}7}k^2!*z zA-9htTdI?{j8tj>9@y$gvZb_a>CZ-{;0d@DLGti=bggN^7l5RV21(}BylylE-fK9h z-KitF;B8AsM>|6<*oQCon`FMeq)T0=CV`qu6a7B=np4zcwl`tGQyC6^=7RpPq{n23 z4Up`SD|MnxPjD=$G>2TkneMLBrazu2CF>PQvjM8B%08Q@yvVd&u}}8F6Y1`TlC3&d zN=iXMgVcEKtmccIta+W0f^Y*auXa~6AAIrXIurn~d5_e}{?w-f@u=2{KmbsOV#<2r z<^_MICkynz?F|hp=J{Xyo5DR=NG^E1aZLu~EFc5gf6swGdakXh(8&+~00000NkvXX Hu0mjf7$iY& diff --git a/src/gfx/cards/growlithe.pal b/src/gfx/cards/growlithe.pal deleted file mode 100644 index 6d8c3d2978cf567acbdd946611ae9cf6af5b3200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezGJYP^$kc9yN4s!w> diff --git a/src/gfx/cards/growlithe.png b/src/gfx/cards/growlithe.png new file mode 100644 index 0000000000000000000000000000000000000000..293020a6734355397244b8588d33f398c0c671c1 GIT binary patch literal 706 zcmV;z0zLhSP)00072NklJ=Z zUFF{ONs<33a?j(>t-$qOccrOG0l2B-vUwwObCT&W6vqG)a_nb0 z4IB^6Nr1_v&}}0a>?JM5d4Nezm1dsn zxJWvl$t&P%d35J=OEQjYwGRU|w$C(X<3}vMTQ}!{>eRbHw0(3iOQGxW108&G9@BmE zwpmzw(()ilaw>=!DV~T4>DAcq0jkX_9y8*s6a}}?_h??dGsCon@>7FZKi~dyIyU4N oH%mIzX*nW}U&Ilygst!K8w(##cOG07JOBUy07*qoM6N<$f?u^lxc~qF literal 0 HcmV?d00001 diff --git a/src/gfx/cards/gustofwind.8x6.png b/src/gfx/cards/gustofwind.8x6.png deleted file mode 100644 index 70de29d3bf27b29fc3df04ff4ba7728e3864bf36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)DW`K~yM_UD8oVQ(+Vb@Z;LbB!|~jn1nDT5Ff;)6Q<}C?yv^IruW>nO&bxe zTqMizp;l;;FTSMY#TGqG+s5u!5k^9Dfddo5%qZF(dNUeWqu;~#@Z%5P zIp;e72ag#MJ@}sPfw2@iK7%<$kXj`eCGZGf&LKLa4dT%R;%$OGL@~3GlW=ecF(*L# zKBbpFv<~82+~$x3DE~$2oz2Y%rZd(W6rdszN4&AF+Hts-tR{kv#w_A+vaeY@pR(Q| zF!m%QbeG)UO$X3sC#bPxGXycU$%g|Pg8B=AI673zGbR~Fk)U`YoyGpCfA-P{N(wa9 z#o6r0lkeTyu!}0X1;t%iU*uXeqR~o2RC6B6>TfQ{r^13xJ2P*`KpyHJh%y_I;j&hg zP|W5*)g>^t$WT6J#(-3r1veX%rgjhX6ad&NP6F^a|o~uYJiFpf3 z9#E}1sgvzug41fA?`i%${)XpySBSu-p^vCb0?k$k0kks~BE;4YOy)6WtjLAU> zujjXn)V)e5B)mMI%x|@Nee^0cQo@tNO|v=`e8@Uu&>rD9zkypffBVRlv+7xT1##Vk z{uPahMtVjd5cqekynjXC;tdNnC?qzFf8OrvjmRWa687E~_ewW*4F;~46#$18Lyz@e zbtXjDGX<7F`86@>jwtX;DaaR8~zW&`I0r z68jI0r4fHB8>DQqQ*`X1h!|K>fO@$)Ko{+gXOH0E`46*UF8}$v*KGg*002ovPDHLk FV1iMwU10008UNkl347 zK}b_^90%}UE;@{$W|Xj~TZg?UGLxW$1PU zx3%~E>juF}_8_0416NHv$RKhM;h<-|m|@mzy*l^#koh0d0EDq0z)+ur_-@i9AS^Wi z80eD_7Nl8$IIoj{0T*yxkX8jK_Bt!a<7&VvXo>(d?VEXw4tFxn1%2Ht0oAp&J~-^D zj}Wxvas#*OE7kExQz`>NlXEs;&^hu}c_yW4hWk4;AWk7&TM;KYKa24L964opzp5N zS1$1ffMTI<`J1isyB1L_b+skXZ=w7JMP_$o^I=KhP;3^ej0?t^8RYLNHGTimQTn!o zsJA)DT9#u_SoaeBX!RLv*6;7i6^wb-(@W+G zS4c)Fl(BB77E6a;|l3$OM{2aN<$0~HLIlK)tah~z1`S* zSXI?%JLyQ4f%pffDFLG0q$$R{hG96hKRLrlOt;enW3r#)wq<7)Kt<3LW8RReIxRbA zLP1a7q&ddquobo1n&dyvCOkCdGmJpasMogdHNLXNPSOF?XAn42&T!zRARR(IFrx;J z6yAhdMA9T3KwWmjK`LayI0WfPjGnl>T(>EgGe#K%>A-{L_Opc@#S9QVB}hlA`}C9J z$GmGZstVU}dJjA6DAjlZ<}MzEVxeMWRQ|Hk>Yh&SXJaoP z?nW%zfW1K3iA xAk7NIlz0^spuY)%GywO8@DE403WCi4`~}io&LMZc*Uta|002ovPDHLkV1kT;b$I{) literal 0 HcmV?d00001 diff --git a/src/gfx/cards/gyarados.8x6.png b/src/gfx/cards/gyarados.8x6.png deleted file mode 100644 index 20c5dacdc16d3591791d94e05b881e3172af068f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)5&!LP1Tov24Wgy=%=aK= zAwghDhful&n}<4xAgEBMQfKk@Yf*uR4neP?9P^bO+O31>CG28kU@@^xZ_($2|JkJi z3nMftzwTQDV8L$y3qR*8$2=N909P%^;~Stb5)FIO^9YYYVfkyR3> zHeUOdP$9XV8~FzIJ-dbsD&%$V?Hg&+pl1vf8DL(pK)Tdf`*a0>ZwZh^IIY{3=`d7e zfav1<<^|ibD!%KWIdw6+8-RlFWcY?k@KJsCI1mV; zaLymECEpC)&KH1yBA>QxgD5oO`13BHW8cwNb{jngeACxmAPB$fD-|hUF4FWRS4FV1 z-y6MKOL?zIj^$p3{-l3!=GY+Ry&^eXP$8xJQcn+l-dg#YBuAD2|K;8^ zKKIAD<{|-2QwuYKQ4RGBXB#vXCk%YpE96i!O*QN}pE1y+YV*GZ3XdGgTx-x&RD4o? z%4%--TAhl70lX z%21_Xk#pv};lhh42CBHrJtxFJdMO3l>cD)nBu#R{fB+yM*2*u300002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007|NklZ)}rP(fHc)WH?Hh2kOnfFL9> zVMZO%HiFHa%_Wc=cZgaN1qGo+XLUy%mUQRi>78A>I53wVf1Vkh|N9a=_YnG?YKXV` zAZXT)dngE)lPCZz>aja45_P=GNv>T5MP7X%Ajv(c5K+%V^^szPh;||wC_5m3E3UW7 zouM|%uxr;)zY_3Z$N|&M+^w^VBzUMhpA8|_%6fXBVlLZMO2I0p5jioS@`A|yPsFQg zi{^QOH$7-LGmv4-irH47b@A-iW3uh$1rT873~sLM+Ui8I3%bvsW=C?VufvVd$QD3e zCU%q$H;%ZK0>oD&;gy)I%n3mXbQh~T@yY1vme@HP_)8N8Cb|;C8lVLSfgecHDfE5H zMYCYF!^>tL1;hNx^AbR^kIOYX8^iry_xL4vjA(Vdp^(BHYgKrm+2w_fX;vetxltzg zJPXZ?7dU}^OVmfBL+w9@3NV8ju?NN{o3<)RX-OD3)23U0KXK!JPn7S?StK-r5t7O5 zP8L7Qg5u`TUf2|gx|kX)?)Jj*62Oavh6vdhFb2!!*I;!W;E(c7BdX31mYF&n_%Co{ zY<`C3YnOF6fvNt$UPdF|C9FA;&Ez_C?j3&&Nn~5g)LxX)*TUJN$4NL#HcCv*-#>P! zVML-J#j0d|%AYnbONO{zC`wK|?KEAN5RC?+*?DOB;xcKonS4TFWX2y?^q`(E%D^f` z(YZQBW@3hv??qu1hD$2d%%o8$>JW9SjUKUHiIzmtR5ZO~IvIz4c9=rOK+*X88^XA` zk1h)82c(C{m+V=N2GA*cV?;f;o{?|2rIQ?s`Gi0dy26W7pcoN>oWCCb0MHp1xnAhj Q!TOc0$LcVwh`W> z_zDImyA*5T8}tml#~7((W8)U$W$w_BmO!zXz6St62$7S0IUrO~0s#OyXNc<@UC$ar zWe_N83B;{w@29j>9%i#Wt)Vgq!qZw{bwP7YU%nhgUi{MnlJWD5mIy(0H`*Tlm?WT= zckk;7pvgrS{CzxKMR}PimAY=X%VWTFSWM|QFK<&aOq8rPi}UWR1;lL9EzUOQ_3VTO z6w{B3?yMg6G9=H^{g=hBi)r^)C4pjh^YF`2Z31$P@21_`w@3HgDrR8y&@Enn`TTI% ziqf9J@#6g9&Byip!zcjl!CbKz{V=Ezv;Nil51;>NZV&Gd^?~vE)#BUL&fN|6G=`%m z5BazGr;8>ggwp!G?@p;wpg+sc<7)ih?}s_gV~kLmj;|Iq0n%1*(%yajZ=J-Hl0+(w z_n*9L%K-XKYsl;7z$qnNlIIT9o9c%3NgptSkXVtVwqh_DGkQEkM%7z zC}Mmu7|kB*Ty5mk+G(Ymy86Ci^i3)*6vJRr&R)*Mn8mfkR__x+qDu4|S(wK-%jwxc gcm+dC2><}V|0ykskbY<~5dZ)H07*qoM6N<$f>}-(-v9sr diff --git a/src/gfx/cards/haunter1.pal b/src/gfx/cards/haunter1.pal deleted file mode 100644 index f3af7c06..00000000 --- a/src/gfx/cards/haunter1.pal +++ /dev/null @@ -1 +0,0 @@ -_U \ No newline at end of file diff --git a/src/gfx/cards/haunter1.png b/src/gfx/cards/haunter1.png new file mode 100644 index 0000000000000000000000000000000000000000..afef94732e85d50c58d2bac75a7745eb30508ac1 GIT binary patch literal 652 zcmV;70(1R|P)0006XNklcW@b@6|<2hIPcMC=o`35s5=#Wg-|y#woSpsfFs@^*+??Ythy?7 zO5KRYIU%!{;F;XN-zNY70082>!OauS1HLd(06YKyf^!bQ+RiwLV#z5z9_kDQ5L+e7 zZ`!4tIHG3)$tgV^f1lx@b1K9KP~lFd2G?%_0RSbvbwGd^fT!4l@9J026&? zHVpgC2c2_WWdnNnAm4l5l8qN=lWzLvEh z1CZM6dNz&LGFLQk8pt9*_p{<>0nMU4<63|xghW|kv+`0@+w{ zgI#|ZXti#_&z6>v0GeWs1ThYLN=9$y)XgeQ*LRUMKIoc`$VmRM1 zNBUGPUJ@g4i&Yyi!X3$$aPPzm0NR9}!~2m3RQ>YD3OfS;mbJgiS7zh^%`Ll&-zJ0* zo(G&OVGN?^O6_E&5Z<@nD;AGzvl7PoS ztPmvtzX!u9V66xUFbu(9v8f&?n&G&dBuOH`Zq+ygh9R1@4-x7310X7F{Q7oT?*IS* M07*qoM6N<$f+fkxcK`qY diff --git a/src/gfx/cards/haunter2.pal b/src/gfx/cards/haunter2.pal deleted file mode 100644 index 09ac25b813ea005f0fe7e3cfe90bb4f27458ed41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#A7Y*exU|;|M319(* diff --git a/src/gfx/cards/haunter2.png b/src/gfx/cards/haunter2.png new file mode 100644 index 0000000000000000000000000000000000000000..cb68e592a230b1ba5a71550b867536cac49d3100 GIT binary patch literal 523 zcmV+m0`&cfP)0004=Nkl1G-;vV8S&I9KK@O-yilG&ax0P-Hn0= z`g0vE9Kmk6E+Q`_bqw-Srz%RNGVx#m!1%rS+=R;D*_3_1&^-bK^3Ej6q`b*UyjPN~!m;2y5z z^;kR%e%o<0Bo N002ovPDHLkV1gK;<@Nvo literal 0 HcmV?d00001 diff --git a/src/gfx/cards/hitmonchan.8x6.png b/src/gfx/cards/hitmonchan.8x6.png deleted file mode 100644 index e9869acda850ceed6179c2e81d4dd870c7d03663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 772 zcmV+f1N;1mP)4e2g4<6c8G^MN4Syrlx_imkNMYkRXqN#Cb z{e190qEmWbIaG}_p+dMvo@4hGQ>>E-gy-ayy`k{W8!2%dOCThtC&QWUT?%<7fiOyj z^^KM8x~e8)31pV{4X!K>$|lJKeYa`Ty86Q}PhY)PvXX|(I!XK|fBfQdZqsv2AXL@z z;N14_*(j~55T=~19JzUMF|>JW4WwaJ%SS(J&d+#zuB;G7rg!yt>(x^u=}C^a(Wli4 z3db%ro7qUG$}xnGd@|jBrgbOj^>+7YU~S*YuUr1F3l$)oG74+m!v}WW-TChQ>YZC6 z20=}A?bGmB=v9|LQdP+Krpb-IlUdz9aA}xn1G_)g$--8v@b}w|tON?-2MBu$hkAc( z4XrRT2sHA-e=cBo`NH$68Y5%T|LEnp{#I+gEhI2diqgZa7*Dl6&X#Olk)id%=K0Ed z&504Zr5J$@nXs;NAJ!W)Cv-w#Ilh^bhqhfaJ~-fLAhJKct|tKT-ugCCh0xWGW{(uT zVzk(Cv4KP^A70;>pOEZpSG1(CWX<;r=a-5bzBtdo7{=XjApK?~=mst*LMR5g;_AT} z&-0!z20^jpnd_rpwf8+{vsye1^P=(nzuAko7Ib8{n4bHp{vGBu* z-~Rgi**3cE2Mhw~H-3NT=a&!dVsIBl*bwm3dDb#{pba3HE(YZwN3P|J`T-Dzkm0R7 z$G*vv``SRkMm&2lTj!Mr>#VuQ5vItEMt+GaBP1OVq@24p)T#4YWz1P7uynHU0?F?i z9db5Cz+`RwC$f5WyQ44NP9UU^tjWG0000$Z diff --git a/src/gfx/cards/hitmonchan.pal b/src/gfx/cards/hitmonchan.pal deleted file mode 100644 index 60ce3d0063a6aa2805c1739a899b73f53ba27455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#E+y2%z`y_i4Tk~` diff --git a/src/gfx/cards/hitmonchan.png b/src/gfx/cards/hitmonchan.png new file mode 100644 index 0000000000000000000000000000000000000000..2828e3f2a89dfd71121817598211516dea2f1305 GIT binary patch literal 817 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 diff --git a/src/gfx/cards/hypno.pal b/src/gfx/cards/hypno.pal deleted file mode 100644 index c6f4cddfd0a46ec6d55323ca86533fb9912182d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLy`O0+V+#WS63_!i diff --git a/src/gfx/cards/hypno.png b/src/gfx/cards/hypno.png new file mode 100644 index 0000000000000000000000000000000000000000..22b1dfafdb0fb98e367d1faff7c06878b7c7f601 GIT binary patch literal 769 zcmV+c1OEJpP)0007%Nkl347 zJ!lhQ7zgkNj_ROT{76M@wY$sJpa`+tQtax`Gn6K{XaqU%BZxzbx+^#-1Oo~klm;7V z21}med$C3=ragkjpr9S9s3bmbY>-Iba(~;kzaL=>0;;k}19@LUO$a)G!G>I+pbV3? zinD9HVK#P~)lU!t)rzfm1MQ%IPAf)Qq$w+_B8y8R)utw+a!~Ewx$YA_&@qM#=XiSM zkk$H#qnyj<30MZV%VBW5aGW3V>u&#gC-w?uQu>5X?=5yS_VGcWY??gl7lMv|Vz~Uax(c z;g?Jeby=}pa$ViI5GVtZO?Jt3KWog0Xabbtf$HD*$G@pGmYEv7W~M7Q2G2QHGlkq~ zCaB^)wvR6+zIZ85ErUeF61y*%OePLwMKl>U@8()oGI@Qx$75y+RX$&^=})}obY(** zf?-ohkR2bIf0b5hoaC#BeXie*Tc@xjzmE`x83W$8-o)^!S^$ib`K);$dvbfLcQTn~ zlP9oQFM0QN@8hVGE-H|SG|Slq;M08HH4#k!&y~HmkyPqRIRHRrP5&%s``t|DkrQJu z0bGc9{XMDFc^?KK5vfET`fesOa!e%DWDF|XF8Mu|zmG(r05Z&X%gP^Z4~|4xDJHx? z`>|UcH5Y1266%2PLcyw3v+HkeIUT?v!$mb4b-meN_1JypI|Kz* zi*6PtCeQ&uBC;m-15big2}LvkaMs^j+nwj#4Fgux;9}!xeP`U^MqZ2<0^s~ZG65(U z!yOW7?h?YPgiRpSbpj9rXb12(##2*I2wVIIGZ7_Dc?ZT>00000NkvXXu0mjf2fRr* literal 0 HcmV?d00001 diff --git a/src/gfx/cards/imakuni.8x6.png b/src/gfx/cards/imakuni.8x6.png deleted file mode 100644 index ff95e64954dedd38eec8851b944208073cc7eb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmV;#0z3VQP)>kHd=> z@NYKHE034|O+tHcDG)pk%-|l+acB!w0|Cx?wE;Gd{MAEMGKYz;a4w-O$g5msMUbFz z&Lx}=1e6fWfC*I|i%DR_d9D7yQQzDXK3 z!bBA?S_*T5H!lf!MHDlz(=V^4tespu#iE6-E;~e#1*`I!drmUKVJbd>AP)abhSx7o zp835Z+qW~gaL4gf4yWC#k`}#nZ9M~#wqE+IOa^T5V1GDj%uP(?Hb2NUCqyMuPF_E}=bid?kc`#7KqTEUx)OQh zUf>0vLHEIGiJ8M^%H+i3&}S>foES9nvP^~ct5p zn$k^2z%1K4u$H7^0|X)owoXI#U^`h2sr?ALt>#x|`RnG9c14S>RI<0J;GoKHHDZ qv4O2+0O$qGx+^JI7YD{={HH%(c3kmcZu1fV00000007nNklHf z&r6eW90&0C!g;VER1Mt)K=y;=VrpqO7(ZBB|*`{`NcWKT1+WJL1=|D@HCi$*;DTh(}>>3*Wt|@K77Fcf|cy$Y)1Tzh4o~A zD)}!+MP#%8!bZZGN(mvHd$5uwrp}7@Bn!eYEUaWR-3d2GA{W>i2V9Woj|(v4wQR3Z zECx`*{)}dH{kr;7Mm?*mB@~M?=`_1?cPu3yhx<0{;_QKNyz}kY_kF!)$sfRnCxu&P zJeWIcY0+n|Is+);)TJS;Wg*A-g8{T-#T+21(9ghU9qF%k8P^bCNYIklaaZrq{&I zTpipbdp6Tg>m4<$Rdvdvo9V?IV>(&GCrYS;)$}*=gqtLmNxNrokzc14PW6$*C$g$e jgzfUxg-Men{(p}@CRd;@FeB(H00000NkvXXu0mjfV+CX7 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/imposterprofessoroak.8x6.png b/src/gfx/cards/imposterprofessoroak.8x6.png deleted file mode 100644 index 2f783014280cd61c26fe0b2ef84d32e81bb93ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmV;D0&V??P)W-UlK&4|8qc!33g^FC$hR)`dX}{;>vWX5e>Mt{u-q#~tRT@ebmOBG$sGOS~|^i7Q1i+`vcAc*vEf z+uMyqGty9be#yIzyuCxLs=;0=3}eE3Z3uBO+zW0716%);1DA-9y-4a>39&!Ma!~&& zhZ-^#yp^9g=ddATRuo?{h0O!Z#wXL&Xb7*Z@IIsuT-jmsvCL<0Uy@sBE?~g0j@k*&qBmAy zQmnU!5V)d(BMla&`yh7!H8Cck8^_rZj7p+=f$6h_YP)0006{NklvxNf)A5j`l>VT@3P zUJ4O>!PSFQ+EP0ixGB`>VO?l-AVOVylQ$E$_x3#bzMtp&Jns|mPaWu@6KC#ZLbo19 z2_-EeB!-G@i-brxO9BB|fxK!KO^Oxo5O2)A<0Q_XALJ>1wznw|~J5o?-9a@Y)s_daO zz*MN%OslhQb${y#|Fxb{<*U#Yi4WT=KK-#*r#@x`VaZEq2e2;^BlFaUeS}`YYpU2( zRoSh+Si5nzFPf&Ai+ahnndXo>Z3_ZZ={-7R{`7UEm!e+mozLg|4xLzCRn__0!S9{M z_laW$X(qv>mp>iPLqQquy?h&nx^9)ishf_SK!Y!JGTgvNN`CHEce68vK|W$=js z^x4TVq-nvsR6I|DTWTDJR`@O`9}H~adJ8xLA@5>pi!~o#JZeGliV-plWV6c`P>aW* zV%xIrdyTnqgh!%oS%ERrairL|(mW$ZjJ#WGN&IYsdHY~7p9`y$lM?TXx*nCnm0y i7#J+!dXPB%d;A61N@qDc^#Pv%0000$_q2eFVXSm^WAAa}V?|@-KwnG0U&=p&0 zp5;BfVr#JA{a}Kp`$mi^^g%|=NPDlS8Kic%$SS`jGAz=`ut*w=U+(*K4O#Zx9%wbT{r?>^LxWy&;f6jJ|7F+5^=& zZy>2eOCzC?`WF1JO5C=2#YGB!0pl=%Xy;xJ>6~X*TbNCl1|r{iJJ01VU9fY*Odxz! zX&=j_S@Ze3EQFC|LxCBrM^3@DL2Fw~5IK1c6L6qAKs5q>=Lihbb; zUt#l4$a6?+^0004$Nklp-Y5&TeLK}g@e$uwI!i02bWOkqP-Z#3R}}3p>N0GjMvLL6=Qs?@*m=AJpG}aZ^j6$?Z4&q_MxY3z?@EGH zMr3KdW%8->B*7;@N^h8s!8=fZ%9$xTdR7yb1V~phW1}5Dbc}Q2fI;SF0{A_6RI#vJ zB|0{ou$18f9V0daY+T&KX@Fq305awRw%-MK{tNg8NQz!@kNiDE00000NkvXXu0mjf D93|Y- literal 0 HcmV?d00001 diff --git a/src/gfx/cards/ivysaur.8x6.png b/src/gfx/cards/ivysaur.8x6.png deleted file mode 100644 index 4220b5255e1b46c4038cc2641aef63a705144436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 zcmV+s1Md8ZP)5m8VE^=d}<^wd**AO1ys<$aRS zZ6N?70Em&|L(J61^MHT71{9T_D(|y458uXPx+6|G$k8-UFy7wqZUZ+U3=|>i9p<1((#j@WZ(=PnEpaswLtXQMp};cS3WgmXn?vm`; z69O%C`euH`w#P39Ww@}+LACSxuFq3}Gjm@mIvPX>peJke&&hN|DV$xF9GW;?r)QfH zQEUCh(jq``Q=PujQi#p}ocJvT2dyaCs;^BHY^7&XOoqTjSwVMt-`T2vDrHIzW_g{Q z6Gu)Zr>g_ATpdJ9EfRih{)mTt))|&y diff --git a/src/gfx/cards/ivysaur.png b/src/gfx/cards/ivysaur.png new file mode 100644 index 0000000000000000000000000000000000000000..64d7d4f4ce8fbf3c90d4799d40c343b2089bff78 GIT binary patch literal 839 zcmV-N1GxN&P)0008oNklHe zUr19?9KiA4mCVz|@%#J*{12c=Y_t<8K1L9+2@#~> zVJ%#@>g|Z}pBBRI#>hsy_O*!+*6>XWF;Xa zSSikYLOTZFn{A39f=FqioldXX_ju>Tki`IX57We_1%T#7bR&XTdno$Z#BF)Kk}ZM4Obr3P@F^lWKjEk%~i zOQ+8v#0P`jX);rbuSp@EJ-#vu8oQKt>21hGGO6#jWklliOx>h$G*CcQc>2@fD z;3pqPN2>+#fnaw<*x9R?I_iP(b>M8I8=j~=Ia^4{olOQ}*I5V+&I^Y=WC%ZXMuHW2 zbkm-zs`Y(Q61EjH5Y_|pU4Bh$u=3#g&^(O*ipMKvzSkWBz=2}Iz@m>9P3I(rAiHgc zXc92`ZPCn~umw);t;-^mfmq-EY-ZQlR4`p0P9nhRrp;73id1N;@#usB*OH1u@uLI0 zH6?;b;B>gEu1!&|D&Cr-lp3%shQIt$Ro8RXOKlpLkTF77i@5zN;G@L`qaavvv=>eu zi3OsxM5ZKIIGnewD$mS|(QxUulY$WUoDwl+)<&O3Q$7O_kNbU;leDUh%M2QTSiYDE zcafEwa@JzZ0K_-#{?#0;PMjz~L<@b7L*#x=d&+(g5Nxe=@*bZA0GbQ3OE`qH2M&M>Km zKq8{Rzyy0(N_4EHFD6nDGLvqHJ*?b$mjbfo+x$mpVtFh0GGdTGpR;Ab#y00e+ILRT0evf>sL|0lzd3 zT>gUbgb);()gbIllr4PcM@`mvZt(_#U8Lh_|D$|AL0m~YP)|tr9aES)1yBJF@Pw%M z3`@4CL}7@=pmH>%=9k|Ucsrw~vmAg#L#lZx{Ng(1XvEpV4M>zf5f_FTWE`j(1i_%j(lVpSi~fkBYtkJsW% z@yf|a)RlrDS83NIyYMBA&cy~v3ZiypZ(VimMxSoqjh3(~Q0i<6kwc{2+lW{=Ky{6Q7=(mS#=tTtjc#Kzj@i61up8OU=nn>^ zG=$oF$M;FuX~UqohKflxG(-J;i7c9wYW3yfI0SgTHRf+xqcj((*rS{QUKc&d*4LD+ z(9-Yy)gXBjqUec7oCsTx1YQG0@e2j7rfIy-_4~AbNPuibB5s^u|EPz3Mi&zwzUdC$*%-E&MLeN6h(Qf6~L0Szy`1?QFP0!UnsB&Cp?PcLzV=&unDZf=d^DH h8{vjO$$xnB^%wf|JpB|!i^%{0002ovPDHLkV1oakP{sfN diff --git a/src/gfx/cards/jigglypuff1.pal b/src/gfx/cards/jigglypuff1.pal deleted file mode 100644 index 6a8a81a4..00000000 --- a/src/gfx/cards/jigglypuff1.pal +++ /dev/null @@ -1 +0,0 @@ -ÿŸi 2 \ No newline at end of file diff --git a/src/gfx/cards/jigglypuff1.png b/src/gfx/cards/jigglypuff1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1ae0a77d327a6a1ea5584d673e42aea6027799 GIT binary patch literal 792 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 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/jolteon1.8x6.png b/src/gfx/cards/jolteon1.8x6.png deleted file mode 100644 index 81d403b565fe77fe2a9e38985eda33eb86a874f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)PoR68n zOhQ8^?Rfp+gTV=AQjlW59ruk!DJPgoC>XoXS@PUi63nC!bMMbjT04{uP)cPcq1ZP< zs*#bQ?;}xVCWS0HCB!Pzk%uH*)%q{flLJEPFgHCU(xH}oM@Zr{DkBLzBpbT+ED>$a z&bn2Qxv-$4M5SwW$z*#9aE)YmFl@JT!h|yier_TWfL09k!fn_HKl+R_Sbcz3={T9b@XDH6_10+sby*jiY0B+hYU{z1~W+ z!#>{$0B}Mvul&vj+aIu&0wY@MH6V8p()>>pWbfdTG#cBJl*$5PL>s~v;#aL8Z^03bcmZM>^6J0gG&UqL1>42RuqKFrKj>q*60KHzA9%kwK00000NkvXX Hu0mjf^Y=&J diff --git a/src/gfx/cards/jolteon1.pal b/src/gfx/cards/jolteon1.pal deleted file mode 100644 index d88630e5b95e7036b584a22910549d61e922044c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexWzn`h0hJgV96G;O% diff --git a/src/gfx/cards/jolteon1.png b/src/gfx/cards/jolteon1.png new file mode 100644 index 0000000000000000000000000000000000000000..2af9377b4e4fe797f375952bae60379beaf75be5 GIT binary patch literal 759 zcmV0007tNklK3Y%L-C@ z68Ex3#6_)MB3>et?WI`Rn5JSONcu*5$~%7Z+wZ;o-V8iEDj1u*bSUZYyb7KOj4LkI z*i+Pn-gkg9jLR!R-V{4umV~h)DiAb`a*{daee@$JV8U~$1iLfv9qiPON9 zA0Ub18k5DuAqx8vytn}efNXa~D?cakCeTpo*q~afF ze&0_m&*rj=Df#MjzB6rF;0bcVE&6UV^XyvFR#$Tvl6adPy$v-xrR5ysl3#c-IDXj( z^eT)KIxE7AUcGMwj%qdZ7!xAFM)p7m#&YiX7yQNbNhz4Uo7(du(=6i}$i$jjf{<;e zdpt3l;b!Hj+@Lu%!V`0%?&K~lrexe?m=hh-tciI+F4h%YTV?8!m=fG_q)eDpcI&;<#iwmn=7dA^dM+AuE?^5yZg37m@7kuR>D{S*&bx$5Bu!k`G168ziUj7!R6NlP p^^KQz!Al2tf<(pj@HrkokAH;_o`@tie2M@7002ovPDHLkV1lS&Qg;9V literal 0 HcmV?d00001 diff --git a/src/gfx/cards/jolteon2.8x6.png b/src/gfx/cards/jolteon2.8x6.png deleted file mode 100644 index 308966c9a868c7c666a4120e644646964deb7a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778 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 VE|4WMtsnpZ002ovPDHLkV1hKSB*6dx literal 0 HcmV?d00001 diff --git a/src/gfx/cards/kabuto.8x6.png b/src/gfx/cards/kabuto.8x6.png deleted file mode 100644 index 3ebcaf7c5079ad74199b601532d2a76e501d8495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmV<60w4W}P)S+i(XD?L;d$&lb#Jo)p)?x*WnoN&7mn8yzIV&wO4VL{b+RVquP*Y(Hp@^pY(a+Auh&6M+?yx+j7_(fd<)Muvjj7@3=3 z0c|DeFBD)nI0Cr#V}#XVCeM^~dLWm+`90NS4CPgDTAs;642ECKXIZyuCFqg3$UGaE zc|b~RrfWen&AMc`lF*oQ%34qu)Y3d4wpBKP>YV$;aOE%eHR>jo!WGA6JD zaokIPNo?`Jw7elPqwsT7nA+roS>ccwHCfp1Fzd7rD1=huWNB_sUG;BK`tR(2+a% SQNGRq00000007-NklV0nnF|2lZ8fzXDb-RrUws|wsB_l)Xy?7Z{C0V=f6MDzYy^KIi<+MtsAPM zI;+q|H2L0SbtF=6M%6m5mls)?l)_-vzX z+i2=&-mjy%2yNGO9mjHqNHybDF$Zmv;eUxV>X?T^t7a%FY5=dTH>#0`cJK==%4-w_ z<)PzR4oO6RyR0u2YVHcx;Mos)$x4@{k8g#?rt+i0Xc z*w0`VC|kN5sE&KE8#ZOB_V$L?=Y=#rc+e&&Un;*~r!d)N8+#nEmYUL9xqkv9{r-<@ zN4yTBIY@o~yy}0w-biu=eF8&;txCV!KY6xZrl z%i_+_1t_0cz5u+K%{#U%hy8hTTcoTe%?f-$xo|db3c??A4~x*j3IA4WMgZH+oXd^E z+r9SAtRQT*N4ZhE<>?Ua%w1)@?$eu*frqe2NvKaA6P;_c3`H>wg|9G>P^OApLkv&w84{XBIEe8aLnp*?6xDTu zNfyUMtdi;EVKd&@h9j-dnyyiaE36N4&ruMh}=(R`^E9Y zu3CHvz_e%=MK73U01PX3w_g;4G;dh#2ukF>-7AXTm=>T2i_z>xF=z!}iU>f|9Xvgr zAH^6{J-RvU_FpgTdc?{K<`U3fzFZIA?;n^}sp=7-n-AjOayu7L0O_`E^~e6BCTfg; zddH$VdvG|f&J>T$C0ibDZM`jyBIN^UzGX7IwN?EM4q5eBBUQF|7X8}pr$Prnr#a8g zyN#j;2wc0p5xkFK{U&ME#wKv(| z$Yl!H_$1hk$tat(ubcyU9G`?y@6%+u*Z4Xd3&zH;f*V|<-JNtja)6Cbt=+sBjdt>J zJruCMu~O>&J`h_zK3~M3u62yMB{4cH&pRlir&K zfV!UC*>fkMV_TOZP$tb?`!rci8T}gpyM~8#j=S3@PO-%ECEd)USF3I?XCW00000 Z_#eU>%jb+FM6&<@002ovPDHLkV1h^`M!Nt2 diff --git a/src/gfx/cards/kabutops.pal b/src/gfx/cards/kabutops.pal deleted file mode 100644 index 44fd608ab08f6fc738bd1af7622d6ba3427ace7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gUgI=Dk%a*O4eA1J diff --git a/src/gfx/cards/kabutops.png b/src/gfx/cards/kabutops.png new file mode 100644 index 0000000000000000000000000000000000000000..e16d4260e53002a8e9a13cb82e1e4f851ac62861 GIT binary patch literal 744 zcmVP)0007eNkl347 z!E2jk9Ki7(1}tbt5U)z_xhyl3z)bTTcIc(ZpnBT;8x(VRVJ<$!9rrJID0nGvWI1#& z=wcK49(HKnypAe8wDAXeSWTyiyd6JSpQm5vb)S#$7D2sw@A+=--!K*arxA>wQIJb(yfOR4fsTOqn^&vbl~E` zfkZCDK|f7<+3+gp)I=%D@AuPm&}I&(7?n=#b=sRdpO_f}#iVy{tGb;NQT3uH-AVsu zC7cypUJ_RX^s~oj?wh^cI8Ri)m@ygl@=u1LYM=<%WEPqq?LAnaF`A&hq|#h}v{P-a zD_+9TMzV8!d_CPRl)sV1by~HT$IbVl#4fyqXw6aOZt>}?pBYmGv_9nS+Ta#Z)f*=i%WoosA~C5`3sG|QK5G^;m1KvWxz`<1198QMP-O_k#pjT_n3VSejlvZr;2 zK%>!mzF%&-X_&8=3CVbI5bljHGCJ=TAPmboOMF;uxg&PH7u8T!S`z-v@=|_M6RwJD zWu{bd(JnA9Jm`4%r!zTyjZLjfV(Z1otszA97aoJ@qB+8Z axBLggqcJ&{){Sof0000IJvF@_58 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 diff --git a/src/gfx/cards/kangaskhan.pal b/src/gfx/cards/kangaskhan.pal deleted file mode 100644 index 8a1f94c9218e97d36824ee6376864273752d2b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLz166Pk%a*O5?})3 diff --git a/src/gfx/cards/kangaskhan.png b/src/gfx/cards/kangaskhan.png new file mode 100644 index 0000000000000000000000000000000000000000..c14b97e1bbb2d05389159b21efc884934a61200b GIT binary patch literal 802 zcmV+-1Ks?IP)0008DNkl347 z&r1|x90%a9Y;}lg+k;&+J$5O|uq4-d3pPA71@0OGobqs?jf4p?4rP z8!mE+lteC^XxgKznvf4R7@-lVgZkC^@vaT#Dh<-xOEMp-=$IH=5i(T*fx*A6x85&j z00n^54Q|}3Zt0M7NFoam%6{!q@6hPT-O#29fW#`2D?i%0ol8wV)_oBEIXaYc9u*nD zK^{Dgqa8Wt=`Y)Wmmt6d4qM{k;9eVlk@Ra<{dyjp5ViAu(gy)15O(g^#x+-LnxG;N zjFUe`%&FN@ACg{z@E3dj#3{{Yh5-nYkh;)%fu}MvWAGpdfcvh159;ZQ&Zq#$hj-?g zvlzRmQVC`l25p)+_T9--M0QNta5=5|tM$?Jsok+e`=@#2ZxTc^bBa_^+5gdt;%A6F zL)14Gx5Q4>@SKh5+XUcP@j*CTdEs%73l0*#XIs~Ida>q_;T2H=`2v~ZT&R2CoYgZ2 zfIKs+KkP_WeU5w^US?jF0FI{mhUqVHr;js$*5UgzM-EioGt%g5kOl$BqM^ETaAD(0 zuU!T~{SM6IfUep)IAxm!0ydc5B&ulL*1l}xCQ0aprJhLSbXVojS6fH|RA_#YD&oB@ zZCCAPkjlb7^gb4g_ue1spA`myo2Xl)NPMErx?uz4uGi?VUm~&igq5D%>kGl2H!V84cPxtwIg~NP(%jejWnU-6aN2^7}5-U0$lDP|aD?1Zh&7<=${G g&vgsLkR|-*4`fOkaQzlM2LJ#707*qoM6N<$f?e8f6aWAK literal 0 HcmV?d00001 diff --git a/src/gfx/cards/kingler.8x6.png b/src/gfx/cards/kingler.8x6.png deleted file mode 100644 index 19966d903891307617b0bd74f0409077d88c7bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmVQ&Akpe{1(zti^WpPT7il2*XnB&a}XWUfI1q&D!+*qJa>B zyAL8kJ@%p$y@X)UZguHJ0!O==hCWp8!Bu88BYV)7f_mr=IAZ?{dzkEYHX*2fPv?Bj z=l4Bu_#J?MtK+F*Bo?w+(=G4TXi{u0VYA~BOO ztvR;t%$71NV}|AB9u&IFd{@P2DJBw&wqUF8)KbwbvW(8M5clU>yJ~haTGFK~-{8o% z`p#t2QwGamG^{}0>+LeXVb3-kHj4#S;qqQyEQR8hZSc%y-{>L1t5EL6x+V>RTb~+I zsnCry=sYn=A%N}jM%lo=37>r)+5Mi!F?P<3#^+=6w<8n|e%R2 z4w_bC5s3jhckNa4_X`5lr*s4hBR1de=JlH#)Nf5v01RRnzER*6L=jS} z3P4pVVw(Vq3$d5HgDnbmsc6!{dJqHfc6=WLo?9b7lMpNev19XY82~SW!ec-PXwz%J zr+SI&02~RS7yXvuui#n^0JBxf0NviR24qgOgzOO4gm$9$=UB_7HU+H^L+48#wShHo z4Y#3CV~K09PSim^2mEk5<*d76Xr&y6Wf?4Y+6CEPrK8=gxwSBRbzB3m+am0eD27o2 zLPLbuJvx2gGgy5Vod7bGKpcwDq=Hg73Lp@|jXaBM{W2j!H%P$ovLoq|OI600002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008JNklF|9LIl)dq{Hs5i9iPP*4{=WaL(6wI0^$prq++tPoyesxe5AE>Y;EV?l_ASs?;p zqu|zGg^6`>zZQ% zoDHsni4< zz_Bv;0(OV2Sk9EG+oHi@8Khg>r^Kj{Qiye~O40^lS!^GWi7}2OmVGx!vycv6^@`Fs zni|Gyh-SfZ#~wjO!lFskuT;2HFoh#QQIrU&vARFxatzjmqaitrm_cpQ=cvendE=?b zOH%K@FF3BZ)x+xZN3tv zt}Gci(wWRPAreSm4)JqtES&FYx*aC)?O3H)0wex~w_hV&FJQhl6xKK(%@59e-2cpg zC7+0_$Voo==VR4f3zo_|2xAz-m|v|;St|T+NF%+>R1kIMt5Fzi`oj56R?Hxd(i5zl zz>2TSzrpVy#@Wg4pB$v`^zHStSPAG;6*o(OnL1NUj2m&Otr|?M#-+N>9&ITnacKZC|vF(|PrDi0M&Be3(Ddg%Q+%k|?FQv`CJR4X(e$ zEHIU5Odkjnzk*t%i-AF@)psE%4XczI<4gm~R5$$T5Dqh@ZqNE+jOuAYfff)-Up97=NG_DJPHF?L=4=IR0-d*=PYrbZ&y*+b()%!20v`9CF5>6Vh&qx%F-29BplR%bzb_z!-{T8nP@@uZ25r!#8^d!=7D$8-&89#{@XB{(4k47 zTDehUsECP*Y(fJEp;W70gL1^VPCn@dTar?mV-TZ*RG>Q8kO6HDOkC{f@-`g>%LW66 zjpR6Ar{JZV&|pe4Vks?RthYG(U=g^&K6qr>Lf=W1+|YqvN-(fqNV45Z>9H<2li%70 zITH01RHCxWDRu_5YK%=}5{j&WKr`%(K{ot1?J{9^;S=*pnkotgd$$z!6L7qHW|t76 g`h92Bf5!ju7kb0Bi}XN(Bme*a07*qoM6N<$f)hb-`Tzg` diff --git a/src/gfx/cards/koffing.pal b/src/gfx/cards/koffing.pal deleted file mode 100644 index e2f1b01f..00000000 --- a/src/gfx/cards/koffing.pal +++ /dev/null @@ -1 +0,0 @@ -ÿ3šU@ \ No newline at end of file diff --git a/src/gfx/cards/koffing.png b/src/gfx/cards/koffing.png new file mode 100644 index 0000000000000000000000000000000000000000..eac4d3474dc92ae921205e8775bc0b0263b126cd GIT binary patch literal 841 zcmV-P1GfB$P)0008qNkl{YP8djL73tJ)!SF|z>2|?*dPluK&3vGpBvI(^z@YPlTW}yB zOqX8mZ-K%LVE~C(%lLf1mh>f1496R)oq|iKPTXJE-x`Jj3Ane7U}wui!5gLY9H`Ez zjzgfsdAZB`D88wK=0VeA9rQEug$JSU=``egce<01On#F|A~w7E1qz-C)03pM7nD6u z#iQwIP;sg|7Q9x!FYo&k7%i2<5uYs}bV8AxM#M|6=KSp*Yd|zZJ`vkMlv1U& zjy}~(75OA;R8m@)FRUvqgeqbIs=!;b&%z&Uqm>#h5{-2!m1=r#ZK0iJ8)z&!c7K(Y zebyQ@gOWpxT!iLJ3on9lRRz38vAB53v9`ZBBpYdsY>OL5n%Z_o2Ywuu570h}ypyyo zTP|8K`ct;lQ5SRz{lB1e+e-5|;`Nt}u9J{u zYT2wm3LIkpOvca)O2%%A=FO1^qUW~_%%EoAAaI7Ye-m0=EUYTP?J?U7-ID9K)x|-U z0B}3a`W|A>jOt85-U$E}3eh_T3b2qz3b-D{0MgAzi{YT2yGZdCsPPsMYT_-}}v* z_suW>M|F7`GgIn;20_yHHK}PC?Gap5|I#p=^^2JU>NKRq}xhj`HA zF8#{owCTds9`VEi!9hgY*d=nK63+Ih>MaxZi1(8$`_U&{Y!WwujIrAW8k=rGn;Hh` zF<&RWs)Ixh&T(Rav1|ag`tnP4)1OpYVeF<&i+y>b2BOZ5J8Z(PugY)8ts`$Lt$a%> z%gU-kM6Sb$_6ut%I3Y)YmQ1d72wh4)W#8@3ikiY&QB zWwI6Wl$reuZU1rXcbMw^C0-Lt*O zbKvDp{Gd2hkd5>5sb@Iv6dUf3(uNKZZ@ho2vguLDG#84U zd=40^7h@j46()9t>=cBl#hI}JM4v=9L_0ck$tB9Piq$T7KUM(uc600079NklTn z$2icqVPuSl_+iLrg+zQR0- z5Q2_9A~o%h;T6+-sgix-$~aA5@(GbNiPv>X=?jf$?P9_hn}zd$uk%7!B7j7OI59wJ zy209(l6^tdpVaB0^p%YMr6dp_MCZnHIw1$U?duSOgg141&StG%tJ?w~N}SmI+?8X$ z>@q{2%GHV5$Lu|NM!oaYi_kV~nD z(%UGHIgd?Y!rNiFR#N@`m>W4%!sl8`Xb`e>t=u#$tPU>|o|D`x&)ngLtty^Fd=0Kl zu~XBWkcXwFp>5TvC;P^3)0nC?>NLO1jpZhx*W|^k^j(A-Yd<%5lcz)x6=sD|XKh{)3FX66=8C*Ez&L^rm6$+bv_513dTzUWACZER+Dq6 zVpkeb8o))D&Y?xeDtS_LEupwz@+8@m&W~-OzB1#*BK2R+PCRm5_p51UXnN+B$mbA; vc%2+5!qcjW{e`Bf>J2Q4gXm!0gKi?_aO#leOsh`*e*8zCgDSos5Tk?F?RsEU_9 z2Mn^Y?JpsL1VueUa&+mD8~74`N%P3b=};An2mvFVz4rwt2IUL^;@;wXFi<9OQ$Y3E z>FT$h(q>42I%~4kn7QOOBtXbp!&qGc2i0YRh$A*PBkUtfJjI} z8r$pDC{GE2p}wZmlfPDVv%KjQOp@jAGyPI4lN16ti07^xskgqVq7_7h=Ek{OqpfZT zmI?==D{u5pJ9D0LhF6Hr4lYgYCg3K)0dZq)tM(@0kOW+Ra&N0PXfF570+6ur;^B!} z(afV9sOZ3dI&&)S3_c&WQ`+*Xo_(d}nX2&yd99ixc(T-SfrwuC!3Nw10iyueUbe z#n4944__yCUazgbC3jxIMH7wv8@;tSDmY}#$I;HkW%2-K0bI<7g|(y*KmpNm@wvXz zb0g|1Z3S&JGJdt}KtLJNP@d`SjaYC^6F`Od{xS}zfr3owg@r13r=u%kf)^LhXZ)f3 Z?>Fc4!^|C+!B_wQ002ovPDHLkV1i_7EI$AM diff --git a/src/gfx/cards/lapras.pal b/src/gfx/cards/lapras.pal deleted file mode 100644 index 096c79d9ac816586bfb39edc0334d11e07776647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLy`O1G76StS6F&nw diff --git a/src/gfx/cards/lapras.png b/src/gfx/cards/lapras.png new file mode 100644 index 0000000000000000000000000000000000000000..7388e8ccc8b676b7b9704de3b83edff37b2a2fe4 GIT binary patch literal 698 zcmV;r0!96aP)Kfn00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006_NklC_%M)DUTv-rSVIeY0(=)!#(M~I^f zOC1O*)Qs04ItckV!G#NtGa@6VkoCB4*OzJG@LCpUio25}SVUjDMIJ)pKbFa85s3zj+{^0n;JbF_A6!PPx zi=l*442wABe_Ow$Mw}r4;QjAk_QTjwsc}$>mk%zIT#;#x166B#Hz=4Kk`93J?a$-$ zEu$-d1LgBOr7C8EDym`s>{i?HE&`BR^wU-j7~)`dH?Fq}W(hM%2Gkkjf*e5HLm7%n zZ>-l@K?njgt=K<2vu-QXm1u%`xq0qYbJokffFLBO_FjA+_RgDO6LEL?tM8wj^x7e4 z;Q~;k+;Kql6RKYseB>NGC>yEp|Qm6RWzJQdOVbAudlS06w2ZD}kG`1VqTWVDYTYpF literal 0 HcmV?d00001 diff --git a/src/gfx/cards/lass.8x6.png b/src/gfx/cards/lass.8x6.png deleted file mode 100644 index aad9f17a0b0e59e1d0ad3df1fcf192e4a02317b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)5UL=a~&Fsd5zJ;CPn{U4N-uHG1`8V#; zBpjyWkQkujLb`gjiLtNF_X<0dT9R62Vswz`ygzuEFb_$#TA_7ze&8|Y!>MnRA~4pF z=f*FYYG4*iTpC+HE~x^_DvJb>8`*0{mf_Oa@^cdoLO7Tfd;mW*hZ5vk1AvC+X!Z<` zT2FMP5{A=z#lIRDr$f_t!2yJ{lU_uQ5G+-ElUie+KHc~@-liZTS|)jb4v50-Oo&595voCTCFYg7?yB?j0RTdX~11V+Dl6@T%j%0 zR(@^9=6Wu>%F}u`E)@m%0#Z+T8v(U(m4=1S9s<|N6{8O>NN=N1?4)z)IarVvk3VS9 z^c!>I1Q5wws1aesX7<2*=00000NkvXX Hu0mjfp7awf diff --git a/src/gfx/cards/lass.pal b/src/gfx/cards/lass.pal deleted file mode 100644 index fdbadf4581d4c00c466d3fb034c83c4db43e4efd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#KA(Xllz{;N4=Msr diff --git a/src/gfx/cards/lass.png b/src/gfx/cards/lass.png new file mode 100644 index 0000000000000000000000000000000000000000..1c33c6f6b0b0d5ed2c84442830b5b638318f7bed GIT binary patch literal 661 zcmV;G0&4w0006gNklO*zDJ;idr5|GT*|J} zVBi!UJ~!$B2f|MrE4|Bo3-d}%^@8S=uBtU`*HacQ1qV6El1Wv(ej^ixC%OeA`~qB? zto)Fpc(<0<=4(G(A+kUJ7BPLQaUkXH=Kt}AW!ge*<%6yfuIF;5Jnc7) z$&`W3AoY~D5l|afX$1J3BCwHMiR$12b*^XARyvo4hXpxC>8Tb?zcJTH0G7-}29~o1 za+;AbYY3Qit?^YbFJt|=DzB^tj^8J9)x&1|Dt1hoFf7Zqno%5ISQdb_Pv$1ZMojL# v#1+g<#lRp|bEP*aLy>N&_oK(;=I`+jn+{0&YnYXX00000NkvXXu0mjf5Y-?H literal 0 HcmV?d00001 diff --git a/src/gfx/cards/lickitung.8x6.png b/src/gfx/cards/lickitung.8x6.png deleted file mode 100644 index 857e21a14597c45597083ef2959032016f5fe2c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)ZrG25@MOW59*NI+ss33hWd;j=e2sQuY z@7>Rb@IUnGI~50$2Yy}dTxm9MKMKgtvuPaKT|YVFL?x#qXzXU%NBzVPzx|Oq-D(wF zn&71;cXt0YDu`;u9Cyfiym{k29aivpi(#W)C-}7sZy)pSJle`8cvKWLQ2MDG!C2T3 zsdnnFroh`f_E7ySQ8dvDxx7OV0%O&B*KXUov$0X9he|4=OCN^W*hEnX0-gq5d(dLj z<&l;Zm%tJp9(z8(kz@%r90FIsaCE8sMt>n4_NE9K0cx(lpZVbHvoG1hm~g7_?Zm-T zH{0KB+`sFlT>{UIznDDy#L|!1ey;SrBzXGoZu+Y^|1EEHx(7i}m=ozEdV7()gpe^o zXYRepet&M(OJSOCP7#ki=QAA2dH$Xp^iSrAE*=ebu4RTA%hI|$>(aAwW@fJf^AX10 z*s~;we#2e;U7wSYofQ> zte%nPqTDPKw9xKg(0KiNdAxFsxr8w2XOo`4b-^)gk~?JJSvK;pJC|cBEh%D_WT6r1 zqBNUxswW67AR_|FfD@k5E}0kzoJ6{aK!Sbj5YAYzMjhTpolU@KGPOFA5nzEq2DYM6 zqIa(Fi{^g~JvFwpApXknTWdVhFE2VP^8*fIos882(_3nOQy^4iLZw2W+c>AOE<~C} z($l(9@HH9$Yir_*^9_fYd$pTMR){4hb7^QL8+JLsGs)Nl0jU=oeNp7$@c#bY{dZ>4 zluD)wy5l%&*R%e?X3HfbN^7d9-Q(up)msjqCAR!i*ApFE>y@c)TMG(VIej(`vpkIQ rj?60BK41Oj{6ckKwYp$4w(r1y{TE(v0mmB700000NkvXXu0mjf@<)eL diff --git a/src/gfx/cards/lickitung.pal b/src/gfx/cards/lickitung.pal deleted file mode 100644 index 8f9a149ca59499cafe0a81f835b5a9b0652c2ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#F0V98pn(AZ4_yMn diff --git a/src/gfx/cards/lickitung.png b/src/gfx/cards/lickitung.png new file mode 100644 index 0000000000000000000000000000000000000000..0abc593418af4b9e11554afc4155883648183aa2 GIT binary patch literal 839 zcmV-N1GxN&P)0008oNkl2$~ zUuauZ90&04`Q2X~G54Bto0~eYNEHN~g>=|GxsluURz#UeU=zd_5&Xl7IG+S@XhHBz zIuKuqOqj9ezclah0r4pVcIy---t3;VqvxBXX!{2R(PBqLb>$PO-=^I`m^{d-kntt$7Kzq7+b9Ce(Aw8#9Thk%O zw`Wh}-girQbtA%KwnfMk&wX~qe|&hn(brB*aYFK+Cp=PZs7|gkN$gGTUKx{5eS(^B z>KZ!?wF{CnhmPeIWfn;B7%ob|)g`xK3kN(P;1A&YM`p}U+2W`a5KQ04zrT3c=vC21 zNYD}(vd)yhO@7gGQ@f0&!eCY(dhhC|=YLiioAGu1%h!Lu_VLYs-nAxC4G4OTUhZ!G zJ%6;3T&o_72tMymw_aGuT=cE4Qcwhm71i3{0}BJcuOgek&4b^Vhp(^u9qj0dUDmcA zw%*$M>v`;phLd|~8l1i6jh<`{F`kX$#r1%Gi?+A-l^{-meDdRnR5Bk-y}4XEu)uH% z);Kw%m8kZ_>D)(e0QYb|qLI@9WIFRwrr@JD?-h8nZ5LH)YBqv7e>U~OfWV4_L?XX5 zSElKcCLp+8veEN1* zB?lyIzzh4W8oUVR?T~OGMr>tu4h6FZ!6b?W^c*0DLFBb1S^d=K^(R^1H{?r-S&{zX z^6?|u;hz@5=}JO_Otu-%!0@=NOenaLg)4;%r1Nu(!%7iZk^(=V2g^( zp7-8F+iJ|to^#g`Q#*9@#wIiLpHUxLd}=HZnW`s7QZqCDGh$=_rv2GS>PjxM_w)wl z0N)^|vq294w~*psZ14}jI~ne5)B(Uap>{A9KO?vwBj!72Bo6`HT@uxqGvX7#c8YDf zcSiCnfaSC{hs+uH8{jIyHYR7J(%}KUJv7chUrt!P1ad|_3+_f+?+rAA;YVBf{!P|=kH0Oo9H&wKSkzL7Huwe~Jn7ZU88q2?o4jwPs^QLaAA>=5&*H@MVV zW|zP?qx3_Wy$gDSk24*Nq`h3i(O|( zP|oHPeQl_2#E9fSAJs=c{Mur1>I?}U)qAaP$aYK?5^(uJePYbeh!MAfuu^OY5+g=J z-L^=zKf;X>BSkD4$qZGtWAa6;Yb+S?yI$mCAYuk2Rdt&pMqbHsNs8UN=3-#n@31YI b<9YoBS^LGMJ?Z#I00000NkvXXu0mjfPWJJ_ diff --git a/src/gfx/cards/lightningenergy.pal b/src/gfx/cards/lightningenergy.pal deleted file mode 100644 index fc96784cfbff60a37a53e94a1adb703d6439aca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyL9nUPv)WQG&4wwRH diff --git a/src/gfx/cards/lightningenergy.png b/src/gfx/cards/lightningenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b627b64060d6f7d1d6f8df2f6c930432f1f8a1 GIT binary patch literal 577 zcmV-H0>1r;P)0005hNklT&>=_d%jyn_X|xQ>Z8kkl!{J%tOG zDel@dadAbg8?9E(<))GN8NMA!BWPX}JXCF!eloT<3)r(Qj8l7^!a>{e)x=&muA@M& z@92zqs_;J}7)fr`M$~y^| z)!EQZ^ZT#7BWJ{B(L636C73wFY)-s7N)S3DT7H(UX9~a?a~PVcl2bDetdYTm(HlABCWo*!VgR#U+;asKPg+BQXtz1&TZMryMk(KU zXufW%4<5yX){x-BeAoI0ZO36P0Yu--7oe1s7=2)Fo5v7b$VY?|}B%v&qq|~l!A_f)R4%?DBUj80WE7CW6yLnQ# P00000NkvXXu0mjfR6qLN literal 0 HcmV?d00001 diff --git a/src/gfx/cards/machamp.8x6.png b/src/gfx/cards/machamp.8x6.png deleted file mode 100644 index 55f52fb84c2057070c1eb188e154ae7d9c81dd39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776 zcmV+j1NZ!iP)Mc{K~yMHUBORi9900o;oqBmkDZte`(8R>)o#fySfLP;S(<}|B>Q4!?N*R( znhd3(SPyz=8b~##>Y>w;ibxBAXz<^mN-NQe9y|mqVM0?=DAg3Qf_gBT6hR?wngpe8 zyWabK@F-Q%h=S1Gi3j9$z8kECx|OPyv~y5L$N*K)WZlcPd|CRm0IC!)^!`g(Ww8{E z=8mC1t7WRqm>elc)Ihe!B1Kt(l7unVWUJ~$I!%PK$=kSs%)Y^cysac!XZPDqL=rJz zO-=(7k3VolvDBCvUV#AFwiG0+j(-jRZS9q%00y3VvL{ZD`;Dnn(3Qbh6`WkF#k;ihrN^dezlXxEXEzQ7bXNa)z5xfT*A5 z*38G;8-2C6eGs~e;l+#heiAPXlxJO(m+7-_JX>k{Xj`;+dB7$*``0_i?=IC} zIbbCi62;F3ch$u7%GnL403dGN7q;oh`Kx=%)B%UrFYnj`&ma8a(sSqh2%4j8y4rK{ zQ1f@wHg-Wc`J;WqMRL2>KDoYW0XcX4;cC}^)#)GCtIL2FKMVW2}b3JI% zF*kmA&+h*7HWzFPV-gJg(|3j9%$BpNbAT(RmWmP2ytNiZ7G!|)d$M>XJrE9|2!QkU zUG@FgS8JsfA_9ysO6Ol2iwkla@)ck>KpYPi{Gnx_!mf(vMMpQM;)3pWDSM<>yh&0j z^cP1i0hWwuGjwc({*7x}))6^WD4U|RWYHg+i<>V<9`!$PCfM1!#VG**0000P) zsHh-dr~n`!uGd0W00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008fNkl347 zPiPcZ90%~9Zl#jMYy%a_&w{{}`N{hEf$hza-=47s2~^VG zjlYkYuK2aOFarY2flY?j9$Y!`Dv1aPA#R?j;%9$7Iey{kRnI1@+WBH^=Jw;&FT2v;IK zKC!`%X@G<<&#Mx1EsK>ZzbO=wH0=Cv=do7$*}3g$fXwpFg8BB3@Y5fiVUHD)c6(BB z?L6*uM!srd28q4GTqCvMI75ed`GF?53i7J;wa?}imbgUlD*@2A9ZJk%JU2rUMGJ?% z_=#U{-H*#$A|Wam+dOp=>CT$4QRWB;Om}nI#*0f0w#^{zBHU3m=zYTX?fbReRz}VSNcvQa`#mTr z$7>n60D!3=mIM~+9PiMP8V*g4l%v<|qDG51*lw*})`WFF02QYsM`6!3aR2}S07*qo IM6N<$f|{y?m;e9( literal 0 HcmV?d00001 diff --git a/src/gfx/cards/machoke.8x6.png b/src/gfx/cards/machoke.8x6.png deleted file mode 100644 index 943d13a6d4c53a17ae9742f6f2add46d9554fba4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmV;$0y_PPP)iR=6HU5d~Ay zARjYAus;uxf*Ve7_E5$Qw?OGhw=;M2&q8ev6;u>Sq3E33QYhWl{o1B`^7FwaJQ2ls zqD4uHk`fJrCrajZ5m8j3lq7hf7qmh|QpPBFqTLjx7!fH%(Ij}HQsr|jAIhR6CC2B$ zQ_{C|_x+LMyb_6ohLhlFEPPLxuKdJHk`x*q15eAXI573$OaUnouXi3g>DeGLZ>P6) zBmZfiXB1VDcdja8Up3lVe)V}hP8g)uE<=L5bE`M7I@cfqI(p+WGitNi*0Od&0B|t6 z-zu!;9y;wjKciM@H7KPL>%NP*&vR_W#ucRK#zvX~AIm~6r!nwN7FiTt2sB5+Kfbyx z)}_B3QW(Cur#0ZOaWqNSr=S54j12uO+?vBayw)~_w3mtIj$`>6%gD{|ok-)xd(0EF zwdao7_jCeKY04Act{8S%58v;o*CIu|rLivJke(PzyeE;yB#Y|e{j^|z;Heiyq%blQ zag*QDHfKVb2DBU>qy@*CgF~7CsE6DE|JgsHj15e&y=*4$%ML(51_P!&$9% zfY1OSr~m*Ukr>=100002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007sNkl8kjO3#($GN> z#V(rEXb!@Yo*APeb;nhs47vz1NMqBcf$g-n@0@K0z84=KzwddU?|EOq4Fw?p(2-*s z$LWF68x){f=^|85kpnaeH~|IZ%BfYafNx*`9YI8*R~0d8uWlJB;zHM!5TLOZT{-yn zRfu93W22&|Gh7xcr}l-2gR!xWfWkifSasm(5>O1!mq3&|)eQ3C%HN&1e7en650lIx z$0VeV4SD*vxA8V7gt?=RFfCoZ-fqq>9TpIxaKz!4lm4WqKkubTX8EB1Fc zDo>{435da*_w$3*lWU&&V1Y7iw60;$ynoi{a0bo0Ss?|B56uINVdoyZ&s(%vA_|m4 z108*4%eZThyH$k=Kr}H;I~M<}rOw~(tx^}E3{g((wtu6-=pF(r_Fs0x#|@BTutWxXYB+N9|j4z@%voyaJvtrWJM zb+YTGGes7>(=4-MT*!WFZ9>lI(f!ZC-^50(Q%dJN# zBwDqND9H3;)?+DJ8kwhCqi_@% literal 0 HcmV?d00001 diff --git a/src/gfx/cards/machop.8x6.png b/src/gfx/cards/machop.8x6.png deleted file mode 100644 index 256a710ce8847a3c208c053b722260f57c24f81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmV;}0w?{6P)%7V7%)LEBtjFn;5H^kvDlp^tt1|3 zSLFhUH%}h*VjI{+H(n_zD`_>v1UuM@ghZnhFPeDsAOzQDmtaB~+H{;{yIWwXax?NwKT{w?r0L2;u=do%NYSk3|fqYPyOd2aWyozE-AX?6-Q%9+;4W5%kWGDMM%R%Z5$)lZ+ z%oS3?Y;zT2bepwxx)c8K*OCjIeF5MDflkniLJ)1x^aZ(P&ITA81h2 zc?r51-#9<&MA228#|1^Ak#Qp7WZH(xib^X>W7ZAAnWQkYj*uvd2@3oGuy=?3i_}y6 z{tUeB4*^;_BmVn)VpLHmF#!>B;{0JN^Q*28`-a$)W84$4`KqJ diff --git a/src/gfx/cards/machop.png b/src/gfx/cards/machop.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9d40c255fcb45dc8afb3b1be7e0e3b71785845 GIT binary patch literal 767 zcmV0007#Nklk~%tv)y zrz=A*fCd0IRmrFsLJmlk(1rt{ixgBTVt!8FOUTnY zZLnrts;1TV7>CI&XvnPoMcpVRqQvNH2sTqy7vf4NW;K(`FNt`Nh~537d)&SVUc zl(|93TEKHd;|Ikh#5fxQmI><;=Q%#u5O=q3XVJzxy4|5*TFPXVSs7#5ql~_xauKb} zAQZF&1Fg>eN6hjx%epM#L#@HL5#-)-9A{iU7 zIC+@iLtgZ)Jp3sn){f6{+CBbwTZqmd?c%i?N+A}KvZm00<(c|OPL*XEL50R3dW!K( zE-n-)c9}QEkj;-cjuqenjGbn9?A+oHNyas33RoFnw@F3rpJa}Z3bS!x#P1wV(h+)^ zT-IzWie@u9f#Z2U6%G%y?jzLENd+IUGJq)rSmAP!;{&W6z5q0h_TJ+|*CQarkQvH} z>0W;5;Z6j&&=kE>+nm00N0wjxp)ZBQFF}*iF+3X=@HP5S_#p|_jr^24TfvDQAeWK%Y_nT9CXoF_t^5mxI7E9fD0LK>YyMUx>?YJw| xJb`D_w31W62$wMKDGIMEA21HB1>xlP_z%*!a5kW6zfS-F002ovPDHLkV1j9xUyJ|% literal 0 HcmV?d00001 diff --git a/src/gfx/cards/magikarp.8x6.png b/src/gfx/cards/magikarp.8x6.png deleted file mode 100644 index 0f40b7824d2a1c38f0ff60e1fbc4e8cfd8420258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)jOJNv(%Oono&azI1M1l|%n@q~A^i0xSiNEUU)^4(!wQP}; zxWNT7zrjjur?e9zR`lzfCNr}2Ob@ouNTVYfakrQX9X<1xY<8U2cjk`g;!D0K&-*-Y z-tYYY{>6$=V@V_)3rQ37!Z_N14WbcIt%~9hK%Tu4mPJG}#zME;MR*LXl>qYz*@nnB z*(FpjY91?z=nLj#IVaOX(vS~^T72Qpp$6?#phy&2FNvZUS9dU?NC^W^ZnkGbyerI6 zgzkX(zVsePJ3OS3++Y|cA1r=Uevyv)Fd@8?{V=eDDh%NumYoe| z!vSufo~Mdso|wG0Ech$vsa~=#ZM8x%iDKPVf0mHTYm#ZIDDp%j7Z!GzG1_&rTqBBk zr}NE^?j($Tem%lXd3f9hr#)XI%_@79no#I!(VdKk|HqC?1W$veW zKTnlspS4_pQraUb>vuUaCy(P(-)CUyw8VRl>o~`zBFWU5kz7l#p#pt*&X#kqcKeB9rZ>#4ZCD z?no(6DoXL#aK_$pXa?udeIKVO6p66i*LfWZ$9HytSv)HLUS)JFwh21_wI~n@2 zm2a*Rq+uD~Lq)DxP?t`-4k1Zyo#c9;BzK8Kng{g_`UnoFd_S1`7+Va#T6%0vm>P}H z*w@=#C@7Y@h3!%b@uLeQ|(|NV|XVd$O(!J*(=00000NkvXXu0mjfB`$UD diff --git a/src/gfx/cards/magikarp.pal b/src/gfx/cards/magikarp.pal deleted file mode 100644 index 252df218675b5f987518249885407ac4b14ea1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgAFnLW$ie^s4(S3V diff --git a/src/gfx/cards/magikarp.png b/src/gfx/cards/magikarp.png new file mode 100644 index 0000000000000000000000000000000000000000..41d79af70bacf3d91b321cf2fa78781cc776a07f GIT binary patch literal 849 zcmV-X1FrmuP)0008yNklsMBV5 z^E2s54L3pYAPF#i4wPuxuSh>$JB0-7?wY_jPHC}z4W9_P14!)=9?X8-;{_3X9s|c2 zI9fe-5o|W8?{X0$g=9H`WShA0yE{N^HGz%ZZmLMRJQzOgF}l2RX_rJ5ul;uJ$*?Ee z<_CB=~QN_65;XLr6Dgj4T-6NeClR}|ovnwrH-u&eS^0bFP zaQ@G#r~LQfV)L}Z>-Fw(SiUvl(9t79{}kS4r+Dez4`4&6l3ONh74`ok1jQa->I z(UJxyI&9W-*tBGO>BT3VND>0#EKJ`TvWgE@v^41+v@c&4e4cgek#Tj)9*odCf_-=` zY&w1tYkc#e&~6D^*I$>z_fK*k%@t5+Yq?zZSy8yJnR~yo8c7ilDn1qu1t$yGv%XrI z;$TEpiuML4F6Xw5M)X*_fptfFZ)DoPo;k2bCrrjNN?c3Hu6i?z5rMba3r&%hb3f&9 zW=;-Gp|H9lzS^DIM9%FhB!tu4jOWSlyC}h0{BEKiJ)~sbU8%KC=!E!Zo_jbSIk`P`LIj z4xQvT$6au0_r8obkDEN3Zv1d+@^3dfHZ(rZh5ra0BihmUp_hYyMD*43p&k^NXy}T- z%IBjge3U>ZqHu&2$pk@6QzorCAgj`2-D51@g%Dw!cVqpRatmN|7|`T{r=@7$hqSgB zZ4?a>$zWmchS}5{A#)JmNL&=yd>bQ-5}>rhz1dxKe_Hlk20rKz&tx{LF4b!%WDEr6 z!|amk%=RdadK?hu?vImnDMbDGBX<&`z$|uXuNNXDtYu8N6zd0zlR4`s!XsXOZSq@2nXL7dp?`p$>Ssrgc>C0BqYN?H38mG)D2 zC*`-D1&9dKbM4C5_SsU(+Es*BF&1%+F8V7TlbhbdYE;o^1WEG!KX1PH2y3&JZ$n>~ zwP?ONauwPJN^YV$le_PSex4q>Wzv4}JP9+OOUCqa{PK-fqN96|NzYE15hK_;In0{U zL2PBzf*Eg)kuMXpm4;k9HD|0lx)j>4`E+K_V+0s6!-j#c1=^0Ea{(h-41j@0TgnYjM0000WdP)0007@NklHf zPiUKU9LMo*>AFK%j6>!?gUSvb=4G;i12-Op{W%C#lr)&ao|D3ikg@Jm=6?4%*u_!0 zf)`h7^Q1{<+@;n%fhfB?$!~R3=q8I`|6t<$1)gPP&%d{as>nXa7kv1fKEhLx1Ypaz zdKN%j5c)v7skK%B;{wnoHPM)`0k(G_dQv+!F$X9F+Sq>9+t2{T9dM(Svn!3AvVg+% zPx8fue`dMpf|q`4@5Iiq0B~qTc6(|4A4KbS-o;& z{#x=E$&@6}Y*>$%?hMrj>4$RyTyB{nKb|1!p^TuCD@&CdtnB+^kG5;+{URU|dF8UBozkx>|p5$@P~$7||{Q-i63IQu^+8 zW%*|xBP3TmFFbUxdh7efyETye$ztl)^?*?eA&!yoPT>vKl5!7>6*}S{p{q;p?p2KQ9!oLWY>*WS;#t!{qzEIA61CNYEW9( zb?V^r$S;+^_F-`~cr=iiejnMK&%4dcaQT?s-*s;GWGEXSouL_)%8hoMYkm06mUO1R zMmHS49(E(^`q+%z%U{J;QQ8`I2ASSFE}QvT*RKyocR&9VHr}&kt#XFQB5FrI%s*R{ z&5NJ7K-5cVm>(#}+O@pFKw4V~(?eC+{CLK}0eS?tuI_W>>3jSQE6Fl%qMCAe00000 LNkvXXu0mjfiVu5- literal 0 HcmV?d00001 diff --git a/src/gfx/cards/magmar2.8x6.png b/src/gfx/cards/magmar2.8x6.png deleted file mode 100644 index 64cd043f49df49a667f437af7014ba74dcac3872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)YmpWvkt+*&i0eV0>i5Hc2>;_C zp_Bp|{+e=G_=|7`zBy~Jn{&>%F!6`W@Aq^3!a3+~eH(Ja^fx<4!8QO1b?;~|1BetT zyvR9k3_lK2JLgn4vFlb^>ZwFjgL$ogo7(W;JgM7fkg zfG}PkUf-RLz8t6e=@S|V=fwAPReCHn+#&Z10pe3A9W>I>XG5h|M$H=NQi_V@@$cca z?;_O^DL`eJ9%_nTsu{JE`V(y$bm0r6QqwVFYW!0Gkx>rCg z?mK#<+~esI5GX7&8SQCxGPOH=PEY||GLpS$B4<=cPP(fxYYQCDm5{3;i=2-c zc+q`$7Z$?Xq}ZlTy?uWu^sxW(b*%7GO{0zC$H&ONdCQhQhnDFDBMs8Xl*g+3XC{FR zg=8##=7le?CRCi41XQMRIgnSNpB)Mv%1c7g6vZj~Y>K|^#k?i!T+qwly>Mn`YQBA= zyDI;H8&08-ot?d}yXf3R$CGI{7JXq@FsU{-Zn}{eznONUWJfid-LSf4Zt45Md!4B< z6pG+C#4}upO|grME7Pj+ zHLz#Gnl91+!bxSjYN?s$WAQr{he9b0dOgLgt8Vv)5vqZ3;R~{!X2q_zwY3NVs#jJn zt0;=j03`dYnb4(dzviD42^eV@gmXB8we1h~^_w|GH2siL4J*^*-{aR|vn(Q80giwD Y1hQ5EY$z^$9RL6T07*qoM6N<$f`HI-i2wiq diff --git a/src/gfx/cards/magmar2.pal b/src/gfx/cards/magmar2.pal deleted file mode 100644 index 00ddb8fff85d89975414ee0bf68ceb4d0adbf2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmdnbG@qe^fq?-43+Msq diff --git a/src/gfx/cards/magmar2.png b/src/gfx/cards/magmar2.png new file mode 100644 index 0000000000000000000000000000000000000000..7722142bd1214e682eca92c0a13b9191acd5a819 GIT binary patch literal 841 zcmV-P1GfB$P)0008qNkl347 zYe-X3902gYm<46c5R=lVuQe!VX%8QF(JG=MLVUm~2+C@%jDkKy^!Sord_@^pMADqO zbHW=80(WBP+KQm1>w(75GO(=O*|`g;$aB5_(!Tlo0nP!E&AK9m5Qqi>&PtCd_#a5d zkv*DhjxxqLqblHxSTGo5_zzTdqt8l zp{wwGH%D1k;IQX$l!P$oo3~R;jGW0_lq*CsKvY1|=I++&&HPF?BZN|roV9tMm4SP8 zj?hn@Hb62aLmOX1u5C>vxkf3-kR?Qc2JQ`Odu#I4JD?LnyWcr8yf2n{Iy{7eAU(RT z!FlLTo?^9~t~Ed>Av(FI?boR~cT|qj!(Z<`een5HC=(ink+LF^BH-s@1 zcmV5D$#SUXHk$zs@etl`aFhDXI^7GP5R#LC6Jx3`By{l`md%*n% zk?=)^3OXTG2ZBF50S!=-j6uSGyJ}lwkvcvgV5<-Yyn&ny=YC8niX`=j3~-LW(`fs& Td$(g700000NkvXXu0mjf_M3Yd literal 0 HcmV?d00001 diff --git a/src/gfx/cards/magnemite1.8x6.png b/src/gfx/cards/magnemite1.8x6.png deleted file mode 100644 index d81dfb36b21cd854276da18d4d77fe9bee16fa1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmV;70(1R|P)1H(y)D3zM3>DnSC*Q!BuX_q(*MWGuK17nFOsytLlCli7n=Qs_b;tjsf-+k}9 zd-oo|^+<6M%|R0f9^gZGZrdg~C zJR;^Lqu6TD{dIx0kocUurA2pxt{4KRdp@y+RZ0bvds&azkxeX6PhcshZ9(YL7O#4Q z0-@kMKwOuXUAm}?4CtDomW&=RVRcbt1X@z9B92x27Oq7!fFL}jkHy7?8N^dhA<-Pw zN42@7Z_!av(uh!we`mjIewiMTbz&BN4rmkNr9?~kYOIKbAd#eW+08|w5%2Es4%8$y zZZ!fyZ(l}apd@K-EfOv1S{Bjki<;Eb^FR*2K*w)o;wFTDN;iHLlyT>#+Vb5qP3~@n zn6DsNjIV&)-n<+u!~}ghN=w}xd)$37WAD$uI!D`VoFWu^+q{{2J(&+e64QjV7sy`^ mF{0eEuM{c%PyC0t9)AGmRX4*uUl-8;00005j6 diff --git a/src/gfx/cards/magnemite1.png b/src/gfx/cards/magnemite1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85f098bcde781833c55eff7a6e7e39c96ea1bd GIT binary patch literal 691 zcmV;k0!;mhP)0006;NklcvB6 zBYW`Rp^#k<;>9K@H4!0`o;(;aNy$PX+1+s_n?@|Y%glV{`@ZwzJz&=Y>WD`woPw~J zpb&f%L$n79AJzcU@D-&1=9i~OYlPBJ2MMjzLJA6_ zf%t<8(lXiikI4}!1>ljktrtse!w*0YexOVS83qeLPi6(A>xC?rjzHBn3Q3Ku>~LW9 zIhcP&3eq+?FgU111F#8MLipN?+5)V5IuwZzsP0^X1JmC`Spi(uA5?+0Oz%)4$0pBU zF`d7qVz%;-J?0t1q@T(0W1WZ!yIqU10eeS2@QZ~i0CPg&lQJ>ITPjliZf8_!e+1lx z8}=P5sJ#HT+*aYi(3*f(KFPz&v7+6FW`mGJsod>!#ogIca2mw;sSO8W-vhwlHb{B5 z+sT`j4It{`G%ROkScdy79+a~Ai}h~#zi$@Zapf)(-nUuHi*5CBprAIi4w#qNni?y3 z2R&S@`LT6nTz%eSPiF4PiyL^H!WF9@Rz*EN_Eyp!Ld;=&`T+@W(~4Vig7IB#T^P}vN_mE zVF+%6-FC@QL>30?WiTk+CToQ$^fJ~%g55!!E)3SYD1!D7OM@U9@-59v9D{wg_wmdB zd-)QC{!>IGgNlAqS)IE(;5TIByHZ^Tw_23t?wN^`Ti53=+PF1GsF*6;SKjFjXSAqL zk$8FU!K-xxn?OFEYLIuLxDBJPG+Abk}gL|$lJDKj zT-5V5nW0PNCWYLxbp*o(;;4vA``M%j!@m#;gygPlnO#APiD&9HQ3L*W(BLLa%d#Ys z7eX;;UVM#8PN^>xk8Jl~Uvg9&ifcA#IjN&Yf>dtSaaSVJHoF{zkQTxC216DB&Oc7={dgaQPWWO5XJ0006`Nklyl4oIQ2HE=&{}gEAw&EwPx{U&pt+6Nyl99P`-R4F@F>Gcs}H$( z%})SUmPkM}J7pW*M6SlL3Ow$V^Z*}jlsD9VG#i@EmkfcA(p_~(h<1NlFgwL{9&=h3 zeCL_Gc@|ukI3MW({CZa?n7ah2l``Q0Jc3nYEHgDsFaRAWcFb*i6%x$pzf2ulg5YIR z_3C1E5g{`eJ5V|x|;_kJXaFU(-Ktfhik5AIVO(H zd63b8QpqwiaKe$1CEC(_wJF2NRYGhbQR_k05Z29&+qGy+=0Uw;2csg(FpR{iiX+Zg z*R6p>r+bcg>!If6B|3*4@zVo*Me^o`oGo@~YJDgzYgxs9AK&Q+-{2csN^u0#QmJ&B zxb2{G3Za=nf(#EG@fv6;kyf?AWeot1XbU9gvjXu2=*#m&Z91=T3*ct5r8Gv|U*XTZ z34gn=YK+lKfQfti3)dgmMT@4`!__@UtVUq%6{35`P9Ix_5D8wgi=y2KmAtFpntVAA hT|Cm?mouP$)*lbf1pHT)wW4MDCdC3kNYDzCfDvHc@XTd{5X30AQB*7j0 zKK8PuLiOM&yX`K$RO`iCm53Lymq<|Bz4#A^osw)psAU6*BD8oAd+=hSZ4Qz}?|mM4 zk;#@KqA8IdMIaHT9g_H|A)MkthEy_+!=J=lOLaw6F&-q%t>yC3Ej$cFkx1qB@^SM- zV;YInfQ;~Wnh)7dGB6lbZN6ECi61^xV-@hSN1r7SHn;F>iHH{&vIvprEy{X>3H?Qc>QTZBqG+?)oVw0*CykSUTKY-C1|HtZ+`vF>g0nr zzDUOM3;AYSITS7>b=50dBTcI8*M=R8b3LEb*`d!~FtbRb zxUkGrWWhg~vu|GIv|XaEGjOU5)VYb}MgIf4wa-8k S;h=l~00005j6 diff --git a/src/gfx/cards/magneton1.png b/src/gfx/cards/magneton1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5554924568be18c146b02887e9c71e0f75233ee GIT binary patch literal 790 zcmV+x1L^#UP)00081Nkl347 z!D}2<90%|p8$6`d#EXZD2Wdexfh@HkbQAh2{sUgNMG59o@gfH8&5PAu%5J-xlLswW zx|iiWnUw?~%rESO^dRhPcM!!Qy_Ck13s71x5{pBW5v_Bi{fo4AP=XL zV47s3D%y1bFD|EeERG(VAMotM4dCxrzAH~?LsrJ>r>#pUKYsJ)r!g~G=Id8JukXKh z@yZt`V{ORF=>FEJ`p)_K)~S(*Bg>UrH|H;H*XrN@J7{P_ML)fD?XypJYCrz@NjAq! z*67xgZ}oOf|Nd3l(1v6r8Omb2)&~Y+9Zf1`5m=aBxCb1>cMVONdmiC(+I|Dr;|7zB zJDb2p+I|2W)hdPta(Ej+?GOkLS4NJkzA;q@b{CkgS!OD9Az4b50CNEFGj=)N2;Oz6>acQNt6Q&q6mHA8sG|H=t1 U;CR2uKL7v#07*qoM6N<$f+-(zyZ`_I literal 0 HcmV?d00001 diff --git a/src/gfx/cards/magneton2.8x6.png b/src/gfx/cards/magneton2.8x6.png deleted file mode 100644 index e20b2f4a4525437746d1231f2c39c837a874c407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)TvWFTv10EW>Br~^23bq?P z2zv17A)?EkmI!@RHwHjm$K~_Ce~QAn1XSWt zx5w|E&-qVRnT54R3hG*8b z#utoDu>nx6_43$sd2B}Wr31uRBP?lL>11gDuxqcove#X*>rgR<_FrEt;;L(~9tnAo zEN=PO_NDA$>jQdqUR@!!MOn^4e?Yc zbh=)QF3OAFod6^h*Dk9E>z$|pAjXx9=LhRkI&c8V6Gs~3egse;*eYWi*C%6u8-SPZ z>yvmnE$dwrAYNfj_|thVN|!;VX7v8}mvXbz+GSu6&h8v#@wCrj0Du$P++Qs_9Y_Nv z;6xq{${ns+q(Q!6Uo@oOZ2D^h3J&S-TA<56z8D&S>e>B;O+%r-PEas3kXKDQDMS%G zfCIg3Ho|* xCCF_Aral~w3}BL39qOrL(22bO002Nh@&l_**d4vmPbvTa002ovPDHLkV1hW5DBb`7 diff --git a/src/gfx/cards/magneton2.pal b/src/gfx/cards/magneton2.pal deleted file mode 100644 index 5b13617a..00000000 --- a/src/gfx/cards/magneton2.pal +++ /dev/null @@ -1 +0,0 @@ -úŸB€ \ No newline at end of file diff --git a/src/gfx/cards/magneton2.png b/src/gfx/cards/magneton2.png new file mode 100644 index 0000000000000000000000000000000000000000..77eebd70fd3c9650763fbe7777eea9c6d70804dc GIT binary patch literal 715 zcmV;+0yO=JP)0007BNkldK2OTnGEyQ#xO^An%8CuBDpexA4 z+nvc1Xb7CeX()w4hd{j?R=B77HE@+4`u6h?0001h;HD>YuySuUdEbeU(ODn@Jip5Q zGiFw^H5H2&EUa7r`z}Nk0Q@8exc<7F^pH7+pnHccr{Ddj-r5#*ZASNI_4Sh}pZQr` ziP{pPvoD_Pf4@AnkM>1tIv*xyOk8#Aey+qeuAkpYut!(-2_K<)W1dzvaaqC26}Jdx z13x-)ajD6AI@OL4ShRu0;mR=kMqdK?S)k*ndI}V7;6|$s4@j8i+21rQxfGN zLf7~3!@b!DloWYBMgATkiDn;4C6O=Q8eM-wNQ#u{^w}Qa6QebRBudZAtNj-9sZp;e z4ENHDvimVBsK+Res*{3*T}jMuyQ z?r*jS1t{L{%zhbM$^!^#7_@gfI3Na#pnYy>q%#3@qUSnSqQT(`;4eWI?x%;^S>)*j z9iso1%9$T*#%^wFRCjZt?C9_OCimXf$kE&C^0?MPRKgYkw)gJka1?t(W8@6BFU@Iw z$-foBDLmk;pU~W?nm;Dci4&q%6%dzSJ>ED3v!^e|RbvYO@sbX09F((3vn=|;WFRc~ z(d5=lm*;dH>Vfx7b(M2?0jZNCKx7W!*|M8ILeLn>hc^rR`aVUCmDxJEw)KT!S z2rk8fU0di7G{q%SLB+q&v0$Z(ZoTw=n@{?TA220gBC@hQ_ z!WsuDY6B*74idDLF?SUn&}hSs>k;7nb{n*PK-v5NMCK20IKSu+u};LW_GAD6002ov JPDHLkV1h4?#eV<* diff --git a/src/gfx/cards/maintenance.pal b/src/gfx/cards/maintenance.pal deleted file mode 100644 index fb3554f77d9dea6082d92f3bea98acf5fad03045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyBEziIp#J~Um3$+24 diff --git a/src/gfx/cards/maintenance.png b/src/gfx/cards/maintenance.png new file mode 100644 index 0000000000000000000000000000000000000000..dba26b49489444232ac3be5396fd748b687396af GIT binary patch literal 508 zcmV0004xNklAs=6bJC5F2xER`xQh5OR`9#WGJ+2g-RE}uOc{F+PzchB&T#RTTYDVQZ(c`)VW0$ ziIRvnv}oWpCNUSK^eutk`@jDM!NH(^fE|L4Ahri0Am=m!j&4Gl?Ex&ii72qai5&$d zcDg@G6bx$Doe1jV8UrGop-jN}f6gj*o07l&Q!Ln@TJ_)Q| z_h6%9@_0erqRA9l+nIm11ds?JIf6FshjgFV$Xgj%KVcg8o$Z1sbw5F>Lf_jgf)0z? zX>UO!FY!u_&#hqNCDx0#wjUsh-=SO$RX<^G6ZQu}s1ihwiE#rxT&Gm*O>=uvgILcB zPt0drC@zn%xl33yGcJ}zbsl!)dhfU8eiQE!Gk}}YnGpP!+c7oBxO6G3!-TF&h02}Y zB)bkrh8X+SF;65kM6)c#A)^gsDsdQTS$zR{eli)zpy+)Lqhv45=#aw#%Rotr!wT1C yT3F%25I5v?KLRGkRR}A5z$mN;AToad9Lz7Bu1nI)iH$-40000p%J{4wD`P)-T6cY!=Rvq6vH^1JSPU?SGDjaOqdCOzf zJFUEKrHM@BX58hU<&{4#44$~DC&C3woqNWjYgj88%RJSRu+dJJ9{<#AEU1!=iDvz# z$amb?5Eray>(w6~UO)ZK$ah$J17}q2!`GfZov43vCg1lbLkz_9V`=Z`ul!Nr^FH5~ z$VDsd8!tcK)+d)rJA;mk@rbUCFY;IPvGdujM@5O@a_#;0_wLejr$g^G*D1sp(d8Xa zesuQOS=9$*A{RxMcV92`3*DjF<1dM0Jc<*YKiiidJFEJTIC4r=cXoB3Fce_27Jw0L z-mdEtkXT8s6UPWqxtZ5mTS0&qgv2mWd3R6i?s8Dl_gVoMh2`x%eY~yQ>13;8gOSUU zZ@b-_adGNaZ(m|0HYwAaZYH&hlUKZ7=fJ2)^ZI@gf6`CCi~Tudh?CX)F1z48n0Y7l zW(Y?Zv;fRS1Nb9pi_>mx1ZR1`MA>iyx2(BwWC@4TqdMCR88kS}eAKp>DW b@n8P{c4QZm{hS4k00000NkvXXu0mjfb@+0< diff --git a/src/gfx/cards/mankey.pal b/src/gfx/cards/mankey.pal deleted file mode 100644 index f63660eba3262713d910c7b2b7393376ed1e9b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#zF$a`k%a*O50nBz diff --git a/src/gfx/cards/mankey.png b/src/gfx/cards/mankey.png new file mode 100644 index 0000000000000000000000000000000000000000..74af8e11960c3f4ec404e4ef89eb9da8625bb07f GIT binary patch literal 837 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 diff --git a/src/gfx/cards/marowak2.pal b/src/gfx/cards/marowak2.pal deleted file mode 100644 index 05e97c977c399fbc72db9a6c265343c8900e26b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#K1*=|0|x^D5b^@5 diff --git a/src/gfx/cards/marowak2.png b/src/gfx/cards/marowak2.png new file mode 100644 index 0000000000000000000000000000000000000000..ec924b685dea996528a1d8e67bb8a744867a8a4b GIT binary patch literal 798 zcmV+(1L6FMP)00089NklS z!<5olHiR@A&;b+u8(}zLk?#KhDl##kDgyVEdDczF8OTT2>VOAqeWz%s?w_Irc>6aR z(yBR%005$OG*or0Ff+i#X=uU}hTJjGm}vj5>A!-jFi}ep6jMCO0G##^5=bujRK>t1 zK#2$AYu@Fc3M^j$P!*Ayyo)!AU~*{%xcgd!n#R>7V}q3m5RzJq%;QA`#%+~Zs6iS5 zS&AS<$kUAknAa*Y)l|vs7LH2r)!>TDX zGy+ds;$cW(jEPm(xCxh=)7Q(d7V8K{tU4YX2sI2E9;jz}V6N8*T|4MjsI<0t4eWsG zyNyQ@a!-kVI5?cmz1Y%3-RnolwbHxKl2S@q3b9Vdx+K1$5mtwz)ZpZWm-;I^;#B$& zlGy7NvDTQ)lx-WrwPBDu2qB}HvmVg(2(GvSpNCmxZQPwaWP1d0Cc@l0rBN+llhK%nWD*DfNJrb#a|Hg=qGb)*7MxW z>4g~08=BYej=**lY=)YQRk*!xPhP0=!6)Ej&ACKYaP8WEUt0FVRwEdAy}c0gKUS1A zqYt*$pxlMy0vV* zsT86`4O-BfLBVa=n+S4AF)Bzlf=eB?HX@em9~W@-x4*&fgDDj17bq^6x! zD00*5K9x!~6$d&s3*bB9_PsB5@LDfTnsuPi)jh%=pLZIdNr9C0;|7Z%!v;;2B*9T- zGFoa)0+EwIzWSw`fX$qET1|s-*lKR}q3|ha-=;q%WB>k*N>+W){1Ey!vZU*yj$zhS zK^Na2R^Nn%@Bajol{MSeOsAz5P3M-M0di|U|*!IRMT?qA&acs0&Wj&2`J>XFw)ww<@C6}^mYifrB$ z1-p65_!G>X4;&P^yUnxa6V>Tc0V;j@=X>bsh)925Y4ZS>bpcDNcZ*T(bvmw>mx?w>I@_WicP zz|k~RJPFn==w?eUEo84m6<%dBqZep#8t+@t6K7<8er3|8hZZOD(8ab`RvasXNZtU) z?b4YogmR68iU!?Mx$TZ$N&pYS4$Co|hTF$lSMX4?wXuO~&*;mJ_}_h)k>lr&RnJBh zY)L2g{aT;R#@zTT>#uehsBkzDKQR&LWHEg1$c?C$J!|bBJ;wOe&>qFAO6jmV@cZz_ z)6bs0#NMbE?lmGmc|ShaJ%I_kk<(N9pGrfSe6o^6Kk^d6aaxVRH|M0bA-(EI?uqqL zU1ahyGfLS-Yb)Y@0ifpAWX{V6=H%g%DNR`2Ib?%S0008lNkl2$~ zPi&KQ9Khkv@AtmNcD`F*Vn@`0(WF9vOlr3ICo=a=#)W`F=&XlHX5zn)Z1!Nh0J0bp z4jv#u6Er4U^nz2N37%}j-r<6Y>#{9Ui-zcw!{*wpZ?&Uid-s0z%JV4UUZ!W~Yn_*3 zyONI#A3N~vQzaz0DuI-azn{I>x-;@gi>l<3cy?)~{Z`!Hvs-Cx$H1c5oP0ayE?C(c zngkejr8xarfwL1VXre$oKY5bJQa60ioz`@;O4sz(eg%YhTC#>add3s#79s)=$iNGtvH@ioBk?;GoSPyMJl(i ze*?c44L6ZD55I-Tm1-KE?%S4*CgP5PR91Z#tKI9f_PSu;Azc_og0y9bt5ez#HDh*9 zj3}dSeU*MGtRvTCsd38w5U8nJo~4Zwy1)I(cHk5^V?8Ek_Wl#kp36YkRCRq&&yTBp ziC1=)1vA_`6eO67F3dJ>^!AZRG$*^{N9LmCiT%Ywil}>9pv?rkF&_-AQ|dBQOV)A7?_ziU|sUHZ}BDA|izt&KKelis*xXp^G>Ge9c|IuN{@(Rjjy2^ z4zSL O0000f>m6t(L;o3>=?V34z`2s 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 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/mew1.8x6.png b/src/gfx/cards/mew1.8x6.png deleted file mode 100644 index aa5e5d5f1e80ad3854ba99d236b658bda5132a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmVO@$X^Mf`iGar&vJ;t>-mh(=c zJzFUZv&W%$iO7F)LZa0j<@~ujLO$SIafvRHfH*@mttBe?uQ)R3)lm z7q|M*TseKBI!nZ;Ca$U3GMY0+==ED7#%kCXxR^vsT-!eNwt7&~H}+mVXQDl}LwWl9 zC0nL@Z|p0nZnT?&`cC#{dD<_{I3rEF5y`Q952NWzzCGjJkPRob)HV;ls+7}q6am*B1(DAEi{}&0008ENklHf zKWGzS9Eb7m_3b61g{bXCt)P?Dp+j47(Q2>wr-KM*llP=m=wK5ug2BZ_#DW$FhZfpI zlMGf&Qu`h>vpw|QT8*enT?$qQ1uJ^$B@RNH$o-sz;xm5s2lQWfu58&11^;4@0HCf1 z70|cq>!1N@G-j-a5tXNh)nNc!2ZL1ey(aJF9MED>Fw75RCe0mcW>UvMW*iL966x3$ zU5#--iw`$2yvUAbZ}n8OF>sz8-@s57>0(~)4j3BeroNA1J{67+%j4BT6i|*mVp!A$ zg*dDYK_ODi0>ish)|zC$IT0GFX0{n+VOfzsA@ZRaP1?m~EEiqxeDDuIuSG=5pT&|$ z*B*i`5IW4UJ^g3#Es^{F^&`505canfF5qkHC1*q;1O(}WFek7azW*rH0Z0V-6)zRR za@wx$ZwI6d(wq9t9F_|1=brY^ONMQ7uXo47eDRZibi+Z}gfm^nwd^$Jtx@Nr>}u*( zqMiEC%6pWPGBG95eM2!i)iYumuS=_~>5ida3nXPMSI?nbT5Ap$9~##Gd~8 zG!{$sxy!{&S#_i3#U?h`c@wtbG4wtNq*ZNu_xAny6Jx|>Fi`kvbd*V<`2 zcIiQhh=^AD@MX}uTqkkDt`OBIa~p2asT0+a+p|i9xIWCBMo3?vOJx!XVYSm hi=r?m!0`Vbe*tq8a{y(RS!MtL002ovPDHLkV1gy-atr_f literal 0 HcmV?d00001 diff --git a/src/gfx/cards/mew2.8x6.png b/src/gfx/cards/mew2.8x6.png deleted file mode 100644 index 8658006e3f7a92a333df6f7df232d6d51eef76e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 754 zcmV>ZjB{rqaaDm;vog0hk|&CA&Je!nr+_BSWiAI%<#+) zX6Jn#gf2=D1W}J@TEk-eS;QElD|n1(Gz(WxM!GbwU_&BN{d!~#W#P@Pt}{aP`_%wV zx9xCHifUdP8rGu`jV40?Ehp6pM$%`>lzasMP8tm>$WvoV)%%a2?Swc{kle~}NfgW@ zbgE7v88}jx=CX}yu**$Zgb) z9JPA!blD2+_3?Mi$Rr%CH9Ht^N+%yKTluIG~P3%#JL_g2-}_DAnM1?$S&7FHtph zkr`24-w17It>wUkFY=rdQEjGqyxMS5s*)*mi)WoSe+G?(xbD-JSYamOfi$>!dsZ}} zX;aMby&!3DeiM`Ixn~3k3$wY>rr5mWzj;Owf@ga=ALgd->+@J)hDf}9>WUzvAAZ7H zs9;PUku=6Y=83{u$eJrW?N06qD)9=$#)`|ewX^Mu&tp8M@M<#^N6LW@d~^Mrm>DR) kKHK1PqR;YwWw%_^KMJ^e0;NFV?EnA(07*qoM6N<$g2ts(YybcN diff --git a/src/gfx/cards/mew2.pal b/src/gfx/cards/mew2.pal deleted file mode 100644 index 81ae1e659c2a7eb1c062be12995200fed9a0ea85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLJu7s+0t*8G6BYv< diff --git a/src/gfx/cards/mew2.png b/src/gfx/cards/mew2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2106fbd309a9d0d014c6b7b62df2e5ec26fe49a GIT binary patch literal 790 zcmV+x1L^#UP)00081NklT8^v;fr{$RqBYl*+ z&kS(J8&bO*X$y&SgEQW-y2X(eoZK)}#&~blg~~oE!%(g80VeNU9hJjyNq{OEWdwsG zB#P3_l~gCxGJNbT4uhCfp^=KCY=Izh;$#vST)m63Xz#AsZJv(F7EGh751A2+*34sd zi0B~8Zxn2a&hT}+I{-15q>GQ5oCtb8wMFbwN*C5SVRw$Ec2v|{l#Z-7vDNb+yZm|_ zC|{;@z*WF^_UGl#0C3zZNdvtFeEH}k)XQ$T;Uv-89X3LDiA@7GlS;^NKO1r-l!AF1 zqA)|oed{cSO~(~LgV^bgTFZSbDAjyoU>hEbD71V$%1XeRG&Fc8{C_6j>x|ICHiK?M zOL^n1Ax>x{2IIsUuN&G&2&CG?E$&v|O2$+|&zBB;*B4 z*SNJxNS-d?E6+M4TuqBJF)1hAXN6gbWkRUzA56$pmY0~3drm{B-e^SFbx#SJ)aU)~ z;fCdN_S-2zsWN|X{La7lL7G(x%xKW!UVcJXjcZxTTUbyO`j&>+q3J9wuoklB>aPwX zeR`f2b=qXb4#~ zv=s6Ov}<~82jZcJ4PNZA5SYs_7Y|;<%MPxG5GSreY;QH1%c4S;U8T!*vfm!klkfQ9 z!N-*w;QfPAMTTG0IP=N`EA%l$F1IYaSSE3oNOABLz!m)7`?=GR1T=YF)XXhPI9nI832lc-PAq- zWzcHW5O|u}7Xg@wsDY-Ilk5Z~A2f7)Dx353fO!RgI%vu`1cI3eAc2}X*9IHy_$Z_6 hnO$xi`Hco2_aBY30wMMITb2L-002ovPDHLkV1lP+Q1k!* diff --git a/src/gfx/cards/mew3.pal b/src/gfx/cards/mew3.pal deleted file mode 100644 index e2c61600..00000000 --- a/src/gfx/cards/mew3.pal +++ /dev/null @@ -1 +0,0 @@ -ÿšUB \ No newline at end of file diff --git a/src/gfx/cards/mew3.png b/src/gfx/cards/mew3.png new file mode 100644 index 0000000000000000000000000000000000000000..476c1bcde4f91fabc7206caedb1d305cbadcde52 GIT binary patch literal 744 zcmVP)0007eNklDX{8Nqn@^*e#GFW~wss_;0tIzPw)r7J_?OR9A@81u;p&3A|7FG!7_C;a(phEgve zmvrSQ2s{^*UPO6UFI~Qnu>_QQ`*cFt&YK zz*U96ht;@U`=t%b}+btvN z==9i$@~+L{%}L%-WGNl=ta7$xZ+~zjj%X(;2K`4gXYZ{(f5Wth6QzTrPnp(Ld+eV> zHu&WcTvz4VA2Gy<(!K2fE~{?6xcWczhhWNh*yxkQiPASte7B6G>g=b&xRmJc`pNCJ zGLb4DzjiS;E&XMg>+V4=sdwx4x4*3`BmObFV|1U9uIa)k?j_hA)aT znp*Mwx*ShuM;{94G{bs(RV}e~!51#k%q=&2al~D*N zgH5Mp%EaXymgS+dlgorTZwVl8J5gMkK-oNp!_rC|6OyGRfD(gEJ9z?gw3skK@V1@& z3ZOHW2`tJ($9lptKnn^2W;-V*K=uOy#;_>!Rlq-U1voG%ANC<(aemAx3M-k9R)Wz; aJk@{r3;O?v-}W~E0000P)7xn|pbiu? z@)rWE12-K@>B7h!RSqhk4skngST>2&8b&LK&(7Sp(KdVT0_#A0?p2YqNmK(Wmk}?7 z_8T;!1=fHhRKG0(JIOrbPxbSTBR^3`jj5gKn<9=6MBT=4^c-jcfTRs9b zJx#4NjnF*(Tq%u^DV9sR|C(ZH+-iDR|%S-oHS@n&T?Lp|J&OfMa){B>`Pv8et{N4I-y7=KP=xnH5EYrQu5 zx#hkF#Rn_eUV`00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007CNkl2YFkp`sGCHErE{=afZ(gMLYEg>EfE)0bO6XtUp$8=k-NhAB zG9fQEv@7k{NiTZnp_NL7?E2oyh#U9Kysw{+00000go`*TqJI{FAXow!i~QpNYzuB# z4$7lm^(8n|1`Jo38 z7AQ^K{U8V1A|GO~b*EW>?V*kQI}iZ1v}r0fX_2>%_`-bmds(&XfCvTLy%&G3Dh7av z*y!{0`$ZK26fBINZ~gRE=Qse!MO@WO?kR5sAVR^-+GLuSh#__Hh^A2e12T1o9tyKfMyY2oMr0P z)64*JGl4=n*Z`ij9!5vvY#@3Wq#?p#cCF#4=&B;=fy`1#;`tdDhM znTa!Y+E>OIW2CV2E-0lylP}EO68`hBo-kUSEMq4AX;J-Cl{A`$JKI#IJ}sp*1&&4J zZKWtEAf><&)}QTAet#&06QpB+*CwL6zDwGOzMe&>tW@ugfn{Bgg2h7z1mY#s=vZBIws&@-3L#KeClduL1lE*0OIja#Ufv@ z)bk~-V*)TExj-+U&#z9Wem0^eV8l}wdNXgF{d+HMEd}7|T3+q_GOzY;j;Cr2fH&a| ztbMz$ehtp%8WMmxLhb$=cbt{&@yYKDM-oK!;Amjw>!Lj)0C>A{w0jHhi-)9{Appc5 z(yq0M3Q2BZAzT**#6bQ9&6i8Lac}WVK@&%k{(T+kTD+Nxp6i0!UQm~As5$P dR7~SMe*w`iCaV^okvaeX002ovPDHLkV1hk;Kl}gy diff --git a/src/gfx/cards/mewtwo2.pal b/src/gfx/cards/mewtwo2.pal deleted file mode 100644 index bde36b5299f7822dcd38336a318c10d866399d53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgKQ*)^ltBOh6Tbse diff --git a/src/gfx/cards/mewtwo2.png b/src/gfx/cards/mewtwo2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffefadd5379fcb57a8ba07c7c3c3320ac9cc87a GIT binary patch literal 742 zcmV0007cNklUF3PlL3ccLo zoC879_2>nKw-)bxP^Q#sE9yn2#Lg8BzE>0{YKr?VEyXF`UWlaIiuJ=|tOw^PrH<7E z1^NkNC|km}m4I)jsu+|(&iMiN0nPNUNiaZZ!JrbjoP_omK|PR( z3TGKY(KC_rP67Mkx5bg6*&} z6rvV52B4)du3)xN9zq2N+$;p9!?%TsH+D8))`A8nu$VYe5*SO6_rNm=%na+u#(0yV z6$^MFgBG{G6>%+6)X}>1Fted2-FN|SN0{y_8hpR=rN$P1=#yAS(nFZ$9Zh4CHl81E zdI+bGtn9L>#K@d+H6Z^YJk$8Qt3Oh^-ajQszEm_0#zuB;P2sLDOGd~~-OVXm!#CdH zE2Wuaz)#&-gQMElkLqaOQs#PdE;$)td9^ZnbArtJlXDM}(DPZ`*E(dRo-`Ha8|bkI zL1dXfOnTO!`ftQi zbv7ppat7=dz4QZ%wQE_gsL%7&cqHYMriZpFw^%vaZt_@}^J?tZU>p4O&&IX%h4P=T Yf3%O*b-uV#V*mgE07*qoM6N<$f_t%3kpKVy literal 0 HcmV?d00001 diff --git a/src/gfx/cards/mewtwo3.8x6.png b/src/gfx/cards/mewtwo3.8x6.png deleted file mode 100644 index bbe8c6e3d989c9b4af0ff2c85308d55a86217003..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 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 N002ovPDHLkV1mJTebfK| literal 0 HcmV?d00001 diff --git a/src/gfx/cards/mrfuji.8x6.png b/src/gfx/cards/mrfuji.8x6.png deleted file mode 100644 index f012d07e8ead70b60999af263e89ae6d5d2158c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmV>+!_L%r}rFPYxcc)-+lLazt6Mh zeE`mDkmEQ+`A=!QgwH28lL@eZxTYO}!swJXFs;)UwZ;$i1 zcgQVE8JM5R?M3|ECu0KHmot`Cc5wPzW37YoJP0|qgvqWy;O}Az`_Pl%_^p1N35{xN z;=sfxk;pfA@!NVJ^swb_R_-I60UlQakNH=gYDt<{{?iY~4Mkmmb-R>yu#o~@I8X&A zqWZwleS;m0!ZPqvhTZp~Q{On^oCf<~YBR@L>vO+8Xq`IiG+4H>o2izI3cfh+RE1}K zpgA^y+TB~1D&I5mqMI5=;7%e+`5ZqVe z4Q=MqQ@0K@me;{6JGwd1eA#N#QA1UK-4<56-eGHV=+28-9az>a!S=FGga+0HH<$Eo|oPS;A5h<^=y+DnDod(rzYr99n{^r#D;v}z-DFCTR$g8!Qx?m zKL;CT7Cp7aN=ZYPGr6=63}Ts%6~kqe)-?tUPtPUZ%2cRiJB>(^b diff --git a/src/gfx/cards/mrfuji.pal b/src/gfx/cards/mrfuji.pal deleted file mode 100644 index 7a0bbac9..00000000 --- a/src/gfx/cards/mrfuji.pal +++ /dev/null @@ -1 +0,0 @@ -_W"  \ No newline at end of file diff --git a/src/gfx/cards/mrfuji.png b/src/gfx/cards/mrfuji.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b37aeb027e4434602b802a6c03f2b2517df536 GIT binary patch literal 785 zcmV+s1Md8ZP)0007{NklH&VevXYQzo18CQ!O#W@fr96V1mya8$vLO`elLYxCS zfTR$Htso(WfqF}YCmA*DG~>EeYMHjQ?7)MM^?!aoz z6oVSIjNWoWi3PTW?Rjk;2-T)Ns5#&dtci3ZtT;HfZ4pMi(}feKA_|yr7!N{lwbSo? zwe!xb^Y3>XDz1L@NnMA{u@-lzkJfynpUZE&&qLtFU9a z<~u|zzdsWjg~YtA-NdI3O&4z$VsdH}(rxB;+s>~lYZ#1`J;OmL)@GGbWckRZdn>U- z1RHh4*M;anbgd_7gX8f6h@{?^KiSyIJ7Zb>=(r40x+SkLk#Ej}t&ILzM22Gef$w{Z zJVa!Eq>?f=%7KHKZ0~yCKOUAL-I?}n>VjpsreuS{MgcNiZE-gdoEb1zhOrn+t|&HCjKB)c=4xy9i~z;|VT_8vB*OS$l) z&}$_qx<2Ijy%31jnSu49FIsLm`uLOg1|bf+6<6qRh;S+CFn{3*B*D@jJ~mMLB7U6q zzD5uMba<@b(SiD01rS-h_OU6E!Uiw`zHFd@pv|C(5Y!|8iu~U=|2_TyN=ZT21l(iet&pJg*KG9L;(Uq)Y-jl?T9_+s7QOwU2%Fuv})3maMZG}+PODVZ;6C} zf}usfXO9i<3b$4%)mzZcI59g&A!AkVS4B7j6^xp!32c7&zDnm`7+~l4-J=JHWxUxq z3y%WyFroQxiZ&!sTbKj|zd(GX9>o&!n!>;!jHlHb^ZC3b$i3Y7HpdslkOV{Go;_-o$M%pP_2`^M1>z0+|z*Q7#@zy}?NARDXG56fO=H9y#BQ{(_G& zxF~&X%XTEVyow6OAob7g{0gcmR5TbkjW09b>eMw8uC@?bt;{rhO)%k-^9wW%;YvAJ zD#8`ILvTC0qKON05?l>_ntmAzs+JP?3KwG>p^o@_O|G6o#iJq5<%Qr`NP{w5{PPhB zN7r+R9w;Up;_o*nW@A0Qh_3xm;9yGv&lS;yTrie{!{ez=z`y_i3pWA7 diff --git a/src/gfx/cards/mrmime.png b/src/gfx/cards/mrmime.png new file mode 100644 index 0000000000000000000000000000000000000000..42605aa0c62260daf7d526e23d3e64ead0ff9a91 GIT binary patch literal 769 zcmV+c1OEJpP)0007%Nkl347 zPe_wt90%~9z0j&vD+;_M3p@xZHe68X>J>Wdl645_QnzTQkT86se=k@!3(rAB&>_%K zlEI3N-j@a~O82sssJO=`3RK$G-tkT!%lCP|z1Gdohp+|VAJ1-k*Lx%7d4k~MLRxuN zSY(WG!hgpGEs=tzA17>*b6s6cOfGUaNbq^ukH(q&-I|tIYa;-RvFR42nX@Wm1_4;r zh92BMXu=ptzZC=tDb2op%|;Wy$^Zh8Xs8F=3&XCmmKXp5tGsAV@9SStTqz-lV?lpN zx9=bDo^}YKFVHM!Qk{|ExU#IhaO>YSFax;8j$D&3V`Ngbw6RkolO#|(5=jwB6S z11+Z-0q12#>HamAG~}$HdC9`-e{!~!8heGX4qDO%boaX(#tib;0}{kI`|XUxiTX<| zEDR6~e)DXwHDotm)HMN+XS$bK6S4Bml{7oGqJ*RXqeBan4Yh$(%Cm^^5QkZjEfb=_!APGit*} z>}ZoL=8r^?-({%)$lZSKXJ7XHB=YThEC9rhdn_8l6r$y96aZ~(tf!-ZieJq$Tu|5u-eeant2e^ z2bl-O3<3`cX_uz-$G7(EB#5K^jCl&wVZDcpNU%IecnkVNjaWk1VNKVjS3e&dNb&L1 zr9x~BO^UAon8G<91lacK7d{2RzTW#N7r^+Znwdf!0OMRohSC|G!Jc*<8EkuKDNs}h zK;a$}fbGb83Lwi;)Vieu?wP81pm7)(3g2i0R)0k4ypjT7QNHmmU^NyawlWMrxxU?y z-opDtf_|NA1Qdt&V+wX)n$g#cLiN@Ow6_00086Nkl347 zPe_wt90%~9t{sxVMy%)$bc^U<3Pxmyw_+M}a^!C@5j^c#z5PSiB@65j1ew%9iN}Ht z*2+iODoG)w*GMnLdKI!*QPRN~ujWR}thZR9L--G&#EmP@(=2v%x5=#pXjdt9 z9nclE+tf({a#ek2RsnSEoNmcl1Zbr!l(_xD7JvW@SSZmI-Sx5MECH@c8UXU&_HYa! zptw9#X#uI0S$}M-ivYN4*C0^4DabEe4*^AYi@F2U1_G?>x(IL|RE$$4_V|3f;pG^? z%_MevkaN2)2bu!yg9N3loG#l=*CT%B_FGiE`V97gKmaxAhKPK8m>dsK>t$X)F~T8X ze<0@-^mJItp6C0dv<%RDAb*fcCQmc31E>h3%7hS+nY0i`4G@59UM`u+G?_OI5YSP* zR!UPoa;7c4oFx>tRQoveklUQkOXcw{D!9id1Hvrhw)Dd7Lc&Ae&G8u@N0>)43q#*K zZTh;XC+mBC{!n{*@pb{AMd+F49^&XoW^4!m0eb4xjk1mRSJGp*41fUr_R{4*^Y5RT z3sD0g{LUXK5BdjxEzKwTY=D5gpSd~t^4JYO{oLf+5sFl#EMqE8Y-pw<30e9p&8%D&z=i7N)p^#Aa- z7R5KdAX00@AcBSVvs^Pq(A ZpFbVg@@2z$-u(ao002ovPDHLkV1knPW)%Pc literal 0 HcmV?d00001 diff --git a/src/gfx/cards/mysteriousfossil.8x6.png b/src/gfx/cards/mysteriousfossil.8x6.png deleted file mode 100644 index 93752fc3e34d1fb51996418afce63d7e6f727e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmV;;0y6!HP)3j!n!uyPtV#(TNLpK19%h z3RL=|^^gSSOAkTO)g~l_^x&l3gHccAAb$8S$+ameJ^CVoMs`^dVRda0g+ZSW{*QHI zE4CC{v8C9GEu;90BVcz@{H6j8c^sFZgdojn+Z3G2AwiMBT7V*?AwgXN069z73C&W0 zq=*crZDpjZD*1Q|+{>!#{2hqAI86b57H)5qYV$QWo0V}vVBCK2XBKsR zZ2M8olEHyYgTJyUoGK=A*2m=-EnMy|jw z^$fg80N#UWx5mcT0JDQP#Z(g=fInXo1w#qD1x=w=Pq7bVKg5sT5XLD{Gn- zC|s^U%O1%!7CvBBm1RGqNHeIPOobqgw)2I?A<=*k5g9sR`KTuK#t2LCi}JlICSKl*iZTEhuqijyFZzB&QWOAd+hE)| zQOP&jia+=ZkqLg0M+S$quHoQ>7O)Ud3I6pHwFKj;W4jHU00000NkvXXu0mjf5!ga6 diff --git a/src/gfx/cards/mysteriousfossil.pal b/src/gfx/cards/mysteriousfossil.pal deleted file mode 100644 index 0013d026f82ed5b5a0cb057583f53afb15e130fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmazKpQYHtz`_6k3)%t# diff --git a/src/gfx/cards/mysteriousfossil.png b/src/gfx/cards/mysteriousfossil.png new file mode 100644 index 0000000000000000000000000000000000000000..1226faa2720a17ab1c8efbfe510271f68291ac10 GIT binary patch literal 771 zcmV+e1N{7nP)0007(NklEhQ~21Mb7KC+@#0NC0Kz(p9pl>bLMPqZA}i_V)Rf z-L;OBtB>KbB0!ky+f}(vRR>ca3|x*fBFVqB!}_XEc1K4EF`KfQnN@OjWcZZR>pb5pp+;9v6pT3%h{BKiq9=8aojesowsZqP zI%AczjQ~_!oc^JFDT^?+eofmcrqk@|7yghR9^uBLlY4t?&{Rl^O;zHXBdU5j*9JkE zwg-wYcWFp3*^j*%=u_)mzTJ--sBgVf`lbdnEgzh`2v1^x@}bfVQPA5?PH^FL|-;wR9$8FpcP>f-OHE>%|zu1~&0xT4Mc3BvL~;;Aul3n|3do>;;G-Rjj&8q>Xa$hQ^xUfz*!!)!KUZ z_XEDSL#dEYaH9VqlKLcj4B%1OLtZQ9)wC_Fk__e+?t5= z=Y!gS!k|LnY3k?HP^5fdUx$#Wje>ZS?#auQHT&t_T0q4RIh2||nz?^l^DIsRU?uJT z-^G_(*88K09029;A6jKvd9-D&OD9xPsEli~W~h}8?L=~Sy-8GZInFAV|SfrbC`(|DVJ68s-+$S*xG(HScCJX-ab{e1b|il^8D~?JCzDW^8DWh0logegm1%s<4Q#G z{G$t~mzjy`4YM}RBGaztE{U4#-aGah`I40L2_DQjs4kqf>}gVd>&!X4ZBe52)sNg7 zM`d0008347 zK}=h990%}U*R32j*Kiogx+pgfxU?ADT!$;02Dq4bv5kQcPvby|WnszGF0}DtB1B@$ zF6x0qFaTJ%roW22rZOF}O?_glqF-G8+NH4W$&`W6hF9HJGzgx4% zbKVAO(W@_U;y`7i-ZP|qTTVsBA|RFK{^-xG-+b-POwToe5zuSKE?yeUPKAp0q$kM* z$LaWA@$szhx4Vm+(M|?VHBle2SAX1`~3TXSD!ae zWs+flyxU*c)aRXj-aT(QiYaoXuzQUBiWpq*Wx_&IJ55hTC%1zrrM8A9;{G6PQV8o!B%RenRn`2h&IU zlwkX*{f=3a@O0@`aTnJNYpH*~10cC~|K#nL3-Ne98xrqsaij=*{`lvji#51h)O#boArouQ_E9eq<2@p^W0%i7+c! ogsL@9$av0r+fO+I8sP>111e<(3CZ3{Y5)KL07*qoM6N<$f;K{)jQ{`u literal 0 HcmV?d00001 diff --git a/src/gfx/cards/nidoqueen.8x6.png b/src/gfx/cards/nidoqueen.8x6.png deleted file mode 100644 index 5c67daaa585a8d5b4a9bbcb4c03d026497709170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmV{OTTo(E|3ai-tR#v)>3xeajgz9a5s_}&YJa>MqQn4H3W2EN z&YC_f>m$-+x&r~*wvKvh5bcGAc^c8Ew;!}sF@6jBO|v-&zk)w>BpgRc=o)_0<2?uW z=FEJhh(AUy4lQ?X9iG5n&8guL=Ybspgix3hS~fi5MWB{%V~a?y8B3J!RIBGClDJq?Kh2sQ_fYn zam+L;Fo=x!_S@6`o$!WcqD>G1vklw&EB?pjslp!10ws60KV4OxKD&0^IemALA@+^l z@UrFU#Dx{FyV^_(nz1Ar&z9eNeB|40ibz0l`$+cNrJ2^e+sizT2pQ3yC12`)EV%!@ zP9|MMRqRzmyOaH}%XwdBHI9VPjhaSh@N&O%-t~QnD6{FsYVL}ON%o*yAW0M&YOKjk zBV0&KD9qtdVRSO*f41_85@U{9ofs?(bWf%aCHmfCUiotDO4Gfx<+MzJ0BR@(6c$2Q z9nXsRMUUGV|N9K1UI+jRp@xW#O|$#`DJcBXa!FS3YW?XVL>TDMo^3}x@CF7nsUVPa igT4#6ehGlUzkUL2p7H~m9lFQ>0000 zsDJ=qKmY(B(`J3|00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008MNkl1Pn@qgt%QvqeQovPYqJodt2P&*r`voFrkTnrKzLK#E&BMr;Bv=`C#O-9D zbLR&xEbhKBSEJ)ls{1|pku5dJI9T6Zlf&J$ROetq4o^X*S2qTa%#ie>n}WrmkY?Dw z+C>XpoI4^m00mt)9w=Wa-Azt0DLI_iE6<3JGW-uH50fQflHjFvU{g}lm>}EP0I8lQ zFT!TX8(0U_aOL>CcJ@)##uXZmH#cY}^c<0tYz^cVToB5tj(mAXxFD80Nz)fwA_khe z2ch8f_i2yM>C_3HaeiMwR_`6_(F$3OXxXEq0i5UhDoMALwqV_z0VY8jdcUfLqtF%_ zHH@Ny|I91xQ3yZX<5_EL8FgKy-?q{gy}4|d2rC%FWARf*nUg=@M{(Ef)YSJ*wU%j@ z#K$_*^n%;8l^Quy3a7KvD9LXL!c_EyKZv$hON{hC^yMVhv=tmF`)rSlarx zrF>Z=R7kVA#@RtFvir4G?L$@rNoiZFQ(9|Br*=&R5RgVRmATbZvZ@jlvfUiQZRGgW zYPgiL!DLmjWXuKYE5oqE2qpcv2G~rpHQ3f$8GD@Us)gcod>wP`lP6<_HdY3lh|dNJ zjQ)@`1`Y;_3Ol7op?nL{l9VoBl$*`iG*R*l%BbiU9C82v002ovPDHLkV1i~kb*caW literal 0 HcmV?d00001 diff --git a/src/gfx/cards/nidoranf.8x6.png b/src/gfx/cards/nidoranf.8x6.png deleted file mode 100644 index 17de19e8cd60a79f0f75e7b140f100df27f2086e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmV+c1OEJpP)uUQCv zi>(XAZUqNj1U5^n1$njH7H5x;P?u6$Qcy%?7tu`@(g&nLA3`N&=jk%2-}MjpkI;s1 zZ+9){X_Wwg7};HVk##>`QId z3J@_fVE|G)#WC|c*31b@rvNyrw&)y+$e|W7J`o2boFk{LwWD>j=jSX75+S3D4t-x5 zT@8n#LI??A2WY4UHNNHPa#>gssGm4Kn>{<9W4a&p`P+fR*Dpkw?pM!?snmm%4V6sR zZS+#rBYvlWA~676$xh;>=6TXF8nq;3!-);dADbts;Pgd=1(>G?naSr;QEz%_1CYA; zYm~?((kFX00PPIEsG$yOB7M^Dmw*}{d|FNU5|K+_8^OOXx< z$o0nMS)v(!|8pS{Gyro=<;6v!&%E+G{|JCI>sDJmnwnwu4hm@jaow}U`+S?3Iqipp z(yd3|u=k6ZKVAL?31}VfVP^isi{+hu378qPhne}quUl_-#PN5$@~&sg5>Q&H4JBs& z!Q(ll064(fA!cSTlLG*0IQE{F5;J?_IVmNe9aQWNGxJIz2S_O0o2UqHW1e22v{C@H z)`b@%C9i*x(h`7dXr0JBz2fqjdsFLzMmJy{DeOO&cS|1^++3jOLi8rjsB`(I=$)C# zyQ+5#&_%}>e4pArNx^rhcYy;p?83ur=~5Q$X;`O#hD=-LdF8812j9-_gxLqw9_uQU z%dZ=s4K&W7=@d{^I9wbaevN(oUv#F}jeq?C0jws0EI9BX00000NkvXXu0mjfaEeuk diff --git a/src/gfx/cards/nidoranf.pal b/src/gfx/cards/nidoranf.pal deleted file mode 100644 index e2209b77a0dd6bce98344cd9c846a1c429073e77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexg@8jH{$RGd!5d#9h diff --git a/src/gfx/cards/nidoranf.png b/src/gfx/cards/nidoranf.png new file mode 100644 index 0000000000000000000000000000000000000000..f8595967161af6d5f89138fe13013c76d731e903 GIT binary patch literal 819 zcmV-31I+x1P) z(0~A7KmY(Btkd_(00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008UNkl2$~ zUuaWT90&04`Sq7tO8=a*X4ol;doE(ciW9TurrwEyj*J;s5v7AZSrHWmvazLOum_97 z2MfN4`r>LUrXVs|qB&J@pe>CcYR78zL8+$gy-d5Vx#!-q`RL~(EZ#@3!+!MJV%M{7 zTPj&kGlY=U3#q1WNu*&P7&2gO>So0EvS`elZD)o|&dXN!;cf^28zbMF_O8ema2?o^ z_1j4{HjI{h*{zlm5c+{+jJUyY@}@TZr;%UGg3a#BRX5(ATmAdep;K@SD&D2+V147U znsP-)Q4}C5EM_M7VPi|oCdmQ)<~kK11+hxXY?3<^UgS(g|_JvuNl*V&c2LmUf-fR02J z#=1Q>9D0AFVe!MzP;Ty)L@WiBycEJ;zF?&*0Yu*|Fl zd+SS>68@u+O&vWjpB<@}WZ*aKn1$VdzMQ&ziX7&TJ%K6gj|rlIR!VbUdh!jb&v%xmmg{c{)E41+iNe$)2o x@R!FjnR0~*jfK#p(^%6d)_>RgV}r1G-+u`iK%5IhHSz!e002ovPDHLkV1l`yfgAt; literal 0 HcmV?d00001 diff --git a/src/gfx/cards/nidoranm.8x6.png b/src/gfx/cards/nidoranm.8x6.png deleted file mode 100644 index 00718d92488b545880013ec9de5417ad1d442a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmV;*0yX`KP)`6NivLl069J`}0MvZN@j-OjnQAp0Kfxg37q z@0^eG2iRXlD1`qOLJCOepHe^+3xA2i68xVK*q2#u?sqIA)cqRmZ4g36YJZSr6j4bV=0}IH{xq*eCs7;4t`3XOj~YYt@tc=xRQ)$G8%1ae8Edp z1uBU_Mt4&_0bl(7Dj=3y#B@I46NsKRNf4}Q2Qo^7fG><^H|{sHSro8WL4%Zxj-7hP z-bEB`;^AWp4Ne*j&raCN`CIwV7n>gUGw5Fiix5%w8PntVB)My#8JHtUpUCFe-TBKQ zA19n49G=PN9(6o71iKA5fs7SOjguACfmu#SlaqL+pBm>hceI@;*tE&yQ^%BBH?EF( z_y(IcbuB#a&<{2adU%UV4by45<l}60#>BjmrLwrYi1UpRPlp|$PjFA*WClzG(UG*ISranlJ&UQEd}N% w3bbla*&@H-If<~ALJEUfK~1sM?}z>M8*UUUq(0A}CIA2c07*qoM6N<$g2!4$*8l(j diff --git a/src/gfx/cards/nidoranm.pal b/src/gfx/cards/nidoranm.pal deleted file mode 100644 index b8f783ce..00000000 --- a/src/gfx/cards/nidoranm.pal +++ /dev/null @@ -1 +0,0 @@ -_kšU�0 \ No newline at end of file diff --git a/src/gfx/cards/nidoranm.png b/src/gfx/cards/nidoranm.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb304bce82cc3689374be551238a943a1e110a6 GIT binary patch literal 757 zcmV0007rNkl{c(b zt2_i)eQWakMRG5$-YeG(SD73LPpP%y#zw2XXy}XOdxc7WRDmw->Rukc!=Nv zS*!RlSXh`{#5mB)2?e3rgXgxZ4zOA;$RLFAkk)kSGt4uTYcQbOcJi#V-&MnjH7-$B z(sZn9y%SSz8F(v`TNa;w`@jnFjANq`{eoSl)TZH8LV2W`((e;%!JEMFnd}K;0$oxQSmK zz7R1sETYxsiJM4r0Tiazv;$6c-o&pv9hG-tY!;Q~SLwVi`nx`yVS6!*g7N)J!+aL{ zgUua<4ZxNaeX|3S>8o_Gj#`94Mpr;GcS27u(->tMBD}7Fu6vCyLUB%HLpa!Cv)`P! zBAEFC(j3qKi6tCsl(vtA3E6EdVTKCgnV@~=x z*PrAi86^l?VR=sacH_Z>hiix!4#2wmQ*ufBL@-c%N4Ha3osw)7V;;8sELMbJ8|`>6 z0XP=0>>!ZVBe2gYfg+(R@ ntfc6|u)|c`?2Jai{@>#_7rD`V>N8j=00000NkvXXu0mjfdP!X( literal 0 HcmV?d00001 diff --git a/src/gfx/cards/nidorina.8x6.png b/src/gfx/cards/nidorina.8x6.png deleted file mode 100644 index c8796106c9035ef665eb2924548adc0bc8ca8677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmV;^0xbQBP)xG>>qJQxU8rc?NT5j2rWd;?f;hCdS~nx%4ALB$+SO#=QQvir^KkZUZx^nJ z{qCOU_wc|fRKfl~24t20w>b4!!%DGk@V|{D36ztwu&%5uAoY@!_ug`F`al5C9aku9 zKe}M&p8EMS9xqDWJ0{qld^@B7)E3K{GmE{oZ+d1vQV^tGDs|)c#|QH}%C3CK`!4Mo zd7`}^K-cT`NkCs;nr=)3($RZmV_=qHrVjjM6yiJUQND2O2N<~!`G6MHo6CpICM=fU zaL)%ZlhM#ZgK7bawtFd;d3Q4WN$Xc@A1FU%oOE6vo*O5wVwNip9{z&dZ7cunXamIM zOSOuaWxvS*V873!;KesPz9L+*eAl>lc*`NglL`0B=F-J#_D3HGM3zs_$E}&-=RHFp z46OB3QSrfIaq4%Ff_?_P4HWDL&yk{0mgVVD&|KJv8kBr@aB37Bm=}qO)~5664WMRU z+1mQ+YAM>ZA=ymp6IcX?m?DZ7@_9+us%|DH@0j&yu7oGqB002ovPDHLk FV1joiVSNAq diff --git a/src/gfx/cards/nidorina.pal b/src/gfx/cards/nidorina.pal deleted file mode 100644 index cd74af4438b3550f61856d7f57f7b6d2ba9c717b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgAK=`e$RGd!5gP)- diff --git a/src/gfx/cards/nidorina.png b/src/gfx/cards/nidorina.png new file mode 100644 index 0000000000000000000000000000000000000000..939e8876a4e621d5fec4c8b9fdeaa918591bd2cb GIT binary patch literal 767 zcmV0007#NklT&DIA)`T8{2=c+7V^j1YHrq{|SQh!vjNYQ~LAEjL zL5Qt+Zem$I=#X8BOxA3^TrY*tL#6Gi+eAgP>FM10ulzk6_ymrK;Jl8w+-KCBJ4Yq;!s;&(#8|&y^?uqgA7GJw;CUO_*2IX#onl zNo?6$`qVCgy4~`<2Tl+&oOypP?3W<3zOW(#FtE&@A0!$0wy}|fJQ%uqF)UHYP|X4y zieziFIoV^Sz=9Uwl;WVa)a^}c9^|snTZM-EvD8OZ2g9oXv8p;K_Qke&1~e%FkX%PF zVEqhVu0PacIJSex2ETjDLV|SrlNt^Y*%G?Pmom`*yovSLoJDN2xox0?`Vbow6dDnm zo`nMN(-~2`IR#}Kvqo4R%f5E2VplM!7NKV(@B*|^^04-_qi)5^p*M~!({cN+ABOH) z*#jrNZhHeLA`&b8eF<7k;3;#mZC$?l2VaMHu0!CYGCP~$KoXgJY2sc9{9>sy04enL zZ%*7b8DxQDfE`RE7?G=T$7KQ9{2?36l9oF+Vv=x!e!Bf9Z_{RJ)PyjSKJF(?24002ovPDHLkV1g`_UM>It literal 0 HcmV?d00001 diff --git a/src/gfx/cards/nidorino.8x6.png b/src/gfx/cards/nidorino.8x6.png deleted file mode 100644 index 65f851c187a93d301fca71fa0c90331d8d14a9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmV-I1HJr-P)yTU8tf@bCTQq(OQ^&#|49b!7w- zQlyrO%oK3T@rPL?lJs}=k|_PtGDDLC#_l-93gl+GjmA%UjCX~-jdx!9l%kHavaT<(d2z822}iLeX=!EAn|3O1(qtXsxyzz6+rc|Zdvk!sE_Vbm+^6d;@Yu& zKg@@}8~Zx+Wl8mW&yO&c*wZk^&m8u?mK6W|SBu7=e|)X^EpQW5Pk)hVmkx!)qrKC` zy+u&4;^^0_Fun=M{j?hpY&W%e3jigf2}NyhvYdep{VXU$8{ev*dDqI7Ho>6HeY_r zV(@;rq(cwng8KsrDX{fk3W9@t`yw_MdKgahhZ44?hB`RN#lb>*|J6W4N$PULIqjC+ z7l5b?U5{#_6`HkheqyHIgTXnOwte=_BR!v#59qm^?byVUO1@bt&Rz?y9D7tLMc!($ zw0&}WYYI(Pa9xkWp=QS2V1e9y;zCsjpRPZpvxhqX{8^dm$Yyi@0R{$JaNoMTs{jB1 M07*qoM6N<$g3Fbdw*UYD diff --git a/src/gfx/cards/nidorino.pal b/src/gfx/cards/nidorino.pal deleted file mode 100644 index 8310b619..00000000 --- a/src/gfx/cards/nidorino.pal +++ /dev/null @@ -1 +0,0 @@ -_kVA \ No newline at end of file diff --git a/src/gfx/cards/nidorino.png b/src/gfx/cards/nidorino.png new file mode 100644 index 0000000000000000000000000000000000000000..d9bc6ca3a9c691ead9ddacc74c552c8cd451f08a GIT binary patch literal 872 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 Eg1uHN>i_@% diff --git a/src/gfx/cards/ninetails2.pal b/src/gfx/cards/ninetails2.pal deleted file mode 100644 index 8341ea234f5a1508fb8b847f6f137cddbf0a29c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gmS>U@U||3N2T=hU diff --git a/src/gfx/cards/ninetails2.png b/src/gfx/cards/ninetails2.png new file mode 100644 index 0000000000000000000000000000000000000000..43a165d9055153968a451ccc388f94767bf3ab3a GIT binary patch literal 717 zcmV;;0y6!HP)0007DNklvX@Y1bc zpscjL3R`eeS*2xR?O_NW#6v-7DeDpm9+LR_c2%@}uygp$Z{{ukc?|z6_S?OxD2k5% z0UMs@CBShM$9bQSPpMI_zwFfO_4#okWc+d*XRSy}UN9oZ?1(mJ#EtrVw}C^XuzlJr zV*hT_6t`p7{hSz6ens6WS_+us?nYvi3e|k zwsjcmrJ_Z*%AEza53}}M80^{>b&+I9&=v5i4NJ~`}k`yRSjhHzB;$} zG==+=!Z`@q(CRBM{1up{#0Z>pC29mtVa82C-vDuvF*B!W>dBBig7AZHDg)?Tg6w0r z$dv(K+VE0PzK?DbTDDojviAFIJa%Eg%p@82@M+{e#uH(dXsl zi03t@>4>pi8{HELIE(ar2T`b&jp6yF#bDS&oV4WB1qeGdu>ICzH*cJSc$fxuGhWWe zc<~>I6jN}j=dS?vJR^wk8o)DA^1Q8U;IjS#^TN$jaQ83=00000NkvXXu0mjfX&y{u literal 0 HcmV?d00001 diff --git a/src/gfx/cards/oddish.8x6.png b/src/gfx/cards/oddish.8x6.png deleted file mode 100644 index b37f1c015ebb6cd2ef334c2c3439d83ec5100d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmV;#0z3VQP)77U3oo8WyI`T%5u&v!-Tdu#uAK8Eioo;>=ra}N2^QK(>%y{ z{c?p}7s#B*upD4-oxkEd?GOp}i%p$X$~SFP5NXbLdG@$sz2%oVRx@TkCt8*AR$0`W zfB+)i?){=D)>e@tQc>38Qw=Po{OI_evC9g=$ky;Jr7LHlO|*+PS-!j->RK1|=BgQ( zKert^wSs9hM8+EbcIVB&PN;r_Th^MBfrUM~6Y9KxPKMpbbYI|TsPm$j$3ez;jW?Ft z=&2F`!{ATAD}7D(T83lT{=4PaGg>?#a13!er(XGIAQs0b0Y5B*X{u zr2SCX|7{cWk_KdX*b~L~l@cv#L_gsJxUb5HySqQ>C(Q%3C&3+4326*hO4#l4X}SrL z1Rm*bxH5~~K%wqA1pRJTb0J(RVmER5l^j5@9$Nd(%p&~&RNaV!6qn-dJ)#+!_Y$R9 z5Xp|@!=5PO0Du--G@&^eT)4NXBQ}DIG?^y2p~bClQXFm+zo%|71#Q3v7j95!kn<`; zgdss{@WBwR?2A6!wda!{xlF%QBYzxnjL1_6y3G~|3hHBFz@tc97;sgB`G`#fQ~o%J zkOh(NJ|gFZF*;!zD)EhCw9qd{?TG<+onhjW4(Z>yx9ZP6(0h qrD-6eu8*c&(QBv$^!|Vb|LYGdm;X53Eo?ae0000 z&>$c{r~m*UKHg_R00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007nNkl-_Dr0v8QB%y4BKNIpu?lE7w}t3!!w249OL$ zo9Ik4GsM;rAzb;g-S;6nSoW)Q|}S|hDZ(op3I&$O{v~T z0aVdeqW#+}Y93!Y5q8=NLkaEEdUGKtfnzL-F`)a*9H4W5GTZ znUxe5IQ(K;;->05Fkl3rFKE2}2LOD-gNS2L0o)-YR@(bhoSf&0HRycsR~>N-^{q~L z+jubv7l>E&>0JAsC-}gy0BUNEsb}>f?tLSrgu(e{ns{NpoYys(*ftjJM`_Xn^QhwP z4U*j|mDl}guMg&VdCLqE%KcSK; zF-K|dLyXvEdCT6n&P})=b&F(6@|ul)Us5izkHrA zzdt+x{~oWZV~ovArcfvx6pP1DU(y(Fl~l20cvV$BF@9zaOw)Y%htM}uf4OHCF`?_J z;x9d6C6$O%rQ0j8?Vli<1`sJ#y|v4Fx~;59oa6u{qIieJ+F}VX2oA^z$Kz~O1~=)t zo=CE8Ks1rAoG)Ol6p}<1LAXX*+sz~h;84fdWREcn0SF>N) zvvqvE3AF1T&i#buioIfS)9&bR+vN;H1K#eXA#D{MxB2O zK*3p@%2F)vDQn8w!bqKi28`duDeeB@Jz)R>(K#s7@r%ZbtlwYVHE^;@kG8p;l%dP% z>d_M4Kn+vZJJ?%SR|5@k0K|~u?&z5-R~RN_cdSz2LJ`t0 zGd`a^C=jkO7chh(*=#gTABnq?WVgDLf(VMX*EP;+!X6Px@F_BgaP0qJJ0xX9lF+6g zg|N=_6lDlw%_aT!JAMOr Wv=h+|h6{@T00000008kNkl33i zK}Zx)7{@;{=nzzUuxntqf(R;vN;YtoPEnH2VTs&B?MRxLh73`**F}grq%=kds~a{W zE3{ZPLp#ytWm8ANaWI`03R|7Ax5B35?yU2ATV3jZdjCH^{(Rr}fcz&|6gY$s6A1Wx zz5@VN@V(*@YN$A>DoO~#?_hV}0K+in{}5bL@Gp0n68#((gk4;iHdTlpmDf2^uKtZQ zvET&-;j!P$PSUPE6fyvZ%&_%=%}@p5^Oi`e7Hi01D{c_&N21u&T?IO z3=8*Q1))9-VR!;00^)QFmn+Emb4oYxZ3XteiOve=+H@cn^APRmDX zVnaho54GiB@nve=TAdh~SY2HwD-i#J9ml`Iuo9mwN^o0hChrX*`#elQP~ zCo1K#ZQJ`)zoL`~5Jjfbl+UggHoQ_obs-~4L?u<}6XpG`gk2ZrL@e6$4jS<+E`{^( zu~ktNl_rWThFv1T?A`<(lQFex1941C-|vx?I46ms_yQq5uKS_(<)ZIH|ZuW+q z6PpqTVlCJTB6$;`MNo&RLudz!dx)hSH+Q3b$b&3>u%iU0-nNvsZ$1bzof&kUZKd3H zjnzl}KK#$|Qf0QjS9vgZ|3;-$DfQ#1xACBUP@5@ug<8$4jpO9r?A+YmO!@lI_1}Ww zU=YnSv-SFccjta^H}Ld(E>0FkY6lB9{QVcdJ>p$?)kX8hK&|fYqoL>8l6Tj3aiTI* znOh1K-7oX64NRFXp7Femjq+z+xM{I#!nG8dM}Pn0R=FcQd2I3dGo@*T#+j8{-}%L- zrrHzhde}A4FkF25!)Vy$Pb5}Y^RxiD*q^=mOE5{T#BIwixFBb}qa!^%m&|lx#o^g0 zAam6odA4KB6l&gqrNA=pq}zUMZx@!DM=u|T(52G3&5tHUn#Z&p=!Xy=lyX7GC8TNR z=zfQSsV{ov-CA+i*@@4GreA@{TZYTOdeLxn+fQvxjDy;lLiuxS{+U{PxP3&s;12sM z-@WT6M;&^4$8cdfrz5%Ddw%yDR3}?o$I<##OZ?h?@~5YjcIv?u1!{ld|Gc%(@UhZB z(^UmCU06I7NjgLe`ubLQ5Qg-YPsMJB?rEuITUCL}p?qH~7A=|@sRgQF%4~T#eyl0< zg;w)P+X8crzq|U}g8$Ox`UOS_V93XF>P~1Zxcn%>U;u=^{I!YINRW~b1t0)PR8=RE z-A>BZfCT3x^S0008-Nkl347 zZ%7+w90%~9)gV(>D>Um?279r0DxzMujv#d}OxcUPP}<8;#pOkpLKQ~0G5QCF!q~eo z2GfCa47y-ko~PtoyE1y$`DA3y&SZu`t+bSFAQio%_r!*bc^9AW-uLq%Jck~|qr=n` zJu-CkY&0H?FVYje;|Mi`N0NFn9M;2=biZkMXsBrhJmwMtCBNY)-q=FTZp;wow~@-2eNX_$a6Sk)G3UYl*+dHjABX)(GfeHu3eR zm73u_E%wOWQJ2*9#mt%4LgT(&JY`!+gVb&P$;`^iWhYncF}=(fA$!4^`Ez5+arvML zo0H6bmD_q_bJMl?AeOyJa#=intNoL4H|Ld^SXd<2{VbjiZCpmqU!QK=;N-CDdaOB| zXf|6)gZ0s$$nkb&W3TF!TBTLXw@plvZ)KCQkI?>NzUy%7GiH!y$`?|r&01mF^zXI= z207;4YP$KDw)&mV3ftS0wEg~0>3n11#9y456uQXCx2|fhw+$Rz;|$olz{$xa`|ni? zred!DeOqmw0-^WbE1#+#V}gmT2q#a>rIyO&O2T2t5BQuMk%{$|9`DsZWPGq-*(A+J zUv~d7p#5@*Zb)B&0`YH}pR7-XE*+{$1R&-A{GNmEYA7!byMRj&ibq(nuxjQl1_<&z zmHk|-t*WK2{VbGA5MXKd&~1NhnfdT-f)sL{x0r6Hbd^vb0Dc6mJ6)Xt0ACQK_n+I= zv((k;NhKi(K=no`Qt7q;6(ArWNNX{>x7!N>;Q$1n)ORL$>!xKx1OO?h(yec__Vs1y zdP!=wNR0_8Wyw=`y3+=UNP68}8RT&a4Vlv3@3 m;CnJN@ou|<1aL4#c+UTJMeJXJV|N(<0000=JDnUWxm0U2G!&&Dx2cV}d1#waWT2yRaaz1Y4*Q>~m!Z-6KeTWW@q$C?hA z4GDLp9@q+yJJCJgP2$vg^5rc(hLi&lH0=FxMmIjg_Jq8KPz{jCuL+B$+lMt&twArB zqd-*53^_a7M;U(3BQZh@$SLksn#Hj&&GlZ*>Cj*xp6BN>H=*9PHpl)PS`dmZ?)kBi za7tT|3R3Fw!+@M%`?Dvd?BlMOR(?kKMNF2&MqU52eO%_UIRXVTtuI;Y9Ol_>IXVRi z3?NaQf-AYq@k;~2G-56i_PAkfPz>`7|12D?2x7aYW@2oozOQ>Z6>~{7<$@?Z{w`i( z*196DOzMR_!eI0U{f<4fflF+hmkNuCV4*VisEQ_z45IUTp+kme4bcx&WJF<4kmzp* z;rKA3A|UN)yd*ISixINHPfaT0HNxKhb^+!IrLfkxaRx$S0t8#cLIWLc-zSOn5LsyczBiXjy)isCFaAdxXc{}RhH%>8Me9QA+{$|}5Y sT%Ylwm7+O2NOU^aj@UcCdWGxr8)B=7l-tXVg8%>k07*qoM6N<$g4}*yTL1t6 diff --git a/src/gfx/cards/onix.pal b/src/gfx/cards/onix.pal deleted file mode 100644 index b8cc75e75e29dac0f3b5d62b6843e2a1a1245f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexW&lASr$RGd!4jKY2 diff --git a/src/gfx/cards/onix.png b/src/gfx/cards/onix.png new file mode 100644 index 0000000000000000000000000000000000000000..44ef65eaf60197964ebe9429d4ccc1263dd9f13a GIT binary patch literal 803 zcmV+;1Kj+HP)tQH^h00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008ENklgTN(<$hIMfavYnO5k<}s=wk9MS83xubpQu*#lSh&G z5WrfjWe@JlO@1S-bx4TfD^ddv?VRG-;qDeB1YxN}ExH2>Tef|FBRo<8Z&w!~yBK=s z*30zy?w%PWRvYP5`EG}4NjaI~Tu}ihY$Rl9x4*Wh@HNAb;{e~r;Af;^g|@q^x)I27 zz)96%p%bJjEPHmbHx4!dflVD;yqWvWQaK#bR|0w9(NrW3#TLEL8ph7LWH28H=cY3@ z>pTOc)`J&}oKOqA(C~KCJyT3Lk+HNN!fqhUZXFBMoqukj%MC_{g9qM5GEtG88%JUx zGPfRbz(L~&`Zda+2t562M~;O9;}{mw^MjY>f@5S#GZhW*pYeYhs0+~MRe>(V_K&F04H}@YLTdayl334HOuF&MHx{a3vhbH z_~{*Gz(iv_!D0ju%7)Z&AZ@BfS zF~*s+qsXSe!ldTz4T5bb6qf6MhC|3ii_01h%CK4vO2z$mGOAb`L~@^l1djgx^vT8&mlZQ;M?@e3m&bc|hp5=#I8002ovPDHLkV1h)bXaxWO literal 0 HcmV?d00001 diff --git a/src/gfx/cards/paras.8x6.png b/src/gfx/cards/paras.8x6.png deleted file mode 100644 index 6054beb2077d6cd155b5acbd7367ad6a5350e43e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)nu~K~yLebHnma$)Oz35f z?4hjv0S=-UWoWP~&Uz?ZwtF5-=*^X`at02&Liq=Tnt26{u06Emo{mK?LFe&vzWffH zAHaW4$v-!a>mzLUkJ)`~EC;pOS+M<$T+j%!*3`;QZcj=CA@99+aclGK_(#_s05mnW ziR;^}PXDloegMDF&DuMZY_{x3YhonA1MJ?FS{245>`34!l$3PF%)HkFHi6g=_eQ{h zc*nfoU^6n#;FCaV6r^y^REOldUR1A$p8^xVi` zmzUMV7UeT!is4wUz%n^!+_Q`!@Xp+fE`ol(Cg)U!>iM(Y?c(!AC>WWq9=4J|0;eX8 zsnVuFN)?lR3t$9lx9Gw+s{wgPx1I!fabjlOn}KmQ@K`CP$yx|b7>`)m8nlLc6(cDw z6OgB4mfCRoX7FCv_UQd^OO zi-5gHH&86~y{ao}#B>83BOJ=jB`^&REdZB)q?$) z2C?fM2fkpPJ`LRZosYO7|b@2Ogkcmsqo zw`MP&o}E~r$@$KT5HFmO)j4ZMo!dv2(J=~wc)+&v^(UimNDw9dK@xG8-<2))@Kmy; z87nzNgzAkzmOb+lw?Mi?s8s!zZ z$~Nanb*Ti7N6_EKjBLMkp(-7HPzG`m5xeLZrrNcU&%F5e`~qSeH3N`aZ~g!P002ov JPDHLkV1nTfZ|492 diff --git a/src/gfx/cards/paras.pal b/src/gfx/cards/paras.pal deleted file mode 100644 index 2865103c..00000000 --- a/src/gfx/cards/paras.pal +++ /dev/null @@ -1 +0,0 @@ -ÿŸ \ No newline at end of file diff --git a/src/gfx/cards/paras.png b/src/gfx/cards/paras.png new file mode 100644 index 0000000000000000000000000000000000000000..61a5e98a344315aa46f4a354c70aba8f85228e9d GIT binary patch literal 820 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 LNkvXXu0mjf6jV=z literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pidgeot1.8x6.png b/src/gfx/cards/pidgeot1.8x6.png deleted file mode 100644 index 4f3422a6950eaf8fc660a05a1c60e79a4cc36670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 782 zcmV+p1M&QcP)?>2K~yLeUBOFiOi>&M;NLm-Z`!H3dTukLMT3^0g0`liQO(?u35iF%+DL4O zrANYs5E2VEl6q{!BdkhTcrJvPn%kG69aJQ!Nj)Q}R_~eKVKmOnVeR|yKQ?)p&#kZ@ zKRanH2o+UUrij-}f#b<7H@fuLiTkxFHW?dec>dAZ>)(4Nk5(iM?jEX>GD;J6t`v7A z&n)27;RL4cyz+TF$P&3?P(U}(o3}={bLQQuc3oRcDuL#$_1lKj^;beMQ*i?s@9K`T z-ES$g*PsHBV$5{ECD%<4vKliqA_y8TX5h)aR%TQ6$Sfj-J}dfVCRctmiKkz% zYxz|M2FO)41em!$-B%lje7V-=j@`!z2`_SuTRyBU>71owMiF1}G&^wETJzF-Kkxit z#_;6_BdP4c-trgK9odR(6Om$iV*VjJr@#KHz^F2c@(31;WfQB}h40I%dgrj9A{DJU zb*E``(?%y=tqHK>=qlKJ+h1>__dg&;LZOzPo9Qu2qC6euLc!J`+2=?=LJ%kiC`BU# zk+zxQN@@W9#;P_4+DQQsB2n{8%)Yq=3=8J}$?`-=s6h8yz@zy7Iiy%-3ijpKiR0cPkc-}G;qIsgCw M07*qoM6N<$f@FDL5C8xG diff --git a/src/gfx/cards/pidgeot1.pal b/src/gfx/cards/pidgeot1.pal deleted file mode 100644 index 0cb353236eb58359c25cf8a3d9c63995e1a7649d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gmKU1Ez`_6k32_0M diff --git a/src/gfx/cards/pidgeot1.png b/src/gfx/cards/pidgeot1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6498b4f748665333c67bec08412b0a2760d9d6e GIT binary patch literal 815 zcmV+~1JL}5P)0008QNkl)LE1u#HsN#RvDE3zbKdLv{0|>y@hAHJU%`E^RxUm4zs&#Y z@2{k==NqIWu5C@QsYljzSF%CeGUcz2zq?)K46SKP7P)(>ONfm5ec^%LAj0TNZdS{Y zuNQXCyaeOx$S`PxJu>rZiuLlq-1`lzdzdJRmaCnYD`;D-CL0hhBI@k8xWB%}M4O9d z97NUz?zH%wPd{u=kT25&1{WW(e0|C)^Q^3o457}?%=i$}C|dQh8JxhQErq7Z1F(R& z-$OtUnNYu@y`m6FEtaZ|8zi0V_Rufj?$D|}mW~_=+m=tNKB@05bgJL%{m0=%UPq$p zXc*%0TJI?o8M5prUu*ZV>6721lsLemR#eG{eW}~IHXdbpGL-2#w6V4H#!cxxV+1G< ziSg^3MmvkK)BhUwTNAp?;vhEF7x)~@aZOMRM$}0G2xx+d07RzDK*y9NPJ#g#ZSQTA zU@~bqv=z{K9=te1J|H**1F%b=ebBgo<_6XxY(9wi3Q`J0@E^rcq6oPUv*ZX2w>pD< zEygGg@&Rx*l!c$KOgcFM7XT5ge2OJwy%2zs9sx<3aAb~W8YmEz*i7!=vh2#Ju zoX3=0R|$}X;<%ZSwP;>>CjkY|NN!~ERy(eAyEW4RMc@Rxd83>dIhV51HUMPYRcQdU z=HQQGm;gg%q8xa!yW(qfzylmj-;M*ab;U>T#83-!En}}b0J~*U8nc6ew7X8T?+RkD z^ZA=EExonyQOXJ4$l#o_tx~Re9L1VBW^|_dBDtQ;g t7Yu81if+14K7R^rUR0e!W61vQ@jw11HU4)WNLl~@002ovPDHLkV1lXQd7}UT literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pidgeot2.8x6.png b/src/gfx/cards/pidgeot2.8x6.png deleted file mode 100644 index ede4ad51fe9a08e9f970d694c186eda2fa441c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 749 zcmV-54t-B#xTlObuNEdU0PQ69kp0 z9wq@}5=;gU#Q~R0#fmZIFe;S>L%YQ$1?Mn?Y#lOOgS@zgVyHS5YVsEdCv80lDMQGT zZ~l!Ryx-XPw}0KcC4rgG0l2id@UN+Bz=&g1qia3qu6t}&)wPFJnCg$-Y<>E#>kpnV$0S%t3&%%U;I=t^|Vw5-bm3P1f)YTZ7ZPawVY&w%P~v<;sX<`eLWXQb!0nl0FWGM#`}C0)-Ku6{{s zBGWlj!nk9H`9S-8y)F-u;+McViLQ3&%O= zRI*o}Z%s`-dXa0UI~uzl;PVeDp*E)Dn#@Z(nf@Xpqi_xL@)!m9sY3YY}ZH- z0KVnV&dlv@UbiizCqaefq?66$l#S*C4Wf^Dk>9CF#|8@=LSbiqOl#@5Nks^X(z5(( zVMnUa_KLp5L50py5?U&8aNG`P(RYr1b5A%ZN@W8ip>0FaRuw=X?H;z2p6mlifJC4G ft_z{G;{DzLJd4yAl|q3Y00000NkvXXu0mjfcF1Ss diff --git a/src/gfx/cards/pidgeot2.pal b/src/gfx/cards/pidgeot2.pal deleted file mode 100644 index b5f5ea0b4cb386cdcfa3a626c4af9e90b8b10ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgA1^E_$iM&q4w(WM diff --git a/src/gfx/cards/pidgeot2.png b/src/gfx/cards/pidgeot2.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5f742b83e75ca3aa5dd9751e5799d809990a3e GIT binary patch literal 794 zcmV+#1LgdQP)*NlAOHXWuJf00085NklOXY6JC?$Lo%T!6^nw8!F%vB}pI)0BY?`uO;CsZ@IQ1%5OH0!jPvIAbhZ zZ018V1r2&T#phO&PO`%^>jEw(hb=P37%!9~sX4eHH8(k1ES2WnD{Yk|Udexh@mMP} zvl@WB1IP1@j*h8m4)$l#HXX1yTV(7MUfgQ5tnMfsKR(MROA9}G%~;=PBfUuui?c-* z)6-w;*DWh8$@6l_k$vc%%uL5n(&pqa#+G8g$3Nt5EuR~k1|1i9F@nmyJEhc%o)rVs zTsR*=e$W~L-d9!(kXLR)b8R%80{U+67$7x`X0}?{euLKdz+3|4E`)5&>hF`lZfdAY zlHc2g#!l+yVWu|PNF}Do^*U!J#!qf8i>zf?T~SiS-~E-H!KWv;vzV~rQzXBjb)!|^ z7&lqtp?!&yDpJq6PU~Zb>4?UKc$VO~RsTCaJvWu3m%3_%M4`TYeROws_-ZZPOmK2z z`;k_A=tBNfqw5M^IOv`QfHepa4*h408xS^Hl=?m8Ivo zhXa@o^S+ceC;(7E$haqLsHh;Rq3np0ujPcHumysjz~vx|ksJ&tfZ&Gi=GNNa*t!lO zJxLID(MZ%AHKD=rixX57>S}c;Cj$+Hpa8bgjr&b51K%hpMP(U=?uMO^!q#5dl@vhO zLAPOt!Uz!f2?AHqp!=HNiQcjl8Uz@&)<9W{0suu)$DpP3WE21-2rv``0IVw|xFG!J Y4@p8P2p^^^WB>pF07*qoM6N<$g2Odw=l}o! literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pidgeotto.8x6.png b/src/gfx/cards/pidgeotto.8x6.png deleted file mode 100644 index ec7e03d2cc66b359763fba66f7448f42692cba49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmV;U0$lxxP)mjvjfa^Mu@EykFiay~GvwRRr1(PC0y5WQ6iMD~TU9HL% zP)FN9U8L;89&uU{Ql!>|)SJMjrEw;m^N!7$pw5DKZ3PUYRkE6i-hjOeT$2i3}I) z=d2p8ro43Lstst3_jj3Uu^l>a)F5JF%XM77{}z9akq~6dTA?@vC$cz#FPI!BX>8$$ z3DI1(G(Bijhfda)z|cKN6frY$+tAjNBr;Gi;WX!S?PyoymM##2CY%`_;x*cvjFWY= z-&F53R+@gkV1>#FjegG-&~*%tKI?rF;N^=r%2kic`?-+iybMROm4C&G$9hql`@(Gb$~W3q50q6@dwy(#9F?qW)A=W002ov JPDHLkV1l;rGR*)0 diff --git a/src/gfx/cards/pidgeotto.pal b/src/gfx/cards/pidgeotto.pal deleted file mode 100644 index 14413aa776059bb9b087e06ef231f138c1d81818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#E+sHkk%0jK4g>-> diff --git a/src/gfx/cards/pidgeotto.png b/src/gfx/cards/pidgeotto.png new file mode 100644 index 0000000000000000000000000000000000000000..f52c342feb40bf94677cbf3cb9c7f4852d87bce4 GIT binary patch literal 712 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 diff --git a/src/gfx/cards/pikachu2.pal b/src/gfx/cards/pikachu2.pal deleted file mode 100644 index 0a5206f5716177d769e707ff4bb3f2cbb6ccee7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmdnbG?kHsi9rAW3AX`m diff --git a/src/gfx/cards/pikachu2.png b/src/gfx/cards/pikachu2.png new file mode 100644 index 0000000000000000000000000000000000000000..f85b40aceaf71934302c1872f5d2ca8ca3a0c846 GIT binary patch literal 794 zcmV+#1LgdQP)00085Nklz=|%7Qy!^iUg8zYx97>AeW!Ud>9#_XL z$ZRaF#}Hae2BDX`h&Lj)C1tcA;*%f$Tp}hmkBTn64{I&@R$vj*3{276hc#t>&s#wr zUpwOB^0;P@yuC(&ccfG(_y?3tT>zIp&Zes zvE;e}IU%3DvVlaCHrrIWwhHc)d|_+!rcblr?U0|~_KpYfdZ;*EOQ4x1O0!mZCxB3Q z#YQs;*IFJV0ED{V0uBkEb3q(Hy%YZzSeRS10o1>>p=mzhZsX!Rggi7uv0V}+s+Ddi z2{a?I&mtj3siHxtA!@&V5^-F}p>$>)Lcb7=?@*p<#7rcTu@eZlDAA}nLP83$-Ud`# zQIzc@A$74{Nz{c~lmZ-W%z}&=#;Z>rpuAId7f4JDE){VAP!|rTYaStubZQ*{H0-@% z`6^Ky5+dGy96;quEFa_{MM}h1AFYeR z$kwzl?7G9i#pNXLVe;;UF~bWr0#hPz%MbAF>^YG^-4TSGQHz0z+1^2MYc+}Rp82HS zTS8Uu5x38@G$K(I$I>TExMCpH=W(v*by;*A%sv1`XY!HCIclR151bN@;TP}grTmxy zAx@^6sxGRdtzEI4Ii3>wjkdf=_=|(Ok@Iuen;-8CSU&MPE&AJ%F;lenw|6A(n&5x_ Y0$m8Jc+dNRAOHXW07*qoM6N<$f-QDnivR!s literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pikachu3.8x6.png b/src/gfx/cards/pikachu3.8x6.png deleted file mode 100644 index 4dec614698c4cae4b4c9e9847d2fe45fae55c486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmV;U0$lxxP)WH3m0b&J3VM+s=w;j9_@AxEuXY9 z)qiyH)c2Yktmjpxs`|AG>Uj>%#cyw`e$#6=1-QAJHU5Tb-BCoCYwv{ zFrG+No5@D65y?YZr*uwKmy*|WnXEhP7Y^I{p^?X#jDl539Gk;Ox>(A%9<^7d1o%Vs zLnGt<`NB|Q;FGE@WgJ~ptv!eJ)J>+JWpeUk&sJb;TK}gylF`}4)t&?F>~OK&h&;F+ z`zs<0_CWQyh^!4`Z#%4$L^nikimZ)iMHwZwHKGXT==Dn2E6Q|v})^ink_{DG^nDMFB-y4zbV>)R8mg`LGrO41R zNF6|w>EnsW5T<~0yvUlrewxdW#8?QA2)4dGyCafQVm0x$iEP)0007GNkl347 zF-sd^90%ZEFN;JWlXSG$Es^#>1PAL;sJKWSG~6Wj6$-Xwsl1L-3;hbEQ~4(}hFheS z_B1V#5=lciZaUt6gv86s6}i`6+tud*??9~mcrUKogAJW(vWMY;GAanvg3nwT28eV1 zda_N%imBElVydj`E0XY3!VxStvx5Ib^vECqt)F#Q6vrMt+WR?ZgZ;yvV&$S>&XR^z z{{Ep0{3&Iej58l*Zzn^Aj7pi#E6WP@N zS+8)bA)$4;`x}_S9J`T(1j*e9aImb_$`WdjY6PHsc=aNxN~mEKGXPHWYT$^3Ii@Qd ztpQ~T-KsPv8fKnbW2`%J5=px#`AAc{b&5(^T5fw>vOY*Y2i6^F^_MD^J}kKkpe(Jd z=1mVYjH2sAcr4Aep9A9&*2L~Tpe^m?+QNY*XzE*)Ge_jxTuUu5gQeL4-iXL`Csk&I z36tzr%KNCwdyzqlszH!RAI`(WYV)>}+LV~6o(mkK z+P?W7Gge6Bq3dD^B46e$&k5GK>f)^P|MTJp zkwIekgJ3?Q`$>+Z>Cvc!AfFXcjn~rRwtYo{tQY+=oJvTaLlV4F$~!OI@_>QeYXsm^ zGV+S3=J7ut+_ai3E|!=uAT>zlB)yCcyAUt{@AwN>C-ItuI*SPa0000R^lEikAAPp`;H_^7X7ij|0q0#2&ySV91ci;Q`9>4eQ zcL4uhLuO0NcXHU7;{lNT0AsokqB~o>w5rlmC;;9)3eLlAhaRN&mjj?=9#9ei&t5zP zFz5%xEVfS0x02pNE-|~PPwxt0?PObfiIBe+V7Y8neW{n3D08V4c)P`JvDSG#d(5@C zEv^rAthQnquTI0k5bFaN1!vJI&?64wD!)K`@oXpCqMNnS=|qsR;2ii$=%m1xxHl8x z8jr(`yrpyzjfYE*(h|EJ0;M@3+K8#d{MlVi<00^Feh?oYTiNfkr;-$u0x%{@qPEmQ z&u1Q=>WPz*NbeWWVMY#^i>n}u^=|G<1qaewZdD~QRxbIl)5(q;zBhtQa@k@+7R_w7 z*?%Xlsw#{Y-hCVCZ+*>9P8xHJCL$N}M+*vWCU5>QOj`{9$}iz9tZYABGon-iSLaJ42Z zRM1n}q@GDE=v4)?KJ=_Zzrp<=nI<+6my^duQFl`>L%Ob)EKE5w3pv@%Tp&%GW?sf8 zU6V&f_GzaQiNzXR+0=O~^_+UK#cI`)GEKf=*hfSP6T#YeCK|3grl=Q*o6|&gOmn8b z{D#C}xJN1(eNj%H^#tcs=B;VQ5FOMlqctydJ<9cnTrPd0CEO;7Y0ks-lOwkum`1lG zR4#3ltBsYvf)h}+*okQG17p2}ai&JRLQKG*)(g0%!o?l&n}kcXzo5pLt8YvBxkAUT jM^yVnE;e@6|Nf3YTqIZgQ8i!B00000NkvXXu0mjfe_>nf diff --git a/src/gfx/cards/pikachu4.pal b/src/gfx/cards/pikachu4.pal deleted file mode 100644 index 4cdf54bfda5a4f654971356802a76b73de692d99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexgzn_VLiGcwC5CZ~2 diff --git a/src/gfx/cards/pikachu4.png b/src/gfx/cards/pikachu4.png new file mode 100644 index 0000000000000000000000000000000000000000..c918c94522419e73619930b22fc3b73e440b451c GIT binary patch literal 789 zcmV+w1M2*VP)00080Nkl7cD7zW^PtJ_0k0z|g8t;SmuFNVetFH|6f8?_MlBp?QprW=LCc0HTu!Ftxvnl8Qc zKx-HhNW8fd%aQ_@Hqpi+G4a|S)?@&0+MjX2TlX}1_nFDOJF~zqJaDYqVO@@)yg@45 zs&Y8c0YKUe|6Zh3&Px@jPl;ftXzS@^@%~o@%*0!f6nJAQTjKnr3Z@#iJBDV{^>Jdc z{-QNq0#H10`&6b>9RwH%D85?iNg~fWR0MS?EQP)Dqs>ubWc%XVsjS#cMSDC_ESK0h zheO^CcL5tPk)`A>twLiaZ38K;B$JskW91E~g|I7vTIT&$i5MgcU!#gCA!=_{UMDT~ zsRX984K~D7W_|dBVUQBkgLmQ1DSgXl8U~Q{vw1qDvl@!{OVyBi6t6u&ysFPgk znds6Ni@rumRmq$tt_WB~LD0LO$QRwc9nr-i>b4*rRo!wgKNRAmI3WInzS>F;4+J4% znFp$xL+pvROw4(z>v^IVT7l4QF@^L=W}A?r+cDOx0yD%=2uiHEfX}t`Ul0MPk#m4; z5*QmKj4)cL1MIH~9900o;oqBiCPVY;zUgM`rklgiq$L#GyqY3CEbc^J*w$>> zq_lzRNr_NMtu1;`@GxQ9Kp~I?LF;W5y=b73UUFFUC21vxKoa^F)YSXLEwadHy$bz4 zc!>_f8T8aYe_1;_7=e;9juBz^sLqcojX=_>G%C*)I)4!javVh=lG5#u^H!l)13sETi z&F#WiKHvJg>Sh46pTGRWS1vU9T0B$Eh|$K~FyiBaE{&pQJm!u`}) zue#-*&v!OL4Z=TC79$R|7CkUPK<+J2$l6G*Y$OoX6LCLfk)7_CLldDYQ}dgV7gi=l zqyW6!pW&B;V0?uEp@(mw0tqzII5Qw`FY}CkyR9E(900000NkvXXu0mjfw3T9? diff --git a/src/gfx/cards/pinsir.pal b/src/gfx/cards/pinsir.pal deleted file mode 100644 index 13418dafc3ed5827ca799dbb9af0eee89f0857f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezGJXNuSfq?-45Euf1 diff --git a/src/gfx/cards/pinsir.png b/src/gfx/cards/pinsir.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7a675f1e0f31550bbcb977beec852c220c23d GIT binary patch literal 800 zcmV+*1K<3KP)0008BNkl_ofvJ8wd!|C37g~LGfomFz88z zC`}eO)g>>@Oxc4JQ{QYsf+jMDtl7F*=Usgwlk}Z=zh1@9hwu%8j-pxU`R{*_a%Lk0 zu`#|68)ZLPjTRII+UjI$=WpEONLdmNvGM(&_fvn?ORP;|MTll07CRTwO2V&28SYoLtUe6@93va;$4{K*G zZPz;;01#CIWaZ5YM)L=yl!?m}!?xC=&7O0rTWcYFf?X+3|AEm9`*vP#DQE(k{BUGw zsVKS}Vgri3#?{xk-PiL~d4)>@Af%7>KOLEw?CkGqDNh(mQF-5e&ptSnQ|Rj()CBuW zy}Z49`uwq8cd#EIKEL%Z>X}FBWVZcZSx5@(thhM-Bg#J=QTG*t*c7f7o}OMGdpELj zLj@qfa{K+%^xUgkABGfbN{y^I&BqT5>zLc~VqOwp(J|ql^`{hhY6cWWHW}z^F1K2R z9f6ny0Xk{@eq!No!}&1{P#hy^oJ@<)?p|Y-2?!8;#|#^9;z+gwZ9yt=%a79oPvWkA zyCy4!s-f7jbL0M#?F%B%TGI=}$;KuM-OWZ1Zx~5{&kMCTjnDF?5|P$~XDPp{o_oDv zhd(MKL4Z-W8+jxhbE9KWpm+iue-3PZSM7aUD#9^j;T@=D4ta`yu00nDWJ8GKxuHOe z9eth~j5NU}pKEqifQQ3l3ZNM6zW|1*thQ^)fDo2Fd&b2Cdb7&{nnG}Oerh00qw3XP)Uc;Lu?upWuexPigI;J^ih0P_LnQ~sLv|3TmYNPxY8N6I0~0W4_)BKR4M zRy(eCbpZiqkP%kk3kEI{T*x}X04PwythLf{Wnk;?mA~G7@c{~KVb)qLv|MoF z?S0qxKV=5m`hjN^P=#v?*bs*UKwEiMtqNKyI8jhgG*nRF0MJ$=kP5ff(9p=KE-nTj zTUYH8ddf7z#UpFkR0#tHIR>NkJDpy-O$`mrS~b4F&6=8Gz+eK@0y1M-ePuKw;Qfn6}XfU zXlQDflOsp~=u(H3ZmU3GCCe4Cz$(F|j1vV#14RYE0zlt7taO2RMVJLF08$|c0s=nZ zfIGF)A=3pCzy@H_XsO^-78ZCA0!@{4NI?o@pdlyuMUkQbq|@L4j0pk!2kaTB2>^jp VncZP9uulL0002ovPDHLkV1hqI%ew#o diff --git a/src/gfx/cards/pluspower.pal b/src/gfx/cards/pluspower.pal deleted file mode 100644 index 6ab86312e4e1d26f9671f17b4ebb0b2341e51766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#gmKP9UU||3N2R{K0 diff --git a/src/gfx/cards/pluspower.png b/src/gfx/cards/pluspower.png new file mode 100644 index 0000000000000000000000000000000000000000..5882fcc9afdb9361734b0452f7937e1fc74a71fa GIT binary patch literal 579 zcmV-J0=)f+P)03ZMW<4D4&00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0005jNklA*x0CnZHf zRppx61tb_Mb7F8aFfk+*F1-Xrhz9?7+_@6mvGK-_-+k@(&ItY~1aJsT2K+q8W_8%x z@25>2-fZ^2V;!co>JKxtU5O0%e7M<9bckrOx~juhnmue78PmJh&CnK$jE?E8sY`Xp zf^qJI9$h51qnC_g(P zvSa%}5fWgO;t3<hxV!nHXVo+zeHRyTaJI<9Qs(w~~dUQg+ANYTa}WIQjzNwZ)wo z*I}$hoGp&tLO8$BEoC-i?Mml4M;|1pjw)l%D$W{5d-90NsI6C@RN7BD8p+T_f5yF6 z>rlt3bGe|8g!JrOhIU@;_zL8g2Gk|0XmYUtBJ8{_;$A!|Ku#M_?_`v3Ndc-us2Zv9 z0m?LJdnYUA1%$S6lH|_{W$G|k)0QklE{|jF8q`USv38XJW4sFnn19fJ!*2w7V?%yq R614yT002ovPDHLkV1jEy{|*2E literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pokeball.8x6.png b/src/gfx/cards/pokeball.8x6.png deleted file mode 100644 index bd99dfd169f1140368bb2e49566a4b6b9544172c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmV+=0^0qFP)$^g^SBj6v`L?DX0~b+AG^!GH^2AanYVv{$C0n_ zDt{1A6a!HMHW-DcM4k`EJyCm3W16a*8Y8GUVw5umIdcV>#--a}6Mr~jenmh8Y_biZ z(+HC;ha6AKYU|VzgX^4&|Tm z+7Lt7Z`OIo5-*I#tH0RCk48crd@#h=?-F89?bBxtJUfp>d_pX5r%LTD*m>-5UdN*l z%SyoaY#v|ZUK(~<0uncm5`KBz_AXih=%khr;ICe^I9$nfGt-KU+rfEnKe8=`(0@|a z#G5V9x=R{4DdRP^@vjxR7VwEU4$g5HECB^U#JazVDOkcM3EicIQ3TIw2rcEN1TPJH zo+QHlxuuuK6a6-RGiUKhLN*KZsC&O0p|w8KAVf6LaQmP|c_IO3%uA*r>e_|T;HI$r z-w^gJ%hYO?f70#zF(qRo5Kp~fRVZ3pRB6KkfLBPv+9IM>@&GGx2%NQ|%*6K|qm(Z` n^eH9QRCk0)s2DtT^5eJ#Sc40KhO*Re00000NkvXXu0mjfx@_%d diff --git a/src/gfx/cards/pokeball.pal b/src/gfx/cards/pokeball.pal deleted file mode 100644 index c6230deaa24dfc262ea2688620e380aee749dbaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLEycj$z#sqs40!?F diff --git a/src/gfx/cards/pokeball.png b/src/gfx/cards/pokeball.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2750dc57a96786d2b5c2a07f08dd46aeb19adb GIT binary patch literal 594 zcmV-Y0))9NU00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0005yNkln+@AFPC2{Ah{u2WJ39xx}AY%w0c1{T`t6CXn*=XV;Gv#0ET1pd&Rs9roizR1A`G zRa5BuaRx8HSMsT9N+N6y3CcF6sz{S+-S)JtqDnebT#DTkONi;f)ZpGK2~lE=fl|>s z^LDHn`ze$$F_+H3Z*m0nG!yID1_b1Yj3q>=M05d^I}I(AT2qt=52{Cs=)k@VHFQJxuo`F!TYnAV_OiuO?eJs1 zy+4jrWCfz5Z>9xZXNwjuSQBBJHJmMC>T33Y=^~`wTCw#AoA}yeoZ`++pK{_%^^dR# g7t^~=zWsY#0WC`Lo?@kYL{Z61}FhB#3ReMwD7i`MIa$~ z;*?Rnqt+cE;k`YA(wZ%ne3-182Ev>`Oi;H)9azWvrwOS4M3FJ045hZ0 zE3CqBY97P=-D?ey@W^2>JT;Go7v1bpLyXQAY#5%L7ejb*mhq)ooMk=?)f*5=_sfh2 zE#Gb0VB|A|m`m@M!rZF4)MStiL4>u&+}@D`t>v5zSwUdB_w~W20m!X-TFrtORQ}pQ zlo@phIkI7dBvg~;cCWXKhRB>UNQ->WV(I8+)0f_kTZfTEKSAl}!?TPR;*Q&d3Ad|5 zUDQSpQD6=R-E~Uogf@bPPVEpT$bu#c+DN#dlRN~gF{KGx8%d^hk|RJH#};G$uY+h1 za7zfV&W{V!p6=;HJR)Nv`|*Mes$L}bg|Q`iV6C0D5~^>Ue4YX6CQCpcpLA==NBQmv zF}8a?SSwPgriXHD<-2^&8PK$>^$2d^qr)+?O)YR%ynJlYbIop_$HauE4~>?$^&`2? zi#9lm9wI@&eP3O2eV5cE!J$b1Q%v6mJc#?zkP#t>o2uX84nV5dFi7|k<+Qrm2nun> z&c_8EM^mYOo0l{}*9?oj5P5Z5-3V;Gl&>MR-K0|OHZL-Of#3t`BJ`@A>MI`Tjye2| z&Lv-IUsc*%A7AfCqfEAFwR}kfs*O3tH=g;sT&{FF8=S?@(lYb|zEQ1Kc@WoGH(8~4 gidQ;3_WA$(0quMVbhV?X*8l(j07*qoM6N<$f^X$or~m)} diff --git a/src/gfx/cards/pokedex.pal b/src/gfx/cards/pokedex.pal deleted file mode 100644 index ab3a81929b65f2bf6e31b2d09cd0f282b865c91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexWFVE27$RGd!4*mji diff --git a/src/gfx/cards/pokedex.png b/src/gfx/cards/pokedex.png new file mode 100644 index 0000000000000000000000000000000000000000..cb94fedf66f4766aa5508839501853ffa040b03b GIT binary patch literal 791 zcmV+y1L*vTP)fB*m>G`+%Z00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00082NklgE^}Dg6st^b#hpmWpUI zG#e`R&@>dG%U-k*Q>bKhHvSm2?rx^DJ@&y|9v|L(=li|`>c0ZPb-gc)alQwIy5&Qc zF;+>*F8~ATY1Ov>H3lM_j`6R;uf~m%LZT2&ECzO<8}AA&RMJ!qo#aB#D5b8Y`Db1t z365%28_o)0gzAtY_Jx}j9_%+LlH1>rV{*RJ)PyQLLfQ_Ewh+G4tZ%_h_W;egg<%ay zv*>ZSIX%G0F^1+vM6ZtOKHQug&|93EXxk*L9dR3O3wdP__xZ7-vbLM^A!@Xx40qq` zn$4|nH^-r6Dr%PUhx0{GWp|oBw5U`k$!EV_-mB)8Q}m#v=pESWvqt;Mld|Z;wd_Mq zG#7@KY7uQua_G=TGTRO1oubrHMAb+X}UkmAVw3F8$^3wt5_QP4@PT?}85R6aPg@2ON zjyRIUMC;WUzk{Sf=4iA`lMt*=X8Vwcrd}K?;`XW_zE7n}U?X|^O-4&e8-i^DkaLh+ zZa*QP83)lJrKH4V{4sMGW<&tqw$q3uI&PRsu$VY^^rA6vmLK=lSj`7-&q0)^aL$HN zruWi4lXz?BchZwVi&=3#^2Cr5aRm}-<|*jb@{u$@A~}JPRjVFnZ2W?X3k(4g8CKPV zSdRk!i8f%cylVM+C|gJ2yFGwRhSj)&d+RmoASBD_@&{(=jCpKR`_kCRjBI2Wx8oTd zB)zOCS4M>;v@ox>>4Xm|m5p?ImGSsmQBettt(MDWX2s#xN!F*!HquP%)Q$hY$6uI2 V^Q<;;^M?Qc002ovPDHLkV1l%zbfy3R literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pokemonbreeder.8x6.png b/src/gfx/cards/pokemonbreeder.8x6.png deleted file mode 100644 index 0661bdee2e9226eb5b3f5a8cab620b37911aa20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)1;tvOoKaH76Kxg zfySE^1TRv0HT06TS?R?ZO0$vVP>^DTR1k?s;wcBuB7`*zMGry@yUt8@vqitdyvMh{ z`QF=w1>j#T+Dw+gRWV;XhHX}?ifPo018}X*RqgqEF=Cos5FuRVVd>`z#R%!SQ%=xxK#1Xu?OifbjC|)BcFVfOq6Th8{qqyv z9gT=zU7J{zJ#ZHzgDHCasP;gNJto8+lsM>R9O_O+*rab@l4|quw#73-I#*-z_m}!x zWA6Zjho9znyWf7Hshb55Qgb+mA6#GTw=u?>G7x1+R?*h{Q>#@jYjGJ|d?^Sk%JO8R z-$EEKK_C_o($vI?O$~(N5QMV(80Tis&FpidNXHh|%cyyxDa=4cFq2)K4*I9=gz+mn z1>XmOiFjZvlh2qt-xwhS-;${7yH|GK;Cnh!Rk{cB*E*T+JNY3ooux%V8+(c$AxUxw zgdTPai4G^kbeekNTq&Je5Ru>!#T$1QI57qxlw@h6bklf7JLnRbuMsWJ31O()VkDas z1aZP8&~XSQIT3_1y9(c*RT2_JqYU(6TuPqK5I&99XhwRJv3A+FJ|slQm3VXp%(G^+ zhyP=$b2{U~AUeycx5w&v22dgZ9Ra7fgd_RCzvC}3t7hxZ4h*>f00000006ZNkl+D97(}oEBSq*T!E8#2^-@gg=2GId6fc5cy_v#95h1WN zvy#R{gzl84!9Rz#G(^aurSxXNjcmQBvfCfTI)JIs50`!~4G_Cf;*$&-nT3+xgnB8Ve?wcb7#4o@%wfFnV>Zhuuq z8KE9o->D(wai)xs$2LOBXsqXlQsU$t$AEzJfk(NVjPUhmqMH~J7rcNZ30%%%$aTPu zOHmKh_+x~?l@Q=4V=_6&Xv*vjWE2fPpO-{ND=8E@Jbx{GSDBfDX8+TS&%6DPRBbU0 zEiH?)_|@l4w;yA?sDr5+x<(eZpGtvvT&?Qx^Py#}71j?!?f}7fgMyhRMAa&5zzjmF z6k54yjI+Cc_NIlAVq??GaS|L;3)~AJ=@S7yjG`0u#SA6-)bD2J|pJSy!mSzfFLJVU-5c1NSuJ{CD7K_X?cM`?Y zmPxD;k^1y@OAsfNQbRYE5+9W(tfLN*zuHhUg0T8}Z#Hse%QBA~f{eFFSrBci^Q-js z-$KQpWSBv29UJA-8P<*C2+JrAGgiL$mivTBg(@%p+1tDs?$Nzj@}183<*M)UI@)9P oHwPHep#$0dG9(7l;q346A5|ijHPN0zp8x;=07*qoM6N<$f?=583{f;>V9dD>Ow0xM z2A>9@D3WApE_;wUFRH^;oh0+rRI`pdQ~NDc@G`xwZq^MjgC6M9>#d#9N&>h#@3tZE diff --git a/src/gfx/cards/pokemoncenter.pal b/src/gfx/cards/pokemoncenter.pal deleted file mode 100644 index 318425d710b322f995c62d89f1b802ac44390174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmewwF3+$;seu6i4#5Jl diff --git a/src/gfx/cards/pokemoncenter.png b/src/gfx/cards/pokemoncenter.png new file mode 100644 index 0000000000000000000000000000000000000000..652446ca426aa457be4f7701451b2e3c945ba435 GIT binary patch literal 589 zcmV-T00005tNklJHv{j*+x_d4Kc`a^M5;Z;!IO56 zt4ouWbm?A+PQ^Y|Rb@K1w<}p~gEWIyr?NX& zRaJSn62#qEnjt+sbXo&lT9v7+RTSD1CK3V}@}ShB&ET2^RMkp0N}aX9gE|F3HXk;% zO^g|-69>9fen&UM(3nY~qL~NC+Sc@dpC%iP-}tY)+Xc&dS{A_g*JvZ>ty)S2Rgw5tZ3eP-PptkC15XIK*u(T z1p}0RA7W!b3!TRN*hCB3?CHkXBx|M4wtzr4&K{IHVVl5=W~5Z)+ZaF=wa0R#l*;eM zKrFLIs0*c3?w2MuT5@QD;#jFu7;B^DK4j?@?_a5ppRu|{dY}BDI98jvvt7wu=tnBL znL9x1$uc1KeHC>fz|@tdzFN9Dw#z-J2U-yM?oQ-jCO*yi>kA>5!*>DnlC|gVJQNy- zT3qqJ^2xgj5r9TKahYCCF4zL+z65sAy8H$1;o{4L9n`SQ!X20Z+Ma*#xc6q;mFyYp b_aE>FWszA}SUSzL00000NkvXXu0mjf-H-&7 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/pokemonflute.8x6.png b/src/gfx/cards/pokemonflute.8x6.png deleted file mode 100644 index f9cb9df763ebb5a7ba6a265a2657323764697533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmV-M0=fN(P)%y~MuIx#8^q@xyyF5|;T)u5Yd<4FAe2=}4J*y-SuJ9)f2Y%H zuRsZPglSdW?Y_nV)Z#<)ag`qT1=NB+_a0Wo9s%1SLI32_>}cntO`u_sK=i)_!IR=} z0Pxq+-{VcQn*BUE4{!;Vc2)5H>Q3N&PYA$@{vJcGn*CVq5P+5z!$(2jH4*~AwTPRu zqpcSm0v1z3re8g8vyl*Rw20UDJg;|uRo$8v>1ph3x|dT5&?h0+WqGC7yJu4cDj}_d z%ynI`RfYeQ0w~3DZvz?tw-^&DXb+ZLPyt<#7B^ve1E50zDuIa^ltj;p4&MF`^f(;q zfDR50;ywkRHRzZ?z#4u8y8v4?T^OM{`VhLZDnN^ofIFGAOH&I@W@fCU3#dnw?qzK< znT+e1y*^=vUa{ymBcv&H@;v{eM4lg;3aa~J<`i{+TAW?~0Dt*J Uy00065NklwVJS2fPo7+4g{Z7SYLh@WgqQ;m zCi0pC5P?54{7p6%5r{D9*JN870AkMgOgkj?E^Es0BMMQ)-31^c?E5b?@P@y_Z3?ZI z18){j{eUuN8+d=;JqQCfj%I=r?5x{lkPvZZP{Qfti(MNYmP=0a>l2iQJVKM1ABT^j zhqZBU@|roz{Qzqte4f5#<^~C6K?Z%voyN-6Vn)KWA_E|~5y!90)gI!dO8t*V6V|x8 z_y_SPo^MKU|JzoaUUx~rQ}sW(DQjFi9Fc%yWpv-faXNKLz)%_9q_MK|Y(zpOq`{q= zX}UXgNhp-z?Qf*%;Qb-BEmMZG;HA6y4~GCGWbl1%d>;%xloSEd;MJO)=Q)-#B6&#w zjo@sshf~B8Ap!}q-g%A^P=l253D5QrM+86`;Oa@C8%=@&5B~!-4yy{#!La~XCvaN{ zBMky}0C%x8v6M-_J0OqV#UW=VDx(vyBb%3oj>W>(GiFc&RAoSYIcT+7ZT*bLZMdRl ztW$%I-KGr7vTePjqIcThI<&AX>#{T~YgtE7+$}w)pa3WXFVsH;)VO2eJ;y2l0000< KMNUMnLSTYImx^%cdg(iU^P6wJ_uc@U ztXx2BN~xo@j@_7TL0-|c+yE6$y#$KNs@G|tqz<%C-5xB)c+Nw^O9{>UkdF!RSs6GA zL+?AN{$$C1612sjG62ZAc9(q8JU^$0Gk9t^%S$x^~|MfaJm zR(Gh5WFHoYD@1o~qIS(-Di)h5q4Z!K%t|%ZQYW~V2QlleXOiiv9(p4W9OltVW^kjb zb)@hI**^(8GBUdxx1)&I3J)t(IkdF=nS<7je1hk*A1+X86gFW1`G_ zhXkQHdrk>1L?0F-PCM@a!dkipBrbFGsMB`ID5Hgo-;$2YNX#)YXX9>dyR!j~645B> f|8k-cakBmaKSkObE~^a%00000NkvXXu0mjf(X&6! diff --git a/src/gfx/cards/pokemontrader.pal b/src/gfx/cards/pokemontrader.pal deleted file mode 100644 index c0ce4fc41f0c05987713aa2a7947e75b0aeb1d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmez693U*k$iM&q3|9fX diff --git a/src/gfx/cards/pokemontrader.png b/src/gfx/cards/pokemontrader.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9dfc2dbcbd4559ad71a86b0c3ded05a153cd59 GIT binary patch literal 736 zcmV<60w4W}P)+x200000S!jm)00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007WNklwZRYGOR1*IWV0q34!Tp8Tx4_&SVWQ8x#Gg9z`$yJd34=h?yG` z*Jqv__(-HVc2uZT(O&x{C8N|m_PBEK+LBDWG0X53b3}79_f`Q10;X|H%+yw4Iwclh zt4dXMf7%JKMrfcVctBnkPGzRwX?G|APlG8 z1L_Jr(4SZ0l5_(DTGV9RKGK8sy2?vA58an}A#JS(hu!G0=bpzLJ}?yaUbjLS@KmS@ zaYO6r#w8U5w2%@GM`3n~Ng_$wOI=i+>hCL4*$aY-l<<63d^C9fjXZFe6RX4Q`zC-z@CAkEl$c0{vx{#j zVRXEGZ!*!@!5f?hdUPt4D7u{N?%(O)a?ztF5wTPKMI8`kjgtPaz#0)Je~*7gh$96g Si%@9*0000q^fptht9Q38o}11h<6V}d)`2vRS) zNudWNQZIr03q2&X8**%@JBDpTAcx&U6)T>MO0v*`3qAF)g+5Dcz5%|Ex@0?~$|0CQ#N*R5MV94@Om{py z*yPi|R}WhjLJFi}l_SJF{l2k6w+gx){5@s9WG(6Hl4O z@i5*jJE}E*8cdha ziXvYInd>1e^QOLTfaMrQgkCN$&0_*};Il|6pt_FDzpY$V>!oT+1)CwqsZd>^f1u}SU zEDB-L@vR7aB}IA7^V@E>8*U^+MJpc$ndNC@ED{;#s^o}n{3PKzgHHkIr8?Jt6V!k- z#z`*!)dD32m1tHa&f}~Nkc3W0tSSgX*Rf>*T{6yx@fSSLr$*@;k28%)kVS<>uq-15 up<^nrEgqFbL|V6F{GqHK+0x>FzvB-E^nl)7^pi~h00000008ANklSE=7epZJ}uCRyGIwaVQl^7mJ9!lvb9#k?zvx^1|o+zF(eSFPOIi+Q5rAms4k5H?VP%B?2953|Sw?7K5q5bi1cVfu@F(rZpj0-Z- z;E1LL@}5!f6K-93{~FrQ7;)r~i`H=g5s#;zctH>*Gw!RZV_nHYJ6N?WUqiwnr2=95sp!PJRJjmtc$MCDj}nMRQCUfpLUp^B*rZ&2Y02 zhYo;)rsY)0RifVL>nj$Z7&IH&yl(XW>UfcWAgSloKCb#HR}p8SvlM{|q}I8bZ%7sK zOE{~!Yff>_uEEd^UGEB<9aAMIdS@GV1N0wrYw*ht=M+6>FZ!dyaHy39!w(hMOR*(? zjdF&XYw+^`g8N%jiBf~QNVyKXaJmf6z(k7G51jsvS0{=*IGoGVxODChwo-Z)PSqOQ z@VKyk7#NHcKh$G;spZ1k=hfsvS=ZqELeS=o9AdrY^Lay-B9pQwyA8bEX_ChC8z{g7lbc=fuBaenwP4(%Avzg3jgUayBY z^7Xj2A2gZeOy#;#xl+UA2}9o_%QcNZo2D!08T-FM0bB#ftI0^(>UUMrHud* z(Tq*wWLb6(*DSz@^pw5$K~a>PEqmiJ&FTema5xUT0^$*xGn%W?d`v{&-=bV zK0bu@#{>+?cx$lL&-!?e6BYP@B;jy1NnBX+#ZZCU!-(OxEqcEy$S`66={b&vhyc=v zlVd{=LnZ);&(k8+$6d>ny6EvSY#cuQyFwqkEi+6JB`) z8Mn-a?x#AtVMmY+>?8oq$>6tX4N)SNj9b-Hb5%NfrDz%?#NipW!Mc;kCOlc z=+A7^hqKEvZSaBs9F_{x@1yJa=QBb2f)Ry5JlcIo>KnXJ5Ad2)#~{tWpQ6t`&#nh) z1tSA79*qQ0PKB<16UIn&EX5YRY3{*HdyQ5$Op{EYCKsWUvaBM5*h>u1#7ycT+L~{j zk8&k4*b2bZ700EA7GVUf%K)n&LcUQJVgcMc1dx1C(=;jv(H6!@kZ~L#$SCo6_$1gU zCtjP{92A5kP}db-`+oUgAItg`fL&H9e6=lSh!Q=@(#?bw;MPFlx|t<^tOOvMXaI0{ z3_`=QBtH;DSIq#wASyI)A$bS0;Gn`V4708VLGIypk6L&TSlFOz69g19j92Rxh9~;{ r=p+Le6>y|F=XUoy1|Sh8V1NDt){W4$L}shU00000NkvXXu0mjfrqNRa diff --git a/src/gfx/cards/poliwhirl.pal b/src/gfx/cards/poliwhirl.pal deleted file mode 100644 index 1ece94a4e24066c46ec7d842b99771b398928aef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFHkq3hCu)T5)%U{ diff --git a/src/gfx/cards/poliwhirl.png b/src/gfx/cards/poliwhirl.png new file mode 100644 index 0000000000000000000000000000000000000000..e778014e97b094a8a019c1ae65431ba19a9dae3b GIT binary patch literal 801 zcmV++1K#|JP)0008CNkl33k zUr19?9LImxbMLJDcW>h=nGn&FkybE8&D@rE4oh@n|4^eReP~1~SkSUqMNjr%QKIHU zJ*0Iv-Apml%-OC*A+(WV_%H}GOF_0okTE=+d*_qC#}A+L{e3x{19;y+00c7Cy@p;B zZ)U9ySTq3{mD4^zaXQMZhDDoIpmi7f!lr~l5NIQWIgSM_15}-Z89=eiQJgrN zBALvbQ3il?KKIf2F+Z??6p&GH(rm9u_{q9T1!QW=ZY=jt_<3&6$Sf@D6990q!=ZS%6a|2&+a^4m24V2^9v_BVqKSVyA=bCoal5PyVACj{jEDkK9VT~ z3n2AN$D}>R$)R+q^iZR{x79!FOBj@lqTqqn?dWLa_6|~61 zTG+aepD(@N0O}M12?71H{SVdB_-+W`GO3P$Dn4H!e!RXm1XLb^5Har58S(05WGDk_ zNOeT13oYBW#tqkKR5k*Yf^l>OZ~xF_y6FiaA}hv!}# zfBmPgc8{cc*|XXp(N-liL*)T@(zKB6=gAwJ1< z_nea+ipv7-q*%|bIIytkYL~*w4i4F2&24rEds$w#{+VtpWr8OKp{GqYx^%)LyyoX! zKOgu%A%z56?|x!?!a@S%V+>4-DI^C_sL*hWkGq96>$xP)ql}SQ?@gQ!d8rIX5TbkZ zZ_H?*L1}FU0Q269-)}r>IgFi+kqo4>O+LQ_ zH2hlr*E748kRVT=XvWFmzPaHmDWrr#VLaci)hd;9mE9NeBfx0<(5cmymshT8Q@IGT z{ih<}KyCKP8GInuUb>^Tj=J>PWho)C^(+{PF!aL2lX9rQZ?>!TuXU8ae|M!Cg0P#< z{LTcaOCxc`-?otDW@toz>F;;)y3Y$u?6n8^ot+PA(XG1PaM#C4oV}}~hi}oJeX5^Z zVG+C3)E)C?{hQ*dj@*Vt;zWMG)4SDZ-MggYZY8l#<@NF2t@O?93-#M3@bZ+_Z}e{U zk3C90?U+c8{;{v;=Ql5mEhbkxj(~$xac6!0^Bd(w>$`Z}m)Kc-eD24zSUg!ewp#j7 zktyDOm>m4-+&d@TcQ0~yjzQztwY~Xi`UY(r(F4dZ^+l^IxK{O3p^`2XX8$qc1(GGt z@oZ0FNiZi8L6A@m86_DQvTai=KtN7d_95P0gRBaIz{3G%7@9sPb50008WNkl347 zO=uKn00!W9GAsi%Yf!4EfY6=_m8@uMespKOqz6-P8xKvBACxvw_ zIfVK%6L!RH(K4{#gh+cxx|33KD1pRuB{92kX6d+5_8Y&qo_!wh10a=Dk_^!CQ{bo& zlJ9vsV@4sTDe;bi!i?S0-YpeQI4+u(DdI&P?X#Cn{#PJgQK_wkj~N-OX%_n@!S|xW zJ3c$PKk0M+whqbFdNswLPyLd-z(7rc{EAWP@9fz_$sb%w8w{3<3+-Po{o{Rcrz2Dn zly{$`^ybp~_|n-1r3B06IWLjT=JPl69XsSbka7B3Et?%08a#tYxKOOF-8V?S%TDaM zLmOlzF?e9WWH4tEDoE|JwOKaKFY0-_ zD}*eh%-Gn6?>arKJ7$ES|De~|`7mo7&!E@sn?vjN5f}&l;97Mzc7|pNK`{j_I+3|l z8i3)ZL$scFZQ4e6I(hg!^erI~-1qQwqq}~h>tg0uMB?Q%@YhE7+Wh|JZY`q3^H19_ zHr8`-exx~|`HFZut!sT_*H0Ek!teDyTOz39>G(HwHS)OlY@ql+pjJ9|pt7#5G9p4EYfl!jsY|FA* z!e>oLtS$#Zq((`L6%__=@OwX56_#Z=^hr))dFrjKge}Wv;FGS7P&_v)E*aDHNi~U( zGgCdq7;WjA9|oH?s2G1aJV*B4^~o1G(3R0Zz47diZxNK&A7L0@B{w?)zbQUs&Kw>00000NkvXXu0mjfWn6w# literal 0 HcmV?d00001 diff --git a/src/gfx/cards/ponyta.8x6.png b/src/gfx/cards/ponyta.8x6.png deleted file mode 100644 index 051665ade3129a9991c69ee41f67c7f0237ed724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmV;N0%QG&P) zm*4y3&4bXaavi zM=aefK`>(wNj_D@BIKK3(Fx8i?*i9fSBbbF2%>Lga!+`Ei87_1TR*uvJ9{Ds!5|MM z73mCrxAG!r5U~r*^%~2a-L6641jW+G>u=YD^u2sAZa6;Wr-E#C?KovR?q}PN_-bcn zlurNw`-;Q+_V?Asf!c@j84#JP`&Tx-zjt|I(P*sw@!`N+IB9&O5K*CC|Ma7fQSpZu_YG(iX;oU1UiE; zCU6Cwl^q|(ngbK^x=J)c%dZk>NFz$Khb`q#NF|&(TtIl$pS-B-`3k}losd^=e|K&C z(uhHf-w?~y@gyc}0 z`UFKtf|RmB?y=~wX+s6m6v#*v_d|puMu^mklc>~=$n!}xvH)|_O{FV&INn8YFbom4 zU;i>PmnRUN&?E>=tZilH7ih+!N^CZg9O!=V-m-$s9A9rA@>o6QDASg3W&)k6Z1*!3 z#t1zp5%QZj0oS=UEH;ABx0007ENklBY3d z4uP(u(AsXGHjEUc%IZp2aLOp6Fx{c6snm;@nb#*Dm9mF~m;CwV_q<7-AabOTEMzi* zR(z%?No~~RdrJ^{14-&7mJQ^8;DQrmIU`7;mY!#ffIDnBV99nJ>6pn6!ID8F*ti?} zARh&bPH=U~3EY80B~lE-_{vkOgUp?em9F%H^%Upe7k?KZ*kz&UfEZ<;d2SaBBK_Gm z?&7&`!!8K+K{2y++ac_*3aRoM)()|tmt@NCHBKONbqDS@d*uNN3n7JwNg#+o z$lAn6bbd}0WRObjwj}MDE>~Z6K&Ez4t9nRkotieuL>5Fj7hNMiJ;MirEa-$>`$b4e zpLIeMIKEn7X)B7lbwWfU3SyC0KQh0Hj{YA101;)`9K#I7p#T5?07*qoM6N<$g6OG0 A#Q*>R literal 0 HcmV?d00001 diff --git a/src/gfx/cards/porygon.8x6.png b/src/gfx/cards/porygon.8x6.png deleted file mode 100644 index bd21d619b613bc7a45f5e05f8c72a15f472b1598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 zcmV-x0+juUP)BHc-Cdyq;q zP&`!d4^S`_JlW6&I`tqPD(OrhC0?Wf6R`)$r6S}Y9*m+vLP$MH8_SNfn|4i$?=Xko z`|X?E1@@=AUawahxn@>H8tqc0?xcp(xjlJ}<4Q2i79*fWq+LGy(=^n`mkq0onoXlW zm#0>@6cgfAt_S|7a*Jh@!r1uZwb~E@cQ#(qv3lb-r6kaGHUd9P#*(IFj4hC`Wn5ET z?CvU6r{6Z_RF{mZgUuRb&_G~Pb#z2pUd%FppenaR^IZtVHVqAfl0XCv#-X*USGI%o@$DtC%?OVaAzMaFD|FhpIccsb%b%T7-IG#JXPofdrAYJwloRQ^W2Si{XFLk#AI@=FIZo&bg z(D-#B^8tsQTkB8ng4+O`3n#>k`f1v3Y00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006iNkl2*0Zi^=yLXapL58@#p_7Xf)OoS9Kh6XazU=QNKP9ZI+C&5P0KR~bt5hlgr zp{?E7V$cd=6T1FrErN(WY#<;g2oYLI87Ee0#12lU&~M<$GYuOCoN++8WDCkn5FbWbQQ{1 zp_9jz!uj;|Uhe{w?ss1lGahZf5VExXJ_ltaoTmtI&WB~*HlC_3d$&)hYuPbIRhQD$ zg^w9>(SXvV>ckw_Ue-1ci>mCv@0_O{qk2ylV&V@QRbI}1{n|*4^L}>DIKlaNdZHKV zQ%xa46y#eW^r>kD#+Ue<6+e@DBIV*EJp;e4<%};Zelj@EFZ1;52-I_9H*aecf=2L8 za8^Eq(sNwufrAfB^q=+%F$q@EEWCj9CgSl=>Y!m*I}%<1V&)OO_M<3+1>V8oW(6Cu z8v{cFNm!2d_Yf2F_$pN3&Mhn%-axEi!KyOGl3)oDG1WWNjAC_rgE4>(%H*>Z$0#y8 zG3rYhZ=4Ow0U@dl=39mXs71-8O~1Rr5^5*YZp0WP6@1D0(Dp`%v9A1~#y>-Wqu)9W zzYESvmia;C$_}8b>k>ah>hTUp1nLq$Kw#blIW#Z=X2S&=TfY&y&;>NC9e5o-g+JX> xA}sEmF`L8%wuN|$wFC80e7iv_{{ee{kH2-7YYRcSA!`5t002ovPDHLkV1mWF8{Gf^ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/potion.8x6.png b/src/gfx/cards/potion.8x6.png deleted file mode 100644 index 2ea8805d1f88719bfb425473bb88057cf285b779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmVfb>v7>=y$h956LZASVM>#^k;PQZ1^bo6jzw zrA8^ZVR71Oi59BG(uiUK4vHGLB{ibF=|;b_v^i8sCUbI2=!zR2i1Gp+cLjzHaRcdb z=BULGKr0AfQHvANCN=MN@33q1L6jqw?23lsaj|-b{jC=L(-F_@FI-i~fZozHfdK_v zM_nuyOWU93r4n=GIX(_9s*W(}!G77DSHu)b_P-VWQ8C2#5NPL5Q!r4q7^4M4~TOIfS~827bOyREfowhznMUc3c7Px+OD%1AfUDP5AA|rV yZ#EZw5C{TT6HHQ(-ma8jtbtrof`n+Y|LO;#c;Cf4w1R8^00000005KNklRMhheJ%yk>7<-e3Ukc^1s;Q;o66}3%m5u{gHkjBjFYGt$O7rbenGuA*ac{kGLr&|`fW%v?nC(tSCiFV`XS2=_1C z5uq>}pp4mBS3#zSrb-}_{Pn05#sye#72=c1!Z%{c2g@n=L_F}p!iV~;%U~|079o+9 zz-F|#iZY0A;b3A?0=kX5E`d}cQ``Y*k9)*24@xNy3B+*IqYp}md)?D3KB$xtm3`X> sc9d@SQ3mg%T9JVbpxS?c^f&wmKjTInTe8}XYybcN07*qoM6N<$f{aD*S^xk5 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/primeape.8x6.png b/src/gfx/cards/primeape.8x6.png deleted file mode 100644 index 6b3186dc9044949d786d49f790f88e60eaea0ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmV^PqPgOM`Zg^d~F49TpI2;cLe0tu|Xz$v6Je~wOrERJX*IK~W(1Y5- z8pw#70bkcgb*Nfee7;BwQ?#oNw=?9cpZ=QGl5k1imuI|Nce&C5-R#LKbfS;}a<4+l zxv|d+7`K32L8?22(BY4bh&|{OdbS{)ehSU4ujzzUnz4@WAlQbJZH*pLTm^X_F;~T% zI901o8YI2-1LwIqHi}c~*?W9`iG;0Vu0A5`F9Q#3sWRQdzO#vT|4}Ahg?=4rhS2d% zi~W#X!l*~v1J~PBA_o>Z;|67-b0(4NGK#W*E0h(+W{!E3bWBK(C_6K=&Ib=GjGVWS zwbDf9w$T=M#;KSdi;fC;@ZIFFP$s4^M-{$aONkriKXm zDAe?kr>&fFlH7F3Y~W5)Wo=mX-Q4Kh30@2+z8#CP+@jd8p6~6;!B9(=r2{vWGq*Rc z4`j^-)fIkPqdR-iGP9?@{ zg@NJ+=dn;fTUdKW02#Ev=Tx5;`frJ90y-EAHG8f9?d^?~Y?YSC|L00087NklL2Vbk zN85;9nY<_xj}O+GCSu97Xe;kjR$CuW_(1haopL$folNg8qZH}}6|pm!UcD;M9%=*k z2RH-Bx?Ikc;_1E7iyp}bUqrh)lIeI!l{I~ZJ?eo15>?k7cjC&A$;%-O7=Xj7?f*f2 zEft(5El?n$)2jV`sBaZ-^AUP@4;S9h6B`)a*vS%052$uT#}O^z*nu1sxb@;SN*()b z3diK1FX&)DH|9deUPKk|CZAQkCO!*0&&JnNjqbn^rbOgDh={i~D@}Y$7|u#9kiY5m z`}8Xp+-{G5FlysIB((TCPFFc2n9TYEkhe=xv-Qx~=(72HE5QU;u^>4p0q`EvBkf@* z^4$)U-|7T*cvcu3X`o^5V_bW}vjew_&NbB;j*Qi5q=_t76GUs`nNvzx1ldX&nq*In=DovQC++-*?J!f8B>a^AD)WGkjY8 aMEwOCc7o?Y=L!1&0000^5Mi2OtOvfaOonAXRFT1{DK<{zLm@Pm5mi_+ z*^pIv_oI9eoSWO( z)g2!?NpHWg=7l;dgpL}$EU8T1wS-XBOp+O2p-0!~MxX`gu609Uc?6bJHOd%!0zr+C zjrLw7sA0lM4uX`BY4yC}c_DRku45KX$V{TRbYm@xrU_0ctZYZbJop$>R^44l`G;j> zu^LJjuw+6Ow@UCxf*!8v_gjny{Z>H*=Lt24avMbkpMl3zr`KM-9@K9h580U|hQ zX0IKF{oFK8o$~j^iaByq)~JRvU0007=NklVH3)|4AqTP0ThEIIaw@6R_EuVHXT!Fo70gcT_M%`-73}&4v`{FC&K5-o z8JkIM?Lk5XaV4lXTd*ypAbZL}B85mB+eFRy?dI0G&D-C;eee5NB+eYPN2x;M-NZW> z$554XPU2rUQ?hUep-gpE9j#rVsT57!3IRcwf=4>6Zj5!0D48^u^IL}1e^X5>S^_yb zBclQ#BZRTy5|#9rx)es}{AYam2BjbVq+d- z4LtT}&Rl*gVQd(w996HPeNAU0wYH#n(N&YiL6|a(5~cJRs_LANob16HhQkR@peo~h z(fF;l9@z(kXwZdlzL1YjeHu$bXbxSdX)Y8ZFN=?pIq+}^ooAA@;hwER8fqm_#WeYy z2WVJ&XjciDhAxD$)nl|P8Ag-21kBW=VN}MmqCu%S?(Kz#FG*@rIGnK=7&7P6LlN=9 z7W+ikUbl%?J5tOLE(;#qd=DmDPee;?=Wz9S4?dh~D1_)Us0=Gj^__@~I#B@el9Jm| zSy}&R=}d<;z!08x9LdsTA$q~{fT<7FigUing73(27gZ+N!LDx~d}7lIHmK@$A&b7& zhVZXh9rLW+CHk*xV<+%N4%%%G78T!*yToCw({^|sRkCs0`5QPzqBk5l&>)z;x?L8c zfqtNHqzOccKHsj3wYlD}mKlx4Wc=b+ zV4hp@b-%%9P)P@&cG2M04hSrd95WLW^^o1PcCP`EM`wSJ|Ir4fSH5X$mH+?%07*qo IM6N<$f^P^~=Kufz literal 0 HcmV?d00001 diff --git a/src/gfx/cards/psychicenergy.8x6.png b/src/gfx/cards/psychicenergy.8x6.png deleted file mode 100644 index d2ed9ab59250ee78ae0d6bc25601eb0d7c6cd7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmV+z0_XjSP)P`|G(JK%g<4)z ztD=rTT33%sy@Uhp0Ss1Pv~s`_nb$X?k(=giM*O__Mk76dmvy!>6?fInK74^d+ER6C z*A%9atxj+4dgD4W)sG#6u`adx&uAZdd~PfdNj1-myd@(1XJlAQNosdA^0wiF>^Xyh zmFce3(NK@_^QA0sG}id%JHR|sN28s80yt6qXe@rl=H6IsosmC&Fv0t_bVhbaUIU!J zEq2bx@56I|Q}3a42L6U6z$?g^10;|H${Fn}07xPAyU_?^@KTW8 zXta|#1RR8VFyeX=+hD0jBaFaLcndkBo}HOvQ=hiZxHt(pNCIk{v6=Ao{bfdn!JrM? z00fYccE%=rv-A>=gTbKv4CWI2q9tprX@6lpP*C(_je?$p3FKW)jWKE>G2>HKg!R@K z9BjBHy49-f*ogT*?}ZSnuRYcWV{q^!L=@dA+c8~mz diff --git a/src/gfx/cards/psychicenergy.pal b/src/gfx/cards/psychicenergy.pal deleted file mode 100644 index 44fd31a6..00000000 --- a/src/gfx/cards/psychicenergy.pal +++ /dev/null @@ -1 +0,0 @@ -_ši�@ \ No newline at end of file diff --git a/src/gfx/cards/psychicenergy.png b/src/gfx/cards/psychicenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..20d54d861e16d178249dc7941956fd37bef677e6 GIT binary patch literal 576 zcmV-G0>Ax0005gNklj1(;S0Id{Xq7Xg028k)^iY|;Rb<-m_y@Ra;+uZ(512R?qc&S5ebu%H{FmU0lzSTw)Zec5v` z7%<(@R#BG*V2veA@68KpQxB|>!ihG4y38OnMg*XDyvqtOnj3?I1-I1KLIyq?6@TZc z)_V29!)Rg*4oq}`n_8SiP9(@OxpkO2S7y+$8NR?>2K~yMHU6WBrQ&AYlk7Pb1Bt7^bL4t(SJ!Di`p}C@Z41{(@N3vdaPj0%5 zMg;|G*^|`Ibl_>9fPkRYQovpgh}#qrz~7X=(v1M%~;P9*@!Z zm}xE_q?S>`g!hv0a@E}TCPFapqb4nkOX%)Q-FDABL1K6Z-0=CQ9i@dE-(-(-*YNqL zraF6a^=Y4F-22e$dH1uz9?1n#{vaq%`^NR#@ow4~$wkt4mO*Xe@4C7^(OniSGa{+! z1#l$$z2j!noSil_n+v;MpIo zUa`U3{p7^F8&pPPUXRoY;RWx2y)ZHe>`@_#NpBv^V=8_AEX)loVGr2`1-ecH0XN@W zJ^%%{rCw%?eywqXV#uo@Z`fg)2K_S2Cx&?mP8$bXau>b^?0m13kc%AX@;N?rJ5?;y zUu2qUd=~vTD2-p`Q(l9D6Vx)sRK^lV+lw zuv#QR;4lr1sk%NoH+jBV5W>J=tf)%#5u1SRMW?Jc<}h{2Vv?>G!)z9XETC%2B9_@> z1P_s&3_X<@qKdNYf+E@hTeA95YGG0008TNklBDs9QyJyDFsky%BqQ#6=x1!#7@|}+o6?Y9 zCNjohE$IQnP(~eNqxO=)ga`wHL)V(~d^%i+82$l#-i$|Rl|hn6h( zP{k%D?%Woj!_{JcUk<5|-qqzC#h$6(3+)G*+F{W{X!YUIurU?xyZ*T%3X5J(IHHeo z{yN-|-0-zS(rbDt>E7nsNWoXG`h`Jt8X-BEO-aH%JyFPHwlbMbIyS8#gpbWdVV#Sb z+HOq%Sn%;`F)=F2jHd+1)%xjENQ%8;LS6|VX>Y~UlUU87&NP7Hu4exYjNQ+~lnc2T zhgpP>f{^Rmh^6`Y3mS){IH5_BeQOhJ^PEJphN9XLD*Cd`=M55s1XyIGNK$iU{hN8y z^h3f@tf=0bsDTfqKW5)p0wjz)x+JZ0n~epsK#|ols-YW<|0FvZlGEOXRkb9>4YmVv zHRY5(hLmN>m??loa!NARRq0P4#zkWZgfvCQ)Q&EY7!L?w!58K1{iG7c4FSH2E|E*Y w8Van%jcYH3p{jDTjInxfz0EMf3|NfAuj*Brqe8wl65w77 zh{r*@<~1cl2I6TTnQ{KApk;=53zBFMSy)Tw_<7#(TtI4oT}*%KcqPPxUpC|VV|eV=E_S3a4nfP zI%5AxueT~xGLU*m_{5rhwLLlA&5a8gg^~(u?Jv`!QY}e%Bnq9LwRZcuTGu^=gN=d4 zUa@BF_FT7K>*ZiEuY(5GrmcMu_sfuMe}i=cYm3YKwD9kPbDdQE5o?Q`v3lSGe2VjF z@zC1#tx_a>0H5!m>OZo!y;_#02Qc3Ot?aJ7y0$ttp7j7sWci`@#rJ<-NEPWSV4xb% z{>de|niMDEicyew^vpT6;(=~XN?!nbh@YODz3tk3b298120)}YzgxLsFgo$r-vKa4 zi?g4y-!kb>WySz5*yhcpe%nF+s`Ca7!NEt$09wV_ri2^s zx%B28C~Gr%n0z8p&?L{Egb!FvQG|&>&~(dAiGEfmrE0nMc80e;-ol^}EueJuCGY?T z$2I@i--*x>rScd(hM_1P7!(^I?7+P^f9G}l*S~>s@)>KRVhjKP002ovPDHLkV1n%q Bac%$r diff --git a/src/gfx/cards/raichu1.pal b/src/gfx/cards/raichu1.pal deleted file mode 100644 index 390ad34f382ee2c72d21905883af6eb659c16ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezG9M9at$ie^s4p{;= diff --git a/src/gfx/cards/raichu1.png b/src/gfx/cards/raichu1.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2d6ff1f79b16ce1b46a8befc7fd8c86a25885a GIT binary patch literal 815 zcmV+~1JL}5P)0008QNkl347 zPiP!f90%}UJBmWL89W3JBAz7&Ti2wJuD)FKsCbwJOhhmCkhZK)mSSm4p@&{X@gz|} zvEZ(6;!a3F!tOdVu!@+S?5pS+K}p0t*v_OIO6v^nRIQRVE{kHw1e2yXc^-eRc*UxuJOa%f!%uU5ud>JT2e zu#58P(636F(v%aV`IoSrb`7u$gX4y<93^jede%eVy~!j<=S?8mhOM#xgiH*%oCD$Y z@}WMOY+pA?Iu0ktbHS?qSl9D{AUR;(4PLD03p3aAF2V2wh6Ss2y&|rBVaTyOitL@0 z^NW68sA5dFkKIhVY9`qGIjsqcKJCx`J{75p`0Xw6oL{mreFw|AY7Aa&d?jE9hW2sb zLNQud*puQCJdjSDY>812%)j>i6Nv!j5za0Tf1*c%MRxh90ckExzI%fn2+lS8RvL1h z#ObX$Ix@MrUh`N%GESsbMD+Z+>i33{au+9Mm53(KiCJD1bgO;X{#VTrO|I5D-Ks|> z(jC~8C}`e|bv7Vr?zBxUB^oW>W@t7nKBuMA_Af$-i0 zdf7>$#{59CD#&CdZ2$P&k@NFA+kO>aJP^Ze}V{03yNyo7YmXHFrhtFG*is;@uf4u}jh# tgB|-T?Z?sKftrCcx1Wu?AO9iT=YIrS3kS3$B4Gdk002ovPDHLkV1n+De@y@Y literal 0 HcmV?d00001 diff --git a/src/gfx/cards/raichu2.8x6.png b/src/gfx/cards/raichu2.8x6.png deleted file mode 100644 index 708699a4fb289f0c3a5f622b548504e1a53a7c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmV+w1M2*VP)kll7xcQa(Apo`6=QCy5#n~~k25QEv6=a8(} zAq_fNDP06b2tt%13!;pi8iahTKAAOhKpZ5JY+j3E9|$4kOd+>i_cK$B*}Y zeBTEgjzrXiuIC{2Q3UFciMY}$4p2%6?T88yY9irx$0q1Ai6nd_9UHp=aRlH-TBpiK zg&vsbFeJqLhTH~IXlNV0XQGROh|~(}+3@AEH@Jb6-i_F`yh4n&*3JE!{8K7v8qF)B zR<^zGR6~{dPSEy2e}QMh%~2##1!v0*4#58dhainqqVCp>SilcK?pN z_e*7&D8w+D&boiUjK3_sy|vU>HT+&A*3-V1f4%oZW<@b7^dhz1nfC6KO7CPgZ&Wi1 zx?Jyb=ZDvOdsD1ClZ_}ytyJ!IwwHu=7j4qzjebRymkdftJB@ ztbU4v>bPnmBtW&!%hNWq*Dq~FvOv@s2;}JkU(}zL7_M_e9DKA}uo;^rRX8C)%T=Rn zM!o<{XqhTMbYh9deAG!pb$|^GB-H!jX|$?3e0q*VHh@_EvBpgmN9y>a;c)%|T(crb Tl9ZgN00000NkvXXu0mjfB=dEM diff --git a/src/gfx/cards/raichu2.pal b/src/gfx/cards/raichu2.pal deleted file mode 100644 index 8cef515719afb9b5385599370396b5725b5b1544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmey*ykBU7AcFt^4{QR3 diff --git a/src/gfx/cards/raichu2.png b/src/gfx/cards/raichu2.png new file mode 100644 index 0000000000000000000000000000000000000000..8c35b05ae4ad657dfbde7e34f0e0b4343cd3feb5 GIT binary patch literal 834 zcmV-I1HJr-P)0008jNkl~<{(mQOos(8K}0w&-ta)vn-l$d@G_#XQ>6dl8$U= z(kZ0()mkl8h289A6-TFJv$Cv~O;jM4t+A{(kq!{PlbEq5LauefLO&uPbBU^?xY4R5 zy}iN}())enhvIpV3sI8=1()<%c6)^3KOkXHAVdwqzZ;Dz2OO9d`)`Esl1q5Sj6+bk5ei|OOQOT19|d%{(Ghz5%&j|VlXMCF3haK8 zk6jqM6}>jywI>?F669Mlf|R&Xcg7_#zZ5J%wq-pdJ&Q&=UD9WWX$RJ1>Eim88+CQV zWHp^CJCJP;KV9F92A%IzwkA!ShkVG`e7Je@QT-|MK%z}L{G4aGzJ}|`U;JUo-8X!L z3|!f6i079H8KjA90?LT2y`k6m2Z|@8F|aw9I;}4AzB}Iza|x&*?#z882g4kQW3~>} z0B!AqJERh|Wu>v40xT)>;10$4ppNep@g+C>xd*4>Dj@?*M5PL7CB+gMbl)S6T4@mh zndTdPB_)Hlg4k>Ut1k82Es3@Q3Mw9J1}rA-TOy*3e-8O!!O`#W7bzOr*v2F2zW@LL M07*qoM6N<$g7jH!&j0`b literal 0 HcmV?d00001 diff --git a/src/gfx/cards/rapidash.8x6.png b/src/gfx/cards/rapidash.8x6.png deleted file mode 100644 index 0ae118673f36774ad322b9dc05dea8da50c300cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmV;f0#W^mP)nkQT8h7cMh;=)skGrvr&XJLb)L z=r5?hpdK7_R}T)C-2Lu2J}g3aZLkU=VM+85`WB(oHqKo>1snJD`&~zb2L|Ju&-vcp z@3%X~4z93W5Ym;>ty{Kj=S|iprF0yn9NYx}6NR_x^eHd%84@mn4us{V5S41P>l!efHz2-L}xKJH4U?zQ${y#!=~z)#>Av2 z@Z#)-^{saqzv!6JjVIau@|*cB0!=Z$HkqE^<#Ef-Jom)<&ZFK7TLhZo-Ng4U-?A>G z+}+RkbSvfWrSqnk4d|EsW7PAS;bpuyGi#Fr&W(WIM};)&*ozNbFaG(py)Tl+ zT<+%iE3c<2AuQgcZsFtAZCGi&G~kIK2T^L-)#3NhAlF5eg!nL=Fd#d=FK}Y{;&6=X zRwoT_l|{;66n!|XB}Q|{9||8{Y>)A0%2&6glVt(w_Q+%#Fy#smCOeAaemlS2wxlBY z3|=7trFi;GN8@Rko`OPmLi|od)pGb6tkTpi=VClHqS{{KTT#Vs?Ls}o)6v?>#Gr7h ztQ&-j!W`Ssb~cr2u%M{_P$7Qr#)%>AD^(g4a`SyD4uQwV508<+2F{)O%#A0pbZ0bN zz;4A#&jJdQv6fCrB40T+fxSQ?w%A1(eE`K*C}{Z z`fYpt;T~qthL_=}FB%D9Ku)QjEG*obHmc$5InODFgmhZRH3QxnMh@0007JNkld=sQZP#Z$&;C9Y+MEHZj`29Y=?>*=24!i>kN=8BoO$aS$ z8itXyU|9&E>i|0KBBDjYUqSvvdesOEjldScNL|QqLWKH>pl#cOBmguKvgo+yUq(WN zKQ9WYXpKMxF@g}dw~cgz#aD8s=Z%eGPASeCIEQi$k&#+fIX>I$FNMQ+`B zU7g~dJ8VDW+MnSU{YC9R@o{(tt2Hj9UPnWI@p=5vk>-7owTDwr-@m#%7A{lq7I%wh zUp8ac?wdtlR20hCUev+Ea|_CmAr|u7?0}8klly`umW^!{gfpbpvWaL+IVG&fWeR-$4&FiPD0fB<^pk$2)y6pX{M4EHIW&f7%M%jPO%P zIC@z|y#}2;byI(v&&lopWR?j#P&6l7)Ft3L0#o#R|pPv!Rr+ zMw^vI7)^93MHommdNxe_?MV?MnBYM;>~x4IGA*W*g~hwagBd30CuMfsqWw?7t_X!d_|14 zD})6)kCCK!0=wEZY74!hymc(Vp97Ylm_keE=(-Ku>oI+RU z+Jy$L=9j$*v7c)PS(RAh>AgR=CD{o299LcqKKa8*zZgT8int;%&M)={x4m!#9i|uP z#Q5rRe~|VwYsetd#|}RE`@@)ochI6*q0N=}{?H?43>`s57+bJoL0MQM=SI7Tv&#S0 zL|j5Ui}cD(Q|I2V)~v9NX~jb@8yOK26Lkk<`pLUqjZx-nL;>;~*+oEfc+uB4#|uIsaRMG)BC k@`43fP!HGIw*GSd0hyBAW`mqM%K!iX07*qoM6N<$g37i^y#N3J diff --git a/src/gfx/cards/raticate.pal b/src/gfx/cards/raticate.pal deleted file mode 100644 index 9a861fca38b9745f32118b8141fc6f6a69134055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyL?c*%3#2^3w4)y{| diff --git a/src/gfx/cards/raticate.png b/src/gfx/cards/raticate.png new file mode 100644 index 0000000000000000000000000000000000000000..a20c6b9d7d364c5eb93190a1474eda6acb60f1a7 GIT binary patch literal 739 zcmV<90v!E`P)0007ZNklD1hBs|!}cUVWhLkmT&$l{7vhficNP5kf`BE@f2~WDNo9==Ylu^YL<=o>8!BqRw zC}~V8Wt^lVmCS+_~0tbuCqzW3EzdejLo3J_jXcvQZ+CKFvmXpyntEg z2{fh&CBwY;G=|A=E@cB2t`9AEbzW7EgRWo)aO=y#wr@WHM6{3+0rexW0bEy)v>>bj zGtWIN5x~2N4nYoJMSUoWEi|9TIwZ6MR?0zupj?k3m?Z<4Q=b;q7TUeD+0bHh%al7I z8aqF-$)V*Vm?~)JHTas1hg0te=0--2ji7hFo*d4S5iB(ALK(r|v-KpHax_F5)0+}@ zvh_H!$pNekWq`TDEF0&R9Kk{wnM4Sl5V#&1z9O^$=sVfR4L}E$Jf`g;2+IA;X=x89 zMwJ(YVF)#dnN#O5{Zq*M&CKZltJ;JUdN z*G6Kb+}=0;H0_(cSmKQlP1%RyTe}J$e=8r)K`0`t{k$w%m%l{atw^Xo$@`mNyICpT zft8m?ak8y8m2;!~dScqs{J6r+lzmehb72yhp44|=$TY>>Do>|8txHjgQ-AqA{sHVP VAi5Wpo%H|!002ovPDHLkV1mV4N>Km+ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/rattata.8x6.png b/src/gfx/cards/rattata.8x6.png deleted file mode 100644 index 2bf4f19bc8ad102731ddebc489b4927c42f48dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmVniKDET)w3mpm2znUU&}w!o8X0vogdTb*Dw{^^@=Kdn&Q*&CWMTAkwO4>7Q;5{tiDGw+$JIjikCkj<<5^MT}5H|%Y zan8eQxR!$;+b%9#jk2mbyF(upAHjC4z4roy??Le;f+1je&;EHum7|^VHR1U&4n( zF`TurE1F?h`MNKjZ;p$7G6f&t`zAY|%uhLI3X_8=tcO<@Uq&939cSD$MgaJ2IXv*$ zscL@7$`XLr@Z0iQTdq95H)}*S4a-shGY>Qy~b@lsr!v|4Blw62i5Rr zGo8}rhb30)T6+Ce%`gmI-!@X6!FCN88nyk|QSijz6%8A7UEkJ{^w^=m!4P(!!gn?b eR0HtfKYsz`^L9kZj3ZWP)ibZH8;00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007~Nkl347 zUr19?90%|(cSO3ZsD~beNRN@RsBW!NmavB)Od@(&2NGLPl6y|pAJz>aI7Ip;QYeaH z>Dg*fJroo>U5kcYodvg`xGffftRkt_jp_EwnooT`p#MPaLWMRwyZH!Zp&npGDwAn5 z2vf%eD#E&d>Mh~pX{;Dj*QPijJO~d)eGy= z6C64Ax`%1&7c{M!W}Zn7cmJnoFYgDkYITPVfYsLXsmX=a4 z{lPAdTzz_!)ln5jf?ogTNE8Y=0J^3n6+Sg}aiqmLA;dL!rGgdfyp7*j08j(3Oeu@5 zx1-#UV;XCKPs)_P^oXPE>0zv{PWhya`&Isj|Qf7V*Ws&V-to|(1y;92i z-`yytr-Zn2V!Q5PrMB6XH3K zqDWNSz=sdj?A34jo4TX;MkPmV>Nx7r^%l$SAW*^JojtYs(&QfH;Y29e1%sa-3wl~! zgzS{-f|f;zl>Kydv```fo$QP`rILNhi8%#3l0+#L8=yrhgu=tzkdHWiId0_J1=qH1 z$NA8)7{+^-sH@#5gxX2QyDz%<>Nw7aiCEdl=AUHg9fAHT-bfKG5>c5z|M>%-%ZA*1 Sv;*+~0000q+Z96$6w8bGk|4&pVAd$*sAAPBBT4R8Nj?chs*4G=`}RK7B!**FT1 zZSFLhQFH=;VvBB78ucjZ0H83HY^Cl#&V&Fcn9Y1g8)_i{3JOA#&eucwOeEj@C_NL@ zpU;2a06|fdl!SleJF70h=pH1w+tb~F3oyRv?w@*7J{;dveC=9%ezQjag z;c(s*9}A6)$Us$94JnO{vb^Bb+R!&Gi%c`7%yEaj=)?^WEYD@4FEJ_(Vk7JG#lk`x zPRUGGNGbPgu&A};zZ5iPbMD+_E6ij_0yZF$o{~sw7&qV*>fN#F){w!0Qj`UFo*L-{ sA@C#lFc#zF-3gIOO$ez!A^szO0a4H3`PlkfFaQ7m07*qoM6N<$f*0%jj{pDw diff --git a/src/gfx/cards/recycle.pal b/src/gfx/cards/recycle.pal deleted file mode 100644 index 9da25cee3f6065baf145328fb64b60da41522c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#go*&90#KHgo3!VYl diff --git a/src/gfx/cards/recycle.png b/src/gfx/cards/recycle.png new file mode 100644 index 0000000000000000000000000000000000000000..32637ce3cfdddb8c3329575087acafce8a3463cf GIT binary patch literal 600 zcmV-e0;m0nP)00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0005&NklBjE7={l*Nuf5LN*4teXHy^zwna-5s$?i#Tgc%>#(yCs6ivZH7DHqD7fQPr31Ucw z8ePkoWN1-h@FKEE1e#4QcBrexR{iz6vz!Kx{m`N39$vlNfe6eE39Vz*u^RfRCBY^? zavOtRxyON&L;`kp-;XV`P+^rgijZ|r8V*dLfL^+KYP8H1%aXi zr@ptjnAvubu;U|+Uf#?uy>V4lU705I{jKWWD^(^?K&S`w+l_C@Qe2kvzFZ6n?z+S>boY=*#ow9l^D$&WjTiT#9Bm z(RMWR%s`l)14f5g&qx~xvy&d)tCXVM*-6E1A5xF*3QEMMmz2_TCMFRkr6qA$O!UR1 zgCOuF4P>GbU7FPb<{jH6W5&X3YQpb)l0d;aGy?COalnn}=xOw#eObWWsNWNbxcex5 z;TMu$3KKuO#`S7Z>GxrR9VlaO7(+3YB=8fiKVaixiUEu{7YS(Nx=jow0Qf*hNyPMp m!k81o;hcywb7D6CA^rk0{v0P=&we-n0000VWQ5h z)($j$A2GKv@cn+omuh_y z^FdaX!JyFT)o*ruuQo!%Oeg!_dj1E=*h7qpO-gi$d>5}WqSDp3<;Gk7|9IsQ?a&Kkr>5R@qBjkJ@$su5*9neNy4! z3fDwt0LHvL`Z2XJ*X5e7jQ|`6W;8J|U4lzf_zCWEc1vReGpF2E0G!WT2BEvWxT%f% zHdP?!Dj8tkkz`~hS32fnSNzm#6C=&TqANDK($EtgxPUQd%mrLxE~W?X!0Ft{M&*(P z@B$3Ikd2+FMGahY;axC@QL0-2Y!YZgx#0nF<>$LS?qAh#t^%G}A=DG#Dgb(z6&2uG p8#oASFbFF{{)W|z#1Zgh{RJlE9bd30shR))002ovPDHLkV1g+!3ibd1 diff --git a/src/gfx/cards/revive.pal b/src/gfx/cards/revive.pal deleted file mode 100644 index 5b62c4f16dad9bef597596a0eafc7e1fa591f2da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexwJl{Z`k%a*O4weEY diff --git a/src/gfx/cards/revive.png b/src/gfx/cards/revive.png new file mode 100644 index 0000000000000000000000000000000000000000..e2df7625e4e6e215453941ca5bfdb617fef2b047 GIT binary patch literal 644 zcmV-~0( zAYk}F03ZMWQy%BZ00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006PNklBjU5XX-QLkSN$LS~C2pH51-P7TcA%nj_z|c7mLszAm(yjt8;sj|)H!D=a zN)|Pcsh=PiN?T;3PD#{W@1Bw+Z@H(RfBfHjcLsj4ppr$Qds;0YzO@w9N>d z?>lG>QPc>V!5fqeea})s1jmRt79dwqFy$8;hR@_BDeN3x-p~5!dpq8Ik*L z{vPp&o7T7s%h)|uFnkCNq+7@1#Sxp<_@V8a^6k-eF%j?yZVIzTG5^h+b6*dJtG56Ud9r%j}~YU-zhsSSQd7;quj9 zNuGf&?luV&1@GW~O+lY?+~b#!_jk5&)R135#{w=sbOgkC|KxRRY%b6OPpW2cxrLhH z*HZCZj_t`)cWas&85SOhG1rEk$-otiBx9)HkUTXr{szU>mTp{6vzY%tV+Oh@LwC@E zydGpH0wU6yJHYE9FBsNkfKui8`Aqs}8!lDBzbfW-0#X(5jC{uesjWeixCN8g8u~Z1 eGg3#vll327>EFRda!vgJ0000WdP)(*1K~yM_UDDx8)Lh*JZtkTi}^!_9pN}?|l_0a-PteFkH_RdeQgQHa`14 z8^0gG|7o*n95=ReWZR#hK2PJ`A0IgMYX4NM(g#PYj{Q#@xWYL;5v{JUJzM`-EZ03Ku>Q_iz$w%@0zTnVeQSJ)fgL%_#VAE+%r;wAwEpMv^CDD`{wfIi!h& zaZbrYVBdj|(P4CRM~}#@3huqGk^Bab|*J z42cg4A^_WuH|M%)_$j2S4Zy;M4XHZkeG227GN*Pc8h8teGFmaS{!Dy<^=>N8y%&V4 z+bNHXL{pClEHF#JdWwp>xe$|pa+w8|S4Kl?!6%O!E3fNeMR6z5ur4wQKg4SdEyseu z2*DDJaJ(B32QgzLe>+fjX zrMezu&<_57Nmd&xo|J^H=DsKeXt``p%P;b3NZXxH0wuw zuaF2WFWV&pv?E{>^Pv@S3Q#jQw0yE-7P={&onQFwvE~VR3$^K#^d|Qk<4nh_xtHFD zN|FLJiV(W>0}+y@J7&)^(GdM3oik7OG;Q@+cox(5(|Lz(^8fh@=Xp6%qzYTp00000 LNkvXXu0mjf+CXUm diff --git a/src/gfx/cards/rhydon.pal b/src/gfx/cards/rhydon.pal deleted file mode 100644 index 311cd3e215f22388eefe69cff8b286549055983e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLJwdU9fq?-45fTEV diff --git a/src/gfx/cards/rhydon.png b/src/gfx/cards/rhydon.png new file mode 100644 index 0000000000000000000000000000000000000000..550256fc2929b14d8d4d03639f528d40f84719d4 GIT binary patch literal 823 zcmV-71IYY|P)0008YNklq5lm@CcLjG+lTv(D>{LI;1RH;>PJACKSf0X#*Wy<$dQB0$UZGh-$WxUk%)UQRoTCI~H@E;Bruy^CFm7Lmn`EXX0LjzaCc58?JWm zQfg@|Fk77;e9Z*9T`+Vt=kDv%zG+ksUz-|zGnu1=;>!6Ib123{tv#02+EqJIXcXfJ ztP3~wgxk@kPUWt}&I>Wf;J~0^^KHtARuGRIi^~yFUTY?@;oB89Jy9DQG|@dWvRl;| zc^-jZLZ5@xfwUxQ*|;DWppRgm;GzzNxUzV;TLnWF`mBDp({@GON|^>wX9SlwPi|Q4 zL{XNh13xSD%|P}E?JC!7WkQu9>r>U9oz}|7#zQPkF!B4AX>Pp>=QLsnQrvXFt*1`z z=y1YLx>35TIpA1oPqHfY^x4w(Cn=$-z*@0fX}Hle?Ozw=fCHv$rWTEk{s$zJ5ydjg z6N`_ID(oat2SqVJ!BExS(vRgsX`*4#sL+@=mnzun!kFwNrCpVRX};VlJ+d@GoLO}f zrUedl_Gvx+mPyXflqDPrma0yC$$&VvcV@=nkxh!us97S&VC^TZH0J5p1I{B|U_Y_ZJ94 zAvR-NiyKR_8%efsGN&Pal*cWY{U7oJo8;5a;~$>3)2)c#ccIK{vnwNc; z58wICZ+;8FzpEONB^wBdJVFn^E{&{ZkEW^icj>p7c#V(^{)!d9r3p5|Lb5lk>G}kb zSm=VLuTIXCEDG5SQA4Qw`I|FpR5C=8p$dBGhFDyMP#_s7jnH(*XgmcWx|I=7NHQHW zqhSHU2o~>otFUlrX5^kFXkV}h%L&lK#1}6LCOL%{$Jd@{cE$H9hJou)qw4*G-K&&s zJ(X2yTX<6FbF8o6P|W9`dV^Sm%^`($Rz%o9<4M65RkX~%bVrmyCP3XFcVR>7x4Q2V zbg{P3?K+@fJnHIW7>2fmnW^+Kb$kcpSgHv^a@$ZzfB!!2CLO4kjWJuOAGT8G{gC5Y z{5rm^$Oj9%nwxM&uXq$!I(4qd*WL{8a*h60lJNtr+kJ`NK1fs7f8vfU9MhhZgVrPb z`nm=W$p|8))LGWZD6ZUUT&bn%n-3SenxJ$?t|I*~9`@wambK4vx$lV3%*dK+4IRVk z*wiTx5zxM7ypU)k6k$L@aH0GLh4uosijhR!Rv{by{IGxuw z(w3bM8M%PZSqa(B?2HLIkO0`kwj{Ds7)9>+0^o2of>ON60jDP`QYfb=VT=P{ z{F&2N;Hsuu7MVgXp3bM<{LDb7h_JMTWZJuyWu}+@`#XLC9~ivWE}tF$00000NkvXX Hu0mjfo_boy diff --git a/src/gfx/cards/rhyhorn.pal b/src/gfx/cards/rhyhorn.pal deleted file mode 100644 index fd637ff30a54bb8f77bfc5c1c22d1eb08b5fa62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFA&zEz`y_i5BCCz diff --git a/src/gfx/cards/rhyhorn.png b/src/gfx/cards/rhyhorn.png new file mode 100644 index 0000000000000000000000000000000000000000..62740d4fb2b58b9c66a5bdda41f5f184909a0c5d GIT binary patch literal 763 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 JPDHLkV1hS_ho1ld literal 0 HcmV?d00001 diff --git a/src/gfx/cards/scoopup.8x6.png b/src/gfx/cards/scoopup.8x6.png deleted file mode 100644 index 3e75ec71e2e4e884a665e87febfb6d6e083c8e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmV;{0xA88P)>|-s&W=#G!3ob&(1m?~k@OdApwViIq>?+$%+`%RI1K#GGtc`D z0DDtSM6TNyi^IfG3;3`MGj)S8tTPK7qaqXEGc-X6rKBfM=uS#dRD4$6LEhO3b<*)X z(N)i8FvW^cj_38+W!gun@!t{IkRz~~q8v9jYh>57Kg_QscjDk#n($&go0pS(mwg59l|@Su}WKmZcsOpEE_IH0oy?a8$}5C zi&8b<7d)E%36HO6uoN7qNS^IL$e4TmkAUwxQyvHj%fK@y$zWX&R1tgg7pf0EY|?7Xl>h($07*qo IM6N<$g6s23OaK4? diff --git a/src/gfx/cards/scoopup.pal b/src/gfx/cards/scoopup.pal deleted file mode 100644 index 343e0782..00000000 --- a/src/gfx/cards/scoopup.pal +++ /dev/null @@ -1 +0,0 @@ -_k•!Œ@ \ No newline at end of file diff --git a/src/gfx/cards/scoopup.png b/src/gfx/cards/scoopup.png new file mode 100644 index 0000000000000000000000000000000000000000..e9364ff383c1d74032080fa0b2d5b3f1669582b9 GIT binary patch literal 766 zcmV0007!Nklc!VsHl4Q!HJ3j;k~7 z3fzma@!t_CmRC^c7RT|pSXJu{(nn0cLv$7k!WW~ox4A_+u6XT+NA7Zpb&_**f2_{N z5YqL&UUBULiIy&wG*zmoUN{^gVmD1`(}t9oG$@KLv^CW@P3wq`V`f|yu6rfgh?r8m zhdPDQw2d|qjUgeCMy9FVA13Y)R+RuucOh{9XW@08)>2dsEAG2vgktS za|&EX5RINVAd3jn+R|93Mor*+p;I(2ZOn3Bt9bhEJFkuIv`tLYOOQ9HQwHDTY;ZdB#H7nvzWm8fDF9Yyz)C)cnN#%PGA=lmPRT7#+@D;bAh*N-igWZWJ) z0Cz95L>&H1yggIens2erJg!P2vpSqQnGG@ud1G!i9*6awj)v;A#n+%{MGbLr1Sc=d zjUX_yUoR%;-U2 wg20TK*dd%GV`7((XOdtt)D#4Ei2c9EKijXrwDnRO$N&HU07*qoM6N<$f~nhG`v3p{ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/scyther.8x6.png b/src/gfx/cards/scyther.8x6.png deleted file mode 100644 index 85d92552db7976af655fd85f6e9857d5ba13bb08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmV;>0x$iEP)OAFx^mNJ{lKH_ z)8DVJn)f@$|1~2vWe$0*x3o{|)ALE__Jah>lg6%~PrTDHk+nu45CSs$ak(#T2pB`X zu0wWr&oK%PfDruoQ$IW3_Hu{-)}BeOe(ls)^Z&Rxw)|Wld#FfQ|6*CtWk$TIbgyyI5zlx=GDzm0 zeYlqx=ZESr0Mb~_%;jh|r*#w5SaaJ=UOuK<4Xf_~#L_QsA1U72>AMx15Jd|~Ip01QhqlKk)njL-G%EddPOVjd!9tTb`RT;D832KLEYeKq|2E!g1wd|r zr~Dwhawq~7(i&dj`Kj@SRsdozYCJCA@&0JWqy7W9+^n%tr?`Ir00000007&Nkl z%rUH_v^hy%(8mmv7I|mRJ9ML*`(DqlRhypmL--HbcZa(A+_mhFHEz*{7$td_9&AGX z!epc}DJ6>BXJ`AtUv6bxVy$C>f>MyNOSP2b07cHBRN`gZ(rmB*7yeLHO(2!IyE+h<2q#!uxmK}2}!Tl>e} zK5wzO@SVU2B-&!ePh{%dTXTwVeYMNZ&m5~}z2QIYwoG6IC=TU+PuGXmX-N|_w3x<% zcnz=4VTlPE!1@gbllsuw2r5ku&eoF7+n0wIH$UfUKZO9y$bm7O?~K|5NmB@5ckf|W zSk@h@P1X>AGP+=*Ov@{TasAHh_y}PSD>(~$j#qA5aOQQxrDPp)?=Gl)pIa~38 zu6}}+mgC_>m^qd;kenvVmC&?meY*F|Hpf+v;6d3Kqx$Zvz*nM(-IKDPaW0HG^v7Kf zLCE-1AGfX+WJJrTB3r#U@3?J~Eic^z_A*Is>J!3_qhsc37PzkITVJJu<@JTZ$DIbs z3Q3SexQV6NS4}>kK_yN+>s{&Iyz_{GWv03YR_ej8=Hgw0ctX=+07Rp2s5x>*FPA{8 zfD{J;cQR@5k>3wuXWecybMhy*7cJia0kNcNZGXHwty$oaB0#Tjqw@Tjw^@l7m;fZn za8&c#8s~tVCda7!{4mW)ed7zZmI=U$$59;Z`~G4A00~fvMG6s8JLd9vMS$!DG-~UD z6AdDuD#9`}123oNid+Q&u@-h3#&6a7S3vmBU(DiAZ$Xjo@c;k-07*qoM6N<$g2LQp AnE(I) literal 0 HcmV?d00001 diff --git a/src/gfx/cards/seadra.8x6.png b/src/gfx/cards/seadra.8x6.png deleted file mode 100644 index 168eb4e13727fd194063249af979799ae7279f42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmV+w1M2*VP)Q&AkpPg{nRvZ^a}OR zV=ofqQ{}`WyFFw&WcS>m!x^ldaj)Q?7KuLi6uk(WWoL5lY9O?Y^XqKA)$j4g=lA)Z z-#HwF{;e8NRYG*4LYk!2R1i6I03CDysD=}{(tu%Yeh)bm z$}~;$1IsuFQG%#8I}Wf4khEi}aDvZse*|EI>4b!NY>wCfD9dUx$gXLOY5E4}Hcbak z)c(yVgUmw!qvp#w0tBiv4N;Pq^O6G_VZ|9oRA>0Xu8$vzBM;qzOdP-vs_AKMeU%z{Iu;3r`qt9js->8N0xal)3z&Q>ZMXArHU6hLZRh?-Acc~ z{Qx;3#2pj|p2pry-?==(nh^CN%YhueQNJ@WTqFSeZX7}uyr3JbktbJsP*q6VtXffm&*;fsFQKf*@gfXA2jh&0%qhyH_@^W6e$68oeNU?_Z zP?hMj;1+Mw%iwcj5c^q{J4m98EB zQIATR+p)w6i)$oa(e=1aXudru&pqM|+?Sa!I{9Kqg zncEh>I_nFWC3CxUvyWf$Ym8-Uf8&^2uzLqwydiRA z(5N6_U;qFB%yA0w00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008ZNklIBUJnsXfixVPxU?D#a zPzhj6P%JWn%`?9Xz==3QYFKQ6a00C7H9AP}JVHF@1TM*Qz=(za8S9|C2aw|f1&5cw zl5W;cOs(vsi-3^H0<%@`OW{X0Ply6C#vMybN6Sne0|a5wVvZSOsa5Ye$4@&TGh434 zVI2GXsPRmvx1A6Vqts**!Ew*X1KTVjL-m%p?2U>_;5bJ&oV zl4D70w_$?59`lQ$8PfHgNtpuG_DMB%7usg786+YV4`qXj53r0qB{7(!idx zE`6|{L#KEegcX$vrraK>==f-Ph)FFYr0V^(P-KPbNou#vk^X3#$xhD~&e2t;RW`<`{M)ED4CM*x%2s4&nm4xW^@@^Dxje5w zJ1gFdMoa010S|0bDN9{uL!#ql8MQ@q`G(=dDr?A@8*1CP!nXA4r+_;nXU64c1MHHo zP%5SRXF9@aBG?yU4TT|9m%fDe<+p>ONHMJRMjBM1t6UxmpQhdYHs*-16+}}clpUtm ze+6Mvjj$o&*K$RJwC`&REX$bY3y`eJN~8r2e~*9DE?>2K~yMHU6b!i6LB2JKj$e4?k871;>%r$I!2cn5 zk#60sf^0}gg{DqT0P!gmB5qN$7;=bSKCg>9DCvdLNKqRj@E7Y zmz32-2qNl)RCFY_m(b_-!Z3Cgr|&lM2i#k6b!~IaFgirT#{J46NS|*f!i>ts4 zxk=MYIyVoYr^~Wc=>0A&#)H#ZbTeV`d@73Icxf!cZ=(-X<&IYg4)(##aaNy zRVxAvJ)gtk2it^JcZmtkUxl8@6%2^QV3A&O0jB{_50X~jk~eQdk?LKf4UhEe7x`M5A17X)D*oK#2@6N7fA5Eca90My?D z-{X0qEW~+X7bqHffSM1@#LLY%AKw7#nIZHEHs_uo?3ZKFtGBq!ABEU?#Rqc7EC2ui M07*qoM6N<$g1+x>Hvj+t diff --git a/src/gfx/cards/seaking.pal b/src/gfx/cards/seaking.pal deleted file mode 100644 index 08a50b6ab1fb69ad85f4add869ed3b9729cfa916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexg&%h+gz`y_i3)cab diff --git a/src/gfx/cards/seaking.png b/src/gfx/cards/seaking.png new file mode 100644 index 0000000000000000000000000000000000000000..8f58c8968b7f699ceec02d997e981f9faa958c05 GIT binary patch literal 817 zcmV-11J3-3P)if00000;fM2K00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008SNklHf z?`slq0LSr<-b8VZ+pwc28;<#8xGu?0KgXK;ug*l2lEdsf<*wg z7#lqY2tzy{k1m}9x5)9aG50@!uxN|&ybxXf3t=KeY%wk-2yUnmL_h-Es%@3$FYpx* z#sD+yvaNPw+}P~0h-!%0cRO7cb~Y}k+GrhwAjE({XI8ibNfFZ=ofP7g)xmLju ztQ$L@hC`F;eQ9}VehCFw35($m-U+={(#Gwm62R+y_#ibe@pF(oP(yG!8oj(RqF3XZ zW{1WAo4IXDA^i%@&v~Fm$g8$_LMa)k#dIP;8zqxlmz!(8T@TbKfuCmf%y%z4 z<7JY7HcAj)P%@2U66S_(9zk7#)t`FXRGPG`>fs>zZaAm>O3T^$7F-`6DL^j(jz_I@ zZ<~=wEBZSs~W%6ZFiYX&#(j6*rQF z9X2zc=vHq9Bs8BK!CGn?lVz&f#y+y>zBvRtckJy1sa|&nD84>>h`^opJJwZ~5^BkV zv)vUGr9dHItktQ?Qkd`8JLR=Xs13pw{%Iyog1S-T20d-a5zOn{VcS z@EF@(QOgR=vraW&Upqz!r8&A;=Po8q#l81Kf>^15MyXwhzF8O0E4vO@0%?X|Pz9bC2)* zyyPe7RJt?K8}` zmstEiAhy&3DS+P}T?>kmdtRHxtOsBNR1&HvNK#?ZoT+E>yo!N6zrQvL{u$Hk*t3p}D@INA&GxECig3`kFwG8xStUAa$00c@+m_UkA0>{$0ioe0y0j^j8fK0fY7SpXm+ zk~y2VR)YEh`UTy1_Js&d8$F2MOC7@Mq)n&viy?d$O9X`sJe*?@P0O^epbrOC!8UCQ zr;Q-1;U=8HnY?a{Q)7%>p2SaZAJ3o(v#d+IhQBEqOyM!Mo|z?L6*qP)AKNuWo&U#bxM@K>*CPF`Nc9q_1osko7Qf)~5Nv6MthSDk4 ptEH0R5%!)!Ur^}>v)exh`wQ>T$ABcxJ&XVV002ovPDHLkV1hmQU912A diff --git a/src/gfx/cards/seel.pal b/src/gfx/cards/seel.pal deleted file mode 100644 index ba76726ad36456353c04da022ef8c1e7d7a082ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgzoL%8kwE|e60!pJ diff --git a/src/gfx/cards/seel.png b/src/gfx/cards/seel.png new file mode 100644 index 0000000000000000000000000000000000000000..dec2c2f17172c63d8d9c0ee733c95c93d3ca81ec GIT binary patch literal 794 zcmV+#1LgdQP)Ih>#Z00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00085NklI?k>238Pq}8+P<-y-|_K#zxVzRK4>0$Q01Hlx#Cw1 zS-P&$0oY{-%uoH~jHMC^At-mgktKzX@j)KvN_+syh(MT15WoO}KG-z)9d4;KNa2B| zC>}9n#Y+H$5Jr%ULb+pC;-a90xx_J^gtG21+5el!KK z6}(3PX#%Pim4i_Ue!;*-5P1@I5H*ZNd~GCsnlUW|6^C<$|2fw$m&B@K(~9R{zMlcQ z&NRwG!l7AI^UMA6hQbutCme>yV1Q0(3|tkZ z)R@{WB`H@FA5@HS)DdGPl4L>>gKE~aa~U25N#Ec+o`AZ8rqFZ)(Z33pn1Xpb@2KJ; z`UH4fOOHhErHcpG zti;yPJnR)lJ})&c&NfaxI!tuAUdzWT1s|4Liuv}&YQ6w_ZlPFTYIcdxuSkA;0*-%= Yf0gbvpc{Y0ZU6uP07*qoM6N<$g5D2Vwg3PC literal 0 HcmV?d00001 diff --git a/src/gfx/cards/shellder.8x6.png b/src/gfx/cards/shellder.8x6.png deleted file mode 100644 index ad498322de3d7fd84f88885115185d979b7a70e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 693 zcmV;m0!safP)6JZpcP(&vu7ipK{YiWa%B;n3?hdAgr+@Ih5zW3hUdk66E z+K8fvNU11NYBr@l)YHpUQ@)g*l7zC>>JOmVfPqWr315d(J`5&W!iEZYe>AD5%s=bQ z=qi3z+yaxr`+vcZeo&w%XWf87I8$kj{I$ia;$9XsQb_<+xvomy;QWX}p%Kv+v=MXKnR3fU%!ZFLuk@J4L6OiP>5Idl8?24I!B~BRBb;XlnVeWhd#A*hT1MER*vz-}vrGs93Y?l(7 zW1z!eJvpesmN^jsLgqmC1lnLA02;gbmJ8Dsc@^SUB~PnTHlXpuaLi#b0~81W*BT8= zw1AC!M7tcM(0IW~kU@_o0007UNkl=h^ zV2g}Hz639UWE0NCKLEu#fdG~by0%MnsF%59$HJ!lR(ZgPKjfLw67+1=(+Sw0|AQLb z0f(1YS`GobDA*9()2oHqZWh!MhNDOFdcRrT90`*QfF~ubMcba5yw%9T1HRh^6AYKz zWC#W|J?VL7(CC7o7>+iorsrZKZiSEqb=H%$)sa%0>B(*m#5XgkZAOU7>x!(f^{OFK zP_efkxCtWx(MyODOZ#w_8cWUW=|J1hPU&t zzJ=~E8YfK0YK_2vk3Ffb3*mi@ILd&rg-ty@>SRVbF}8-fmz0&( zO6Gt!6-GKmtufupw=5-*%BxVf#(7%7$k6_~G)!u<41lAQ{^R?x>S{8+0PInax&NAy zAb}w@E~%&kzprZ!C-4L0l{v<_e>ffJ3J7b^XOIo66(y5?9+?YFhLym{jWG# zTqv-M$0eYF-23%=Et}m9cJ}hQQp!8gNlfPs8QV`G2u{6hZs|QGyZL+k1$EJgv)M~> Qa{vGU07*qoM6N<$g6YRZwEzGB literal 0 HcmV?d00001 diff --git a/src/gfx/cards/slowbro.8x6.png b/src/gfx/cards/slowbro.8x6.png deleted file mode 100644 index ad59fd6b7a079da926f3008acc102cf56085e327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmV3w&cPsx!lgDzvqWlzU2(QRG+CUdCIlU} zF+FvVJSxTB_t1tD2u2|K6qoR_IMOaiV6u20eRzxg0(2k`u#&VG}4up%$G;_$@&kQp;lN0=;h3GW9TaxA4oN&>tA|4OdmTB@F z^^(#tK!e76{f2PPMAP~15TXT4lh=rF!1k_H6d|saYDpsuUDo{(#B6-nt|g6>Y`3(R zqKgGh!g>x~`c2+Lm$PIDk=2r-UFbP6=pvE$Jvi`yH{GdRqm(K`W`S#*UH<8*7U{Ujym`t$pSJ_ZV< zYdcuzT{t{69#dl;T6KNmIyMFMiJ4c!OOx|(lhT~zl#Mi5IMoh_1}%oM-4?k(2pL7v zl}JFyFm~qf2RF#++b+VpOr}2-W}^zx{IjI_{TPJOGZcj~xWa$f%c_Fjv|WQ9)d00000NkvXXu0mjfE^A?l diff --git a/src/gfx/cards/slowbro.pal b/src/gfx/cards/slowbro.pal deleted file mode 100644 index 4b516162..00000000 --- a/src/gfx/cards/slowbro.pal +++ /dev/null @@ -1 +0,0 @@ -_3Ÿš  \ No newline at end of file diff --git a/src/gfx/cards/slowbro.png b/src/gfx/cards/slowbro.png new file mode 100644 index 0000000000000000000000000000000000000000..e574738a02c9c1c5d130880ef3d10b57068077d8 GIT binary patch literal 792 zcmV+z1LypSP)R|-Us00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00083Nkl0{p_At1AqY%; zBa10Q?TEYJ7Gjx(ZJ`uJkcZi2cFaTK?9TL7JNfZW|Mz>}_y4~49=vmbTqgh@NW@2C z2qKDn3=)?RgD(aFBKCR-0Ra@E1kuTb&o~W1kR%C0Ohgvlr)Pvt5(EMwb`UsYWC5HJ zkqZ(V2x1Y16a1tMh=)RlEejGS1PDH$exbS)h5I;7Y1ez+iOy?XLN1~}5wD4i z=>vbv}WHz6Jh_}3GTkUsBskx}cNEDyAP=LTS>Ld*y!QqzLIM54v6@xflt^ zmywkNvL6jMU#ysiLV$9D_u6cao9wH;O60y_ z8JKvA-;{QBKN42@O;wj^A17vLN6SuK!qv2A?^JCTCZ#=X2(1k@Hma|vI*ffyoBD>M zJ#A|2@xs95FuqV4u|>ZcXG1l56Vq{^s_nbkzl^atu+8adkne#jWagBagh~`X_)HV?(s59{0d)b zim#>|9K_?-TitmrvoWTzVyT1zGoSp~X6jI5Q=F}y6yT&wThC9-dEN?RMaO{U7~5*X zsrq30vZuqcEPF3ynN=b6K2w5|F^n5}#;5{D*wNuyYt~k(ap5OCCFU{w%pHA~l%lZje#=JItM*NSLl;6ww@9__h WU~yW53d6tv0000eB z5a}@m@js}bH}w=|!>q@Ukxl*4t1YxW^stDxFfFrNY)R-g`+Uho==ZS8y#2oKyxI8x zoYzcK4HSAxxk}Yw+|xpcgG9@O-_082m1~T0eG@k0mOMR#agyRRk-`WaYVFq{7bGeCeb31l3ilpIEZ}{E0csABa<#<2kAzLP)koscBud2pazV$bfVcnl<<=s z+1M!AG$B9|`=QTsNWsk_BD8onU4vZQj8#inJuDK3a7HMEYwFZNw6v!W;jSwU(O(J> z%kF_}z+_8P1Qxw6rX4<38*J6u7^b-Z7fNU=#gkHG(-|k+aNx2G+uULiy+Xvf6wQ;W zL;ec|!6p}GmwQgcj_g)v6*FA8S3N;%rVEpHfDW&*a1)*CuQp6{(1E_g-bAOfQ-_HF zQ?#8yhyE1P+vPS)pFovpkqbwQM+;XQFda}Y2zG+wt)r>kg>sFDrd2){owYXY(b7^K ztX{B(g-SJo)bvj$UxQ)(?qqOzi@H`+8EU|#J#-%M1WR4<=B#qz5bhyf;Z1vG@%d}2 zlD-dP_-OtFOI3$Ccw0$7f!k0T>J?MJcfUOppPptO!*zlYu#Q%p?&!sjDSQdH3j9N( z5iIA|rT{U5JL`S0hSKHlLaaqx$gK>{9>FYtZC@LK?EVMVx+zk-{dfIF2jCgx7z$6dp7+IZ?_tt2!tcYQjmvQ_Am=I*OKn1rc{MTLtw{_c zqTP@I5?;H{sq(y7#>#aWcIG2tf_zELVj>K4dS3qkMqsfM)Z=1J00000NkvXXu0mjf DC4fmR diff --git a/src/gfx/cards/slowpoke1.pal b/src/gfx/cards/slowpoke1.pal deleted file mode 100644 index 81b0ad9ec916566e676044044c53faed45512d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFV7@zz`y_i4M_p- diff --git a/src/gfx/cards/slowpoke1.png b/src/gfx/cards/slowpoke1.png new file mode 100644 index 0000000000000000000000000000000000000000..54cd6c97156a3ef26801e37c30c6b60cccc46b37 GIT binary patch literal 759 zcmV0007tNklq0!d=}=vz-~bd!VQE7g(#yP zaHUk%;?kmLp^SzI855z;+=88#!{cZ}s$okirnt+wUqaIrDk}sz`8K%}5i@3SWl2dY zHBe-2pV@+0F4;&cjn=@ODdln*a7haBFUY8fcAi_D1b{^=DOxrYvcOzpEZcW|>O(3j zRt|JRyYVubcEJ{Tk)-q*$b>vxr9xIhM(czJd>rpX$$$&+w629&S;S$U!!ZdSt#uCIIg3qhU2i7`YDUn28Ux;ZLIfX7_`;`%$?51%Tdpe?bUH`13%H(112*c&kw zV1p848)KW_i`es!^1Nwpbaw1uYO_`bb+JTqVJJTrpRBHzkfgjxU9VOg)7!feHOe@n z?@>pu%p#pQ)$<~LP3q_^b+DdR4~MFM#<8#U585UnCdcWLVS8+H3d=M}!foSI~8DN3LGzSGlB@TpD*>YVCYWAVUf?cl>gpRDt4 z?V3`H4ken)gV`OkV@w=>J4I{aF2zEEtHAuc8AaRnhnZZi515Q`j8;H*E+_8y3nOEm zqe)N%BLA!(WOomT0aJb-9?n9tdx~Z#m@PST1LBq0bhpf6ga{8^0!Rh9KBpoGY-x)y pB-n`$iwN>1h(${=;`IOD<1asLObw4^Tk-$^002ovPDHLkV1oTgR5<_u literal 0 HcmV?d00001 diff --git a/src/gfx/cards/slowpoke2.8x6.png b/src/gfx/cards/slowpoke2.8x6.png deleted file mode 100644 index 834cf0506d6ba79250e002f686d9322681c40f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs=YP)PS0K0-({4!4pLH_vd=rZFNb*&iBFp4kQf z*v1&3s11Nz8vrG7;)37E1D|QFBQeNh!jV+@>|`{paIoT>s4T1yp>N<6z;(k~;~ zp$2(M_bbEf5f4dFSer&bw|_T{Llr)8jIpebVI(Gd>Umj#ulLpm27~ruu#Um?4rLw& zw{(~K7z~;3`CAA)^I(K`|J(@MeR}vpKU3ams=h)N#M?$vPN39wnVF1`nm% zO%74VTI)IKBXH6FW_@;2gY!8%X1%ZmS7wTTQ25`VnIC~j^u4gj*XRHM002ovPDHLk FV1jWLlcE3s diff --git a/src/gfx/cards/slowpoke2.pal b/src/gfx/cards/slowpoke2.pal deleted file mode 100644 index 73881a12..00000000 --- a/src/gfx/cards/slowpoke2.pal +++ /dev/null @@ -1 +0,0 @@ -_kºš0� \ No newline at end of file diff --git a/src/gfx/cards/slowpoke2.png b/src/gfx/cards/slowpoke2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9519303e6601d98676b07541ad6bb7e041217dc GIT binary patch literal 399 zcmV;A0dW3_P)0003ZNkl3`NxKz-D)J10(H=U#g>~Nu*jo7I8Yow#Q&MtzzNWe7?MjD|wXgl~Pu1j5| zSnrZZzRRxPa=GVw?!AwLU{Nb%Oe+_u?a*@TMh6q;4~@WfbOV5Hv;nI!06RAT6Pa(Z zBe`MCTr)9-q0Sp+kTlw0tTC-p;Btd$kUN4^aMqxGQH(-JJN%~vVt&Ay^H3XY!yPbfGPk0Pd^%i|<|Az){) znMCUZcz3UYf?kRZ9gHp-TsMqM9&M3~{qGe%rC|5Qn+_@1Gt;4WOETW)+g_i5v)K~w t^Q#J+H~2LlgcUd`y7Ym<{|5En;|BzV2xIAnMkD|L002ovPDHLkV1gFcsKEdL literal 0 HcmV?d00001 diff --git a/src/gfx/cards/snorlax.8x6.png b/src/gfx/cards/snorlax.8x6.png deleted file mode 100644 index 4eb26a44ea80f33cbcff6fb45f130b82f3a0d0da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmV;U0$lxxP)(=*D6e;Fr_*O>+uRu zqiK5o^8V0Q+A2k1Sn0BJ`{07J-rzx*F&!muWcNtDEo4_A&SG~n{|KE%EOZZ*mg=+N&)V9b)rMA&%4mu==EHW! zZFidTn1+hcH^#%Nb8D{2hsTOj=qr^2cc@9x0O?h={@WdTg+>wO|3E8 zTVh$9{n8+F=6T_z2f?SAsU#vF#zzCmL}j zgr1(Ry;Eg!E$O8vBgqXtHb`uxXUUkbcO+Gq=*?5BAQFQA`U`+W=ycwnpO63m002ov JPDHLkV1g2kJ~RLT diff --git a/src/gfx/cards/snorlax.pal b/src/gfx/cards/snorlax.pal deleted file mode 100644 index e1d7d634f52862f2c5c6a150dd05ca71a969a2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmew#zMpA6BZC3}5rhKR diff --git a/src/gfx/cards/snorlax.png b/src/gfx/cards/snorlax.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd5ca75a0c5eaa72395fb07933c2090a3a44f85 GIT binary patch literal 736 zcmV<60w4W}P)0007WNkl347 zu}@n^9Ki7(a#98;E>gXu1AjnWdT*V}|IAR99s$NJfRILnRccYon5ZJzJ!p z#F4V~IXy=V9c;fx26rhfR85!SzO#BD0e87?pVxdo!g~aRF_r{VNY2aRXh%PSoK7He zLppY(LRPB!j+(C~-iXWF_QiB4jnw`E%38r2A9{14d@!YkW#h%>9@}d|Gz#Sr{85rT zd^LIc300rq#j;#x=JCWEZIneJ-X6L1FKddiBV5CE8x|P-ONasWh_aO5&4Vb4#u)E?!w`IRBt4j{dU^nXTyA zNr3G6 zB?-8{8(BxBu>?K?Ox2Fgo3~5-^>TpWdP)(*1K~yM_Ws_S-lVKRgA9Yi6+MMhg9wOJ&kO{8Hk0NuP5{)Jfx3_6T%UGkj zDDMkgC-acaLv*^yT-5pk>%xoh6E~VekfwvSi@Gqdi$=<(&XKsUJ$+L%sQ<-#@#Dw; zd3fLj_&2H`E>2>MjV(Hm4+oX}8$t|XEVK=x7-cccBC_m`f#^aM2e*x2Ts;)#?uVkm z;2(nvyTVr7=|EihRxn%6#xt>Htat-Q5dV(lrXMkZU}#;8v87EAPI>mmhIp$9HbE4_ z^^>DEcA^5-qVKni`fPSUgkiZk zBVDZ(@*vB~cZ7sSL4}qX<_)d3l7kXz!8Hd( z4*QjkI;}ARxDM*8A-CR7l*94TV%{jdvgnoitC%}=gy?Ot0PH>cea`8ZGP36ep;r9E z4!d*BE0MBhWuBcZCvALv0coc$EK!=Y9@PeAY+_EEAX#?)l@pYVinCBh%}Nu>2NW$Je zMWI3t^1{wk%jI|Ah?O=b$~y}oyY1$2p;qI-_3_%Nw#-71>5~BjqDou{NDm|mhN0+& zB9oTniDRN6x>2&v0=xPx-~r8u{dGp44!{CgW@&AKj*|mKJZ0X7+aS9rPanDtHJ~D% zbbl2<@}+?@-A?yO^pksiGy$NxA82~Aroc}O0yjCR|5+_WimO;WVV}u97K|(sP`lpxQm%qFIzu)m2|8s@>CiUO?00000 LNkvXXu0mjfm{xFF diff --git a/src/gfx/cards/spearow.pal b/src/gfx/cards/spearow.pal deleted file mode 100644 index f241eaaf84a61dc712c8c982968c38723b1eeb91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFE1n|z`y_i4J85E diff --git a/src/gfx/cards/spearow.png b/src/gfx/cards/spearow.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d39ddaa4b658ee0cd7119ee049f91e42c86384 GIT binary patch literal 809 zcmV+^1J?YBP)0008KNkl347 ze`t(x90&0C_w#&byW7n7%Z)#f(+XY6v6DaM@|8 z2pl|sf)c1e7-LL~SqxYbSsFnK04EEy8pWjq2q_EDbiYekb}9vMa2v=kG%CtpBTKD}5%ViF!vXpheQ~(FK4fB&gSS!|=e#WD75w1C4KX@3;3{z3kHI)-@V>yX$%Z(q+ z`l;KII-R(#l~t@xB;cG~SrqnztY^UxD*@ncd{Y&F39_xW@a@L$xKiAIE6VlP#0OmG zYZopwG-D#kk)b>`nsA~1^mx(5tDQX#5q)+Vq&&OybC_+`z5If$9lZCGZT=S6Y39BU zZI#=9qvyu3Qki}e)2H-4AI)r~^s6sc$1lszIxD)m)7@U0mcA@@$>;kvY&&*sM9u_~ z=XzrwnzSyZ+zUG9wH_kd>0flR)BcDT2Ige)YDuUQE$&$9Alrn{5u+EBPK*lG%vSlL zPW@w`iO_w-?^}B=XspYRIEdNo`=K&ti8W`-+o!|4p)|qJ`@XMli3$yND2EL9^&5P` n(I7(XzMLIr!#53pDg5gXg?JKLAdSsy00000NkvXXu0mjf_ri7| literal 0 HcmV?d00001 diff --git a/src/gfx/cards/squirtle.8x6.png b/src/gfx/cards/squirtle.8x6.png deleted file mode 100644 index e8907ebdad0b9c114b539bf142e1125413cdf501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)DW`K~yM_Ws_e>Q&Akp&jdkCkr7*L^dMBTZlF(6X?cC99`s>N?scp`u4ub6 zeef+GhF%#OA}xFH#;yjVO>XX3Dh$EA>Xjmp0)4WW4=t#aU1O7LbMB8joqOx4evcnM zzu)i6;dcP|w=N)-eVI(rNwrd_0BVln{Q^2dEYhj~uGndILVSa~qFNZ#9YL-OAsV4# z8mTRY<=L$cZNP5OD`C*&kk?W*eVcky{Li4P1@a?>D?oIVH`tkac1JNj)}Fd%5YIjY6xc7 zOb%@b&EZ`QoKHL14BA*VuY^+?AQ6gZq+`E8NmxyHsDiX}Z!U|J;r%~gGcQXYXG#Xj z2P?>8auSezi4~+wUnHO}Poiu9kPo|i(A&T=C=(%>6I{UT;A2wZ^sCX393T^X0MrN! z<3y{lAr!ffwiy>N#j^YaQqC@hxKR}2$AHBnFx^Ng1J$q!ed@;s&tv0I$+ZA0;u93G zFbp>Kqw>fpYtkcVhT|Dh!Vm*Fi?>)9ce_VYK_%F6J5+;v!0%!(TuEHwY0bc6lo0d{ z!gaww0fS@A;Bc%xh9evf+E6Z&0PT7l|Qa>1VXL83R4g z=}#^W0Ai;4n_l<#Y7|HsT40@D6@X1|J6=8|zi)#h^)}sAJcGVw9{`Ct3W6UF8n4BG zf$(k>s6Ya9T}w)L8t5S#dPi{_PTD9l?e}=W=(6-t^H0q#P%B5qA9aHAh>7FQ(c{<< zdEOtU+XN$YpBa~)0|G+$#7|R^6Gg67y+ZZHfZxGa>+CV>c27VxrqcE8?$RZiw&vj^ zAVe|B7`vd+Zn@K%k9`N`ndFNA4X18KK1{b1^9%p|j^E^}rh@ksdbj`p002ovPDHLk FV1lW?S<3(b diff --git a/src/gfx/cards/squirtle.pal b/src/gfx/cards/squirtle.pal deleted file mode 100644 index a7aaec53..00000000 --- a/src/gfx/cards/squirtle.pal +++ /dev/null @@ -1 +0,0 @@ -úkLC€€ \ No newline at end of file diff --git a/src/gfx/cards/squirtle.png b/src/gfx/cards/squirtle.png new file mode 100644 index 0000000000000000000000000000000000000000..ba604acd9c01522f4bfe4a4ed3632ac849d1f701 GIT binary patch literal 812 zcmV+{1JnG8P)0008NNklqJglR_ax;Z?5*GEmDiyST+5y`%Y%Eksg=Q}$qQK4|W4 zQL{f|-ivDw`cOUWT3X?gLbqH6KEy`5#1Ksc!QIZiz4?9o@cI4Dm%}+A9}9ejQ0SJ$ z%vqF}K?_@D_6ZuwAOvc(@IJ|f`l;&>rj%f?QHK1p033kE1j>li(p5XJE~xT`NeosZ zq{*m`TSDiR9UB)&Qw7yQojcNp?W78zB5tvVcC;(ruwn=fu-|yup+#NwCbK%?uzIU2 zYPBM2(5PUwj*Ctir%sANH?Efsr(P>bXM|G_tE(N*q)%V^noyGYX+j{lZb*k z0SrD69?eX{HD8N-Kp{a-#~_zr9HjQg%^{D~C)gMtY|$(mhbFY$lPoG@I{+ADz=_-W-=HQAx!2lqBPF55bJB%e-j_*e{Bgr4oldqA^q)TZ2=#Equl zD)0B>rmI$V;VDBGV%bT)<6bTXn^xDr!#R21mG}FShk9SRF83^JbnS5bd;9~T6jq*kpM=!_0000C@O>CbxFu}2+L>={QzYwA4n`0aa;KCWD22gU}vl6w~DpnqcicIf1b~F!GcC`srsRfPZVKDqT4KbmP|r zot05H$MNT<*j9uIqcszv61GmEqm5E5j;lkWp;E20v->n~YKE)LR>|ogttkk3HYOZRB277L4~Q9oAd%`^Hp4x`irkeF zLQDj>tss%SFG2Q2x>+6)Rf220|#3n8fo_B0iHsb)u!Nag#oH?hW+s?rxP|Oy7a=T`)ZtE(1YVCG@R&>KlRS!;0Y`(E z8|r9hr7{-c(j74&B}U6xGCq>Tz^9>dH*1bymF*L*&WA}4 zcC`q`xXP-c2mE`vPcVJARXzN$IZ)N2()g9_4inlKg-fA2Owb)6;9nv}B{*6UD!L;D lj@@iOL3iW^$JP@5t3UBs9rz4suCf3C002ovPDHLkV1jZ33RD09 diff --git a/src/gfx/cards/starmie.pal b/src/gfx/cards/starmie.pal deleted file mode 100644 index 7bcf3925286fa97e3d63e61089054692368544c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLEgCAtz#sqs4U7T* diff --git a/src/gfx/cards/starmie.png b/src/gfx/cards/starmie.png new file mode 100644 index 0000000000000000000000000000000000000000..96efadd4c815d3af8626aee2eeceaaed9d69366e GIT binary patch literal 646 zcmV;10(t$3P)0006RNkl688P^;SSl>uFOx|psf*q9n7DWf-X8^3g_vNR z8>K8&)t23HCWHwB>yRjf$GQ7(>cwTv$T@2ZIazo$C1el6v-se5zUnV)hT*-o@C*I% zc#*_GoUpARk$d^lS*rC06D22+y-YU?VunnSh;=XbQNsWdIkP21n27OMMIz2pg3K7B zL`fneBLU{1Nvxcr$oR93HxE8l3=+ADZ9NLYg(L=v*s;Bf0(n{`07d-d_%(zYw@Fqe zDB`OZEhG0aL4ic{gxOD!L5crVsls#Loxo89nNlM>5KECJ9}i&`a{h?kzsfC#RAwt#gM7E`Z0UNiCuf3$mq}W4F)8N zFlC?+n_pkAkvCSRV&r|fa&IFT4v2v#O?~)2KM5hVWl~bY^w>h9vt}SI_CT3LAxRa(6$6p4%jH?xcPOEfOIQ(89I) z8R$25lQ8_OEizo_Gz}0#i{q+k9U7c5fm^{kH0X`c&AdZ{-iVJQiqs8yBYhlKZquMQ ga)IM+&@}$3zm#R)D3MZ9fdBvi07*qoM6N<$f|F((TL1t6 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/staryu.8x6.png b/src/gfx/cards/staryu.8x6.png deleted file mode 100644 index 1e63f1c93097eed798a31a6df1025c930299486b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmV-(0*w8MP)X5^OL`+r~m_Lo&|3@6=yaf zI6$)e5j(Qf$t-Jj z8-x@45Q+TcFtc_X1-SIL54e52`P}$Oq@Dqw-Ppf({naNj?8da3?|0LExNcZNlL2^t2H?p2z>C@X2J#lB7gc#+w;5uy!d(UzMTnZxCDEdy=A z#j_Oxq`0006oNkluAiVsIl1>#}U5mA>%7)u;dZu)jRp%SNk7fD70ue(5Tl>(wi1gUDhZ!e<|v(2L7& z0Pg?o1FpTQJRTVj)iVH;o1eb4oY+rB-k4TNY}>d5w~P!2W`HtxGN|!GG+b>Tg; z_hf4s9st`wEYVaBQHB5$BCP|DN~NanWSFD}Lu|px-HFl;zLz#eA>PE4ZsnUhb$jFQ z=jiN2f`$Qa`Y6p{l;yP5=Gi3zWHZZ4BSe{UqRlrmT<_TI$;(;>G~~yAKmWln)EHR=(q=`!<}kw$l<$xT+!&MNLB9CiVCKs# zBEW+lrcU4OmHYW-g%G*i<0?s5+$c;~u7XKvJOoV$R^Uy}A4SyqcOfL|yq2d74`xrI zBP;CcJFA;BgOD}T;h27woH<&Fm0r|u-;{=??(3o7_SsqM>83Q+mGMgNdLy^GzXj0P zm-kS|j`_ZKQlCKBY%9a_R;1w$dk~)*uKU%O&gc+I&4w~Qoqiel{)GV{`y``6Gr7UY z_XI-Ntp;Nx!`4S=yv0hBf^U&3Uxg zL#r(}ix0ce4k25FL|bk{zIyuSC7sF;*zYEdOi2%FriE o88NYxkrPVfFJ-Miy*XK00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006QNkl?P)5O5UF%e7z6XU@HTS!wDOpGRb9i1`R zp>JV3xQkv$kOIwue-7KSc7cO1vl=J~T-5_J!pRc^30FvlK|B}}P&eY9ubp1>JG{R4 zd%y3`E5LtY$kr!S0Gm;un^v-Ko}Dr{jgYzPX)MvzwnRuHng=S={{4_<6nt zl}6kGEq$kNEWUdavXd`U6h!5CwfFtilUZmZwS5yzOpdR*dPi+{D5ye@`naX_jLWyW zF%K4?qx*)h`zB6xhEmVS=c@U*@ws)o>)K&@eX*kN0EGJa$^I~`^0j{BAZotX<#mDY zqU%BEGMys}4o;G!c>K9iBG5I$luG$L+p*HcFga?tzaw4OG*Li$3}I>n zKZ#9)$#wlQYjkU(X~YCUosA-Dcr+2~sygHGxG%X?_c`zgViIFrLmE=YEJKJTlQ@Z0 zOo`dngJwiA7E=*Q2v!#p2*?T%St&>pklF-MGsTUtswbPu{YMr+DAqh9jQ@bYA(}P* Zjo*B(B;BnNgHHee002ovPDHLkV1n0007|Nkl?1&s8>iR#4ZjzK-MnX4*nrafg%YPz0AW#_Ig-i zTv^`|jfrG54cRz&FeZYDU}D@x3~RC}#V9bBxjkPyz3{!fzR&yoe(%>N1#%)l7}0u& z_(+5CQE&tu=DsSDDw8pdE!zlP8Y2L0&w&Sp6BHT&U zIAmGeO(JV>Ce%t2%yH-0b{dWplCdk^(1e@sEy=epCvBedELebo9dVyTaVB z-Av>@Ty&Z*H$Tx|ue@&y_m8^RZXlU;b#^^X235y8)1LGJA(di<6uwlRW6^W zNs7ns2~JheB20=J!JsJ4-T7mFrz25>nyRWbZP@lo(~ze61R%%N3aPu!-y(JD1gWvI z5|6Dyi&G1OT|fdfP(JW52llRpeXNnsWuWF0LRyHZ`ZCt zjg2M5B92p(%XhKTgHy1xWOzJ&zrH`TV;BKyl+R+8mm1mDFfN`R^#|Zrc|0A0{PW~Q$0SO=2Lsjv+ QlK=n!07*qoM6N<$f=<6xhyVZp literal 0 HcmV?d00001 diff --git a/src/gfx/cards/superpotion.8x6.png b/src/gfx/cards/superpotion.8x6.png deleted file mode 100644 index b476aba4a935a23b143661ba05329da6a16c77b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666 zcmV;L0%iS)P)$vnfz!4vU0Vm>iH1?GT*!1 zk0;(sU3R|!-voyPU+7uC_GcHiIY^(4aY?qq2?6+>!<@bW5S_|7fV1SyqfaYY(31k{ z5$%rV6ZdXf{Mb6gg}$K&_Bc>`)9DdLd^vQN4gkDLiv)3napT2~9sfv2@9W=0 zPfzCE>{c|AgZ{MX06C&OTQdyBNd5c=?vvLFY|#rd0>mtb3}1nTp7iB5@e@8RV=UWAW$5k})t5*UuT#93lLO>1Pn4F#a9AX9 z7lh^(^@8OF&z1**?GP^Hq)$07*qoM6N<$g2F>A AP5=M^ diff --git a/src/gfx/cards/superpotion.pal b/src/gfx/cards/superpotion.pal deleted file mode 100644 index fe84a56703fc550faa7568b658a8c0ef6e64731a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmeyLyv diff --git a/src/gfx/cards/superpotion.png b/src/gfx/cards/superpotion.png new file mode 100644 index 0000000000000000000000000000000000000000..86ac5efb33f28d8a09a2d0f2a13aaaefb86593da GIT binary patch literal 704 zcmV;x0zdtUP)00070NklF|90%~fAu2e~p({$*rc1$$Q2hMfX#KwI%8B`o# zKg??ls%omuhyOwG^D_@=%VM_xG0QJC?IC2D(kc$QmPNLbl)a@ycA5k@q=6(?p46U6 z>Sp(Y02~q3UFRo!k%*ol1mGZi1c0?0dUAXQs+$FD5Cztv`s~>EdZ-t`@;KG|R-YYN zCjoGP-x@NpZ)6>y0^y~^;PAqJFk5cR3#7RMn4yClDv6@?NlnQH?1SfYn}bII5D$b2 z|9p2o_;N`c!lxyK_!p>!b9174E97_`_iLY(WIuVr)hdPqH;a@o(b=YXWCuJ=Rtfd7 znFfW(J&<-0e35vF)9TFe7?C?5Lz3)6tPdYi-E^ruk$cKm8ni^+qd? zv_^j?sY;L2w7_hh2uD3s>u_MpNLiF(v>mnG#FlN_h!_o360Be#rmkZ-vF-fInN m2aNsBmVsS#;M*STUw;8`7qxn#WPCvY0000rEumU2H#WPkjJ2(CHe!eh(7`j^KWi?SmYcn}ySp8e)LSnn$3 zYnYBBO6~S$Kp_yeorg@m)d1|k5oI2Hs)&gN=RxwqGI4);3Z3!fE;K5K&VwebN8{p$ zFDp}G!jsY116E!-kCZ^e>SW-EG54UKxSKVl-yU5S4#*rj0+ZDi$4Fo#(i2728w8RR zM-pURk!MT0@{Gy}*P2%apd6(_TGv-hm!CO7y3DI0u=tv$#NK3G`8HeGx||A|2t3Z= zMRurKkb@N+Nsj2p_iRcij2>_o1exI_5dy?@mPJsiO7P;iU;WxEhybf80Rwuwx9o&-(s5j`CUf~6b!RUCUKK_H=zYG^ zBHbdKrvRfJA&6i{&3aAq^sMAyB8>a>rBlwDmmKUtYxU~lBM`mkE+LL>d{EPaZ42r# z;p3BO-t*4dFDzOgl?cb5Zz|jAuz>wj89{QJkmC;mXqzU*4d^*UmK$DCBws0GO&A(b pViV<)88@yQ6ZwYk*x3L6j$eem#(=9}nT7xW002ovPDHLkV1hQm6N~@= diff --git a/src/gfx/cards/surfingpikachu1.pal b/src/gfx/cards/surfingpikachu1.pal deleted file mode 100644 index f7a0dd9f94f83dc2f89f28c36964d2aa1e46ca86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmdnb)M6-V$ie^s3km_j diff --git a/src/gfx/cards/surfingpikachu1.png b/src/gfx/cards/surfingpikachu1.png new file mode 100644 index 0000000000000000000000000000000000000000..029c89bb8563d71fc71cf6776f760afe66b1cc97 GIT binary patch literal 639 zcmV-_0)YLAP)0006KNklMcZht@sIyJ9x8Mlam<52-b>VV=fQf}+Sou>9MP**w;~FGu5*eNhvI(&N#CfCy z8p?PDM`XDNUBQR3?)~*Bv#?Bh$q~rx)i{O+Es?w*TyMf zk$cNs5KZ#GMTp@0T_G@`sKHlAxq54UTZHqDn1)%uc$jvf#@(`2GHoj>c#G3C|D_s6P Z{r~|GHlW7^y$JvS002ovPDHLkV1iBh7yAGJ literal 0 HcmV?d00001 diff --git a/src/gfx/cards/surfingpikachu2.8x6.png b/src/gfx/cards/surfingpikachu2.8x6.png deleted file mode 100644 index 53e796a70e72f5483097cd7fbade98ca596257f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcmV;n0!jUeP)N~hgZ5VrzK}2d}$=GG+8?i1WvEmM11P|HP zEkR^2!kU-5<*gm}Vt5(GgF)wTaIj?iGY45b#841a+GXm~#^hVy-fvR^-_tt}zj=6{ zX9nQ-r0k=4rIsr6xQDaktHlAmbU4!*EoRq$!aM7_aQO)wdDM(E_S`-$91+VB^X_BB z&(LRrj`$!hL?QgzJz?W8LFEqCd~JmnA@+WBmm~MESkqu0#&x zIR1JF^tPYfU&8hUFeAYqM*chrpoY^3?SqC%kP zqe314liIGQF2#*JH8ulWletOtjOLbY&-X$G@oLZ#gzD4)hS>Ly5USi>bq62ihs4Uk z40Ou0`LV4f%%i7O;hYx8O{kC%A@B_cQq5rJTe?L6#&^acX?cmw6H4$f4D;&CRTA7A zqY`*rE^bwc7)hGS)Nh830m_oHYe{QJ0p%&n&~GRLpukZJ!$#ptJwqP%P%<7N0c^3Z z2+JCcISWIp5Ow!BaNeG=Yqd2x_TZa&VA*f?P cf8DY93oxszjL!RO@Bjb+07*qoM6N<$f@A?it^fc4 diff --git a/src/gfx/cards/surfingpikachu2.pal b/src/gfx/cards/surfingpikachu2.pal deleted file mode 100644 index f7a0dd9f94f83dc2f89f28c36964d2aa1e46ca86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmdnb)M6-V$ie^s3km_j diff --git a/src/gfx/cards/surfingpikachu2.png b/src/gfx/cards/surfingpikachu2.png new file mode 100644 index 0000000000000000000000000000000000000000..3fac2c27b383cf1cca52c8d65bd2d5898e0f8fc6 GIT binary patch literal 727 zcmV;|0x127P)0007NNklGD7{(v>!`yUgE@=fpF?5i{!}MpdWMrgskOzmkNM6?2Zg#7Sx!`3Hp>DO=LGU88 z;u6-S#Q9=a$yl-wk;TiBw8gH6uR^jI_bb=uKExcQtcWEeO$Xj-MA3*iQ~CAgtkV7JceLVyRDp}r%a7afJba~ zT0JA^^1RUvtOM`NSkP3bAz8%QUqVymZYUpojvo*MEfd&bwcz4@ER4dAviKUAtXt+t z&>?w`i+aNBI8%!WiRAMcG<>_+{aXn(45O^RT&~IOSt@}i^Tn<#5%Y~e9kmihYMHXs zy-dSjR6u^p538>gA!UgpGK^H|TzZ{uJOvY62LWO@tq9+rOLActeo5cjbn(TT@G_b8 zqyj`gb-LU5NM~X|_3vW4z^jGHWZo|d4%C$oA}k~2FSn6bx>2VacleZFdh-mNU#Bc9 z{^Fd`R}`JY3_ML)!ot#Y{#A6$yUUR4m1utSI`~g)WQIsB_A!Psn002ov JPDHLkV1kMUOi%y- literal 0 HcmV?d00001 diff --git a/src/gfx/cards/switch.8x6.png b/src/gfx/cards/switch.8x6.png deleted file mode 100644 index cdcec016619b413e6265358c8ec87f849ce7c256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)b~WP`*+>gvzale ziOJ%`XK$LS?pw}T@7&lsLpcn?y)X>xmV0x&>3zdd>Z(vZ$%zN9VuOtDUoQE+Kl|l) zC96aMDdn+}lrp8D6s?S3lG`%OBb3MG=S+u|ba{w-}ZzDdmmbnv?}HUiM>DnpLR)$;HL_;%=0B zNd_y57}cp3mL!}%_r#=j$a;(~nT}4iuxePI>4d2{#(**XxT*RA#=xCpH1<(643w`6W4c=n1{}R(%vb%Cf$0005$Nkl1X6x2UHp9NYX*RoUu6~C({P^a3Z{8cgA;JFwp$vhlI|S00 zJ_P_pkMDppkc(-rj2`sLq1Ik}T`P4wu#HgDEHz_r59)efd5c}Mb97~w^)=Ug`rOKp zqXMCtJMHFGUX2~y;3he~oMep1jKF%;%JECG$~z&eD0@#V11Du4?;F%c>B^6qZ-|cU z^k;((e`>dO-~3aSZ&BKG{C2H>DvossxPc(>>(I)oU`U7eQi8mArm7drq6A3^ZiyLn zVS*eL^u9@;r^oJj7Y)ith?+-0n?_7Zhb=_y1A+SLEX)@u!{$?;Oa<|1k+DZb8e|W@ z>u>2!H~%;LxxW`*yDK}>6fr4*gWVOq5m585M~jZrfgbm-YmL%ivL-n`t`yp%TBth| z8fY3GgmYtA2prT4Tg!vVCcx*|T7uLmM-c-Ksc<{`I_y*JefBUHRUu%l<3VPyVz3cy z^YC#d{uEUTf$bPn&TjyWY-b}-evZW6o7J8IK*enc|K|nJB-* k>^Zh{1~8W4F&O^q$AeBcNJtQMqyPW_07*qoM6N<$f>|B}MF0Q* literal 0 HcmV?d00001 diff --git a/src/gfx/cards/tangela1.8x6.png b/src/gfx/cards/tangela1.8x6.png deleted file mode 100644 index 0907f147ef6d9dee192bffa45ddef99c2b923491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 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 diff --git a/src/gfx/cards/tentacruel.pal b/src/gfx/cards/tentacruel.pal deleted file mode 100644 index 212e1bf0d46a0801166130cb2a4e16ac186184e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexw+>tq-fkglS5jFzX diff --git a/src/gfx/cards/tentacruel.png b/src/gfx/cards/tentacruel.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6987276aa8e3c715a8c85d076e9813a3551d6f GIT binary patch literal 796 zcmV+%1LOROP)00087Nkl347 z!E2j!9Khkv+h4+2m@uTHQP|KkvBCN9$hi7??vpb{sY2fgDu#LU`r?L zGQEg(qja^acCykpBflCdvkgf-6c2(MM6ieK%{$+WhU9I&I(FOhATL0k`x_+_y$WN< zb6pI1x4VvmJcGXu)rsCZml2T=afVRge;y)Y%0{CDN+iZaBo4Emtx293RCo-Lh?hQI z_IK5Y@2{uF5VOvlw=DbVssusHA&wf%oo}CPXEh>&vqb4EbCXhw2Js^#zDQKhe*W{6 z8_%{=ul)lDM6K*nwfB216D)swYu7lSHOMaQUD_(`bpE}2^P2jTxZk|(n(o!H_Q?0s zWz}JjyMI_J?mcum@f+V=OLdUuJ=b+F<~BMro73f#PtbaD=p9ZCrPDk2b@|nMNWA5K zR0~y9F=vkF-&|m@mYfoC^TROT`>lMdfSB@BWUnNe+!Lk?w8QXpXDF^C`u$(IafE2} zPB#$$X|{aMdf9MO)bI4~4*cN0(^s#QlGneXUU9kyzJL3we6e*Q>3Y=HYTW~WBi1U| zB>CYd)OPA;93$^7tF(3!pQ6^2F8L-XKp7)T5I0(sm10Igm(uMEl} zI%!ym^96Kz_RO$7Ozk@%*tSAv#{WCaA3ussg7J2*Ad;&;#=+Ww6k&};i4GS~KcGd~gpRuK|iw&a; zHY~e&+G%vF4zyz_9>!KAd6iUF1Wkk#++cIivV*tXx{diLuVp~=SZQvF04q=LKz%Uf@2 zU9w#5ro=RY=JBnBRyS1DVfH)7hh?$wtX|%yx#BpbB4Sl#$KUovbZc5~P}M8QM`>jX zAtuQgcUhS>GuFHNMjc6bbd_ypP`cPJ`QMa*8ym6i5mdJ040bq^5E%=q+AlOnVLDOR z)&tzb-2kQ)6np}U4)k&~`K|UN03f0P2$#Hfl&33xCUXcdk9?$>XY_lC3C1@|czyx( zNW%Mrqe<_DtiEdg%Gb!l^O4_~!3W{opP8s-xBw!1jPonbktqO}wE)N7&<<4X=P7`F zubl0>#a|&RIj7(h8t&6SMfEym4{%|A(;FV|tDEU?&qn@Ey zx^)EN&sXoeI!00_84xLF4nKATK$vdbgnpX>te?cA6u|N7{`ZiW(Kc8 zs%gxHc|N{8`7Y>BnV;{1v=j=#WND@Sx<8a!L!Q_i&qw*rsTW3}5RERNUP(xW0NRls f8EqkR%K7>Sk&1j*E^g+N00000NkvXXu0mjf%{o9* diff --git a/src/gfx/cards/vaporeon1.pal b/src/gfx/cards/vaporeon1.pal deleted file mode 100644 index 0c1686682912c9439bb9ca45a3e5ff463a60fb6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexg&r-({%D?~s4;BJi diff --git a/src/gfx/cards/vaporeon1.png b/src/gfx/cards/vaporeon1.png new file mode 100644 index 0000000000000000000000000000000000000000..487bc18942ab9dc6cb15369cbdde6562beb2143d GIT binary patch literal 737 zcmV<70v`Q|P)0007XNkl9sX?f(n=}nN zXiYI@ErXsJ;XplTXV9?uaN%yv=cSZy8NAu!LU7DB1d54YARdQX6NFYqc;9^MF5CFY z@f=s>IL>uYHA~wV*z{8pLfg%@WrrZNRjUrdyKfT*@t_K!LjMETz96{wFfomSxx9az zbs~;ym~}5IQ$Y$mcY3>U$iIlOgfx!tEgj#Ksw}%x;1~}oW9;cS3_Y%*51N3R8AE&9 z%Z)g^{-HH9FrM5LOAo!EF0EMmDDZs=oi^%mNG}yQ_A*+>kRK29F-7%FPmy8|D!hcr zhVf)Me%*Do2q2*i$oMKB`4^)lJ<u)omi?b=qr~#zA_4*AOB69#RV*yqB%64+>l~Vv+s7*uY%z%ksx`VRq zXFv@Qrj}=BPXSDjm4)AowXtCvsH=$kQ#Le!50(nc&1o<@_6;{~WF<$tfFTXkztCWc@qDnno_8D2cK8`-M`> zJbn$LVm1r&zR{y^rEF{%Z6$Mxl2Q)lo}xe?m6}33q8!Tt92q489cRrh=YNlX^fZ9U T=!M%Z00000NkvXXu0mjfgiB5f literal 0 HcmV?d00001 diff --git a/src/gfx/cards/vaporeon2.8x6.png b/src/gfx/cards/vaporeon2.8x6.png deleted file mode 100644 index a90ba62377b4ee917990dfc8223368e95b4ba41c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 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 LNkvXXu0mjfeNlaT literal 0 HcmV?d00001 diff --git a/src/gfx/cards/venonat.8x6.png b/src/gfx/cards/venonat.8x6.png deleted file mode 100644 index 16382611afaf4405cee02ad64a47b1b3f644eb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmV;Z0$2TsP)YnV>^I4HzffHS)F2L#?l>~| zsp$mbOn*%>Lha15>!m7 zrubnKsbasuv(~o*XW1+b508tf-Qb_}yhdJ{k24zG@>ZiTkB`@A;5=VL{N<9*=k9+YMG%0Kw@hT9>3Q_yr(XWjXC=ZCAz| zg5cmO;H;D+7W@oF;nRxFL zbS8{@!4;-3re~((kc-Yf*xA|kYty`)v{MQBu~HWbW6Ty;KkSv#Zoho{)&|~tr+)r; zoXN_(cJIL0V$~xS)N|SJ;B!ZCz_o)-S(&GYMSS6tx%~R-2-FLAZ~Oyh6eDms2~6!5>7p+00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007DNklhDe`MaRzS7=J>~<#^Y&=l z2xtyROdy08gSal>VW)rQ2K?ixArM#zef3d~fX|u&ifIGA`Ve5-30w~Yv9!J<Idykr!iM~MSAOVBv$2u#=)K3I`&L~ z){ptyHBKc}fb>bZ)C=!ma{BE07OMEZBN7Y-b@MF{E@TP9fXeFM`*9CdhJA!Os%OH> zV?&~*1Hs3eobRij7p%Po1nXnv?7Xr%Z2}q>9II2WoGH|m3c)hbKUIiH)24T5hQvqr zM=aYp{~cL0$+%L)CfL7q3KrB{EKYV1%AW7RB!r?2_NnP+GlcI z)Yu+-&xyByQTrz@M_OmgExaCqw!ciqUy)~5?))$dv)L>xXP0(Am9^rptKSwbSsSAg zqLw~PXQT;e3%oihjFYP&008jx8x;Tm0D%7i?tAr2i+8Pe00000NkvXXu0mjfg(*56 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/venusaur1.8x6.png b/src/gfx/cards/venusaur1.8x6.png deleted file mode 100644 index d2d3989f0ebeea62e6c21f1111da58be527b2315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 731 zcmV<10wn#3P)SpAt(C3N~v)FAmvGqnEbE&>?Y2SxSd=RB7JzGU;Jo zV6Girl)8f+gPr)Mng{>pj3Rmv^PFdL<;giXiNk;tQI8D}E3;2D= z5I79^YLbAR4Ag*i1!atY_lc_5oLq90hK|RLJ?{b#BGa~QYItH7(Gy_oB*c-VpY{+d zWZVm2BcU)!i1Y|As5l|{mJ>7abZ`JT7qsI>6gP6yr|oFDO^@j9*!fNDEC=`JdEQBz z-mghV*Ei~~W7}AbDzsRtCZ(_B^UsL~TP!t{RPCGu@^9TT$+U|=-({wzkzrt1mOH3@ zqWd7*szxHHE3ipaYV?IGoIs{n76$c$xqX_E7@g&aOg~{GRgL*+h6_$N3Eu<|9`b&n zYv_L4?BOA7ooDpn?oO4+mVR11Xr%~AXr#MSVkAXLn@^JNsQ>*PzX9(#iR7o9n=AkT N002ovPDHLkV1hx|UV{Jt diff --git a/src/gfx/cards/venusaur1.pal b/src/gfx/cards/venusaur1.pal deleted file mode 100644 index ff5c74c90d0f0fe7800ac6eb86c7c0cbc400d451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma#go~6)Y$e;iK4D140 diff --git a/src/gfx/cards/venusaur1.png b/src/gfx/cards/venusaur1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f71a391f08e06d45a4a008bce2f4444580daa7a GIT binary patch literal 769 zcmV+c1OEJpP)T{v2B00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007%Nkl$_tgYzq=mzV0(9OSKP<9$)n?)}&GxrbdP~4^a zrD$1^m1Z=VMOI>Ldnr3@$h?%aO9efYw)E{ac8B@ng}{f;`@Ua(ya2gUP;!BbVVth+ zqR$Ob;lJWQ4F>6ZiMn75f^EKMOb#(>`_lO4bTS;dc=lp#QFVcnvkd>xlP|>!Ch{*M zSh5WtJ}BK^g@pwx!vW07hpF34NVNH)2OL^dP}bl-CHNLc6t7qmt}P4Uu*evj)bBw2zz@56XmeFq^@6j&9NE z;rnW7Ili6P%AbQ#BlZNFg1PX{pgrZY(=D7m+5a7E%lYwjU9ZzlKf2YCpL4FK$!YMU zWZIbMR=56yLNBobyh#mNboXN+^th^E)E*%8TejT-o{+X_8e{HzbRIY@377^>CbK9} zqm}U*8t$4VIpfAQ#%V_UXwyK2-eFesB#ShoMh0h5cMzhz*Na-$;EJ8i(NQwfALUNE zGnLab++bjg7ZKwEc4vxgET;8W$Jar7SuGKRU;q?8%9i@RS( zrLa6KN0-6sqlnneS*WGpb&|prAJ&=7!=D;U?+@@e)S!54N2|2|_ z_xa#iZ$Q-hGa)ifp-Y#uz%3JAA{<1RlnqY+5_(qGrJlUhZ#G38m(dSx3Z12ITYnhI zrg3Nt2~jOdf4UH?9w&(z6Sy2RT2Nf4aC6*j9-0JXBO^?YWJmWAEhmLfp#b5;(luU% zV3(WsCJ`5;1D6cMAFV&?<{x$sLsi~8=BO6%_QVK#ArLD_>6m4isoC-KWheXs0_8p1 zBu!j#-L$s@K+8Y;B}eo@)wbuoa10P8zxq8#RPbh&Z+LeAym~h6J4EPvm%YD30N&&$ ze1a;JO7Z$Tp#tcgb$^yhR>vr>-wlgUFjQxgN(Iwk{#m#MtvJNK0g%}(^7pciuIzC@ zBSPF!ad^job}roLqcTVBoJPi71M*-@E%U!NG>xnu4JbQwg&XyH+*h@nd0&B~eRy(> z*F0ufEu4|(a8z6E2pWy2_uXRFLI@0z_25YqJw287a)LjYfUceqw{PFRnLJYNQeMvY zq7%|^QUAc~^)8uKDiY7kv-4n+UitF4r> zb{_IK+tE)C>m2OWuh$lr7m)gB-nr-lso=}S&6S#i{r9e?43ybG`r6~F@8IBD$AZlu zs@KSVpS_xc&b4`eJ8H9EaR=BdJ9uf+nR1!ACgZbU>cSj`d6m=5fkU+A_oWvw{Ojt; z&pD{ZDzwG^kp&F%#%T`_CaAE*RV|Nr@Y~4VvTfU?!pzc%7se33K*lutZpFfMy|v%L zP|uZ2N6mIgieA|}&~YBei!bgpwF()n*GIhCXcf4jhRG1fh*J0S-zhr!MeHIIMa}1~ f_6pVF9RBYgz6dF41zr%n00000NkvXXu0mjf&cB3k diff --git a/src/gfx/cards/venusaur2.pal b/src/gfx/cards/venusaur2.pal deleted file mode 100644 index fc789ff7cd74feef7a923bf92f9ddc603c8e8482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmewwzQTw>kwF0f4}Jn@ diff --git a/src/gfx/cards/venusaur2.png b/src/gfx/cards/venusaur2.png new file mode 100644 index 0000000000000000000000000000000000000000..5f91e9bb29ef30a8355871d5516638d9a5078969 GIT binary patch literal 848 zcmV-W1F!svP)$00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008xNkl347 zUuYY3902fd2t^;pvIr4$^HHCK`8II2*W%j27}COh??~gi2kAkB>j|Y6x_^~1_GksO za@j+KVzJ+wIVFzL#O@avLlF88P3xR``_ojso4t&#%aZ%^Reap%1N}EtXqlD=8Le-&J6G7-;cj68VT`W0h*y(2=;3n znOk~;r!3%$Z4qZr(~BqOt;B;_U|&?D>7~lzGos-}bO}6WX>Q~U4svAV5=UmC6$Ot! z6Wlu3e{dV$?Ys-F_x)|%HJN{!TS8T0XcvQ8+cd5EY} zr*!CzGSSx=!x&ek1>k7*qgTpAMRjWUl==<>|M^u-(TRBD2UK5>7+9UXj5jGu^*Z+d zD0#s4Zc3S?yt%iC{YRw&c)XHAi}FQFAifzL2dA)tieM&dJH(T|4Lg-v%nlK^beHdT z32?rU`Zg$s5Gy+*jtcNs+inj3)8{y3zAeD(q6?TzrCN&Xl&!-a1kRT?25>+{^xfih ze*%7X2KVG-a^GRCP%&9zSRwPZ0|5KJt*PZmS#5&tUJtvE9XrvuliTs`mo{OSgFgV^ z#W75M`aHN7<;2!Sd^aH_oG+X=kYi zl{;gwjD6pz%+VYbdobgape4V$)G=%rM!q;Ta`W#6Xk8^Sjf$2vc{&w;s>90Gh3a0~ z&?ta=9gp{}!L7nyT?r>kBL4f5nqJHRpK_&!#9R%7?SJ0$Y*-JuldAxUC+9Y!Oko1} aIsXF3w$rzXDfw0a0000ZyaNeSN2r{$_fa<#zpPG(hv4Uqdq5A0$_8z{)UM; z4?{rafW0TZ+fc8)!Ej*rw)?3#0-&u-Ya!iF5x%&4gy7E37WlDV`4Jn}2kQWG-7WKwA3r+ToI+_Jl*M9q zsgTvb?)`R3|ACn3>Nsw1>sE?TYT!>tDBjii9Yke_3P2I7sF*@xZG5TK@V#$K(A+9E SyeG2&0000 diff --git a/src/gfx/cards/victreebel.png b/src/gfx/cards/victreebel.png new file mode 100644 index 0000000000000000000000000000000000000000..37cf69cbc01ade59472b8b488fdb7ee57da596d5 GIT binary patch literal 785 zcmV+s1Md8ZP)0007{Nkl347 z!D<^v90%Y(yB8BH*+U;7pxzXcQj6eXtKGaoaxu9W+ItSoA)peO$fOrzLH!EGy|}Yt zCE`O2qhz+^5)wIkX$dq|)>wy#)p};zt-WPuJip%aeT2`Dlv*W!O(JsTp;ZcGMF3Qu z4+DmQ&}1LapSMr)h`iNQm=XjGVtAf!nz4`kJ58|MHM#pb7>}>vI0QiiaY477#xV9p z08OP*<(T@!MokE*K~Nk^^`XpWt@N)cR-)=tNT~H~a6? zK&&TYTRzc>!0N^KRd}=^#t>DaDcN6~u2=l`4K<#etD}Ul*EqOm)p>>%AYD+oDYN$w z_p^4ZU3Pamgwx>gPn>ULXU&fY0lJuLb$e|s%EZ?*3#CYEF5)$yZ;IU48dO^I=^>h| zzmfm+>B)l*omInc;ay|>9PXvonl6+%o4oyxac|2ks|N)E`VvLG!B?E%=yIm1?4rEW z+}aLiSJ*-JgHICx{;Q=ggMEjM@)qdAR@sSYEd~|RK}%_Z-adF5kaJ^~3I0}V(xE$D zV9`SOw83oA?Gkiv=QJ2PE5w+3R(zn3R(`XXW_0K@7&mu1gxH)oeB{g)7?Y*|Y4=fd zB~-1n&N&}-J7nWxv(EWa8Uj}N2`O99wp3fGh{)A9H9<_B2IuKZ_%OZ?f;D+4!3Xg& zwc{oTyz)3#GXEmN)qGP^@@{(Lx)Nedcj4| zp?&~Ga1nZ9htNR~934VjLOz0vr&ueBpx`QqIBP&fhtzmgaM0h6|46A_6(@(f7?)yG zy_BofE%hFflu)E9ZP%`;s_!m2D$i7to=-f5WILrQBDGsxaZW_8Ure#yl3bWg7iZs+ zE7Mf5>Jzz1IHmGNn&K$<-jkOZ!@*ilRWU})cKjeOmmg+%R~&`SoYA9C^-;X4b6`1o zVuj#+P!2}7ttvI$x;BB?PY4FNS4y`1B3{WL7!Q}5a*VlNFCS+M{XxI}gO&%8YI&T+ z@i^X{X3fM=(zEfMaJN71e;8%0C`F_ipRCk}@h~3IT(f|AK8kin{b4qs6{Vp1d^xBO zhbs)&GnXmkl*haMK>&HlB2F5V>%(OrbOu7$fO1A5qEOkhM{|A)zlepT$*#H{k@rnN-C%AO*d;6@)1)ScSy-MD{)hy!GsCI>2Ku&CkBF3a0WDCr<3-{PalY zOpdEMocFB@rN!CzPOX7@Ft2L|7vC<;4m$JeZNY>0r|xeq&c1h=>u3gIoScbXy?fVL zjU;$a;U4K^|3=U6Pe?Pcr$3gQZ}fZ!+_e-kQYsKp@E~H0A*@Ur7@UJS4?C=`M;m18 z7>`j(j>l2ta@jtuH4f=~YZC4^G_ojSaNV;ZG@2sLI5>jM!zolISZ{$fyEx$w+qDWy w>T^85o%0rv(^b07*qoM6N<$f>Qh}LjV8( diff --git a/src/gfx/cards/vileplume.pal b/src/gfx/cards/vileplume.pal deleted file mode 100644 index 3c4f7078e5d34f4703550e25380f8538fbb0d9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFE7xN$shm#58eW+ diff --git a/src/gfx/cards/vileplume.png b/src/gfx/cards/vileplume.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef4386ccce937fd9f1392a508b4215b597a03de GIT binary patch literal 722 zcmV;@0xkWCP)&;S4+Cd5_@00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0007INkl@vIY_;EpZ*%>yke~Xo=8}F%ZaLG^F$lT?(cB1L~oHEJ0@^ z6AuaZCi)ECB9O=+JRJrXQWJ^y6FG!!eRtol&m#Z;003g^(Zal$nGJ|OlaT52M1$_C zbC73JnJsMOM{`wmgHtcdA5`Uvfocy>3Of)n_Xq>5VOUql@>*- z*lwhg+{;?u6i=(|UaR*_I~|vqm@SGA%UP%B6m2GlK_K31m)q@LC+#vWGePyXy zj_I-${}CWz)!OcLYe?2X%-fXJtaAcXJ|Y$D!zu+R0a9{~X1gGYSGq7p&`*5~R30002se;vVB(Ihf+X8-^I07*qoM6N<$ Ef@Xw5xBvhE literal 0 HcmV?d00001 diff --git a/src/gfx/cards/voltorb.8x6.png b/src/gfx/cards/voltorb.8x6.png deleted file mode 100644 index cb39c6661504fd70fd54d7d3391b3ca8a8bbe0f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583 zcmV-N0=WH&P)$5qRhz_EOrlfxZhjs!I-> zq#grH-sm4#mk4+9prX&xC37&9`@kY1g37hyO^s_cP8} zlRxrDI;X;W5UF!&QU_7t4`B;`Iv&Y#Lai!Ba@k+!L?(r1I3CqRBxFWD`@H(z#-oB_NGaz^A9Fi+x*(Jo%a`V- zZ(HZ!1D&84NvpARN8JUn$5jyRi{*o*R&~gMie3c8NEVKk;d~IL=WJkXw0y7}bb3PY z;JXbX@yTk)wzhX`aCc$~l=ju}k_@8mqeN4?fbm*N8N^>FmcPDIg~Vb~=6&Jkn?w)H zcpZ!dDGPzzc9F=W-s?bOE1f9>8Z$*MXX$;37}`q8HMJPnp})F!c#YJzjnUj;+kN`z zczY|T;<_6ng~LufS7HcoT_dsX^x=s)s5;89k$0UUO}>`YlMrHbz4B%S&&5E_stxGM zto7Ab!_(7UXgHdtrN_&viKn-0?L2B77#y+cQJVU{So<-dY3Ypln5OQh60006LNklyU)V=c4_+qGCI5kFR6@rzoG`moY|_38 z>zWqd#6t%me-LzRg9XmRchbJl_SJo!9SqZs(fjZ|Jg%>&@Yl)z1Lx(L!YP7>8Yn+A3+Q+*R94&=pX_#15~q- zNmWkm1`wbgz)N>4^)5IYC)0YEml;y%N1oXlLX7(~2-9E}LW~r&n!xPe*i7!M`(}Q99{>RAv;jcc zRR_92vL!_(0YN-#R*>5Ru#dKcHbAYbqAuwJBwNk#sIArofp~6t-%`&bn-SpY@5f`_ z9EpI%Ls!Zo{LqX>pt=3nGmH7+sW^%aLSngP=UnsOV{W=eh~4z(7e>2Z)mo0bS|H2k z55Lxm>zlE2=kHuFO%7-2!JQNSD)I{i_pfLFt^E1>vqrO(s|53YeWY>roAP!!zj#`O zjcX^rIB`t8G5n*L2u$jaCS~V|AM4>udyBx0#-6E8RLZ5t1J>W$>J|5DpUzj`CGhxs z{hdqYhbI+raQJj!VfB5T(f;M)&b*)sEzR?-Uk~v70}sCa^_djY?>>5J zKmR=W@r&bM0^EFV4ddNmHW6T=fpW8G5MZ`eqwm7SNT4f2mEr1O4Km$B<)Cxx4S(MsL$Ix z#7jd60006qNklOJ?%)Kx2GHbo*N0y+iR))VII`dvx80Nv?zkNcRizIAUUA1s!B3m`upJ2o zF?YyY$gf?PP_&aPcp~J1eP+Mh=Ita25eLBqZtw5jWv7EgB^Tuhs}Nc|h=FJmM($_` zEqVbt>6?(5idC8Pb#zL%uLRnPjj_?N6 z#o`rx13@Sr2nW77x^<{${b7gTMr$XxJ_172cd|nePS=BJAG#-1(a4o@Js6H$h5&>BQ(y#!@fR*nHLu%bbUy$9002ovPDHLk FV1fhd90ULW literal 0 HcmV?d00001 diff --git a/src/gfx/cards/wartortle.8x6.png b/src/gfx/cards/wartortle.8x6.png deleted file mode 100644 index fad87c7468dd5f196e46150b11c4fd88c4ea376b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVQ&AkpfAd~n#M(xikOUQB4|D7;O$Z&k12+lu!R0+kB=poG z3X1s>5et-n_X)t2!M{S6$fF%m=S}ZvCDYB?Ew_ zdwAja$<^M<$zqyN0U~J3pG&v)*>zl|0vmOsvF?kH)BrJRvb+Icb?Wz|TD!AnFvbQr zK|t}4v|1x;5-725d1OI%3tQYY7sLevT(P^^ zOIJcR2YIdR)u@O2hPeH7AdmXVw4z~}v^^%NVg%rndCjn=YwO^CBOQo?xwd3}NT*Q^ z=(s1pPfrm~YI#UAYMBzWOSl~5sF3ig0Ze=G$+E2RgcscbO|8)!9!bKRgzyDdTvG`p z`Y54V!emP&V3tdiD6FaUTACI+HNzr2RZ1{~|HW{sPUIs>m}dRRBInf`9;>U{R1lL~ zmqu_2d?vwl;jLHKETU7E)1MWiA2#z@E?Y^s`2eYVWQxl>FZe2(3uVie z2S?1=v)_m~lOGH=2su5%Ma7lD{P3rmLVF3~%nY9xSmKUHB5M}G$?4hPQmBcm3STqW z${`gNCYIa8sj9H0SOi~|7bX(66!S;;Qhyg;(Od|-4Cb(z{Z6ZtpiinUc4ryGU#S!& p%Y!T9oEiYI+lgf2Lh8TY@fW)mi{s;t$+iFh002ovPDHLkV1oKsTmS$7 diff --git a/src/gfx/cards/wartortle.pal b/src/gfx/cards/wartortle.pal deleted file mode 100644 index 0c9dd7c023686f338be48548deccf0734c06132d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmexgFObFI$RGd!4&DM% diff --git a/src/gfx/cards/wartortle.png b/src/gfx/cards/wartortle.png new file mode 100644 index 0000000000000000000000000000000000000000..5c046f7cafcee7c31c2a292bb9dee11e988485a6 GIT binary patch literal 797 zcmV+&1LFLNP)Si+}100002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>00088Nkl@9+ELaDbdxu=^Un zI;$q%FH}A!6Lf=t@%$#HS)8bQ|o9D`?1*b_Dz7i zXkEm0k2&rxsbw013ctt4=bFzcq3zzb2#({WdY9%F(evP%1(+$IS*jZqP{JG`wQ{Wt z#4K0S8Z#CWOp};2DJ4u^W8MzauBCFRSQol@=GmRiH>bxGnFT`AJ^j}7=;MatuR91- zAPGF5^#u>sD;#oC!HgSte(UQKAp@*Ul6rwylV%H{gDw9rgb)iQqT*;u9;~IZE=st- zJi-gDV)#B@`?1|1O8D{j9-1;WLnzT_dH4xusNMRMo<<%Pim{jeFP~C$h}&Yjjd~dG zl&*)XUc3fVB9Ca&y_hU02}1rbAJ|IJ)(6Hdxm8*5?T5X~9F5At?hEO9a2g7sp=F-6 z1zfNvBWGHtLL@I_5S=9_NfNJtrWhGsu+ba^Sw=konx`1$1)#(_B?L>DIdo(gr;8Gv zet{+Acw~oXEuvtjL>06%RbAjfYNiCk)US-_d9L9xFwjK>C9H4rfLxGc0M&(?d5*V; z9Z3pa7TLoaNv%@@=z|<$ynfy9h!|Q1>K+02Q0G0(Zu(Mwr{$poGx75RD3jimbc2wB zi+WrcT=6blv59n+Gzv^=k=0?nX))1n5xNwdNDrrub-Q{ofUF#{XLNRGUzxV6-J(Tk zPHA*DQVUg2sh8^Sl5;bo$s${AIWo`FE-qM??ITRA`p&IJ?=@kGUlL8GdP#1^7SPBRAu^nERV+*j0Y0%>DHqdZ&JB zJM-6*u#u2yHyUG-Tl!<@g~8v(5Rs|+Wu%&!@yAGzm13H&jZ|0iApe}kz`|`8v^MC= zg$!F`g6~RAA)&RQ2kHSjWLjhRG**4s!D1GS^lLB$xFDSeBU#EqgeIE@BYiyw=xDph zgMn|i02^o$3P$$Y2j~(l>R{lpyxT6KqG0F)2^%S?x;2g@blhJEhTfMDNwAGEF8ACA za-lVRkQ)w0v(c3>3x*G(autkc@M^-##$X>nf(^!t4+9B}!5>Y?G<##hpCK6bM#d}H z>Wguea^;MYxgYOCG-51g&XDlD6+`FDlCH%V%Xj{WV%WSfST3C*VI@TGiu^`zD1l!f zI%Lezijf#WIF8wpO05_vxzi$J9!C=^Muu3{(kxYeqjxFR8J3KAcRDP@K*U^;Oyyp) r7)2$AODekKT8M#3uGS;J diff --git a/src/gfx/cards/waterenergy.png b/src/gfx/cards/waterenergy.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f28e28c8bb7a506e6efb36e0fb166f56c222c3 GIT binary patch literal 539 zcmV+$0_6RPP)00055NklS5Ww+S*%Z{v4m5>6fP(bkD~gEh^sqhzB2`PvN0=@!-9J zhi07JY-)8b34exP+GK(M4SbBSC<&|u?5&K##PT5joW`KkZKt?0aMOjHT4P8%)}C^SE5l6f z5ie1<#^hjRXZ%iSKN!X4^pyD;O%{x@BMUX@ycdjO?}mA4R5uF-?Vd4zlP)nB`QD6q zf!K|LK@akB7ep3=VV)&?7igo_c$Bboe<2v=MM5n>HO44;bzjJZ*6=}YAQ;WYLP9?n zK8Ol&F!tH2C3G4Cd|(MG7y}=s5*h=xn~)pu#t^nb(BO?6Hu!TU#$^GqGZKJV^}_WS zDCs*x!v1H)%Ugve5@RIadAqLo>s(XPafXBqA?BCpH|7%wFyQ(LC?h3CsReQ4&d082gR+l~}iw0MW_aBo%{*GK(^?d(C2`u^cX`k002ovPDHLkV1j7s=#l^c literal 0 HcmV?d00001 diff --git a/src/gfx/cards/weedle.8x6.png b/src/gfx/cards/weedle.8x6.png deleted file mode 100644 index f53e0603116da813c3142c0abd9e4df10d3c35c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)yTU8tf@bCHElN#BbJC{bcV({+-afOzx3QD`4ZYfM;Bx7|( zC^*H5$R3LLFm$8WKLcStqz}SS!3t$C5?y3Pok__FwWF{;WH{KQ{;ASomDGFMCb};7 z<|p{*=R^1(@>0ht=f<1dd_@DDM@~{8nz{#{VJQHx!J5Q^fC{RBIx2_7kS3W*pt0)! z`+bS9)E)%6Wgs_WR`dgL>xth$K~TgK-cy$@5ARO~?1ZFbH!t-aTuO!54%dWa!y5Y| zoqi?;g~sv}d0zT9iVX?n8$-JOte_AH=|iU30hw zTKnMXX^@mQ6-)2a>(itjoXi5x_8GHN8??$~@7#E4aOJKinRD1{_+@IK%ilNY?4Pj_ zmC9m@qy!%G#p1)w_wd?~2&pc?7=-_b`P!nnnuP|rY#zlV_w;P)(;6D2 z*x&3%RJ}Odjv1s=v~6>|ejl8{KYVPt9}2{*!!FfmE+G-VVzBsPdqf$5h3PK=si%-F-@f_Okf|h4%qs}|0 zBNaYmXQQm9u%EGV<8Ywm9oPQuC>Ywd+Uph%jg-%2Z>dNDw3bkNseR*=00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008vNkl^b^-pnw$@0)aSuHuCiBst?(}ck&SV3jrL-XK3n162B zls$;_VTd@<2?gWqFky&;X6xx%6t-@((23yuOQf5o+%tEFu{k%#cRwGt|HDD;Wai*h zoZ=rTVB_>L_H10O;sx}306Iyr9kkG18qlZAoSj!}Y7Hc=og;s_;pTV&9A<&isO(k0 zHbr0`0DE2@mx6Ei?wLDZ_b75%n>FfRKHFb&aTB3*S-2_kXE*#x3mS>OaSnp&7UUg> zv{jaF53*Og*B}+4bo8#zNsHsG!$M)p3C8@@eQDM6^bIy1UgvNVe;j@#3F8fMGH>;^ zriCFdn+mIv8)(TL709cpT`vluUSi?#tdKq+%_cq20|xX}=p zMgsNxqMfmOL$>ao3ZOS1%4Didx~Movq|eGgJ!ThQT_46yaQAE9jG=9esI{sWRM!~m zUna`Hm&;OKR}!%-i+?&lS?K-yJE9UUO8S@+SobeXMCV6^)6Qk>I2!|e@7sZ&;&0%C zdFyi0KC>OCNHqoUW1GML0NA0_fZSDv0*54jzyz(XcBmr?3arWRSc8+^H^(iBYK?Do zOeKFuv~Zt~JHJ7LiIm&zJ7aDn+tWaun_XY$^3)l7`Q1a!QK=tg9LJr^;vl{AwidM& zBiZU`ehA3ZbV;;5Wg2BdM9_ts{bFauV%I(g!2ZUi4I~RX&6DS+msOSg~0A;=rG|n{{lPiJeRS Y2Y6dcVBwSCRsaA107*qoM6N<$g3S4j&Hw-a literal 0 HcmV?d00001 diff --git a/src/gfx/cards/weepinbell.8x6.png b/src/gfx/cards/weepinbell.8x6.png deleted file mode 100644 index bdff148994d73e9c52c16f4f7061e840adc4fadd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 763 zcmV~8;U8?0IFEeR;zJClvqDX>gP5N7 z-_r|aV8eJ=(vs*Ay&M%kzB2)4LY|`9&;+C4{hL`;or&;RST)r{Qfxc;*8+=D{8A&! zV)-+b6zUd86bln54Qe}!m-b!2G%lJNM)8B4?fT_bRedSX_M##j(+&r;>?RnLS_x7` z3t~fGMm6Wd9Q#WFdy%GM_xysH`o2#Jw_$<^{=1WlV}e%l{JJ{OY)j}d1z($m#Nm?- z!yMZ~&>MG_nb6ZRy(-mAFJTs=&OI(%A8(ncjL>r~dhk`bf?lrYI83(E=I6tV zG_AGMFxO<@kc+M1GGJ_#P$D$Nqc~G#{s_TZkPykWESzbeKb=`-zbgoL(^XY(rg$C; zY+pPOO2M?STiF;)AF&+29{eNAil<1sj4^j*rHxV<75vQOoRfC4$6LEpH&6DGWqHqJ z6IZKX9b8w=`2{vR-ddEnAq0Y)U&zB8f;}1<@y?-(Ei-41v9@%CZ}1e|n8S;FN~aov t#yh9r=#?IF@IGo6PJs)i33wl8;~(iCaKq!%65Rj*002ovPDHLkV1g6WThIUi diff --git a/src/gfx/cards/weepinbell.pal b/src/gfx/cards/weepinbell.pal deleted file mode 100644 index b1c7dc72..00000000 --- a/src/gfx/cards/weepinbell.pal +++ /dev/null @@ -1 +0,0 @@ -ÿC¿ \ No newline at end of file diff --git a/src/gfx/cards/weepinbell.png b/src/gfx/cards/weepinbell.png new file mode 100644 index 0000000000000000000000000000000000000000..aa0acb72e9643910e48105a5330e77d490274fa0 GIT binary patch literal 802 zcmV+-1Ks?IP)0008DNkln^y8dN2qQ)UsQL6&!O`D+x#4=^69nbNumt|Ig?dv-0RkK zT+7*P#Lo-ku!CQ#W%)36m~!=b6ixUU__m?3^tPQ#94rPenXr$mn+nUOQ_RdgLaOwS z@M4UmW^J3mG|!um!9gW%XH!W6GbaihWNvCY=P=WmIoYkRB?0bI?JP?;OEL}lKpfmf zfI64C)>2oDW~#Ro5U5SNuE~ia%``I_3^c&`pRV(f(=>0UbRNx6k}9(HP!g$ILmmzm zfZwi3pEC^IQv^8x;Ogt=7&Ay=N1yxoAYYtcS;iFUWG}_w^GvE}wK~<|O!@f>C_sK? zlj#f*unb?b55ojXS#rQThbd?PJ`6AyjN2=oVv=%r;R`8DC9wSN6cjvAl04nVdh;pZ gP?C`DOMlblO+3*J&?!h=W48tYD?HI{m6OP z7^s;0FiJpO$OsXGh;hz2_M(Ws*$7Q@Z$P;15I!6= zEjaT#pkSj#k`ynP>dbd3;kKM(~e&y=%0xa}_LYl;k$YuDIz-Nhx@hnO>xAlBmLY|9sXfc&rJZIcX^9@5d#jBC{qD z)E9+1Z{=pmV1PCviMklJoJxh2Ao85^KQMKL*q-zX&iZuh_iGxM%m>qa7bSCU91Y$2 ze)0007*Nkl`X)yoECX+U^PhSD_XhZlfaWY{8W2mwERY18 z0{{^pN!mG(5^#n;$b^+uh6~KYDY0!^Lqbd1_JSru6ZbwNM9L0TtT{MGASYymh>gT4 zAq3)m0L98mmNh>lv{adMiNpg)E)F%aJOt=W7@0l{iJS~NrKWaWlsk)XMn)h;X^noA zRqDnP(6S|Y0OLM<$29eYh7vR78Bc!ni_*xShd@diKY4hIM+V)|cNZamY#Jpo-cw)S zO<+Px>xY~VFtu9~8ac&u`|(Z&vHBiroJu6-XE^WAAX1+i-qi3r0Pz`5KMBo*D9+eX zDgDy*=}CyEG#7|bt1%YUE+4Dm6xM$2$>~!g> zG%0E^*p=#zM_2LCRFKGx#2WiL9rL_?IS`&IuU;^wy3@bQ#u{X0Xf4?3#$FN1tK}#~ zAR%u0js>n-Jctic7K#Rh#K!hjSEU*LgrG(M%3PNP#fWB*z`g|7d9%Kc26LVQKv4~( zv|cRIG9P>(YUPH|I zrRcYZv(8z2&}Qv6tFaPdn84_9-aW+r*L&21o6qAv<#}>h`S+i=00000NkvXXu0mjf D0%=z6 literal 0 HcmV?d00001 diff --git a/src/gfx/cards/wigglytuff.8x6.png b/src/gfx/cards/wigglytuff.8x6.png deleted file mode 100644 index 3429ddf8377165a44329a7de10d003b90c3c3cf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)4DkZu3anir~eXT$N=*4X>gmu@00)$Ay<}8He$ASWI zpR?Op2+J!AH~<}0`ys5S765_JS!)(T_-Zj25K2a-AHsTS!9%f>Js)JV5SCvCt~6I5 zFpVe;VZHE(fr3iG#M#RbdKUl&02!6TdOF6VK;xVn9ED}CE$8nuM+%z8#&nvu89N|` zl(^BmI_r=MW7(jhkq`B*?s^R?gu@)V4_>ZvyMeO+0O=~u+W?4X!XN~uTJH!U001n= zde;LKUzk#MxThzwBns~~@u00000 Z{0GE9-p8aGP__U7002ovPDHLkV1lXw7_R^T diff --git a/src/gfx/cards/wigglytuff.pal b/src/gfx/cards/wigglytuff.pal deleted file mode 100644 index b8f2caf0..00000000 --- a/src/gfx/cards/wigglytuff.pal +++ /dev/null @@ -1 +0,0 @@ -ÿj 2 \ No newline at end of file diff --git a/src/gfx/cards/wigglytuff.png b/src/gfx/cards/wigglytuff.png new file mode 100644 index 0000000000000000000000000000000000000000..762ad41273befc17c8ec1811469fe9e24f640394 GIT binary patch literal 689 zcmV;i0#5yjP)>UT$300002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0006+Nkl6y%7>2))K$l7zs<>Dpx)isPlq{B0v878vMK4)W`WGxw?oh)4N1=a0e~0u+heEmG zST3Q1xt!5S(t1+QkaO}lL=k+(mxuR-SNIPBC`U`5VOEC60|ZV01;A-$kQuHz17XbQ z@yezVR0#Nh0{6wKs)VJ{=`HKF4AaF%juBMI9Rq3laLwL)rMZ~4YCYUSZ0dPXsMe~p zxtwak8|8#H<4TAG7AHCl=Ki=;GsgS`ytqosqBs~Bre^M5Qr^&%E=~*mt2~-dJ zT+|c86eQ~LBwW8}Z0+3L^xy?>3+vk=m5u_B5MwUa%ObViO-?S58RVnGEs@F{GdIxB z()DGL+KvIV0InQuiB#$aKqAql{bdn(Vz5{t`cT@xhC-&3^m{v97O6dL>&cQAB6d(_ zB9#S2YPpAG5jz@oV~qSU41{4v z0W$q&C+Sgj%$wm$)zMyH_eyEQQMh>71Y|a{;YS%uTecRYv86j1<#zrA?#^9Pzz&YW9*F= zqpiszA)!FH1pWXDY>-4y3ymiCxV`-uG3DnTD#Tg#p- zZ{mUsb0+ouT1_k$*U=IeT~5c7`e3lHTyjaVG~IvX>#rNjG$V~fK<3qC_}9?b#MQv^ zD|)XzHGj$v*AJCkAn5y1T&**bE=G$SO)pieaY&b9W1(}YGt z+FA)-{C4VZH#}2~0C`bQ`8~6zmZpRvhT~q4(;dSK-)Rh@h#?Su@SUtsDzSd*6gjQZk0z-h{H)&y!d%6KRT(ch60Cx`KA6bu`%Vm zL4s=%V=bK6cQ}ck^o1ILY}%bUus=UvLIPNp>|EKod*sTjYZL&aBC)S~ZBtu)ve~;q z-u|*TGjM*3<5(nmC4Jy1$YcO4=U8iEuGT*7A{T>&CpkKFGtxRF17yLZ_m7>e?{XXq zBCui#L-pXEz6RKk2df&a`gvCn1GowjwK`B$h75qfCZ(#Rf?NzhFHlvEf(!z{wmqa0 nD)P1l0Pwe6WVgfC89d-06Rr6EIim>_00000NkvXXu0mjfXB9&0 diff --git a/src/gfx/cards/zapdos1.pal b/src/gfx/cards/zapdos1.pal deleted file mode 100644 index f68430a55ca4759a8f793e27bed099dbeece79e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcma!7mKT~J$RGd!2aEw_ diff --git a/src/gfx/cards/zapdos1.png b/src/gfx/cards/zapdos1.png new file mode 100644 index 0000000000000000000000000000000000000000..321dba71b4cc3917fdd2337e93d8e2969458fa27 GIT binary patch literal 757 zcmV0007rNkl`Y&{L8wh}i zG8PP7QB;%^_|YvZ_VQ)Ot<7vU^379msoJe^zH!zqXNP@}={L*J*^Ye$_vxC*tJmC} zp<~wH;c&_+lHF`?Z@Tp)pJy;*Mdk6$ zb~QJc!8m1@o_Eb}ZN!gz{R~gF;r3TZ5b@Rv3XfI~} zuH8ExaAMGm4~*zWj<@T@&%;*TTfwS&81P)9LnUY zzWDRwM}F|`R%8%RdiN)P{xw?Y<3QB4+nxRQpVixonJftKD!;gq?k^btQI?;?qvEBf zlY8F+s0@P2H?!V{xrNCDL7hK5@O7(w>KWqz)ufJJ*S`pjiI{*&koVEU?^@6DyoONJ z0mJoH{IR(S6ler>Cq9#mvWfsuX2G{-?scq~0IDeP=vZfA9DraO=-AxCgbG1Xq&QpI nFonzt01^P8Dg^-404eZ4av%gEn5oTu00000NkvXXu0mjfxP)?D literal 0 HcmV?d00001 diff --git a/src/gfx/cards/zapdos2.8x6.png b/src/gfx/cards/zapdos2.8x6.png deleted file mode 100644 index 1583f1151b1f606288dda8fb86e74759472ea839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662 zcmV;H0%`q;P);oL_%|dNF=2?I0!v#{XhgK zQ8x!i!GI3+px8l2A@)GRU%{`%L2PISkK@IP+QCiGNgRSva0tZb0RR910DxU^3J>tm z05-q~0Q)2Wz=;wcnDuZV(mp!(@e{pN6O$C!Sd&oe$r7B!ZzgwrPLEtg?Us1Ek}wK# z`$irZS2Yf9gHwd_mMOM_vZ?xN{u zNV*}icKuTd_T{#82G67|a%7zZ;P=z<;6*BuHMI}m=gsd|W*{Oc08|{;ckF?PY}Ppd z#m_9gxFPbqQ~(gk##%QMsomNK(5k(HYOfa>FkUiN8CnFIh&n|=M2Uw?YF0{~FG zUtVZhy{1e6Kp%g3HjWRh5CH&8J1Zty-B~sO0DWh9evp2orvad~qr$Namzo^_!0s#6 zmEjV5*8yO9K?RvSKA>Bd08m%(%~m!%n$O<$@nGf)RP&vV88NX4SXcXC#vP{$u-1Xr zL!cOqK16}$tcJNCptnO)g@KjKEx`0T5QnBRIkfr-`vDwdjL~2{f+@guOz0S}_3cx5 wfOjyMPytx_@HGHpv#$RGd!4NC#^ diff --git a/src/gfx/cards/zapdos2.png b/src/gfx/cards/zapdos2.png new file mode 100644 index 0000000000000000000000000000000000000000..43c116422b98f967e88a1239b83f6cf50c1dab2e GIT binary patch literal 722 zcmV;@0xkWCP)0007INklDr}rVz}8DI}GGoyD1u3m?m-m@p9w8%+Z7Wf1lpu+-wh!Fq*(30S5`XCzf1 z1e4r_JxGzlgc}@0aOW6;EbBqY1O2YHj#>2f80Da+D$y{V~<`;Mm{q}L@+-l%%( zZkGIgWv0=4j=Vgl(N6SnFCXTrSMFbz-ESuv$J6O-GSe_$+K}#EPxb4`XCbPCvu}PS zbT>3?RihQvweLEss6f3EWq(kd&7&7YA8;DKoQ9CPs~tNX+WS!66b0= zRMqoNfB^o9FuJ>w`kI~ne7^At5O~(KSNEf+@*F}Cu&FBt zp?+9VECl{IJgJfETR43C&%V)F^;>Wh==?|F!*7!OFyNkkG7e9zH6{jx(waX<8*d#O zJN1$9&u(tZd@SBVV1K&sAW5EYkRFM>dc&maOPl5>jOxvuVRV|YU4;2kll644B}<2* z9W~8F2V4BLx(IvQO&;p!&+YsUAT+lq%(-yzOYq`aK`Fd^AKabk)bx4v6r}rp1g1Bw z-JEU}Wd0@K_xoqk-15L8yKjSC&WxMoUA()E?5zSxW?U1%d=$$c0JSm3Sm?e$_JOuG zS#6-T*B(m=l)vY%njAX&?4|(lQ4ntjKsoPx#07*qoM6N<$ Ef&&vx%K!iX literal 0 HcmV?d00001 diff --git a/src/gfx/cards/zapdos3.8x6.png b/src/gfx/cards/zapdos3.8x6.png deleted file mode 100644 index 3683243dad751d4f2a2118790683cdd102f29bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmV-P0=E5$P)09SnOq;1CPdS9YYfRk3V7P6Yo zV=Y4t01uan)rrnSDUb;AxO-G_j^y5x2C0I9IGJ&q`94(!i&BV(+{uKVWhsMI0TE4e zr$}jC%p|Bs>xjG4@f*wKkd=U&OJi)FwLb{%^4~zp?kF|KARlDF9ciPBEpgUP{Va%S zqcZ?P90T7A(Hp;>2JW8%T%%8-JkHzut#^6+nC^qDo#U-3-p5Z*5zd#TAr%t?Sa040 zQ+{6>E3z!&?N<$e&{xK`2vQild?3;y)CQLwz#wQsA!OPR;so&rnBq8$b6D1P11I7% z?x{2={c?A8LTO0@^$s!k?)Kz@To^S-zjd<8EXBrfzPGixp_9c1H}*FDzA|WRbg^;$ zu{tLf+fu)Mxbyr`R@ab&0gF^d#+?_J<5pd-z&+c(0KS?_8NM~(YYaSPl XgenG)Ocbo100000NkvXXu0mjfE=>g@ diff --git a/src/gfx/cards/zapdos3.pal b/src/gfx/cards/zapdos3.pal deleted file mode 100644 index fc0facc16f85f753da8033a1bf6cf713b3c36126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Pcmexgzn^J70|Ns95_tmO diff --git a/src/gfx/cards/zapdos3.png b/src/gfx/cards/zapdos3.png new file mode 100644 index 0000000000000000000000000000000000000000..def590cb73b8f2bc716c2de5b92468a2e5e713c1 GIT binary patch literal 626 zcmV-&0*(ENP)00067NklrGAw3j9 zGE!Go5yH|?+UU`M7a4H7m@WZLc+SkWvgyfp+WF?2_h#N>fi49Iwh+#LfFH23v3%VB-F`T#7~x(cG}=I1H2NA{H5yf!wl2Fum?^&w;$l_Ch?MfeDyoO_d^yQ--q%3g z1By4@viuO|MvG=oyooaVu~A5E?HwHIWU*mITL(@_89X*Nu<`qy+7|)aQ?LE7^ZNZn z*N}sOKy>oa*H;(gR$cGVXWu^uj+#rCZZ+t340_7w`Wule^UHlbTh=W`Q&UzDtS9v3 znB^VoTd2`0gQXw(!9{3e-zxHdAwh3Uhe<=8ER+(4!qVi|K~yM_U6S8RQ(+j#A5Y6v6rD0ruPkb~bz@XQOPtOnD*_2NaRnCXUT9wQ zCuC$@g+IcH=SV-m9PK&d98f4p;?Tj@0#-^sRM^>0mIV2BOXNCfk;_hwX$M#;gjZhPDJGbock^> z>n#4V%R9u0f}ncJOtu2wCQ7567%mA5mx7sPuig>pOHDyj8X$PTljTMnt2it6gJ+4k zoR2%9yrk}n@pN|xyqmao<#q*z9KEM~^ld-5^Tz9wl{&s~_MY&mKc>Jd8^1<`qVeiz z`{WpX69zA(IY*#N!g8M`@x&d)gUujxmP|U&;tbTATiL>y)^foS2nMh6 zr1i>{sTSY}I7*$)hP@eZ>wcYD8xyyj<&I#F&(7gD)#4|db2LP*)%s?54yMq2&YXLH zJQ4}CaY8Y(YH>-M`}i;tslC7nU8hO5WX^r4C$WI-cvdtL#f9S7I@}Qh+~FRulsbbPpN-yz=k+JSk+;E(g1XpF~*zKbRz z5z{-iBO!|X5aqYToBw-CV#(-rdm~AR?MR4{ga;$>mBaH7qCb26o+?hl00000NkvXX Hu0mjfIrnbF5R!00002bVXQnXaGS6KO+DD00MMHSaeVTR+xj>0008TNklfrg;SIuR7wPU*fw z5deHo#O6K!fkPJ<;O>#$9HQ+&B(Sos)k))ccdnTeQQgTtpVI4P2;Ugb_H)8%skt2y z>e%Vd-6$ve_Ttw2q_;jRPo{?bA(;0umV7h;?%rZ8wwgnbYk=j#y$QCxw{ljxQ`!&N zO00SNYzq^`k#8AtWeD;v>DrG?8E+OwerD8@A;{{|@m|XzUH>!H(M_(#Axnt6m>O4b z&E3bZJbV;iaRVVw)io1ov zVo4k1<+MzMs?O(y?P78?W9LYVs^dJi6c=N!S2Jxq2WZ6Q7F#a;ip5gXoX|v%>S$0} zE3u&cjN~JZCI|(d|+VF(djtk1}mgn z&e^)DG&=q7%6QU9)8i8Bp*wv7NiM;YE)1)@H|c80h1$79SqQ$jBLD~k60bvJqI3wB zqsT{Cmw+gZiE{h(4fN~Iv`cnKzA@Sl%O)=YHhBb{pl>V~hxuWO;l5fgSJ1u literal 0 HcmV?d00001 diff --git a/src/gfx/duel/anims/51.t10.png b/src/gfx/duel/anims/51.png similarity index 100% rename from src/gfx/duel/anims/51.t10.png rename to src/gfx/duel/anims/51.png diff --git a/src/gfx/duel/cgb_symbols.t7.png b/src/gfx/duel/cgb_symbols.png similarity index 100% rename from src/gfx/duel/cgb_symbols.t7.png rename to src/gfx/duel/cgb_symbols.png diff --git a/src/gfx/duel/dmg_sgb_symbols.t7.png b/src/gfx/duel/dmg_sgb_symbols.png similarity index 100% rename from src/gfx/duel/dmg_sgb_symbols.t7.png rename to src/gfx/duel/dmg_sgb_symbols.png diff --git a/src/gfx/duel/other.t7.png b/src/gfx/duel/other.png similarity index 100% rename from src/gfx/duel/other.t7.png rename to src/gfx/duel/other.png diff --git a/src/gfx/fonts/full_width/4.t3.png b/src/gfx/fonts/full_width/4.png similarity index 100% rename from src/gfx/fonts/full_width/4.t3.png rename to src/gfx/fonts/full_width/4.png diff --git a/src/gfx/overworld_map.t15.png b/src/gfx/overworld_map.png similarity index 100% rename from src/gfx/overworld_map.t15.png rename to src/gfx/overworld_map.png diff --git a/src/gfx/tilesets/challengehall.t3.png b/src/gfx/tilesets/challengehall.png similarity index 100% rename from src/gfx/tilesets/challengehall.t3.png rename to src/gfx/tilesets/challengehall.png diff --git a/src/gfx/tilesets/clubentrance.t15.png b/src/gfx/tilesets/clubentrance.png similarity index 100% rename from src/gfx/tilesets/clubentrance.t15.png rename to src/gfx/tilesets/clubentrance.png diff --git a/src/gfx/tilesets/clublobby.t8.png b/src/gfx/tilesets/clublobby.png similarity index 100% rename from src/gfx/tilesets/clublobby.t8.png rename to src/gfx/tilesets/clublobby.png diff --git a/src/gfx/tilesets/fightingclub.t13.png b/src/gfx/tilesets/fightingclub.png similarity index 100% rename from src/gfx/tilesets/fightingclub.t13.png rename to src/gfx/tilesets/fightingclub.png diff --git a/src/gfx/tilesets/fireclub.t9.png b/src/gfx/tilesets/fireclub.png similarity index 100% rename from src/gfx/tilesets/fireclub.t9.png rename to src/gfx/tilesets/fireclub.png diff --git a/src/gfx/tilesets/grassclub.t9.png b/src/gfx/tilesets/grassclub.png similarity index 100% rename from src/gfx/tilesets/grassclub.t9.png rename to src/gfx/tilesets/grassclub.png diff --git a/src/gfx/tilesets/hallofhonor.t7.png b/src/gfx/tilesets/hallofhonor.png similarity index 100% rename from src/gfx/tilesets/hallofhonor.t7.png rename to src/gfx/tilesets/hallofhonor.png diff --git a/src/gfx/tilesets/ishihara.t3.png b/src/gfx/tilesets/ishihara.png similarity index 100% rename from src/gfx/tilesets/ishihara.t3.png rename to src/gfx/tilesets/ishihara.png diff --git a/src/gfx/tilesets/lightningclub.t13.png b/src/gfx/tilesets/lightningclub.png similarity index 100% rename from src/gfx/tilesets/lightningclub.t13.png rename to src/gfx/tilesets/lightningclub.png diff --git a/src/gfx/tilesets/masonlaboratory.t9.png b/src/gfx/tilesets/masonlaboratory.png similarity index 100% rename from src/gfx/tilesets/masonlaboratory.t9.png rename to src/gfx/tilesets/masonlaboratory.png diff --git a/src/gfx/tilesets/pokemondome.t1.png b/src/gfx/tilesets/pokemondome.png similarity index 100% rename from src/gfx/tilesets/pokemondome.t1.png rename to src/gfx/tilesets/pokemondome.png diff --git a/src/gfx/tilesets/pokemondomeentrance.t2.png b/src/gfx/tilesets/pokemondomeentrance.png similarity index 100% rename from src/gfx/tilesets/pokemondomeentrance.t2.png rename to src/gfx/tilesets/pokemondomeentrance.png diff --git a/src/gfx/tilesets/psychicclub.t6.png b/src/gfx/tilesets/psychicclub.png similarity index 100% rename from src/gfx/tilesets/psychicclub.t6.png rename to src/gfx/tilesets/psychicclub.png diff --git a/src/gfx/tilesets/rockclub.t4.png b/src/gfx/tilesets/rockclub.png similarity index 100% rename from src/gfx/tilesets/rockclub.t4.png rename to src/gfx/tilesets/rockclub.png diff --git a/src/gfx/tilesets/scienceclub.t14.png b/src/gfx/tilesets/scienceclub.png similarity index 100% rename from src/gfx/tilesets/scienceclub.t14.png rename to src/gfx/tilesets/scienceclub.png diff --git a/src/gfx/tilesets/waterclub.t15.png b/src/gfx/tilesets/waterclub.png similarity index 100% rename from src/gfx/tilesets/waterclub.t15.png rename to src/gfx/tilesets/waterclub.png diff --git a/src/gfx/titlescreen/titlescreen1.t15.png b/src/gfx/titlescreen/titlescreen1.png similarity index 100% rename from src/gfx/titlescreen/titlescreen1.t15.png rename to src/gfx/titlescreen/titlescreen1.png diff --git a/src/gfx/titlescreen/titlescreen2.t15.png b/src/gfx/titlescreen/titlescreen2.png similarity index 100% rename from src/gfx/titlescreen/titlescreen2.t15.png rename to src/gfx/titlescreen/titlescreen2.png diff --git a/src/gfx/titlescreen/titlescreen3.t12.png b/src/gfx/titlescreen/titlescreen3.png similarity index 100% rename from src/gfx/titlescreen/titlescreen3.t12.png rename to src/gfx/titlescreen/titlescreen3.png diff --git a/src/gfx/titlescreen/titlescreen4.t5.png b/src/gfx/titlescreen/titlescreen4.png similarity index 100% rename from src/gfx/titlescreen/titlescreen4.t5.png rename to src/gfx/titlescreen/titlescreen4.png diff --git a/src/gfx/titlescreen/titlescreen5.t4.png b/src/gfx/titlescreen/titlescreen5.png similarity index 100% rename from src/gfx/titlescreen/titlescreen5.t4.png rename to src/gfx/titlescreen/titlescreen5.png diff --git a/src/gfx/titlescreen/titlescreen6.t12.png b/src/gfx/titlescreen/titlescreen6.png similarity index 100% rename from src/gfx/titlescreen/titlescreen6.t12.png rename to src/gfx/titlescreen/titlescreen6.png From 0b5fd66db9a00876d77e62f71c30f8c87cf0d421 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Mon, 14 Dec 2020 11:55:21 -0600 Subject: [PATCH 14/45] Makefile: always compare by default --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index b78a54e9..c5b5265f 100644 --- a/Makefile +++ b/Makefile @@ -32,8 +32,8 @@ RGBLINK ?= $(RGBDS)rgblink .SECONDARY: .PHONY: all tcg clean tidy compare tools -all: $(rom) -tcg: $(rom) +all: $(rom) compare +tcg: $(rom) compare clean: tidy find src/gfx \( -iname '*.1bpp' -o -iname '*.2bpp' -o -iname '*.pal' \) -delete From de98637af1bbb51d98cfdfc1555ce6f205f45401 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Mon, 14 Dec 2020 12:02:36 -0600 Subject: [PATCH 15/45] Clean up whitespace --- .gitignore | 2 +- src/data/map_objects.asm | 1 - src/engine/bank02.asm | 1 - src/engine/bank03.asm | 552 ++++++++++++++++---------------- src/engine/bank06.asm | 6 +- src/engine/effect_functions.asm | 45 ++- src/engine/home.asm | 2 +- src/wram.asm | 4 +- 8 files changed, 299 insertions(+), 314 deletions(-) diff --git a/.gitignore b/.gitignore index 733a3f36..8a5dcde3 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ *.pal # *disasm.py output file -*disasm_output.asm \ No newline at end of file +*disasm_output.asm diff --git a/src/data/map_objects.asm b/src/data/map_objects.asm index 4749a197..069b12d4 100644 --- a/src/data/map_objects.asm +++ b/src/data/map_objects.asm @@ -538,7 +538,6 @@ PokemonDomeEntranceObjects: ; 13e5e (3:7e5e) tx Text0500 tx Text04ff - db NORTH, 2, 8 dw PrintInteractableObjectText tx Text0502 diff --git a/src/engine/bank02.asm b/src/engine/bank02.asm index eefd7077..3cee5df8 100644 --- a/src/engine/bank02.asm +++ b/src/engine/bank02.asm @@ -191,7 +191,6 @@ DuelCheckMenu_OppPlayArea: ; 80da (2:40da) call DrawYourOrOppPlayArea_DrawArrows call DrawWideTextBox - ; reset cursor blink xor a ld [wCheckMenuCursorBlinkCounter], a diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 58367e25..efd2b8e0 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -3439,48 +3439,48 @@ Script_d827: ; d827 (3:5827) ; 0xd82d INCROM $d82d, $d834 - + AfterTutorialBattleScript: ; d834 (3:5834) - start_script - run_command ScriptCommand_PrintTextString - tx Text05eb - run_command ScriptCommand_PrintTextString - tx Text05ef - run_command ScriptCommand_CloseTextBox - run_command ScriptCommand_MoveActiveNPC - dw NPCMovement_d896 - run_command ScriptCommand_SetPlayerDirection - db NORTH - run_command ScriptCommand_MovePlayer - db NORTH - db $01 - run_command ScriptCommand_MovePlayer - db NORTH - db $01 - run_command ScriptCommand_MovePlayer - db NORTH - db $01 - run_command ScriptCommand_SetPlayerDirection - db EAST - run_command ScriptCommand_MovePlayer - db EAST - db $01 - run_command ScriptCommand_MovePlayer - db EAST - db $01 - run_command ScriptCommand_SetPlayerDirection - db NORTH - run_command ScriptCommand_PrintTextString - tx Text05f0 - run_command ScriptCommand_CloseTextBox - run_command Func_ccdc - tx Text05f1 - run_command ScriptCommand_CloseTextBox - run_command ScriptCommand_PrintTextString - tx Text05f2 - run_command Func_d271 + start_script + run_command ScriptCommand_PrintTextString + tx Text05eb + run_command ScriptCommand_PrintTextString + tx Text05ef + run_command ScriptCommand_CloseTextBox + run_command ScriptCommand_MoveActiveNPC + dw NPCMovement_d896 + run_command ScriptCommand_SetPlayerDirection + db NORTH + run_command ScriptCommand_MovePlayer + db NORTH + db $01 + run_command ScriptCommand_MovePlayer + db NORTH + db $01 + run_command ScriptCommand_MovePlayer + db NORTH + db $01 + run_command ScriptCommand_SetPlayerDirection + db EAST + run_command ScriptCommand_MovePlayer + db EAST + db $01 + run_command ScriptCommand_MovePlayer + db EAST + db $01 + run_command ScriptCommand_SetPlayerDirection + db NORTH + run_command ScriptCommand_PrintTextString + tx Text05f0 + run_command ScriptCommand_CloseTextBox + run_command Func_ccdc + tx Text05f1 + run_command ScriptCommand_CloseTextBox + run_command ScriptCommand_PrintTextString + tx Text05f2 + run_command Func_d271 ; 0xd860 - + INCROM $d860, $d880 NPCMovement_d880: ; d880 (3:5880) @@ -3512,7 +3512,7 @@ NPCMovement_d88b: ; d88b (3:588b) NPCMovement_d894: ; d894 (4:5894) db SOUTH | NO_MOVE db $ff - + NPCMovement_d896: ; d896 (3:5896) db NORTH db NORTH @@ -3847,6 +3847,7 @@ FightingClubLobbyAfterDuel: ; dc68 (3:5c68) ld hl, .after_duel_table call FindEndOfBattleScript ret + .after_duel_table db NPC_IMAKUNI db NPC_IMAKUNI @@ -3984,12 +3985,10 @@ Script_Butch: ; dd8d (3:5d8d) Script_Granny1: ; dd9f (3:5d9f) INCROM $dd9f, $dda3 - - FightingClubAfterDuel: ; dda3 (3:5da3) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xddaa .after_duel_table @@ -4017,149 +4016,147 @@ FightingClubAfterDuel: ; dda3 (3:5da3) ; ddc3 Script_Mitch: ; ddc3 (3:5dc3) - start_script - run_command ScriptCommand_TryGivePCPack - db $02 - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_0F - dw Script_Mitch_AlreadyHaveMedal - run_command ScriptCommand_JumpBasedOnFightingClubPupilStatus - dw .first_interaction - dw .three_pupils_remaining - dw .two_pupils_remaining - dw .one_pupil_remaining - dw .all_pupils_defeated + start_script + run_command ScriptCommand_TryGivePCPack + db $02 + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_0F + dw Script_Mitch_AlreadyHaveMedal + run_command ScriptCommand_JumpBasedOnFightingClubPupilStatus + dw .first_interaction + dw .three_pupils_remaining + dw .two_pupils_remaining + dw .one_pupil_remaining + dw .all_pupils_defeated .first_interaction - run_command ScriptCommand_PrintTextString - tx Text0477 - run_command ScriptCommand_SetFlagValue - db EVENT_FLAG_11 - db $01 - run_command ScriptCommand_SetFlagValue - db EVENT_FLAG_17 - db $01 - run_command ScriptCommand_SetFlagValue - db EVENT_FLAG_20 - db $01 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text0477 + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_11 + db $01 + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_17 + db $01 + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_20 + db $01 + run_command ScriptCommand_QuitScriptFully ; 0xdde2 .three_pupils_remaining - run_command ScriptCommand_PrintTextQuitFully - tx Text0478 + run_command ScriptCommand_PrintTextQuitFully + tx Text0478 ; 0xdde5 .two_pupils_remaining - run_command ScriptCommand_PrintTextQuitFully - tx Text0479 + run_command ScriptCommand_PrintTextQuitFully + tx Text0479 ; 0xdde8 .one_pupil_remaining - run_command ScriptCommand_PrintTextQuitFully - tx Text047a + run_command ScriptCommand_PrintTextQuitFully + tx Text047a ; 0xddeb .all_pupils_defeated - run_command ScriptCommand_PrintTextString - tx Text047b - run_command ScriptCommand_AskQuestionJump - tx Text047c - dw .do_battle - run_command ScriptCommand_PrintTextString - tx Text047d - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text047b + run_command ScriptCommand_AskQuestionJump + tx Text047c + dw .do_battle + run_command ScriptCommand_PrintTextString + tx Text047d + run_command ScriptCommand_QuitScriptFully ; 0xddf7 .do_battle - run_command ScriptCommand_PrintTextString - tx Text047e - run_command ScriptCommand_StartBattle - db PRIZES_6 - db FIRST_STRIKE_DECK_ID - db MUSIC_DUEL_THEME_2 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text047e + run_command ScriptCommand_StartBattle + db PRIZES_6 + db FIRST_STRIKE_DECK_ID + db MUSIC_DUEL_THEME_2 + run_command ScriptCommand_QuitScriptFully ; 0xddff Script_BeatMitch: ; ddff (3:5dff) - start_script - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_0F - dw Script_Mitch_GiveBoosters - run_command ScriptCommand_PrintTextString - tx Text047f - run_command ScriptCommand_MaxOutFlagValue - db EVENT_FLAG_0F - run_command ScriptCommand_TryGiveMedalPCPacks - run_command Func_d125 - db $0f - run_command Func_d435 - db $01 - run_command ScriptCommand_PrintTextString - tx Text0480 - run_command ScriptCommand_GiveBoosterPacks - db BOOSTER_LABORATORY_NEUTRAL - db BOOSTER_LABORATORY_NEUTRAL - db NO_BOOSTER - run_command ScriptCommand_PrintTextString - tx Text0481 - run_command ScriptCommand_QuitScriptFully + start_script + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_0F + dw Script_Mitch_GiveBoosters + run_command ScriptCommand_PrintTextString + tx Text047f + run_command ScriptCommand_MaxOutFlagValue + db EVENT_FLAG_0F + run_command ScriptCommand_TryGiveMedalPCPacks + run_command Func_d125 + db $0f + run_command Func_d435 + db $01 + run_command ScriptCommand_PrintTextString + tx Text0480 + run_command ScriptCommand_GiveBoosterPacks + db BOOSTER_LABORATORY_NEUTRAL + db BOOSTER_LABORATORY_NEUTRAL + db NO_BOOSTER + run_command ScriptCommand_PrintTextString + tx Text0481 + run_command ScriptCommand_QuitScriptFully ; 0xde19 Script_LoseToMitch: ; de19 (3:5e19) - start_script - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_0F - dw Script_Mitch_PrintTrainHarderText - run_command ScriptCommand_PrintTextQuitFully - tx Text0482 + start_script + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_0F + dw Script_Mitch_PrintTrainHarderText + run_command ScriptCommand_PrintTextQuitFully + tx Text0482 ; 0xde21 -Script_Mitch_AlreadyHaveMedal: ; 0xde21 - run_command ScriptCommand_PrintTextString - tx Text0483 - run_command ScriptCommand_AskQuestionJump - tx Text047c - dw .do_battle - run_command ScriptCommand_PrintTextString - tx Text0484 - run_command ScriptCommand_QuitScriptFully +Script_Mitch_AlreadyHaveMedal: ; de21 (3:5e21) + run_command ScriptCommand_PrintTextString + tx Text0483 + run_command ScriptCommand_AskQuestionJump + tx Text047c + dw .do_battle + run_command ScriptCommand_PrintTextString + tx Text0484 + run_command ScriptCommand_QuitScriptFully ; 0xde2d .do_battle - run_command ScriptCommand_PrintTextString - tx Text0485 - run_command ScriptCommand_StartBattle - db PRIZES_6 - db FIRST_STRIKE_DECK_ID - db MUSIC_DUEL_THEME_2 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text0485 + run_command ScriptCommand_StartBattle + db PRIZES_6 + db FIRST_STRIKE_DECK_ID + db MUSIC_DUEL_THEME_2 + run_command ScriptCommand_QuitScriptFully ; 0xde35 -Script_Mitch_GiveBoosters: - run_command ScriptCommand_PrintTextString - tx Text0486 - run_command ScriptCommand_GiveBoosterPacks - db BOOSTER_LABORATORY_NEUTRAL - db BOOSTER_LABORATORY_NEUTRAL - db NO_BOOSTER - run_command ScriptCommand_PrintTextString - tx Text0487 - run_command ScriptCommand_QuitScriptFully +Script_Mitch_GiveBoosters: ; de35 (3:5e35) + run_command ScriptCommand_PrintTextString + tx Text0486 + run_command ScriptCommand_GiveBoosterPacks + db BOOSTER_LABORATORY_NEUTRAL + db BOOSTER_LABORATORY_NEUTRAL + db NO_BOOSTER + run_command ScriptCommand_PrintTextString + tx Text0487 + run_command ScriptCommand_QuitScriptFully ; 0xde40 -Script_Mitch_PrintTrainHarderText: - run_command ScriptCommand_PrintTextQuitFully - tx Text0488 +Script_Mitch_PrintTrainHarderText: ; de40 (3:5e40) + run_command ScriptCommand_PrintTextQuitFully + tx Text0488 ; 0xde43 INCROM $de43, $ded1 - + Script_Clerk2: ; ded1 (3:5ed1) INCROM $ded1, $ded5 - RockClubLobbyAfterDuel: ; ded5 (3:5ed5) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xdedc .after_duel_table - db NPC_CHRIS db NPC_CHRIS dw $5f0c @@ -4173,7 +4170,7 @@ RockClubLobbyAfterDuel: ; ded5 (3:5ed5) ; 0xdee9 INCROM $dee9, $def2 - + Script_Chris: ; def2 (3:5ef2) INCROM $def2, $df39 @@ -4201,11 +4198,10 @@ Script_Gene: ; e03e (3:603e) Script_Clerk3: ; e09e (3:609e) INCROM $e09e, $e0a2 - WaterClubLobbyAfterDuel: ; e0a2 (3:60a2) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xe0a9 .after_duel_table @@ -4216,7 +4212,6 @@ WaterClubLobbyAfterDuel: ; e0a2 (3:60a2) db $00 ; 0xe0b0 - Preload_ImakuniInWaterClubLobby: ; e0b0 (3:60b0) get_flag_value EVENT_IMAKUNI_STATE cp IMAKUNI_TALKED @@ -4855,9 +4850,9 @@ Script_Clerk4: ; e369 (3:6369) INCROM $e369, $e36d LightningClubLobbyAfterDuel: ; e36d (3:636d) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xe374 .after_duel_table @@ -5492,15 +5487,13 @@ ScriptJump_FinishedSecondRonaldFight: ; e959 (3:6959) run_command ScriptCommand_QuitScriptFully ; 0xe963 - PsychicClubLobbyAfterDuel: ; e963 (3:6963) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xe96a .after_duel_table - db NPC_ROBERT db NPC_ROBERT dw $6995 @@ -5508,16 +5501,16 @@ PsychicClubLobbyAfterDuel: ; e963 (3:6963) db $00 INCROM $e971, $e980 - + Script_Robert: ; e980 (3:6980) INCROM $e980, $e9a5 - + Script_Pappy1: ; e9a5 (3:69a5) INCROM $e9a5, $ea30 Script_Gal3: ; ea30 (3:6a30) INCROM $ea30, $ea3b - + Script_Chap4: ; ea3b (3:6a3b) INCROM $ea3b, $ea60 @@ -5526,25 +5519,23 @@ Script_Daniel: ; ea60 (3:6a60) Script_Stephanie: ; eaa2 (3:6aa2) INCROM $eaa2, $eadf - + Script_Murray2: ; eadf (3:6adf) INCROM $eadf, $eadf Script_Murray1: ; eadf (3:6adf) INCROM $eadf, $eb53 - + Script_Clerk7: ; eb53 (3:6b53) INCROM $eb53, $eb57 - ScienceClubLobbyAfterDuel:; eb57 (3:6b57) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xeb5e .after_duel_table - db NPC_IMAKUNI db NPC_IMAKUNI dw Script_BeatImakuni @@ -5553,7 +5544,7 @@ ScienceClubLobbyAfterDuel:; eb57 (3:6b57) ; 0xeb65 INCROM $eb65, $eb84 - + Script_Lad1: ; eb84 (3:6b84) INCROM $eb84, $ebc1 @@ -5582,9 +5573,9 @@ Script_Clerk8: ; ed45 (3:6d45) INCROM $ed45, $ed49 FireClubLobbyAfterDuel: ; ed49 (3:6d49) - ld hl, .after_duel_table - call FindEndOfBattleScript - ret + ld hl, .after_duel_table + call FindEndOfBattleScript + ret ; 0xed50 .after_duel_table @@ -5677,8 +5668,7 @@ Script_ee76: ; ee76 (3:6e76) Script_Mania: ; ee88 (3:6e88) INCROM $ee88, $ee93 - -FireClubAfterDuel: ;ee93 (3:6e93) +FireClubAfterDuel: ; ee93 (3:6e93) ld hl, .after_duel_table call FindEndOfBattleScript ret @@ -5686,18 +5676,18 @@ FireClubAfterDuel: ;ee93 (3:6e93) .after_duel_table db NPC_JOHN db NPC_JOHN - dw $6ec8 + dw $6ec8 dw $6ed4 - + db NPC_ADAM db NPC_ADAM - dw $6eed - dw $6ef9 + dw $6eed + dw $6ef9 db NPC_JONATHAN db NPC_JONATHAN - dw $6f12 - dw $6f1e + dw $6f12 + dw $6f1e db NPC_KEN db NPC_KEN @@ -5717,111 +5707,109 @@ Script_Jonathan: ; eefd (3:6efd) INCROM $eefd, $ef22 Script_Ken: ; ef22 (3:6f22) - start_script - run_command ScriptCommand_TryGivePCPack - db $09 - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_23 - dw .have_300_cards - run_command ScriptCommand_CheckRawAmountOfCardsOwned - dw 300 - dw .have_300_cards - run_command ScriptCommand_JumpIfFlagZero1 - db EVENT_FLAG_24 - dw NO_JUMP - run_command ScriptCommand_PrintVariableText - tx Text06ba - tx Text06bb - run_command ScriptCommand_SetFlagValue - db EVENT_FLAG_24 - db $01 - run_command ScriptCommand_QuitScriptFully + start_script + run_command ScriptCommand_TryGivePCPack + db $09 + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_23 + dw .have_300_cards + run_command ScriptCommand_CheckRawAmountOfCardsOwned + dw 300 + dw .have_300_cards + run_command ScriptCommand_JumpIfFlagZero1 + db EVENT_FLAG_24 + dw NO_JUMP + run_command ScriptCommand_PrintVariableText + tx Text06ba + tx Text06bb + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_24 + db $01 + run_command ScriptCommand_QuitScriptFully .have_300_cards - run_command ScriptCommand_MaxOutFlagValue - db EVENT_FLAG_23 - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_0A - dw Script_KenBattle_AlreadyHaveMedal - run_command ScriptCommand_JumpIfFlagZero1 - db EVENT_FLAG_24 - dw NO_JUMP - run_command ScriptCommand_PrintVariableText - tx Text06bc - tx Text06bd - run_command ScriptCommand_SetFlagValue - db EVENT_FLAG_24 - db $01 - run_command ScriptCommand_AskQuestionJump - tx Text06be - dw .do_battle - run_command ScriptCommand_PrintTextString - tx Text06bf - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_MaxOutFlagValue + db EVENT_FLAG_23 + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_0A + dw Script_KenBattle_AlreadyHaveMedal + run_command ScriptCommand_JumpIfFlagZero1 + db EVENT_FLAG_24 + dw NO_JUMP + run_command ScriptCommand_PrintVariableText + tx Text06bc + tx Text06bd + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_24 + db $01 + run_command ScriptCommand_AskQuestionJump + tx Text06be + dw .do_battle + run_command ScriptCommand_PrintTextString + tx Text06bf + run_command ScriptCommand_QuitScriptFully .do_battle - run_command ScriptCommand_PrintTextString - tx Text06c0 - run_command ScriptCommand_StartBattle - db PRIZES_6 - db FIRE_CHARGE_DECK_ID - db MUSIC_DUEL_THEME_2 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text06c0 + run_command ScriptCommand_StartBattle + db PRIZES_6 + db FIRE_CHARGE_DECK_ID + db MUSIC_DUEL_THEME_2 + run_command ScriptCommand_QuitScriptFully ; 0xef5e Script_BeatKen: ; ef5e (3:6f5e) - start_script - run_command ScriptCommand_PrintTextString - tx Text06c1 - run_command ScriptCommand_JumpIfFlagNonzero2 - db EVENT_FLAG_0A - dw .give_booster_packs - run_command ScriptCommand_MaxOutFlagValue - db EVENT_FLAG_0A - run_command ScriptCommand_TryGiveMedalPCPacks - run_command Func_d125 - db $0a - run_command Func_d435 - db $08 - run_command ScriptCommand_PrintTextString - tx Text06c2 + start_script + run_command ScriptCommand_PrintTextString + tx Text06c1 + run_command ScriptCommand_JumpIfFlagNonzero2 + db EVENT_FLAG_0A + dw .give_booster_packs + run_command ScriptCommand_MaxOutFlagValue + db EVENT_FLAG_0A + run_command ScriptCommand_TryGiveMedalPCPacks + run_command Func_d125 + db $0a + run_command Func_d435 + db $08 + run_command ScriptCommand_PrintTextString + tx Text06c2 .give_booster_packs - run_command ScriptCommand_GiveBoosterPacks - db BOOSTER_MYSTERY_NEUTRAL - db BOOSTER_MYSTERY_NEUTRAL - db NO_BOOSTER - run_command ScriptCommand_PrintTextString - tx Text06c3 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_GiveBoosterPacks + db BOOSTER_MYSTERY_NEUTRAL + db BOOSTER_MYSTERY_NEUTRAL + db NO_BOOSTER + run_command ScriptCommand_PrintTextString + tx Text06c3 + run_command ScriptCommand_QuitScriptFully ; 0xef78 - - Script_LoseToKen: ; ef78 (3:6f78) - start_script - run_command ScriptCommand_JumpIfFlagZero2 - db EVENT_FLAG_0A - dw NO_JUMP - run_command ScriptCommand_PrintVariableText - tx Text06c4 - tx Text06c5 - run_command ScriptCommand_QuitScriptFully + start_script + run_command ScriptCommand_JumpIfFlagZero2 + db EVENT_FLAG_0A + dw NO_JUMP + run_command ScriptCommand_PrintVariableText + tx Text06c4 + tx Text06c5 + run_command ScriptCommand_QuitScriptFully ; 0xef83 Script_KenBattle_AlreadyHaveMedal: ; ef83 (3:6f83) - run_command ScriptCommand_PrintTextString - tx Text06c6 - run_command ScriptCommand_AskQuestionJump - tx Text06be - dw .do_battle - run_command ScriptCommand_PrintTextQuitFully - tx Text06bf + run_command ScriptCommand_PrintTextString + tx Text06c6 + run_command ScriptCommand_AskQuestionJump + tx Text06be + dw .do_battle + run_command ScriptCommand_PrintTextQuitFully + tx Text06bf .do_battle - run_command ScriptCommand_PrintTextString - tx Text06c7 - run_command ScriptCommand_StartBattle - db PRIZES_6 - db FIRE_CHARGE_DECK_ID - db MUSIC_DUEL_THEME_2 - run_command ScriptCommand_QuitScriptFully + run_command ScriptCommand_PrintTextString + tx Text06c7 + run_command ScriptCommand_StartBattle + db PRIZES_6 + db FIRE_CHARGE_DECK_ID + db MUSIC_DUEL_THEME_2 + run_command ScriptCommand_QuitScriptFully ; 0xef96 Preload_Clerk9: ; ef96 (3:6f96) diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 78336759..75916c4e 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -1523,10 +1523,10 @@ Func_19a12: ; 19a12 (6:5a12) ; 0x19a1f INCROM $19a1f, $19c20 - + Func_19c20: ; 19c20 (6:5c20) - INCROM $19c20, $1a4cf - + INCROM $19c20, $1a4cf + Func_1a4cf: ; 1a4cf (6:64cf) INCROM $1a4cf, $1a61f diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 4ed3dbea..896d03cb 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -727,34 +727,33 @@ Func_2cbfb: ; 2cbfb (b:4bfb) ; 0x2cc0a INCROM $2cc0a, $2f4e1 - + ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) - call SwapTurn - call CreateHandCardList - call SortCardsInDuelTempListByID - ld hl, wDuelTempList + call SwapTurn + call CreateHandCardList + call SortCardsInDuelTempListByID + ld hl, wDuelTempList .return_hand_to_deck_loop - ld a, [hli] - cp $ff - jr z, .shuffle - call RemoveCardFromHand - call ReturnCardToDeck - jr .return_hand_to_deck_loop + ld a, [hli] + cp $ff + jr z, .shuffle + call RemoveCardFromHand + call ReturnCardToDeck + jr .return_hand_to_deck_loop .shuffle - call Func_2c0bd - ld a, $07 - bank1call $4935 - ld c, $07 + call Func_2c0bd + ld a, $07 + bank1call $4935 + ld c, $07 .draw_loop - call DrawCardFromDeck - jr c, .revert_turn_to_user - call AddCardToHand - dec c - jr nz, .draw_loop + call DrawCardFromDeck + jr c, .revert_turn_to_user + call AddCardToHand + dec c + jr nz, .draw_loop .revert_turn_to_user - call SwapTurn - ret + call SwapTurn + ret ; 0x2f513 - INCROM $2f513, $30000 diff --git a/src/engine/home.asm b/src/engine/home.asm index 90b0af19..860e5514 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -11461,7 +11461,7 @@ DrawSpriteAnimationFrame: ; 3cc4 (0:3cc4) call BankswitchROM ret -; Loads a pointer to the current animation frame into SPRITE_ANIM_FRAME_DATA_POINTER using +; Loads a pointer to the current animation frame into SPRITE_ANIM_FRAME_DATA_POINTER using ; the current frame's offset ; [wd4ca] - current frame offset ; wTempPointer* - Pointer to current Animation diff --git a/src/wram.asm b/src/wram.asm index bb1f3465..9797034d 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -2321,10 +2321,10 @@ wd4b0:: ; d4b0 wd4b1:: ; d4b1 ds $1 - + wd4b2:: ; d4b2 ds $1 - + ds $b wd4be:: ; d4be From f4d31e19b0de7c9390f5645b551212ce2696b7b5 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Mon, 14 Dec 2020 13:03:18 -0600 Subject: [PATCH 16/45] Clean up some address comments --- src/engine/bank01.asm | 26 ++++++-------- src/engine/bank02.asm | 30 ++++++++-------- src/engine/bank03.asm | 41 +++------------------- src/engine/bank04.asm | 2 +- src/engine/bank05.asm | 6 ++-- src/engine/bank06.asm | 62 ++++++++++++++++----------------- src/engine/bank07.asm | 5 +-- src/engine/booster_packs.asm | 4 +-- src/engine/effect_functions.asm | 4 +-- src/engine/home.asm | 30 ++++++++-------- src/wram.asm | 10 +++--- 11 files changed, 93 insertions(+), 127 deletions(-) diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index c4a6b27a..40c3edf5 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -1019,7 +1019,7 @@ HandleEnergyDiscardMenuInput: ; 46b7 (1:46b7) scf ret -EnergyDiscardCardListParameters: +EnergyDiscardCardListParameters: ; 46f3 (1:46f3) db 1, 5 ; cursor x, cursor y db 4 ; item x db 14 ; maximum length, in tiles, occupied by the name and level string of each card in the list @@ -1161,7 +1161,7 @@ OpenMovePage: ; 478b (1:478b) jr z, .loop ret -AttackMenuParameters: +AttackMenuParameters: ; 47e4 (1:47e4) db 1, 13 ; cursor x, cursor y db 2 ; y displacement between items db 2 ; number of items @@ -1554,7 +1554,7 @@ PrintNumberOfHandAndDeckCards: ; 49ed (1:49ed) jr nz, PrintOpponentNumberOfHandAndDeckCards ; fallthrough -PrintPlayerNumberOfHandAndDeckCards: +PrintPlayerNumberOfHandAndDeckCards: ; 49f3 (1:49f3) ld a, [wPlayerNumberOfCardsInHand] ld hl, wNumCardsBeingDrawn add [hl] @@ -1572,7 +1572,7 @@ PrintPlayerNumberOfHandAndDeckCards: lb bc, 10, 10 jp WriteTwoDigitNumberInTxSymbolFormat -PrintOpponentNumberOfHandAndDeckCards: +PrintOpponentNumberOfHandAndDeckCards: ; 4a14 (1:4a14) ld a, [wOpponentNumberOfCardsInHand] ld hl, wNumCardsBeingDrawn add [hl] @@ -1590,7 +1590,7 @@ PrintOpponentNumberOfHandAndDeckCards: lb bc, 11, 3 jp WriteTwoDigitNumberInTxSymbolFormat -DeckAndHandIconsTileData: +DeckAndHandIconsTileData: ; 4a35 (1:4a35) ; x, y, tiles[], 0 db 4, 3, SYM_CROSS, 0 ; x for opponent's hand db 10, 3, SYM_CROSS, 0 ; x for opponent's deck @@ -1606,7 +1606,7 @@ DeckAndHandIconsTileData: db 13, 10, $fa, $fb, 0 ; player's hand icon db $ff -DeckAndHandIconsCGBPalData: +DeckAndHandIconsCGBPalData: ; 4a6e (1:4a6e) ; x, y, pals[], 0 db 8, 2, $02, $02, 0 db 8, 3, $02, $02, 0 @@ -2134,7 +2134,7 @@ DisplayNoBasicPokemonInHandScreen: ; 4e06 (1:4e06) call WaitForWideTextBoxInput ret -NoBasicPokemonCardListParameters: +NoBasicPokemonCardListParameters: ; 4e37 (1:4e37) db 1, 3 ; cursor x, cursor y db 4 ; item x db 14 ; maximum length, in tiles, occupied by the name and level string of each card in the list @@ -3061,7 +3061,7 @@ PracticeDuelVerify_Turn7Or8: ; 54b7 (1:54b7) jr nz, ReturnWrongAction ret -ReturnWrongAction: +ReturnWrongAction: ; 54c6 (1:54c6) scf ret @@ -3230,7 +3230,7 @@ InitAndDrawCardListScreenLayout: ; 559a (1:559a) ; same as InitAndDrawCardListScreenLayout, except that variables like wSelectedDuelSubMenuItem, ; wNoItemSelectionMenuKeys, wCardListInfoBoxText, wCardListHeaderText, etc already set by caller. -DrawCardListScreenLayout: +DrawCardListScreenLayout: ; 55be (1:55be) call ZeroObjectPositionsAndToggleOAMCopy call EmptyScreen call LoadSymbolsFont @@ -5170,7 +5170,7 @@ Func_6137: ; 6137 (1:6137) call EraseCursor ; fallthrough -Func_615c: +Func_615c: ; 615c (1:615c) ld a, [wCurrentDuelMenuItem] ld d, a add a @@ -5194,7 +5194,7 @@ Func_616e: ; 616e (1:616e) call EnableLCD ; fallthrough -Func_6186: +Func_6186: ; 6186 (1:6186) ld hl, wCurPlayAreaSlot ldh a, [hTempPlayAreaLocation_ff9d] ld [hli], a @@ -6945,7 +6945,6 @@ Func_6cfa: ; 6cfa (1:6cfa) pop hl call WaitForWideTextBoxInput ret -; 0x6d3f Func_6d3f: ; 6d3f (1:6d3f) or a @@ -6985,7 +6984,6 @@ Func_6d3f: ; 6d3f (1:6d3f) pop af pop hl ret -; 0x6d84 ; given the deck index of a turn holder's card in register a, ; and a pointer in hl to the wLoadedCard* buffer where the card data is loaded, @@ -8042,7 +8040,6 @@ PlayMoveAnimation: ; 7494 (1:7494) Func_7571: ; 7571 (1:7571) farcall Func_19c20 ret -; 0x7576 Func_7576: ; 7576 (1:7576) farcall Func_1991f @@ -8054,7 +8051,6 @@ Func_7576: ; 7576 (1:7576) Func_758f: ; 758f (1:758f) farcall Func_1a4cf ret -; 0x7594 Func_7594: ; 7594 (1:7594) farcall Func_1a61f diff --git a/src/engine/bank02.asm b/src/engine/bank02.asm index 3cee5df8..1e6179b4 100644 --- a/src/engine/bank02.asm +++ b/src/engine/bank02.asm @@ -105,7 +105,7 @@ OpenYourOrOppPlayAreaScreen_TurnHolderPlayArea: ; 809e (2:409e) ldh [hWhoseTurn], a ret -OpenYourOrOppPlayAreaScreen_NonTurnHolderPlayArea: +OpenYourOrOppPlayAreaScreen_NonTurnHolderPlayArea: ; 80a8 (2:40a8) ldh a, [hWhoseTurn] push af bank1call OpenNonTurnHolderPlayAreaScreen @@ -113,7 +113,7 @@ OpenYourOrOppPlayAreaScreen_NonTurnHolderPlayArea: ldh [hWhoseTurn], a ret -OpenYourOrOppPlayAreaScreen_TurnHolderHand: +OpenYourOrOppPlayAreaScreen_TurnHolderHand: ; 80b2 (2:40b2) ldh a, [hWhoseTurn] push af bank1call OpenTurnHolderHandScreen_Simple @@ -121,7 +121,7 @@ OpenYourOrOppPlayAreaScreen_TurnHolderHand: ldh [hWhoseTurn], a ret -OpenYourOrOppPlayAreaScreen_NonTurnHolderHand: +OpenYourOrOppPlayAreaScreen_NonTurnHolderHand: ; 80bc (2:40bc) ldh a, [hWhoseTurn] push af bank1call OpenNonTurnHolderHandScreen_Simple @@ -129,7 +129,7 @@ OpenYourOrOppPlayAreaScreen_NonTurnHolderHand: ldh [hWhoseTurn], a ret -OpenYourOrOppPlayAreaScreen_TurnHolderDiscardPile: +OpenYourOrOppPlayAreaScreen_TurnHolderDiscardPile: ; 80c6 (2:40c6) ldh a, [hWhoseTurn] push af bank1call OpenTurnHolderDiscardPileScreen @@ -137,7 +137,7 @@ OpenYourOrOppPlayAreaScreen_TurnHolderDiscardPile: ldh [hWhoseTurn], a ret -OpenYourOrOppPlayAreaScreen_NonTurnHolderDiscardPile: +OpenYourOrOppPlayAreaScreen_NonTurnHolderDiscardPile: ; 80d0 (2:40d0) ldh a, [hWhoseTurn] push af bank1call OpenNonTurnHolderDiscardPileScreen @@ -233,25 +233,25 @@ DuelCheckMenu_OppPlayArea: ; 80da (2:40da) dw OpenYourOrOppPlayAreaScreen_NonTurnHolderHand dw OpenYourOrOppPlayAreaScreen_NonTurnHolderDiscardPile -CheckMenuData: ; (2:4158) +CheckMenuData: ; 8158 (2:4158) textitem 2, 14, InPlayAreaText textitem 2, 16, YourPlayAreaText textitem 12, 14, GlossaryText textitem 12, 16, OppPlayAreaText db $ff -YourPlayAreaMenuData: ; (2:4169) +YourPlayAreaMenuData: ; 8169 (2:4169) textitem 2, 14, YourPokemonText textitem 12, 14, YourHandText textitem 2, 16, YourDiscardPileText2 db $ff -OppPlayAreaMenuData: ; (2:4176) +OppPlayAreaMenuData: ; 8176 (2:4176) textitem 2, 14, OpponentsPokemonText textitem 2, 16, OpponentsDiscardPileText2 db $ff -OppPlayAreaMenuData_WithClairvoyance: ; (2:4176) +OppPlayAreaMenuData_WithClairvoyance: ; 8176 (2:4176) textitem 2, 14, OpponentsPokemonText textitem 12, 14, OpponentsHandText textitem 2, 16, OpponentsDiscardPileText2 @@ -1287,7 +1287,7 @@ HandleCheckMenuInput_YourOrOppPlayArea: ; 86ac (2:46ac) call EraseCheckMenuCursor_YourOrOppPlayArea pop de -;update x and y cursor positions +; update x and y cursor positions ld a, d ld [wCheckMenuCursorXPosition], a ld a, e @@ -1512,7 +1512,7 @@ Func_8819: ; 8819 (2:4819) call GetTurnDuelistVariable jr Func_8855 -Func_883c: +Func_883c: ; 883c (2:483c) call CreateHandCardList ret c ld hl, wDuelTempList @@ -1520,7 +1520,7 @@ Func_883c: ld a, [hl] jr Func_8855 -Func_8849: +Func_8849: ; 8849 (2:4849) call CreateDeckCardList ret c ld a, %01111111 @@ -1533,7 +1533,7 @@ Func_8849: ; output: ; a = ce5c ; with upper bit set if turn was swapped -Func_8855: +Func_8855: ; 8855 (2:4855) ld b, a ld a, [$ce5c] or a @@ -2307,7 +2307,7 @@ HandleCheckMenuInput: ; 9065 (2:5065) call EraseCheckMenuCursor pop de -;update x and y cursor positions +; update x and y cursor positions ld a, d ld [wCheckMenuCursorXPosition], a ld a, e @@ -2359,7 +2359,7 @@ EraseCheckMenuCursor: ; 90d8 (2:50d8) ; draws in the cursor position ; input: ; a = tile byte to draw -DrawCheckMenuCursor: +DrawCheckMenuCursor: ; 90da (2:50da) ld e, a ld a, 10 ld l, a diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index efd2b8e0..8c4b599e 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -2107,7 +2107,7 @@ ScriptCommand_MoveWramNPC: ; ce52 (3:4e52) ; Executes movement on an arbitrary NPC using values in a and on the stack ; Changes and fixes Temp NPC using stack values -ExecuteArbitraryNPCMovementFromStack: +ExecuteArbitraryNPCMovementFromStack: ; ce5d (3:4e5d) ld [wTempNPC], a call FindLoadedNPC call ExecuteNPCMovement @@ -3104,7 +3104,7 @@ ScriptCommand_JumpIfFlagNonzero2: ; d4ca (3:54ca) .noJumpArgs jp IncreaseScriptPointerBy4 -ScriptCommand_JumpIfFlagZero2: +ScriptCommand_JumpIfFlagZero2: ; d4df (3:54df) ld a, c call GetEventFlagValue or a @@ -3989,7 +3989,6 @@ FightingClubAfterDuel: ; dda3 (3:5da3) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xddaa .after_duel_table db NPC_CHRIS @@ -4041,19 +4040,15 @@ Script_Mitch: ; ddc3 (3:5dc3) db EVENT_FLAG_20 db $01 run_command ScriptCommand_QuitScriptFully -; 0xdde2 .three_pupils_remaining run_command ScriptCommand_PrintTextQuitFully tx Text0478 -; 0xdde5 .two_pupils_remaining run_command ScriptCommand_PrintTextQuitFully tx Text0479 -; 0xdde8 .one_pupil_remaining run_command ScriptCommand_PrintTextQuitFully tx Text047a -; 0xddeb .all_pupils_defeated run_command ScriptCommand_PrintTextString tx Text047b @@ -4063,7 +4058,6 @@ Script_Mitch: ; ddc3 (3:5dc3) run_command ScriptCommand_PrintTextString tx Text047d run_command ScriptCommand_QuitScriptFully -; 0xddf7 .do_battle run_command ScriptCommand_PrintTextString tx Text047e @@ -4072,7 +4066,6 @@ Script_Mitch: ; ddc3 (3:5dc3) db FIRST_STRIKE_DECK_ID db MUSIC_DUEL_THEME_2 run_command ScriptCommand_QuitScriptFully -; 0xddff Script_BeatMitch: ; ddff (3:5dff) start_script @@ -4097,7 +4090,6 @@ Script_BeatMitch: ; ddff (3:5dff) run_command ScriptCommand_PrintTextString tx Text0481 run_command ScriptCommand_QuitScriptFully -; 0xde19 Script_LoseToMitch: ; de19 (3:5e19) start_script @@ -4106,7 +4098,6 @@ Script_LoseToMitch: ; de19 (3:5e19) dw Script_Mitch_PrintTrainHarderText run_command ScriptCommand_PrintTextQuitFully tx Text0482 -; 0xde21 Script_Mitch_AlreadyHaveMedal: ; de21 (3:5e21) run_command ScriptCommand_PrintTextString @@ -4117,7 +4108,6 @@ Script_Mitch_AlreadyHaveMedal: ; de21 (3:5e21) run_command ScriptCommand_PrintTextString tx Text0484 run_command ScriptCommand_QuitScriptFully -; 0xde2d .do_battle run_command ScriptCommand_PrintTextString tx Text0485 @@ -4126,7 +4116,6 @@ Script_Mitch_AlreadyHaveMedal: ; de21 (3:5e21) db FIRST_STRIKE_DECK_ID db MUSIC_DUEL_THEME_2 run_command ScriptCommand_QuitScriptFully -; 0xde35 Script_Mitch_GiveBoosters: ; de35 (3:5e35) run_command ScriptCommand_PrintTextString @@ -4138,7 +4127,6 @@ Script_Mitch_GiveBoosters: ; de35 (3:5e35) run_command ScriptCommand_PrintTextString tx Text0487 run_command ScriptCommand_QuitScriptFully -; 0xde40 Script_Mitch_PrintTrainHarderText: ; de40 (3:5e40) run_command ScriptCommand_PrintTextQuitFully @@ -4154,7 +4142,6 @@ RockClubLobbyAfterDuel: ; ded5 (3:5ed5) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xdedc .after_duel_table db NPC_CHRIS @@ -4202,7 +4189,6 @@ WaterClubLobbyAfterDuel: ; e0a2 (3:60a2) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xe0a9 .after_duel_table db NPC_IMAKUNI @@ -4210,7 +4196,6 @@ WaterClubLobbyAfterDuel: ; e0a2 (3:60a2) dw Script_BeatImakuni dw Script_LostToImakuni db $00 -; 0xe0b0 Preload_ImakuniInWaterClubLobby: ; e0b0 (3:60b0) get_flag_value EVENT_IMAKUNI_STATE @@ -4349,7 +4334,7 @@ WaterClubMovePlayer: ; e13f (3:613f) ld bc, Script_NotReadyToSeeAmy jp SetNextNPCAndScript -WaterClubAfterDuel: ;e157 (3:6157) +WaterClubAfterDuel: ; e157 (3:6157) ld hl, .after_duel_table call FindEndOfBattleScript ret @@ -4844,7 +4829,6 @@ ScriptJump_TalkToAmyAgain: ; e356 (3:6356) db GO_GO_RAIN_DANCE_DECK_ID db MUSIC_DUEL_THEME_2 run_command ScriptCommand_QuitScriptFully -; 0xe369 Script_Clerk4: ; e369 (3:6369) INCROM $e369, $e36d @@ -4853,7 +4837,6 @@ LightningClubLobbyAfterDuel: ; e36d (3:636d) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xe374 .after_duel_table db NPC_IMAKUNI @@ -5192,7 +5175,6 @@ Script_Lass2: ; e61f (3:661f) db BLASTOISE run_command ScriptCommand_PrintTextQuitFully tx Text06f3 -; 0xe6d8 Script_Granny2: ; e6d8 (3:66d8) INCROM $e6d8, $e6e3 @@ -5262,7 +5244,6 @@ TrySecondRonaldFight: ; e837 (3:6837) ret nz ld bc, ScriptSecondRonaldFight jp SetNextNPCAndScript -; 0xe84c Script_Clerk6: ; e84c (3:684c) INCROM $e84c, $e850 @@ -5382,7 +5363,7 @@ Script_LostToFirstRonaldFight: ; e8f7 (3:68f7) run_command ScriptCommand_PrintTextString tx Text064e -ScriptJump_FinishedFirstRonaldFight: +ScriptJump_FinishedFirstRonaldFight: ; e8fb (3:68fb) run_command ScriptCommand_SetFlagValue db EVENT_FLAG_4C db $02 @@ -5485,13 +5466,11 @@ ScriptJump_FinishedSecondRonaldFight: ; e959 (3:6959) run_command Func_cdcb run_command Func_d41d run_command ScriptCommand_QuitScriptFully -; 0xe963 PsychicClubLobbyAfterDuel: ; e963 (3:6963) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xe96a .after_duel_table db NPC_ROBERT @@ -5529,11 +5508,10 @@ Script_Murray1: ; eadf (3:6adf) Script_Clerk7: ; eb53 (3:6b53) INCROM $eb53, $eb57 -ScienceClubLobbyAfterDuel:; eb57 (3:6b57) +ScienceClubLobbyAfterDuel: ; eb57 (3:6b57) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xeb5e .after_duel_table db NPC_IMAKUNI @@ -5576,7 +5554,6 @@ FireClubLobbyAfterDuel: ; ed49 (3:6d49) ld hl, .after_duel_table call FindEndOfBattleScript ret -; 0xed50 .after_duel_table db NPC_JESSICA @@ -5585,8 +5562,6 @@ FireClubLobbyAfterDuel: ; ed49 (3:6d49) dw $6dce db $00 -; 0xed57 - FireClubPressedA: ; ed57 (3:6d57) ld hl, SlowpokePaintingObjectTable call FindExtraInteractableObjects @@ -5663,7 +5638,6 @@ Script_ee76: ; ee76 (3:6e76) run_command ScriptCommand_ShowCardReceivedScreen db SLOWPOKE1 run_command ScriptCommand_QuitScriptFully -; 0xee88 Script_Mania: ; ee88 (3:6e88) INCROM $ee88, $ee93 @@ -5695,7 +5669,6 @@ FireClubAfterDuel: ; ee93 (3:6e93) dw Script_LoseToKen db $00 -; 0xeeb3 Script_John: ; eeb3 (3:6eb3) INCROM $eeb3, $eed8 @@ -5755,7 +5728,6 @@ Script_Ken: ; ef22 (3:6f22) db FIRE_CHARGE_DECK_ID db MUSIC_DUEL_THEME_2 run_command ScriptCommand_QuitScriptFully -; 0xef5e Script_BeatKen: ; ef5e (3:6f5e) start_script @@ -5781,7 +5753,6 @@ Script_BeatKen: ; ef5e (3:6f5e) run_command ScriptCommand_PrintTextString tx Text06c3 run_command ScriptCommand_QuitScriptFully -; 0xef78 Script_LoseToKen: ; ef78 (3:6f78) start_script @@ -5792,7 +5763,6 @@ Script_LoseToKen: ; ef78 (3:6f78) tx Text06c4 tx Text06c5 run_command ScriptCommand_QuitScriptFully -; 0xef83 Script_KenBattle_AlreadyHaveMedal: ; ef83 (3:6f83) run_command ScriptCommand_PrintTextString @@ -5810,7 +5780,6 @@ Script_KenBattle_AlreadyHaveMedal: ; ef83 (3:6f83) db FIRE_CHARGE_DECK_ID db MUSIC_DUEL_THEME_2 run_command ScriptCommand_QuitScriptFully -; 0xef96 Preload_Clerk9: ; ef96 (3:6f96) call TryGiveMedalPCPacks diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 8fb4d291..48f194cf 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1103,7 +1103,7 @@ _GameLoop: ; 126d1 (4:66d1) scf ret -MainMenuFunctionTable: +MainMenuFunctionTable: ; 126fc (4:66fc) dw MainMenu_CardPop dw MainMenu_ContinueFromDiary dw MainMenu_NewGame diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 6af25820..c5757e5c 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -5738,7 +5738,7 @@ HandleSpecialAIMoves: ; 16dcd (5:6dcd) ; if any of card ID in a is found in deck, ; return a score of $80 + slots available in bench. -HandleCallForFamily: +HandleCallForFamily: ; 16e3e (5:6e3e) ld a, CARD_LOCATION_DECK call CheckIfAnyCardIDinLocation jr nc, HandleSpecialAIMoves.zero @@ -5754,7 +5754,7 @@ HandleCallForFamily: ; if any of NidoranM or NidoranF is found in deck, ; return a score of $80 + slots available in bench. -HandleNidoranFCallForFamily: +HandleNidoranFCallForFamily: ; 16e55 (5:6e55) ld e, NIDORANM ld a, CARD_LOCATION_DECK call CheckIfAnyCardIDinLocation @@ -5777,7 +5777,7 @@ HandleNidoranFCallForFamily: ; checks for certain card IDs of Fighting color in deck. ; if any of them are found, return a score of ; $80 + slots available in bench. -HandleMarowak1CallForFriend: +HandleMarowak1CallForFriend: ; 16e77 (5:6e77) ld e, GEODUDE ld a, CARD_LOCATION_DECK call CheckIfAnyCardIDinLocation diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 75916c4e..e6da8050 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -90,7 +90,7 @@ _CopyCardNameAndLevel: ; 18000 (6:4000) ret ; the name starts with TX_HALFWIDTH -_CopyCardNameAndLevel_HalfwidthText: +_CopyCardNameAndLevel_HalfwidthText: ; 18086 (6:4086) ld a, [wcd9b] inc a add a @@ -382,7 +382,7 @@ OpenInPlayAreaScreen: ; 180d5 (6:40d5) dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0e: INPLAYAREA_OPP_BENCH_4 dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0f: INPLAYAREA_OPP_BENCH_5 -OpenInPlayAreaScreen_TurnHolderPlayArea: +OpenInPlayAreaScreen_TurnHolderPlayArea: ; 18248 (6:4248) ; wInPlayAreaCurPosition constants conveniently map to (PLAY_AREA_* constants - 1) ; for bench locations. this mapping is taken for granted in the following code. ld a, [wInPlayAreaCurPosition] @@ -403,7 +403,7 @@ OpenInPlayAreaScreen_TurnHolderPlayArea: bank1call OpenCardPage_FromCheckPlayArea ret -OpenInPlayAreaScreen_NonTurnHolderPlayArea: +OpenInPlayAreaScreen_NonTurnHolderPlayArea: ; 1826a (6:426a) ld a, [wInPlayAreaCurPosition] sub INPLAYAREA_OPP_ACTIVE or a @@ -425,7 +425,7 @@ OpenInPlayAreaScreen_NonTurnHolderPlayArea: call SwapTurn ret -OpenInPlayAreaScreen_TurnHolderHand: +OpenInPlayAreaScreen_TurnHolderHand: ; 18293 (6:4293) ldh a, [hWhoseTurn] push af bank1call OpenTurnHolderHandScreen_Simple @@ -433,7 +433,7 @@ OpenInPlayAreaScreen_TurnHolderHand: ldh [hWhoseTurn], a ret -OpenInPlayAreaScreen_NonTurnHolderHand: +OpenInPlayAreaScreen_NonTurnHolderHand: ; 1829d (6:429d) ldh a, [hWhoseTurn] push af bank1call OpenNonTurnHolderHandScreen_Simple @@ -441,7 +441,7 @@ OpenInPlayAreaScreen_NonTurnHolderHand: ldh [hWhoseTurn], a ret -OpenInPlayAreaScreen_TurnHolderDiscardPile: +OpenInPlayAreaScreen_TurnHolderDiscardPile: ; 182a7 (6:42a7) ldh a, [hWhoseTurn] push af bank1call OpenTurnHolderDiscardPileScreen @@ -449,7 +449,7 @@ OpenInPlayAreaScreen_TurnHolderDiscardPile: ldh [hWhoseTurn], a ret -OpenInPlayAreaScreen_NonTurnHolderDiscardPile: +OpenInPlayAreaScreen_NonTurnHolderDiscardPile: ; 182b1 (6:42b1) ldh a, [hWhoseTurn] push af bank1call OpenNonTurnHolderDiscardPileScreen @@ -1197,7 +1197,7 @@ Func_19079: ; 19079 (6:5079) call Func_3b6a jp Func_18f9c.asm_4fd4 -PointerTable_006_508f: ; (6:508f) +PointerTable_006_508f: ; 1908f (6:508f) dw Func_18fdc dw Func_19014 dw Func_18fdd @@ -1715,32 +1715,32 @@ Func_1a73a: ; 1a73a (6:673a) pop hl ret -WhatIsYourNameData: ; (6:675e) +WhatIsYourNameData: ; 1a75e (6:675e) textitem 1, 1, WhatIsYourNameText db $ff ; [Deck1Data ~ Deck4Data] ; These are directed from around (2:4f05), ; without any bank description. ; That is, the developers hard-coded it. -_-;; -Deck1Data: ; (6:6763) +Deck1Data: ; 1a763 (6:6763) textitem 2, 1, Text022b textitem 14, 1, Text0219 db $ff -Deck2Data: ; (6:676c) +Deck2Data: ; 1a76c (6:676c) textitem 2, 1, Text022c textitem 14, 1, Text0219 db $ff -Deck3Data: ; (6:6775) +Deck3Data: ; 1a775 (6:6775) textitem 2, 1, Text022d textitem 14, 1, Text0219 db $ff -Deck4Data: ; (6:677e) +Deck4Data: ; 1a77e (6:677e) textitem 2, 1, Text022e textitem 14, 1, Text0219 db $ff ; set each byte zero from hl for b bytes. -ClearMemory: ; (6:6787) +ClearMemory: ; 1a787 (6:6787) push af push bc push hl @@ -1758,7 +1758,7 @@ ClearMemory: ; (6:6787) ; play different sfx by a. ; if a is 0xff play SFX_03 (usually following a B press), ; else play SFX_02 (usually following an A press). -PlayAcceptOrDeclineSFX: ; (6:6794) +PlayAcceptOrDeclineSFX: ; 1a794 (6:6794) push af inc a jr z, .sfx_decline @@ -1773,7 +1773,7 @@ PlayAcceptOrDeclineSFX: ; (6:6794) ; get player name from the user ; into hl -InputPlayerName: ; (6:67a3) +InputPlayerName: ; 1a7a3 (6:67a3) ld e, l ld d, h ld a, MAX_PLAYER_NAME_LENGTH @@ -1858,7 +1858,7 @@ InputPlayerName: ; (6:67a3) ; bc: position of name. ; de: dest. pointer. ; hl: pointer to text item of the question. -InitializeInputName: +InitializeInputName: ; 1a846 (6:6846) ld [wNamingScreenBufferMaxLength], a push hl ld hl, wNamingScreenNamePosition @@ -1900,7 +1900,7 @@ InitializeInputName: ld [wNamingScreenBufferLength], a ret -FinalizeInputName: +FinalizeInputName: ; 1a880 (6:6880) ld hl, wNamingScreenDestPointer ld e, [hl] inc hl @@ -1915,7 +1915,7 @@ FinalizeInputName: ; draws the keyboard frame ; and the question if it exists. -DrawNamingScreenBG: +DrawNamingScreenBG: ; 1a892 (6:6892) call DrawTextboxForKeyboard call PrintPlayerNameFromInput ld hl, wNamingScreenQuestionPointer @@ -1943,13 +1943,13 @@ DrawNamingScreenBG: textitem $0f, $10, EndText ; "End" db $ff -DrawTextboxForKeyboard: +DrawTextboxForKeyboard: ; 1a8c1 (6:68c1) lb de, 0, 3 ; x, y lb bc, 20, 15 ; w, h call DrawRegularTextBox ret -PrintPlayerNameFromInput: +PrintPlayerNameFromInput: ; 1a8cb (6:68cb) ld hl, wNamingScreenNamePosition ld d, [hl] inc hl @@ -1983,7 +1983,7 @@ endr ; check if button pressed. ; if pressed, set the carry bit on. -NamingScreen_CheckButtonState: +NamingScreen_CheckButtonState: ; 1a908 (6:6908) xor a ld [wPlaysSfx], a ldh a, [hDPadHeld] @@ -2232,7 +2232,7 @@ Func_1aa28: ; 1aa28 (6:6a28) ; load, to the first tile of v0Tiles0, the graphics for the ; blinking black square used in name input screens. ; for inputting full width text. -LoadTextCursorTile: +LoadTextCursorTile: ; 1aa65 (6:6a65) ld hl, v0Tiles0 + $00 tiles ld de, .data ld b, 0 @@ -2253,7 +2253,7 @@ endr ; set the carry bit on, ; if "End" was selected. -NamingScreen_ProcessInput: +NamingScreen_ProcessInput: ; 1aa87 (6:6a87) ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] @@ -2416,7 +2416,7 @@ NamingScreen_ProcessInput: ; it seems to have been deprecated as the game was translated into english. ; but it can still be applied to english, such as upper-lower case transition. ; hl: info. pointer. -TransformCharacter: +TransformCharacter: ; 1ab61 (6:6b61) ld a, [wNamingScreenBufferLength] or a jr z, .return ; if the length is zero, just return. @@ -2468,7 +2468,7 @@ TransformCharacter: ; it returns the pointer to the proper information. ; h: position x. ; l: position y. -GetCharInfoFromPos_Player: +GetCharInfoFromPos_Player: ; 1ab93 (6:6b93) push de ; (information index) = (x) * (height) + (y) ; (height) = 0x05(Deck) or 0x06(Player) @@ -2510,7 +2510,7 @@ else endc ENDM -KeyboardData_Player: ; (6:6baf) +KeyboardData_Player: ; 1abaf (6:6baf) kbitem $04, $02, $11, $00, TX_FULLWIDTH3, "A" kbitem $06, $02, $12, $00, TX_FULLWIDTH3, "J" kbitem $08, $02, $13, $00, TX_FULLWIDTH3, "S" @@ -2737,7 +2737,7 @@ InputDeckName: ; 1ad89 (6:6d89) ; load, to the first tile of v0Tiles0, the graphics for the ; blinking black square used in name input screens. ; for inputting half width text. -LoadHalfWidthTextCursorTile: +LoadHalfWidthTextCursorTile: ; 1ae37 (6:6e37) ld hl, v0Tiles0 + $00 tiles ld de, .data ld b, 0 @@ -2757,7 +2757,7 @@ rept TILE_SIZE endr ; it's only for naming the deck. -ProcessTextWithUnderbar: +ProcessTextWithUnderbar: ; 1ae59 (6:6e59) ld hl, wNamingScreenNamePosition ld d, [hl] inc hl @@ -3036,7 +3036,7 @@ Func_1afc2: ; 1afc2 (6:6fc2) ; its unit size is 3, and player's is 6. ; h: x ; l: y -GetCharInfoFromPos_Deck: +GetCharInfoFromPos_Deck: ; 1b000 (6:7000) push de ld e, l ld d, h @@ -3058,7 +3058,7 @@ GetCharInfoFromPos_Deck: jr nz, .loop ret -KeyboardData_Deck: ; (6:7019) +KeyboardData_Deck: ; 1b019 (6:7019) db $04, $02, "A" db $06, $02, "J" db $08, $02, "S" diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index af416131..9d2b2037 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -625,7 +625,7 @@ Func_1c8ef: ; 1c8ef (7:48ef) .address dw Func_1c94a -Func_1c94a: +Func_1c94a: ; 1c94a (7:494a) ld e, l ld d, h ld c, 3 @@ -777,6 +777,7 @@ macro_1ca04: MACRO dw \1 db \2 ENDM + Data_1ca04: ; value(2), flag(1) macro_1ca04 $5858, $08 @@ -795,7 +796,7 @@ Data_1ca04: macro_1ca04 $2838, $00 macro_1ca04 $2818, $00 -Func_1ca31: +Func_1ca31: ; 1ca31 (7:4a6b) push hl push bc ld a, [wd4ac] diff --git a/src/engine/booster_packs.asm b/src/engine/booster_packs.asm index 8e7d0c2f..a799d71b 100644 --- a/src/engine/booster_packs.asm +++ b/src/engine/booster_packs.asm @@ -388,7 +388,7 @@ GenerateTwoTypesEnergyBooster: ; 1e3ab (7:63ab) jr nz, .add_two_energies_to_booster_loop ; fallthrough -ZeroBoosterRarityData: +ZeroBoosterRarityData: ; 1e3be (7:63be) xor a ld [wBoosterData_CommonAmount], a ld [wBoosterData_UncommonAmount], a @@ -453,7 +453,7 @@ PutEnergiesAndNonEnergiesTogether: ; 1e3f3 (7:63f3) ret ; add the final cards drawn from the booster pack to the player's colection (sCardCollection) -AddBoosterCardsToCollection:; 1e40a (7:640a) +AddBoosterCardsToCollection: ; 1e40a (7:640a) push hl ld hl, wBoosterCardsDrawn .add_cards_loop diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 896d03cb..d881a5cc 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -35,7 +35,7 @@ SleepEffect: ; 2c030 (b:4030) lb bc, PSN_DBLPSN, ASLEEP jr ApplyStatusEffect -ApplyStatusEffect: +ApplyStatusEffect: ; 2c035 (b:4035) ldh a, [hWhoseTurn] ld hl, wWhoseTurn cp [hl] @@ -102,7 +102,7 @@ Func_2c087: ; 2c087 (b:4087) Func_2c08a: ; 2c08a (b:408a) ld a, $1 -Func_2c08c: +Func_2c08c: ; 2c08c (b:408c) push de push af ld a, OPPACTION_TOSS_COIN_A_TIMES diff --git a/src/engine/home.asm b/src/engine/home.asm index 860e5514..cd9c9c9d 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -505,11 +505,11 @@ SetBGP: ; 040c (0:040c) ; fallthrough ; Flush non-CGB palettes and the first CGB palette -FlushPalette0: +FlushPalette0: ; 040f (0:040f) ld a, FLUSH_ONE_PAL ; fallthrough -FlushPalettes: +FlushPalettes: ; 0411 (0:0411) ld [wFlushPaletteFlags], a ld a, [wLCDC] rla @@ -722,7 +722,7 @@ Reset: ; 051b (0:051b) di jp Start -SaveButtonsHeld: +SaveButtonsHeld: ; 0522 (0:0522) ld a, c ldh [hKeysHeld], a ld a, JOY_BTNS_SELECT | JOY_DPAD_SELECT @@ -939,7 +939,7 @@ WriteBCDNumberInTextFormat: ; 0614 (0:0614) ; given a BCD digit in the (lower nybble) of register a, write it in text (ascii) ; format to hl. numbers above 9 end up converted to half-width font tiles. -WriteBCDDigitInTextFormat: +WriteBCDDigitInTextFormat: ; 061b (0:061b) and $0f add "0" cp "9" + 1 @@ -4328,7 +4328,7 @@ CopyMoveDataAndDamage_FromDeckIndex: ; 16c0 (0:16c0) call LoadCardDataToBuffer1_FromDeckIndex ; fallthrough -CopyMoveDataAndDamage: +CopyMoveDataAndDamage: ; 16ca (0:16ca) ld a, [wLoadedCard1ID] ld [wTempCardID_ccc2], a ld hl, wLoadedCard1Move1 @@ -5669,7 +5669,7 @@ DrawRegularTextBoxDMG: ; 1e88 (0:1e88) ; continue drawing a labeled or regular textbox on DMG or SGB: ; body and bottom line of either type of textbox -ContinueDrawingTextBoxDMGorSGB: +ContinueDrawingTextBoxDMGorSGB: ; 1e93 (0:1e93) dec c dec c .draw_text_box_body_loop @@ -5720,7 +5720,7 @@ CopyLine: ; 1ea5 (0:1ea5) ret ; DrawRegularTextBox branches here on CGB console -DrawRegularTextBoxCGB: +DrawRegularTextBoxCGB: ; 1ec9 (0:1ec9) call DECoordToBGMap0Address ; top line (border) of the text box ld a, SYM_BOX_TOP @@ -5730,7 +5730,7 @@ DrawRegularTextBoxCGB: ; continue drawing a labeled or regular textbox on CGB: ; body and bottom line of either type of textbox -ContinueDrawingTextBoxCGB: +ContinueDrawingTextBoxCGB: ; 1ed4 (0:1ed4) dec c dec c .draw_text_box_body_loop @@ -5764,7 +5764,7 @@ CopyCurrentLineTilesAndAttrCGB: ; 1efb (0:1efb) pop hl ; fallthrough -CopyCurrentLineAttrCGB: +CopyCurrentLineAttrCGB: ; 1f00 (0:1f00) call BankswitchVRAM1 ld a, [wTextBoxFrameType] ; on CGB, wTextBoxFrameType determines the palette and the other attributes ld e, a @@ -5785,7 +5785,7 @@ DrawRegularTextBoxSGB: ; 1f0f (0:1f0f) ret z ; fallthrough -ColorizeTextBoxSGB: +ColorizeTextBoxSGB: ; 1f1b (0:1f1b) push bc push de ld hl, wTempSGBPacket @@ -7465,7 +7465,7 @@ PrintCardListItems: ; 2799 (0:2799) ; like PrintCardListItems, except more parameters are already initialized ; called instead of PrintCardListItems to reload the list after moving up or down -ReloadCardListItems: +ReloadCardListItems: ; 27af (0:27af) ld e, SYM_SPACE ld a, [wListScrollOffset] or a @@ -8042,7 +8042,7 @@ YesOrNoMenuWithText_LeftAligned: ; 2afe (0:2afe) lb de, 2, 16 ; x, y ; fallthrough -HandleYesOrNoMenu: +HandleYesOrNoMenu: ; 2b0a (0:2b0a) ld a, d ld [wLeftmostItemCursorX], a lb bc, SYM_CURSOR_R, SYM_SPACE ; cursor tile, tile behind cursor @@ -10343,7 +10343,7 @@ GetArenaCardWeakness: ; 3730 (0:3730) ld a, DUELVARS_ARENA_CARD ; fallthrough -GetCardWeakness: +GetCardWeakness: ; 3739 (0:3739) call GetTurnDuelistVariable call LoadCardDataToBuffer2_FromDeckIndex ld a, [wLoadedCard2Weakness] @@ -10368,7 +10368,7 @@ GetArenaCardResistance: ; 374a (0:374a) ld a, DUELVARS_ARENA_CARD ; fallthrough -GetCardResistance: +GetCardResistance: ; 3753 (0:3753) call GetTurnDuelistVariable call LoadCardDataToBuffer2_FromDeckIndex ld a, [wLoadedCard2Resistance] @@ -11525,7 +11525,7 @@ GetSpriteAnimBufferProperty: ; 3dbf (0:3dbf) ld a, [wWhichSprite] ; fallthrough -GetSpriteAnimBufferProperty_SpriteInA: +GetSpriteAnimBufferProperty_SpriteInA: ; 3dc2 (0:3dc2) cp SPRITE_ANIM_BUFFER_CAPACITY jr c, .got_sprite debug_ret diff --git a/src/wram.asm b/src/wram.asm index 9797034d..ae6d10a1 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -346,7 +346,7 @@ wBoosterTempNonEnergiesDrawn:: ; c400 ds $b wBoosterTempEnergiesDrawn:: ; c40b ds $b -wBoosterCardsDrawnEnd:: +wBoosterCardsDrawnEnd:: ; c416 ds $6a NEXTU @@ -1427,10 +1427,10 @@ wAIVenusaur2PlayAreaLocation:: ; ce05 wce06:: ; ce06 ; number of cards to be transferred by AI using Energy Trans. -wAINumberOfEnergyTransCards:: +wAINumberOfEnergyTransCards:: ; ce06 ; used for storing weakness of Player's Arena card ; in AI routine dealing with Shift Pkmn Power. -wAIDefendingPokemonWeakness:: +wAIDefendingPokemonWeakness:: ; ce06 ds $1 wce07:: ; ce07 @@ -2037,7 +2037,7 @@ NEXTU ; $00: passable (floor) ; $40: unpassable and talkable (NPC or talkable wall) ; $80: unpassable and untalkable (wall) -wPermissionMap:: +wPermissionMap:: ; d133 ds $100 ENDU @@ -2249,7 +2249,7 @@ wd3d0:: ; d3d0 wLoadedFlagBits:: ; d3d1 ds $1 -wEventFlags:: +wEventFlags:: ; d3d2 ds $40 ; 0 keeps looping, other values break the loop in RST20 From d4c65263cd550f057681f86f5d09c3676ebab755 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Mon, 14 Dec 2020 15:47:00 -0600 Subject: [PATCH 17/45] Fix some comment alignment --- src/data/booster_packs.asm | 4 +- src/data/map_headers.asm | 66 +++++------ src/data/move_animations.asm | 2 +- src/engine/booster_packs.asm | 12 +- src/engine/home.asm | 14 +-- src/gfx.asm | 8 +- src/macros/scripts.asm | 206 +++++++++++++++++------------------ src/macros/text.asm | 6 +- src/wram.asm | 2 +- 9 files changed, 160 insertions(+), 160 deletions(-) diff --git a/src/data/booster_packs.asm b/src/data/booster_packs.asm index 7d1090cd..8524ca67 100644 --- a/src/data/booster_packs.asm +++ b/src/data/booster_packs.asm @@ -37,7 +37,7 @@ BoosterPack_ColosseumNeutral:: ; 1e4e4 (7:64e4) BoosterPack_ColosseumGrass:: ; 1e4f0 (7:64f0) booster_set COLOSSEUM ; booster pack set - dw GRASS_ENERGY ; energy or energy generation function + dw GRASS_ENERGY ; energy or energy generation function ; Card Type Chances db 48 ; Grass Type Chance @@ -52,7 +52,7 @@ BoosterPack_ColosseumGrass:: ; 1e4f0 (7:64f0) BoosterPack_ColosseumFire:: ; 1e4fc (7:64fc) booster_set COLOSSEUM ; booster pack set - dw FIRE_ENERGY ; energy or energy generation function + dw FIRE_ENERGY ; energy or energy generation function ; Card Type Chances db 16 ; Grass Type Chance diff --git a/src/data/map_headers.asm b/src/data/map_headers.asm index 7f57a06d..06a2e203 100644 --- a/src/data/map_headers.asm +++ b/src/data/map_headers.asm @@ -1,37 +1,37 @@ ; TODO: figure out the rest of the data for each map ; related to the table at 20:4e5d MapHeaders: ; 1c374 (7:4374) - db $00,$01,$00,$01,$01,MUSIC_OVERWORLD ; OVERWORLD_MAP - db $02,$03,$00,$02,$02,MUSIC_OVERWORLD ; MASON_LABORATORY - db $06,$07,$00,$02,$02,MUSIC_OVERWORLD ; DECK_MACHINE_ROOM - db $0A,$0B,$00,$03,$03,MUSIC_OVERWORLD ; ISHIHARAS_HOUSE - db $0C,$0D,$00,$03,$04,MUSIC_OVERWORLD ; FIGHTING_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; FIGHTING_CLUB_LOBBY - db $20,$21,$00,$04,$0D,MUSIC_CLUB_3 ; FIGHTING_CLUB - db $0E,$0F,$00,$03,$05,MUSIC_OVERWORLD ; ROCK_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; ROCK_CLUB_LOBBY - db $22,$23,$00,$04,$0E,MUSIC_CLUB_2 ; ROCK_CLUB - db $10,$11,$00,$03,$06,MUSIC_OVERWORLD ; WATER_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; WATER_CLUB_LOBBY - db $24,$25,$00,$02,$0F,MUSIC_CLUB_2 ; WATER_CLUB - db $12,$13,$00,$03,$07,MUSIC_OVERWORLD ; LIGHTNING_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; LIGHTNING_CLUB_LOBBY - db $26,$27,$00,$05,$10,MUSIC_CLUB_1 ; LIGHTNING_CLUB - db $14,$15,$00,$03,$08,MUSIC_OVERWORLD ; GRASS_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; GRASS_CLUB_LOBBY - db $28,$29,$00,$06,$11,MUSIC_CLUB_1 ; GRASS_CLUB - db $16,$17,$00,$03,$09,MUSIC_OVERWORLD ; PSYCHIC_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; PSYCHIC_CLUB_LOBBY - db $2A,$2B,$00,$07,$12,MUSIC_CLUB_2 ; PSYCHIC_CLUB - db $18,$19,$00,$03,$0A,MUSIC_OVERWORLD ; SCIENCE_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; SCIENCE_CLUB_LOBBY - db $2C,$2D,$00,$06,$13,MUSIC_CLUB_3 ; SCIENCE_CLUB - db $1A,$1B,$00,$03,$0B,MUSIC_OVERWORLD ; FIRE_CLUB_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; FIRE_CLUB_LOBBY - db $2E,$2F,$00,$08,$14,MUSIC_CLUB_3 ; FIRE_CLUB - db $1C,$1D,$00,$03,$04,MUSIC_OVERWORLD ; CHALLENGE_HALL_ENTRANCE - db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; CHALLENGE_HALL_LOBBY - db $30,$31,$00,$09,$15,MUSIC_OVERWORLD ; CHALLENGE_HALL - db $32,$33,$00,$0A,$16,MUSIC_OVERWORLD ; POKEMON_DOME_ENTRANCE - db $36,$37,$00,$0A,$17,MUSIC_POKEMON_DOME ; POKEMON_DOME + db $00,$01,$00,$01,$01,MUSIC_OVERWORLD ; OVERWORLD_MAP + db $02,$03,$00,$02,$02,MUSIC_OVERWORLD ; MASON_LABORATORY + db $06,$07,$00,$02,$02,MUSIC_OVERWORLD ; DECK_MACHINE_ROOM + db $0A,$0B,$00,$03,$03,MUSIC_OVERWORLD ; ISHIHARAS_HOUSE + db $0C,$0D,$00,$03,$04,MUSIC_OVERWORLD ; FIGHTING_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; FIGHTING_CLUB_LOBBY + db $20,$21,$00,$04,$0D,MUSIC_CLUB_3 ; FIGHTING_CLUB + db $0E,$0F,$00,$03,$05,MUSIC_OVERWORLD ; ROCK_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; ROCK_CLUB_LOBBY + db $22,$23,$00,$04,$0E,MUSIC_CLUB_2 ; ROCK_CLUB + db $10,$11,$00,$03,$06,MUSIC_OVERWORLD ; WATER_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; WATER_CLUB_LOBBY + db $24,$25,$00,$02,$0F,MUSIC_CLUB_2 ; WATER_CLUB + db $12,$13,$00,$03,$07,MUSIC_OVERWORLD ; LIGHTNING_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; LIGHTNING_CLUB_LOBBY + db $26,$27,$00,$05,$10,MUSIC_CLUB_1 ; LIGHTNING_CLUB + db $14,$15,$00,$03,$08,MUSIC_OVERWORLD ; GRASS_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; GRASS_CLUB_LOBBY + db $28,$29,$00,$06,$11,MUSIC_CLUB_1 ; GRASS_CLUB + db $16,$17,$00,$03,$09,MUSIC_OVERWORLD ; PSYCHIC_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; PSYCHIC_CLUB_LOBBY + db $2A,$2B,$00,$07,$12,MUSIC_CLUB_2 ; PSYCHIC_CLUB + db $18,$19,$00,$03,$0A,MUSIC_OVERWORLD ; SCIENCE_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; SCIENCE_CLUB_LOBBY + db $2C,$2D,$00,$06,$13,MUSIC_CLUB_3 ; SCIENCE_CLUB + db $1A,$1B,$00,$03,$0B,MUSIC_OVERWORLD ; FIRE_CLUB_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; FIRE_CLUB_LOBBY + db $2E,$2F,$00,$08,$14,MUSIC_CLUB_3 ; FIRE_CLUB + db $1C,$1D,$00,$03,$04,MUSIC_OVERWORLD ; CHALLENGE_HALL_ENTRANCE + db $1E,$1F,$00,$03,$0C,MUSIC_OVERWORLD ; CHALLENGE_HALL_LOBBY + db $30,$31,$00,$09,$15,MUSIC_OVERWORLD ; CHALLENGE_HALL + db $32,$33,$00,$0A,$16,MUSIC_OVERWORLD ; POKEMON_DOME_ENTRANCE + db $36,$37,$00,$0A,$17,MUSIC_POKEMON_DOME ; POKEMON_DOME db $3A,$3B,$00,$0A,$18,MUSIC_HALL_OF_HONOR ; HALL_OF_HONOR diff --git a/src/data/move_animations.asm b/src/data/move_animations.asm index f774afa1..9ead157b 100644 --- a/src/data/move_animations.asm +++ b/src/data/move_animations.asm @@ -167,7 +167,7 @@ PointerTable_MoveAnimation: dw MoveAnimation_5673 dw MoveAnimation_5673 -MoveAnimation_52c6: ; (6:52c6) +MoveAnimation_52c6: ; (6:52c6) anim_player ANIM_SPELL_MOVE anim_opponent ANIM_GET_HIT anim_normal ANIM_SHAKE1 diff --git a/src/engine/booster_packs.asm b/src/engine/booster_packs.asm index a799d71b..238a8b2e 100644 --- a/src/engine/booster_packs.asm +++ b/src/engine/booster_packs.asm @@ -164,7 +164,7 @@ GetBoosterCardType: ; 1e2a0 (7:62a0) pop hl ret -CardTypeTable: ; 1e2b1 (7:62b1) +CardTypeTable: ; 1e2b1 (7:62b1) db BOOSTER_CARD_TYPE_FIRE ; TYPE_PKMN_FIRE db BOOSTER_CARD_TYPE_GRASS ; TYPE_PKMN_GRASS db BOOSTER_CARD_TYPE_LIGHTNING ; TYPE_PKMN_LIGHTNING @@ -344,7 +344,7 @@ GenerateRandomEnergy: ; 1e387 (7:6387) jr AddBoosterEnergyToDrawnEnergies ; generates a booster with 10 random energies -GenerateRandomEnergyBooster: ; 1e390 (7:6390) +GenerateRandomEnergyBooster: ; 1e390 (7:6390) ld a, NUM_CARDS_IN_BOOSTER .generate_energy_loop push af @@ -355,22 +355,22 @@ GenerateRandomEnergyBooster: ; 1e390 (7:6390) jr ZeroBoosterRarityData ; generates a booster with 5 Lightning energies and 5 Fire energies -GenerateEnergyBoosterLightningFire: ; 1e39c (7:639c) +GenerateEnergyBoosterLightningFire: ; 1e39c (7:639c) ld hl, EnergyBoosterLightningFireData jr GenerateTwoTypesEnergyBooster ; generates a booster with 5 Water energies and 5 Fighting energies -GenerateEnergyBoosterWaterFighting: ; 1e3a1 (7:63a1) +GenerateEnergyBoosterWaterFighting: ; 1e3a1 (7:63a1) ld hl, EnergyBoosterWaterFightingData jr GenerateTwoTypesEnergyBooster ; generates a booster with 5 Grass energies and 5 Psychic energies -GenerateEnergyBoosterGrassPsychic: ; 1e3a6 (7:63a6) +GenerateEnergyBoosterGrassPsychic: ; 1e3a6 (7:63a6) ld hl, EnergyBoosterGrassPsychicData jr GenerateTwoTypesEnergyBooster ; generates a booster with 5 energies of 2 different types each -GenerateTwoTypesEnergyBooster: ; 1e3ab (7:63ab) +GenerateTwoTypesEnergyBooster: ; 1e3ab (7:63ab) ld b, $02 .add_two_energies_to_booster_loop ld c, NUM_CARDS_IN_BOOSTER / 2 diff --git a/src/engine/home.asm b/src/engine/home.asm index cd9c9c9d..00949246 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -653,7 +653,7 @@ EmptyScreen: ; 04a2 (0:04a2) AttrBlkPacket_EmptyScreen: ; 04bf (0:04bf) sgb ATTR_BLK, 1 ; sgb_command, length db 1 ; number of data sets - ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 + ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 db ATTR_BLK_CTRL_INSIDE + ATTR_BLK_CTRL_LINE, 0 << 0 + 0 << 2, 0, 0, 19, 17 ; data set 1 ds 6 ; data set 2 ds 2 ; data set 3 @@ -1928,7 +1928,7 @@ Pal23Packet_0b00: ; 0b00 (0:0b00) AttrBlkPacket_0b10: ; 0b10 (0:0b10) sgb ATTR_BLK, 1 ; sgb_command, length db 1 ; number of data sets - ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 + ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 db ATTR_BLK_CTRL_INSIDE + ATTR_BLK_CTRL_LINE, 1 << 0 + 2 << 2, 5, 5, 10, 10 ; data set 1 ds 6 ; data set 2 ds 2 ; data set 3 @@ -5830,7 +5830,7 @@ ColorizeTextBoxSGB: ; 1f1b (0:1f1b) AttrBlkPacket_TextBox: ; 1f4f (0:1f4f) sgb ATTR_BLK, 1 ; sgb_command, length db 1 ; number of data sets - ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 + ; Control Code, Color Palette Designation, X1, Y1, X2, Y2 db ATTR_BLK_CTRL_INSIDE + ATTR_BLK_CTRL_LINE, 0 << 0 + 1 << 2, 0, 0, 0, 0 ; data set 1 ds 6 ; data set 2 ds 2 ; data set 3 @@ -6182,7 +6182,7 @@ LoadSymbolsFont: ; 2119 (0:2119) ; if $4000 ≤ hl ≤ $7fff ; copy b tiles from Gfx2:hl to de CopyFontsOrDuelGraphicsTiles: ; 2121 (0:2121) - ld a, BANK(Fonts); BANK(DuelGraphics) + ld a, BANK(Fonts) ; BANK(DuelGraphics) call BankpushROM ld c, TILE_SIZE call CopyGfxData @@ -6240,7 +6240,7 @@ DrawDuelBoxMessage: ; 2167 (0:2167) ; from gfx/fonts/full_width/3.1bpp and gfx/fonts/full_width/4.1bpp LoadFullWidthFontTiles: ; 2189 (0:2189) ld hl, FullWidthFonts + $3cc tiles_1bpp - $4000 - ld a, BANK(Fonts); BANK(DuelGraphics) + ld a, BANK(Fonts) ; BANK(DuelGraphics) call BankpushROM push hl ld e, l @@ -6999,7 +6999,7 @@ ConvertTileNumberToTileDataAddress: ; 2518 (0:2518) ; create, at wTextTileBuffer, a full-width font tile given its ; within the full-width font graphics (FullWidthFonts) in hl CreateFullWidthFontTile: ; 252e (0:252e) - ld a, BANK(Fonts); BANK(DuelGraphics) + ld a, BANK(Fonts) ; BANK(DuelGraphics) call BankpushROM ld de, wTextTileBuffer push de @@ -8977,7 +8977,7 @@ LoadCardGfx: ; 2fa0 (0:2fa0) ; identical to CopyFontsOrDuelGraphicsTiles CopyFontsOrDuelGraphicsTiles2: ; 2fcb (0:2fcb) - ld a, BANK(Fonts); BANK(DuelGraphics) + ld a, BANK(Fonts) ; BANK(DuelGraphics) call BankpushROM ld c, TILE_SIZE call CopyGfxData diff --git a/src/gfx.asm b/src/gfx.asm index e3b97cf1..2cf2d77e 100644 --- a/src/gfx.asm +++ b/src/gfx.asm @@ -910,16 +910,16 @@ FightingGfx: ; a8e12 (2a:4e12) INCROM $a8e54, $ac000 SECTION "Gfx 13", ROMX - INCROM $ac000, $b0000 + INCROM $ac000, $b0000 SECTION "Gfx 14", ROMX - INCROM $b0000, $b4000 + INCROM $b0000, $b4000 SECTION "Gfx 15", ROMX - INCROM $b4000, $b8000 + INCROM $b4000, $b8000 SECTION "Gfx 16", ROMX - INCROM $b8000, $bc000 + INCROM $b8000, $bc000 SECTION "Card Gfx 1", ROMX diff --git a/src/macros/scripts.asm b/src/macros/scripts.asm index ed7b30d5..3a2552ef 100644 --- a/src/macros/scripts.asm +++ b/src/macros/scripts.asm @@ -14,107 +14,107 @@ ENDM ;ENDM const_def - const ScriptCommand_EndScriptLoop1_index ; $00 - const ScriptCommand_CloseAdvancedTextBox_index ; $01 - const ScriptCommand_PrintTextString_index ; $02 - const Func_ccdc_index ; $03 - const ScriptCommand_AskQuestionJump_index ; $04 - const ScriptCommand_StartBattle_index ; $05 - const ScriptCommand_PrintVariableText_index ; $06 - const Func_cda8_index ; $07 - const ScriptCommand_PrintTextQuitFully_index ; $08 - const Func_cdcb_index ; $09 - const ScriptCommand_MoveActiveNPCByDirection_index ; $0a - const ScriptCommand_CloseTextBox_index ; $0b - const ScriptCommand_GiveBoosterPacks_index ; $0c - const ScriptCommand_CheckIfCardInCollectionOrDecks_index ; $0d - const ScriptCommand_CheckIfCardInCollection_index ; $0e - const ScriptCommand_GiveCard_index ; $0f - const ScriptCommand_TakeCard_index ; $10 - const Func_cf53_index ; $11 - const Func_cf7b_index ; $12 - const ScriptCommand_CheckRawAmountOfCardsOwned_index ; $13 - const ScriptCommand_JumpBasedOnFightingClubPupilStatus_index ; $14 - const Func_cfc6_index ; $15 - const Func_cfd4_index ; $16 - const Func_d00b_index ; $17 - const Func_d025_index ; $18 - const Func_d032_index ; $19 - const Func_d03f_index ; $1a - const ScriptCommand_Jump_index ; $1b - const ScriptCommand_TryGiveMedalPCPacks_index ; $1c - const ScriptCommand_SetPlayerDirection_index ; $1d - const ScriptCommand_MovePlayer_index ; $1e - const ScriptCommand_ShowCardReceivedScreen_index ; $1f - const ScriptCommand_SetDialogName_index ; $20 - const ScriptCommand_SetNextNPCandScript_index ; $21 - const Func_d095_index ; $22 - const Func_d0be_index ; $23 - const ScriptCommand_DoFrames_index ; $24 - const Func_d0d9_index ; $25 - const ScriptCommand_JumpIfPlayerCoordMatches_index ; $26 + const ScriptCommand_EndScriptLoop1_index ; $00 + const ScriptCommand_CloseAdvancedTextBox_index ; $01 + const ScriptCommand_PrintTextString_index ; $02 + const Func_ccdc_index ; $03 + const ScriptCommand_AskQuestionJump_index ; $04 + const ScriptCommand_StartBattle_index ; $05 + const ScriptCommand_PrintVariableText_index ; $06 + const Func_cda8_index ; $07 + const ScriptCommand_PrintTextQuitFully_index ; $08 + const Func_cdcb_index ; $09 + const ScriptCommand_MoveActiveNPCByDirection_index ; $0a + const ScriptCommand_CloseTextBox_index ; $0b + const ScriptCommand_GiveBoosterPacks_index ; $0c + const ScriptCommand_CheckIfCardInCollectionOrDecks_index ; $0d + const ScriptCommand_CheckIfCardInCollection_index ; $0e + const ScriptCommand_GiveCard_index ; $0f + const ScriptCommand_TakeCard_index ; $10 + const Func_cf53_index ; $11 + const Func_cf7b_index ; $12 + const ScriptCommand_CheckRawAmountOfCardsOwned_index ; $13 + const ScriptCommand_JumpBasedOnFightingClubPupilStatus_index ; $14 + const Func_cfc6_index ; $15 + const Func_cfd4_index ; $16 + const Func_d00b_index ; $17 + const Func_d025_index ; $18 + const Func_d032_index ; $19 + const Func_d03f_index ; $1a + const ScriptCommand_Jump_index ; $1b + const ScriptCommand_TryGiveMedalPCPacks_index ; $1c + const ScriptCommand_SetPlayerDirection_index ; $1d + const ScriptCommand_MovePlayer_index ; $1e + const ScriptCommand_ShowCardReceivedScreen_index ; $1f + const ScriptCommand_SetDialogName_index ; $20 + const ScriptCommand_SetNextNPCandScript_index ; $21 + const Func_d095_index ; $22 + const Func_d0be_index ; $23 + const ScriptCommand_DoFrames_index ; $24 + const Func_d0d9_index ; $25 + const ScriptCommand_JumpIfPlayerCoordMatches_index ; $26 const ScriptCommand_MoveActiveNPC_index ; $27 - const ScriptCommand_GiveOneOfEachTrainerBooster_index ; $28 - const Func_d103_index ; $29 - const Func_d125_index ; $2a - const Func_d135_index ; $2b - const Func_d16b_index ; $2c - const Func_cd4f_index ; $2d - const Func_cd94_index ; $2e - const ScriptCommand_MoveWramNPC_index ; $2f - const Func_cdd8_index ; $30 - const Func_cdf5_index ; $31 - const Func_d195_index ; $32 - const Func_d1ad_index ; $33 - const Func_d1b3_index ; $34 - const ScriptCommand_QuitScriptFully_index ; $35 - const Func_d244_index ; $36 - const Func_d24c_index ; $37 - const ScriptCommand_OpenDeckMachine_index ; $38 - const Func_d271_index ; $39 - const ScriptCommand_EnterMap_index ; $3a - const ScriptCommand_MoveArbitraryNPC_index ; $3b - const Func_d209_index ; $3c - const Func_d38f_index ; $3d - const Func_d396_index ; $3e - const Func_cd76_index ; $3f - const Func_d39d_index ; $40 - const Func_d3b9_index ; $41 - const ScriptCommand_TryGivePCPack_index ; $42 - const ScriptCommand_nop_index ; $43 - const Func_d3d4_index ; $44 - const Func_d3e0_index ; $45 - const Func_d3fe_index ; $46 - const Func_d408_index ; $47 - const Func_d40f_index ; $48 - const ScriptCommand_PlaySFX_index ; $49 - const ScriptCommand_PauseSong_index ; $4a - const ScriptCommand_ResumeSong_index ; $4b - const Func_d41d_index ; $4c - const ScriptCommand_WaitForSongToFinish_index ; $4d - const Func_d435_index ; $4e - const ScriptCommand_AskQuestionJumpDefaultYes_index ; $4f - const Func_d2f6_index ; $50 - const Func_d317_index ; $51 - const Func_d43d_index ; $52 - const ScriptCommand_EndScriptLoop2_index ; $53 - const ScriptCommand_EndScriptLoop3_index ; $54 - const ScriptCommand_EndScriptLoop4_index ; $55 - const ScriptCommand_EndScriptLoop5_index ; $56 - const ScriptCommand_EndScriptLoop6_index ; $57 - const ScriptCommand_SetFlagValue_index ; $58 - const ScriptCommand_JumpIfFlagZero1_index ; $59 - const ScriptCommand_JumpIfFlagNonzero1_index ; $5a - const ScriptCommand_JumpIfFlagEqual_index ; $5b - const ScriptCommand_JumpIfFlagNotEqual_index ; $5c - const ScriptCommand_JumpIfFlagNotLessThan_index ; $5d - const ScriptCommand_JumpIfFlagLessThan_index ; $5e - const ScriptCommand_MaxOutFlagValue_index ; $5f - const ScriptCommand_ZeroOutFlagValue_index ; $60 - const ScriptCommand_JumpIfFlagNonzero2_index ; $61 - const ScriptCommand_JumpIfFlagZero2_index ; $62 - const ScriptCommand_IncrementFlagValue_index ; $63 - const ScriptCommand_EndScriptLoop7_index ; $64 - const ScriptCommand_EndScriptLoop8_index ; $65 - const ScriptCommand_EndScriptLoop9_index ; $66 - const ScriptCommand_EndScriptLoop10_index ; $67 + const ScriptCommand_GiveOneOfEachTrainerBooster_index ; $28 + const Func_d103_index ; $29 + const Func_d125_index ; $2a + const Func_d135_index ; $2b + const Func_d16b_index ; $2c + const Func_cd4f_index ; $2d + const Func_cd94_index ; $2e + const ScriptCommand_MoveWramNPC_index ; $2f + const Func_cdd8_index ; $30 + const Func_cdf5_index ; $31 + const Func_d195_index ; $32 + const Func_d1ad_index ; $33 + const Func_d1b3_index ; $34 + const ScriptCommand_QuitScriptFully_index ; $35 + const Func_d244_index ; $36 + const Func_d24c_index ; $37 + const ScriptCommand_OpenDeckMachine_index ; $38 + const Func_d271_index ; $39 + const ScriptCommand_EnterMap_index ; $3a + const ScriptCommand_MoveArbitraryNPC_index ; $3b + const Func_d209_index ; $3c + const Func_d38f_index ; $3d + const Func_d396_index ; $3e + const Func_cd76_index ; $3f + const Func_d39d_index ; $40 + const Func_d3b9_index ; $41 + const ScriptCommand_TryGivePCPack_index ; $42 + const ScriptCommand_nop_index ; $43 + const Func_d3d4_index ; $44 + const Func_d3e0_index ; $45 + const Func_d3fe_index ; $46 + const Func_d408_index ; $47 + const Func_d40f_index ; $48 + const ScriptCommand_PlaySFX_index ; $49 + const ScriptCommand_PauseSong_index ; $4a + const ScriptCommand_ResumeSong_index ; $4b + const Func_d41d_index ; $4c + const ScriptCommand_WaitForSongToFinish_index ; $4d + const Func_d435_index ; $4e + const ScriptCommand_AskQuestionJumpDefaultYes_index ; $4f + const Func_d2f6_index ; $50 + const Func_d317_index ; $51 + const Func_d43d_index ; $52 + const ScriptCommand_EndScriptLoop2_index ; $53 + const ScriptCommand_EndScriptLoop3_index ; $54 + const ScriptCommand_EndScriptLoop4_index ; $55 + const ScriptCommand_EndScriptLoop5_index ; $56 + const ScriptCommand_EndScriptLoop6_index ; $57 + const ScriptCommand_SetFlagValue_index ; $58 + const ScriptCommand_JumpIfFlagZero1_index ; $59 + const ScriptCommand_JumpIfFlagNonzero1_index ; $5a + const ScriptCommand_JumpIfFlagEqual_index ; $5b + const ScriptCommand_JumpIfFlagNotEqual_index ; $5c + const ScriptCommand_JumpIfFlagNotLessThan_index ; $5d + const ScriptCommand_JumpIfFlagLessThan_index ; $5e + const ScriptCommand_MaxOutFlagValue_index ; $5f + const ScriptCommand_ZeroOutFlagValue_index ; $60 + const ScriptCommand_JumpIfFlagNonzero2_index ; $61 + const ScriptCommand_JumpIfFlagZero2_index ; $62 + const ScriptCommand_IncrementFlagValue_index ; $63 + const ScriptCommand_EndScriptLoop7_index ; $64 + const ScriptCommand_EndScriptLoop8_index ; $65 + const ScriptCommand_EndScriptLoop9_index ; $66 + const ScriptCommand_EndScriptLoop10_index ; $67 diff --git a/src/macros/text.asm b/src/macros/text.asm index 2b29afe5..bd33833d 100644 --- a/src/macros/text.asm +++ b/src/macros/text.asm @@ -1,6 +1,6 @@ -text EQUS "db TX_HALFWIDTH, " -line EQUS "db TX_LINE, " -done EQUS "db TX_END" +text EQUS "db TX_HALFWIDTH, " +line EQUS "db TX_LINE, " +done EQUS "db TX_END" half2full EQUS "db TX_HALF2FULL" diff --git a/src/wram.asm b/src/wram.asm index ae6d10a1..895074c0 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -1552,7 +1552,7 @@ wCoinTossScreenTextID:: ; ce4e ds $2 ; set to PLAYER_TURN in the "Your Play Area" screen -; set to OPPONENT_TURN in the "Opp Play Area" screen +; set to OPPONENT_TURN in the "Opp Play Area" screen ; alternates when drawing the "In Play Area" screen wCheckMenuPlayAreaWhichDuelist:: ; ce50 ds $1 From a134c1f9a9c197ee9662c8177fa487ec938f5294 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Tue, 15 Dec 2020 11:32:10 -0600 Subject: [PATCH 18/45] Mark a few duplicate hiragana characters This fixes compatibility with rgbds v0.4.2 --- src/constants/charmaps.asm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/constants/charmaps.asm b/src/constants/charmaps.asm index baa3f462..d223e1fd 100644 --- a/src/constants/charmaps.asm +++ b/src/constants/charmaps.asm @@ -279,11 +279,11 @@ ENDM fwcharmap 0, "ã�·", $54 fwcharmap 0, "ã�º", $55 fwcharmap 0, "ã�½", $56 - fwcharmap 0, "ã�‚", $57 - fwcharmap 0, "ã�„", $58 - fwcharmap 0, "ã�†", $59 - fwcharmap 0, "ã�ˆ", $5a - fwcharmap 0, "ã�Š", $5b + fwcharmap 0, "ã�‚(2)", $57 + fwcharmap 0, "ã�„(2)", $58 + fwcharmap 0, "ã�†(2)", $59 + fwcharmap 0, "ã�ˆ(2)", $5a + fwcharmap 0, "ã�Š(2)", $5b fwcharmap 0, "ゃ", $5c fwcharmap 0, "ã‚…", $5d fwcharmap 0, "ょ", $5e From 117efe39b6b297dc52c1b5ad4d3012e7b00c8bd7 Mon Sep 17 00:00:00 2001 From: xCrystal Date: Tue, 15 Dec 2020 20:47:13 +0100 Subject: [PATCH 19/45] Misc progress related to duel effect functions --- src/constants/duel_constants.asm | 20 ++-- src/data/effect_commands.asm | 121 ++++++++++++------------ src/engine/bank01.asm | 11 ++- src/engine/bank05.asm | 4 +- src/engine/effect_functions.asm | 153 +++++++++++++++++++++++-------- src/engine/home.asm | 14 ++- src/text/text1.asm | 2 +- src/text/text_offsets.asm | 2 +- src/wram.asm | 2 +- tools/tcgdisasm.py | 19 ++-- 10 files changed, 217 insertions(+), 131 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 928e78cd..473021a5 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -166,16 +166,16 @@ CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F ; effect command constants (TryExecuteEffectCommandFunction) ; ordered by (roughly) execution time -EFFECTCMDTYPE_INITIAL_EFFECT_1 EQU $01 -EFFECTCMDTYPE_INITIAL_EFFECT_2 EQU $02 -EFFECTCMDTYPE_DISCARD_ENERGY EQU $06 -EFFECTCMDTYPE_REQUIRE_SELECTION EQU $05 -EFFECTCMDTYPE_BEFORE_DAMAGE EQU $03 -EFFECTCMDTYPE_AFTER_DAMAGE EQU $04 -EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN EQU $0a -EFFECTCMDTYPE_PKMN_POWER_TRIGGER EQU $07 -EFFECTCMDTYPE_AI EQU $09 -EFFECTCMDTYPE_UNKNOWN_08 EQU $08 +EFFECTCMDTYPE_INITIAL_EFFECT_1 EQU $01 +EFFECTCMDTYPE_INITIAL_EFFECT_2 EQU $02 +EFFECTCMDTYPE_DISCARD_ENERGY EQU $06 +EFFECTCMDTYPE_REQUIRE_SELECTION EQU $05 +EFFECTCMDTYPE_BEFORE_DAMAGE EQU $03 +EFFECTCMDTYPE_AFTER_DAMAGE EQU $04 +EFFECTCMDTYPE_AI_SELECTION EQU $08 +EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN EQU $0a +EFFECTCMDTYPE_PKMN_POWER_TRIGGER EQU $07 +EFFECTCMDTYPE_AI EQU $09 ; wDamageEffectiveness constants WEAKNESS EQU 1 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 7360aff9..60063ae9 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -13,11 +13,14 @@ EffectCommands: ; 186f7 (6:46f7) ; - EFFECTCMDTYPE_DISCARD_ENERGY: For moves or trainer cards that require putting one or more attached energy cards into the discard pile. ; - EFFECTCMDTYPE_REQUIRE_SELECTION: For moves, Pokemon Powers, or trainer cards requring the user to select a card (from e.g. play area screen or card list). ; - EFFECTCMDTYPE_BEFORE_DAMAGE: Effect command of a move executed prior to the damage step. For trainer card or Pokemon Power, usually the main effect. -; - EFFECTCMDTYPE_AFTER_DAMAGE: Effect command executed after the damage step -; - EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN: For moves that may result in the defending Pokemon being switched out -; - EFFECTCMDTYPE_PKMN_POWER_TRIGGER: Pokemon Power effects that trigger the moment the Pokemon card is played -; - EFFECTCMDTYPE_AI: Used for AI scoring -; - EFFECTCMDTYPE_UNKNOWN_08: Unknown +; - EFFECTCMDTYPE_AFTER_DAMAGE: Effect command executed after the damage step. +; - EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN: For moves that may result in the defending Pokemon being switched out. Called only for AI-executed moves. +; - EFFECTCMDTYPE_PKMN_POWER_TRIGGER: Pokemon Power effects that trigger the moment the Pokemon card is played. +; - EFFECTCMDTYPE_AI: Used for AI scoring. +; - EFFECTCMDTYPE_AI_SELECTION: When AI is required to select a card + +; Moves that have an EFFECTCMDTYPE_REQUIRE_SELECTION also must have either an EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN or an +; EFFECTCMDTYPE_AI_SELECTION (for anything not involving switching the defending Pokemon), to handle selections involving the AI. ; Similar move effects of different Pokemon cards all point to a different command list, ; even though in some cases their commands and function pointers match. @@ -44,7 +47,7 @@ EkansWrapEffectCommands: ArbokTerrorStrikeEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, TerrorStrike_SwitchDefendingPokemon dbw EFFECTCMDTYPE_REQUIRE_SELECTION, TerrorStrike_50PercentSelectSwitchPokemon - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, TerrorStrike_50PercentSelectSwitchPokemon + dbw EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN, TerrorStrike_50PercentSelectSwitchPokemon db $00 ArbokPoisonFangEffectCommands: @@ -58,10 +61,10 @@ WeepinbellPoisonPowderEffectCommands: db $00 VictreebelLureEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4740 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $476a - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $474b - dbw EFFECTCMDTYPE_UNKNOWN_08, $4764 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Lure_AssertPokemonInBench + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Lure_SwitchDefendingPokemon + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Lure_SelectSwitchPokemon + dbw EFFECTCMDTYPE_AI_SELECTION, Func_2c764 db $00 VictreebelAcidEffectCommands: @@ -157,14 +160,14 @@ OddishSproutEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $484a dbw EFFECTCMDTYPE_AFTER_DAMAGE, $48cc dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $485a - dbw EFFECTCMDTYPE_UNKNOWN_08, $48b7 + dbw EFFECTCMDTYPE_AI_SELECTION, $48b7 db $00 ExeggutorTeleportEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $48ec dbw EFFECTCMDTYPE_AFTER_DAMAGE, $491a dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $48f7 - dbw EFFECTCMDTYPE_UNKNOWN_08, $490f + dbw EFFECTCMDTYPE_AI_SELECTION, $490f db $00 ExeggutorBigEggsplosionEffectCommands: @@ -174,7 +177,7 @@ ExeggutorBigEggsplosionEffectCommands: NidokingThrashEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Thrash_ModifierEffect - dbw EFFECTCMDTYPE_AFTER_DAMAGE, Func_2c982 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Thrash_LowRecoilEffect dbw EFFECTCMDTYPE_AI, Thrash_AIEffect db $00 @@ -196,7 +199,7 @@ NidoranFCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $49db dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4a6e dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $49eb - dbw EFFECTCMDTYPE_UNKNOWN_08, $4a55 + dbw EFFECTCMDTYPE_AI_SELECTION, $4a55 db $00 NidoranMHornHazardEffectCommands: @@ -221,7 +224,7 @@ NidorinoDoubleKickEffectCommands: ButterfreeWhirlwindEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4b09 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4af3 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $4af3 + dbw EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN, $4af3 db $00 ButterfreeMegaDrainEffectCommands: @@ -278,7 +281,7 @@ BellsproutCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4c40 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4cc2 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4c50 - dbw EFFECTCMDTYPE_UNKNOWN_08, $4cad + dbw EFFECTCMDTYPE_AI_SELECTION, $4cad db $00 WeezingSmogEffectCommands: @@ -383,7 +386,7 @@ KrabbyCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4f5d dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4fdf dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4f6d - dbw EFFECTCMDTYPE_UNKNOWN_08, $4fca + dbw EFFECTCMDTYPE_AI_SELECTION, $4fca db $00 MagikarpFlailEffectCommands: @@ -407,7 +410,7 @@ GolduckPsyshockEffectCommands: GolduckHyperBeamEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $506b dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5033 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5065 + dbw EFFECTCMDTYPE_AI_SELECTION, $5065 db $00 SeadraWaterGunEffectCommands: @@ -446,7 +449,7 @@ StarmieRecoverEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $50f0 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5114 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $510e - dbw EFFECTCMDTYPE_UNKNOWN_08, $5103 + dbw EFFECTCMDTYPE_AI_SELECTION, $5103 db $00 StarmieStarFreezeEffectCommands: @@ -478,7 +481,7 @@ PoliwhirlAmnesiaEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5149 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $516f dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5179 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5173 + dbw EFFECTCMDTYPE_AI_SELECTION, $5173 db $00 PoliwhirlDoubleslapEffectCommands: @@ -494,7 +497,7 @@ PoliwrathWaterGunEffectCommands: PoliwrathWhirlpoolEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5214 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $51e6 - dbw EFFECTCMDTYPE_UNKNOWN_08, $520e + dbw EFFECTCMDTYPE_AI_SELECTION, $520e db $00 PoliwagWaterGunEffectCommands: @@ -553,7 +556,7 @@ ArcanineFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5363 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5371 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5379 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5375 + dbw EFFECTCMDTYPE_AI_SELECTION, $5375 db $00 ArcanineTakeDownEffectCommands: @@ -570,7 +573,7 @@ ArcanineFlamesOfRageEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $53ae dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $53ef dbw EFFECTCMDTYPE_DISCARD_ENERGY, $53de - dbw EFFECTCMDTYPE_UNKNOWN_08, $53d5 + dbw EFFECTCMDTYPE_AI_SELECTION, $53d5 dbw EFFECTCMDTYPE_AI, $53e9 db $00 @@ -587,21 +590,21 @@ NinetailsLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5425 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $544f dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5430 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5449 + dbw EFFECTCMDTYPE_AI_SELECTION, $5449 db $00 NinetailsFireBlastEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5463 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5471 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5479 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5475 + dbw EFFECTCMDTYPE_AI_SELECTION, $5475 db $00 CharmanderEmberEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $547f dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $548d dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5495 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5491 + dbw EFFECTCMDTYPE_AI_SELECTION, $5491 db $00 MoltresWildfireEffectCommands: @@ -609,7 +612,7 @@ MoltresWildfireEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $54a9 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $54f4 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $54e1 - dbw EFFECTCMDTYPE_UNKNOWN_08, $54dd + dbw EFFECTCMDTYPE_AI_SELECTION, $54dd db $00 Moltres1DiveBombEffectCommands: @@ -626,14 +629,14 @@ FlareonFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $555c dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $556a dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5572 - dbw EFFECTCMDTYPE_UNKNOWN_08, $556e + dbw EFFECTCMDTYPE_AI_SELECTION, $556e db $00 MagmarFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5578 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5586 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $558e - dbw EFFECTCMDTYPE_UNKNOWN_08, $558a + dbw EFFECTCMDTYPE_AI_SELECTION, $558a db $00 MagmarSmokescreenEffectCommands: @@ -649,7 +652,7 @@ CharmeleonFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $55a2 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $55b0 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $55b8 - dbw EFFECTCMDTYPE_UNKNOWN_08, $55b4 + dbw EFFECTCMDTYPE_AI_SELECTION, $55b4 db $00 CharizardEnergyBurnEffectCommands: @@ -660,7 +663,7 @@ CharizardFireSpinEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $55c0 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $55cd dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5614 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5606 + dbw EFFECTCMDTYPE_AI_SELECTION, $5606 db $00 VulpixConfuseRayEffectCommands: @@ -704,7 +707,7 @@ GengarCurseEffectCommands: GengarDarkMindEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $593c dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5903 - dbw EFFECTCMDTYPE_UNKNOWN_08, $592a + dbw EFFECTCMDTYPE_AI_SELECTION, $592a db $00 GastlySleepingGasEffectCommands: @@ -716,7 +719,7 @@ GastlyDestinyBondEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5964 dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5987 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5981 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5976 + dbw EFFECTCMDTYPE_AI_SELECTION, $5976 db $00 GastlyLickEffectCommands: @@ -727,7 +730,7 @@ GastlyEnergyConversionEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $598d dbw EFFECTCMDTYPE_AFTER_DAMAGE, $59b4 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5994 - dbw EFFECTCMDTYPE_UNKNOWN_08, $599b + dbw EFFECTCMDTYPE_AI_SELECTION, $599b db $00 HaunterHypnosisEffectCommands: @@ -750,13 +753,13 @@ HypnoProphecyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $59e7 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5a41 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5a00 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5a3c + dbw EFFECTCMDTYPE_AI_SELECTION, $5a3c db $00 HypnoDarkMindEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5b64 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5b2b - dbw EFFECTCMDTYPE_UNKNOWN_08, $5b52 + dbw EFFECTCMDTYPE_AI_SELECTION, $5b52 db $00 DrowzeeConfuseRayEffectCommands: @@ -791,7 +794,7 @@ MewDevolutionBeamEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5c64 dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5cb6 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5cbb - dbw EFFECTCMDTYPE_UNKNOWN_08, $5c9e + dbw EFFECTCMDTYPE_AI_SELECTION, $5c9e db $00 MewNeutralizingShieldEffectCommands: @@ -812,21 +815,21 @@ MewtwoBarrierEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5d9c dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5dbf dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5db9 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5dae + dbw EFFECTCMDTYPE_AI_SELECTION, $5dae db $00 Mewtwo3EnergyAbsorptionEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5dc5 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5dec dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5dcc - dbw EFFECTCMDTYPE_UNKNOWN_08, $5dd3 + dbw EFFECTCMDTYPE_AI_SELECTION, $5dd3 db $00 Mewtwo2EnergyAbsorptionEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5dff dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5e26 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5e06 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5e0d + dbw EFFECTCMDTYPE_AI_SELECTION, $5e0d db $00 SlowbroStrangeBehaviorEffectCommands: @@ -851,14 +854,14 @@ SlowpokeScavengeEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5f5f dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5f46 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5f40 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5f2d + dbw EFFECTCMDTYPE_AI_SELECTION, $5f2d db $00 SlowpokeAmnesiaEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5f74 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5f7b dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5f85 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5f7f + dbw EFFECTCMDTYPE_AI_SELECTION, $5f7f db $00 KadabraRecoverEffectCommands: @@ -866,7 +869,7 @@ KadabraRecoverEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5fa0 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5fc3 dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5fbd - dbw EFFECTCMDTYPE_UNKNOWN_08, $5fb2 + dbw EFFECTCMDTYPE_AI_SELECTION, $5fb2 db $00 JynxDoubleslapEffectCommands: @@ -933,7 +936,7 @@ MarowakCallforFriendEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6100 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6194 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6110 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6177 + dbw EFFECTCMDTYPE_AI_SELECTION, $6177 db $00 MachokeKarateChopEffectCommands: @@ -956,7 +959,7 @@ GravelerHardenEffectCommands: RhydonRamEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6212 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $61fc - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $61fc + dbw EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN, $61fc db $00 RhyhornLeerEffectCommands: @@ -967,7 +970,7 @@ HitmonleeStretchKickEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6231 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $625b dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $623c - dbw EFFECTCMDTYPE_UNKNOWN_08, $6255 + dbw EFFECTCMDTYPE_AI_SELECTION, $6255 db $00 SandshrewSandAttackEffectCommands: @@ -1068,7 +1071,7 @@ PikachuThunderJoltEffectCommands: PikachuSparkEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6574 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6539 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6562 + dbw EFFECTCMDTYPE_AI_SELECTION, $6562 db $00 Pikachu3GrowlEffectCommands: @@ -1103,7 +1106,7 @@ RaichuThunderEffectCommands: RaichuGigashockEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $671f dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $660d - dbw EFFECTCMDTYPE_UNKNOWN_08, $66c3 + dbw EFFECTCMDTYPE_AI_SELECTION, $66c3 db $00 MagnetonThunderWaveEffectCommands: @@ -1147,7 +1150,7 @@ ElectrodeEnergySpikeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6877 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $68f6 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $687b - dbw EFFECTCMDTYPE_UNKNOWN_08, $68f1 + dbw EFFECTCMDTYPE_AI_SELECTION, $68f1 db $00 JolteonDoubleKickEffectCommands: @@ -1174,7 +1177,7 @@ SpearowMirrorMoveEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6987 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6989 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6983 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6985 + dbw EFFECTCMDTYPE_AI_SELECTION, $6985 dbw EFFECTCMDTYPE_AI, $697d db $00 @@ -1252,13 +1255,13 @@ DragonairSlamEffectCommands: DragonairHyperBeamEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6c35 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6c2c - dbw EFFECTCMDTYPE_UNKNOWN_08, $6c2f + dbw EFFECTCMDTYPE_AI_SELECTION, $6c2f db $00 ClefableMetronomeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6c77 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6c82 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6c7e + dbw EFFECTCMDTYPE_AI_SELECTION, $6c7e db $00 ClefableMinimizeEffectCommands: @@ -1272,7 +1275,7 @@ PidgeotHurricaneEffectCommands: PidgeottoWhirlwindEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6ce9 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6cd3 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $6cd3 + dbw EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN, $6cd3 db $00 PidgeottoMirrorMoveEffectCommands: @@ -1281,7 +1284,7 @@ PidgeottoMirrorMoveEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6cfe dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6d01 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6cf8 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6cfb + dbw EFFECTCMDTYPE_AI_SELECTION, $6cfb dbw EFFECTCMDTYPE_AI, $6cef db $00 @@ -1292,7 +1295,7 @@ ClefairySingEffectCommands: ClefairyMetronomeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6d0b dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6d16 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6d12 + dbw EFFECTCMDTYPE_AI_SELECTION, $6d12 db $00 WigglytuffLullabyEffectCommands: @@ -1332,21 +1335,21 @@ LickitungSupersonicEffectCommands: PidgeyWhirlwindEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6dcf dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6db9 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $6db9 + dbw EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN, $6db9 db $00 PorygonConversion1EffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6dd5 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6ded dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6dfb - dbw EFFECTCMDTYPE_UNKNOWN_08, $6df7 + dbw EFFECTCMDTYPE_AI_SELECTION, $6df7 db $00 PorygonConversion2EffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6e1f dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6e31 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6e5e - dbw EFFECTCMDTYPE_UNKNOWN_08, $6e3c + dbw EFFECTCMDTYPE_AI_SELECTION, $6e3c db $00 ChanseyScrunchEffectCommands: @@ -1439,7 +1442,7 @@ EnergyRemovalEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7252 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $725f dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7273 - dbw EFFECTCMDTYPE_UNKNOWN_08, $726f + dbw EFFECTCMDTYPE_AI_SELECTION, $726f db $00 EnergyRetrievalEffectCommands: diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index c4a6b27a..811f95b9 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -1438,10 +1438,15 @@ CheckIfActiveCardParalyzedOrAsleep: ; 4918 (1:4918) scf ret -; display the animation of the turn duelist drawing a card at the beginning of the turn +; display the animation of the turn duelist drawing one card at the beginning of the turn ; if there isn't any card left in the deck, let the player know with a text message DisplayDrawOneCardScreen: ; 4933 (1:4933) ld a, 1 +; fallthrough + +; display the animation of the turn duelist drawing A cards at the beginning of the turn +; if there isn't any card left in the deck, let the player know with a text message +DisplayDrawACardsScreen: push hl push de push bc @@ -7386,9 +7391,9 @@ Func_6ff7: ; 6ff7 (1:6ff7) ret ; print one of the "There was no effect from" texts depending -; on the value at wNoEffectFromStatus (NO_STATUS or a status condition constant) +; on the value at wNoEffectFromWhichStatus (NO_STATUS or a status condition constant) PrintThereWasNoEffectFromStatusText: ; 700a (1:700a) - ld a, [wNoEffectFromStatus] + ld a, [wNoEffectFromWhichStatus] or a jr nz, .status ld hl, wLoadedMoveName diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 6af25820..1a33d2f6 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -190,7 +190,7 @@ AITryUseAttack: ; 14145 (5:4145) call AISelectSpecialAttackParameters jr c, .use_attack - ld a, OPPACTION_BEGIN_ATTACK + ld a, EFFECTCMDTYPE_AI_SELECTION call TryExecuteEffectCommandFunction .use_attack @@ -204,7 +204,7 @@ AITryUseAttack: ; 14145 (5:4145) bank1call AIMakeDecision ret c - ld a, OPPACTION_ATTACK_ANIM_AND_DAMAGE + ld a, EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN call TryExecuteEffectCommandFunction ld a, OPPACTION_ATTACK_ANIM_AND_DAMAGE bank1call AIMakeDecision diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 4ed3dbea..7e8db45f 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -57,7 +57,7 @@ ApplyStatusEffect: .cant_induce_status ld a, c - ld [wNoEffectFromStatus], a + ld [wNoEffectFromWhichStatus], a call SetNoEffectFromStatus or a ret @@ -154,7 +154,7 @@ Func_2c0c7: ; 2c0c7 (b:40c7) scf ret -; Sets some flags for AI use +; Sets some variables for AI use ; if target poisoned ; [wAIMinDamage] <- [wDamage] ; [wAIMaxDamage] <- [wDamage] @@ -162,19 +162,23 @@ Func_2c0c7: ; 2c0c7 (b:40c7) ; [wAIMinDamage] <- [wDamage] + d ; [wAIMaxDamage] <- [wDamage] + e ; [wDamage] <- [wDamage] + a -Func_2c0d4: ; 2c0d4 (b:40d4) +UpdateExpectedAIDamage_AccountForPoison: ; 2c0d4 (b:40d4) push af ld a, DUELVARS_ARENA_CARD_STATUS call GetNonTurnDuelistVariable and POISONED | DOUBLE_POISONED - jr z, Func_2c0e9.skip_push_af + jr z, UpdateExpectedAIDamage.skip_push_af pop af ld a, [wDamage] ld [wAIMinDamage], a ld [wAIMaxDamage], a ret -Func_2c0e9: ; 2c0e9 (b:40e9) +; Sets some variables for AI use +; [wAIMinDamage] <- [wDamage] + d +; [wAIMaxDamage] <- [wDamage] + e +; [wDamage] <- [wDamage] + a +UpdateExpectedAIDamage: ; 2c0e9 (b:40e9) push af .skip_push_af @@ -190,11 +194,11 @@ Func_2c0e9: ; 2c0e9 (b:40e9) ld [hl], a ret -; Sets some flags for AI use +; Sets some variables for AI use ; [wDamage] <- a ; [wAIMinDamage] <- d ; [wAIMaxDamage] <- e -Func_2c0fb: ; 2c0fb (b:40fb) +SetExpectedAIDamage: ; 2c0fb (b:40fb) ld [wDamage], a xor a ld [wDamage + 1], a @@ -268,7 +272,7 @@ ApplySubstatus2ToDefendingCard: ; 2c149 (b:4149) .no_damage_orEffect pop af push hl - bank1call $4f9d + bank1call DrawDuelMainScene pop hl ld a, l or h @@ -277,7 +281,7 @@ ApplySubstatus2ToDefendingCard: ; 2c149 (b:4149) ; overwrites in wDamage, wAIMinDamage and wAIMaxDamage ; with the value in a. -StoreDamageInfo: ; 2c166 (b:4166) +SetDefiniteDamage: ; 2c166 (b:4166) ld [wDamage], a ld [wAIMinDamage], a ld [wAIMaxDamage], a @@ -404,10 +408,8 @@ CreateEnergyCardListFromOpponentDiscardPile: ; 2c2a4 (b:42a4) INCROM $2c2e0, $2c487 -; handles the selection of a forced switch -; by link/AI opponent or by the player. -; outputs the Play Area location of the chosen -; bench card in hTempPlayAreaLocation_ff9d. +; handles the selection of a forced switch by link/AI opponent or by the player. +; outputs the Play Area location of the chosen bench card in hTempPlayAreaLocation_ff9d. DuelistSelectForcedSwitch: ; 2c487 (b:4487) ld a, DUELVARS_DUELIST_TYPE call GetNonTurnDuelistVariable @@ -459,12 +461,43 @@ DuelistSelectForcedSwitch: ; 2c487 (b:4487) ret ; 0x2c4da - INCROM $2c4da, $2c6f0 + INCROM $2c4da, $2c564 + +; Return in a the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest HP +; if multiple cards are tied for the lowest HP, the one with the highest PLAY_AREA_* is returned. +Func_2c564: ; 2c564 (b:4564) + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + lb de, 0, -1 + ld b, d + ld a, DUELVARS_BENCH1_CARD_HP + call GetTurnDuelistVariable + jr .begin +.loop + ld a, e + cp [hl] + jr c, .next + ld e, [hl] + ld d, b +.next + inc hl +.begin + inc b + dec c + jr nz, .loop + ld a, d + call SwapTurn + ret +; 0x2c588 + + INCROM $2c588, $2c6f0 SpitPoison_AIEffect: ; 2c6f0 (b:46f0) ld a, 5 lb de, 0, 10 - jp Func_2c0fb + jp SetExpectedAIDamage ; If heads, defending Pokemon becomes poisoned SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8) @@ -476,10 +509,9 @@ SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8) call SetNoEffectFromStatus ret -; outputs in hTemp_ffa0 the result of the coin toss -; (0 = tails, 1 = heads) and, in case it was heads, -; stores in hTempPlayAreaLocation_ffa1 the location -; of the Bench Pokemon that was selected for switch. +; outputs in hTemp_ffa0 the result of the coin toss (0 = tails, 1 = heads). +; in case it was heads, stores in hTempPlayAreaLocation_ffa1 +; the PLAY_AREA_* location of the Bench Pokemon that was selected for switch. TerrorStrike_50PercentSelectSwitchPokemon: ; 2c70a (b:470a) xor a ldh [hTemp_ffa0], a @@ -490,8 +522,7 @@ TerrorStrike_50PercentSelectSwitchPokemon: ; 2c70a (b:470a) cp 2 ret c -; toss coin and store whether it was tails (0) -; or heads (1) in hTemp_ffa0 +; toss coin and store whether it was tails (0) or heads (1) in hTemp_ffa0. ; return if it was tails. ldtx de, IfHeadsChangeOpponentsActivePokemonText call Func_2c08a @@ -503,8 +534,8 @@ TerrorStrike_50PercentSelectSwitchPokemon: ; 2c70a (b:470a) ldh [hTempPlayAreaLocation_ffa1], a ret -; if coin toss was heads and it's possible, -; switch Defending Pokemon +; if coin toss at hTemp_ffa0 was heads and it's possible, +; switch the Defending Pokemon TerrorStrike_SwitchDefendingPokemon: ; 2c726 (b:4726) ldh a, [hTemp_ffa0] or a @@ -516,15 +547,57 @@ TerrorStrike_SwitchDefendingPokemon: ; 2c726 (b:4726) PoisonFang_AIEffect: ; 2c730 (b:4730) ld a, 10 lb de, 10, 10 - jp Func_2c0d4 + jp UpdateExpectedAIDamage_AccountForPoison WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) ld a, 5 lb de, 0, 10 - jp Func_2c0d4 + jp UpdateExpectedAIDamage_AccountForPoison ; 0x2c740 - INCROM $2c740, $2c77e +; return carry if there are no Pokemon cards in the non-turn holder's bench +Lure_AssertPokemonInBench: ; 2c740 (b:4740) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + ldtx hl, NoPokemonOnTheBenchText_2 + cp 2 + ret +; 0x2c74b + +; return in hTempPlayAreaLocation_ffa1 the PLAY_AREA_* location +; of the Bench Pokemon that was selected for switch +Lure_SelectSwitchPokemon: ; 2c74b (b:474b) + ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.select_pokemon + bank1call OpenPlayAreaScreenForSelection + jr c, .select_pokemon + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2c764 + +Func_2c764: ; 2c764 (b:4764) + call Func_2c564 + ldh [hTemp_ffa0], a + ret +; 0x2c76a + +; Defending Pokemon is swapped out for the one with the PLAY_AREA_* at hTemp_ffa0 +; unless Mew's Neutralizing Shield or Haunter's Transparency prevents it. +Lure_SwitchDefendingPokemon: ; 2c76a (b:476a) + call SwapTurn + ldh a, [hTemp_ffa0] + ld e, a + call HandleNShieldAndTransparency + call nc, SwapArenaWithBenchPokemon + call SwapTurn + xor a + ld [wDuelDisplayedScreen], a + ret ; If heads, defending Pokemon can't retreat next turn AcidEffect: ; 2c77e (b:477e) @@ -538,7 +611,7 @@ AcidEffect: ; 2c77e (b:477e) GloomPoisonPowder_AIEffect: ; 2c78b (b:478b) ld a, 10 lb de, 10, 10 - jp Func_2c0d4 + jp UpdateExpectedAIDamage_AccountForPoison ; Defending Pokemon and user become confused FoulOdorEffect: ; 2c793 (b:4793) @@ -562,7 +635,7 @@ KakunaStiffenEffect: ; 2c7a0 (b:47a0) KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4) ld a, 5 lb de, 0, 10 - jp Func_2c0d4 + jp UpdateExpectedAIDamage_AccountForPoison ; 0x2c7bc INCROM $2c7bc, $2c7d0 @@ -588,7 +661,7 @@ ZubatSupersonicEffect: ; 2c7dc (b:47dc) Twineedle_AIEffect: ; 2c7ed (b:47ed) ld a, 30 lb de, 0, 60 - jp Func_2c0fb + jp SetExpectedAIDamage ; Flip 2 coins; deal 30x number of heads Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) @@ -601,7 +674,7 @@ Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) add a add e call ATimes10 - call StoreDamageInfo + call SetDefiniteDamage ret ; 0x2c80d @@ -610,7 +683,7 @@ Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) FoulGas_AIEffect: ; 2c822 (b:4822) ld a, 5 lb de, 0, 10 - jp Func_2c0e9 + jp UpdateExpectedAIDamage ; If heads, defending Pokemon becomes poisoned. If tails, defending Pokemon becomes confused FoulGas_PoisonOrConfusionEffect: ; 2c82a (b:482a) @@ -683,7 +756,7 @@ SetDamageToATimes20: ; 2c958 (b:4958) Thrash_AIEffect: ; 2c96b (b:496b) ld a, 35 lb de, 30, 40 - jp Func_2c0fb + jp SetExpectedAIDamage ; If heads 10 more damage; if tails, 10 damage to itself Thrash_ModifierEffect: ; 2c973 (b:4973) @@ -695,20 +768,20 @@ Thrash_ModifierEffect: ; 2c973 (b:4973) call AddToDamage ret -Func_2c982: ; 2c982 (b:4982) +Thrash_LowRecoilEffect: ; 2c982 (b:4982) ldh a, [hTemp_ffa0] or a ret nz ld a, 10 - call Func_1955 + call DealRecoilDamageToSelf ret Toxic_AIEffect: ; 2c98c (b:498c) ld a, 20 lb de, 20, 20 - jp Func_2c0e9 + jp UpdateExpectedAIDamage -; Defending Pokémon becomes poisoned, but takes 20 damage (double poisoned) +; Defending Pokémon becomes double poisoned (takes 20 damage per turn rather than 10) Toxic_DoublePoisonEffect: ; 2c994 (b:4994) call DoublePoisonEffect ret @@ -727,7 +800,7 @@ Func_2cbfb: ; 2cbfb (b:4bfb) ; 0x2cc0a INCROM $2cc0a, $2f4e1 - + ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) call SwapTurn call CreateHandCardList @@ -742,9 +815,9 @@ ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) jr .return_hand_to_deck_loop .shuffle call Func_2c0bd - ld a, $07 - bank1call $4935 - ld c, $07 + ld a, 7 + bank1call DisplayDrawACardsScreen + ld c, 7 .draw_loop call DrawCardFromDeck jr c, .revert_turn_to_user diff --git a/src/engine/home.asm b/src/engine/home.asm index ff887fd1..9ebb5494 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -2778,7 +2778,7 @@ ExchangeRNG: ; 0f58 (0:0f58) ; send 10 bytes of data to the other game from hOppActionTableIndex, hTempCardIndex_ff9f, ; hTemp_ffa0, and hTempPlayAreaLocation_ffa1, and hTempRetreatCostCards. ; finally exchange RNG data. -; the receiving side will use this data to read the OPP_ACTION_* value in +; the receiving side will use this data to read the OPPACTION_* value in ; [hOppActionTableIndex] and match it by calling the correspoding OppAction* function SetOppAction_SerialSendDuelData: ; 0f7f (0:0f7f) push hl @@ -4380,7 +4380,7 @@ Func_16f6: ; 16f6 (0:16f6) ld [wIsDamageToSelf], a ld [wccef], a ld [wccf0], a - ld [wNoEffectFromStatus], a + ld [wNoEffectFromWhichStatus], a bank1call ClearNonTurnTemporaryDuelvars_CopyStatus ret @@ -4516,7 +4516,7 @@ ClearNonTurnTemporaryDuelvars_ResetCarry: ; 1823 (0:1823) ret ; called when attacker deals damage to itself due to confusion -; display the corresponding animation and deal damage to self +; display the corresponding animation and deal 20 damage to self HandleConfusionDamageToSelf: ; 1828 (0:1828) bank1call DrawDuelMainScene ld a, 1 @@ -4690,13 +4690,17 @@ LoadNonPokemonCardEffectCommands: ; 1944 (0:1944) ld [de], a ret -Func_1955: ; 1955 (0:1955) +; Make turn holder deal A damage to self due to recoil (e.g. Thrash, Selfdestruct) +; display recoil animation +DealRecoilDamageToSelf: ; 1955 (0:1955) push af ld a, $7a ld [wLoadedMoveAnimation], a pop af ; fallthrough +; Make turn holder deal A damage to self due to confusion +; display animation at wLoadedMoveAnimation DealConfusionDamageToSelf: ; 195c (0:195c) ld hl, wDamage ld [hli], a @@ -11461,7 +11465,7 @@ DrawSpriteAnimationFrame: ; 3cc4 (0:3cc4) call BankswitchROM ret -; Loads a pointer to the current animation frame into SPRITE_ANIM_FRAME_DATA_POINTER using +; Loads a pointer to the current animation frame into SPRITE_ANIM_FRAME_DATA_POINTER using ; the current frame's offset ; [wd4ca] - current frame offset ; wTempPointer* - Pointer to current Animation diff --git a/src/text/text1.asm b/src/text/text1.asm index 07d7a7a7..4a053136 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -858,7 +858,7 @@ Text00b6: ; 375bc (d:75bc) text "Not enough cards in Hand." done -Text00b7: ; 375d7 (d:75d7) +NoPokemonOnTheBenchText_2: ; 375d7 (d:75d7) text "No Pokémon on the Bench." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 605ec7d9..9a45df33 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -184,7 +184,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 textpointer Text00b5 ; 0x00b5 textpointer Text00b6 ; 0x00b6 - textpointer Text00b7 ; 0x00b7 + textpointer NoPokemonOnTheBenchText_2 ; 0x00b7 textpointer Text00b8 ; 0x00b8 textpointer Text00b9 ; 0x00b9 textpointer Text00ba ; 0x00ba diff --git a/src/wram.asm b/src/wram.asm index bb1f3465..c75adf0a 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -1025,7 +1025,7 @@ wccf0:: ; ccf0 ; effect functions return a status condition constant here when it had no effect ; on the target, in order to print one of the ThereWasNoEffectFrom* texts -wNoEffectFromStatus:: ; ccf1 +wNoEffectFromWhichStatus:: ; ccf1 ds $1 ; when non-0, allows the player to skip some delays during a duel by pressing B. diff --git a/tools/tcgdisasm.py b/tools/tcgdisasm.py index 579d577c..a887b1e8 100644 --- a/tools/tcgdisasm.py +++ b/tools/tcgdisasm.py @@ -763,16 +763,17 @@ class Disassembler(object): # handle the special flag macros found_flag_macro = False - for flag_macro in flag_macros: - if flag_macro[0] == target_offset: - found_flag_macro = True - current_flag_macro = flag_macro - event_flag = "EVENT_FLAG_" + format(opcode_arg_3, "02X") - opcode_output_str = flag_macro[1].format(event_flag) + if opcode_byte == 0xcd: + for flag_macro in flag_macros: + if flag_macro[0] == target_offset: + found_flag_macro = True + current_flag_macro = flag_macro + event_flag = "EVENT_FLAG_" + format(opcode_arg_3, "02X") + opcode_output_str = flag_macro[1].format(event_flag) - # we need to skip a byte since this macro takes one extra - opcode_nargs+=1 - break + # we need to skip a byte since this macro takes one extra + opcode_nargs+=1 + break if not found_flag_macro and opcode_byte in call_commands + absolute_jumps: From f13ddf25bf61c79200c56666184fe84b579ad1cc Mon Sep 17 00:00:00 2001 From: xCrystal Date: Tue, 15 Dec 2020 21:13:15 +0100 Subject: [PATCH 20/45] Complete Lure effect functions --- src/data/effect_commands.asm | 2 +- src/engine/effect_functions.asm | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 60063ae9..9000b7c7 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -64,7 +64,7 @@ VictreebelLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Lure_AssertPokemonInBench dbw EFFECTCMDTYPE_AFTER_DAMAGE, Lure_SwitchDefendingPokemon dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Lure_SelectSwitchPokemon - dbw EFFECTCMDTYPE_AI_SELECTION, Func_2c764 + dbw EFFECTCMDTYPE_AI_SELECTION, Lure_GetBenchPokemonWithLowestHP db $00 VictreebelAcidEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 7e8db45f..965b6393 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -463,9 +463,9 @@ DuelistSelectForcedSwitch: ; 2c487 (b:4487) INCROM $2c4da, $2c564 -; Return in a the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest HP +; Return in a the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest (remaining) HP. ; if multiple cards are tied for the lowest HP, the one with the highest PLAY_AREA_* is returned. -Func_2c564: ; 2c564 (b:4564) +GetBenchPokemonWithLowestHP: ; 2c564 (b:4564) call SwapTurn ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable @@ -580,8 +580,10 @@ Lure_SelectSwitchPokemon: ; 2c74b (b:474b) ret ; 0x2c764 -Func_2c764: ; 2c764 (b:4764) - call Func_2c564 +; Return in hTemp_ffa0 the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest (remaining) HP. +; if multiple cards are tied for the lowest HP, the one with the highest PLAY_AREA_* is returned. +Lure_GetBenchPokemonWithLowestHP: ; 2c764 (b:4764) + call GetBenchPokemonWithLowestHP ldh [hTemp_ffa0], a ret ; 0x2c76a From 6214fab5eef5a788f88b03fb86b9b6b929ebd662 Mon Sep 17 00:00:00 2001 From: E Date: Tue, 15 Dec 2020 17:22:15 -0600 Subject: [PATCH 21/45] Updating comments + finishing after tutorial battle script --- src/engine/bank03.asm | 95 ++++++++++++++++++++++++++++--------------- src/engine/bank04.asm | 88 +++++++++++++++++++-------------------- src/wram.asm | 4 +- 3 files changed, 108 insertions(+), 79 deletions(-) diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 2f922a60..21977c8c 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -1912,7 +1912,7 @@ ScriptCommand_StartBattle: ; cd01 (3:4d01) ld a, [wcc19] cp $ff jr nz, .asm_cd26 - ld a, [wd695] + ld a, [wMultichoiceTextboxResult_ChooseDeckToDuelAgainst] ld c, a ld b, $0 ld hl, AaronDeckIDs @@ -2716,18 +2716,18 @@ ScriptCommand_ShowMultichoiceTextbox_ChooseDeckToDuelAgainst: ; d24c (3:524c) ld hl, .multichoice_menu_args xor a call ShowMultichoiceTextbox - ld a, [wd695] + ld a, [wMultichoiceTextboxResult_ChooseDeckToDuelAgainst] ld c, a set_flag_value EVENT_FLAG_76 jp IncreaseScriptPointerBy1 .multichoice_menu_args ;d25e - dw $0000 ;NPC title for textbox under menu - tx Text03f9 ;text for textbox under menu - dw MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst ;location of table configuration in bank 4 - db $03 ;the value to return when b is pressed - dw $d695 ;ram location to return result into - dw .text_entries ;location of table containing text entries + dw $0000 ; NPC title for textbox under menu + tx Text03f9 ; text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst ; location of table configuration in bank 4 + db $03 ; the value to return when b is pressed + dw wMultichoiceTextboxResult_ChooseDeckToDuelAgainst ; ram location to return result into + dw .text_entries ; location of table containing text entries .text_entries ;d269 tx Text03f6 @@ -2745,12 +2745,12 @@ ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck: ; d271 (3:5271) ; 0xd27b .multichoice_menu_args ;d27b - dw $0000 ;NPC title for textbox under menu - tx Text03fd ;text for textbox under menu - dw MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck ;location of table configuration in bank 4 - db $00 ;the value to return when b is pressed - dw $d693 ;ram location to return result into - dw .text_entries ;location of table containing text entries + dw $0000 ; NPC title for textbox under menu + tx Text03fd ; text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck ; location of table configuration in bank 4 + db $00 ; the value to return when b is pressed + dw $d693 ; ram location to return result into + dw .text_entries ; location of table containing text entries .text_entries tx Text03fa @@ -2765,7 +2765,7 @@ ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck: ; d271 (3:5271) ; dw location of table configuration in bank 4 ; db the value to return when b is pressed ; dw ram location to return result into -; dw location of table containing text entries (optional +; dw location of table containing text entries (optional) ShowMultichoiceTextbox: ; d28c (3:528c) ld [wd416], a @@ -2847,39 +2847,39 @@ ScriptCommand_ShowSamNormalMultichoice: ; d2f6 (3:52f6) ld hl, .multichoice_menu_args xor a call ShowMultichoiceTextbox - ld a, [wd694] + ld a, [wMultichoiceTextboxResult_Sam] ld c, a set_flag_value EVENT_FLAG_75 xor a - ld [wd694], a + ld [wMultichoiceTextboxResult_Sam], a jp IncreaseScriptPointerBy1 ; 0xd30c .multichoice_menu_args ;d30c - tx SamNPCName ;NPC title for textbox under menu - tx Text03fe ;text for textbox under menu - dw SamNormalMultichoice_ConfigurationTable ;location of table configuration in bank 4 - db $03 ;the value to return when b is pressed - dw $d694 ;ram location to return result into - dw $0000 ;location of table containing text entries + tx SamNPCName ; NPC title for textbox under menu + tx Text03fe ; text for textbox under menu + dw SamNormalMultichoice_ConfigurationTable ; location of table configuration in bank 4 + db $03 ; the value to return when b is pressed + dw wMultichoiceTextboxResult_Sam ; ram location to return result into + dw $0000 ; location of table containing text entries ScriptCommand_ShowSamTutorialMultichoice: ; d317 (s) ld hl, .multichoice_menu_args - ld a, [wd694] + ld a, [wMultichoiceTextboxResult_Sam] call ShowMultichoiceTextbox - ld a, [wd694] + ld a, [wMultichoiceTextboxResult_Sam] ld c, a set_flag_value EVENT_FLAG_75 jp IncreaseScriptPointerBy1 .multichoice_menu_args ;d32b - dw $0000 ;NPC title for textbox under menu - dw $0000 ;text for textbox under menu - dw SamTutorialMultichoice_ConfigurationTable ;location of table configuration in bank 4 - db $07 ;the value to return when b is pressed - dw $d694 ;ram location to return result into - dw $0000 ;location of table containing text entries + dw $0000 ; NPC title for textbox under menu + dw $0000 ; text for textbox under menu + dw SamTutorialMultichoice_ConfigurationTable ; location of table configuration in bank 4 + db $07 ; the value to return when b is pressed + dw wMultichoiceTextboxResult_Sam ; ram location to return result into + dw $0000 ; location of table containing text entries ScriptCommand_OpenDeckMachine: ; d336 (3:5336) @@ -2978,6 +2978,7 @@ Func_d3d4: ; d3d4 (3:53d4) INCROM $d3dd, $d3e0 + Func_d3e0: ; d3e0 (3:53e0) ld a, $1 ld [wd32e], a @@ -3526,10 +3527,38 @@ AfterTutorialBattleScript: ; d834 (3:5834) run_command ScriptCommand_CloseTextBox run_command ScriptCommand_PrintTextString tx Text05f2 +.ows_d85f run_command ScriptCommand_ShowMultichoiceTextbox_ChooseStarterDeck -; 0xd860 + run_command ScriptCommand_CloseTextBox + run_command ScriptCommand_AskQuestionJump + tx Text05f3 + dw .ows_d869 + run_command ScriptCommand_Jump + dw .ows_d85f +; 0xd869 +.ows_d869 + run_command ScriptCommand_PrintTextString + tx Text05f4 + run_command ScriptCommand_CloseTextBox + run_command ScriptCommand_PauseSong + run_command Func_d40f + run_command ScriptCommand_TryGiveMedalPCPacks + run_command Func_ccdc + tx Text05f5 + run_command ScriptCommand_WaitForSongToFinish + run_command ScriptCommand_ResumeSong + run_command ScriptCommand_CloseTextBox + run_command ScriptCommand_SetFlagValue + db EVENT_FLAG_3E + db $03 + run_command Func_d3d4 + run_command ScriptCommand_PrintTextString + tx Text05f6 + run_command Func_d396 + db $00 + run_command ScriptCommand_QuitScriptFully +; 0xd880 - INCROM $d860, $d880 NPCMovement_d880: ; d880 (3:5880) db EAST diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index da26e556..8e621889 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1075,62 +1075,62 @@ OverworldScriptTable: ; 1217b (4:617b) MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst: ;1224b - db $04, $00 ; x, y to start drawing box - db $10, $08 ; width, height of box - db $06, $02 ; x, y coordinate to start printing next text - tx Text03f6 ; text id to print next - db $06, $04 ; x, y coordinate to start printing next text - tx Text03f7 ; text id to print next - db $06, $06 ; x, y coordinate to start printing next text - tx Text03f8 ; text id to print next - db $ff ; marker byte -- end text entries - db $05, $02 ; cursor starting x, y - db $02 ; number of tiles the cursor moves per toggle - db $03 ; cursor max index - db $0f ; curor image + db $04, $00 ; x, y to start drawing box + db $10, $08 ; width, height of box + db $06, $02 ; x, y coordinate to start printing next text + tx Text03f6 ; text id to print next + db $06, $04 ; x, y coordinate to start printing next text + tx Text03f7 ; text id to print next + db $06, $06 ; x, y coordinate to start printing next text + tx Text03f8 ; text id to print next + db $ff ; marker byte -- end text entries + db $05, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $03 ; cursor max index + db $0f ; curor image db $00, $00, $00 ; marker bytes -- end of config table MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck: ;12264 - db $04, $00 ; x, y to start drawing box - db $10, $08 ; width, height of box - db $06, $02 ; x, y coordinate to start printing next text - tx Text03fa ; text id to print next - db $06, $04 ; x, y coordinate to start printing next text - tx Text03fb ; text id to print next - db $06, $06 ; x, y coordinate to start printing next text - tx Text03fc ; text id to print next - db $ff ; marker byte -- end text entries - db $05, $02 ; cursor starting x, y - db $02 ; number of tiles the cursor moves per toggle - db $03 ; cursor max index - db $0f ; curor image + db $04, $00 ; x, y to start drawing box + db $10, $08 ; width, height of box + db $06, $02 ; x, y coordinate to start printing next text + tx Text03fa ; text id to print next + db $06, $04 ; x, y coordinate to start printing next text + tx Text03fb ; text id to print next + db $06, $06 ; x, y coordinate to start printing next text + tx Text03fc ; text id to print next + db $ff ; marker byte -- end text entries + db $05, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $03 ; cursor max index + db $0f ; curor image db $00, $00, $00 ; marker bytes -- end of config table SamNormalMultichoice_ConfigurationTable: ;1227d - db $0A, $00 ; x, y to start drawing box - db $0A, $0A ; width, height of box - db $0C, $02 ; x, y coordinate to start printing next text - tx Text03ff ; text id to print next - db $ff ; marker byte -- end text entries - db $0b, $02 ; cursor starting x, y - db $02 ; number of tiles the cursor moves per toggle - db $04 ; cursor max index - db $0f ; curor image + db $0A, $00 ; x, y to start drawing box + db $0A, $0A ; width, height of box + db $0C, $02 ; x, y coordinate to start printing next text + tx Text03ff ; text id to print next + db $ff ; marker byte -- end text entries + db $0b, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $04 ; cursor max index + db $0f ; curor image db $00, $00, $00 ; marker bytes -- end of config table SamTutorialMultichoice_ConfigurationTable: ;1228e - db $06, $00 ; x, y to start drawing box - db $0E, $12 ; width, height of box - db $08, $02 ; x coordinate to start printing text - tx Text0400 ; text id to print next - db $ff ; marker byte -- end text entries - db $07, $02 ; cursor starting x, y - db $02 ; number of tiles the cursor moves per toggle - db $08 ; cursor max index - db $0f ; curor image + db $06, $00 ; x, y to start drawing box + db $0E, $12 ; width, height of box + db $08, $02 ; x coordinate to start printing text + tx Text0400 ; text id to print next + db $ff ; marker byte -- end text entries + db $07, $02 ; cursor starting x, y + db $02 ; number of tiles the cursor moves per toggle + db $08 ; cursor max index + db $0f ; curor image db $00, $00, $00 ; marker bytes -- end of config table diff --git a/src/wram.asm b/src/wram.asm index bb1f3465..2d39fb70 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -2556,10 +2556,10 @@ wBoosterData_TypeChances:: ; d689 wd693:: ; d693 ds $1 -wd694:: ; d694 +wMultichoiceTextboxResult_Sam:: ; d694 ds $1 -wd695:: ; d695 +wMultichoiceTextboxResult_ChooseDeckToDuelAgainst:: ; d695 ds $1 wd696:: ; d696 From 07b56455e045fe722484e78e3ef16edaca7b5aa1 Mon Sep 17 00:00:00 2001 From: E Date: Tue, 15 Dec 2020 18:11:56 -0600 Subject: [PATCH 22/45] adding wram union + fixing location comment --- src/engine/bank03.asm | 4 ++-- src/wram.asm | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 21977c8c..4e53dfd3 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -1912,7 +1912,7 @@ ScriptCommand_StartBattle: ; cd01 (3:4d01) ld a, [wcc19] cp $ff jr nz, .asm_cd26 - ld a, [wMultichoiceTextboxResult_ChooseDeckToDuelAgainst] + ld a, [wd695] ld c, a ld b, $0 ld hl, AaronDeckIDs @@ -2864,7 +2864,7 @@ ScriptCommand_ShowSamNormalMultichoice: ; d2f6 (3:52f6) dw $0000 ; location of table containing text entries -ScriptCommand_ShowSamTutorialMultichoice: ; d317 (s) +ScriptCommand_ShowSamTutorialMultichoice: ; d317 (3:5317) ld hl, .multichoice_menu_args ld a, [wMultichoiceTextboxResult_Sam] call ShowMultichoiceTextbox diff --git a/src/wram.asm b/src/wram.asm index 2d39fb70..a6a56043 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -2558,10 +2558,21 @@ wd693:: ; d693 wMultichoiceTextboxResult_Sam:: ; d694 ds $1 + +UNION wMultichoiceTextboxResult_ChooseDeckToDuelAgainst:: ; d695 ds $1 +NEXTU + +wd695:: ; d695 + ds $1 + +ENDU + + + wd696:: ; d696 ds $1 From 5ee1d3908bcf4cbd8ae05c0dbd420fb8cc6aca2f Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 10 May 2020 10:35:17 +0100 Subject: [PATCH 23/45] Disasm Victreebel Lure attack --- src/data/effect_commands.asm | 8 ++-- src/engine/effect_functions.asm | 76 ++++++++++++++++++++++++++++++++- src/text/text1.asm | 2 +- src/text/text_offsets.asm | 2 +- 4 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 7360aff9..c201b91b 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -58,10 +58,10 @@ WeepinbellPoisonPowderEffectCommands: db $00 VictreebelLureEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4740 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $476a - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $474b - dbw EFFECTCMDTYPE_UNKNOWN_08, $4764 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBenchPokemon + dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchDefendingPokemon + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelectBenchPokemon + dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelectBenchPokemon db $00 VictreebelAcidEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 4ed3dbea..edfc7739 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -459,7 +459,41 @@ DuelistSelectForcedSwitch: ; 2c487 (b:4487) ret ; 0x2c4da - INCROM $2c4da, $2c6f0 + INCROM $2c4da, $2c564 + +; outputs in a the Play Area location (PLAY_AREA_* constant) +; of lowest HP card in non-duelist's Bench. +AIFindBenchWithLowestHP: ; 2c564 (b:4564) + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + lb de, PLAY_AREA_ARENA, $ff + ld b, d + ld a, DUELVARS_BENCH1_CARD_HP + call GetTurnDuelistVariable + jr .start +; find Play Area location with least amount of HP +.loop_bench + ld a, e + cp [hl] + jr c, .next ; skip if HP is higher + ld e, [hl] + ld d, b + +.next + inc hl +.start + inc b + dec c + jr nz, .loop_bench + + ld a, d + call SwapTurn + ret +; 0x2c588 + + INCROM $2c588, $2c6f0 SpitPoison_AIEffect: ; 2c6f0 (b:46f0) ld a, 5 @@ -524,7 +558,45 @@ WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) jp Func_2c0d4 ; 0x2c740 - INCROM $2c740, $2c77e +; returns carry if non-duelist has no Bench Pokemon +VictreebelLure_CheckBenchPokemon: ; 2c740 (b:4740) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + ldtx hl, LureNoPokemonOnTheBenchText + cp 2 + ret +; 0x2c74b + +VictreebelLure_PlayerSelectBenchPokemon: ; 2c74b (b:474b) + ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.loop_selection + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_selection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2c764 + +VictreebelLure_AISelectBenchPokemon: ; 2c764 (b:4764) + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2c76a + +VictreebelLure_SwitchDefendingPokemon: ; 2c76a (b:476a) + call SwapTurn + ldh a, [hTemp_ffa0] + ld e, a + call HandleNShieldAndTransparency + call nc, SwapArenaWithBenchPokemon + call SwapTurn + xor a + ld [wDuelDisplayedScreen], a + ret ; If heads, defending Pokemon can't retreat next turn AcidEffect: ; 2c77e (b:477e) diff --git a/src/text/text1.asm b/src/text/text1.asm index 07d7a7a7..00dc22f5 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -858,7 +858,7 @@ Text00b6: ; 375bc (d:75bc) text "Not enough cards in Hand." done -Text00b7: ; 375d7 (d:75d7) +LureNoPokemonOnTheBenchText: ; 375d7 (d:75d7) text "No Pokémon on the Bench." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 605ec7d9..7ff0d447 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -184,7 +184,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 textpointer Text00b5 ; 0x00b5 textpointer Text00b6 ; 0x00b6 - textpointer Text00b7 ; 0x00b7 + textpointer LureNoPokemonOnTheBenchText ; 0x00b7 textpointer Text00b8 ; 0x00b8 textpointer Text00b9 ; 0x00b9 textpointer Text00ba ; 0x00ba From fa1339c32f77f28c8cf27abf931aad5efe2268c9 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 10 May 2020 14:19:36 +0100 Subject: [PATCH 24/45] Zubat, Golbat and Venonat Leech Life effects --- src/data/effect_commands.asm | 6 +-- src/engine/bank05.asm | 14 +++--- src/engine/bank08.asm | 42 ++++++++-------- src/engine/effect_functions.asm | 85 +++++++++++++++++++++++++++++++-- src/engine/home.asm | 10 ++-- src/wram.asm | 1 + 6 files changed, 121 insertions(+), 37 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index c201b91b..88938faf 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -95,7 +95,7 @@ KakunaPoisonPowderEffectCommands: db $00 GolbatLeechLifeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $47bc + dbw EFFECTCMDTYPE_AFTER_DAMAGE, GolbatLeechLifeEffect db $00 VenonatStunSporeEffectCommands: @@ -103,7 +103,7 @@ VenonatStunSporeEffectCommands: db $00 VenonatLeechLifeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $47c6 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, VenonatLeechLifeEffect db $00 ScytherSwordsDanceEffectCommands: @@ -115,7 +115,7 @@ ZubatSupersonicEffectCommands: db $00 ZubatLeechLifeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $47e3 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ZubatLeechLifeEffect db $00 BeedrillTwineedleEffectCommands: diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 6af25820..01af5413 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -3122,7 +3122,7 @@ AIDecideEvolution: ; 15f4c (5:5f4c) .check_damage ld a, [wTempAI] ld e, a - call GetCardDamage + call GetCardDamageAndMaxHP or a jr z, .check_mysterious_fossil srl a @@ -3294,7 +3294,7 @@ Func_16120: ; 16120 (5:6120) dec b ld e, b push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc add c ld c, a @@ -3324,7 +3324,7 @@ Func_16120: ; 16120 (5:6120) ; check if there's a Muk in any duelist's Play Area .is_active ld e, 0 - call GetCardDamage + call GetCardDamageAndMaxHP cp 50 jr c, .lower_score ld e, PLAY_AREA_ARENA @@ -5308,7 +5308,7 @@ GetAIScoreOfAttack: ; 16a86 (5:6a86) cp 31 jr nc, .high_recoil_generic_checks ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP sla a cp c jr c, .high_recoil_generic_checks @@ -5544,7 +5544,7 @@ GetAIScoreOfAttack: ; 16a86 (5:6a86) .tally_heal_score push af ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP call CalculateByteTensDigit pop bc cp b ; wLoadedMoveEffectParam @@ -6191,7 +6191,7 @@ LookForCardThatIsKnockedOutOnDevolution: ; 17080 (5:7080) ld [wTempAI], a ld e, c push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc ld e, a ld a, [wTempAI] @@ -7229,7 +7229,7 @@ Func_174f2: ; 174f2 (5:74f2) Func_17583: ; 17583 (5:7583) push hl push de - call GetCardDamage + call GetCardDamageAndMaxHP call CalculateByteTensDigit ld b, a push bc diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm index 272f7c74..d133fd14 100644 --- a/src/engine/bank08.asm +++ b/src/engine/bank08.asm @@ -202,7 +202,7 @@ AIPlay_Potion: ; 201b5 (8:41b5) ld a, [wAITrainerCardParameter] ldh [hTemp_ffa0], a ld e, a - call GetCardDamage + call GetCardDamageAndMaxHP cp 20 jr c, .play_card ld a, 20 @@ -232,7 +232,7 @@ AIDecide_Potion1: ; 201d1 (8:41d1) call GetTurnDuelistVariable ld h, a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP cp 20 + 1 ; if damage <= 20 jr c, .calculate_hp ld a, 20 ; amount of Potion HP healing @@ -270,7 +270,7 @@ AIDecide_Potion2: ; 20204 (8:4204) call GetTurnDuelistVariable ld h, a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP cp 20 + 1 ; if damage <= 20 jr c, .calculate_hp ld a, 20 @@ -309,7 +309,7 @@ AIDecide_Potion2: ; 20204 (8:4204) ret z call .check_boost_if_taken_damage jr c, .has_boost_damage - call GetCardDamage + call GetCardDamageAndMaxHP cp 20 ; if damage >= 20 jr nc, .found .has_boost_damage @@ -392,7 +392,7 @@ AIPlay_SuperPotion: ; 202a8 (8:42a8) ldh [hTemp_ffa0], a ld a, [wAITrainerCardParameter] ld e, a - call GetCardDamage + call GetCardDamageAndMaxHP cp 40 jr c, .play_card ld a, 40 @@ -426,7 +426,7 @@ AIDecide_SuperPotion1: ; 202cc (8:42cc) call GetTurnDuelistVariable ld h, a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP cp 40 + 1 ; if damage < 40 jr c, .calculate_hp ld a, 40 @@ -470,7 +470,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f) call GetTurnDuelistVariable ld h, a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP cp 40 + 1 ; if damage < 40 jr c, .calculate_hp ld a, 40 @@ -516,7 +516,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f) jr c, .next call .check_energy_cost jr c, .next - call GetCardDamage + call GetCardDamageAndMaxHP cp 40 ; if damage >= 40 jr nc, .found .next @@ -2274,7 +2274,7 @@ AIDecide_PokemonBreeder: ; 20b1b (8:4b1b) dec b ld e, b push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc call ConvertHPToCounters add c @@ -2296,7 +2296,7 @@ AIDecide_PokemonBreeder: ; 20b1b (8:4b1b) ; compare number of this card's damage counters ; with 5, if less than that, set carry ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP cp 5 jr c, .set_carry @@ -3182,7 +3182,7 @@ AIDecide_PokemonCenter: ; 210eb (8:50eb) ; get this Pokemon's current damage counters ; and add it to the total. - call GetCardDamage + call GetCardDamageAndMaxHP call ConvertHPToCounters ld b, a ld a, [wce08] @@ -3950,7 +3950,7 @@ AIDecide_MrFuji: ; 214a7 (8:54a7) ld b, a ; skip if zero damage counters - call GetCardDamage + call GetCardDamageAndMaxHP call ConvertHPToCounters or a jr z, .next @@ -4061,7 +4061,7 @@ AIDecide_ScoopUp: ; 21506 (8:5506) ; skip if card has no damage counters. ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP or a jr z, .no_carry @@ -6653,7 +6653,7 @@ HandleAIHeal: ; 22402 (8:6402) ; check if Arena card has any damage counters, ; if not, check Bench instead. ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP or a jr z, .check_bench @@ -6666,7 +6666,7 @@ HandleAIHeal: ; 22402 (8:6402) call GetTurnDuelistVariable ld h, a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP ; this seems useless since it was already ; checked that Arena card has damage, ; so card damage is at least 10. @@ -6704,7 +6704,7 @@ HandleAIHeal: ; 22402 (8:6402) cp d jr z, .done push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc cp b jr c, .next_bench @@ -6902,7 +6902,7 @@ HandleAIStrangeBehavior: ; 2255d (8:655d) ldh [hTemp_ffa0], a ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP or a ret z ; return if Arena card has no damage counters @@ -6977,7 +6977,7 @@ HandleAICurse: ; 225b5 (8:65b5) call SwapTurn .loop_play_area_1 push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc or a jr z, .next_1 @@ -7033,7 +7033,7 @@ HandleAICurse: ; 225b5 (8:65b5) cp b jr z, .next_2 ; skip same Pokemon card push bc - call GetCardDamage + call GetCardDamageAndMaxHP pop bc jr nz, .use_curse ; has damage counters, choose this card .next_2 @@ -7116,7 +7116,7 @@ HandleAICowardice: ; 2262d (8:662d) ld a, c ldh [hTemp_ffa0], a ld e, a - call GetCardDamage + call GetCardDamageAndMaxHP .asm_22678 or a ret z ; return if has no damage counters @@ -7183,7 +7183,7 @@ HandleAIDamageSwap: ; 226a3 (8:66a3) .ok ld e, PLAY_AREA_ARENA - call GetCardDamage + call GetCardDamageAndMaxHP or a ret z ; return if no damage diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index edfc7739..d254f5cb 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -332,7 +332,61 @@ HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ret ; 0x2c221 - INCROM $2c221, $2c2a4 +; applies HP recovery on Pokemon after HP drain attack +; and handles its animation. +; input: +; d = damage effectiveness +; e = damage dealt +ApplyAndAnimateHPDrain: ; 2c221 (b:4221) + push de + ld hl, wccbd + ld [hl], e + inc hl + ld [hl], d + +; get Arena card's damage + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + pop de + or a + ret z ; return if no damage + +; load correct animation + push de + ld a, $79 + ld [wLoadedMoveAnimation], a + ld bc, $01 ; arrow + bank1call PlayMoveAnimation + +; compare HP to be restores with max HP +; if HP to be restored would cause HP to +; be larger than max HP, cap it accordingly + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld b, $00 + pop de + ld a, DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + add e + ld e, a + ld a, 0 + adc d + ld d, a + ; de = damage dealt + current HP + ; bc = max HP of card + call CompareDEtoBC + jr c, .skip_cap + ; cap de to value in bc + ld e, c + ld d, b + +.skip_cap + ld [hl], e ; apply new HP to arena card + bank1call WaitMoveAnimation + ret +; 0x2c25b + + INCROM $2c25b, $2c2a4 ; makes a list in wDuelTempList with the deck indices ; of all the energy cards found in opponent's Discard Pile. @@ -637,7 +691,23 @@ KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4) jp Func_2c0d4 ; 0x2c7bc - INCROM $2c7bc, $2c7d0 +GolbatLeechLifeEffect: ; 2c7bc (b:47bc) + ld hl, wDealtDamage + ld e, [hl] + inc hl ; wDamageEffectiveness + ld d, [hl] + call ApplyAndAnimateHPDrain + ret +; 0x2c7c6 + +VenonatLeechLifeEffect: ; 2c7c6 (b:47c6) + ld hl, wDealtDamage + ld e, [hl] + inc hl ; wDamageEffectiveness + ld d, [hl] + call ApplyAndAnimateHPDrain + ret +; 0x2c7d0 ; During your next turn, double damage SwordsDanceEffect: ; 2c7d0 (b:47d0) @@ -655,7 +725,16 @@ ZubatSupersonicEffect: ; 2c7dc (b:47dc) ret ; 0x2c7e3 - INCROM $2c7e3, $2c7ed +ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) + ld hl, wDealtDamage + ld e, [hl] + inc hl + ld d, [hl] + call ApplyAndAnimateHPDrain + ret +; 0x2c7ed + + INCROM $2c7ed, $2c7ed Twineedle_AIEffect: ; 2c7ed (b:47ed) ld a, 30 diff --git a/src/engine/home.asm b/src/engine/home.asm index ff887fd1..98b10ac8 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -5172,9 +5172,13 @@ MoveCardToDiscardPileIfInArena: ; 1c13 (0:1c13) jr c, .next_card ret -; calculate damage of card at CARD_LOCATION_* in e -; return the result in a -GetCardDamage: ; 1c35 (0:1c35) +; calculate damage an max HP of card at PLAY_AREA_* in e. +; input: +; e = PLAY_AREA_* of card; +; output: +; a = damage; +; c = max HP. +GetCardDamageAndMaxHP: ; 1c35 (0:1c35) push hl push de ld a, DUELVARS_ARENA_CARD diff --git a/src/wram.asm b/src/wram.asm index bb1f3465..1d678b61 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -931,6 +931,7 @@ wAIMinDamage:: ; ccbb wAIMaxDamage:: ; ccbc ds $1 +wccbd:: ; ccbd ds $2 ; damage dealt by an attack to a target From 467f016e401386a8a30d38429d96056df66bf38c Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 10 May 2020 21:58:45 +0100 Subject: [PATCH 25/45] Oddish Sprout effect --- src/constants/duel_constants.asm | 19 +- src/data/effect_commands.asm | 16 +- src/engine/bank01.asm | 4 +- src/engine/bank07.asm | 49 +++++- src/engine/effect_functions.asm | 291 ++++++++++++++++++++++++++++++- src/engine/home.asm | 5 +- src/text/text1.asm | 2 +- src/text/text2.asm | 10 +- src/text/text_offsets.asm | 12 +- src/wram.asm | 12 +- 10 files changed, 377 insertions(+), 43 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 928e78cd..d3883fe7 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -234,9 +234,16 @@ EFFECT_FAILED_UNSUCCESSFUL EQU $02 ; wAnimationQueue length ANIMATION_QUEUE_LENGTH EQU 7 -PRIZES_1 EQU $01 -PRIZES_2 EQU $02 -PRIZES_3 EQU $03 -PRIZES_4 EQU $04 -PRIZES_5 EQU $05 -PRIZES_6 EQU $06 +PRIZES_1 EQU $01 +PRIZES_2 EQU $02 +PRIZES_3 EQU $03 +PRIZES_4 EQU $04 +PRIZES_5 EQU $05 +PRIZES_6 EQU $06 + +; constants to use as input to LookForCardInDeck +SEARCHEFFECT_CARD_ID EQU $0 +SEARCHEFFECT_NIDORAN EQU $1 +SEARCHEFFECT_BASIC_FIGHTING EQU $2 +SEARCHEFFECT_BASIC_ENERGY EQU $3 +SEARCHEFFECT_POKEMON EQU $4 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 88938faf..60d2004f 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -60,8 +60,8 @@ WeepinbellPoisonPowderEffectCommands: VictreebelLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBenchPokemon dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchDefendingPokemon - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelectBenchPokemon - dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelectBenchPokemon + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelect + dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelect db $00 VictreebelAcidEffectCommands: @@ -125,7 +125,7 @@ BeedrillTwineedleEffectCommands: BeedrillPoisonStingEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Poison50PercentEffect - dbw EFFECTCMDTYPE_AI, $480d + dbw EFFECTCMDTYPE_AI, BeedrillPoisonSting_AIEffect db $00 ExeggcuteHypnosisEffectCommands: @@ -133,7 +133,7 @@ ExeggcuteHypnosisEffectCommands: db $00 ExeggcuteLeechSeedEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4815 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ExeggcuteLeechSeedEffect db $00 KoffingFoulGasEffectCommands: @@ -154,10 +154,10 @@ OddishStunSporeEffectCommands: db $00 OddishSproutEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $484a - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $48cc - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $485a - dbw EFFECTCMDTYPE_UNKNOWN_08, $48b7 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SproutEffect_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, SproutEffect_PutInPlayArea + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, SproutEffect_SelectFromDeck + dbw EFFECTCMDTYPE_UNKNOWN_08, SproutEffect_AISelect db $00 ExeggutorTeleportEffectCommands: diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index c4a6b27a..83db5a4b 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -2268,11 +2268,11 @@ Func_4e98: ; 4e98 (1:4e98) Func_4f2d: ; 4f2d (1:4f2d) ld a, [wDuelDisplayedScreen] cp SHUFFLE_DECK - jr z, .asm_4f3d + jr z, .skip_draw_scene call ZeroObjectPositionsAndToggleOAMCopy call EmptyScreen call DrawDuelistPortraitsAndNames -.asm_4f3d +.skip_draw_scene ld a, SHUFFLE_DECK ld [wDuelDisplayedScreen], a ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index af416131..aab0cd94 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -553,7 +553,35 @@ Func_1c83d: ; 1c83d (7:483d) ret ; 0x1c858 - INCROM $1c858, $1c8ef + INCROM $1c858, $1c8bc + +Func_1c8bc: ; 1c8bc (7:48bc) + push hl + push bc + call Set_OBJ_8x8 + ld a, $a2 + ld [wDoFrameFunction], a + ld a, $3b + ld [wDoFrameFunction + 1], a + ld a, $ff + ld hl, wAnimationQueue + ld c, ANIMATION_QUEUE_LENGTH +.fill_queue + ld [hli], a + dec c + jr nz, .fill_queue + ld [wd42a], a + ld [wd4c0], a + xor a + ld [wd4ac], a + ld [wd4ad], a + ld [wd4b3], a + call Func_1ccbc + call Func_3ca0 + pop bc + pop hl + ret +; 0x1c8ef Func_1c8ef: ; 1c8ef (7:48ef) ld a, [wDoFrameFunction + 0] @@ -895,7 +923,24 @@ Func_1cb18: ; 1cb18 (7:4b18) jr .asm_1cb57 ; 0x1cb5e - INCROM $1cb5e, $1d078 + INCROM $1cb5e, $1ccbc + +Func_1ccbc: ; 1ccbc (7:4cbc) + ld a, $ff + ld [wd42a], a + call DisableInt_LYCoincidence + xor a + ldh [hSCX], a + ldh [rSCX], a + ldh [hSCY], a + ld hl, wd4b9 + ld [hl], $bc + inc hl + ld [hl], $4c + ret +; 0x1ccd4 + + INCROM $1ccd4, $1d078 Func_1d078: ; 1d078 (7:5078) ld a, [wd627] diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index d254f5cb..839c814d 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -143,7 +143,8 @@ Func_2c0bd: ; 2c0bd (b:40bd) call ShuffleDeck ret -Func_2c0c7: ; 2c0c7 (b:40c7) +; return carry if Turn Duelist is the Player +CheckIfTurnDuelistIsPlayer: ; 2c0c7 (b:40c7) ld a, DUELVARS_DUELIST_TYPE call GetTurnDuelistVariable cp DUELIST_TYPE_PLAYER @@ -336,7 +337,7 @@ HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ; and handles its animation. ; input: ; d = damage effectiveness -; e = damage dealt +; e = HP amount to recover ApplyAndAnimateHPDrain: ; 2c221 (b:4221) push de ld hl, wccbd @@ -456,7 +457,158 @@ CreateEnergyCardListFromOpponentDiscardPile: ; 2c2a4 (b:42a4) ret ; 0x2c2e0 - INCROM $2c2e0, $2c487 +; returns carry if Deck is empty +CheckIfDeckIsEmpty: ; 2c2e0 (b:42e0) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ldtx hl, NoCardsLeftInTheDeckText + cp DECK_SIZE + ccf + ret +; 0x2c2ec + +; searches through Deck in wDuelTempList looking for +; a certain card or cards, and prints text depending +; on whether at least one was found. +; if none were found, asks the Player whether to look +; in the Deck anyway, and returns carry if No is selected. +; uses SEARCHEFFECT_* as input which determines what to search for: +; SEARCHEFFECT_CARD_ID = search for card ID in e +; SEARCHEFFECT_NIDORAN = search for either NidoranM or NidoranF +; SEARCHEFFECT_BASIC_FIGHTING = search for any Basic Fighting Pokemon +; SEARCHEFFECT_BASIC_ENERGY = search for any Basic Energy +; SEARCHEFFECT_POKEMON = search for any Pokemon card +; input: +; d = SEARCHEFFECT_* constant +; e = (optional) card ID to search for in deck +; hl = text to print if Deck has card(s) +; output: +; carry set if refuse to look at deck +LookForCardInDeck: ; 2c2ec (b:42ec) + push hl + push bc + ld a, [wDuelTempList] + cp $ff + jr z, .none_in_deck + ld a, d + ld hl, .search_table + call JumpToFunctionInTable + jr c, .none_in_deck + pop bc + pop hl + call DrawWideTextBox_WaitForInput + or a + ret + +.none_in_deck + pop hl + call LoadTxRam2 + pop hl + ldtx hl, ThereIsNoInTheDeckText + call DrawWideTextBox_WaitForInput + ldtx hl, WouldYouLikeToCheckTheDeckText + call YesOrNoMenuWithText_SetCursorToYes + ret +; 0x2c317 + +.search_table + dw .SearchDeckForE + dw .SearchDeckForNidoran + dw .SearchDeckForBasicFighting + dw .SearchDeckForBasicEnergy + dw .SearchDeckForPokemon + +.set_carry ; 2c321 (b:4321) + scf + ret +; 0x2c323 + +; returns carry if no card with +; same card ID as e is found in Deck +.SearchDeckForE ; 2c323 (b:4323) + ld hl, wDuelTempList +.loop_deck_e + ld a, [hli] + cp $ff + jr z, .set_carry + push de + call GetCardIDFromDeckIndex + ld a, e + pop de + cp e + jr nz, .loop_deck_e + or a + ret +; 0x2c336 + +; returns carry if no NidoranM or NidoranF card is found in Deck +.SearchDeckForNidoran ; 2c336 (b:4336) + ld hl, wDuelTempList +.loop_deck_nidoran + ld a, [hli] + cp $ff + jr z, .set_carry + call GetCardIDFromDeckIndex + ld a, e + cp NIDORANF + jr z, .found_nidoran + cp NIDORANM + jr nz, .loop_deck_nidoran +.found_nidoran + or a + ret +; 0x2c34c + +; returns carry if no Basic Fighting Pokemon is found in Deck +.SearchDeckForBasicFighting ; 2c34c (b:434c) + ld hl, wDuelTempList +.loop_deck_fighting + ld a, [hli] + cp $ff + jr z, .set_carry + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_PKMN_FIGHTING + jr nz, .loop_deck_fighting + ld a, [wLoadedCard2Stage] + or a ; BASIC + jr nz, .loop_deck_fighting + ret +; 0x2c365 + +; returns carry if no Basic Energy cards are found in Deck +.SearchDeckForBasicEnergy ; 2c365 (b:4365) + ld hl, wDuelTempList +.loop_deck_energy + ld a, [hli] + cp $ff + jr z, .set_carry + call GetCardIDFromDeckIndex + call GetCardType + cp TYPE_ENERGY_DOUBLE_COLORLESS + jr z, .loop_deck_energy + and TYPE_ENERGY + jr z, .loop_deck_energy + or a + ret +; 0x2c37d + +; returns carry if no Pokemon cards are found in Deck +.SearchDeckForPokemon ; 2c37d (b:437d) + ld hl, wDuelTempList +.loop_deck_pkmn + ld a, [hli] + cp $ff + jr z, .set_carry + call GetCardIDFromDeckIndex + call GetCardType + cp TYPE_ENERGY + jr nc, .loop_deck_pkmn + or a + ret +; 0x2c391 + + INCROM $2c391, $2c487 ; handles the selection of a forced switch ; by link/AI opponent or by the player. @@ -621,7 +773,7 @@ VictreebelLure_CheckBenchPokemon: ; 2c740 (b:4740) ret ; 0x2c74b -VictreebelLure_PlayerSelectBenchPokemon: ; 2c74b (b:474b) +VictreebelLure_PlayerSelect: ; 2c74b (b:474b) ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText call DrawWideTextBox_WaitForInput call SwapTurn @@ -635,7 +787,7 @@ VictreebelLure_PlayerSelectBenchPokemon: ; 2c74b (b:474b) ret ; 0x2c764 -VictreebelLure_AISelectBenchPokemon: ; 2c764 (b:4764) +VictreebelLure_AISelect: ; 2c764 (b:4764) call AIFindBenchWithLowestHP ldh [hTemp_ffa0], a ret @@ -734,8 +886,6 @@ ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) ret ; 0x2c7ed - INCROM $2c7ed, $2c7ed - Twineedle_AIEffect: ; 2c7ed (b:47ed) ld a, 30 lb de, 0, 60 @@ -756,7 +906,21 @@ Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) ret ; 0x2c80d - INCROM $2c80d, $2c822 +BeedrillPoisonSting_AIEffect: ; 2c80d (b:480d) + ld a, 5 + lb de, 0, 10 + jp Func_2c0d4 +; 0x2c815 + +ExeggcuteLeechSeedEffect: ; 2c815 (b:4815) + ld hl, wDealtDamage + ld a, [hli] + or a + ret z ; return if no damage dealt + ld de, 10 + call ApplyAndAnimateHPDrain + ret +; 0x2c822 FoulGas_AIEffect: ; 2c822 (b:4822) ld a, 5 @@ -783,7 +947,116 @@ MetapodStiffenEffect: ; 2c836 (b:4836) ret ; 0x2c84a - INCROM $2c84a, $2c925 +; returns carry if no cards in Deck or if +; Play Area is full already. +SproutEffect_CheckDeckAndPlayArea: ; 2c84a (b:484a) + call CheckIfDeckIsEmpty + ret c ; return if no cards in deck + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2c85a + +SproutEffect_SelectFromDeck: ; 2c85a (b:485a) + ld a, $ff + ldh [hTemp_ffa0], a + + call CreateDeckCardList + ldtx hl, ChooseAnOddishFromTheDeckText + ldtx bc, OddishText + lb de, SEARCHEFFECT_CARD_ID, ODDISH + call LookForCardInDeck + ret c + +; draw Deck list interface and print text + bank1call Func_5591 + ldtx hl, ChooseAnOddishText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +.loop + bank1call DisplayCardList + jr c, .pressed_b + call GetCardIDFromDeckIndex + ld bc, ODDISH + call CompareDEtoBC + jr nz, .play_sfx + +; Oddish was selected + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret + +.play_sfx + ; play SFX and loop back + call Func_3794 + jr .loop + +.pressed_b +; figure if Player can exit the screen without selecting, +; that is, if the Deck has no Oddish card. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_b_press + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + ld a, l + call GetCardIDFromDeckIndex + ld bc, ODDISH + call CompareDEtoBC + jr z, .play_sfx ; found Oddish, go back to top loop +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_b_press + +; no Oddish in Deck, can safely exit screen + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2c8b7 + +SproutEffect_AISelect: ; 2c8b7 (b:48b7) + call CreateDeckCardList + ld hl, wDuelTempList +.loop_deck + ld a, [hli] + ldh [hTemp_ffa0], a + cp $ff + ret z ; no Oddish + call GetCardIDFromDeckIndex + ld a, e + cp ODDISH + jr nz, .loop_deck + ret ; Oddish found +; 0x2c8cc + +SproutEffect_PutInPlayArea: ; 2c8cc (b:48cc) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .shuffle + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .shuffle + ; display card on screen + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen +.shuffle + call Func_2c0bd + ret +; 0x2c8ec + + INCROM $2c8ec, $2c925 BigEggsplosion_AIEffect: ; 2c925 (b:4925) ldh a, [hTempPlayAreaLocation_ff9d] diff --git a/src/engine/home.asm b/src/engine/home.asm index 98b10ac8..edbd6f5c 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -11051,9 +11051,10 @@ Func_3b11: ; 3b11 (0:3b11) Func_3b21: ; 3b21 (0:3b21) ldh a, [hBankROM] push af - ld a, $07 + ld a, BANK(Func_1c8bc) call BankswitchROM - call $48bc + call Func_1c8bc + pop af call BankswitchROM ret diff --git a/src/text/text1.asm b/src/text/text1.asm index 00dc22f5..46bb72d4 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -831,7 +831,7 @@ Text00b0: ; 3749e (d:749e) line "in the Discard Pile." done -Text00b1: ; 374d4 (d:74d4) +NoCardsLeftInTheDeckText: ; 374d4 (d:74d4) text "There are no cards left in the Deck." done diff --git a/src/text/text2.asm b/src/text/text2.asm index 97ecf451..b9ffa9ba 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -242,12 +242,12 @@ Text0125: ; 3899f (e:499f) line "from the Deck." done -Text0126: ; 389cf (e:49cf) +ChooseAnOddishFromTheDeckText: ; 389cf (e:49cf) text "Choose an Oddish" line "from the Deck." done -Text0127: ; 389f0 (e:49f0) +ChooseAnOddishText: ; 389f0 (e:49f0) text "Choose an Oddish" done @@ -406,12 +406,12 @@ Text013a: ; 391dc (e:51dc) line "to be used with Metronome." done -Text013b: ; 39215 (e:5215) +ThereIsNoInTheDeckText: ; 39215 (e:5215) text "There is no " line "in the Deck." done -Text013c: ; 39231 (e:5231) +WouldYouLikeToCheckTheDeckText: ; 39231 (e:5231) text "Would you like to check the Deck?" done @@ -429,7 +429,7 @@ Text013f: ; 392c9 (e:52c9) text "Nidoran♂ Nidoran♀" done -Text0140: ; 392dc (e:52dc) +OddishText: ; 392dc (e:52dc) text "Oddish" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 7ff0d447..941f9aeb 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -178,7 +178,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer NoEnergyAttachedToOpponentsActiveText ; 0x00ae textpointer Text00af ; 0x00af textpointer Text00b0 ; 0x00b0 - textpointer Text00b1 ; 0x00b1 + textpointer NoCardsLeftInTheDeckText ; 0x00b1 textpointer NoSpaceOnTheBenchText ; 0x00b2 textpointer NoPokemonCapableOfEvolvingText ; 0x00b3 textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 @@ -295,8 +295,8 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0123 ; 0x0123 textpointer Text0124 ; 0x0124 textpointer Text0125 ; 0x0125 - textpointer Text0126 ; 0x0126 - textpointer Text0127 ; 0x0127 + textpointer ChooseAnOddishFromTheDeckText ; 0x0126 + textpointer ChooseAnOddishText ; 0x0127 textpointer Text0128 ; 0x0128 textpointer Text0129 ; 0x0129 textpointer Text012a ; 0x012a @@ -316,12 +316,12 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0138 ; 0x0138 textpointer Text0139 ; 0x0139 textpointer Text013a ; 0x013a - textpointer Text013b ; 0x013b - textpointer Text013c ; 0x013c + textpointer ThereIsNoInTheDeckText ; 0x013b + textpointer WouldYouLikeToCheckTheDeckText ; 0x013c textpointer Text013d ; 0x013d textpointer Text013e ; 0x013e textpointer Text013f ; 0x013f - textpointer Text0140 ; 0x0140 + textpointer OddishText ; 0x0140 textpointer Text0141 ; 0x0141 textpointer Text0142 ; 0x0142 textpointer Text0143 ; 0x0143 diff --git a/src/wram.asm b/src/wram.asm index 1d678b61..3613eba1 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -2325,8 +2325,16 @@ wd4b1:: ; d4b1 wd4b2:: ; d4b2 ds $1 - - ds $b + +wd4b3:: ; d4b3 + ds $1 + + ds $5 + +wd4b9:: ; d4b9 + ds $1 + + ds $4 wd4be:: ; d4be ds $1 From c11acb74b4bc7decf962b191fbb08d6b72e515aa Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Mon, 11 May 2020 00:25:17 +0100 Subject: [PATCH 26/45] Exeggutor Teleport effect --- src/data/effect_commands.asm | 8 +++---- src/engine/effect_functions.asm | 40 ++++++++++++++++++++++++++++++++- src/text/text1.asm | 2 +- src/text/text_offsets.asm | 2 +- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 60d2004f..952e895b 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -161,10 +161,10 @@ OddishSproutEffectCommands: db $00 ExeggutorTeleportEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $48ec - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $491a - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $48f7 - dbw EFFECTCMDTYPE_UNKNOWN_08, $490f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, TeleportEffect_CheckBench + dbw EFFECTCMDTYPE_AFTER_DAMAGE, TeleportEffect_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, TeleportEffect_PlayerSelect + dbw EFFECTCMDTYPE_UNKNOWN_08, TeleportEffect_AISelect db $00 ExeggutorBigEggsplosionEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 839c814d..5426f29c 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -1056,7 +1056,45 @@ SproutEffect_PutInPlayArea: ; 2c8cc (b:48cc) ret ; 0x2c8ec - INCROM $2c8ec, $2c925 +; returns carry if no Pokemon on Bench +TeleportEffect_CheckBench: ; 2c8ec (b:48ec) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, ThereAreNoPokemonOnBenchText + cp 2 + ret +; 0x2c8f7 + +TeleportEffect_PlayerSelect: ; 2c8f7 (b:48f7) + ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + ld a, $01 + ld [wcbd4], a +.loop + bank1call OpenPlayAreaScreenForSelection + jr c, .loop + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2c90f + +TeleportEffect_AISelect: ; 2c90f (b:490f) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + call Random + ldh [hTemp_ffa0], a + ret +; 0x2c91a + +TeleportEffect_SwitchEffect: ; 2c91a (b:491a) + ldh a, [hTemp_ffa0] + ld e, a + call SwapArenaWithBenchPokemon + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2c925 BigEggsplosion_AIEffect: ; 2c925 (b:4925) ldh a, [hTempPlayAreaLocation_ff9d] diff --git a/src/text/text1.asm b/src/text/text1.asm index 46bb72d4..ff07f9df 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -981,7 +981,7 @@ Text00d1: ; 379ae (d:79ae) text "Can only be used on the Bench." done -Text00d2: ; 379ce (d:79ce) +ThereAreNoPokemonOnBenchText: ; 379ce (d:79ce) text "There are no Pokémon on the Bench." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 941f9aeb..bc9d545d 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -211,7 +211,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00cf ; 0x00cf textpointer Text00d0 ; 0x00d0 textpointer Text00d1 ; 0x00d1 - textpointer Text00d2 ; 0x00d2 + textpointer ThereAreNoPokemonOnBenchText ; 0x00d2 textpointer Text00d3 ; 0x00d3 textpointer UnableDueToToxicGasText ; 0x00d4 textpointer Text00d5 ; 0x00d5 From a45b7780623fcc8b1d5af8863f07786a8f74a9e6 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Mon, 11 May 2020 10:16:23 +0100 Subject: [PATCH 27/45] NidoranF attacks --- src/data/cards.asm | 16 +-- src/data/effect_commands.asm | 44 +++---- src/engine/effect_functions.asm | 203 ++++++++++++++++++++++++++++---- src/text/text10.asm | 2 +- src/text/text2.asm | 6 +- src/text/text_offsets.asm | 8 +- 6 files changed, 221 insertions(+), 58 deletions(-) diff --git a/src/data/cards.asm b/src/data/cards.asm index e601f986..dca875a0 100644 --- a/src/data/cards.asm +++ b/src/data/cards.asm @@ -858,12 +858,12 @@ NidoranFCard: ; 31134 (c:5134) ; move 1 energy GRASS, 1 ; energies - tx FurySweepesName ; name + tx FurySwipesName ; name tx TripleAttackX10Description ; description dw NONE ; description (cont) db 10 ; damage db DAMAGE_X ; category - dw NidoranFFurySweepesEffectCommands ; effect commands + dw NidoranFFurySwipesEffectCommands ; effect commands db NONE ; flags 1 db NONE ; flags 2 db NONE ; flags 3 @@ -3320,12 +3320,12 @@ PsyduckCard: ; 31d64 (c:5d64) ; move 2 energy WATER, 1 ; energies - tx FurySweepesName ; name + tx FurySwipesName ; name tx TripleAttackX10Description ; description dw NONE ; description (cont) db 10 ; damage db DAMAGE_X ; category - dw PsyduckFurySweepesEffectCommands ; effect commands + dw PsyduckFurySwipesEffectCommands ; effect commands db NONE ; flags 1 db NONE ; flags 2 db NONE ; flags 3 @@ -5972,12 +5972,12 @@ SandslashCard: ; 32a98 (c:6a98) ; move 2 energy FIGHTING, 2 ; energies - tx FurySweepesName ; name + tx FurySwipesName ; name tx TripleAttackX20Description ; description dw NONE ; description (cont) db 20 ; damage db DAMAGE_X ; category - dw SandslashFurySweepesEffectCommands ; effect commands + dw SandslashFurySwipesEffectCommands ; effect commands db NONE ; flags 1 db NONE ; flags 2 db NONE ; flags 3 @@ -6162,12 +6162,12 @@ PrimeapeCard: ; 32b9c (c:6b9c) ; move 1 energy FIGHTING, 2 ; energies - tx FurySweepesName ; name + tx FurySwipesName ; name tx TripleAttackX20Description ; description dw NONE ; description (cont) db 20 ; damage db DAMAGE_X ; category - dw PrimeapeFurySweepesEffectCommands ; effect commands + dw PrimeapeFurySwipesEffectCommands ; effect commands db NONE ; flags 1 db NONE ; flags 2 db NONE ; flags 3 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 952e895b..bcf66364 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -59,9 +59,9 @@ WeepinbellPoisonPowderEffectCommands: VictreebelLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBenchPokemon - dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchDefendingPokemon - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelect - dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelectEffect db $00 VictreebelAcidEffectCommands: @@ -154,17 +154,17 @@ OddishStunSporeEffectCommands: db $00 OddishSproutEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SproutEffect_CheckDeckAndPlayArea - dbw EFFECTCMDTYPE_AFTER_DAMAGE, SproutEffect_PutInPlayArea - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, SproutEffect_SelectFromDeck - dbw EFFECTCMDTYPE_UNKNOWN_08, SproutEffect_AISelect + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Sprout_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Sprout_PutInPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Sprout_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, Sprout_AISelectEffect db $00 ExeggutorTeleportEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, TeleportEffect_CheckBench - dbw EFFECTCMDTYPE_AFTER_DAMAGE, TeleportEffect_SwitchEffect - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, TeleportEffect_PlayerSelect - dbw EFFECTCMDTYPE_UNKNOWN_08, TeleportEffect_AISelect + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Teleport_CheckBench + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Teleport_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Teleport_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, Teleport_AISelectEffect db $00 ExeggutorBigEggsplosionEffectCommands: @@ -184,19 +184,19 @@ NidokingToxicEffectCommands: db $00 NidoqueenBoyfriendsEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4998 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, BoyfriendsEffect db $00 -NidoranFFurySweepesEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $49c6 - dbw EFFECTCMDTYPE_AI, $49be +NidoranFFurySwipesEffectCommands: + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, NidoranFFurySwipes_MultiplierEffect + dbw EFFECTCMDTYPE_AI, NidoranFFurySwipes_AIEffect db $00 NidoranFCallForFamilyEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $49db - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4a6e - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $49eb - dbw EFFECTCMDTYPE_UNKNOWN_08, $4a55 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, NidoranFCallForFamily_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, NidoranFCallForFamily_PutInPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, NidoranFCallForFamily_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, NidoranFCallForFamily_AISelectEffect db $00 NidoranMHornHazardEffectCommands: @@ -395,7 +395,7 @@ PsyduckHeadacheEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $500e db $00 -PsyduckFurySweepesEffectCommands: +PsyduckFurySwipesEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $501e dbw EFFECTCMDTYPE_AI, $5016 db $00 @@ -894,7 +894,7 @@ OnixHardenEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6075 db $00 -PrimeapeFurySweepesEffectCommands: +PrimeapeFurySwipesEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6083 dbw EFFECTCMDTYPE_AI, $607b db $00 @@ -974,7 +974,7 @@ SandshrewSandAttackEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $626b db $00 -SandslashFurySweepesEffectCommands: +SandslashFurySwipesEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6279 dbw EFFECTCMDTYPE_AI, $6271 db $00 diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 5426f29c..8075a71a 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -191,11 +191,11 @@ Func_2c0e9: ; 2c0e9 (b:40e9) ld [hl], a ret -; Sets some flags for AI use -; [wDamage] <- a -; [wAIMinDamage] <- d -; [wAIMaxDamage] <- e -Func_2c0fb: ; 2c0fb (b:40fb) +; Stores information about the attack damage for AI purposes +; [wDamage] <- a (average amount of damage) +; [wAIMinDamage] <- d (minimum) +; [wAIMaxDamage] <- e (maximum) +StoreAIDamageInfo: ; 2c0fb (b:40fb) ld [wDamage], a xor a ld [wDamage + 1], a @@ -704,7 +704,8 @@ AIFindBenchWithLowestHP: ; 2c564 (b:4564) SpitPoison_AIEffect: ; 2c6f0 (b:46f0) ld a, 5 lb de, 0, 10 - jp Func_2c0fb + jp StoreAIDamageInfo +; 0x2c6f8 ; If heads, defending Pokemon becomes poisoned SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8) @@ -773,7 +774,7 @@ VictreebelLure_CheckBenchPokemon: ; 2c740 (b:4740) ret ; 0x2c74b -VictreebelLure_PlayerSelect: ; 2c74b (b:474b) +VictreebelLure_PlayerSelectEffect: ; 2c74b (b:474b) ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText call DrawWideTextBox_WaitForInput call SwapTurn @@ -787,13 +788,13 @@ VictreebelLure_PlayerSelect: ; 2c74b (b:474b) ret ; 0x2c764 -VictreebelLure_AISelect: ; 2c764 (b:4764) +VictreebelLure_AISelectEffect: ; 2c764 (b:4764) call AIFindBenchWithLowestHP ldh [hTemp_ffa0], a ret ; 0x2c76a -VictreebelLure_SwitchDefendingPokemon: ; 2c76a (b:476a) +VictreebelLure_SwitchEffect: ; 2c76a (b:476a) call SwapTurn ldh a, [hTemp_ffa0] ld e, a @@ -889,7 +890,8 @@ ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) Twineedle_AIEffect: ; 2c7ed (b:47ed) ld a, 30 lb de, 0, 60 - jp Func_2c0fb + jp StoreAIDamageInfo +; 0x2c7f5 ; Flip 2 coins; deal 30x number of heads Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) @@ -949,7 +951,7 @@ MetapodStiffenEffect: ; 2c836 (b:4836) ; returns carry if no cards in Deck or if ; Play Area is full already. -SproutEffect_CheckDeckAndPlayArea: ; 2c84a (b:484a) +Sprout_CheckDeckAndPlayArea: ; 2c84a (b:484a) call CheckIfDeckIsEmpty ret c ; return if no cards in deck ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA @@ -960,7 +962,7 @@ SproutEffect_CheckDeckAndPlayArea: ; 2c84a (b:484a) ret ; 0x2c85a -SproutEffect_SelectFromDeck: ; 2c85a (b:485a) +Sprout_PlayerSelectEffect: ; 2c85a (b:485a) ld a, $ff ldh [hTemp_ffa0], a @@ -1023,7 +1025,7 @@ SproutEffect_SelectFromDeck: ; 2c85a (b:485a) ret ; 0x2c8b7 -SproutEffect_AISelect: ; 2c8b7 (b:48b7) +Sprout_AISelectEffect: ; 2c8b7 (b:48b7) call CreateDeckCardList ld hl, wDuelTempList .loop_deck @@ -1038,7 +1040,7 @@ SproutEffect_AISelect: ; 2c8b7 (b:48b7) ret ; Oddish found ; 0x2c8cc -SproutEffect_PutInPlayArea: ; 2c8cc (b:48cc) +Sprout_PutInPlayAreaEffect: ; 2c8cc (b:48cc) ldh a, [hTemp_ffa0] cp $ff jr z, .shuffle @@ -1057,7 +1059,7 @@ SproutEffect_PutInPlayArea: ; 2c8cc (b:48cc) ; 0x2c8ec ; returns carry if no Pokemon on Bench -TeleportEffect_CheckBench: ; 2c8ec (b:48ec) +Teleport_CheckBench: ; 2c8ec (b:48ec) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable ldtx hl, ThereAreNoPokemonOnBenchText @@ -1065,7 +1067,7 @@ TeleportEffect_CheckBench: ; 2c8ec (b:48ec) ret ; 0x2c8f7 -TeleportEffect_PlayerSelect: ; 2c8f7 (b:48f7) +Teleport_PlayerSelectEffect: ; 2c8f7 (b:48f7) ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText call DrawWideTextBox_WaitForInput bank1call HasAlivePokemonInBench @@ -1079,7 +1081,7 @@ TeleportEffect_PlayerSelect: ; 2c8f7 (b:48f7) ret ; 0x2c90f -TeleportEffect_AISelect: ; 2c90f (b:490f) +Teleport_AISelectEffect: ; 2c90f (b:490f) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable call Random @@ -1087,7 +1089,7 @@ TeleportEffect_AISelect: ; 2c90f (b:490f) ret ; 0x2c91a -TeleportEffect_SwitchEffect: ; 2c91a (b:491a) +Teleport_SwitchEffect: ; 2c91a (b:491a) ldh a, [hTemp_ffa0] ld e, a call SwapArenaWithBenchPokemon @@ -1145,7 +1147,8 @@ SetDamageToATimes20: ; 2c958 (b:4958) Thrash_AIEffect: ; 2c96b (b:496b) ld a, 35 lb de, 30, 40 - jp Func_2c0fb + jp StoreAIDamageInfo +; 0x2c973 ; If heads 10 more damage; if tails, 10 damage to itself Thrash_ModifierEffect: ; 2c973 (b:4973) @@ -1176,7 +1179,167 @@ Toxic_DoublePoisonEffect: ; 2c994 (b:4994) ret ; 0x2c998 - INCROM $2c998, $2cbfb +BoyfriendsEffect: ; 2c998 (b:4998) + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld c, PLAY_AREA_ARENA +.loop + ld a, [hl] + cp $ff + jr z, .done + call GetCardIDFromDeckIndex + ld a, e + cp NIDOKING + jr nz, .next + ld a, d + cp $00 ; why check d? Card IDs are only 1 byte long + jr nz, .next + inc c +.next + inc hl + jr .loop +.done +; c holds number of Nidoking found in Play Area + ld a, c + add a + call ATimes10 + call AddToDamage ; adds 2 * 10 * c + ret +; 0x2c9be + +NidoranFFurySwipes_AIEffect: ; 2c9be (b:49be) + ld a, 15 + lb de, 0, 30 + jp StoreAIDamageInfo +; 0x2c9c6 + +NidoranFFurySwipes_MultiplierEffect: ; 2c9c6 (b:49c6) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 3 + call TossCoinATimes_BankB + call ATimes10 + call StoreDamageInfo + ret +; 0x2c9db + +NidoranFCallForFamily_CheckDeckAndPlayArea: ; 2c9db (b:49db) + call CheckIfDeckIsEmpty + ret c ; return if no cards in deck + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2c9eb + +NidoranFCallForFamily_PlayerSelectEffect: ; 2c9eb (b:49eb) + ld a, $ff + ldh [hTemp_ffa0], a + + call CreateDeckCardList + ldtx hl, ChooseNidoranFromDeckText + ldtx bc, NidoranMNidoranFText + lb de, SEARCHEFFECT_NIDORAN, $00 + call LookForCardInDeck + ret c + +; draw Deck list interface and print text + bank1call Func_5591 + ldtx hl, ChooseNidoranText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +.loop + bank1call DisplayCardList + jr c, .pressed_b + call GetCardIDFromDeckIndex + ld bc, NIDORANF + call CompareDEtoBC + jr z, .selected_nidoran + ld bc, NIDORANM + call CompareDEtoBC + jr nz, .loop ; .play_sfx would be more appropriate here + +.selected_nidoran + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret + +.play_sfx + ; play SFX and loop back + call Func_3794 + jr .loop + +.pressed_b +; figure if Player can exit the screen without selecting, +; that is, if the Deck has no NidoranF or NidoranM card. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_b_press + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + ld a, l + call GetCardIDFromDeckIndex + ld bc, NIDORANF + call CompareDEtoBC + jr z, .play_sfx ; found, go back to top loop + ld bc, NIDORANM + jr z, .play_sfx ; found, go back to top loop +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_b_press + +; no Nidoran in Deck, can safely exit screen + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2ca55 + +NidoranFCallForFamily_AISelectEffect: ; 2ca55 (b:4a55) + call CreateDeckCardList + ld hl, wDuelTempList +.loop_deck + ld a, [hli] + ldh [hTemp_ffa0], a + cp $ff + ret z ; none found + call GetCardIDFromDeckIndex + ld a, e + cp NIDORANF + jr z, .found + cp NIDORANM + jr nz, .loop_deck +.found + ret +; 0x2ca6e + +NidoranFCallForFamily_PutInPlayAreaEffect: ; 2ca6e (b:4a6e) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .shuffle + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .shuffle + ; display card on screen + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen +.shuffle + call Func_2c0bd + ret +; 0x2ca8e + + INCROM $2ca8e, $2cbfb Func_2cbfb: ; 2cbfb (b:4bfb) ldh a, [hAIEnergyTransPlayAreaLocation] diff --git a/src/text/text10.asm b/src/text/text10.asm index 057820fb..49fb302b 100644 --- a/src/text/text10.asm +++ b/src/text/text10.asm @@ -85,7 +85,7 @@ NidoranFName: ; 582e5 (16:42e5) text "Nidoran♀" done -FurySweepesName: ; 582ef (16:42ef) +FurySwipesName: ; 582ef (16:42ef) text "Fury Swipes" done diff --git a/src/text/text2.asm b/src/text/text2.asm index b9ffa9ba..bea4094b 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -260,12 +260,12 @@ Text0129: ; 38a14 (e:4a14) line "Energy card." done -Text012a: ; 38a31 (e:4a31) +ChooseNidoranFromDeckText: ; 38a31 (e:4a31) text "Choose a Nidoran♀ or a" line "Nidoran♂ from the Deck." done -Text012b: ; 38a61 (e:4a61) +ChooseNidoranText: ; 38a61 (e:4a61) text "Choose a Nidoran♀" line "or a Nidoran♂." done @@ -425,7 +425,7 @@ Text013e: ; 3928c (e:528c) line " Yours Opponent's" done -Text013f: ; 392c9 (e:52c9) +NidoranMNidoranFText: ; 392c9 (e:52c9) text "Nidoran♂ Nidoran♀" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index bc9d545d..5cc70d00 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -299,8 +299,8 @@ TextOffsets:: ; 34000 (d:4000) textpointer ChooseAnOddishText ; 0x0127 textpointer Text0128 ; 0x0128 textpointer Text0129 ; 0x0129 - textpointer Text012a ; 0x012a - textpointer Text012b ; 0x012b + textpointer ChooseNidoranFromDeckText ; 0x012a + textpointer ChooseNidoranText ; 0x012b textpointer Text012c ; 0x012c textpointer Text012d ; 0x012d textpointer Text012e ; 0x012e @@ -320,7 +320,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer WouldYouLikeToCheckTheDeckText ; 0x013c textpointer Text013d ; 0x013d textpointer Text013e ; 0x013e - textpointer Text013f ; 0x013f + textpointer NidoranMNidoranFText ; 0x013f textpointer OddishText ; 0x0140 textpointer Text0141 ; 0x0141 textpointer Text0142 ; 0x0142 @@ -2124,7 +2124,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer CobraName ; 0x0848 textpointer ArbokDescription ; 0x0849 textpointer NidoranFName ; 0x084a - textpointer FurySweepesName ; 0x084b + textpointer FurySwipesName ; 0x084b textpointer TripleAttackX10Description ; 0x084c textpointer CallForFamilyName ; 0x084d textpointer NidoranFsCallForFamilyDescription ; 0x084e From a3d2aee4fb7427393ae0d28a558488af493bb1b3 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Mon, 11 May 2020 10:30:31 +0100 Subject: [PATCH 28/45] NidoranM Horn Hazard effect --- src/data/effect_commands.asm | 4 ++-- src/engine/effect_functions.asm | 22 +++++++++++++++++++++- src/text/text1.asm | 2 +- src/text/text_offsets.asm | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index bcf66364..b92f5b67 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -200,8 +200,8 @@ NidoranFCallForFamilyEffectCommands: db $00 NidoranMHornHazardEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4a96 - dbw EFFECTCMDTYPE_AI, $4a8e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HornHazard_Failure50PercentEffect + dbw EFFECTCMDTYPE_AI, HornHazard_AIEffect db $00 NidorinaSupersonicEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 8075a71a..2123fd88 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -1339,7 +1339,27 @@ NidoranFCallForFamily_PutInPlayAreaEffect: ; 2ca6e (b:4a6e) ret ; 0x2ca8e - INCROM $2ca8e, $2cbfb +HornHazard_AIEffect: ; 2ca8e (b:4a8e) + ld a, 15 + lb de, 0, 30 + jp StoreAIDamageInfo +; 0x2ca96 + +HornHazard_Failure50PercentEffect: ; 2ca96 (b:4a96) + ldtx de, DamageCheckIfTailsNoDamageText + call TossCoin_BankB + jr c, .heads + xor a + call StoreDamageInfo + call SetWasUnsuccessful + ret +.heads + ld a, $01 + ld [wLoadedMoveAnimation], a + ret +; 0x2caac + + INCROM $2caac, $2cbfb Func_2cbfb: ; 2cbfb (b:4bfb) ldh a, [hAIEnergyTransPlayAreaLocation] diff --git a/src/text/text1.asm b/src/text/text1.asm index ff07f9df..edac289a 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -1078,7 +1078,7 @@ Text00e5: ; 37d1f (d:7d1f) line "becomes Confused." done -Text00e6: ; 37d4a (d:7d4a) +DamageCheckIfTailsNoDamageText: ; 37d4a (d:7d4a) text "Damage check!" line "If Tails, no damage!!!" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 5cc70d00..a4eac01b 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -231,7 +231,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ConfusionCheckText ; 0x00e3 textpointer VenomPowderCheckText ; 0x00e4 textpointer Text00e5 ; 0x00e5 - textpointer Text00e6 ; 0x00e6 + textpointer DamageCheckIfTailsNoDamageText ; 0x00e6 textpointer Text00e7 ; 0x00e7 textpointer Text00e8 ; 0x00e8 textpointer IfHeadPlus10IfTails10ToYourselfText ; 0x00e9 From 4137fd0fd67dcb3236425cf42050665f63fd27b0 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Mon, 11 May 2020 10:40:34 +0100 Subject: [PATCH 29/45] Nidorino and Nidorina effects --- src/data/effect_commands.asm | 10 +++---- src/engine/effect_functions.asm | 48 ++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index b92f5b67..7021bd9f 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -205,17 +205,17 @@ NidoranMHornHazardEffectCommands: db $00 NidorinaSupersonicEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4aac + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, NidorinaSupersonicEffect db $00 NidorinaDoubleKickEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4abb - dbw EFFECTCMDTYPE_AI, $4ab3 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, NidorinaDoubleKick_MultiplierEffect + dbw EFFECTCMDTYPE_AI, NidorinaDoubleKick_AIEffect db $00 NidorinoDoubleKickEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4adb - dbw EFFECTCMDTYPE_AI, $4ad3 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, NidorinoDoubleKick_MultiplierEffect + dbw EFFECTCMDTYPE_AI, NidorinoDoubleKick_AIEffect db $00 ButterfreeWhirlwindEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 2123fd88..5414ace5 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -1359,7 +1359,53 @@ HornHazard_Failure50PercentEffect: ; 2ca96 (b:4a96) ret ; 0x2caac - INCROM $2caac, $2cbfb +NidorinaSupersonicEffect: ; 2caac (b:4aac) + call Confusion50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2cab3 + +NidorinaDoubleKick_AIEffect: ; 2cab3 (b:4ab3) + ld a, 30 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2cabb + +NidorinaDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo + ret +; 0x2cad3 + +NidorinoDoubleKick_AIEffect: ; 2cad3 (b:4ad3) + ld a, 30 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2cadb + +NidorinoDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo + ret +; 0x2caf3 + + INCROM $2caf3, $2cbfb Func_2cbfb: ; 2cbfb (b:4bfb) ldh a, [hAIEnergyTransPlayAreaLocation] From edc1887122ac25073fa167a23d5af23ae2c37154 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Mon, 11 May 2020 11:34:02 +0100 Subject: [PATCH 30/45] Butterfree attack effects --- src/data/effect_commands.asm | 10 ++++---- src/engine/effect_functions.asm | 45 +++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 7021bd9f..9b93372c 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -58,7 +58,7 @@ WeepinbellPoisonPowderEffectCommands: db $00 VictreebelLureEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBenchPokemon + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBench dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelectEffect dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelectEffect @@ -219,13 +219,13 @@ NidorinoDoubleKickEffectCommands: db $00 ButterfreeWhirlwindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4b09 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4af3 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $4af3 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ButterfreeWhirlwind_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, ButterfreeWhirlwind_CheckBench + dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, ButterfreeWhirlwind_CheckBench db $00 ButterfreeMegaDrainEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4b0f + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ButterfreeMegaDrainEffect db $00 ParasSporeEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 5414ace5..3c6fa5da 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -766,7 +766,7 @@ WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) ; 0x2c740 ; returns carry if non-duelist has no Bench Pokemon -VictreebelLure_CheckBenchPokemon: ; 2c740 (b:4740) +VictreebelLure_CheckBench: ; 2c740 (b:4740) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetNonTurnDuelistVariable ldtx hl, LureNoPokemonOnTheBenchText @@ -1405,7 +1405,48 @@ NidorinoDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) ret ; 0x2caf3 - INCROM $2caf3, $2cbfb +ButterfreeWhirlwind_CheckBench: ; 2caf3 (b:4af3) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr nc, .has_bench + ; no bench, do not do effect + ld a, $ff + ldh [hTemp_ffa0], a + ret +.has_bench + call DuelistSelectForcedSwitch + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2cb09 + +ButterfreeWhirlwind_SwitchEffect: ; 2cb09 (b:4b09) + ldh a, [hTemp_ffa0] + call HandleSwitchDefendingPokemonEffect + ret +; 0x2cb0f + +ButterfreeMegaDrainEffect: ; 2cb0f (b:4b0f) + ld hl, wDealtDamage + ld a, [hli] + ld h, [hl] + ld l, a + srl h + rr l + bit 0, l + jr z, .rounded + ; round up to nearest 10 + ld de, 10 / 2 + add hl, de +.rounded + ld e, l + ld d, h + call ApplyAndAnimateHPDrain + ret +; 0x2cb27 + + INCROM $2cb27, $2cbfb Func_2cbfb: ; 2cbfb (b:4bfb) ldh a, [hAIEnergyTransPlayAreaLocation] From 5d155daebbd51d2346046e42694c4893fc1d8dbb Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Tue, 12 May 2020 17:30:12 +0100 Subject: [PATCH 31/45] Some effects and changed ChangedType to ChangedColor --- src/constants/duel_constants.asm | 22 +- src/data/effect_commands.asm | 38 +- src/engine/effect_functions.asm | 692 ++++++++++++++++++++++++++++++- src/engine/home.asm | 16 +- src/hram.asm | 6 +- src/text/text1.asm | 20 +- src/text/text2.asm | 14 +- src/text/text_offsets.asm | 34 +- src/wram.asm | 27 +- 9 files changed, 770 insertions(+), 99 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index d3883fe7..89e61a47 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -45,12 +45,12 @@ DUELVARS_BENCH2_CARD_STAGE EQUS "LOW(wPlayerBench2CardStage)" DUELVARS_BENCH3_CARD_STAGE EQUS "LOW(wPlayerBench3CardStage)" ; d1 DUELVARS_BENCH4_CARD_STAGE EQUS "LOW(wPlayerBench4CardStage)" ; d2 DUELVARS_BENCH5_CARD_STAGE EQUS "LOW(wPlayerBench5CardStage)" ; d3 -DUELVARS_ARENA_CARD_CHANGED_TYPE EQUS "LOW(wPlayerArenaCardChangedType)" ; d4 -DUELVARS_BENCH1_CARD_CHANGED_TYPE EQUS "LOW(wPlayerBench1CardChangedType)" ; d5 -DUELVARS_BENCH2_CARD_CHANGED_TYPE EQUS "LOW(wPlayerBench2CardChangedType)" ; d6 -DUELVARS_BENCH3_CARD_CHANGED_TYPE EQUS "LOW(wPlayerBench3CardChangedType)" ; d7 -DUELVARS_BENCH4_CARD_CHANGED_TYPE EQUS "LOW(wPlayerBench4CardChangedType)" ; d8 -DUELVARS_BENCH5_CARD_CHANGED_TYPE EQUS "LOW(wPlayerBench5CardChangedType)" ; d9 +DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 +DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 +DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 +DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 +DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 +DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 DUELVARS_ARENA_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerArenaCardAttachedDefender)" ; da DUELVARS_BENCH1_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench1CardAttachedDefender)" ; db DUELVARS_BENCH2_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench2CardAttachedDefender)" ; dc @@ -161,8 +161,14 @@ SUBSTATUS3_THIS_TURN_DOUBLE_DAMAGE EQU 0 SUBSTATUS3_HEADACHE EQU 1 ; DUELVARS_ARENA_CARD_FLAGS_C2 constants -CAN_EVOLVE_THIS_TURN_F EQU 7 -CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F +USED_PKMN_POWER_THIS_TURN_F EQU 5 +CAN_EVOLVE_THIS_TURN_F EQU 7 +USED_PKMN_POWER_THIS_TURN EQU 1 << USED_PKMN_POWER_THIS_TURN_F +CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F + +; *_CHANGED_COLOR constants +HAS_CHANGED_COLOR_F EQU 7 +HAS_CHANGED_COLOR EQU 1 << HAS_CHANGED_COLOR_F ; effect command constants (TryExecuteEffectCommandFunction) ; ordered by (roughly) execution time diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 9b93372c..af6d8218 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -238,23 +238,23 @@ ParasectSporeEffectCommands: WeedlePoisonStingEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Poison50PercentEffect - dbw EFFECTCMDTYPE_AI, $4b27 + dbw EFFECTCMDTYPE_AI, WeedlePoisonSting_AIEffect db $00 IvysaurPoisonPowderEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoisonEffect - dbw EFFECTCMDTYPE_AI, $4b2f + dbw EFFECTCMDTYPE_AI, IvysaurPoisonPowder_AIEffect db $00 BulbasaurLeechSeedEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4b37 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, BulbasaurLeechSeedEffect db $00 VenusaurEnergyTransEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $4b44 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4b77 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4bfb - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4b6f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, EnergyTrans_CheckPlayArea + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, EnergyTrans_TransferEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, EnergyTrans_AIEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, EnergyTrans_PrintProcedure db $00 GrimerNastyGooEffectCommands: @@ -262,38 +262,38 @@ GrimerNastyGooEffectCommands: db $00 GrimerMinimizeEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4c30 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, GrimerMinimizeEffect db $00 MukToxicGasEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4c36 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ToxicGasEffect db $00 MukSludgeEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Poison50PercentEffect - dbw EFFECTCMDTYPE_AI, $4c38 + dbw EFFECTCMDTYPE_AI, Sludge_AIEffect db $00 BellsproutCallForFamilyEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4c40 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4cc2 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4c50 - dbw EFFECTCMDTYPE_UNKNOWN_08, $4cad + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, BellsproutCallForFamily_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, BellsproutCallForFamily_PutInPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, BellsproutCallForFamily_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, BellsproutCallForFamily_AISelectEffect db $00 WeezingSmogEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Poison50PercentEffect - dbw EFFECTCMDTYPE_AI, $4ce2 + dbw EFFECTCMDTYPE_AI, WeezingSmog_AIEffect db $00 WeezingSelfdestructEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4cea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, WeezingSelfdestructEffect db $00 VenomothShiftEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $4d09 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4d5d - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4d21 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Shift_OncePerTurnCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Shift_ChangeColorEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Shift_PlayerSelectEffect db $00 VenomothVenomPowderEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 3c6fa5da..8b08135c 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -155,15 +155,16 @@ CheckIfTurnDuelistIsPlayer: ; 2c0c7 (b:40c7) scf ret -; Sets some flags for AI use +; Stores information about the attack damage for AI purposes +; taking into account poison damage between turns. ; if target poisoned ; [wAIMinDamage] <- [wDamage] ; [wAIMaxDamage] <- [wDamage] ; else -; [wAIMinDamage] <- [wDamage] + d -; [wAIMaxDamage] <- [wDamage] + e -; [wDamage] <- [wDamage] + a -Func_2c0d4: ; 2c0d4 (b:40d4) +; [wAIMinDamage] <- [wDamage] + d +; [wAIMaxDamage] <- [wDamage] + e +; [wDamage] <- [wDamage] + a +StoreAIPoisonDamageInfo: ; 2c0d4 (b:40d4) push af ld a, DUELVARS_ARENA_CARD_STATUS call GetNonTurnDuelistVariable @@ -699,7 +700,249 @@ AIFindBenchWithLowestHP: ; 2c564 (b:4564) ret ; 0x2c588 - INCROM $2c588, $2c6f0 +; handles drawing the Shift Screen and its input. +; outputs in a the color that was selected or, +; if B was pressed, returns carry. +; input: +; a = Play Area location (PLAY_AREA_*), with bit 7 set or unset +; hl = text to be printed in the bottom box +; output: +; a = color that was selected +HandleShiftScreen: ; 2c588 (b:4588) + or a + call z, SwapTurn + push af + call .DrawScreen + pop af + call z, SwapTurn + + ld hl, .menu_params + xor a + call InitializeMenuParameters + call EnableLCD + +.loop_input + call DoFrame + call HandleMenuInput + jr nc, .loop_input + cp -1 ; b pressed? + jr z, .set_carry + ld e, a + ld d, $00 + ld hl, ShiftListItemToColor + add hl, de + ld a, [hl] + or a + ret +.set_carry + scf + ret + +.menu_params + db 1, 1 ; cursor x, cursor y + db 2 ; y displacement between items + db MAX_PLAY_AREA_POKEMON ; number of items + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw $0000 ; function pointer if non-0 +; 0x2c5be + +.DrawScreen: ; 2c5be (b:45be) + push hl + push af + call EmptyScreen + call ZeroObjectPositions + call LoadDuelCardSymbolTiles + +; load card data + pop af + and $7f + ld [wTempPlayAreaLocation_cceb], a + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + +; draw card gfx + ld de, v0Tiles1 + $20 tiles ; destination offset of loaded gfx + ld hl, wLoadedCard1Gfx + ld a, [hli] + ld h, [hl] + ld l, a + lb bc, $30, TILE_SIZE + call LoadCardGfx + bank1call SetBGP6OrSGB3ToCardPalette + bank1call FlushAllPalettesOrSendPal23Packet + ld a, $a0 + lb hl, 6, 1 + lb de, 9, 2 + lb bc, 8, 6 + call FillRectangle + bank1call ApplyBGP6OrSGB3ToCardImage + +; print card name and level at the top + ld a, 16 + call CopyCardNameAndLevel + ld [hl], $00 + lb de, 7, 0 + call InitTextPrinting + ld hl, wDefaultText + call ProcessText + +; list all the colors + ld hl, ShiftMenuData + call PlaceTextItems + +; print card's color, resistance and weakness + ld a, [wTempPlayAreaLocation_cceb] + call GetPlayAreaCardColor + inc a + lb bc, 15, 9 + call WriteByteToBGMap0 + ld a, [wTempPlayAreaLocation_cceb] + call GetPlayAreaCardWeakness + lb bc, 15, 10 + bank1call PrintCardPageWeaknessesOrResistances + ld a, [wTempPlayAreaLocation_cceb] + call GetPlayAreaCardResistance + lb bc, 15, 11 + bank1call PrintCardPageWeaknessesOrResistances + + call DrawWideTextBox + +; print list of color names on all list items + lb de, 4, 1 + ldtx hl, ColorListText + call InitTextPrinting_ProcessTextFromID + +; print input hl to text box + lb de, 1, 14 + pop hl + call InitTextPrinting_ProcessTextFromID + +; draw and apply palette to color icons + ld hl, ColorTileAndBGP + lb de, 2, 0 + ld c, NUM_COLORED_TYPES +.loop_colors + ld a, [hli] + push de + push bc + push hl + lb hl, 1, 2 + lb bc, 2, 2 + call FillRectangle + + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .skip_vram1 + pop hl ; unnecessary + push hl ; unnecessary + call BankswitchVRAM1 + ld a, [hl] + lb hl, 0, 0 + lb bc, 2, 2 + call FillRectangle + call BankswitchVRAM0 + +.skip_vram1 + pop hl + pop bc + pop de + inc hl + inc e + inc e + dec c + jr nz, .loop_colors + ret +; 0x2c686 + +; loads wTxRam2 and wTxRam2_b: +; [wTxRam2] <- wLoadedCard1Name +; [wTxRam2_b] <- input color as text symbol +; input: +; a = type (color) constant +LoadCardNameAndInputColor: ; 2c686 (b:4686) + add a + ld e, a + ld d, $00 + ld hl, ColorToTextSymbol + add hl, de + +; load wTxRam2 with card's name + ld de, wTxRam2 + ld a, [wLoadedCard1Name] + ld [de], a + inc de + ld a, [wLoadedCard1Name + 1] + ld [de], a + +; load wTxRam2_b with ColorToTextSymbol + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ret +; 0x2c6a1 + +ShiftMenuData: ; 2c6a1 (b:46a1) + ; x, y, text id + textitem 10, 9, TypeText + textitem 10, 10, WeaknessText + textitem 10, 11, ResistanceText + db $ff + +ColorTileAndBGP: ; 2c6ae (b:46ae) + ; tile, BG + db $E4, $02 + db $E0, $01 + db $EC, $02 + db $E8, $01 + db $F0, $03 + db $F4, $03 + +ShiftListItemToColor: ; 2c6ba (b:46ba) + db GRASS + db FIRE + db WATER + db LIGHTNING + db FIGHTING + db PSYCHIC + +ColorToTextSymbol: ; 2c6c0 (b:46c0) + tx FireSymbolText + tx GrassSymbolText + tx LightningSymbolText + tx WaterSymbolText + tx FightingSymbolText + tx PsychicSymbolText + +DrawSymbolOnPlayAreaCursor: ; 2c6cc (b:46cc) + ld c, a + add a + add c + add 2 + ; a = 3*a + 2 + ld c, a + ld a, b + ld b, 0 + call WriteByteToBGMap0 + ret +; 0x2c6d9 + + INCROM $2c6d9, $2c6e0 + +PlayAreaSelectionMenuParameters: ; 2c6e0 (b:46e0) + db 0, 0 ; cursor x, cursor y + db 3 ; y displacement between items + db MAX_PLAY_AREA_POKEMON ; number of items + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw $0000 ; function pointer if non-0 +; 0x2c6e8 + + INCROM $2c6e8, $2c6f0 SpitPoison_AIEffect: ; 2c6f0 (b:46f0) ld a, 5 @@ -757,12 +1000,13 @@ TerrorStrike_SwitchDefendingPokemon: ; 2c726 (b:4726) PoisonFang_AIEffect: ; 2c730 (b:4730) ld a, 10 lb de, 10, 10 - jp Func_2c0d4 + jp StoreAIPoisonDamageInfo +; 0x2c738 WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) ld a, 5 lb de, 0, 10 - jp Func_2c0d4 + jp StoreAIPoisonDamageInfo ; 0x2c740 ; returns carry if non-duelist has no Bench Pokemon @@ -817,7 +1061,8 @@ AcidEffect: ; 2c77e (b:477e) GloomPoisonPowder_AIEffect: ; 2c78b (b:478b) ld a, 10 lb de, 10, 10 - jp Func_2c0d4 + jp StoreAIPoisonDamageInfo +; 0x2c793 ; Defending Pokemon and user become confused FoulOdorEffect: ; 2c793 (b:4793) @@ -841,7 +1086,7 @@ KakunaStiffenEffect: ; 2c7a0 (b:47a0) KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4) ld a, 5 lb de, 0, 10 - jp Func_2c0d4 + jp StoreAIPoisonDamageInfo ; 0x2c7bc GolbatLeechLifeEffect: ; 2c7bc (b:47bc) @@ -911,7 +1156,7 @@ Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) BeedrillPoisonSting_AIEffect: ; 2c80d (b:480d) ld a, 5 lb de, 0, 10 - jp Func_2c0d4 + jp StoreAIPoisonDamageInfo ; 0x2c815 ExeggcuteLeechSeedEffect: ; 2c815 (b:4815) @@ -967,7 +1212,7 @@ Sprout_PlayerSelectEffect: ; 2c85a (b:485a) ldh [hTemp_ffa0], a call CreateDeckCardList - ldtx hl, ChooseAnOddishFromTheDeckText + ldtx hl, ChooseAnOddishFromDeckText ldtx bc, OddishText lb de, SEARCHEFFECT_CARD_ID, ODDISH call LookForCardInDeck @@ -1446,9 +1691,156 @@ ButterfreeMegaDrainEffect: ; 2cb0f (b:4b0f) ret ; 0x2cb27 - INCROM $2cb27, $2cbfb +WeedlePoisonSting_AIEffect: ; 2cb27 (b:4b27) + ld a, 5 + lb de, 0, 10 + jp StoreAIPoisonDamageInfo +; 0x2cb2f -Func_2cbfb: ; 2cbfb (b:4bfb) +IvysaurPoisonPowder_AIEffect: ; 2cb2f (b:4b2f) + ld a, 10 + lb de, 10, 10 + jp StoreAIPoisonDamageInfo +; 0x2cb37 + +BulbasaurLeechSeedEffect: ; 2cb37 (b:4b37) + ld hl, wDealtDamage + ld a, [hli] + or [hl] + ret z ; return if no damage dealt + lb de, 0, 10 + call ApplyAndAnimateHPDrain + ret +; 0x2cb44 + +; returns carry if no Grass Energy in Play Area +EnergyTrans_CheckPlayArea: ; 2cb44 (b:4b44) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret c ; cannot use Pkmn Power + +; search in Play Area for at least 1 Grass Energy type + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_deck + ld a, [hl] + and CARD_LOCATION_PLAY_AREA + jr z, .next + push hl + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + pop hl + cp TYPE_ENERGY_GRASS + ret z +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_deck + +; none found + ldtx hl, NoGrassEnergyText + scf + ret +; 0x2cb6f + +EnergyTrans_PrintProcedure: ; 2cb6f (b:4b6f) + ldtx hl, ProcedureForEnergyTransferText + bank1call Func_57df + or a + ret +; 0x2cb77 + +EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) + ld a, DUELVARS_DUELIST_TYPE + call GetTurnDuelistVariable + cp DUELIST_TYPE_PLAYER + jr z, .player +; not player + bank1call Func_61a1 + bank1call PrintPlayAreaCardList_EnableLCD + ret + +.player + xor a + ldh [hCurPlayAreaItem], a + bank1call Func_61a1 + +.draw_play_area + bank1call PrintPlayAreaCardList_EnableLCD + push af + ldh a, [hCurPlayAreaItem] + ld hl, PlayAreaSelectionMenuParameters + call InitializeMenuParameters + pop af + ld [wNumMenuItems], a + +; handle the action of taking a Grass Energy card +.loop_input_take + call DoFrame + call HandleMenuInput + jr nc, .loop_input_take + cp -1 ; b press? + ret z + +; a press + ldh [hTempPlayAreaLocation_ffa1], a + ldh [hCurPlayAreaItem], a + call CheckIfCardHasGrassEnergyAttached + jr c, .play_sfx ; no Grass attached + + ldh [hAIEnergyTransEnergyCard], a + ldh a, [hAIEnergyTransEnergyCard] ; useless + ; temporarily take card away to draw Play Area + call AddCardToHand + bank1call PrintPlayAreaCardList_EnableLCD + ldh a, [hTempPlayAreaLocation_ffa1] + ld e, a + ldh a, [hAIEnergyTransEnergyCard] + ; give card back + call PutHandCardInPlayArea + + ; draw Grass symbol near cursor + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_GRASS + call DrawSymbolOnPlayAreaCursor + +; handle the action of placing a Grass Energy card +.loop_input_put + call DoFrame + call HandleMenuInput + jr nc, .loop_input_put + cp -1 ; b press? + jr z, .remove_symbol + +; a press + ldh [hCurPlayAreaItem], a + ldh [hAIEnergyTransPlayAreaLocation], a + ld a, OPPACTION_6B15 + call SetOppAction_SerialSendDuelData + ldh a, [hAIEnergyTransPlayAreaLocation] + ld e, a + ldh a, [hAIEnergyTransEnergyCard] + ; give card being held to this Pokemon + call AddCardToHand + call PutHandCardInPlayArea + +.remove_symbol + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_SPACE + call DrawSymbolOnPlayAreaCursor + call EraseCursor + jr .draw_play_area + +.play_sfx + call Func_3794 + jr .loop_input_take +; 0x2cbfb + +EnergyTrans_AIEffect: ; 2cbfb (b:4bfb) ldh a, [hAIEnergyTransPlayAreaLocation] ld e, a ldh a, [hAIEnergyTransEnergyCard] @@ -1458,7 +1850,275 @@ Func_2cbfb: ; 2cbfb (b:4bfb) ret ; 0x2cc0a - INCROM $2cc0a, $2f4e1 +; returns carry if no Grass Energy cards +; attached to card in Play Area location of a. +; input: +; a = PLAY_AREA_* of location to check +CheckIfCardHasGrassEnergyAttached: ; 2cc0a (b:4c0a) + or CARD_LOCATION_PLAY_AREA + ld e, a + + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop + ld a, [hl] + cp e + jr nz, .next + push de + push hl + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + pop hl + pop de + cp TYPE_ENERGY_GRASS + jr z, .no_carry +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop + scf + ret +.no_carry + ld a, l + or a + ret +; 0x2cc30 + +GrimerMinimizeEffect: ; 2cc30 (b:4c30) + ld a, SUBSTATUS1_REDUCE_BY_20 + call ApplySubstatus1ToDefendingCard + ret +; 0x2cc36 + +ToxicGasEffect: ; 2cc36 (b:4c36) + scf + ret +; 0x2cc38 + +Sludge_AIEffect: ; 2cc38 (b:4c38) + ld a, 5 + lb de, 0, 10 + jp StoreAIPoisonDamageInfo +; 0x2cc40 + +; returns carry if no cards in Deck or if +; Play Area is full already. +BellsproutCallForFamily_CheckDeckAndPlayArea: ; 2cc40 (b:4c40) + call CheckIfDeckIsEmpty + ret c ; return if no cards in deck + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2cc50 + +BellsproutCallForFamily_PlayerSelectEffect: ; 2cc50 (b:4c50) + ld a, $ff + ldh [hTemp_ffa0], a + + call CreateDeckCardList + ldtx hl, ChooseABellsproutFromDeckText + ldtx bc, BellsproutText + lb de, SEARCHEFFECT_CARD_ID, BELLSPROUT + call LookForCardInDeck + ret c + +; draw Deck list interface and print text + bank1call Func_5591 + ldtx hl, ChooseABellsproutText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +.loop + bank1call DisplayCardList + jr c, .pressed_b + call GetCardIDFromDeckIndex + ld bc, BELLSPROUT + call CompareDEtoBC + jr nz, .play_sfx + +; Bellsprout was selected + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret + +.play_sfx + ; play SFX and loop back + call Func_3794 + jr .loop + +.pressed_b +; figure if Player can exit the screen without selecting, +; that is, if the Deck has no Bellsprout card. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_b_press + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + ld a, l + call GetCardIDFromDeckIndex + ld bc, BELLSPROUT + call CompareDEtoBC + jr z, .play_sfx ; found Bellsprout, go back to top loop +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_b_press + +; no Bellsprout in Deck, can safely exit screen + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2ccad + +BellsproutCallForFamily_AISelectEffect: ; 2ccad (b:4cad) + call CreateDeckCardList + ld hl, wDuelTempList +.loop_deck + ld a, [hli] + ldh [hTemp_ffa0], a + cp $ff + ret z ; no Bellsprout + call GetCardIDFromDeckIndex + ld a, e + cp BELLSPROUT + jr nz, .loop_deck + ret ; Bellsprout found +; 0x2ccc2 + +BellsproutCallForFamily_PutInPlayAreaEffect: ; 2ccc2 (b:4cc2) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .shuffle + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .shuffle + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen +.shuffle + call Func_2c0bd + ret +; 0x2cce2 + +WeezingSmog_AIEffect: ; 2cce2 (b:4ce2) + ld a, 5 + lb de, 0, 10 + jp StoreAIPoisonDamageInfo +; 0x2ccea + +WeezingSelfdestructEffect: ; 2ccea (b:4cea) + ld a, 60 + call Func_1955 + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + call SwapTurn + xor a + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2cd09 + +Shift_OncePerTurnCheck: ; 2cd09 (b:4d09) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + and USED_PKMN_POWER_THIS_TURN + jr nz, .already_used + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret +.already_used + ldtx hl, OnlyOncePerTurnText + scf + ret +; 0x2cd21 + +Shift_PlayerSelectEffect: ; 2cd21 (b:4d21) + ldtx hl, ChoosePokemonWishToColorChangeText + ldh a, [hTemp_ffa0] + or $80 + call HandleShiftScreen + ldh [hAIPkmnPowerEffectParam], a + ret c ; cancelled + +; check whether the color selected is valid + ; look in Turn Duelist's Play Area + call .CheckColorInPlayArea + ret nc + ; look in NonTurn Duelist's Play Area + call SwapTurn + call .CheckColorInPlayArea + call SwapTurn + ret nc + ; not found in either Duelist's Play Area + ldtx hl, UnableToSelectText + call DrawWideTextBox_WaitForInput + jr Shift_PlayerSelectEffect ; loop back to start +; 0x2cd44 + +; checks in input color in a exists in Turn Duelist's Play Area +; returns carry if not found. +.CheckColorInPlayArea: ; 2cd44 (b:4d44) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + ld b, PLAY_AREA_ARENA +.loop_play_area + push bc + ld a, b + call GetPlayAreaCardColor + pop bc + ld hl, hAIPkmnPowerEffectParam + cp [hl] + ret z ; found + inc b + dec c + jr nz, .loop_play_area + ; not found + scf + ret +; 0x2cd5d + +Shift_ChangeColorEffect: ; 2cd5d (b:4d5d) + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_CHANGED_COLOR + ld l, a + ldh a, [hAIPkmnPowerEffectParam] + or HAS_CHANGED_COLOR + ld [hl], a + call LoadCardNameAndInputColor + ldtx hl, ChangedTheColorOfText + call DrawWideTextBox_WaitForInput + ret +; 0x2cd84 + + INCROM $2cd84, $2f4e1 ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) call SwapTurn @@ -1488,5 +2148,5 @@ ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) ret ; 0x2f513 - INCROM $2f513, $30000 + diff --git a/src/engine/home.asm b/src/engine/home.asm index edbd6f5c..42215a69 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -3742,7 +3742,7 @@ EvolvePokemonCard: ; 13a2 (0:13a2) ld l, a ld [hl], $00 ld a, e - add DUELVARS_ARENA_CARD_CHANGED_TYPE + add DUELVARS_ARENA_CARD_CHANGED_COLOR ld l, a ld [hl], $00 ld a, e @@ -3908,7 +3908,7 @@ PutHandPokemonCardInPlayArea: ; 1485 (0:1485) add e ld l, a ld [hl], $0 - ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE + ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR add e ld l, a ld [hl], $0 @@ -3988,7 +3988,7 @@ EmptyPlayAreaSlot: ; 14f8 (0:14f8) call .init_duelvar ld a, DUELVARS_ARENA_CARD_STAGE call .init_duelvar - ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE + ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR call .init_duelvar ld a, DUELVARS_ARENA_CARD_ATTACHED_DEFENDER call .init_duelvar @@ -4055,7 +4055,7 @@ SwapPlayAreaPokemon: ; 1548 (0:1548) call .swap_duelvar ld a, DUELVARS_ARENA_CARD_STAGE call .swap_duelvar - ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE + ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR call .swap_duelvar ld a, DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER call .swap_duelvar @@ -10278,7 +10278,7 @@ ClearChangedTypesIfMuk: ; 36d9 (0:36d9) call .zero_changed_types call SwapTurn .zero_changed_types - ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE + ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR call GetTurnDuelistVariable ld c, MAX_PLAY_AREA_POKEMON .zero_changed_types_loop @@ -10299,9 +10299,9 @@ GetPlayAreaCardColor: ; 36f7 (0:36f7) push hl push de ld e, a - add DUELVARS_ARENA_CARD_CHANGED_TYPE + add DUELVARS_ARENA_CARD_CHANGED_COLOR call GetTurnDuelistVariable - bit 7, a + bit HAS_CHANGED_COLOR_F, a jr nz, .has_changed_color .regular_color ld a, e @@ -10321,7 +10321,7 @@ GetPlayAreaCardColor: ; 36f7 (0:36f7) call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 jr c, .regular_color ; jump if can't use Shift ld a, e - add DUELVARS_ARENA_CARD_CHANGED_TYPE + add DUELVARS_ARENA_CARD_CHANGED_COLOR call GetTurnDuelistVariable pop de pop hl diff --git a/src/hram.asm b/src/hram.asm index f22b1728..96230d7a 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -153,7 +153,11 @@ hffb0:: ; ffb0 hCurMenuItem:: ; ffb1 ds $1 - ds $3 +; stores the item number in the Play Area selection menu +hCurPlayAreaItem:: ; ffb2 + ds $1 + + ds $2 hffb5:: ; ffb5 ds $1 diff --git a/src/text/text1.asm b/src/text/text1.asm index edac289a..1cb1e0ab 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -290,11 +290,11 @@ DuelistPlacedACardText: ; 367f9 (d:67f9) line "a ." done -Text0045: ; 36808 (d:6808) +UnableToSelectText: ; 36808 (d:6808) text "Unable to select." done -Text0046: ; 3681b (d:681b) +ColorListText: ; 3681b (d:681b) text "Grass" line "Fire" line "Water" @@ -303,27 +303,27 @@ Text0046: ; 3681b (d:681b) line "Psychic" done -Text0047: ; 36848 (d:6848) +GrassSymbolText: ; 36848 (d:6848) textfw0 "" done -Text0048: ; 3684b (d:684b) +FireSymbolText: ; 3684b (d:684b) textfw0 "" done -Text0049: ; 3684e (d:684e) +WaterSymbolText: ; 3684e (d:684e) textfw0 "" done -Text004a: ; 36851 (d:6851) +LightningSymbolText: ; 36851 (d:6851) textfw0 "" done -Text004b: ; 36854 (d:6854) +FightingSymbolText: ; 36854 (d:6854) textfw0 "" done -Text004c: ; 36857 (d:6857) +PsychicSymbolText: ; 36857 (d:6857) textfw0 "" done @@ -945,7 +945,7 @@ Text00c9: ; 37897 (d:7897) text "No Resistance." done -Text00ca: ; 378a7 (d:78a7) +OnlyOncePerTurnText: ; 378a7 (d:78a7) text "Only once per turn." done @@ -963,7 +963,7 @@ Text00cd: ; 37923 (d:7923) text "There is no Energy card attached." done -Text00ce: ; 37946 (d:7946) +NoGrassEnergyText: ; 37946 (d:7946) text "No Grass Energy." done diff --git a/src/text/text2.asm b/src/text/text2.asm index bea4094b..1afa4d81 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -146,7 +146,7 @@ Text0112: ; 3860a (e:460a) line "to change with Conversion 2." done -Text0113: ; 38647 (e:4647) +ChoosePokemonWishToColorChangeText: ; 38647 (e:4647) text "Choose the Pokémon whose color you" line "wish to change with Color change." done @@ -163,7 +163,7 @@ Text0115: ; 386af (e:46af) text " to ." done -Text0116: ; 386d3 (e:46d3) +ChangedTheColorOfText: ; 386d3 (e:46d3) text "Changed the color of" line "" text " to ." @@ -242,7 +242,7 @@ Text0125: ; 3899f (e:499f) line "from the Deck." done -ChooseAnOddishFromTheDeckText: ; 389cf (e:49cf) +ChooseAnOddishFromDeckText: ; 389cf (e:49cf) text "Choose an Oddish" line "from the Deck." done @@ -275,7 +275,7 @@ Text012c: ; 38a83 (e:4a83) line "Fighting Pokémon" done -Text012d: ; 38aa4 (e:4aa4) +ProcedureForEnergyTransferText: ; 38aa4 (e:4aa4) text "Procedure for Energy Transfer:" line "" line "1. Choose the Pokémon to move Grass" @@ -289,12 +289,12 @@ Text012d: ; 38aa4 (e:4aa4) line "4. Press the B Button to end." done -Text012e: ; 38b8f (e:4b8f) +ChooseABellsproutFromDeckText: ; 38b8f (e:4b8f) text "Choose a Bellsprout" line "from the Deck." done -Text012f: ; 38bb3 (e:4bb3) +ChooseABellsproutText: ; 38bb3 (e:4bb3) text "Choose a Bellsprout." done @@ -433,7 +433,7 @@ OddishText: ; 392dc (e:52dc) text "Oddish" done -Text0141: ; 392e4 (e:52e4) +BellsproutText: ; 392e4 (e:52e4) text "Bellsprout" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index a4eac01b..e0c3cb84 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -70,14 +70,14 @@ TextOffsets:: ; 34000 (d:4000) textpointer WillDrawNPrizesText ; 0x0042 textpointer DrewNPrizesText ; 0x0043 textpointer DuelistPlacedACardText ; 0x0044 - textpointer Text0045 ; 0x0045 - textpointer Text0046 ; 0x0046 - textpointer Text0047 ; 0x0047 - textpointer Text0048 ; 0x0048 - textpointer Text0049 ; 0x0049 - textpointer Text004a ; 0x004a - textpointer Text004b ; 0x004b - textpointer Text004c ; 0x004c + textpointer UnableToSelectText ; 0x0045 + textpointer ColorListText ; 0x0046 + textpointer GrassSymbolText ; 0x0047 + textpointer FireSymbolText ; 0x0048 + textpointer WaterSymbolText ; 0x0049 + textpointer LightningSymbolText ; 0x004a + textpointer FightingSymbolText ; 0x004b + textpointer PsychicSymbolText ; 0x004c textpointer Text004d ; 0x004d textpointer KnockOutText ; 0x004e textpointer DamageToSelfDueToConfusionText ; 0x004f @@ -203,11 +203,11 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00c7 ; 0x00c7 textpointer Text00c8 ; 0x00c8 textpointer Text00c9 ; 0x00c9 - textpointer Text00ca ; 0x00ca + textpointer OnlyOncePerTurnText ; 0x00ca textpointer CannotUseDueToStatusText ; 0x00cb textpointer Text00cc ; 0x00cc textpointer Text00cd ; 0x00cd - textpointer Text00ce ; 0x00ce + textpointer NoGrassEnergyText ; 0x00ce textpointer Text00cf ; 0x00cf textpointer Text00d0 ; 0x00d0 textpointer Text00d1 ; 0x00d1 @@ -276,10 +276,10 @@ TextOffsets:: ; 34000 (d:4000) textpointer DuelistIsSelectingPokemonToPlaceInArenaText ; 0x0110 textpointer Text0111 ; 0x0111 textpointer Text0112 ; 0x0112 - textpointer Text0113 ; 0x0113 + textpointer ChoosePokemonWishToColorChangeText ; 0x0113 textpointer Text0114 ; 0x0114 textpointer Text0115 ; 0x0115 - textpointer Text0116 ; 0x0116 + textpointer ChangedTheColorOfText ; 0x0116 textpointer Text0117 ; 0x0117 textpointer DrawCardsFromTheDeckText ; 0x0118 textpointer CannotDrawCardBecauseNoCardsInDeckText ; 0x0119 @@ -295,16 +295,16 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0123 ; 0x0123 textpointer Text0124 ; 0x0124 textpointer Text0125 ; 0x0125 - textpointer ChooseAnOddishFromTheDeckText ; 0x0126 + textpointer ChooseAnOddishFromDeckText ; 0x0126 textpointer ChooseAnOddishText ; 0x0127 textpointer Text0128 ; 0x0128 textpointer Text0129 ; 0x0129 textpointer ChooseNidoranFromDeckText ; 0x012a textpointer ChooseNidoranText ; 0x012b textpointer Text012c ; 0x012c - textpointer Text012d ; 0x012d - textpointer Text012e ; 0x012e - textpointer Text012f ; 0x012f + textpointer ProcedureForEnergyTransferText ; 0x012d + textpointer ChooseABellsproutFromDeckText ; 0x012e + textpointer ChooseABellsproutText ; 0x012f textpointer Text0130 ; 0x0130 textpointer Text0131 ; 0x0131 textpointer Text0132 ; 0x0132 @@ -322,7 +322,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text013e ; 0x013e textpointer NidoranMNidoranFText ; 0x013f textpointer OddishText ; 0x0140 - textpointer Text0141 ; 0x0141 + textpointer BellsproutText ; 0x0141 textpointer Text0142 ; 0x0142 textpointer Text0143 ; 0x0143 textpointer Text0144 ; 0x0144 diff --git a/src/wram.asm b/src/wram.asm index 3613eba1..8f30cf5c 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -102,18 +102,18 @@ wPlayerBench5CardStage:: ; c2d3 ds $1 ; changed type from Venomoth's Shift Pokemon Power -; if bit 7 == 1, then bits 0-3 override the Pokemon's actual type -wPlayerArenaCardChangedType:: ; c2d4 +; if bit 7 == 1, then bits 0-3 override the Pokemon's actual color +wPlayerArenaCardChangedColor:: ; c2d4 ds $1 -wPlayerBench1CardChangedType:: ; c2d5 +wPlayerBench1CardChangedColor:: ; c2d5 ds $1 -wPlayerBench2CardChangedType:: ; c2d6 +wPlayerBench2CardChangedColor:: ; c2d6 ds $1 -wPlayerBench3CardChangedType:: ; c2d7 +wPlayerBench3CardChangedColor:: ; c2d7 ds $1 -wPlayerBench4CardChangedType:: ; c2d8 +wPlayerBench4CardChangedColor:: ; c2d8 ds $1 -wPlayerBench5CardChangedType:: ; c2d9 +wPlayerBench5CardChangedColor:: ; c2d9 ds $1 wPlayerArenaCardAttachedDefender:: ; c2da @@ -249,17 +249,17 @@ wOpponentBench4CardStage:: ; c3d2 wOpponentBench5CardStage:: ; c3d3 ds $1 -wOpponentArenaCardChangedType:: ; c3d4 +wOpponentArenaCardChangedColor:: ; c3d4 ds $1 -wOpponentBench1CardChangedType:: ; c3d5 +wOpponentBench1CardChangedColor:: ; c3d5 ds $1 -wOpponentBench2CardChangedType:: ; c3d6 +wOpponentBench2CardChangedColor:: ; c3d6 ds $1 -wOpponentBench3CardChangedType:: ; c3d7 +wOpponentBench3CardChangedColor:: ; c3d7 ds $1 -wOpponentBench4CardChangedType:: ; c3d8 +wOpponentBench4CardChangedColor:: ; c3d8 ds $1 -wOpponentBench5CardChangedType:: ; c3d9 +wOpponentBench5CardChangedColor:: ; c3d9 ds $1 wOpponentArenaCardAttachedDefender:: ; c3da @@ -988,6 +988,7 @@ wEffectFunctionsFeedback:: ; ccce ds $18 ; this is 1 (non-0) if dealing damage to self due to confusion +; or a self-destruct type attack wIsDamageToSelf:: ; cce6 ds $1 From b18a90284bed0f381c924c1bd9bddc6f254ad36c Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Wed, 13 May 2020 17:30:24 +0100 Subject: [PATCH 32/45] Finish Grass effects --- src/constants/duel_constants.asm | 13 +- src/data/effect_commands.asm | 32 +-- src/engine/effect_functions.asm | 324 ++++++++++++++++++++++++++++++- src/hram.asm | 2 + src/text/text1.asm | 4 +- src/text/text2.asm | 2 +- src/text/text_offsets.asm | 6 +- 7 files changed, 352 insertions(+), 31 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 89e61a47..ff9da29a 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -45,12 +45,12 @@ DUELVARS_BENCH2_CARD_STAGE EQUS "LOW(wPlayerBench2CardStage)" DUELVARS_BENCH3_CARD_STAGE EQUS "LOW(wPlayerBench3CardStage)" ; d1 DUELVARS_BENCH4_CARD_STAGE EQUS "LOW(wPlayerBench4CardStage)" ; d2 DUELVARS_BENCH5_CARD_STAGE EQUS "LOW(wPlayerBench5CardStage)" ; d3 -DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 -DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 -DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 -DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 -DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 -DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 +DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 +DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 +DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 +DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 +DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 +DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 DUELVARS_ARENA_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerArenaCardAttachedDefender)" ; da DUELVARS_BENCH1_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench1CardAttachedDefender)" ; db DUELVARS_BENCH2_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench2CardAttachedDefender)" ; dc @@ -163,6 +163,7 @@ SUBSTATUS3_HEADACHE EQU 1 ; DUELVARS_ARENA_CARD_FLAGS_C2 constants USED_PKMN_POWER_THIS_TURN_F EQU 5 CAN_EVOLVE_THIS_TURN_F EQU 7 + USED_PKMN_POWER_THIS_TURN EQU 1 << USED_PKMN_POWER_THIS_TURN_F CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index af6d8218..4dbc04aa 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -297,8 +297,8 @@ VenomothShiftEffectCommands: db $00 VenomothVenomPowderEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4d8c - dbw EFFECTCMDTYPE_AI, $4d84 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, VenomPowder_PoisonConfusion50PercentEffect + dbw EFFECTCMDTYPE_AI, VenomPowder_AIEffect db $00 TangelaBindEffectCommands: @@ -307,17 +307,17 @@ TangelaBindEffectCommands: TangelaPoisonPowderEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoisonEffect - dbw EFFECTCMDTYPE_AI, $4da0 + dbw EFFECTCMDTYPE_AI, TangelaPoisonPowder_AIEffect db $00 VileplumeHealEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $4da8 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4dc7 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Heal_OncePerTurnCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Heal_RemoveDamageEffect db $00 VileplumePetalDanceEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4e2b - dbw EFFECTCMDTYPE_AI, $4e23 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PetalDance_MultiplierEffect + dbw EFFECTCMDTYPE_AI, PetalDance_AIEffect db $00 TangelaStunSporeEffectCommands: @@ -326,30 +326,30 @@ TangelaStunSporeEffectCommands: TangelaPoisonWhipEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoisonEffect - dbw EFFECTCMDTYPE_AI, $4e4b + dbw EFFECTCMDTYPE_AI, PoisonWhip_AIEffect db $00 VenusaurSolarPowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $4e53 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4e82 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, SolarPower_CheckUse + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SolarPower_RemoveStatusEffect db $00 VenusaurMegaDrainEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4eb0 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, VenusaurMegaDrainEffect db $00 OmastarWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f05 - dbw EFFECTCMDTYPE_AI, $4f05 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, OmastarWaterGunEffect + dbw EFFECTCMDTYPE_AI, OmastarWaterGunEffect db $00 OmastarSpikeCannonEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f12 - dbw EFFECTCMDTYPE_AI, $4f0a + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, OmastarSpikeCannon_MultiplierEffect + dbw EFFECTCMDTYPE_AI, OmastarSpikeCannon_AIEffect db $00 OmanyteClairvoyanceEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4f2a + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ClairvoyanceEffect db $00 OmanyteWaterGunEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 8b08135c..974cd220 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -388,7 +388,25 @@ ApplyAndAnimateHPDrain: ; 2c221 (b:4221) ret ; 0x2c25b - INCROM $2c25b, $2c2a4 +; returns carry if Play Area has no damage counters. +CheckIfPlayAreaHasAnyDamage: ; 2c25b (b:425b) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld d, a + ld e, PLAY_AREA_ARENA +.loop_play_area + call GetCardDamageAndMaxHP + or a + ret nz ; found damage + inc e + dec d + jr nz, .loop_play_area + ; no damage found + scf + ret +; 0x2c26e + + INCROM $2c26e, $2c2a4 ; makes a list in wDuelTempList with the deck indices ; of all the energy cards found in opponent's Discard Pile. @@ -2118,7 +2136,308 @@ Shift_ChangeColorEffect: ; 2cd5d (b:4d5d) ret ; 0x2cd84 - INCROM $2cd84, $2f4e1 +VenomPowder_AIEffect: ; 2cd84 (b:4d84) + ld a, 5 + lb de, 0, 10 + jp Func_2c0e9 +; 0x2cd8c + +VenomPowder_PoisonConfusion50PercentEffect: ; 2cd8c (b:4d8c) + ldtx de, VenomPowderCheckText + call TossCoin_BankB + ret nc ; return if tails + +; heads + call PoisonEffect + call ConfusionEffect + ret c + ld a, CONFUSED | POISONED + ld [wNoEffectFromStatus], a + ret +; 0x2cda0 + +TangelaPoisonPowder_AIEffect: ; 2cda0 (b:4da0) + ld a, 5 + lb de, 0, 10 + jp StoreAIPoisonDamageInfo +; 0x2cda8 + +Heal_OncePerTurnCheck: ; 2cda8 (b:4da8) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + and USED_PKMN_POWER_THIS_TURN + jr nz, .already_used + + call CheckIfPlayAreaHasAnyDamage + ldtx hl, NoPokemonWithDamageCountersText + ret c ; no damage counters to heal + + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret + +.already_used + ldtx hl, OnlyOncePerTurnText + scf + ret +; 0x2cdc7 + +Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) + ldtx de, IfHeadsHealIsSuccessfulText + call TossCoin_BankB + ldh [hTempPlayAreaLocation_ffa1], a + jr nc, .done + + ld a, DUELVARS_DUELIST_TYPE + call GetTurnDuelistVariable + cp DUELIST_TYPE_LINK_OPP + jr z, .link_opp + and DUELIST_TYPE_AI_OPP + jr nz, .done + +; player + ldtx hl, ChoosePkmnToRemoveDamageCounterText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInPlayArea +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hHealPlayAreaLocationTarget], a + ld e, a + call GetCardDamageAndMaxHP + or a + jr z, .loop_input ; has no damage counters + ldh a, [hTempPlayAreaLocation_ff9d] + call SerialSend8Bytes + jr .done + +.link_opp + call SerialRecv8Bytes + ldh [hHealPlayAreaLocationTarget], a + ; fallthrough + +.done + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + ldh a, [hTempPlayAreaLocation_ffa1] + or a + ret z + + ldh a, [hHealPlayAreaLocationTarget] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + add 10 ; remove 1 damage counter + ld [hl], a + ldh a, [hHealPlayAreaLocationTarget] + call Func_2c10b + call ExchangeRNG + ret +; 0x2ce23 + +PetalDance_AIEffect: ; 2ce23 (b:4e23) + ld a, 60 + lb de, 0, 120 + jp StoreAIDamageInfo +; 0x2ce2b + +PetalDance_MultiplierEffect: ; 2ce2b (b:4e2b) + ld hl, 40 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 3 + call TossCoinATimes_BankB + add a + add a + call ATimes10 + ; a = 4 * 10 * heads + call StoreDamageInfo + call SwapTurn + call ConfusionEffect + call SwapTurn + ret +; 0x2ce4b + +PoisonWhip_AIEffect: ; 2ce4b (b:4e4b) + ld a, 10 + lb de, 10, 10 + jp StoreAIPoisonDamageInfo +; 0x2ce53 + +SolarPower_CheckUse: ; 2ce53 (b:4e53) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + and USED_PKMN_POWER_THIS_TURN + jr nz, .already_used + + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret c ; can't use PKMN due to status or Toxic Gas + +; return carry if none of the Arena cards have status conditions + ld a, DUELVARS_ARENA_CARD_STATUS + call GetTurnDuelistVariable + or a + jr nz, .has_status + ld a, DUELVARS_ARENA_CARD_STATUS + call GetNonTurnDuelistVariable + or a + jr z, .no_status +.has_status + or a + ret +.already_used + ldtx hl, OnlyOncePerTurnText + scf + ret +.no_status + ldtx hl, NotAffectedByPoisonSleepParalysisOrConfusionText + scf + ret +; 0x2ce82 + +SolarPower_RemoveStatusEffect: ; 2ce82 (b:4e82) + ld a, $8e + ld [wLoadedMoveAnimation], a + bank1call Func_7415 + ldh a, [hTempPlayAreaLocation_ff9d] + ld b, a + ld c, $00 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + ld l, DUELVARS_ARENA_CARD_STATUS + ld [hl], NO_STATUS + + ld a, DUELVARS_ARENA_CARD_STATUS + call GetNonTurnDuelistVariable + ld [hl], NO_STATUS + bank1call DrawDuelHUDs + ret +; 0x2ceb0 + +VenusaurMegaDrainEffect: ; 2ceb0 (b:4eb0) + ld hl, wDealtDamage + ld a, [hli] + ld h, [hl] + ld l, a + srl h + rr l + bit 0, l + jr z, .rounded + ; round up to nearest 10 + ld de, 10 / 2 + add hl, de +.rounded + ld e, l + ld d, h + call ApplyAndAnimateHPDrain + ret +; 0x2cec8 + +; applies the damage bonus for attacks that get bonus +; from extra Water energy cards. +; this bonus is always 10 more damage for each extra Water energy +; and is always capped at a maximum of 20 damage. +; input: +; b = number of Water energy cards needed for paying Energy Cost +; c = number of colorless energy cards needed for paying Energy Cost +ApplyExtraWaterEnergyDamageBonus: ; 2cec8 (b:4ec8) + ld a, [wccf0] + or a + jr z, .asm_2ced1 + ld c, a + ld b, 0 + +.asm_2ced1 + push bc + ldh a, [hTempPlayAreaLocation_ff9d] + ld e, a + call GetPlayAreaCardAttachedEnergies + pop bc + + ld hl, wAttachedEnergies + WATER + ld a, c + or a + jr z, .check_bonus ; is Energy cost all water energy? + + ; it's not, so we need to remove the + ; Water energy cards from calculations + ; if they pay for colorless instead. + ld a, [wTotalAttachedEnergies] + cp [hl] + jr nz, .check_bonus ; skip if at least 1 non-Water energy attached + + ; Water is the only energy color attached + ld a, c + add b + ld b, a + ; b += c + +.check_bonus + ld a, [hl] + sub b + jr c, .skip_bonus ; is water energy < b? + jr z, .skip_bonus ; is water energy == b? + +; a holds number of water energy not payed for energy cost + cp 3 + jr c, .less_than_3 + ld a, 2 ; cap this to 2 for bonus effect +.less_than_3 + call ATimes10 + call AddToDamage ; add 10 * a to damage + +.skip_bonus + ld a, [wDamage] + ld [wAIMinDamage], a + ld [wAIMaxDamage], a + ret +; 0x2cf05 + +OmastarWaterGunEffect: ; 2cf05 (b:4f05) + lb bc, 1, 1 + jr ApplyExtraWaterEnergyDamageBonus +; 0x2cf0a + +OmastarSpikeCannon_AIEffect: ; 2cf0a (b:4f0a) + ld a, 30 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2cf12 + +OmastarSpikeCannon_MultiplierEffect: ; 2cf12 (b:4f12) + ld hl, 30 + call LoadTxRam3 + ld a, 2 + ldtx de, DamageCheckIfHeadsXDamageText + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo ; 3 * 10 * heads + ret +; 0x2cf2a + +ClairvoyanceEffect: ; 2cf2a (b:4f2a) + scf + ret +; 0x2cf2c + + INCROM $2cf2c, $2f4e1 ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) call SwapTurn @@ -2149,4 +2468,3 @@ ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) ; 0x2f513 INCROM $2f513, $30000 - diff --git a/src/hram.asm b/src/hram.asm index 96230d7a..972fb2fd 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -99,6 +99,8 @@ NEXTU ; the deck index (0-59) of the energy card to transfer ; and the Play Area location (PLAY_AREA_*) of card to receive that energy card. hAIEnergyTransEnergyCard:: ; ffa2 +; PLAY_AREA_* constant of Pokemon to be affected by Heal PKMN Power +hHealPlayAreaLocationTarget:: ; ffa2 ds $1 hAIEnergyTransPlayAreaLocation:: ; ffa3 ds $1 diff --git a/src/text/text1.asm b/src/text/text1.asm index 1cb1e0ab..e391fa40 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -849,7 +849,7 @@ CantEvolvePokemonInSameTurnItsPlacedText: ; 37546 (d:7546) line "in the same turn it was placed." done -Text00b5: ; 37583 (d:7583) +NotAffectedByPoisonSleepParalysisOrConfusionText: ; 37583 (d:7583) text "Not affected by Poison," line "Sleep, Paralysis, or Confusion." done @@ -1108,7 +1108,7 @@ IfHeadsChangeOpponentsActivePokemonText: ; 37e46 (d:7e46) line "Active Pokémon." done -Text00ec: ; 37e73 (d:7e73) +IfHeadsHealIsSuccessfulText: ; 37e73 (d:7e73) text "If Heads," line "Heal is successful." done diff --git a/src/text/text2.asm b/src/text/text2.asm index 1afa4d81..1195ac60 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -298,7 +298,7 @@ ChooseABellsproutText: ; 38bb3 (e:4bb3) text "Choose a Bellsprout." done -Text0130: ; 38bc9 (e:4bc9) +ChoosePkmnToRemoveDamageCounterText: ; 38bc9 (e:4bc9) text "Choose a Pokémon to remove" line "the Damage counter from." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index e0c3cb84..ee5dfcee 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -182,7 +182,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer NoSpaceOnTheBenchText ; 0x00b2 textpointer NoPokemonCapableOfEvolvingText ; 0x00b3 textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 - textpointer Text00b5 ; 0x00b5 + textpointer NotAffectedByPoisonSleepParalysisOrConfusionText ; 0x00b5 textpointer Text00b6 ; 0x00b6 textpointer LureNoPokemonOnTheBenchText ; 0x00b7 textpointer Text00b8 ; 0x00b8 @@ -237,7 +237,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer IfHeadPlus10IfTails10ToYourselfText ; 0x00e9 textpointer Text00ea ; 0x00ea textpointer IfHeadsChangeOpponentsActivePokemonText ; 0x00eb - textpointer Text00ec ; 0x00ec + textpointer IfHeadsHealIsSuccessfulText ; 0x00ec textpointer Text00ed ; 0x00ed textpointer Text00ee ; 0x00ee textpointer TrainerCardSuccessCheckText ; 0x00ef @@ -305,7 +305,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ProcedureForEnergyTransferText ; 0x012d textpointer ChooseABellsproutFromDeckText ; 0x012e textpointer ChooseABellsproutText ; 0x012f - textpointer Text0130 ; 0x0130 + textpointer ChoosePkmnToRemoveDamageCounterText ; 0x0130 textpointer Text0131 ; 0x0131 textpointer Text0132 ; 0x0132 textpointer Text0133 ; 0x0133 From 2fa7cf63dfe4920d3b1081dd9728e4c9af89aa0a Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Thu, 14 May 2020 16:12:41 +0100 Subject: [PATCH 33/45] Disassemble Water effects --- src/constants/duel_constants.asm | 7 + src/data/effect_commands.asm | 132 ++-- src/engine/effect_functions.asm | 1069 ++++++++++++++++++++++++++++-- src/hram.asm | 4 +- src/text/text1.asm | 12 +- src/text/text2.asm | 14 +- src/text/text_offsets.asm | 26 +- src/wram.asm | 17 +- 8 files changed, 1133 insertions(+), 148 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index ff9da29a..dce9540f 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -77,6 +77,7 @@ DUELVARS_DUELIST_TYPE EQUS "LOW(wPlayerDuelistType)" DUELVARS_ARENA_CARD_DISABLED_MOVE_INDEX EQUS "LOW(wPlayerArenaCardDisabledMoveIndex)" ; f2 DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE EQUS "LOW(wPlayerArenaCardLastTurnDamage)" ; f3 DUELVARS_ARENA_CARD_LAST_TURN_STATUS EQUS "LOW(wPlayerArenaCardLastTurnStatus)" ; f5 +DUELVARS_ARENA_CARD_LAST_TURN_EFFECT EQUS "LOW(wPlayerArenaCardLastTurnEffect)" ; f8 ; card location constants (DUELVARS_CARD_LOCATIONS) CARD_LOCATION_DECK EQU $00 @@ -167,6 +168,12 @@ CAN_EVOLVE_THIS_TURN_F EQU 7 USED_PKMN_POWER_THIS_TURN EQU 1 << USED_PKMN_POWER_THIS_TURN_F CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F +; DUELVARS_ARENA_CARD_LAST_TURN_EFFECT constants + const_def + const LAST_TURN_EFFECT_NONE ; $00 + const LAST_TURN_EFFECT_DISCARD_ENERGY ; $01 + const LAST_TURN_EFFECT_AMNESIA ; $02 + ; *_CHANGED_COLOR constants HAS_CHANGED_COLOR_F EQU 7 HAS_CHANGED_COLOR EQU 1 << HAS_CHANGED_COLOR_F diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 4dbc04aa..64f40985 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -353,21 +353,21 @@ OmanyteClairvoyanceEffectCommands: db $00 OmanyteWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f2c - dbw EFFECTCMDTYPE_AI, $4f2c + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, OmanyteWaterGunEffect + dbw EFFECTCMDTYPE_AI, OmanyteWaterGunEffect db $00 WartortleWithdrawEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f32 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, WartortleWithdrawEffect db $00 BlastoiseRainDanceEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4f46 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, RainDanceEffect db $00 BlastoiseHydroPumpEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f48 - dbw EFFECTCMDTYPE_AI, $4f48 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HydroPumpEffect + dbw EFFECTCMDTYPE_AI, HydroPumpEffect db $00 GyaradosBubblebeamEffectCommands: @@ -375,29 +375,29 @@ GyaradosBubblebeamEffectCommands: db $00 KinglerFlailEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $4f54 - dbw EFFECTCMDTYPE_AI, $4f4e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, KinglerFlail_HPCheck + dbw EFFECTCMDTYPE_AI, KinglerFlail_AIEffect db $00 KrabbyCallForFamilyEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $4f5d - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $4fdf - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $4f6d - dbw EFFECTCMDTYPE_UNKNOWN_08, $4fca + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, KrabbyCallForFamily_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, KrabbyCallForFamily_PutInPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, KrabbyCallForFamily_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, KrabbyCallForFamily_AISelectEffect db $00 MagikarpFlailEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5005 - dbw EFFECTCMDTYPE_AI, $4fff + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MagikarpFlail_HPCheck + dbw EFFECTCMDTYPE_AI, MagikarpFlail_AIEffect db $00 PsyduckHeadacheEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $500e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HeadacheEffect db $00 PsyduckFurySwipesEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $501e - dbw EFFECTCMDTYPE_AI, $5016 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PsyduckFurySwipes_MultiplierEffect + dbw EFFECTCMDTYPE_AI, PsyduckFurySwipes_AIEffect db $00 GolduckPsyshockEffectCommands: @@ -405,36 +405,36 @@ GolduckPsyshockEffectCommands: db $00 GolduckHyperBeamEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $506b - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5033 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5065 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, GolduckHyperBeam_DiscardEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, GolduckHyperBeam_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, GolduckHyperBeam_AISelectEffect db $00 SeadraWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5085 - dbw EFFECTCMDTYPE_AI, $5085 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SeadraWaterGunEffect + dbw EFFECTCMDTYPE_AI, SeadraWaterGunEffect db $00 SeadraAgilityEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $508b + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SeadraAgilityEffect db $00 ShellderSupersonicEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $509d + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ShellderSupersonicEffect db $00 ShellderHideInShellEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $50a4 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HideInShellEffect db $00 VaporeonQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $50c0 - dbw EFFECTCMDTYPE_AI, $50b8 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, VaporeonQuickAttack_BoostEffect + dbw EFFECTCMDTYPE_AI, VaporeonQuickAttack_AIEffect db $00 VaporeonWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $50d3 - dbw EFFECTCMDTYPE_AI, $50d3 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, VaporeonWaterGunEffect + dbw EFFECTCMDTYPE_AI, VaporeonWaterGunEffect db $00 DewgongIceBeamEffectCommands: @@ -442,11 +442,11 @@ DewgongIceBeamEffectCommands: db $00 StarmieRecoverEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $50d9 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $50f0 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5114 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $510e - dbw EFFECTCMDTYPE_UNKNOWN_08, $5103 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, StarmieRecover_CheckEnergyHP + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, StarmieRecover_PlayerSelectEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, StarmieRecover_HPRecoveryEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, StarmieRecover_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, StarmieRecover_AISelectEffect db $00 StarmieStarFreezeEffectCommands: @@ -458,57 +458,57 @@ SquirtleBubbleEffectCommands: db $00 SquirtleWithdrawEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5120 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SquirtleWithdrawEffect db $00 HorseaSmokescreenEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5134 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HorseaSmokescreenEffect db $00 TentacruelSupersonicEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $513a + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, TentacruelSupersonicEffect db $00 TentacruelJellyfishStingEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoisonEffect - dbw EFFECTCMDTYPE_AI, $5141 + dbw EFFECTCMDTYPE_AI, JellyfishSting_AIEffect db $00 PoliwhirlAmnesiaEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5149 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $516f - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5179 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5173 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PoliwhirlAmnesia_CheckAttacks + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PoliwhirlAmnesia_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoliwhirlAmnesia_DisableEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, PoliwhirlAmnesia_AISelectEffect db $00 PoliwhirlDoubleslapEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $51c8 - dbw EFFECTCMDTYPE_AI, $51c0 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoliwhirlDoubleslap_MultiplierEffect + dbw EFFECTCMDTYPE_AI, PoliwhirlDoubleslap_AIEffect db $00 PoliwrathWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $51e0 - dbw EFFECTCMDTYPE_AI, $51e0 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoliwrathWaterGunEffect + dbw EFFECTCMDTYPE_AI, PoliwrathWaterGunEffect db $00 PoliwrathWhirlpoolEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5214 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $51e6 - dbw EFFECTCMDTYPE_UNKNOWN_08, $520e + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Whirlpool_DiscardEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Whirlpool_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, Whirlpool_AISelectEffect db $00 PoliwagWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5227 - dbw EFFECTCMDTYPE_AI, $5227 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoliwagWaterGunEffect + dbw EFFECTCMDTYPE_AI, PoliwagWaterGunEffect db $00 CloysterClampEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $522d + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ClampEffect db $00 CloysterSpikeCannonEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $524e - dbw EFFECTCMDTYPE_AI, $5246 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, CloysterSpikeCannon_MultiplierEffect + dbw EFFECTCMDTYPE_AI, CloysterSpikeCannon_AIEffect db $00 ArticunoFreezeDryEffectCommands: @@ -516,19 +516,19 @@ ArticunoFreezeDryEffectCommands: db $00 ArticunoBlizzardEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5266 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $526f + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Blizzard_BenchDamage50PercentEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Blizzard_BenchDamageEffect db $00 TentacoolCowardiceEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $528b - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $52c3 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $52ae + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Cowardice_Check + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Cowardice_RemoveFromPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Cowardice_PlayerSelectEffect db $00 LaprasWaterGunEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $52eb - dbw EFFECTCMDTYPE_AI, $52eb + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LaprasWaterGunEffect + dbw EFFECTCMDTYPE_AI, LaprasWaterGunEffect db $00 LaprasConfuseRayEffectCommands: @@ -536,17 +536,17 @@ LaprasConfuseRayEffectCommands: db $00 ArticunoQuickfreezeEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $52f1 - dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, $52f3 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Quickfreeze_InitialEffect + dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, Quickfreeze_Paralysis50PercentEffect db $00 ArticunoIceBreathEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5329 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $532e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, IceBreath_ZeroDamage + dbw EFFECTCMDTYPE_AFTER_DAMAGE, IceBreath_RandomPokemonDamageEffect db $00 VaporeonFocusEnergyEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $533f + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FocusEnergyEffect db $00 ArcanineFlamethrowerEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 974cd220..836b1b55 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -15,6 +15,8 @@ Paralysis50PercentEffect: ; 2c011 (b:4011) ldtx de, ParalysisCheckText call TossCoin_BankB ret nc + +ParalysisEffect: ; 2c018 (b:4018) lb bc, PSN_DBLPSN, PARALYZED jr ApplyStatusEffect @@ -288,7 +290,70 @@ StoreDamageInfo: ; 2c166 (b:4166) ret ; 0x2c174 - INCROM $2c174, $2c1ec +; overwrites wAIMinDamage and wAIMaxDamage +; with value in wDamage. +SetMinMaxDamageSameAsDamage: ; 2c174 (b:4174) + ld a, [wDamage] + ld [wAIMinDamage], a + ld [wAIMaxDamage], a + ret +; 0x2c17e + +; returns in a a random Play Area location +; of card in Turn Duelist's Play Area. +PickRandomPlayAreaCard: ; 2c17e (b:417e) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + call Random + or a + ret +; 0x2c188 + + INCROM $2c188, $2c199 + +; creates in wDuelTempList a list of cards that +; are in the Arena that are the same type as input a. +; used to list are Energy cards of a specific type +; that are attached to the Arena Pokemon. +; input: +; a = CARD_DATA_TYPE constant +; output: +; a = number of cards in list; +; wDuelTempList filled with cards, terminated by $ff +CreateListOfEnergyAttachedToArenaOfType: ; 2c199 (b:4199) + ld b, a + ld c, 0 + ld de, wDuelTempList + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop + ld a, [hl] + cp CARD_LOCATION_ARENA + jr nz, .next + push de + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + pop de + cp b + jr nz, .next ; is same as input type? + ld a, l + ld [de], a + inc de + inc c +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop + + ld a, $ff + ld [de], a + ld a, c + ret +; 0x2c1c4 + + INCROM $2c1c4, $2c1ec HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ld e, a @@ -307,7 +372,7 @@ HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) pop de .switch - call .HandleNoDamageOrEffect + call HandleNoDamageOrEffect ret c ; attack was successful, switch Defending Pokemon @@ -324,7 +389,7 @@ HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ; returns carry if Defending has No Damage or Effect ; if so, print its appropriate text. -.HandleNoDamageOrEffect: ; 2c216 (b:4216) +HandleNoDamageOrEffect: ; 2c216 (b:4216) call CheckNoDamageOrEffect ret nc ld a, l @@ -334,12 +399,12 @@ HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ret ; 0x2c221 -; applies HP recovery on Pokemon after HP drain attack -; and handles its animation. +; applies HP recovery on Pokemon after an attack +; with HP recovery effect, and handles its animation. ; input: ; d = damage effectiveness ; e = HP amount to recover -ApplyAndAnimateHPDrain: ; 2c221 (b:4221) +ApplyAndAnimateHPRecovery: ; 2c221 (b:4221) push de ld hl, wccbd ld [hl], e @@ -627,7 +692,95 @@ LookForCardInDeck: ; 2c2ec (b:42ec) ret ; 0x2c391 - INCROM $2c391, $2c487 +; outputs the Player selection of attack +; to use Amnesia on. +HandleAmnesiaScreen: ; 2c391 (b:4391) + bank1call DrawDuelMainScene + call SwapTurn + xor a + ldh [hEffectItemSelection], a + +.start + bank1call PrintAndLoadMovesToDuelTempList + push af + ldh a, [hEffectItemSelection] + ld hl, .menu_parameters + call InitializeMenuParameters + pop af + + ld [wNumMenuItems], a + call EnableLCD +.loop_input + call DoFrame + ldh a, [hKeysPressed] + bit B_BUTTON_F, a + jr nz, .set_carry + and START + jr nz, .open_move_page + call HandleMenuInput + jr nc, .loop_input + cp $ff + jr z, .loop_input + +; a move was selected + ldh a, [hCurMenuItem] + add a + ld e, a + ld d, $00 + ld hl, wDuelTempList + add hl, de + ld d, [hl] + inc hl + ld e, [hl] + call SwapTurn + or a + ret + +.set_carry + call SwapTurn + scf + ret + +.open_move_page + ldh a, [hCurMenuItem] + ldh [hEffectItemSelection], a + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + bank1call OpenMovePage + call SwapTurn + bank1call DrawDuelMainScene + call SwapTurn + jr .start +; 0x2c3f4 + +.menu_parameters + db 1, 13 ; cursor x, cursor y + db 2 ; y displacement between items + db 2 ; number of items + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw $0000 ; function pointer if non-0 +; 0x2c3fc + +; loads in hl the pointer to input attack's name +; (0 = first attack, 1 = second attack) +GetAttackName: ; 2c3fc (b:43fc) + ld a, d + call LoadCardDataToBuffer1_FromDeckIndex + ld hl, wLoadedCard1Move1Name + inc e + dec e + jr z, .load_name + ld hl, wLoadedCard1Move2Name +.load_name + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 0x2c40e + + INCROM $2c40e, $2c487 ; handles the selection of a forced switch ; by link/AI opponent or by the player. @@ -684,7 +837,111 @@ DuelistSelectForcedSwitch: ; 2c487 (b:4487) ret ; 0x2c4da - INCROM $2c4da, $2c564 +; returns in a the card index of energy card +; attached to Defending Pokemon +; that is to be discarded by the AI for an effect. +; outputs $ff is none was found. +; output: +; a = deck index of attached energy card chosen +AIPickEnergyCardToDiscardFromDefendingPokemon: ; 2c4da (b:44da) + call SwapTurn + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + + xor a + call CreateArenaOrBenchEnergyCardList + jr nc, .has_energy + ; no energy, return + ld a, $ff + jr .done + +.has_energy + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ld e, COLORLESS + ld a, [wAttachedEnergies + COLORLESS] + or a + jr nz, .pick_color ; has colorless attached? + + ; no colorless energy attached. + ; if it's colorless Pokemon, just + ; pick any energy card at random... + ld a, [wLoadedCard1Type] + cp COLORLESS + jr nc, .choose_random + + ; ...if not, check if it has its + ; own color energy attached. + ; if it doesn't, pick at random. + ld e, a + ld d, $00 + ld hl, wAttachedEnergies + add hl, de + ld a, [hl] + or a + jr z, .choose_random + +; pick attached card with same color as e +.pick_color + ld hl, wDuelTempList +.loop_energy + ld a, [hli] + cp $ff + jr z, .choose_random + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + and TYPE_PKMN + cp e + jr nz, .loop_energy + dec hl + +.done_chosen + ld a, [hl] +.done + call SwapTurn + ret + +.choose_random + call CountCardsInDuelTempList + ld hl, wDuelTempList + call ShuffleCards + jr .done_chosen +; 0x2c532 + +; handles AI logic to pick attack for Amnesia +AIPickAttackForAmnesia: ; 2c532 (b:4532) +; load Defending Pokemon attacks + call SwapTurn + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + call HandleEnergyBurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld d, a + call LoadCardDataToBuffer2_FromDeckIndex +; if has no attack 1 name, return + ld hl, wLoadedCard2Move1Name + ld a, [hli] + or [hl] + jr z, .chosen + +; if Defending Pokemon has enough energy for second attack, choose it + ld e, SECOND_ATTACK + bank1call _CheckIfEnoughEnergiesToMove + jr nc, .chosen +; otherwise if first attack isn't a Pkmn Power, choose it instead. + ld e, FIRST_ATTACK_OR_PKMN_POWER + ld a, [wLoadedCard2Move1Category] + cp POKEMON_POWER + jr nz, .chosen +; if it is a Pkmn Power, choose second attack. + ld e, SECOND_ATTACK +.chosen + ld a, e + call SwapTurn + ret +; 0x2c564 ; outputs in a the Play Area location (PLAY_AREA_* constant) ; of lowest HP card in non-duelist's Bench. @@ -1031,7 +1288,7 @@ WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) VictreebelLure_CheckBench: ; 2c740 (b:4740) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetNonTurnDuelistVariable - ldtx hl, LureNoPokemonOnTheBenchText + ldtx hl, EffectNoPokemonOnTheBenchText cp 2 ret ; 0x2c74b @@ -1112,7 +1369,7 @@ GolbatLeechLifeEffect: ; 2c7bc (b:47bc) ld e, [hl] inc hl ; wDamageEffectiveness ld d, [hl] - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2c7c6 @@ -1121,7 +1378,7 @@ VenonatLeechLifeEffect: ; 2c7c6 (b:47c6) ld e, [hl] inc hl ; wDamageEffectiveness ld d, [hl] - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2c7d0 @@ -1146,7 +1403,7 @@ ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) ld e, [hl] inc hl ld d, [hl] - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2c7ed @@ -1183,7 +1440,7 @@ ExeggcuteLeechSeedEffect: ; 2c815 (b:4815) or a ret z ; return if no damage dealt ld de, 10 - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2c822 @@ -1705,7 +1962,7 @@ ButterfreeMegaDrainEffect: ; 2cb0f (b:4b0f) .rounded ld e, l ld d, h - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2cb27 @@ -1727,7 +1984,7 @@ BulbasaurLeechSeedEffect: ; 2cb37 (b:4b37) or [hl] ret z ; return if no damage dealt lb de, 0, 10 - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2cb44 @@ -1784,13 +2041,13 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) .player xor a - ldh [hCurPlayAreaItem], a + ldh [hEffectItemSelection], a bank1call Func_61a1 .draw_play_area bank1call PrintPlayAreaCardList_EnableLCD push af - ldh a, [hCurPlayAreaItem] + ldh a, [hEffectItemSelection] ld hl, PlayAreaSelectionMenuParameters call InitializeMenuParameters pop af @@ -1806,7 +2063,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) ; a press ldh [hTempPlayAreaLocation_ffa1], a - ldh [hCurPlayAreaItem], a + ldh [hEffectItemSelection], a call CheckIfCardHasGrassEnergyAttached jr c, .play_sfx ; no Grass attached @@ -1835,7 +2092,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) jr z, .remove_symbol ; a press - ldh [hCurPlayAreaItem], a + ldh [hEffectItemSelection], a ldh [hAIEnergyTransPlayAreaLocation], a ld a, OPPACTION_6B15 call SetOppAction_SerialSendDuelData @@ -1921,8 +2178,8 @@ Sludge_AIEffect: ; 2cc38 (b:4c38) jp StoreAIPoisonDamageInfo ; 0x2cc40 -; returns carry if no cards in Deck or if -; Play Area is full already. +; returns carry if no cards in Deck +; or if Play Area is full already. BellsproutCallForFamily_CheckDeckAndPlayArea: ; 2cc40 (b:4c40) call CheckIfDeckIsEmpty ret c ; return if no cards in deck @@ -2343,7 +2600,7 @@ VenusaurMegaDrainEffect: ; 2ceb0 (b:4eb0) .rounded ld e, l ld d, h - call ApplyAndAnimateHPDrain + call ApplyAndAnimateHPRecovery ret ; 0x2cec8 @@ -2437,34 +2694,742 @@ ClairvoyanceEffect: ; 2cf2a (b:4f2a) ret ; 0x2cf2c - INCROM $2cf2c, $2f4e1 - -ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) - call SwapTurn - call CreateHandCardList - call SortCardsInDuelTempListByID - ld hl, wDuelTempList -.return_hand_to_deck_loop - ld a, [hli] - cp $ff - jr z, .shuffle - call RemoveCardFromHand - call ReturnCardToDeck - jr .return_hand_to_deck_loop -.shuffle - call Func_2c0bd - ld a, $07 - bank1call $4935 - ld c, $07 -.draw_loop - call DrawCardFromDeck - jr c, .revert_turn_to_user - call AddCardToHand - dec c - jr nz, .draw_loop -.revert_turn_to_user - call SwapTurn - ret -; 0x2f513 +OmanyteWaterGunEffect: ; 2cf2c (b:4f2c) + lb bc, 1, 0 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2cf32 - INCROM $2f513, $30000 +WartortleWithdrawEffect: ; 2cf32 (b:4f32) + ldtx de, IfHeadsNoDamageNextTurnText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $4f + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_NO_DAMAGE_10 + call ApplySubstatus1ToDefendingCard + ret +; 0x2cf46 + +RainDanceEffect: ; 2cf46 (b:4f46) + scf + ret +; 0x2cf48 + +HydroPumpEffect: ; 2cf48 (b:4f48) + lb bc, 3, 0 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2cf4e + +KinglerFlail_AIEffect: ; 2cf4e (b:4f4e) + call KinglerFlail_HPCheck + jp SetMinMaxDamageSameAsDamage +; 0x2cf54 + +KinglerFlail_HPCheck: ; 2cf54 (b:4f54) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call StoreDamageInfo + ret +; 0x2cf5d + +; returns carry if no cards in Deck +; or if Play Area is full already. +KrabbyCallForFamily_CheckDeckAndPlayArea: ; 2cf5d (b:4f5d) + call CheckIfDeckIsEmpty + ret c ; return if no cards in deck + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2cf6d + +KrabbyCallForFamily_PlayerSelectEffect: ; 2cf6d (b:4f6d) + ld a, $ff + ldh [hTemp_ffa0], a + + call CreateDeckCardList + ldtx hl, ChooseAKrabbyFromDeckText + ldtx bc, KrabbyText + lb de, SEARCHEFFECT_CARD_ID, KRABBY + call LookForCardInDeck + ret c + +; draw Deck list interface and print text + bank1call Func_5591 + ldtx hl, ChooseAKrabbyText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +.loop + bank1call DisplayCardList + jr c, .pressed_b + call GetCardIDFromDeckIndex + ld bc, KRABBY + call CompareDEtoBC + jr nz, .play_sfx + +; Krabby was selected + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret + +.play_sfx + ; play SFX and loop back + call Func_3794 + jr .loop + +.pressed_b +; figure if Player can exit the screen without selecting, +; that is, if the Deck has no Krabby card. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_b_press + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + ld a, l + call GetCardIDFromDeckIndex + ld bc, KRABBY + call CompareDEtoBC + jr z, .play_sfx ; found Krabby, go back to top loop +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_b_press + +; no Krabby in Deck, can safely exit screen + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2cfdf + +KrabbyCallForFamily_AISelectEffect: ; 2cfdf (b:4fdf) + call CreateDeckCardList + ld hl, wDuelTempList +.loop_deck + ld a, [hli] + ldh [hTemp_ffa0], a + cp $ff + ret z ; no Krabby + call GetCardIDFromDeckIndex + ld a, e + cp KRABBY + jr nz, .loop_deck + ret ; Krabby found +; 0x2cfca + +KrabbyCallForFamily_PutInPlayAreaEffect: ; 2cfca (b:4fca) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .shuffle + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .shuffle + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen +.shuffle + call Func_2c0bd + ret +; 0x2cfff + +MagikarpFlail_AIEffect: ; 2cfff (b:4fff) + call MagikarpFlail_HPCheck + jp SetMinMaxDamageSameAsDamage +; 0x2d005 + +MagikarpFlail_HPCheck: ; 2d005 (b:5005) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call StoreDamageInfo + ret +; 0x2d00e + +HeadacheEffect: ; 2d00e (b:500e) + ld a, DUELVARS_ARENA_CARD_SUBSTATUS3 + call GetNonTurnDuelistVariable + set SUBSTATUS3_HEADACHE, [hl] + ret +; 0x2d016 + +PsyduckFurySwipes_AIEffect: ; 2d016 (b:5016) + ld a, 15 + lb de, 0, 30 + jp StoreAIDamageInfo +; 0x2d01e + +PsyduckFurySwipes_MultiplierEffect: ; 2d01e (b:501e) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 3 + call TossCoinATimes_BankB + call ATimes10 + call StoreDamageInfo + ret +; 0x2d033 + +GolduckHyperBeam_PlayerSelectEffect: ; 2d033 (b:5033) + call SwapTurn + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wTotalAttachedEnergies] + or a + jr z, .no_energy + +; draw Energy Card list screen + ldtx hl, ChooseDiscardEnergyCardFromOpponentText + call DrawWideTextBox_WaitForInput + xor a ; PLAY_AREA_ARENA + call CreateArenaOrBenchEnergyCardList + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen + +.loop_input + bank1call HandleEnergyDiscardMenuInput + jr c, .loop_input + + call SwapTurn + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a ; store selected card to discard + ret + +.no_energy + call SwapTurn + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2d065 + +GolduckHyperBeam_AISelectEffect: ; 2d065 (b:5065) + call AIPickEnergyCardToDiscardFromDefendingPokemon + ldh [hTemp_ffa0], a + ret +; 0x2d06b + +GolduckHyperBeam_DiscardEffect: ; 2d06b (b:506b) + call HandleNoDamageOrEffect + ret c ; return if attack had no effect + + ; check if energy card was chosen to discard + ldh a, [hTemp_ffa0] + cp $ff + ret z ; return if none selected + + ; discard Defending card's energy + call SwapTurn + call PutCardInDiscardPile + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY + call SwapTurn + ret +; 0x2d085 + +SeadraWaterGunEffect: ; 2d085 (b:5085) + lb bc, 1, 1 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2d08b + +SeadraAgilityEffect: ; 2d08b (b:508b) + ldtx de, IfHeadsDoNotReceiveDamageOrEffectText + call TossCoin_BankB + ret nc ; return if tails + ld a, $52 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_AGILITY + call ApplySubstatus1ToDefendingCard + ret +; 0x2d09d + +ShellderSupersonicEffect: ; 2d09d (b:509d) + call Confusion50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2d0a4 + +HideInShellEffect: ; 2d0a4 (b:50a4) + ldtx de, IfHeadsNoDamageNextTurnText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $4f + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_NO_DAMAGE_11 + call ApplySubstatus1ToDefendingCard + ret +; 0x2d0b8 + +VaporeonQuickAttack_AIEffect: ; 2d0b8 (b:50b8) + ld a, 20 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2d0c0 + +VaporeonQuickAttack_BoostEffect: ; 2d0c0 (b:50c0) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2d0d3 + +VaporeonWaterGunEffect: ; 2d0d3 (b:50d3) + lb bc, 2, 1 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2d0d9 + +; returns carry if Arena card has no Water Energy attached +; or if it doesn't have any damage counters. +StarmieRecover_CheckEnergyHP: ; 2d0d9 (b:50d9) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies + WATER] + ldtx hl, NotEnoughWaterEnergyText + cp 1 + ret c ; return if not enough energy + call GetCardDamageAndMaxHP + ldtx hl, NoDamageCountersText + cp 10 + ret ; return carry if no damage +; 0x2d0f0 + +StarmieRecover_PlayerSelectEffect: ; 2d0f0 (b:50f0) + ld a, TYPE_ENERGY_WATER + call CreateListOfEnergyAttachedToArenaOfType + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen +.loop_input + bank1call HandleEnergyDiscardMenuInput + jr c, .loop_input + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a ; store card chosen + ret +; 0x2d103 + +StarmieRecover_AISelectEffect: ; 2d103 (b:5103) + ld a, TYPE_ENERGY_WATER + call CreateListOfEnergyAttachedToArenaOfType + ld a, [wDuelTempList] ; pick first card + ldh [hTemp_ffa0], a + ret +; 0x2d10e + +StarmieRecover_DiscardEffect: ; 2d10e (b:510e) + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ret +; 0x2d114 + +StarmieRecover_HPRecoveryEffect: ; 2d114 (b:5114) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld e, a ; all damage for recovery + ld d, 0 + call ApplyAndAnimateHPRecovery + ret +; 0x2d120 + +SquirtleWithdrawEffect: ; 2d120 (b:5120) + ldtx de, IfHeadsNoDamageNextTurnText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $4f + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_NO_DAMAGE_10 + call ApplySubstatus1ToDefendingCard + ret +; 0x2d134 + +HorseaSmokescreenEffect: ; 2d134 (b:5134) + ld a, SUBSTATUS2_SMOKESCREEN + call ApplySubstatus2ToDefendingCard + ret +; 0x2d13a + +TentacruelSupersonicEffect: ; 2d13a (b:513a) + call Confusion50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2d141 + +JellyfishSting_AIEffect: ; 2d141 (b:5141) + ld a, 10 + lb de, 10, 10 + jp StoreAIPoisonDamageInfo +; 0x2d149 + +; returns carry if Defending Pokemon has no attacks +PoliwhirlAmnesia_CheckAttacks: ; 2d149 (b:5149) + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Move1Category] + cp POKEMON_POWER + jr nz, .has_attack + ld hl, wLoadedCard2Move2Name + ld a, [hli] + or [hl] + jr nz, .has_attack +; has no attack + call SwapTurn + ldtx hl, NoAttackMayBeChoosenText + scf + ret +.has_attack + call SwapTurn + or a + ret +; 0x2d16f + +PoliwhirlAmnesia_PlayerSelectEffect: ; 2d16f (b:516f) + call PlayerPickAttackForAmnesia + ret +; 0x2d173 + +PoliwhirlAmnesia_AISelectEffect: ; 2d173 (b:5173) + call AIPickAttackForAmnesia + ldh [hTemp_ffa0], a + ret +; 0x2d179 + +PoliwhirlAmnesia_DisableEffect: ; 2d179 (b:5179) + call ApplyAmnesiaToAttack + ret +; 0x2d17d + +PlayerPickAttackForAmnesia: ; 2d17d (b:517d) + ldtx hl, ChooseAttackOpponentWillNotBeAbleToUseText + call DrawWideTextBox_WaitForInput + call HandleAmnesiaScreen + ld a, e + ldh [hTemp_ffa0], a + ret +; 0x2d18a + +; applies the Amnesia effect on the defending Pokemon, +; for the attack index in hTemp_ffa0. +ApplyAmnesiaToAttack: ; 2d18a (b:518a) + ld a, SUBSTATUS2_AMNESIA + call ApplySubstatus2ToDefendingCard + ld a, [wNoDamageOrEffect] + or a + ret nz ; no effect + +; set selected attack as disabled + ld a, DUELVARS_ARENA_CARD_DISABLED_MOVE_INDEX + call GetNonTurnDuelistVariable + ldh a, [hTemp_ffa0] + ld [hl], a + + ld l, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + ld [hl], LAST_TURN_EFFECT_AMNESIA + + call CheckIfTurnDuelistIsPlayer + ret c ; return if Player + +; the rest of the routine if for non-Player +; to announce which move was used for Amnesia. + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld d, a + ldh a, [hTemp_ffa0] + ld e, a + call GetAttackName + call LoadTxRam2 + ldtx hl, WasChosenForTheEffectOfAmnesiaText + call DrawWideTextBox_WaitForInput + call SwapTurn + ret +; 0x2d1c0 + +PoliwhirlDoubleslap_AIEffect: ; 2d1c0 (b:51c0) + ld a, 30 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2d1c8 + +PoliwhirlDoubleslap_MultiplierEffect: ; 2d1c8 (b:51c8) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo + ret +; 0x2d1e0 + +PoliwrathWaterGunEffect: ; 2d1e0 (b:51e0) + lb bc, 2, 1 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2d1e6 + +Whirlpool_PlayerSelectEffect: ; 2d1e6 (b:51e6) + call SwapTurn + xor a ; PLAY_AREA_ARENA + call CreateArenaOrBenchEnergyCardList + jr c, .no_energy + + ldtx hl, ChooseDiscardEnergyCardFromOpponentText + call DrawWideTextBox_WaitForInput + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen +.loop_input + bank1call HandleEnergyDiscardMenuInput + jr c, .loop_input + + call SwapTurn + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a ; store selected card to discard + ret + +.no_energy + call SwapTurn + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2d20e + +Whirlpool_AISelectEffect: ; 2d20e (b:520e) + call AIPickEnergyCardToDiscardFromDefendingPokemon + ldh [hTemp_ffa0], a + ret +; 0x2d214 + +Whirlpool_DiscardEffect: ; 2d214 (b:5214) + call HandleNoDamageOrEffect + ret c ; return if attack had no effect + ldh a, [hTemp_ffa0] + cp $ff + ret z ; return if none selected + + ; discard Defending card's energy + ; this doesn't update DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call SwapTurn + call PutCardInDiscardPile + ; ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + ; call GetTurnDuelistVariable + ; ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY + call SwapTurn + ret +; 0x2d227 + +PoliwagWaterGunEffect: ; 2d227 (b:5227) + lb bc, 1, 0 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2d22d + +ClampEffect: ; 2d22d (b:522d) + ld a, $05 + ld [wLoadedMoveAnimation], a + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + jp c, ParalysisEffect +; unsuccessful + xor a + ld [wLoadedMoveAnimation], a + call StoreDamageInfo + call SetWasUnsuccessful + ret +; 0x2d246 + +CloysterSpikeCannon_AIEffect: ; 2d246 (b:5246) + ld a, 30 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2d24e + +CloysterSpikeCannon_MultiplierEffect: ; 2d24e (b:524e) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo + ret +; 0x2d266 + +Blizzard_BenchDamage50PercentEffect: ; 2d266 (b:5266) + ldtx de, DamageToOppBenchIfHeadsDamageToYoursIfTailsText + call TossCoin_BankB + ldh [hTemp_ffa0], a ; store coin result + ret +; 0x2d26f + +Blizzard_BenchDamageEffect: ; 2d26f (b:526f) + ldh a, [hTemp_ffa0] + or a + jr nz, .opp_bench + +; own bench + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + ret + +.opp_bench + call SwapTurn + ld a, 10 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2d28b + +; return carry if can use Cowardice +Cowardice_Check: ; 2d28b (b:528b) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret c ; return if cannot use + + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret c ; return if no bench + + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + ldtx hl, CannotBeUsedInTurnWhichWasPlayedText + and CAN_EVOLVE_THIS_TURN + scf + ret z ; return if was played this turn + + or a + ret +; 0x2d2ae + +Cowardice_PlayerSelectEffect: ; 2d2ae (b:52ae) + ldh a, [hTemp_ffa0] + or a + ret nz ; return if not Arena card + ldtx hl, SelectPokemonToPlaceInTheArenaText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + bank1call OpenPlayAreaScreenForSelection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2d2c3 + +Cowardice_RemoveFromPlayAreaEffect: ; 2d2c3 (b:52c3) + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + +; put card in Discard Pile temporarily, so that +; all cards attached are discarded as well. + push af + ldh a, [hTemp_ffa0] + ld e, a + call MovePlayAreaCardToDiscardPile + +; if card was in Arena, swap selected Bench +; Pokemon with Arena, otherwise skip. + ldh a, [hTemp_ffa0] + or a + jr nz, .skip_switch + ldh a, [hTempPlayAreaLocation_ffa1] + ld e, a + call SwapArenaWithBenchPokemon + +.skip_switch +; move card back to Hand from Discard Pile +; and adjust Play Area + pop af + call MoveDiscardPileCardToHand + call AddCardToHand + call ShiftAllPokemonToFirstPlayAreaSlots + + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2d2eb + +LaprasWaterGunEffect: ; 2d2eb (b:52eb) + lb bc, 1, 0 + jp ApplyExtraWaterEnergyDamageBonus +; 0x2d2f1 + +Quickfreeze_InitialEffect: ; 2d2f1 (b:52f1) + scf + ret +; 0x2d2f3 + +Quickfreeze_Paralysis50PercentEffect: ; 2d2f3 (b:52f3) + ldtx de, ParalysisCheckText + call TossCoin_BankB + jr c, .heads + +; tails + call SetWasUnsuccessful + bank1call DrawDuelMainScene + bank1call Func_1bca + call WaitForWideTextBoxInput + ret + +.heads + call ParalysisEffect + ldh a, [hTempPlayAreaLocation_ff9d] + ld b, a + ld c, $00 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call Func_741a + bank1call WaitMoveAnimation + bank1call Func_6df1 + bank1call DrawDuelHUDs + bank1call Func_1bca + call c, WaitForWideTextBoxInput + ret +; 0x2d329 + +IceBreath_ZeroDamage: ; 2d329 (b:5329) + xor a + call StoreDamageInfo + ret +; 0x2d32e + +IceBreath_RandomPokemonDamageEffect: ; 2d32e (b:532e) + call SwapTurn + call PickRandomPlayAreaCard + ld b, a + ld de, 40 + call DealDamageToPlayAreaPokemon + call SwapTurn + ret +; 0x2d33f + +FocusEnergyEffect: ; 2d33f (b:533f) + ld a, [wTempTurnDuelistCardID] + cp VAPOREON1 + ret nz ; return if no Vaporeon1 + ld a, SUBSTATUS1_NEXT_TURN_DOUBLE_DAMAGE + call ApplySubstatus1ToDefendingCard + ret +; 0x2d34b + + INCROM $2d34b, $30000 diff --git a/src/hram.asm b/src/hram.asm index 972fb2fd..ccd9c7d0 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -155,8 +155,8 @@ hffb0:: ; ffb0 hCurMenuItem:: ; ffb1 ds $1 -; stores the item number in the Play Area selection menu -hCurPlayAreaItem:: ; ffb2 +; stores the item number in the selection menu of various effects +hEffectItemSelection:: ; ffb2 ds $1 ds $2 diff --git a/src/text/text1.asm b/src/text/text1.asm index e391fa40..79ed84e2 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -858,7 +858,7 @@ Text00b6: ; 375bc (d:75bc) text "Not enough cards in Hand." done -LureNoPokemonOnTheBenchText: ; 375d7 (d:75d7) +EffectNoPokemonOnTheBenchText: ; 375d7 (d:75d7) text "No Pokémon on the Bench." done @@ -914,7 +914,7 @@ Text00c2: ; 377b4 (d:77b4) text "Not enough Psychic Energy." done -Text00c3: ; 377d0 (d:77d0) +NotEnoughWaterEnergyText: ; 377d0 (d:77d0) text "Not enough Water Energy." done @@ -923,7 +923,7 @@ Text00c4: ; 377ea (d:77ea) line "in the Discard Pile." done -Text00c5: ; 3781b (d:781b) +NoAttackMayBeChoosenText: ; 3781b (d:781b) text "No Attacks may be choosen." done @@ -954,7 +954,7 @@ CannotUseDueToStatusText: ; 378bc (d:78bc) line "or Confusion." done -Text00cc: ; 378ef (d:78ef) +CannotBeUsedInTurnWhichWasPlayedText: ; 378ef (d:78ef) text "Cannot be used in the turn in" line "which it was played." done @@ -1098,7 +1098,7 @@ IfHeadPlus10IfTails10ToYourselfText: ; 37dc9 (d:7dc9) line "If Tails, +10 damage to yourself!" done -Text00ea: ; 37e03 (d:7e03) +DamageToOppBenchIfHeadsDamageToYoursIfTailsText: ; 37e03 (d:7e03) text "10 damage to opponent's Bench if" line "Heads, damage to yours if Tails." done @@ -1118,7 +1118,7 @@ Text00ed: ; 37e92 (d:7e92) line "to yourself, too." done -Text00ee: ; 37eb8 (d:7eb8) +SuccessCheckIfHeadsAttackIsSuccessfulText: ; 37eb8 (d:7eb8) text "Success check!!!" line "If Heads, Attack is successful!" done diff --git a/src/text/text2.asm b/src/text/text2.asm index 1195ac60..0406103f 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -27,7 +27,7 @@ PoisonedIfHeadsConfusedIfTailsText: ; 380ed (e:40ed) line "and Confused if Tails." done -Text00fb: ; 38124 (e:4124) +IfHeadsDoNotReceiveDamageOrEffectText: ; 38124 (e:4124) text "If Heads, do not receive damage" line "or effect of opponent's next Attack!" done @@ -222,17 +222,17 @@ Text0121: ; 388ca (e:48ca) line "2 Energy cards." done -Text0122: ; 388ee (e:48ee) +ChooseAKrabbyFromDeckText: ; 388ee (e:48ee) text "Choose a Krabby" line "from the Deck." done -Text0123: ; 3890e (e:490e) +ChooseDiscardEnergyCardFromOpponentText: ; 3890e (e:490e) text "Choose and Discard an Energy card" line "from the opponent's Active Pokémon." done -Text0124: ; 38955 (e:4955) +ChooseAttackOpponentWillNotBeAbleToUseText: ; 38955 (e:4955) text "Choose the Attack the opponent will" line "not be able to use on the next turn." done @@ -251,7 +251,7 @@ ChooseAnOddishText: ; 389f0 (e:49f0) text "Choose an Oddish" done -Text0128: ; 38a02 (e:4a02) +ChooseAKrabbyText: ; 38a02 (e:4a02) text "Choose a Krabby." done @@ -437,7 +437,7 @@ BellsproutText: ; 392e4 (e:52e4) text "Bellsprout" done -Text0142: ; 392f0 (e:52f0) +KrabbyText: ; 392f0 (e:52f0) text "Krabby" done @@ -463,7 +463,7 @@ Text0147: ; 3935d (e:535d) line "cards were returned to the Hand." done -Text0148: ; 39392 (e:5392) +WasChosenForTheEffectOfAmnesiaText: ; 39392 (e:5392) text " was chosen" line "for the effect of Amnesia." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index ee5dfcee..a91e656f 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -184,7 +184,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 textpointer NotAffectedByPoisonSleepParalysisOrConfusionText ; 0x00b5 textpointer Text00b6 ; 0x00b6 - textpointer LureNoPokemonOnTheBenchText ; 0x00b7 + textpointer EffectNoPokemonOnTheBenchText ; 0x00b7 textpointer Text00b8 ; 0x00b8 textpointer Text00b9 ; 0x00b9 textpointer Text00ba ; 0x00ba @@ -196,16 +196,16 @@ TextOffsets:: ; 34000 (d:4000) textpointer NotEnoughEnergyCardsText ; 0x00c0 textpointer Text00c1 ; 0x00c1 textpointer Text00c2 ; 0x00c2 - textpointer Text00c3 ; 0x00c3 + textpointer NotEnoughWaterEnergyText ; 0x00c3 textpointer Text00c4 ; 0x00c4 - textpointer Text00c5 ; 0x00c5 + textpointer NoAttackMayBeChoosenText ; 0x00c5 textpointer Text00c6 ; 0x00c6 textpointer Text00c7 ; 0x00c7 textpointer Text00c8 ; 0x00c8 textpointer Text00c9 ; 0x00c9 textpointer OnlyOncePerTurnText ; 0x00ca textpointer CannotUseDueToStatusText ; 0x00cb - textpointer Text00cc ; 0x00cc + textpointer CannotBeUsedInTurnWhichWasPlayedText ; 0x00cc textpointer Text00cd ; 0x00cd textpointer NoGrassEnergyText ; 0x00ce textpointer Text00cf ; 0x00cf @@ -235,11 +235,11 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00e7 ; 0x00e7 textpointer Text00e8 ; 0x00e8 textpointer IfHeadPlus10IfTails10ToYourselfText ; 0x00e9 - textpointer Text00ea ; 0x00ea + textpointer DamageToOppBenchIfHeadsDamageToYoursIfTailsText ; 0x00ea textpointer IfHeadsChangeOpponentsActivePokemonText ; 0x00eb textpointer IfHeadsHealIsSuccessfulText ; 0x00ec textpointer Text00ed ; 0x00ed - textpointer Text00ee ; 0x00ee + textpointer SuccessCheckIfHeadsAttackIsSuccessfulText ; 0x00ee textpointer TrainerCardSuccessCheckText ; 0x00ef textpointer Text00f0 ; 0x00f0 textpointer IfHeadsNoDamageNextTurnText ; 0x00f1 @@ -252,7 +252,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ConfusionCheckRetreatText ; 0x00f8 textpointer PokemonsSleepCheckText ; 0x00f9 textpointer PoisonedIfHeadsConfusedIfTailsText ; 0x00fa - textpointer Text00fb ; 0x00fb + textpointer IfHeadsDoNotReceiveDamageOrEffectText ; 0x00fb textpointer Text00fc ; 0x00fc textpointer AttackUnsuccessfulText ; 0x00fd textpointer UnableToRetreatDueToAcidText ; 0x00fe @@ -291,13 +291,13 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text011f ; 0x011f textpointer Text0120 ; 0x0120 textpointer Text0121 ; 0x0121 - textpointer Text0122 ; 0x0122 - textpointer Text0123 ; 0x0123 - textpointer Text0124 ; 0x0124 + textpointer ChooseAKrabbyFromDeckText ; 0x0122 + textpointer ChooseDiscardEnergyCardFromOpponentText ; 0x0123 + textpointer ChooseAttackOpponentWillNotBeAbleToUseText ; 0x0124 textpointer Text0125 ; 0x0125 textpointer ChooseAnOddishFromDeckText ; 0x0126 textpointer ChooseAnOddishText ; 0x0127 - textpointer Text0128 ; 0x0128 + textpointer ChooseAKrabbyText ; 0x0128 textpointer Text0129 ; 0x0129 textpointer ChooseNidoranFromDeckText ; 0x012a textpointer ChooseNidoranText ; 0x012b @@ -323,13 +323,13 @@ TextOffsets:: ; 34000 (d:4000) textpointer NidoranMNidoranFText ; 0x013f textpointer OddishText ; 0x0140 textpointer BellsproutText ; 0x0141 - textpointer Text0142 ; 0x0142 + textpointer KrabbyText ; 0x0142 textpointer Text0143 ; 0x0143 textpointer Text0144 ; 0x0144 textpointer Text0145 ; 0x0145 textpointer Text0146 ; 0x0146 textpointer Text0147 ; 0x0147 - textpointer Text0148 ; 0x0148 + textpointer WasChosenForTheEffectOfAmnesiaText ; 0x0148 textpointer Text0149 ; 0x0149 textpointer WasUnsuccessfulText ; 0x014a textpointer ThereWasNoEffectFromTxRam2Text ; 0x014b diff --git a/src/wram.asm b/src/wram.asm index 8f30cf5c..f4c1c363 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -196,7 +196,14 @@ wPlayerArenaCardLastTurnDamage:: ; c2f3 wPlayerArenaCardLastTurnStatus:: ; c2f5 ds $1 - ds $a + ds $2 + +; stores an effect that was used on the Arena card last turn. +; see LAST_TURN_EFFECT_* constants. +wPlayerArenaCardLastTurnEffect:: ; c2f8 + ds $1 + + ds $7 wOpponentDuelVariables:: ; c300 @@ -336,7 +343,13 @@ wOpponentArenaCardLastTurnDamage:: ; c3f3 wOpponentArenaCardLastTurnStatus:: ; c3f5 ds $1 - ds $a + ds $2 + +; whether any attached energy card was discarded last turn (0 if not) +wOpponentArenaCardLastTurnEffect:: ; c2f8 + ds $1 + + ds $7 UNION From e6b82ee26eb8ed1ccf58718db1a9f6f5027e8200 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Fri, 15 May 2020 10:39:58 +0100 Subject: [PATCH 34/45] Fire attack effects --- src/data/effect_commands.asm | 132 ++--- src/engine/effect_functions.asm | 905 ++++++++++++++++++++++++++++++-- src/hram.asm | 10 + src/text/text1.asm | 2 +- src/text/text2.asm | 14 +- src/text/text_offsets.asm | 16 +- 6 files changed, 967 insertions(+), 112 deletions(-) diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 64f40985..168c482f 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -428,7 +428,7 @@ ShellderHideInShellEffectCommands: db $00 VaporeonQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, VaporeonQuickAttack_BoostEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, VaporeonQuickAttack_DamageBoostEffect dbw EFFECTCMDTYPE_AI, VaporeonQuickAttack_AIEffect db $00 @@ -550,117 +550,117 @@ VaporeonFocusEnergyEffectCommands: db $00 ArcanineFlamethrowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5363 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5371 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5379 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5375 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ArcanineFlamethrower_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ArcanineFlamethrower_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, ArcanineFlamethrower_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, ArcanineFlamethrower_AISelectEffect db $00 ArcanineTakeDownEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $537f + dbw EFFECTCMDTYPE_AFTER_DAMAGE, TakeDownEffect db $00 ArcanineQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $538d - dbw EFFECTCMDTYPE_AI, $5385 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ArcanineQuickAttack_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, ArcanineQuickAttack_AIEffect db $00 ArcanineFlamesOfRageEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $53a0 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $53ae - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $53ef - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $53de - dbw EFFECTCMDTYPE_UNKNOWN_08, $53d5 - dbw EFFECTCMDTYPE_AI, $53e9 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FlamesOfRage_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FlamesOfRage_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FlamesOfRage_DamageBoostEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, FlamesOfRage_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, FlamesOfRage_AISelectEffect + dbw EFFECTCMDTYPE_AI, FlamesOfRage_AIEffect db $00 RapidashStompEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5400 - dbw EFFECTCMDTYPE_AI, $53f8 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, RapidashStomp_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, RapidashStomp_AIEffect db $00 RapidashAgilityEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5413 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, RapidashAgilityEffect db $00 NinetailsLureEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5425 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $544f - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5430 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5449 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, NinetailsLure_CheckBench + dbw EFFECTCMDTYPE_AFTER_DAMAGE, NinetailsLure_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, NinetailsLure_PlayerSelectEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, NinetailsLure_AISelectEffect db $00 NinetailsFireBlastEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5463 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5471 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5479 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5475 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FireBlast_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FireBlast_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, FireBlast_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, FireBlast_AISelectEffect db $00 CharmanderEmberEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $547f - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $548d - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5495 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5491 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Ember_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Ember_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, Ember_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, Ember_AISelectEffect db $00 MoltresWildfireEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $549b - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $54a9 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $54f4 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $54e1 - dbw EFFECTCMDTYPE_UNKNOWN_08, $54dd + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Wildfire_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Wildfire_PlayerSelectEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Wildfire_DiscardDeckEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, Wildfire_DiscardEnergyEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, Wildfire_AISelectEffect db $00 Moltres1DiveBombEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $552b - dbw EFFECTCMDTYPE_AI, $5523 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres1DiveBomb_Failure50PercentEffect + dbw EFFECTCMDTYPE_AI, Moltres1DiveBomb_AIEffect db $00 FlareonQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5549 - dbw EFFECTCMDTYPE_AI, $5541 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FlareonQuickAttack_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, FlareonQuickAttack_AIEffect db $00 FlareonFlamethrowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $555c - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $556a - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5572 - dbw EFFECTCMDTYPE_UNKNOWN_08, $556e + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FlareonFlamethrower_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FlareonFlamethrower_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, FlareonFlamethrower_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, FlareonFlamethrower_AISelectEffect db $00 MagmarFlamethrowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5578 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5586 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $558e - dbw EFFECTCMDTYPE_UNKNOWN_08, $558a + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, MagmarFlamethrower_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, MagmarFlamethrower_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, MagmarFlamethrower_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, MagmarFlamethrower_AISelectEffect db $00 MagmarSmokescreenEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5594 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MagmarSmokescreenEffect db $00 MagmarSmogEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Poison50PercentEffect - dbw EFFECTCMDTYPE_AI, $559a + dbw EFFECTCMDTYPE_AI, MagmarSmog_AIEffect db $00 CharmeleonFlamethrowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $55a2 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $55b0 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $55b8 - dbw EFFECTCMDTYPE_UNKNOWN_08, $55b4 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, CharmeleonFlamethrower_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, CharmeleonFlamethrower_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, CharmeleonFlamethrower_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, CharmeleonFlamethrower_AISelectEffect db $00 CharizardEnergyBurnEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $55be + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergyBurnEffect db $00 CharizardFireSpinEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $55c0 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $55cd - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5614 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5606 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FireSpin_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FireSpin_PlayerSelectEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, FireSpin_DiscardEffect + dbw EFFECTCMDTYPE_UNKNOWN_08, FireSpin_AISelectEffect db $00 VulpixConfuseRayEffectCommands: @@ -668,27 +668,27 @@ VulpixConfuseRayEffectCommands: db $00 FlareonRageEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $563e - dbw EFFECTCMDTYPE_AI, $5638 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FlareonRage_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, FlareonRage_AIEffect db $00 NinetailsMixUpEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5647 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MixUpEffect db $00 NinetailsDancingEmbersEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $56ab - dbw EFFECTCMDTYPE_AI, $56a3 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DancingEmbers_MultiplierEffect + dbw EFFECTCMDTYPE_AI, DancingEmbers_AIEffect db $00 MoltresFiregiverEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $56c0 - dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, $56c2 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Firegiver_InitialEffect + dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, Firegiver_AddToHandEffect db $00 Moltres2DiveBombEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5776 - dbw EFFECTCMDTYPE_AI, $576e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres2DiveBomb_Failure50PercentEffect + dbw EFFECTCMDTYPE_AI, Moltres2DiveBomb_AIEffect db $00 AbraPsyshockEffectCommands: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 836b1b55..1c26b704 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -309,18 +309,38 @@ PickRandomPlayAreaCard: ; 2c17e (b:417e) ret ; 0x2c188 - INCROM $2c188, $2c199 +; outputs in hl the current position +; in the hTempDiscardEnergyCards list +; to place a new card. +GetPositionInDiscardList: ; 2c188 (b:4188) + push de + ld hl, hEffectItemSelection + ld a, [hl] + inc [hl] + ld e, a + ld d, $00 + ld hl, hTempDiscardEnergyCards + add hl, de + pop de + ret +; 0x2c197 + +; creates in wDuelTempList list of attached Fire Energy cards +; that are attached to the Turn Duelist's Arena card. +CreateListOfFireEnergyAttachedToArena: ; 2c197 (b:4197) + ld a, TYPE_ENERGY_FIRE + ; fallthrough ; creates in wDuelTempList a list of cards that ; are in the Arena that are the same type as input a. ; used to list are Energy cards of a specific type ; that are attached to the Arena Pokemon. ; input: -; a = CARD_DATA_TYPE constant +; a = TYPE_ENERGY_* constant ; output: ; a = number of cards in list; ; wDuelTempList filled with cards, terminated by $ff -CreateListOfEnergyAttachedToArenaOfType: ; 2c199 (b:4199) +CreateListOfEnergyAttachedToArena: ; 2c199 (b:4199) ld b, a ld c, 0 ld de, wDuelTempList @@ -1220,7 +1240,7 @@ PlayAreaSelectionMenuParameters: ; 2c6e0 (b:46e0) INCROM $2c6e8, $2c6f0 SpitPoison_AIEffect: ; 2c6f0 (b:46f0) - ld a, 5 + ld a, 10 / 2 lb de, 0, 10 jp StoreAIDamageInfo ; 0x2c6f8 @@ -1235,7 +1255,7 @@ SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8) call SetNoEffectFromStatus ret -; outputs in hTemp_ffa0 the result of the coin toss +; outputs in [hTemp_ffa0] the result of the coin toss ; (0 = tails, 1 = heads) and, in case it was heads, ; stores in hTempPlayAreaLocation_ffa1 the location ; of the Bench Pokemon that was selected for switch. @@ -1408,7 +1428,7 @@ ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) ; 0x2c7ed Twineedle_AIEffect: ; 2c7ed (b:47ed) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2c7f5 @@ -1665,7 +1685,7 @@ SetDamageToATimes20: ; 2c958 (b:4958) ret Thrash_AIEffect: ; 2c96b (b:496b) - ld a, 35 + ld a, (30 + 40) / 2 lb de, 30, 40 jp StoreAIDamageInfo ; 0x2c973 @@ -1728,7 +1748,7 @@ BoyfriendsEffect: ; 2c998 (b:4998) ; 0x2c9be NidoranFFurySwipes_AIEffect: ; 2c9be (b:49be) - ld a, 15 + ld a, 30 / 2 lb de, 0, 30 jp StoreAIDamageInfo ; 0x2c9c6 @@ -1860,7 +1880,7 @@ NidoranFCallForFamily_PutInPlayAreaEffect: ; 2ca6e (b:4a6e) ; 0x2ca8e HornHazard_AIEffect: ; 2ca8e (b:4a8e) - ld a, 15 + ld a, 30 / 2 lb de, 0, 30 jp StoreAIDamageInfo ; 0x2ca96 @@ -1886,7 +1906,7 @@ NidorinaSupersonicEffect: ; 2caac (b:4aac) ; 0x2cab3 NidorinaDoubleKick_AIEffect: ; 2cab3 (b:4ab3) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2cabb @@ -1906,7 +1926,7 @@ NidorinaDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) ; 0x2cad3 NidorinoDoubleKick_AIEffect: ; 2cad3 (b:4ad3) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2cadb @@ -2062,7 +2082,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) ret z ; a press - ldh [hTempPlayAreaLocation_ffa1], a + ldh [hAIPkmnPowerEffectParam], a ldh [hEffectItemSelection], a call CheckIfCardHasGrassEnergyAttached jr c, .play_sfx ; no Grass attached @@ -2072,14 +2092,14 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) ; temporarily take card away to draw Play Area call AddCardToHand bank1call PrintPlayAreaCardList_EnableLCD - ldh a, [hTempPlayAreaLocation_ffa1] + ldh a, [hAIPkmnPowerEffectParam] ld e, a ldh a, [hAIEnergyTransEnergyCard] ; give card back call PutHandCardInPlayArea ; draw Grass symbol near cursor - ldh a, [hTempPlayAreaLocation_ffa1] + ldh a, [hAIPkmnPowerEffectParam] ld b, SYM_GRASS call DrawSymbolOnPlayAreaCursor @@ -2104,7 +2124,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) call PutHandCardInPlayArea .remove_symbol - ldh a, [hTempPlayAreaLocation_ffa1] + ldh a, [hAIPkmnPowerEffectParam] ld b, SYM_SPACE call DrawSymbolOnPlayAreaCursor call EraseCursor @@ -2444,7 +2464,7 @@ Heal_OncePerTurnCheck: ; 2cda8 (b:4da8) Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) ldtx de, IfHeadsHealIsSuccessfulText call TossCoin_BankB - ldh [hTempPlayAreaLocation_ffa1], a + ldh [hAIPkmnPowerEffectParam], a jr nc, .done ld a, DUELVARS_DUELIST_TYPE @@ -2477,13 +2497,14 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) ; fallthrough .done +; flag Pkmn Power as being used regardless of coin outcome ldh a, [hTemp_ffa0] add DUELVARS_ARENA_CARD_FLAGS_C2 call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] - ldh a, [hTempPlayAreaLocation_ffa1] + ldh a, [hAIPkmnPowerEffectParam] or a - ret z + ret z ; return if coin was tails ldh a, [hHealPlayAreaLocationTarget] add DUELVARS_ARENA_CARD_HP @@ -2497,7 +2518,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) ; 0x2ce23 PetalDance_AIEffect: ; 2ce23 (b:4e23) - ld a, 60 + ld a, 120 / 2 lb de, 0, 120 jp StoreAIDamageInfo ; 0x2ce2b @@ -2670,7 +2691,7 @@ OmastarWaterGunEffect: ; 2cf05 (b:4f05) ; 0x2cf0a OmastarSpikeCannon_AIEffect: ; 2cf0a (b:4f0a) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2cf12 @@ -2860,7 +2881,7 @@ HeadacheEffect: ; 2d00e (b:500e) ; 0x2d016 PsyduckFurySwipes_AIEffect: ; 2d016 (b:5016) - ld a, 15 + ld a, 30 / 2 lb de, 0, 30 jp StoreAIDamageInfo ; 0x2d01e @@ -2968,12 +2989,12 @@ HideInShellEffect: ; 2d0a4 (b:50a4) ; 0x2d0b8 VaporeonQuickAttack_AIEffect: ; 2d0b8 (b:50b8) - ld a, 20 + ld a, (10 + 30) / 2 lb de, 10, 30 jp StoreAIDamageInfo ; 0x2d0c0 -VaporeonQuickAttack_BoostEffect: ; 2d0c0 (b:50c0) +VaporeonQuickAttack_DamageBoostEffect: ; 2d0c0 (b:50c0) ld hl, 20 call LoadTxRam3 ldtx de, DamageCheckIfHeadsPlusDamageText @@ -3006,7 +3027,7 @@ StarmieRecover_CheckEnergyHP: ; 2d0d9 (b:50d9) StarmieRecover_PlayerSelectEffect: ; 2d0f0 (b:50f0) ld a, TYPE_ENERGY_WATER - call CreateListOfEnergyAttachedToArenaOfType + call CreateListOfEnergyAttachedToArena xor a ; PLAY_AREA_ARENA bank1call DisplayEnergyDiscardScreen .loop_input @@ -3019,7 +3040,7 @@ StarmieRecover_PlayerSelectEffect: ; 2d0f0 (b:50f0) StarmieRecover_AISelectEffect: ; 2d103 (b:5103) ld a, TYPE_ENERGY_WATER - call CreateListOfEnergyAttachedToArenaOfType + call CreateListOfEnergyAttachedToArena ld a, [wDuelTempList] ; pick first card ldh [hTemp_ffa0], a ret @@ -3156,7 +3177,7 @@ ApplyAmnesiaToAttack: ; 2d18a (b:518a) ; 0x2d1c0 PoliwhirlDoubleslap_AIEffect: ; 2d1c0 (b:51c0) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2d1c8 @@ -3250,7 +3271,7 @@ ClampEffect: ; 2d22d (b:522d) ; 0x2d246 CloysterSpikeCannon_AIEffect: ; 2d246 (b:5246) - ld a, 30 + ld a, 60 / 2 lb de, 0, 60 jp StoreAIDamageInfo ; 0x2d24e @@ -3330,7 +3351,7 @@ Cowardice_PlayerSelectEffect: ; 2d2ae (b:52ae) bank1call HasAlivePokemonInBench bank1call OpenPlayAreaScreenForSelection ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a + ldh [hAIPkmnPowerEffectParam], a ret ; 0x2d2c3 @@ -3351,7 +3372,7 @@ Cowardice_RemoveFromPlayAreaEffect: ; 2d2c3 (b:52c3) ldh a, [hTemp_ffa0] or a jr nz, .skip_switch - ldh a, [hTempPlayAreaLocation_ffa1] + ldh a, [hAIPkmnPowerEffectParam] ld e, a call SwapArenaWithBenchPokemon @@ -3432,4 +3453,828 @@ FocusEnergyEffect: ; 2d33f (b:533f) ret ; 0x2d34b - INCROM $2d34b, $30000 +PlayerPickFireEnergyCardToDiscard: ; 2d34b (b:534b) + call CreateListOfFireEnergyAttachedToArena + xor a + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ldh a, [hTempCardIndex_ff98] + ldh [hTempDiscardEnergyCards], a + ret +; 0x2d35a + +AIPickFireEnergyCardToDiscard: ; 2d35a (b:535a) + call CreateListOfFireEnergyAttachedToArena + ld a, [wDuelTempList] + ldh [hTempDiscardEnergyCards], a ; pick first in list + ret +; 0x2d363 + +; returns carry if Arena card has no Fire Energy cards +ArcanineFlamethrower_CheckEnergy: ; 2d363 (b:5363) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies] + ldtx hl, NotEnoughFireEnergyText + cp 1 + ret +; 0x2d371 + +ArcanineFlamethrower_PlayerSelectEffect: ; 2d371 (b:5371) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d375 + +ArcanineFlamethrower_AISelectEffect: ; 2d375 (b:5375) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d379 + +ArcanineFlamethrower_DiscardEffect: ; 2d379 (b:5379) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d37f + +TakeDownEffect: ; 2d37f (b:537f) + ld a, 30 + call Func_1955 + ret +; 0x2d385 + +ArcanineQuickAttack_AIEffect: ; 2d385 (b:5385) + ld a, (10 + 30) / 2 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2d38d + +ArcanineQuickAttack_DamageBoostEffect: ; 2d38d (b:538d) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2d3a0 + +; return carry if has less than 2 Fire Energy cards +FlamesOfRage_CheckEnergy: ; 2d3a0 (b:53a0) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies] + ldtx hl, NotEnoughFireEnergyText + cp 2 + ret +; 0x2d3ae + +FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) + ldtx hl, ChooseAndDiscard2FireEnergyCardsText + call DrawWideTextBox_WaitForInput + + xor a + ldh [hEffectItemSelection], a + call CreateListOfFireEnergyAttachedToArena + xor a + bank1call DisplayEnergyDiscardScreen +.loop_input + bank1call HandleEnergyDiscardMenuInput + ret c + call GetPositionInDiscardList + ldh a, [hTempCardIndex_ff98] + ld [hl], a + call RemoveCardFromDuelTempList + ldh a, [hEffectItemSelection] + cp 2 + ret nc ; return when 2 have been chosen + bank1call DisplayEnergyDiscardMenu + jr .loop_input +; 0x2d3d5 + +FlamesOfRage_AISelectEffect: ; 2d3d5 (b:53d5) + call AIPickFireEnergyCardToDiscard + ld a, [wDuelTempList + 1] + ldh [hTempDiscardEnergyCards + 1], a + ret +; 0x2d3de + +FlamesOfRage_DiscardEffect: ; 2d3de (b:53de) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ldh a, [hTempDiscardEnergyCards + 1] + call PutCardInDiscardPile + ret +; 0x2d3e9 + +FlamesOfRage_AIEffect: ; 2d3e9 (b:53e9) + call FlamesOfRage_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2d3ef + +FlamesOfRage_DamageBoostEffect: ; 2d3ef (b:53ef) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + ret +; 0x2d3f8 + +RapidashStomp_AIEffect: ; 2d3f8 (b:53f8) + ld a, (20 + 30) / 2 + lb de, 20, 30 + jp StoreAIDamageInfo +; 0x2d400 + +RapidashStomp_DamageBoostEffect: ; 2d400 (b:5400) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 10 + call AddToDamage + ret +; 0x2d413 + +RapidashAgilityEffect: ; 2d413 (b:5413) + ldtx de, IfHeadsDoNotReceiveDamageOrEffectText + call TossCoin_BankB + ret nc ; return if tails + ld a, $52 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_AGILITY + call ApplySubstatus1ToDefendingCard + ret +; 0x2d425 + +; returns carry if Opponent has no Pokemon in bench +NinetailsLure_CheckBench: ; 2d425 (b:5425) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2d430 + +NinetailsLure_PlayerSelectEffect: ; 2d430 (b:5430) + ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2d449 + +NinetailsLure_AISelectEffect: ; 2d449 (b:5449) + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2d44f + +NinetailsLure_SwitchEffect: ; 2d44f (b:544f) + call SwapTurn + ldh a, [hTemp_ffa0] + ld e, a + call HandleNShieldAndTransparency + call nc, SwapArenaWithBenchPokemon + call SwapTurn + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2d463 + +; return carry if no Fire energy cards +FireBlast_CheckEnergy: ; 2d463 (b:5463) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d471 + +FireBlast_PlayerSelectEffect: ; 2d471 (b:5471) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d475 + +FireBlast_AISelectEffect: ; 2d475 (b:5475) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d479 + +FireBlast_DiscardEffect: ; 2d479 (b:5479) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d47f + +; return carry if no Fire energy cards +Ember_CheckEnergy: ; 2d47f (b:547f) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d48d + +Ember_PlayerSelectEffect: ; 2d48d (b:548d) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d491 + +Ember_AISelectEffect: ; 2d491 (b:5491) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d495 + +Ember_DiscardEffect: ; 2d495 (b:5495) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d49b + +; return carry if no Fire energy cards +Wildfire_CheckEnergy: ; 2d49b (b:549b) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d4a9 + +Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) + ldtx hl, DiscardOppDeckAsManyFireEnergyCardsText + call DrawWideTextBox_WaitForInput + + xor a + ldh [hEffectItemSelection], a + call CreateListOfFireEnergyAttachedToArena + xor a + bank1call DisplayEnergyDiscardScreen + +; show list to Player and for each card selected to discard, +; just increase a counter and store it. +; this will be the output used by Wildfire_DiscardEnergyEffect. + xor a + ld [wcbfa], a +.loop + ldh a, [hEffectItemSelection] + ld [wcbfb], a + bank1call HandleEnergyDiscardMenuInput + jr c, .done + ld hl, hEffectItemSelection + inc [hl] + call RemoveCardFromDuelTempList + jr c, .done + bank1call DisplayEnergyDiscardMenu + jr .loop + +.done +; return carry if no cards were discarded +; output the result in hTemp_ffa0 + ldh a, [hEffectItemSelection] + ldh [hTemp_ffa0], a + or a + ret nz + scf + ret +; 0x2d4dd + +Wildfire_AISelectEffect: ; 2d4dd (b:54dd) +; AI always chooses 0 cards to discard + xor a + ldh [hTempDiscardEnergyCards], a + ret +; 0x2d4e1 + +Wildfire_DiscardEnergyEffect: ; 2d4e1 (b:54e1) + call CreateListOfFireEnergyAttachedToArena + ldh a, [hTemp_ffa0] + or a + ret z ; no cards to discard + +; discard cards from wDuelTempList equal to the number +; of cards that were input in hTemp_ffa0. +; these are all the Fire Energy cards attached to Arena card +; so it will discard the cards in order, regardless +; of the actual order that was selected by Player. + ld c, a + ld hl, wDuelTempList +.loop_discard + ld a, [hli] + call PutCardInDiscardPile + dec c + jr nz, .loop_discard + ret +; 0x2d4f4 + +Wildfire_DiscardDeckEffect: ; 2d4f4 (b:54f4) + ldh a, [hTemp_ffa0] + ld c, a + ld b, $00 + call SwapTurn + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ld a, DECK_SIZE + sub [hl] + cp c + jr nc, .start_discard + ; only discard number of cards that are left in deck + ld c, a + +.start_discard + push bc + inc c + jr .check_remaining + +.loop + ; discard top card from deck + call DrawCardFromDeck + call nc, PutCardInDiscardPile +.check_remaining + dec c + jr nz, .loop + + pop hl + call LoadTxRam3 + ldtx hl, DiscardedCardsFromDeckText + call DrawWideTextBox_PrintText + call SwapTurn + ret +; 0x2d523 + +Moltres1DiveBomb_AIEffect: ; 2d523 (b:5523) + ld a, 80 / 2 + lb de, 0, 80 + jp StoreAIDamageInfo +; 0x2d52b + +Moltres1DiveBomb_Failure50PercentEffect: ; 2d52b (b:552b) + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + jr c, .heads +; tails + xor a + call StoreDamageInfo + call SetWasUnsuccessful + ret +.heads + ld a, $11 + ld [wLoadedMoveAnimation], a + ret +; 0x2d541 + +FlareonQuickAttack_AIEffect: ; 2d541 (b:5541) + ld a, (10 + 30) / 2 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2d549 + +FlareonQuickAttack_DamageBoostEffect: ; 2d549 (b:5549) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2d55c + +; return carry if no Fire Energy attached +FlareonFlamethrower_CheckEnergy: ; 2d55c (b:555c) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d56a + +FlareonFlamethrower_PlayerSelectEffect: ; 2d56a (b:556a) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d56e + +FlareonFlamethrower_AISelectEffect: ; 2d56e (b:556e) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d572 + +FlareonFlamethrower_DiscardEffect: ; 2d572 (b:5572) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d578 + +; return carry if no Fire Energy attached +MagmarFlamethrower_CheckEnergy: ; 2d578 (b:5578) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d586 + +MagmarFlamethrower_PlayerSelectEffect: ; 2d586 (b:5586) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d58a + +MagmarFlamethrower_AISelectEffect: ; 2d58a (b:558a) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d58e + +MagmarFlamethrower_DiscardEffect: ; 2d58e (b:558e) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d594 + +MagmarSmokescreenEffect: ; 2d594 (b:5594) + ld a, SUBSTATUS2_SMOKESCREEN + call ApplySubstatus2ToDefendingCard + ret +; 0x2d59a + +MagmarSmog_AIEffect: ; 2d59a (b:559a) + ld a, 5 + lb de, 0, 10 + jp StoreAIPoisonDamageInfo +; 0x2d5a2 + +; return carry if no Fire Energy attached +CharmeleonFlamethrower_CheckEnergy: ; 2d5a2 (b:55a2) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ldtx hl, NotEnoughFireEnergyText + ld a, [wAttachedEnergies] + cp 1 + ret +; 0x2d5b0 + +CharmeleonFlamethrower_PlayerSelectEffect: ; 2d5b0 (b:55b0) + call PlayerPickFireEnergyCardToDiscard + ret +; 0x2d5b4 + +CharmeleonFlamethrower_AISelectEffect: ; 2d5b4 (b:55b4) + call AIPickFireEnergyCardToDiscard + ret +; 0x2d5b8 + +CharmeleonFlamethrower_DiscardEffect: ; 2d5b8 (b:55b8) + ldh a, [hTempDiscardEnergyCards] + call PutCardInDiscardPile + ret +; 0x2d5be + +EnergyBurnEffect: ; 2d5be (b:55be) + scf + ret +; 0x2d5c0 + +; return carry if has less than 2 Fire Energy cards +FireSpin_CheckEnergy: ; 2d5c0 (b:55c0) + xor a ; PLAY_AREA_ARENA + call CreateArenaOrBenchEnergyCardList + call CountCardsInDuelTempList + ldtx hl, NotEnoughEnergyCardsText + cp 2 + ret +; 0x2d5cd + +FireSpin_PlayerSelectEffect: ; 2d5cd (b:55cd) + ldtx hl, ChooseAndDiscard2EnergyCardsText + call DrawWideTextBox_WaitForInput + + xor a + ldh [hEffectItemSelection], a + xor a + call CreateArenaOrBenchEnergyCardList + call SortCardsInDuelTempListByID + xor a + bank1call DisplayEnergyDiscardScreen + + ld a, 2 + ld [wcbfa], a +.loop_input + bank1call HandleEnergyDiscardMenuInput + ret c + call GetPositionInDiscardList + ldh a, [hTempCardIndex_ff98] + ld [hl], a + ld hl, wcbfb + inc [hl] + ldh a, [hEffectItemSelection] + cp 2 + jr nc, .done + ldh a, [hTempCardIndex_ff98] + call RemoveCardFromDuelTempList + bank1call DisplayEnergyDiscardMenu + jr .loop_input +.done +; return when 2 have been chosen + or a + ret +; 0x2d606 + +FireSpin_AISelectEffect: ; 2d606 (b:5606) + xor a ; PLAY_AREA_ARENA + call CreateArenaOrBenchEnergyCardList + ld hl, wDuelTempList + ld a, [hli] + ldh [hTempDiscardEnergyCards], a + ld a, [hl] + ldh [hTempDiscardEnergyCards + 1], a + ret +; 0x2d614 + +FireSpin_DiscardEffect: ; 2d614 (b:5614) + ld hl, hTempDiscardEnergyCards + ld a, [hli] + call PutCardInDiscardPile + ld a, [hli] + call PutCardInDiscardPile + ret +; 0x2d620 + +; returns carry if Pkmn Power cannot be used +; or if Arena card is not Charizard. +; this is unused. +EnergyBurnCheck_Unreferenced: ; 2d620 (b:5620) + xor a + bank1call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret c + ld a, DUELVARS_ARENA_CARD + push de + call GetTurnDuelistVariable + call GetCardIDFromDeckIndex + ld a, e + pop de + cp CHARIZARD + jr nz, .not_charizard + or a + ret +.not_charizard + scf + ret +; 0x2d638 + +FlareonRage_AIEffect: ; 2d638 (b:5638) + call FlareonRage_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2d63e + +FlareonRage_DamageBoostEffect: ; 2d63e (b:563e) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + ret +; 0x2d647 + +MixUpEffect: ; 2d647 (b:5647) + call SwapTurn + call CreateHandCardList + call SortCardsInDuelTempListByID + +; first go through Hand to place +; all Pkmn cards in it in the Deck. + ld hl, wDuelTempList + ld c, 0 +.loop_hand + ld a, [hl] + cp $ff + jr z, .done_hand + call .CheckIfCardIsPkmnCard + jr nc, .next_hand + ; found Pkmn card, place in deck + inc c + ld a, [hl] + call RemoveCardFromHand + call ReturnCardToDeck +.next_hand + inc hl + jr .loop_hand + +.done_hand + ld a, c + ldh [hEffectItemSelection], a + push bc + ldtx hl, ThePkmnCardsInHandAndDeckWereShuffledText + call DrawWideTextBox_WaitForInput + + call Func_2c0bd + call CreateDeckCardList + pop bc + ldh a, [hEffectItemSelection] + or a + jr z, .done ; if no cards were removed from Hand, return + +; c holds the number of cards that were placed in the Deck. +; now pick Pkmn cards from the Deck to place in Hand. + ld hl, wDuelTempList +.loop_deck + ld a, [hl] + call .CheckIfCardIsPkmnCard + jr nc, .next_deck + dec c + ld a, [hl] + call SearchCardInDeckAndAddToHand + call AddCardToHand +.next_deck + inc hl + ld a, c + or a + jr nz, .loop_deck +.done + call SwapTurn + ret +; 0x2d69a + +; returns carry if card index in a is Pkmn card +.CheckIfCardIsPkmnCard: ; 2d69a (b:569a) + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + ret +; 0x2d6a3 + +DancingEmbers_AIEffect: ; 2d6a3 (b:56a3) + ld a, 80 / 2 + lb de, 0, 80 + jp StoreAIDamageInfo +; 0x2d6ab + +DancingEmbers_MultiplierEffect: ; 2d6ab (b:56ab) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 8 + call TossCoinATimes_BankB + call ATimes10 + call StoreDamageInfo + ret +; 0x2d6c0 + +Firegiver_InitialEffect: ; 2d6c0 (b:56c0) + scf + ret +; 0x2d6c2 + +Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) +; fill wDuelTempList with all Fire Energy card +; deck indices that are in the Deck. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable + ld de, wDuelTempList + ld c, 0 +.loop_cards + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + push hl + push de + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + pop de + pop hl + cp TYPE_ENERGY_FIRE + jr nz, .next + ld a, l + ld [de], a + inc de + inc c +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_cards + ld a, $ff + ld [de], a + +; check how many were found + ld a, c + or a + jr nz, .found + ; return if none found + ldtx hl, ThereWasNoFireEnergyText + call DrawWideTextBox_WaitForInput + call Func_2c0bd + ret + +.found +; pick a random number between 1 and 4, +; up to the maximum number of Fire Energy +; cards that were found. + ld a, 4 + call Random + inc a + cp c + jr c, .ok + ld a, c + +.ok + ldh [hEffectItemSelection], a +; load correct Move animation depending +; on what side the effect is from. + ld d, $84 + ld a, [wDuelistType] + cp DUELIST_TYPE_PLAYER + jr z, .player_1 +; non-player + ld d, $85 +.player_1 + ld a, d + ld [wLoadedMoveAnimation], a + +; start loop for adding Energy cards to hand + ldh a, [hEffectItemSelection] + ld c, a + ld hl, wDuelTempList +.loop_energy + push hl + push bc + ld bc, $0 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + +; load correct coordinates to update the number of cards +; in hand and deck during animation. + lb bc, 18, 7 ; x, y for hand number + ld e, 3 ; y for deck number + ld a, [wLoadedMoveAnimation] + cp $84 + jr z, .player_2 + lb bc, 4, 5 ; x, y for hand number + ld e, 10 ; y for deck number + +.player_2 +; update and print number of cards in hand + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + inc a + bank1call WriteTwoDigitNumberInTxSymbolFormat +; update and print number of cards in deck + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ld a, DECK_SIZE - 1 + sub [hl] + ld c, e + bank1call WriteTwoDigitNumberInTxSymbolFormat + +; load Fire Energy card index and add to hand + pop bc + pop hl + ld a, [hli] + call SearchCardInDeckAndAddToHand + call AddCardToHand + dec c + jr nz, .loop_energy + +; load the number of cards added to hand and print text + ldh a, [hEffectItemSelection] + ld l, a + ld h, $00 + call LoadTxRam3 + ldtx hl, DrewFireEnergyFromTheHandText + call DrawWideTextBox_WaitForInput + call Func_2c0bd + ret +; 0x2d76e + +Moltres2DiveBomb_AIEffect: ; 2d76e (b:576e) + ld a, 70 / 2 + lb de, 0, 70 + jp StoreAIDamageInfo +; 0x2d776 + +Moltres2DiveBomb_Failure50PercentEffect: ; 2d776 (b:5776) + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + jr c, .heads +; tails + xor a + call StoreDamageInfo + call SetWasUnsuccessful + ret +.heads + ld a, $11 + ld [wLoadedMoveAnimation], a + ret +; 0x2d78c + + INCROM $2d78c, $30000 diff --git a/src/hram.asm b/src/hram.asm index ccd9c7d0..16126a78 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -77,6 +77,14 @@ hOppActionTableIndex:: ; ff9e hTempCardIndex_ff9f:: ; ff9f ds $1 +UNION + +; list of cards chosen to be discarded for attack effect +hTempDiscardEnergyCards:: ; ffa0 + ds $2 + +NEXTU + ; multipurpose temp storage (card's deck index, selected move index, status condition...) hTemp_ffa0:: ; ffa0 ds $1 @@ -87,6 +95,8 @@ hTempPlayAreaLocation_ffa1:: ; ffa1 hAIPkmnPowerEffectParam:: ; ffa1 ds $1 +ENDU + UNION ; $ff-terminated list of cards to be discarded upon retreat diff --git a/src/text/text1.asm b/src/text/text1.asm index 79ed84e2..ab5a0fb0 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -906,7 +906,7 @@ NotEnoughEnergyCardsText: ; 37781 (d:7781) text "Not enough Energy cards." done -Text00c1: ; 3779b (d:779b) +NotEnoughFireEnergyText: ; 3779b (d:779b) text "Not enough Fire Energy." done diff --git a/src/text/text2.asm b/src/text/text2.asm index 0406103f..f5686db1 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -207,17 +207,17 @@ Text011e: ; 3882e (e:482e) line "1 Fire Energy card." done -Text011f: ; 38856 (e:4856) +ChooseAndDiscard2FireEnergyCardsText: ; 38856 (e:4856) text "Choose and Discard" line "2 Fire Energy cards." done -Text0120: ; 3887f (e:487f) +DiscardOppDeckAsManyFireEnergyCardsText: ; 3887f (e:487f) text "Discard from opponent's Deck as many" line "Fire Energy cards as were discarded." done -Text0121: ; 388ca (e:48ca) +ChooseAndDiscard2EnergyCardsText: ; 388ca (e:48ca) text "Choose and Discard" line "2 Energy cards." done @@ -488,12 +488,12 @@ Text014c: ; 3941c (e:541c) line "Play Area was moved." done -Text014d: ; 3944b (e:544b) +DrewFireEnergyFromTheHandText: ; 3944b (e:544b) text " drew" line " Fire Energy from the Hand." done -Text014e: ; 39470 (e:5470) +ThePkmnCardsInHandAndDeckWereShuffledText: ; 39470 (e:5470) text "The Pokémon cards in 's" line "Hand and Deck were shuffled" done @@ -679,7 +679,7 @@ Text0173: ; 39a9c (e:5a9c) line "to Discard." done -Text0174: ; 39ab9 (e:5ab9) +DiscardedCardsFromDeckText: ; 39ab9 (e:5ab9) text "Discarded cards" line "from 's Deck." done @@ -713,7 +713,7 @@ Text017a: ; 39b46 (e:5b46) line "to !" done -Text017b: ; 39b58 (e:5b58) +ThereWasNoFireEnergyText: ; 39b58 (e:5b58) text "There was no Fire Energy." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index a91e656f..29cc0ca4 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -194,7 +194,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00be ; 0x00be textpointer EnergyCardsRequiredToRetreatText ; 0x00bf textpointer NotEnoughEnergyCardsText ; 0x00c0 - textpointer Text00c1 ; 0x00c1 + textpointer NotEnoughFireEnergyText ; 0x00c1 textpointer Text00c2 ; 0x00c2 textpointer NotEnoughWaterEnergyText ; 0x00c3 textpointer Text00c4 ; 0x00c4 @@ -288,9 +288,9 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text011c ; 0x011c textpointer Text011d ; 0x011d textpointer Text011e ; 0x011e - textpointer Text011f ; 0x011f - textpointer Text0120 ; 0x0120 - textpointer Text0121 ; 0x0121 + textpointer ChooseAndDiscard2FireEnergyCardsText ; 0x011f + textpointer DiscardOppDeckAsManyFireEnergyCardsText ; 0x0120 + textpointer ChooseAndDiscard2EnergyCardsText ; 0x0121 textpointer ChooseAKrabbyFromDeckText ; 0x0122 textpointer ChooseDiscardEnergyCardFromOpponentText ; 0x0123 textpointer ChooseAttackOpponentWillNotBeAbleToUseText ; 0x0124 @@ -334,8 +334,8 @@ TextOffsets:: ; 34000 (d:4000) textpointer WasUnsuccessfulText ; 0x014a textpointer ThereWasNoEffectFromTxRam2Text ; 0x014b textpointer Text014c ; 0x014c - textpointer Text014d ; 0x014d - textpointer Text014e ; 0x014e + textpointer DrewFireEnergyFromTheHandText ; 0x014d + textpointer ThePkmnCardsInHandAndDeckWereShuffledText ; 0x014e textpointer Text014f ; 0x014f textpointer Text0150 ; 0x0150 textpointer Text0151 ; 0x0151 @@ -373,14 +373,14 @@ TextOffsets:: ; 34000 (d:4000) textpointer YouReceivedTheseCardsText ; 0x0171 textpointer Text0172 ; 0x0172 textpointer Text0173 ; 0x0173 - textpointer Text0174 ; 0x0174 + textpointer DiscardedCardsFromDeckText ; 0x0174 textpointer Text0175 ; 0x0175 textpointer Text0176 ; 0x0176 textpointer Text0177 ; 0x0177 textpointer Text0178 ; 0x0178 textpointer Text0179 ; 0x0179 textpointer Text017a ; 0x017a - textpointer Text017b ; 0x017b + textpointer ThereWasNoFireEnergyText ; 0x017b textpointer Text017c ; 0x017c textpointer Text017d ; 0x017d textpointer ThereWasNoEffectFromToxicText ; 0x017e From b75d9712271fc49b7c3f83fc65c4b260624af386 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Wed, 3 Jun 2020 00:06:25 +0100 Subject: [PATCH 35/45] Psychic attack effects --- src/constants/duel_constants.asm | 2 +- src/data/effect_commands.asm | 230 ++-- src/engine/bank01.asm | 15 +- src/engine/bank05.asm | 2 +- src/engine/bank06.asm | 2 +- src/engine/effect_functions.asm | 1957 +++++++++++++++++++++++++++++- src/engine/home.asm | 5 +- src/hram.asm | 20 +- src/text/text1.asm | 14 +- src/text/text2.asm | 32 +- src/text/text_offsets.asm | 46 +- src/wram.asm | 15 +- 12 files changed, 2115 insertions(+), 225 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index dce9540f..028cc10f 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -189,7 +189,7 @@ EFFECTCMDTYPE_AFTER_DAMAGE EQU $04 EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN EQU $0a EFFECTCMDTYPE_PKMN_POWER_TRIGGER EQU $07 EFFECTCMDTYPE_AI EQU $09 -EFFECTCMDTYPE_UNKNOWN_08 EQU $08 +EFFECTCMDTYPE_AI_SELECTION EQU $08 ; wDamageEffectiveness constants WEAKNESS EQU 1 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 168c482f..c5c97357 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -17,7 +17,7 @@ EffectCommands: ; 186f7 (6:46f7) ; - EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN: For moves that may result in the defending Pokemon being switched out ; - EFFECTCMDTYPE_PKMN_POWER_TRIGGER: Pokemon Power effects that trigger the moment the Pokemon card is played ; - EFFECTCMDTYPE_AI: Used for AI scoring -; - EFFECTCMDTYPE_UNKNOWN_08: Unknown +; - EFFECTCMDTYPE_AI_SELECTION: Routines for determining AI selection that are required ; Similar move effects of different Pokemon cards all point to a different command list, ; even though in some cases their commands and function pointers match. @@ -61,7 +61,7 @@ VictreebelLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, VictreebelLure_CheckBench dbw EFFECTCMDTYPE_AFTER_DAMAGE, VictreebelLure_SwitchEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, VictreebelLure_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, VictreebelLure_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, VictreebelLure_AISelectEffect db $00 VictreebelAcidEffectCommands: @@ -157,14 +157,14 @@ OddishSproutEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Sprout_CheckDeckAndPlayArea dbw EFFECTCMDTYPE_AFTER_DAMAGE, Sprout_PutInPlayAreaEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Sprout_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, Sprout_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Sprout_AISelectEffect db $00 ExeggutorTeleportEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Teleport_CheckBench dbw EFFECTCMDTYPE_AFTER_DAMAGE, Teleport_SwitchEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Teleport_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, Teleport_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Teleport_AISelectEffect db $00 ExeggutorBigEggsplosionEffectCommands: @@ -196,7 +196,7 @@ NidoranFCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, NidoranFCallForFamily_CheckDeckAndPlayArea dbw EFFECTCMDTYPE_AFTER_DAMAGE, NidoranFCallForFamily_PutInPlayAreaEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, NidoranFCallForFamily_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, NidoranFCallForFamily_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, NidoranFCallForFamily_AISelectEffect db $00 NidoranMHornHazardEffectCommands: @@ -278,7 +278,7 @@ BellsproutCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, BellsproutCallForFamily_CheckDeckAndPlayArea dbw EFFECTCMDTYPE_AFTER_DAMAGE, BellsproutCallForFamily_PutInPlayAreaEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, BellsproutCallForFamily_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, BellsproutCallForFamily_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, BellsproutCallForFamily_AISelectEffect db $00 WeezingSmogEffectCommands: @@ -383,7 +383,7 @@ KrabbyCallForFamilyEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, KrabbyCallForFamily_CheckDeckAndPlayArea dbw EFFECTCMDTYPE_AFTER_DAMAGE, KrabbyCallForFamily_PutInPlayAreaEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, KrabbyCallForFamily_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, KrabbyCallForFamily_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, KrabbyCallForFamily_AISelectEffect db $00 MagikarpFlailEffectCommands: @@ -407,7 +407,7 @@ GolduckPsyshockEffectCommands: GolduckHyperBeamEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, GolduckHyperBeam_DiscardEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, GolduckHyperBeam_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, GolduckHyperBeam_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, GolduckHyperBeam_AISelectEffect db $00 SeadraWaterGunEffectCommands: @@ -446,7 +446,7 @@ StarmieRecoverEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, StarmieRecover_PlayerSelectEffect dbw EFFECTCMDTYPE_AFTER_DAMAGE, StarmieRecover_HPRecoveryEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, StarmieRecover_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, StarmieRecover_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, StarmieRecover_AISelectEffect db $00 StarmieStarFreezeEffectCommands: @@ -478,7 +478,7 @@ PoliwhirlAmnesiaEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PoliwhirlAmnesia_CheckAttacks dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PoliwhirlAmnesia_PlayerSelectEffect dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PoliwhirlAmnesia_DisableEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, PoliwhirlAmnesia_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, PoliwhirlAmnesia_AISelectEffect db $00 PoliwhirlDoubleslapEffectCommands: @@ -494,7 +494,7 @@ PoliwrathWaterGunEffectCommands: PoliwrathWhirlpoolEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, Whirlpool_DiscardEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Whirlpool_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, Whirlpool_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Whirlpool_AISelectEffect db $00 PoliwagWaterGunEffectCommands: @@ -553,7 +553,7 @@ ArcanineFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ArcanineFlamethrower_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ArcanineFlamethrower_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, ArcanineFlamethrower_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, ArcanineFlamethrower_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, ArcanineFlamethrower_AISelectEffect db $00 ArcanineTakeDownEffectCommands: @@ -570,7 +570,7 @@ ArcanineFlamesOfRageEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FlamesOfRage_PlayerSelectEffect dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FlamesOfRage_DamageBoostEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, FlamesOfRage_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, FlamesOfRage_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, FlamesOfRage_AISelectEffect dbw EFFECTCMDTYPE_AI, FlamesOfRage_AIEffect db $00 @@ -587,21 +587,21 @@ NinetailsLureEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, NinetailsLure_CheckBench dbw EFFECTCMDTYPE_AFTER_DAMAGE, NinetailsLure_SwitchEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, NinetailsLure_PlayerSelectEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, NinetailsLure_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, NinetailsLure_AISelectEffect db $00 NinetailsFireBlastEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FireBlast_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FireBlast_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, FireBlast_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, FireBlast_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, FireBlast_AISelectEffect db $00 CharmanderEmberEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Ember_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Ember_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, Ember_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, Ember_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Ember_AISelectEffect db $00 MoltresWildfireEffectCommands: @@ -609,7 +609,7 @@ MoltresWildfireEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Wildfire_PlayerSelectEffect dbw EFFECTCMDTYPE_AFTER_DAMAGE, Wildfire_DiscardDeckEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, Wildfire_DiscardEnergyEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, Wildfire_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Wildfire_AISelectEffect db $00 Moltres1DiveBombEffectCommands: @@ -626,14 +626,14 @@ FlareonFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FlareonFlamethrower_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FlareonFlamethrower_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, FlareonFlamethrower_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, FlareonFlamethrower_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, FlareonFlamethrower_AISelectEffect db $00 MagmarFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, MagmarFlamethrower_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, MagmarFlamethrower_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, MagmarFlamethrower_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, MagmarFlamethrower_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, MagmarFlamethrower_AISelectEffect db $00 MagmarSmokescreenEffectCommands: @@ -649,7 +649,7 @@ CharmeleonFlamethrowerEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, CharmeleonFlamethrower_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, CharmeleonFlamethrower_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, CharmeleonFlamethrower_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, CharmeleonFlamethrower_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, CharmeleonFlamethrower_AISelectEffect db $00 CharizardEnergyBurnEffectCommands: @@ -660,7 +660,7 @@ CharizardFireSpinEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FireSpin_CheckEnergy dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, FireSpin_PlayerSelectEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, FireSpin_DiscardEffect - dbw EFFECTCMDTYPE_UNKNOWN_08, FireSpin_AISelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, FireSpin_AISelectEffect db $00 VulpixConfuseRayEffectCommands: @@ -696,27 +696,27 @@ AbraPsyshockEffectCommands: db $00 GengarCurseEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $57fc - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $58bb - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5834 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Curse_CheckDamageAndBench + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Curse_TransferDamageEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Curse_PlayerSelectEffect db $00 GengarDarkMindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $593c - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5903 - dbw EFFECTCMDTYPE_UNKNOWN_08, $592a + dbw EFFECTCMDTYPE_AFTER_DAMAGE, GengarDarkMind_DamageBenchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, GengarDarkMind_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, GengarDarkMind_AISelectEffect db $00 GastlySleepingGasEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $594f + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SleepingGasEffect db $00 GastlyDestinyBondEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5956 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5964 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5987 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5981 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5976 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, DestinyBond_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, DestinyBond_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DestinyBond_DestinyBondEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, DestinyBond_DiscardEffect + dbw EFFECTCMDTYPE_AI_SELECTION, DestinyBond_AISelectEffect db $00 GastlyLickEffectCommands: @@ -724,10 +724,10 @@ GastlyLickEffectCommands: db $00 GastlyEnergyConversionEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $598d - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $59b4 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5994 - dbw EFFECTCMDTYPE_UNKNOWN_08, $599b + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergyConversion_CheckEnergy + dbw EFFECTCMDTYPE_AFTER_DAMAGE, EnergyConversion_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, EnergyConversion_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, EnergyConversion_AISelectEffect db $00 HaunterHypnosisEffectCommands: @@ -735,11 +735,11 @@ HaunterHypnosisEffectCommands: db $00 HaunterDreamEaterEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $59d6 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, DreamEaterEffect db $00 HaunterTransparencyEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $59e5 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, TransparencyEffect db $00 HaunterNightmareEffectCommands: @@ -747,16 +747,16 @@ HaunterNightmareEffectCommands: db $00 HypnoProphecyEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $59e7 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5a41 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5a00 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5a3c + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Prophecy_CheckDeck + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Prophecy_ReorderDeckEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Prophecy_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Prophecy_AISelectEffect db $00 HypnoDarkMindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5b64 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5b2b - dbw EFFECTCMDTYPE_UNKNOWN_08, $5b52 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, HypnoDarkMind_DamageBenchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, HypnoDarkMind_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, HypnoDarkMind_AISelectEffect db $00 DrowzeeConfuseRayEffectCommands: @@ -764,18 +764,18 @@ DrowzeeConfuseRayEffectCommands: db $00 MrMimeInvisibleWallEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5b77 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, InvisibleWallEffect db $00 MrMimeMeditateEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5b7f - dbw EFFECTCMDTYPE_AI, $5b79 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MrMimeMeditate_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, MrMimeMeditate_AIEffect db $00 AlakazamDamageSwapEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5b8e - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5ba2 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5c27 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, DamageSwap_CheckDamage + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DamageSwap_SelectAndSwapEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, DamageSwap_SwapEffect db $00 AlakazamConfuseRayEffectCommands: @@ -783,19 +783,19 @@ AlakazamConfuseRayEffectCommands: db $00 MewPsywaveEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5c49 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PsywaveEffect db $00 MewDevolutionBeamEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5c53 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5c64 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5cb6 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5cbb - dbw EFFECTCMDTYPE_UNKNOWN_08, $5c9e + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, DevolutionBeam_CheckPlayArea + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, DevolutionBeam_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DevolutionBeam_LoadAnimation + dbw EFFECTCMDTYPE_AFTER_DAMAGE, DevolutionBeam_DevolveEffect + dbw EFFECTCMDTYPE_AI_SELECTION, DevolutionBeam_AISelectEffect db $00 MewNeutralizingShieldEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5d79 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, NeutralizingShieldEffect db $00 MewPsyshockEffectCommands: @@ -803,36 +803,36 @@ MewPsyshockEffectCommands: db $00 MewtwoPsychicEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5d81 - dbw EFFECTCMDTYPE_AI, $5d7b + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Psychic_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, Psychic_AIEffect db $00 MewtwoBarrierEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5d8e - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5d9c - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5dbf - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5db9 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5dae + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Barrier_CheckEnergy + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Barrier_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Barrier_BarrierEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, Barrier_DiscardEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Barrier_AISelectEffect db $00 Mewtwo3EnergyAbsorptionEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5dc5 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5dec - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5dcc - dbw EFFECTCMDTYPE_UNKNOWN_08, $5dd3 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Mewtwo3EnergyAbsorption_CheckDiscardPile + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Mewtwo3EnergyAbsorption_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Mewtwo3EnergyAbsorption_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Mewtwo3EnergyAbsorption_AISelectEffect db $00 Mewtwo2EnergyAbsorptionEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5dff - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5e26 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5e06 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5e0d + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Mewtwo2EnergyAbsorption_CheckDiscardPile + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Mewtwo2EnergyAbsorption_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Mewtwo2EnergyAbsorption_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Mewtwo2EnergyAbsorption_AISelectEffect db $00 SlowbroStrangeBehaviorEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5e39 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5e5b - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5eb3 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, StrangeBehavior_CheckDamage + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, StrangeBehavior_SelectAndSwapEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, StrangeBehavior_SwapEffect db $00 SlowbroPsyshockEffectCommands: @@ -840,49 +840,49 @@ SlowbroPsyshockEffectCommands: db $00 SlowpokeSpacingOutEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5ed5 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5ee0 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5ef1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SpacingOut_CheckDamage + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SpacingOut_Failure50PercentEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, SpacingOut_HealEffect db $00 SlowpokeScavengeEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5f05 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5f1a - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5f5f - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $5f46 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5f40 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5f2d + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Scavenge_CheckDiscardPile + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Scavenge_PlayerSelectEnergyEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Scavenge_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Scavenge_PlayerSelectTrainerEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, Scavenge_DiscardEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Scavenge_AISelectEffect db $00 SlowpokeAmnesiaEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5f74 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5f7b - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5f85 - dbw EFFECTCMDTYPE_UNKNOWN_08, $5f7f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SlowpokeAmnesia_CheckAttacks + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, SlowpokeAmnesia_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SlowpokeAmnesia_DisableEffect + dbw EFFECTCMDTYPE_AI_SELECTION, SlowpokeAmnesia_AISelectEffect db $00 KadabraRecoverEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $5f89 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $5fa0 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $5fc3 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $5fbd - dbw EFFECTCMDTYPE_UNKNOWN_08, $5fb2 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, KadabraRecover_CheckEnergyHP + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, KadabraRecover_PlayerSelectEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, KadabraRecover_HPRecoveryEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, KadabraRecover_DiscardEffect + dbw EFFECTCMDTYPE_AI_SELECTION, KadabraRecover_AISelectEffect db $00 JynxDoubleslapEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5fd7 - dbw EFFECTCMDTYPE_AI, $5fcf + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, JynxDoubleslap_MultiplierEffect + dbw EFFECTCMDTYPE_AI, JynxDoubleslap_AIEffect db $00 JynxMeditateEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $5ff2 - dbw EFFECTCMDTYPE_AI, $5fec + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, JynxMeditate_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, JynxMeditate_AIEffect db $00 MewMysteryAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6009 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $603e - dbw EFFECTCMDTYPE_AI, $6001 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MysteryAttack_RandomEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MysteryAttack_RecoverEffect + dbw EFFECTCMDTYPE_AI, MysteryAttack_AIEffect db $00 GeodudeStoneBarrageEffectCommands: @@ -933,7 +933,7 @@ MarowakCallforFriendEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6100 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6194 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6110 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6177 + dbw EFFECTCMDTYPE_AI_SELECTION, $6177 db $00 MachokeKarateChopEffectCommands: @@ -967,7 +967,7 @@ HitmonleeStretchKickEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6231 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $625b dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $623c - dbw EFFECTCMDTYPE_UNKNOWN_08, $6255 + dbw EFFECTCMDTYPE_AI_SELECTION, $6255 db $00 SandshrewSandAttackEffectCommands: @@ -1068,7 +1068,7 @@ PikachuThunderJoltEffectCommands: PikachuSparkEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6574 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6539 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6562 + dbw EFFECTCMDTYPE_AI_SELECTION, $6562 db $00 Pikachu3GrowlEffectCommands: @@ -1103,7 +1103,7 @@ RaichuThunderEffectCommands: RaichuGigashockEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $671f dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $660d - dbw EFFECTCMDTYPE_UNKNOWN_08, $66c3 + dbw EFFECTCMDTYPE_AI_SELECTION, $66c3 db $00 MagnetonThunderWaveEffectCommands: @@ -1147,7 +1147,7 @@ ElectrodeEnergySpikeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6877 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $68f6 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $687b - dbw EFFECTCMDTYPE_UNKNOWN_08, $68f1 + dbw EFFECTCMDTYPE_AI_SELECTION, $68f1 db $00 JolteonDoubleKickEffectCommands: @@ -1174,7 +1174,7 @@ SpearowMirrorMoveEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6987 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6989 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6983 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6985 + dbw EFFECTCMDTYPE_AI_SELECTION, $6985 dbw EFFECTCMDTYPE_AI, $697d db $00 @@ -1252,13 +1252,13 @@ DragonairSlamEffectCommands: DragonairHyperBeamEffectCommands: dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6c35 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6c2c - dbw EFFECTCMDTYPE_UNKNOWN_08, $6c2f + dbw EFFECTCMDTYPE_AI_SELECTION, $6c2f db $00 ClefableMetronomeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6c77 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6c82 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6c7e + dbw EFFECTCMDTYPE_AI_SELECTION, $6c7e db $00 ClefableMinimizeEffectCommands: @@ -1281,7 +1281,7 @@ PidgeottoMirrorMoveEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6cfe dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6d01 dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6cf8 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6cfb + dbw EFFECTCMDTYPE_AI_SELECTION, $6cfb dbw EFFECTCMDTYPE_AI, $6cef db $00 @@ -1292,7 +1292,7 @@ ClefairySingEffectCommands: ClefairyMetronomeEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6d0b dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6d16 - dbw EFFECTCMDTYPE_UNKNOWN_08, $6d12 + dbw EFFECTCMDTYPE_AI_SELECTION, $6d12 db $00 WigglytuffLullabyEffectCommands: @@ -1339,14 +1339,14 @@ PorygonConversion1EffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6dd5 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6ded dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6dfb - dbw EFFECTCMDTYPE_UNKNOWN_08, $6df7 + dbw EFFECTCMDTYPE_AI_SELECTION, $6df7 db $00 PorygonConversion2EffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6e1f dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6e31 dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6e5e - dbw EFFECTCMDTYPE_UNKNOWN_08, $6e3c + dbw EFFECTCMDTYPE_AI_SELECTION, $6e3c db $00 ChanseyScrunchEffectCommands: @@ -1439,7 +1439,7 @@ EnergyRemovalEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7252 dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $725f dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7273 - dbw EFFECTCMDTYPE_UNKNOWN_08, $726f + dbw EFFECTCMDTYPE_AI_SELECTION, $726f db $00 EnergyRetrievalEffectCommands: diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 83db5a4b..f66a4ab6 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -3481,7 +3481,7 @@ CardListFunction: ; 5719 (1:5719) Func_5735: ; 5735 (1:5735) ld hl, wcbd8 - ld de, Func_574a + ld de, PrintSortNumberInCardList ld [hl], e inc hl ld [hl], d @@ -3493,7 +3493,11 @@ Func_5744: ; 5744 (1:5744) ld hl, wcbd8 jp CallIndirect -Func_574a: ; 574a (1:574a) +; goes through list in wDuelTempList + 10 +; and prints the number stored in each entry +; beside the corresponding card in screen. +; used in lists for reordering cards in the Deck. +PrintSortNumberInCardList: ; 574a (1:574a) lb bc, 1, 2 ld hl, wDuelTempList + 10 .next @@ -3502,7 +3506,7 @@ Func_574a: ; 574a (1:574a) jr z, .done or a ; SYM_SPACE jr z, .space - add SYM_0 + add SYM_0 ; load number symbol .space call WriteByteToBGMap0 ; move two lines down @@ -3606,7 +3610,10 @@ DisplayCardPageOnLeftOrRightPressed: ; 57cd (1:57cd) call c, DisplayCardPage ret -Func_57df: ; 57df (1:57df) +; draws text box that covers the whole screen +; and prints the text ID in hl, then +; waits for Player input. +DrawWholeScreenTextBox: ; 57df (1:57df) push hl call EmptyScreen lb de, 0, 0 diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 01af5413..708bfd93 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -6414,7 +6414,7 @@ AISelectSpecialAttackParameters: ; 17161 (5:7161) ld a, CARD_LOCATION_DISCARD_PILE call CheckIfAnyCardIDinLocation ldh [hTemp_ffa0], a - farcall CreateEnergyCardListFromOpponentDiscardPile + farcall CreateEnergyCardListFromDiscardPile_OnlyBasic ; find any energy card different from ; the one found by CheckIfAnyCardIDinLocation. diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 78336759..ef8b6995 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -1677,7 +1677,7 @@ Func_1a6cd: ; 1a6cd (6:66cd) lb de, $38, $9f call SetupText ld hl, $00a3 - bank1call Func_57df + bank1call DrawWholeScreenTextBox ld a, $0a ld [$0000], a xor a diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 1c26b704..eccf79f3 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -29,6 +29,7 @@ ConfusionEffect: ; 2c024 (b:4024) lb bc, PSN_DBLPSN, CONFUSED jr ApplyStatusEffect +Sleep50PercentEffect: ; 2c029 (b:4029) ldtx de, SleepCheckText call TossCoin_BankB ret nc @@ -310,16 +311,15 @@ PickRandomPlayAreaCard: ; 2c17e (b:417e) ; 0x2c188 ; outputs in hl the current position -; in the hTempDiscardEnergyCards list -; to place a new card. -GetPositionInDiscardList: ; 2c188 (b:4188) +; in hTempCardList list to place a new card. +GetCurPositionInTempList: ; 2c188 (b:4188) push de ld hl, hEffectItemSelection ld a, [hl] inc [hl] ld e, a ld d, $00 - ld hl, hTempDiscardEnergyCards + ld hl, hTempCardList add hl, de pop de ret @@ -373,7 +373,39 @@ CreateListOfEnergyAttachedToArena: ; 2c199 (b:4199) ret ; 0x2c1c4 - INCROM $2c1c4, $2c1ec +; prints the text " devolved to !" with +; the proper card names and levels. +; input: +; d = deck index of the lower stage card +; e = deck index of card that was devolved +PrintDevolvedCardNameAndLevelText: ; 2c1c4 (b:41c4) + push de + ld a, e + call LoadCardDataToBuffer1_FromDeckIndex + ld bc, wTxRam2 + ld hl, wLoadedCard1Name + ld a, [hli] + ld [bc], a + inc bc + ld a, [hl] + ld [bc], a + + inc bc ; wTxRam2_b + xor a + ld [bc], a + inc bc + ld [bc], a + + ld a, d + call LoadCardDataToBuffer1_FromDeckIndex + ld a, 18 + call CopyCardNameAndLevel + ld [hl], $00 + ldtx hl, PokemonDevolvedToText + call DrawWideTextBox_WaitForInput + pop de + ret +; 0x2c1ec HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) ld e, a @@ -491,16 +523,72 @@ CheckIfPlayAreaHasAnyDamage: ; 2c25b (b:425b) ret ; 0x2c26e - INCROM $2c26e, $2c2a4 +; makes a list in wDuelTempList with the deck indices +; of Trainer cards found in Turn Duelist's Discard Pile. +; returns carry set if no Trainer cars found, and loads +; corresponding text to notify this. +CreateTrainerCardListFromDiscardPile: ; 2c26e (b:426e) +; get number of cards in Discard Pile +; and have hl point to the end of the +; Discard Pile list in wOpponentDeckCards. + ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE + call GetTurnDuelistVariable + ld b, a + add DUELVARS_DECK_CARDS + ld l, a + + ld de, wDuelTempList + inc b + jr .next_card + +.check_trainer + ld a, [hl] + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_TRAINER + jr nz, .next_card + + ld a, [hl] + ld [de], a + inc de + +.next_card + dec l + dec b + jr nz, .check_trainer + + ld a, $ff ; terminating byte + ld [de], a + ld a, [wDuelTempList] + cp $ff + jr z, .no_trainers + or a + ret +.no_trainers + ldtx hl, ThereAreNoTrainerCardsInDiscardPileText + scf + ret +; 0x2c2a0 ; makes a list in wDuelTempList with the deck indices -; of all the energy cards found in opponent's Discard Pile. -; if (c == 0), all energy cards are allowed; -; if (c != 0), double colorless energy cards are not counted. -; returns carry if no energy cards were found. -CreateEnergyCardListFromOpponentDiscardPile: ; 2c2a4 (b:42a4) - ld c, $00 +; of all energy cards (including Double Colorless) +; found in Turn Duelist's Discard Pile. +CreateEnergyCardListFromDiscardPile_IncludeDoubleColorless: ; 2c2a0 (b:42a0) + ld c, $01 + jr CreateEnergyCardListFromDiscardPile +; makes a list in wDuelTempList with the deck indices +; of all basic energy cards found in Turn Duelist's Discard Pile. +CreateEnergyCardListFromDiscardPile_OnlyBasic: ; 2c2a4 (b:42a4) + ld c, $00 +; fallthrough + +; makes a list in wDuelTempList with the deck indices +; of energy cards found in Turn Duelist's Discard Pile. +; if (c == 0), all energy cards are allowed; +; if (c != 0), double colorless energy cards are not included. +; returns carry if no energy cards were found. +CreateEnergyCardListFromDiscardPile: ; 2c2a6 (b:42a6) ; get number of cards in Discard Pile ; and have hl point to the end of the ; Discard Pile list in wOpponentDeckCards. @@ -783,8 +871,10 @@ HandleAmnesiaScreen: ; 2c391 (b:4391) dw $0000 ; function pointer if non-0 ; 0x2c3fc -; loads in hl the pointer to input attack's name -; (0 = first attack, 1 = second attack) +; loads in hl the pointer to attack's name. +; input: +; d = deck index of card +; e = attack index (0 = first attack, 1 = second attack) GetAttackName: ; 2c3fc (b:43fc) ld a, d call LoadCardDataToBuffer1_FromDeckIndex @@ -800,7 +890,109 @@ GetAttackName: ; 2c3fc (b:43fc) ret ; 0x2c40e - INCROM $2c40e, $2c487 +; returns carry if Defending Pokemon +; doesn't have an attack. +CheckIfDefendingPokemonHasAnyAttack: ; 2c40e (b:440e) + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Move1Category] + cp POKEMON_POWER + jr nz, .has_attack + ld hl, wLoadedCard2Move2Name + ld a, [hli] + or [hl] + jr nz, .has_attack + call SwapTurn + scf + ret +.has_attack + call SwapTurn + or a + ret +; 0x2c431 + +; overwrites HP and Stage data of the card that was +; devolved in the Play Area to the values of new card. +; if the damage exceeds HP of pre-evolution, +; then HP is set to zero. +; input: +; a = card index of pre-evolved card +UpdateDevolvedCardHPAndStage: ; 2c431 (b:4431) + push bc + push de + push af + ldh a, [hTempPlayAreaLocation_ff9d] + ld e, a + call GetCardDamageAndMaxHP + ld b, a ; store damage + ld a, e + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + pop af + + ld [hl], a + call LoadCardDataToBuffer2_FromDeckIndex + ld a, e + add DUELVARS_ARENA_CARD_HP + ld l, a + ld a, [wLoadedCard2HP] + sub b ; subtract damage from new HP + jr nc, .got_hp + ; damage exceeds HP + xor a ; 0 HP +.got_hp + ld [hl], a + ld a, e +; overwrite card stage + add DUELVARS_ARENA_CARD_STAGE + ld l, a + ld a, [wLoadedCard2Stage] + ld [hl], a + pop de + pop bc + ret +; 0x2c45d + +; reset various status after devolving card. +ResetDevolvedCardStatus: ; 2c45d (b:445d) +; if it's Arena card, clear status conditions + ldh a, [hTempPlayAreaLocation_ff9d] + or a + jr nz, .skip_clear_status + call ClearAllStatusConditions +.skip_clear_status +; reset changed color status + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_CHANGED_COLOR + call GetTurnDuelistVariable + ld [hl], $00 +; reset C2 flags + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_FLAGS_C2 + ld l, a + ld [hl], $00 + ret +; 0x2c476 + +; prompts the Player with a Yes/No question +; whether to quit the screen, even though +; they can select more cards from list. +; [hEffectItemSelection] holds number of cards +; that were already selected by the Player. +; input: +; - a = total number of cards that can be selected +AskWhetherToQuitSelectingCards: ; 2c476 (b:4476) + ld hl, hEffectItemSelection + sub [hl] + ld l, a + ld h, $00 + call LoadTxRam3 + ldtx hl, YouCanSelectMoreCardsQuitText + call YesOrNoMenuWithText + ret +; 0x2c487 ; handles the selection of a forced switch ; by link/AI opponent or by the player. @@ -1705,7 +1897,7 @@ Func_2c982: ; 2c982 (b:4982) or a ret nz ld a, 10 - call Func_1955 + call DealRecoilDamageToSelf ret Toxic_AIEffect: ; 2c98c (b:498c) @@ -2044,7 +2236,7 @@ EnergyTrans_CheckPlayArea: ; 2cb44 (b:4b44) EnergyTrans_PrintProcedure: ; 2cb6f (b:4b6f) ldtx hl, ProcedureForEnergyTransferText - bank1call Func_57df + bank1call DrawWholeScreenTextBox or a ret ; 0x2cb77 @@ -2314,7 +2506,7 @@ WeezingSmog_AIEffect: ; 2cce2 (b:4ce2) WeezingSelfdestructEffect: ; 2ccea (b:4cea) ld a, 60 - call Func_1955 + call DealRecoilDamageToSelf ld a, $01 ld [wIsDamageToSelf], a ld a, 10 @@ -2482,7 +2674,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) bank1call OpenPlayAreaScreenForSelection jr c, .loop_input ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hHealPlayAreaLocationTarget], a + ldh [hPkmnPowerPlayAreaTarget], a ld e, a call GetCardDamageAndMaxHP or a @@ -2493,7 +2685,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) .link_opp call SerialRecv8Bytes - ldh [hHealPlayAreaLocationTarget], a + ldh [hPkmnPowerPlayAreaTarget], a ; fallthrough .done @@ -2506,12 +2698,12 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) or a ret z ; return if coin was tails - ldh a, [hHealPlayAreaLocationTarget] + ldh a, [hPkmnPowerPlayAreaTarget] add DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable add 10 ; remove 1 damage counter ld [hl], a - ldh a, [hHealPlayAreaLocationTarget] + ldh a, [hPkmnPowerPlayAreaTarget] call Func_2c10b call ExchangeRNG ret @@ -3160,7 +3352,7 @@ ApplyAmnesiaToAttack: ; 2d18a (b:518a) call CheckIfTurnDuelistIsPlayer ret c ; return if Player -; the rest of the routine if for non-Player +; the rest of the routine if for Opponent ; to announce which move was used for Amnesia. call SwapTurn ld a, DUELVARS_ARENA_CARD @@ -3459,14 +3651,14 @@ PlayerPickFireEnergyCardToDiscard: ; 2d34b (b:534b) bank1call DisplayEnergyDiscardScreen bank1call HandleEnergyDiscardMenuInput ldh a, [hTempCardIndex_ff98] - ldh [hTempDiscardEnergyCards], a + ldh [hTempCardList], a ret ; 0x2d35a AIPickFireEnergyCardToDiscard: ; 2d35a (b:535a) call CreateListOfFireEnergyAttachedToArena ld a, [wDuelTempList] - ldh [hTempDiscardEnergyCards], a ; pick first in list + ldh [hTempCardList], a ; pick first in list ret ; 0x2d363 @@ -3491,14 +3683,14 @@ ArcanineFlamethrower_AISelectEffect: ; 2d375 (b:5375) ; 0x2d379 ArcanineFlamethrower_DiscardEffect: ; 2d379 (b:5379) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d37f TakeDownEffect: ; 2d37f (b:537f) ld a, 30 - call Func_1955 + call DealRecoilDamageToSelf ret ; 0x2d385 @@ -3541,7 +3733,7 @@ FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) .loop_input bank1call HandleEnergyDiscardMenuInput ret c - call GetPositionInDiscardList + call GetCurPositionInTempList ldh a, [hTempCardIndex_ff98] ld [hl], a call RemoveCardFromDuelTempList @@ -3555,14 +3747,14 @@ FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) FlamesOfRage_AISelectEffect: ; 2d3d5 (b:53d5) call AIPickFireEnergyCardToDiscard ld a, [wDuelTempList + 1] - ldh [hTempDiscardEnergyCards + 1], a + ldh [hTempCardList + 1], a ret ; 0x2d3de FlamesOfRage_DiscardEffect: ; 2d3de (b:53de) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile - ldh a, [hTempDiscardEnergyCards + 1] + ldh a, [hTempCardList + 1] call PutCardInDiscardPile ret ; 0x2d3e9 @@ -3669,7 +3861,7 @@ FireBlast_AISelectEffect: ; 2d475 (b:5475) ; 0x2d479 FireBlast_DiscardEffect: ; 2d479 (b:5479) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d47f @@ -3695,7 +3887,7 @@ Ember_AISelectEffect: ; 2d491 (b:5491) ; 0x2d495 Ember_DiscardEffect: ; 2d495 (b:5495) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d49b @@ -3751,7 +3943,7 @@ Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) Wildfire_AISelectEffect: ; 2d4dd (b:54dd) ; AI always chooses 0 cards to discard xor a - ldh [hTempDiscardEnergyCards], a + ldh [hTempCardList], a ret ; 0x2d4e1 @@ -3870,7 +4062,7 @@ FlareonFlamethrower_AISelectEffect: ; 2d56e (b:556e) ; 0x2d572 FlareonFlamethrower_DiscardEffect: ; 2d572 (b:5572) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d578 @@ -3896,7 +4088,7 @@ MagmarFlamethrower_AISelectEffect: ; 2d58a (b:558a) ; 0x2d58e MagmarFlamethrower_DiscardEffect: ; 2d58e (b:558e) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d594 @@ -3934,7 +4126,7 @@ CharmeleonFlamethrower_AISelectEffect: ; 2d5b4 (b:55b4) ; 0x2d5b8 CharmeleonFlamethrower_DiscardEffect: ; 2d5b8 (b:55b8) - ldh a, [hTempDiscardEnergyCards] + ldh a, [hTempCardList] call PutCardInDiscardPile ret ; 0x2d5be @@ -3971,7 +4163,7 @@ FireSpin_PlayerSelectEffect: ; 2d5cd (b:55cd) .loop_input bank1call HandleEnergyDiscardMenuInput ret c - call GetPositionInDiscardList + call GetCurPositionInTempList ldh a, [hTempCardIndex_ff98] ld [hl], a ld hl, wcbfb @@ -3994,14 +4186,14 @@ FireSpin_AISelectEffect: ; 2d606 (b:5606) call CreateArenaOrBenchEnergyCardList ld hl, wDuelTempList ld a, [hli] - ldh [hTempDiscardEnergyCards], a + ldh [hTempCardList], a ld a, [hl] - ldh [hTempDiscardEnergyCards + 1], a + ldh [hTempCardList + 1], a ret ; 0x2d614 FireSpin_DiscardEffect: ; 2d614 (b:5614) - ld hl, hTempDiscardEnergyCards + ld hl, hTempCardList ld a, [hli] call PutCardInDiscardPile ld a, [hli] @@ -4193,7 +4385,7 @@ Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) ld a, [wDuelistType] cp DUELIST_TYPE_PLAYER jr z, .player_1 -; non-player +; opponent ld d, $85 .player_1 ld a, d @@ -4277,4 +4469,1683 @@ Moltres2DiveBomb_Failure50PercentEffect: ; 2d776 (b:5776) ret ; 0x2d78c - INCROM $2d78c, $30000 +; output in de the number of energy cards +; attached to the Defending Pokemon times 10. +; used for attacks that deal 10x number of energy +; cards attached to the Defending card. +GetEnergyAttachedMultiplierDamage: ; 2d78c (b:578c) + call SwapTurn + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable + + ld c, 0 +.loop + ld a, [hl] + cp CARD_LOCATION_ARENA + jr nz, .next + ; is in Arena + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + and TYPE_ENERGY + jr z, .next + ; is Energy attached to Arena card + inc c +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop + + call SwapTurn + ld l, c + ld h, $00 + ld b, $00 + add hl, hl ; hl = 2 * c + add hl, hl ; hl = 4 * c + add hl, bc ; hl = 5 * c + add hl, hl ; hl = 10 * c + ld e, l + ld d, h + ret +; 0x2d7bc + +; draws list of Energy Cards in Discard Pile +; for Player to select from. +; the Player can select up to 2 cards from the list. +; these cards are given in $ff-terminated list +; in hTempCardList. +HandleEnergyCardsInDiscardPileSelection: ; 2d7bc (b:57bc) + push hl + xor a + ldh [hEffectItemSelection], a + call CreateEnergyCardListFromDiscardPile_OnlyBasic + pop hl + jr c, .finish + + call DrawWideTextBox_WaitForInput +.loop +; draws Discard Pile screen and textbox, +; and handles Player input + bank1call InitAndDrawCardListScreenLayout + ldtx hl, ChooseAnEnergyCardText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText + bank1call DisplayCardList + jr nc, .selected + +; Player is trying to exit screen, +; but can select up to 2 cards total. +; prompt Player to confirm exiting screen. + ld a, 2 + call AskWhetherToQuitSelectingCards + jr c, .loop + jr .finish + +.selected +; a card was selected, so add it to list + call GetCurPositionInTempList + ldh a, [hTempCardIndex_ff98] + ld [hl], a + call RemoveCardFromDuelTempList + or a + jr z, .finish ; no more cards? + ldh a, [hEffectItemSelection] + cp 2 + jr c, .loop ; already selected 2 cards? + +.finish +; place terminating byte on list + call GetCurPositionInTempList + ld [hl], $ff + or a + ret +; 0x2d7fc + +; returns carry if Pkmn Power cannot be used, and +; sets the correct text in hl for failure. +Curse_CheckDamageAndBench: ; 2d7fc (b:57fc) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + +; fail if Pkmn Power has already been used + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + ldtx hl, OnlyOncePerTurnText + and USED_PKMN_POWER_THIS_TURN + jr nz, .set_carry + +; fail if Opponent only has 1 Pokemon in Play Area + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + call SwapTurn + ldtx hl, CannotUseSinceTheresOnly1PkmnText + cp 2 + jr c, .set_carry + +; fail if Opponent has no damage counters + call SwapTurn + call CheckIfPlayAreaHasAnyDamage + call SwapTurn + ldtx hl, NoPokemonWithDamageCountersText + jr c, .set_carry + +; return carry if Pkmn Power cannot be used due +; to Toxic Gas or status. + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret + +.set_carry + scf + ret +; 0x2d834 + +Curse_PlayerSelectEffect: ; 2d834 (b:5834) + ldtx hl, ProcedureForCurseText + bank1call DrawWholeScreenTextBox + call SwapTurn + xor a + ldh [hEffectItemSelection], a + bank1call Func_61a1 +.start + bank1call PrintPlayAreaCardList_EnableLCD + push af + ldh a, [hEffectItemSelection] + ld hl, PlayAreaSelectionMenuParameters + call InitializeMenuParameters + pop af + ld [wNumMenuItems], a + +; first pick a target to take 1 damage counter from. +.loop_input_first + call DoFrame + call HandleMenuInput + jr nc, .loop_input_first + cp $ff + jr z, .cancel + ldh [hEffectItemSelection], a + ldh [hTempPlayAreaLocation_ffa1], a + call GetCardDamageAndMaxHP + or a + jr nz, .picked_first ; test if has damage + ; play sfx + call Func_3794 + jr .loop_input_first + +.picked_first +; give 10 HP to card selected, draw the scene, +; then immediately revert this. + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + push af + push hl + add 10 + ld [hl], a + bank1call PrintPlayAreaCardList_EnableLCD + pop hl + pop af + ld [hl], a + +; draw damage counter on cursor + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_HP_NOK + call DrawSymbolOnPlayAreaCursor + +; handle input to pick the target to receive the damage counter. +.loop_input_second + call DoFrame + call HandleMenuInput + jr nc, .loop_input_second + ldh [hPkmnPowerPlayAreaTarget], a + cp $ff + jr nz, .a_press ; was a pressed? + +; b press +; erase the damage counter symbol +; and loop back up again. + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_SPACE + call DrawSymbolOnPlayAreaCursor + call EraseCursor + jr .start + +.a_press + ld hl, hTempPlayAreaLocation_ffa1 + cp [hl] + jr z, .loop_input_second ; same as first? +; a different Pokemon was picked, +; so store this Play Area location +; and erase the damage counter in the cursor. + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_SPACE + call DrawSymbolOnPlayAreaCursor + call EraseCursor + call SwapTurn + or a + ret + +.cancel +; return carry if operation was cancelled. + call SwapTurn + scf + ret +; 0x2d8bb + +Curse_TransferDamageEffect: ; 2d8bb (b:58bb) +; set Pkmn Power as used + ldh a, [hTempCardList] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + +; figure out the type of duelist that used Curse. +; if it was the player, no need to draw the Play Area screen. + call SwapTurn + ld a, DUELVARS_DUELIST_TYPE + call GetNonTurnDuelistVariable + cp DUELIST_TYPE_PLAYER + jr z, .vs_player + +; vs. oppponent + bank1call Func_61a1 +.vs_player +; transfer the damage counter to the targets that were selected. + ldh a, [hPkmnPowerPlayAreaTarget] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + sub 10 + ld [hl], a + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD_HP + ld l, a + ld a, 10 + add [hl] + ld [hl], a + + bank1call PrintPlayAreaCardList_EnableLCD + ld a, DUELVARS_DUELIST_TYPE + call GetNonTurnDuelistVariable + cp DUELIST_TYPE_PLAYER + jr z, .done +; vs. opponent + ldh a, [hPkmnPowerPlayAreaTarget] + ldh [hTempPlayAreaLocation_ff9d], a + bank1call Func_6194 + +.done + call SwapTurn + call ExchangeRNG + bank1call Func_6e49 + ret +; 0x2d903 + +GengarDarkMind_PlayerSelectEffect: ; 2d903 (b:5903) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr nc, .has_bench +; no bench Pokemon to damage. + ld a, $ff + ldh [hTemp_ffa0], a + ret + +.has_bench +; opens Play Area screen to select Bench Pokemon +; to damage, and store it before returning. + ldtx hl, ChoosePkmnInTheBenchToGiveDamageText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2d92a + +GengarDarkMind_AISelectEffect: ; 2d92a (b:592a) + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + ret c ; return if no Bench Pokemon +; just pick Pokemon with lowest remaining HP. + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2d93c + +GengarDarkMind_DamageBenchEffect: ; 2d93c (b:593c) + ldh a, [hTemp_ffa0] + cp $ff + ret z ; no target chosen + call SwapTurn + ld b, a + ld de, 10 + call DealDamageToPlayAreaPokemon + call SwapTurn + ret +; 0x2d94f + +SleepingGasEffect: ; 2d94f (b:594f) + call Sleep50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2d956 + +DestinyBond_CheckEnergy: ; 2d956 (b:5956) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies + PSYCHIC] + ldtx hl, NotEnoughPsychicEnergyText + cp 1 + ret +; 0x2d964 + +DestinyBond_PlayerSelectEffect: ; 2d964 (b:5964) +; handle input and display of Energy card list + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + xor a + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ret c + ldh a, [hTempCardIndex_ff98] + ldh [hTempCardList], a + ret +; 0x2d976 + +DestinyBond_AISelectEffect: ; 2d976 (b:5976) +; pick first card in list + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + ld a, [wDuelTempList] + ldh [hTempCardList], a + ret +; 0x2d981 + +DestinyBond_DiscardEffect: ; 2d981 (b:5981) + ldh a, [hTempCardList] + call PutCardInDiscardPile + ret +; 0x2d987 + +DestinyBond_DestinyBondEffect: ; 2d987 (b:5987) + ld a, SUBSTATUS1_DESTINY_BOND + call ApplySubstatus1ToDefendingCard + ret +; 0x2d98d + +; returns carry if no Energy cards in Discard Pile. +EnergyConversion_CheckEnergy: ; 2d98d (b:598d) + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ldtx hl, ThereAreNoEnergyCardsInDiscardPileText + ret +; 0x2d994 + +EnergyConversion_PlayerSelectEffect: ; 2d994 (b:5994) + ldtx hl, Choose2EnergyCardsFromDiscardPileForHandText + call HandleEnergyCardsInDiscardPileSelection + ret +; 0x2d99b + +EnergyConversion_AISelectEffect: ; 2d99b (b:599b) + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ld hl, wDuelTempList + ld de, hTempCardList + ld c, 2 +; select the first two energy cards found in Discard Pile +.loop + ld a, [hli] + cp $ff + jr z, .done + ld [de], a + inc de + dec c + jr nz, .loop +.done + ld a, $ff + ld [de], a + ret +; 0x2d9b4 + +EnergyConversion_AddToHandEffect: ; 2d9b4 (b:59b4) +; damage itself + ld a, 10 + call DealRecoilDamageToSelf + +; loop cards that were chosen +; until $ff is reached, +; and move them to the hand. + ld hl, hTempCardList + ld de, wDuelTempList +.loop_cards + ld a, [hli] + ld [de], a + inc de + cp $ff + jr z, .done + call MoveDiscardPileCardToHand + call AddCardToHand + jr .loop_cards + +.done + call CheckIfTurnDuelistIsPlayer + ret c + bank1call Func_4b38 + ret +; 0x2d9d6 + +; return carry if Defending Pokemon is not asleep +DreamEaterEffect: ; 2d9d6 (b:59d6) + ld a, DUELVARS_ARENA_CARD_STATUS + call GetNonTurnDuelistVariable + and CNF_SLP_PRZ + cp ASLEEP + ret z ; return if asleep +; not asleep, set carry and load text + ldtx hl, OpponentIsNotAsleepText + scf + ret +; 0x2d9e5 + +TransparencyEffect: ; 2d9e5 (b:59e5) + scf + ret +; 0x2d9e7 + +; returns carry if neither the Turn Duelist or +; the non-Turn Duelist have any deck cards. +Prophecy_CheckDeck: ; 2d9e7 (b:59e7) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + cp DECK_SIZE + jr c, .no_carry + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetNonTurnDuelistVariable + cp DECK_SIZE + jr c, .no_carry + ldtx hl, NoCardsLeftInTheDeckText + scf + ret +.no_carry + or a + ret +; 0x2da00 + +Prophecy_PlayerSelectEffect: ; 2da00 (b:5a00) + ldtx hl, ProcedureForProphecyText + bank1call DrawWholeScreenTextBox +.select_deck + bank1call DrawDuelMainScene + ldtx hl, PleaseSelectTheDeckText + call TwoItemHorizontalMenu + ldh a, [hKeysHeld] + and B_BUTTON + jr nz, Prophecy_PlayerSelectEffect ; loop back to start + + ldh a, [hCurMenuItem] + ldh [hTempCardList], a ; store selection in first position in list + or a + jr z, .turn_duelist + +; non-turn duelist + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetNonTurnDuelistVariable + cp DECK_SIZE + jr nc, .select_deck ; no cards, go back to deck selection + call SwapTurn + call HandleProphecyScreen + call SwapTurn + ret + +.turn_duelist + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + cp DECK_SIZE + jr nc, .select_deck ; no cards, go back to deck selection + call HandleProphecyScreen + ret +; 0x2da3c + +Prophecy_AISelectEffect: ; 2da3c (b:5a3c) +; AI doesn't ever choose this attack +; so this it does no sorting. + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2da41 + +Prophecy_ReorderDeckEffect: ; 2da41 (b:5a41) + ld hl, hTempCardList + ld a, [hli] + or a + jr z, .ReorderCards ; turn duelist's deck + cp $ff + ret z + + ; non-turn duelist's deck + call SwapTurn + call .ReorderCards + call SwapTurn + ret + +.ReorderCards + ld c, 0 +; add selected cards to hand in the specified order +.loop_add_hand + ld a, [hli] + cp $ff + jr z, .dec_hl + call SearchCardInDeckAndAddToHand + inc c + jr .loop_add_hand + +.dec_hl +; go to last card that was in the list + dec hl + dec hl + +.loop_return_deck +; return the cards to the top of the deck + ld a, [hld] + call ReturnCardToDeck + dec c + jr nz, .loop_return_deck + call CheckIfTurnDuelistIsPlayer + ret c + ; print text in case it was the opponent + ldtx hl, ExchangedCardsInDuelistsHandText + call DrawWideTextBox_WaitForInput + ret +; 0x2da76 + +; draw and handle Player selection for reordering +; the top 3 cards of Deck. +; the resulting list is output in order in hTempCardList. +HandleProphecyScreen: ; 2da76 (b:5a76) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ld b, a + ld a, DECK_SIZE + sub [hl] ; a = number of cards in deck + +; store in c the number of cards that will be reordered. +; this number is 3, unless the deck as fewer cards than +; that in which case it will be the number of cards remaining. + ld c, 3 + cp c + jr nc, .got_number_cards + ld c, a ; store number of remaining cards in c +.got_number_cards + ld a, c + inc a + ld [wNumberOfCardsToOrder], a + +; store in wDuelTempList the cards +; at top of Deck to be reordered. + ld a, b + add DUELVARS_DECK_CARDS + ld l, a + ld de, wDuelTempList +.loop_top_cards + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop_top_cards + ld a, $ff ; terminating byte + ld [de], a + +.start + call CountCardsInDuelTempList + ld b, a + ld a, 1 ; start at 1 + ldh [hEffectItemSelection], a + +; initialize buffer ahead in wDuelTempList. + ld hl, wDuelTempList + 10 + xor a +.loop_init_buffer + ld [hli], a + dec b + jr nz, .loop_init_buffer + ld [hl], $ff + + bank1call InitAndDrawCardListScreenLayout + ldtx hl, ChooseTheOrderOfTheCardsText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + bank1call Func_5735 + +.loop_selection + bank1call DisplayCardList + jr c, .clear + +; first check if this card was already selected + ldh a, [hCurMenuItem] + ld e, a + ld d, $00 + ld hl, wDuelTempList + 10 + add hl, de + ld a, [hl] + or a + jr nz, .loop_selection ; already chosen + +; being here means card hasn't been selected yet, +; so add its order number to buffer and increment +; the sort number for the next card. + ldh a, [hEffectItemSelection] + ld [hl], a + inc a + ldh [hEffectItemSelection], a + bank1call Func_5744 + ldh a, [hEffectItemSelection] + ld hl, wNumberOfCardsToOrder + cp [hl] + jr c, .loop_selection ; still more cards + +; confirm that the ordering has been completed + call EraseCursor + ldtx hl, IsThisOKText + call YesOrNoMenuWithText_LeftAligned + jr c, .start ; if not, return back to beginning of selection + +; write in hTempCardList the card list +; in order that was selected. + ld hl, wDuelTempList + 10 + ld de, wDuelTempList + ld c, 0 +.loop_order + ld a, [hli] + cp $ff + jr z, .done + push hl + push bc + ld c, a + ld b, $00 + ld hl, hTempCardList + add hl, bc + ld a, [de] + ld [hl], a + pop bc + pop hl + inc de + inc c + jr .loop_order +; now hTempCardList has the list of card deck indices +; in the order selected to be place on top of the deck. + +.done + ld b, $00 + ld hl, hTempCardList + 1 + add hl, bc + ld [hl], $ff ; terminating byte + or a + ret + +.clear +; check if any reordering was done. + ld hl, hEffectItemSelection + ld a, [hl] + cp 1 + jr z, .loop_selection ; none done, go back +; clear the order that was selected thus far. + dec a + ld [hl], a + ld c, a + ld hl, wDuelTempList + 10 +.loop_clear + ld a, [hli] + cp c + jr nz, .loop_clear + ; clear this byte + dec hl + ld [hl], $00 + bank1call Func_5744 + jr .loop_selection +; 0x2db2b + +HypnoDarkMind_PlayerSelectEffect: ; 2db2b (b:5b2b) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr nc, .has_bench +; no bench Pokemon to damage. + ld a, $ff + ldh [hTemp_ffa0], a + ret + +.has_bench +; opens Play Area screen to select Bench Pokemon +; to damage, and store it before returning. + ldtx hl, ChoosePkmnInTheBenchToGiveDamageText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2db52 + +HypnoDarkMind_AISelectEffect: ; 2db52 (b:5b52) + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + ret c ; return if no Bench Pokemon +; just pick Pokemon with lowest remaining HP. + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2db64 + +HypnoDarkMind_DamageBenchEffect: ; 2db64 (b:5b64) + ldh a, [hTemp_ffa0] + cp $ff + ret z ; no target chosen + call SwapTurn + ld b, a + ld de, 10 + call DealDamageToPlayAreaPokemon + call SwapTurn + ret +; 0x2db77 + +InvisibleWallEffect: ; 2db77 (b:5b77) + scf + ret +; 0x2db79 + +MrMimeMeditate_AIEffect: ; 2db79 (b:5b79) + call MrMimeMeditate_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2db7f + +MrMimeMeditate_DamageBoostEffect: ; 2db7f (b:5b7f) +; add damage counters of Defending card to damage + call SwapTurn + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call SwapTurn + call AddToDamage + ret +; 0x2db8e + +; returns carry if Damage Swap cannot be used. +DamageSwap_CheckDamage: ; 2db8e (b:5b8e) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call CheckIfPlayAreaHasAnyDamage + jr c, .no_damage + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret +.no_damage + ldtx hl, NoPokemonWithDamageCountersText + scf + ret +; 0x2dba2 + +DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) + ld a, DUELVARS_DUELIST_TYPE + call GetTurnDuelistVariable + cp DUELIST_TYPE_PLAYER + jr z, .player +; non-player + bank1call Func_61a1 + bank1call PrintPlayAreaCardList_EnableLCD + ret + +.player + ldtx hl, ProcedureForDamageSwapText + bank1call DrawWholeScreenTextBox + xor a + ldh [hEffectItemSelection], a + bank1call Func_61a1 + +.start + bank1call PrintPlayAreaCardList_EnableLCD + push af + ldh a, [hEffectItemSelection] + ld hl, PlayAreaSelectionMenuParameters + call InitializeMenuParameters + pop af + ld [wNumMenuItems], a + +; handle selection of Pokemon to take damage from +.loop_input_first + call DoFrame + call HandleMenuInput + jr nc, .loop_input_first + cp $ff + ret z ; quit when B button is pressed + + ldh [hTempPlayAreaLocation_ffa1], a + ldh [hEffectItemSelection], a + +; if card has no damage, play sfx and return to start + call GetCardDamageAndMaxHP + or a + jr z, .no_damage + +; take damage away temporarily to draw UI. + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + push af + push hl + add 10 + ld [hl], a + bank1call PrintPlayAreaCardList_EnableLCD + pop hl + pop af + ld [hl], a + +; draw damage counter in cursor + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_HP_NOK + call DrawSymbolOnPlayAreaCursor + +; handle selection of Pokemon to give damage to +.loop_input_second + call DoFrame + call HandleMenuInput + jr nc, .loop_input_second + ; if B is pressed, return damage counter + ; to card that it was taken from + cp $ff + jr z, .update_ui + +; try to give the card selected the damage counter +; if it would KO, ignore it. + ldh [hPkmnPowerPlayAreaTarget], a + ldh [hEffectItemSelection], a + call TryGiveDamageCounter_DamageSwap + jr c, .loop_input_second + + ld a, OPPACTION_6B15 + call SetOppAction_SerialSendDuelData + +.update_ui + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, SYM_SPACE + call DrawSymbolOnPlayAreaCursor + call EraseCursor + jr .start + +.no_damage + call Func_3794 + jr .loop_input_first +; 0x2dc27 + +; tries to give damage counter to hPkmnPowerPlayAreaTarget, +; and if successful updates UI screen. +DamageSwap_SwapEffect: ; 2dc27 (b:5c27) + call TryGiveDamageCounter_DamageSwap + ret c + bank1call PrintPlayAreaCardList_EnableLCD + or a + ret +; 0x2dc30 + +; tries to give the damage counter to the target +; chosen by the Player (hPkmnPowerPlayAreaTarget). +; if the damage counter would KO card, then do +; not give the damage counter and return carry. +TryGiveDamageCounter_DamageSwap: ; 2dc30 (b:5c30) + ldh a, [hPkmnPowerPlayAreaTarget] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + sub 10 + jr z, .set_carry ; would bring HP to zero? +; has enough HP to receive a damage counter + ld [hl], a + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD_HP + ld l, a + ld a, 10 + add [hl] + ld [hl], a + or a + ret +.set_carry + scf + ret +; 0x2dc49 + +PsywaveEffect: ; 2dc49 (b:5c49) + call GetEnergyAttachedMultiplierDamage + ld hl, wDamage + ld [hl], e + inc hl + ld [hl], d + ret +; 0x2dc53 + +; returns carry if neither Duelist has evolved Pokemon. +DevolutionBeam_CheckPlayArea: ; 2dc53 (b:5c53) + call CheckIfTurnDuelistHasEvolvedCards + ret nc + call SwapTurn + call CheckIfTurnDuelistHasEvolvedCards + call SwapTurn + ldtx hl, ThereAreNoStage1PokemonText + ret +; 0x2dc64 + +; returns carry of Player cancelled selection. +; otherwise, output in hTemp_ffa0 which Play Area +; was selected ($0 = own Play Area, $1 = opp. Play Area) +; and in hTempPlayAreaLocation_ffa1 selected card. +DevolutionBeam_PlayerSelectEffect: ; 2dc64 (b:5c64) + ldtx hl, ProcedureForDevolutionBeamText + bank1call DrawWholeScreenTextBox + +.start + bank1call DrawDuelMainScene + ldtx hl, PleaseSelectThePlayAreaText + call TwoItemHorizontalMenu + ldh a, [hKeysHeld] + and B_BUTTON + jr nz, .set_carry + +; a Play Area was selected + ldh a, [hCurMenuItem] + or a + jr nz, .opp_chosen + +; player chosen + call HandleEvolvedCardSelection + jr c, .start + + xor a +.store_selection + ld hl, hTemp_ffa0 + ld [hli], a ; store which Duelist Play Area selected + ldh a, [hTempPlayAreaLocation_ff9d] + ld [hl], a ; store which card selected + or a + ret + +.opp_chosen + call SwapTurn + call HandleEvolvedCardSelection + call SwapTurn + jr c, .start + ld a, $01 + jr .store_selection + +.set_carry + scf + ret +; 0x2dc9e + +DevolutionBeam_AISelectEffect: ; 2dc9e (b:5c9e) + ld a, $01 + ldh [hTemp_ffa0], a + call SwapTurn + call FindFirstNonBasicCardInPlayArea + call SwapTurn + jr c, .found + xor a + ldh [hTemp_ffa0], a + call FindFirstNonBasicCardInPlayArea +.found + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2dcb6 + +DevolutionBeam_LoadAnimation: ; 2dcb6 (b:5cb6) + xor a + ld [wLoadedMoveAnimation], a + ret +; 0x2dcbb + +DevolutionBeam_DevolveEffect: ; 2dcbb (b:5cbb) + ldh a, [hTemp_ffa0] + or a + jr z, .DevolvePokemon + cp $ff + ret z + +; opponent's Play Area + call SwapTurn + ldh a, [hTempPlayAreaLocation_ffa1] + jr nz, .skip_handle_no_damage_effect + call HandleNoDamageOrEffect + jr c, .unaffected +.skip_handle_no_damage_effect + call .DevolvePokemon +.unaffected + call SwapTurn + ret + +.DevolvePokemon + ld a, $5d + ld [wLoadedMoveAnimation], a + ldh a, [hTempPlayAreaLocation_ffa1] + ld b, a + ld c, $00 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + +; load selected card's data + ldh a, [hTempPlayAreaLocation_ffa1] + ldh [hTempPlayAreaLocation_ff9d], a + ld [wTempPlayAreaLocation_cceb], a + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + +; check if car is affected + ld a, [wLoadedCard1ID] + ld [wTempNonTurnDuelistCardID], a + ld de, $0 + ldh a, [hTempPlayAreaLocation_ff9d] + or a + jr nz, .skip_substatus_check + call HandleNoDamageOrEffectSubstatus + jr c, .check_no_damage_effect +.skip_substatus_check + call HandleDamageReductionOrNoDamageFromPkmnPowerEffects +.check_no_damage_effect + call CheckNoDamageOrEffect + jr nc, .devolve + call DrawWideTextBox_WaitForInput + ret + +.devolve + ldh a, [hTempPlayAreaLocation_ffa1] + ldh [hTempPlayAreaLocation_ff9d], a + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + bank1call GetCardOneStageBelow + call PrintDevolvedCardNameAndLevelText + + ld a, d + call UpdateDevolvedCardHPAndStage + call ResetDevolvedCardStatus + +; add the evolved card to the hand + ld a, e + call AddCardToHand + +; check if this devolution KO's card + ldh a, [hTempPlayAreaLocation_ffa1] + call PrintPlayAreaCardKnockedOutIfNoHP + + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2dd3b + +; returns carry if Turn Duelist +; has no Stage1 or Stage2 cards in Play Area. +CheckIfTurnDuelistHasEvolvedCards: ; 2dd3b (b:5d3b) + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld d, h + ld e, DUELVARS_ARENA_CARD_STAGE +.loop + ld a, [hli] + cp $ff + jr z, .set_carry + ld a, [de] + inc de + or a + jr z, .loop ; is Basic Stage + ret +.set_carry + scf + ret +; 0x2dd50 + +; handles Player selection of an evolved card in Play Area. +; returns carry if Player cancelled operation. +HandleEvolvedCardSelection: ; 2dd50 (b:5d50) + bank1call HasAlivePokemonInPlayArea +.loop + bank1call OpenPlayAreaScreenForSelection + ret c + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_STAGE + call GetTurnDuelistVariable + or a + jr z, .loop ; if Basic, loop + ret +; 0x2dd62 + +; finds first occurence in Play Area +; of Stage 1 or 2 card, and outputs its +; Play Area location in a, with carry set. +; if none found, don't return carry set. +FindFirstNonBasicCardInPlayArea: ; 2dd62 (b:5d62) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + + ld b, PLAY_AREA_ARENA + ld l, DUELVARS_ARENA_CARD_STAGE +.loop + ld a, [hli] + or a + jr nz, .not_basic + inc b + dec c + jr nz, .loop + or a + ret +.not_basic + ld a, b + scf + ret +; 0x2dd79 + +NeutralizingShieldEffect: ; 2dd79 (b:5d79) + scf + ret +; 0x2dd7b + +Psychic_AIEffect: ; 2dd7b (b:5d7b) + call Psychic_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2dd81 + +Psychic_DamageBoostEffect: ; 2dd81 (b:5d81) + call GetEnergyAttachedMultiplierDamage + ld hl, wDamage + ld a, e + add [hl] + ld [hli], a + ld a, d + adc [hl] + ld [hl], a + ret +; 0x2dd8e + +; return carry if no Psychic Energy attached +Barrier_CheckEnergy: ; 2dd8e (b:5d8e) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies + PSYCHIC] + ldtx hl, NotEnoughPsychicEnergyText + cp 1 + ret +; 0x2dd9c + +Barrier_PlayerSelectEffect: ; 2dd9c (b:5d9c) + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ret c + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + ret +; 0x2ddae + +Barrier_AISelectEffect: ; 2ddae (b:5dae) +; AI picks the first energy in list + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + ld a, [wDuelTempList] + ldh [hTemp_ffa0], a + ret +; 0x2ddb9 + +Barrier_DiscardEffect: ; 2ddb9 (b:5db9) + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ret +; 0x2ddbf + +Barrier_BarrierEffect: ; 2ddbf (b:5dbf) + ld a, SUBSTATUS1_BARRIER + call ApplySubstatus1ToDefendingCard + ret +; 0x2ddc5 + +Mewtwo3EnergyAbsorption_CheckDiscardPile: ; 2ddc5 (b:5dc5) + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ldtx hl, ThereAreNoEnergyCardsInDiscardPileText + ret +; 0x2ddcc + +Mewtwo3EnergyAbsorption_PlayerSelectEffect: ; 2ddcc (b:5dcc) + ldtx hl, Choose2EnergyCardsFromDiscardPileToAttachText + call HandleEnergyCardsInDiscardPileSelection + ret +; 0x2ddd3 + +Mewtwo3EnergyAbsorption_AISelectEffect: ; 2ddd3 (b:5dd3) +; AI picks first 2 energy cards + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ld hl, wDuelTempList + ld de, hTempCardList + ld c, 2 +.loop + ld a, [hli] + cp $ff + jr z, .done + ld [de], a + inc de + dec c + jr nz, .loop +.done + ld a, $ff ; terminating byte + ld [de], a + ret +; 0x2ddec + +Mewtwo3EnergyAbsorption_AddToHandEffect: ; 2ddec (b:5dec) + ld hl, hTempCardList +.loop + ld a, [hli] + cp $ff + ret z + push hl + call MoveDiscardPileCardToHand + call GetTurnDuelistVariable + ld [hl], CARD_LOCATION_ARENA + pop hl + jr .loop +; 0x2ddff + +Mewtwo2EnergyAbsorption_CheckDiscardPile: ; 2ddff (b:5dff) + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ldtx hl, ThereAreNoEnergyCardsInDiscardPileText + ret +; 0x2de06 + +Mewtwo2EnergyAbsorption_PlayerSelectEffect: ; 2de06 (b:5e06) + ldtx hl, Choose2EnergyCardsFromDiscardPileToAttachText + call HandleEnergyCardsInDiscardPileSelection + ret +; 0x2de0d + +Mewtwo2EnergyAbsorption_AISelectEffect: ; 2de0d (b:5e0d) +; AI picks first 2 energy cards + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ld hl, wDuelTempList + ld de, hTempCardList + ld c, 2 +.loop + ld a, [hli] + cp $ff + jr z, .done + ld [de], a + inc de + dec c + jr nz, .loop +.done + ld a, $ff ; terminating byte + ld [de], a + ret +; 0x2de26 + +Mewtwo2EnergyAbsorption_AddToHandEffect: ; 2de26 (b:5e26) + ld hl, hTempCardList +.loop + ld a, [hli] + cp $ff + ret z + push hl + call MoveDiscardPileCardToHand + call GetTurnDuelistVariable + ld [hl], CARD_LOCATION_ARENA + pop hl + jr .loop +; 0x2de39 + +; returns carry if Strange Behavior cannot be used. +StrangeBehavior_CheckDamage: ; 2de39 (b:5e39) +; does Play Area have any damage counters? + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call CheckIfPlayAreaHasAnyDamage + ldtx hl, NoPokemonWithDamageCountersText + jr c, .set_carry +; can Slowbro receive any damage counters without KOing? + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + ldtx hl, CannotUseBecauseItWillBeKnockedOutText + cp 10 + 10 + jr c, .set_carry +; can Pkmn Power be used? + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret + +.set_carry + scf + ret +; 0x2de5b + +StrangeBehavior_SelectAndSwapEffect: ; 2de5b (b:5e5b) + ld a, DUELVARS_DUELIST_TYPE + call GetTurnDuelistVariable + cp DUELIST_TYPE_PLAYER + jr z, .player + +; not player + bank1call Func_61a1 + bank1call PrintPlayAreaCardList_EnableLCD + ret + +.player + ldtx hl, ProcedureForStrangeBehaviorText + bank1call DrawWholeScreenTextBox + + xor a + ldh [hEffectItemSelection], a + bank1call Func_61a1 +.start + bank1call PrintPlayAreaCardList_EnableLCD + push af + ldh a, [hEffectItemSelection] + ld hl, PlayAreaSelectionMenuParameters + call InitializeMenuParameters + pop af + + ld [wNumMenuItems], a +.loop_input + call DoFrame + call HandleMenuInput + jr nc, .loop_input + cp -1 + ret z ; return when B button is pressed + + ldh [hEffectItemSelection], a + ldh [hTempPlayAreaLocation_ffa1], a + ld hl, hTemp_ffa0 + cp [hl] + jr z, .play_sfx ; can't select Slowbro itself + + call GetCardDamageAndMaxHP + or a + jr z, .play_sfx ; can't select card without damage + + call TryGiveDamageCounter_StrangeBehavior + jr c, .play_sfx + ld a, OPPACTION_6B15 + call SetOppAction_SerialSendDuelData + jr .start + +.play_sfx + call Func_3794 + jr .loop_input +; 0x2deb3 + +StrangeBehavior_SwapEffect: ; 2deb3 (b:5eb3) + call TryGiveDamageCounter_StrangeBehavior + ret c + bank1call PrintPlayAreaCardList_EnableLCD + or a + ret +; 0x2debc + +; tries to give the damage counter to the target +; chosen by the Player (hTemp_ffa0). +; if the damage counter would KO card, then do +; not give the damage counter and return carry. +TryGiveDamageCounter_StrangeBehavior: ; 2debc (b:5ebc) + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + sub 10 + jr z, .set_carry ; would bring HP to zero? +; has enough HP to receive a damage counter + ld [hl], a + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD_HP + ld l, a + ld a, 10 + add [hl] + ld [hl], a + or a + ret +.set_carry + scf + ret +; 0x2ded5 + +; returns carry if has no damage counters. +SpacingOut_CheckDamage: ; 2ded5 (b:5ed5) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ldtx hl, NoDamageCountersText + cp 10 + ret +; 0x2dee0 + +SpacingOut_Failure50PercentEffect: ; 2dee0 (b:5ee0) + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + ldh [hTemp_ffa0], a + jp nc, SetWasUnsuccessful + ld a, $58 + ld [wLoadedMoveAnimation], a + ret +; 0x2def1 + +SpacingOut_HealEffect: ; 2def1 (b:5ef1) + ldh a, [hTemp_ffa0] + or a + ret z ; coin toss was tails + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + or a + ret z ; no damage counters + ld a, DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + add 10 + ld [hl], a + ret +; 0x2df05 + +; sets carry if no Trainer cards in the Discard Pile. +Scavenge_CheckDiscardPile: ; 2df05 (b:5f05) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies + PSYCHIC] + ldtx hl, NotEnoughPsychicEnergyText + cp 1 + ret c ; return if no Psychic energy attached + call CreateTrainerCardListFromDiscardPile + ldtx hl, ThereAreNoTrainerCardsInDiscardPileText ; this is redundant + ret +; 0x2df1a + +Scavenge_PlayerSelectEnergyEffect: ; 2df1a (b:5f1a) + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ret c + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret +; 0x2df2d + +Scavenge_AISelectEffect: ; 2df2d (b:5f2d) +; AI picks first Energy card in list + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + ld a, [wDuelTempList] + ldh [hTemp_ffa0], a +; AI picks first Trainer card in list + call CreateTrainerCardListFromDiscardPile + ld a, [wDuelTempList] + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2df40 + +Scavenge_DiscardEffect: ; 2df40 (b:5f40) + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ret +; 0x2df46 + +Scavenge_PlayerSelectTrainerEffect: ; 2df46 (b:5f46) + call CreateTrainerCardListFromDiscardPile + bank1call Func_5591 + ldtx hl, PleaseSelectCardText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText +.loop_input + bank1call DisplayCardList + jr c, .loop_input + ldh a, [hTempCardIndex_ff98] + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2df5f + +Scavenge_AddToHandEffect: ; 2df5f (b:5f5f) + ldh a, [hTempPlayAreaLocation_ffa1] + call MoveDiscardPileCardToHand + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + ret c + ldh a, [hTempPlayAreaLocation_ffa1] + ldtx hl, WasPlacedInTheHandText + bank1call DisplayCardDetailScreen + ret +; 0x2df74 + +; returns carry if Defending Pokemon has no attacks +SlowpokeAmnesia_CheckAttacks: ; 2df74 (b:5f74) + call CheckIfDefendingPokemonHasAnyAttack + ldtx hl, NoAttackMayBeChoosenText + ret +; 0x2df7b + +SlowpokeAmnesia_PlayerSelectEffect: ; 2df7b (b:5f7b) + call PlayerPickAttackForAmnesia + ret +; 0x2df7f + +SlowpokeAmnesia_AISelectEffect: ; 2df7f (b:5f7f) + call AIPickAttackForAmnesia + ldh [hTemp_ffa0], a + ret +; 0x2df85 + +SlowpokeAmnesia_DisableEffect: ; 2df85 (b:5f85) + call ApplyAmnesiaToAttack + ret +; 0x2df89 + +; returns carry if Arena card has no Psychic Energy attached +; or if it doesn't have any damage counters. +KadabraRecover_CheckEnergyHP: ; 2df89 (b:5f89) + ld e, PLAY_AREA_ARENA + call GetPlayAreaCardAttachedEnergies + ld a, [wAttachedEnergies + PSYCHIC] + ldtx hl, NotEnoughPsychicEnergyText + cp 1 + ret c ; return if not enough energy + call GetCardDamageAndMaxHP + ldtx hl, NoDamageCountersText + cp 10 + ret ; return carry if no damage +; 0x2dfa0 + +KadabraRecover_PlayerSelectEffect: ; 2dfa0 (b:5fa0) + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ret c + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a ; store card chosen + ret +; 0x2dfb2 + +KadabraRecover_AISelectEffect: ; 2dfb2 (b:5fb2) + ld a, TYPE_ENERGY_PSYCHIC + call CreateListOfEnergyAttachedToArena + ld a, [wDuelTempList] ; pick first card + ldh [hTemp_ffa0], a + ret +; 0x2dfbd + +KadabraRecover_DiscardEffect: ; 2dfbd (b:5fbd) + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ret +; 0x2dfc3 + +KadabraRecover_HPRecoveryEffect: ; 2dfc3 (b:5fc3) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld e, a ; all damage for recovery + ld d, 0 + call ApplyAndAnimateHPRecovery + ret +; 0x2dfd7 + +JynxDoubleslap_AIEffect: ; 2dfd7 (b:5fd7) + ld a, 20 / 2 + lb de, 0, 20 + jp StoreAIDamageInfo +; 0x2dfcf + +JynxDoubleslap_MultiplierEffect: ; 2dfcf (b:5fcf) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + call ATimes10 + call StoreDamageInfo + ret +; 0x2dff2 + +JynxMeditate_AIEffect: ; 2dff2 (b:5ff2) + call JynxMeditate_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2dfec + +JynxMeditate_DamageBoostEffect: ; 2dfec (b:5fec) +; add damage counters of Defending card to damage + call SwapTurn + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call SwapTurn + call AddToDamage + ret +; 0x2e001 + +MysteryAttack_AIEffect: ; 2e001 (b:6001) + ld a, 10 + lb de, 0, 20 + jp StoreAIDamageInfo +; 0x2e009 + +MysteryAttack_RandomEffect: ; 2e009 (b:6009) + ld a, 10 + call StoreDamageInfo + +; chooses a random effect from 8 possible options. + call UpdateRNGSources + and %111 + ldh [hTemp_ffa0], a + ld hl, .random_effect + jp JumpToFunctionInTable + +.random_effect + dw ParalysisEffect + dw PoisonEffect + dw SleepEffect + dw ConfusionEffect + dw .no_effect ; this will actually activate recovery effect afterwards + dw .no_effect + dw .more_damage + dw .no_damage + +.more_damage + ld a, 20 + call StoreDamageInfo + ret + +.no_damage + ld a, $5b + ld [wLoadedMoveAnimation], a + xor a + call StoreDamageInfo + call SetNoEffectFromStatus +.no_effect + ret +; 0x2e03e + +MysteryAttack_RecoverEffect: ; 2e03e (b:603e) +; in case the 5th option was chosen for random effect, +; trigger recovery effect for 10 HP. + ldh a, [hTemp_ffa0] + cp 4 + ret nz + lb de, 0, 10 + call ApplyAndAnimateHPRecovery + ret +; 0x2e04a + + INCROM $2e04a, $30000 diff --git a/src/engine/home.asm b/src/engine/home.asm index 42215a69..80091175 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -4690,7 +4690,10 @@ LoadNonPokemonCardEffectCommands: ; 1944 (0:1944) ld [de], a ret -Func_1955: ; 1955 (0:1955) +; inflict recoil damage to self +; input: +; a = damage to deal +DealRecoilDamageToSelf: ; 1955 (0:1955) push af ld a, $7a ld [wLoadedMoveAnimation], a diff --git a/src/hram.asm b/src/hram.asm index 16126a78..1554be6c 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -79,22 +79,23 @@ hTempCardIndex_ff9f:: ; ff9f UNION -; list of cards chosen to be discarded for attack effect -hTempDiscardEnergyCards:: ; ffa0 - ds $2 - -NEXTU - ; multipurpose temp storage (card's deck index, selected move index, status condition...) hTemp_ffa0:: ; ffa0 ds $1 ; a PLAY_AREA_* constant (0: arena card, 1-5: bench card) hTempPlayAreaLocation_ffa1:: ; ffa1 + ; parameter to be used by the AI's Pkmn Power effect hAIPkmnPowerEffectParam:: ; ffa1 ds $1 +NEXTU + +; list of cards selected for various effects +hTempCardList:: ; ffa0 + ds $2 + ENDU UNION @@ -109,9 +110,12 @@ NEXTU ; the deck index (0-59) of the energy card to transfer ; and the Play Area location (PLAY_AREA_*) of card to receive that energy card. hAIEnergyTransEnergyCard:: ; ffa2 -; PLAY_AREA_* constant of Pokemon to be affected by Heal PKMN Power -hHealPlayAreaLocationTarget:: ; ffa2 + +; PLAY_AREA_* of target selected for some Pkmn Powers, +; like the targets chosen for Curse or Damage Swap. +hPkmnPowerPlayAreaTarget:: ; ffa2 ds $1 + hAIEnergyTransPlayAreaLocation:: ; ffa3 ds $1 diff --git a/src/text/text1.asm b/src/text/text1.asm index ab5a0fb0..e1985c1b 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -821,7 +821,7 @@ NoEnergyAttachedToOpponentsActiveText: ; 3742a (d:742a) line "the opponent's Active Pokémon." done -Text00af: ; 3746a (d:746a) +ThereAreNoEnergyCardsInDiscardPileText: ; 3746a (d:746a) text "There are no Energy cards" line "in the the Discard Pile." done @@ -882,7 +882,7 @@ Text00bb: ; 37680 (d:7680) line "Discard Pile." done -Text00bc: ; 376a9 (d:76a9) +ThereAreNoStage1PokemonText: ; 376a9 (d:76a9) text "There are no Stage 1 Pokémon" line "in the Play Area." done @@ -910,7 +910,7 @@ NotEnoughFireEnergyText: ; 3779b (d:779b) text "Not enough Fire Energy." done -Text00c2: ; 377b4 (d:77b4) +NotEnoughPsychicEnergyText: ; 377b4 (d:77b4) text "Not enough Psychic Energy." done @@ -918,7 +918,7 @@ NotEnoughWaterEnergyText: ; 377d0 (d:77d0) text "Not enough Water Energy." done -Text00c4: ; 377ea (d:77ea) +ThereAreNoTrainerCardsInDiscardPileText: ; 377ea (d:77ea) text "There are no Trainer Cards" line "in the Discard Pile." done @@ -967,12 +967,12 @@ NoGrassEnergyText: ; 37946 (d:7946) text "No Grass Energy." done -Text00cf: ; 37958 (d:7958) +CannotUseSinceTheresOnly1PkmnText: ; 37958 (d:7958) text "Cannot use since there's only" line "1 Pokémon." done -Text00d0: ; 37982 (d:7982) +CannotUseBecauseItWillBeKnockedOutText: ; 37982 (d:7982) text "Cannot use because" line "it will be Knocked Out." done @@ -985,7 +985,7 @@ ThereAreNoPokemonOnBenchText: ; 379ce (d:79ce) text "There are no Pokémon on the Bench." done -Text00d3: ; 379f2 (d:79f2) +OpponentIsNotAsleepText: ; 379f2 (d:79f2) text "Opponent is not Asleep" done diff --git a/src/text/text2.asm b/src/text/text2.asm index f5686db1..90e405fc 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -182,7 +182,7 @@ CannotDrawCardBecauseNoCardsInDeckText: ; 3872d (e:472d) line "there are no cards in the Deck." done -Text011a: ; 38769 (e:4769) +ChoosePkmnInTheBenchToGiveDamageText: ; 38769 (e:4769) text "Choose a Pokémon on the Bench" line "to give damage to." done @@ -303,7 +303,7 @@ ChoosePkmnToRemoveDamageCounterText: ; 38bc9 (e:4bc9) line "the Damage counter from." done -Text0131: ; 38bfe (e:4bfe) +ProcedureForCurseText: ; 38bfe (e:4bfe) text "Procedure for Curse:" line "" line "1. Choose a Pokémon to move the" @@ -317,22 +317,22 @@ Text0131: ; 38bfe (e:4bfe) line "3. Press the B Button to cancel." done -Text0132: ; 38cda (e:4cda) +Choose2EnergyCardsFromDiscardPileToAttachText: ; 38cda (e:4cda) text "Choose 2 Energy cards from the" line "Discard Pileto attach to a Pokémon." done -Text0133: ; 38d1e (e:4d1e) +Choose2EnergyCardsFromDiscardPileForHandText: ; 38d1e (e:4d1e) text "Choose 2 Energy cards from the" line "Discard Pile for your Hand." done -Text0134: ; 38d5a (e:4d5a) +ChooseAnEnergyCardText: ; 38d5a (e:4d5a) text "Choose an Energy" line "card." done -Text0135: ; 38d72 (e:4d72) +ProcedureForProphecyText: ; 38d72 (e:4d72) text "Procedure for Prophecy:" line "" line "1. Choose either your Deck" @@ -348,12 +348,12 @@ Text0135: ; 38d72 (e:4d72) line "4. Press the B Button to cancel." done -Text0136: ; 38e70 (e:4e70) +ChooseTheOrderOfTheCardsText: ; 38e70 (e:4e70) text "Choose the order" line "of the cards." done -Text0137: ; 38e90 (e:4e90) +ProcedureForDamageSwapText: ; 38e90 (e:4e90) text "Procedure for Damage Swap:" line "" line "1. Choose a Pokémon to move a" @@ -372,7 +372,7 @@ Text0137: ; 38e90 (e:4e90) line " it will Knock Out the Pokémon." done -Text0138: ; 38fcc (e:4fcc) +ProcedureForDevolutionBeamText: ; 38fcc (e:4fcc) text "Procedure for Devolution Beam." line "" line "1. Choose either a Pokémon in your" @@ -385,7 +385,7 @@ Text0138: ; 38fcc (e:4fcc) line "3. Press the B Button to cancel." done -Text0139: ; 390b4 (e:50b4) +ProcedureForStrangeBehaviorText: ; 390b4 (e:50b4) text "Procedure for Strange Behavior:" line "" line "1. Choose the Pokémon with the" @@ -415,12 +415,12 @@ WouldYouLikeToCheckTheDeckText: ; 39231 (e:5231) text "Would you like to check the Deck?" done -Text013d: ; 39254 (e:5254) +PleaseSelectTheDeckText: ; 39254 (e:5254) text "Please select the Deck:" line " Yours Opponent's" done -Text013e: ; 3928c (e:528c) +PleaseSelectThePlayAreaText: ; 3928c (e:528c) text "Please select the Play Area:" line " Yours Opponent's" done @@ -656,7 +656,7 @@ Text016e: ; 39a14 (e:5a14) line "to the Deck." done -Text016f: ; 39a31 (e:5a31) +WasPlacedInTheHandText: ; 39a31 (e:5a31) text " was placed" line "in the Hand." done @@ -708,7 +708,7 @@ Text0179: ; 39b32 (e:5b32) line " damage!" done -Text017a: ; 39b46 (e:5b46) +PokemonDevolvedToText: ; 39b46 (e:5b46) text " devolved" line "to !" done @@ -717,7 +717,7 @@ ThereWasNoFireEnergyText: ; 39b58 (e:5b58) text "There was no Fire Energy." done -Text017c: ; 39b73 (e:5b73) +YouCanSelectMoreCardsQuitText: ; 39b73 (e:5b73) text "You can select more cards. Quit?" done @@ -755,7 +755,7 @@ ThereWasNoEffectFromPoisonConfusionText: ; 39c5a (e:5c5a) line "from Poison, Confusion." done -Text0184: ; 39c86 (e:5c86) +ExchangedCardsInDuelistsHandText: ; 39c86 (e:5c86) text "Exchanged the cards" line "in 's Hand." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 29cc0ca4..f4ceceec 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -176,7 +176,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer NoPokemonWithDamageCountersText ; 0x00ac textpointer NoDamageCountersText ; 0x00ad textpointer NoEnergyAttachedToOpponentsActiveText ; 0x00ae - textpointer Text00af ; 0x00af + textpointer ThereAreNoEnergyCardsInDiscardPileText ; 0x00af textpointer Text00b0 ; 0x00b0 textpointer NoCardsLeftInTheDeckText ; 0x00b1 textpointer NoSpaceOnTheBenchText ; 0x00b2 @@ -189,15 +189,15 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00b9 ; 0x00b9 textpointer Text00ba ; 0x00ba textpointer Text00bb ; 0x00bb - textpointer Text00bc ; 0x00bc + textpointer ThereAreNoStage1PokemonText ; 0x00bc textpointer Text00bd ; 0x00bd textpointer Text00be ; 0x00be textpointer EnergyCardsRequiredToRetreatText ; 0x00bf textpointer NotEnoughEnergyCardsText ; 0x00c0 textpointer NotEnoughFireEnergyText ; 0x00c1 - textpointer Text00c2 ; 0x00c2 + textpointer NotEnoughPsychicEnergyText ; 0x00c2 textpointer NotEnoughWaterEnergyText ; 0x00c3 - textpointer Text00c4 ; 0x00c4 + textpointer ThereAreNoTrainerCardsInDiscardPileText ; 0x00c4 textpointer NoAttackMayBeChoosenText ; 0x00c5 textpointer Text00c6 ; 0x00c6 textpointer Text00c7 ; 0x00c7 @@ -208,11 +208,11 @@ TextOffsets:: ; 34000 (d:4000) textpointer CannotBeUsedInTurnWhichWasPlayedText ; 0x00cc textpointer Text00cd ; 0x00cd textpointer NoGrassEnergyText ; 0x00ce - textpointer Text00cf ; 0x00cf - textpointer Text00d0 ; 0x00d0 + textpointer CannotUseSinceTheresOnly1PkmnText ; 0x00cf + textpointer CannotUseBecauseItWillBeKnockedOutText ; 0x00d0 textpointer Text00d1 ; 0x00d1 textpointer ThereAreNoPokemonOnBenchText ; 0x00d2 - textpointer Text00d3 ; 0x00d3 + textpointer OpponentIsNotAsleepText ; 0x00d3 textpointer UnableDueToToxicGasText ; 0x00d4 textpointer Text00d5 ; 0x00d5 textpointer BackUpIsBrokenText ; 0x00d6 @@ -283,7 +283,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0117 ; 0x0117 textpointer DrawCardsFromTheDeckText ; 0x0118 textpointer CannotDrawCardBecauseNoCardsInDeckText ; 0x0119 - textpointer Text011a ; 0x011a + textpointer ChoosePkmnInTheBenchToGiveDamageText ; 0x011a textpointer Text011b ; 0x011b textpointer Text011c ; 0x011c textpointer Text011d ; 0x011d @@ -306,20 +306,20 @@ TextOffsets:: ; 34000 (d:4000) textpointer ChooseABellsproutFromDeckText ; 0x012e textpointer ChooseABellsproutText ; 0x012f textpointer ChoosePkmnToRemoveDamageCounterText ; 0x0130 - textpointer Text0131 ; 0x0131 - textpointer Text0132 ; 0x0132 - textpointer Text0133 ; 0x0133 - textpointer Text0134 ; 0x0134 - textpointer Text0135 ; 0x0135 - textpointer Text0136 ; 0x0136 - textpointer Text0137 ; 0x0137 - textpointer Text0138 ; 0x0138 - textpointer Text0139 ; 0x0139 + textpointer ProcedureForCurseText ; 0x0131 + textpointer Choose2EnergyCardsFromDiscardPileToAttachText ; 0x0132 + textpointer Choose2EnergyCardsFromDiscardPileForHandText ; 0x0133 + textpointer ChooseAnEnergyCardText ; 0x0134 + textpointer ProcedureForProphecyText ; 0x0135 + textpointer ChooseTheOrderOfTheCardsText ; 0x0136 + textpointer ProcedureForDamageSwapText ; 0x0137 + textpointer ProcedureForDevolutionBeamText ; 0x0138 + textpointer ProcedureForStrangeBehaviorText ; 0x0139 textpointer Text013a ; 0x013a textpointer ThereIsNoInTheDeckText ; 0x013b textpointer WouldYouLikeToCheckTheDeckText ; 0x013c - textpointer Text013d ; 0x013d - textpointer Text013e ; 0x013e + textpointer PleaseSelectTheDeckText ; 0x013d + textpointer PleaseSelectThePlayAreaText ; 0x013e textpointer NidoranMNidoranFText ; 0x013f textpointer OddishText ; 0x0140 textpointer BellsproutText ; 0x0141 @@ -368,7 +368,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text016c ; 0x016c textpointer Text016d ; 0x016d textpointer Text016e ; 0x016e - textpointer Text016f ; 0x016f + textpointer WasPlacedInTheHandText ; 0x016f textpointer TheCardYouReceivedText ; 0x0170 textpointer YouReceivedTheseCardsText ; 0x0171 textpointer Text0172 ; 0x0172 @@ -379,9 +379,9 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0177 ; 0x0177 textpointer Text0178 ; 0x0178 textpointer Text0179 ; 0x0179 - textpointer Text017a ; 0x017a + textpointer PokemonDevolvedToText ; 0x017a textpointer ThereWasNoFireEnergyText ; 0x017b - textpointer Text017c ; 0x017c + textpointer YouCanSelectMoreCardsQuitText ; 0x017c textpointer Text017d ; 0x017d textpointer ThereWasNoEffectFromToxicText ; 0x017e textpointer ThereWasNoEffectFromPoisonText ; 0x017f @@ -389,7 +389,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ThereWasNoEffectFromParalysisText ; 0x0181 textpointer ThereWasNoEffectFromConfusionText ; 0x0182 textpointer ThereWasNoEffectFromPoisonConfusionText ; 0x0183 - textpointer Text0184 ; 0x0184 + textpointer ExchangedCardsInDuelistsHandText ; 0x0184 textpointer Text0185 ; 0x0185 textpointer Text0186 ; 0x0186 textpointer Text0187 ; 0x0187 diff --git a/src/wram.asm b/src/wram.asm index f4c1c363..c16fb56a 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -717,11 +717,10 @@ wNoItemSelectionMenuKeys:: ; cbd6 wCardPageExitKeys:: ; cbd7 ds $1 +; used to store function pointer for printing card order +; in card list reordering screen. wcbd8:: ; cbd8 - ds $1 - -wcbd9:: ; cbd9 - ds $1 + ds $2 ; in the hand or discard pile card screen, id of the text printed in the bottom-left box wCardListInfoBoxText:: ; cbda @@ -1685,7 +1684,13 @@ wce70:: ; ce70 wce71:: ; ce71 ds $1 - ds $a + ds $3 + +; stores the amount of cards that are being ordered. +wNumberOfCardsToOrder:: ; ce75 + ds $1 + + ds $6 ; used in CountPokemonIDInPlayArea wTempPokemonID_ce7c:: ; ce7c From 046cb28bde1c0d6716380f83e26df4a568d7691c Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Wed, 3 Jun 2020 15:03:24 +0100 Subject: [PATCH 36/45] Fighting attack effects --- src/constants/deck_ai_constants.asm | 26 +- src/data/effect_commands.asm | 84 ++-- src/engine/bank08.asm | 10 +- src/engine/effect_functions.asm | 587 +++++++++++++++++++++++++++- src/text/text1.asm | 4 +- src/text/text2.asm | 14 +- src/text/text_offsets.asm | 18 +- 7 files changed, 671 insertions(+), 72 deletions(-) diff --git a/src/constants/deck_ai_constants.asm b/src/constants/deck_ai_constants.asm index a0b87f73..a10729ca 100644 --- a/src/constants/deck_ai_constants.asm +++ b/src/constants/deck_ai_constants.asm @@ -54,8 +54,24 @@ AI_ENERGY_TRANS_TO_BENCH EQU $e ; moves energy cards away from Arena card ; used to know which AI routine to call in ; the AIAction pointer tables in AIDoAction const_def 1 - const AIACTION_DO_TURN ; $1 - const AIACTION_START_DUEL ; $2 - const AIACTION_FORCED_SWITCH ; $3 - const AIACTION_KO_SWITCH ; $4 - const AIACTION_TAKE_PRIZE ; $5 + const AIACTION_DO_TURN ; $1 + const AIACTION_START_DUEL ; $2 + const AIACTION_FORCED_SWITCH ; $3 + const AIACTION_KO_SWITCH ; $4 + const AIACTION_TAKE_PRIZE ; $5 + +; this bit is set when the AI decides to use Peek on their Prize cards, +; with the following bits deciding which one to Peek. That is: +; %10'0000 = first prize card +; %10'0001 = second prize card +; %10'0010 = third prize card +; etc... +AI_PEEK_TARGET_PRIZE_F EQU 6 +AI_PEEK_TARGET_PRIZE EQU 1 << AI_PEEK_TARGET_PRIZE_F +; this bit is set when the AI decides to use Peek on Player hand card, +; with the following bits deciding which one to Peek. That is: +; %1XXX XXXX, where XXX XXXX is the deck index of card chosen +AI_PEEK_TARGET_HAND_F EQU 7 +AI_PEEK_TARGET_HAND EQU 1 << AI_PEEK_TARGET_HAND_F +; all bits set means AI chose to look at Player's top deck card +AI_PEEK_TARGET_DECK EQU $ff diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index c5c97357..f4a7740c 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -174,7 +174,7 @@ ExeggutorBigEggsplosionEffectCommands: NidokingThrashEffectCommands: dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Thrash_ModifierEffect - dbw EFFECTCMDTYPE_AFTER_DAMAGE, Func_2c982 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Thrash_RecoilEffect dbw EFFECTCMDTYPE_AI, Thrash_AIEffect db $00 @@ -886,119 +886,119 @@ MewMysteryAttackEffectCommands: db $00 GeodudeStoneBarrageEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6052 - dbw EFFECTCMDTYPE_AI, $604a + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, StoneBarrage_MultiplierEffect + dbw EFFECTCMDTYPE_AI, StoneBarrage_AIEffect db $00 OnixHardenEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6075 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, OnixHardenEffect db $00 PrimeapeFurySwipesEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6083 - dbw EFFECTCMDTYPE_AI, $607b + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PrimeapeFurySwipes_MultiplierEffect + dbw EFFECTCMDTYPE_AI, PrimeapeFurySwipes_AIEffect db $00 PrimeapeTantrumEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6099 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, TantrumEffect db $00 MachampStrikesBackEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $60af + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, StrikesBackEffect db $00 KabutoKabutoArmorEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $60b1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, KabutoArmorEffect db $00 KabutopsAbsorbEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $60b3 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, AbsorbEffect db $00 CuboneSnivelEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $60cb + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SnivelEffect db $00 CuboneRageEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $60d7 - dbw EFFECTCMDTYPE_AI, $60d1 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, CuboneRage_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, CuboneRage_AIEffect db $00 MarowakBonemerangEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $60e8 - dbw EFFECTCMDTYPE_AI, $60e0 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Bonemerang_MultiplierEffect + dbw EFFECTCMDTYPE_AI, Bonemerang_AIEffect db $00 MarowakCallforFriendEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6100 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6194 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6110 - dbw EFFECTCMDTYPE_AI_SELECTION, $6177 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, MarowakCallForFamily_CheckDeckAndPlayArea + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MarowakCallForFamily_PutInPlayAreaEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, MarowakCallForFamily_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, MarowakCallForFamily_AISelectEffect db $00 MachokeKarateChopEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $61ba - dbw EFFECTCMDTYPE_AI, $61b4 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, KarateChop_DamageSubtractionEffect + dbw EFFECTCMDTYPE_AI, KarateChop_AIEffect db $00 MachokeSubmissionEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $61d1 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, SubmissionEffect db $00 GolemSelfdestructEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $61d7 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, GolemSelfdestructEffect db $00 GravelerHardenEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $61f6 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, GravelerHardenEffect db $00 RhydonRamEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6212 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $61fc - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $61fc + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Ram_RecoilSwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Ram_SelectSwitchEffect + dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, Ram_SelectSwitchEffect db $00 RhyhornLeerEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $621d + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LeerEffect db $00 HitmonleeStretchKickEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6231 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $625b - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $623c - dbw EFFECTCMDTYPE_AI_SELECTION, $6255 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, StretchKick_CheckBench + dbw EFFECTCMDTYPE_AFTER_DAMAGE, StretchKick_BenchDamageEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, StretchKick_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, StretchKick_AISelectEffect db $00 SandshrewSandAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $626b + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SandAttackEffect db $00 SandslashFurySwipesEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6279 - dbw EFFECTCMDTYPE_AI, $6271 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SandslashFurySwipes_MultiplierEffect + dbw EFFECTCMDTYPE_AI, SandslashFurySwipes_AIEffect db $00 DugtrioEarthquakeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $628f + dbw EFFECTCMDTYPE_AFTER_DAMAGE, EarthquakeEffect db $00 AerodactylPrehistoricPowerEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $629a + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PrehistoricPowerEffect db $00 MankeyPeekEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $629c - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $62b4 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Peek_OncePerTurnCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Peek_SelectEffect db $00 MarowakBoneAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $630f + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, BoneAttackEffect db $00 MarowakWailEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $631c - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6335 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Wail_BenchCheck + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Wail_FillBenchEffect db $00 ElectabuzzThundershockEffectCommands: diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm index d133fd14..fc81d90b 100644 --- a/src/engine/bank08.asm +++ b/src/engine/bank08.asm @@ -6824,7 +6824,7 @@ HandleAIPeek: ; 224e6 (8:64e6) ld a, 3 call Random or a - jr z, .check_player_prizes + jr z, .check_ai_prizes cp 2 jr c, .check_player_hand @@ -6833,10 +6833,10 @@ HandleAIPeek: ; 224e6 (8:64e6) call GetNonTurnDuelistVariable cp DECK_SIZE - 1 ret nc ; return if Player has one or no cards in Deck - ld a, $ff + ld a, AI_PEEK_TARGET_DECK jr .use_peek -.check_player_prizes +.check_ai_prizes ld a, DUELVARS_PRIZES call GetTurnDuelistVariable ld hl, wcda5 @@ -6861,7 +6861,7 @@ HandleAIPeek: ; 224e6 (8:64e6) ld a, c sub b ld [hl], a - ld a, $40 + ld a, AI_PEEK_TARGET_PRIZE add d jr .use_peek @@ -6876,7 +6876,7 @@ HandleAIPeek: ; 224e6 (8:64e6) call CountCardsInDuelTempList call ShuffleCards ld a, [wDuelTempList] - or $80 + or AI_PEEK_TARGET_HAND .use_peek push af diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index eccf79f3..3a4182f6 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -1892,7 +1892,7 @@ Thrash_ModifierEffect: ; 2c973 (b:4973) call AddToDamage ret -Func_2c982: ; 2c982 (b:4982) +Thrash_RecoilEffect: ; 2c982 (b:4982) ldh a, [hTemp_ffa0] or a ret nz @@ -6148,4 +6148,587 @@ MysteryAttack_RecoverEffect: ; 2e03e (b:603e) ret ; 0x2e04a - INCROM $2e04a, $30000 +StoneBarrage_AIEffect: ; 2e04a (b:604a) + ld a, 10 + lb de, 0, 100 + jp StoreAIDamageInfo +; 0x2e052 + +StoneBarrage_MultiplierEffect: ; 2e052 (b:6052) + xor a + ldh [hTemp_ffa0], a +.loop_coin_toss + ldtx de, FlipUntilFailAppears10DamageForEachHeadsText + xor a + call TossCoinATimes_BankB + jr nc, .tails + ld hl, hTemp_ffa0 + inc [hl] ; increase heads count + jr .loop_coin_toss + +.tails +; store resulting damage + ldh a, [hTemp_ffa0] + ld l, a + ld h, 10 + call HtimesL + ld de, wDamage + ld a, l + ld [de], a + inc de + ld a, h + ld [de], a + ret +; 0x2e075 + +OnixHardenEffect: ; 2e075 (b:6075) + ld a, SUBSTATUS1_HARDEN + call ApplySubstatus1ToDefendingCard + ret +; 0x2e07b + +PrimeapeFurySwipes_AIEffect: ; 2e07b (b:607b) + ld a, 60 / 2 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2e083 + +PrimeapeFurySwipes_MultiplierEffect: ; 2e083 (b:6083) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 3 + call TossCoinATimes_BankB + add a + call ATimes10 + call StoreDamageInfo + ret +; 0x2e099 + +TantrumEffect: ; 2e099 (b:6099) + ldtx de, IfTailsYourPokemonBecomesConfusedText + call TossCoin_BankB + ret c ; return if heads +; confuse Pokemon + ld a, $29 + ld [wLoadedMoveAnimation], a + call SwapTurn + call ConfusionEffect + call SwapTurn + ret +; 0x2e0af + +StrikesBackEffect: ; 2e0af (b:60af) + scf + ret +; 0x2e0b1 + +KabutoArmorEffect: ; 2e0b1 (b:60b1) + scf + ret +; 0x2e0b3 + +AbsorbEffect: ; 2e0b3 (b:60b3) + ld hl, wDealtDamage + ld a, [hli] + ld h, [hl] + ld l, a + srl h + rr l + bit 0, l + jr z, .rounded + ; round up to nearest 10 + ld de, 5 + add hl, de +.rounded + ld e, l + ld d, h + call ApplyAndAnimateHPRecovery + ret +; 0x2e0cb + +SnivelEffect: ; 2e0cb (b:60cb) + ld a, SUBSTATUS2_REDUCE_BY_20 + call ApplySubstatus2ToDefendingCard + ret +; 0x2e0d1 + +CuboneRage_AIEffect: ; 2e0d1 (b:60d1) + call CuboneRage_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2e0d7 + +CuboneRage_DamageBoostEffect: ; 2e0d7 (b:60d7) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + ret +; 0x2e0e0 + +Bonemerang_AIEffect: ; 2e0e0 (b:60e0) + ld a, 60 / 2 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2e0e8 + +Bonemerang_MultiplierEffect: ; 2e0e8 (b:60e8) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld e, a + add a ; a = 2 * heads + add e ; a = 3 * heads + call ATimes10 + call StoreDamageInfo + ret +; 0x2e100 + +; returns carry if can't add Pokemon from deck +MarowakCallForFamily_CheckDeckAndPlayArea: ; 2e100 (b:6100) + call CheckIfDeckIsEmpty + ret c ; no cards in deck + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2e110 + +MarowakCallForFamily_PlayerSelectEffect: ; 2e110 (b:6110) + ld a, $ff + ldh [hTemp_ffa0], a + + call CreateDeckCardList + ldtx hl, ChooseBasicFightingPokemonFromDeckText + ldtx bc, FightingPokemonDeckText + lb de, SEARCHEFFECT_BASIC_FIGHTING, $00 + call LookForCardInDeck + ret c + +; draw Deck list interface and print text + bank1call Func_5591 + ldtx hl, ChooseBasicFightingPokemonText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +.loop + bank1call DisplayCardList + jr c, .pressed_b + + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp FIGHTING + jr nz, .play_sfx ; is Fighting? + ld a, [wLoadedCard2Stage] + or a + jr nz, .play_sfx ; is Basic? + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + or a + ret + +.play_sfx + ; play SFX and loop back + call Func_3794 + jr .loop + +.pressed_b +; figure if Player can exit the screen without selecting, +; that is, if the Deck has no Basic Fighting Pokemon. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_b_press + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next + ld a, l + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard1Type] + cp FIGHTING + jr nz, .next ; found, go back to top loop + ld a, [wLoadedCard1Stage] + or a + jr z, .play_sfx ; found, go back to top loop +.next + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_b_press + +; no valid card in Deck, can safely exit screen + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2e177 + +MarowakCallForFamily_AISelectEffect: ; 2e177 (b:6177) + call CreateDeckCardList + ld hl, wDuelTempList +.loop_deck + ld a, [hli] + ldh [hTemp_ffa0], a + cp $ff + ret z ; none found + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp FIGHTING + jr nz, .loop_deck + ld a, [wLoadedCard2Stage] + or a + jr nz, .loop_deck +; found + ret +; 0x2e194 + +MarowakCallForFamily_PutInPlayAreaEffect: ; 2e194 (b:6194) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .shuffle + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .shuffle + ; display card on screen + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen +.shuffle + call Func_2c0bd + ret +; 0x2c1b4 + +KarateChop_AIEffect: ; 2e1b4 (b:61b4) + call KarateChop_DamageSubtractionEffect + jp SetMinMaxDamageSameAsDamage +; 0x2e1ba + +KarateChop_DamageSubtractionEffect: ; 2e1ba (b:61ba) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld e, a + ld hl, wDamage + ld a, [hl] + sub e + ld [hli], a + ld a, [hl] + sbc 0 + ld [hl], a + rla + ret nc +; cap it to 0 damage + xor a + call StoreDamageInfo + ret +; 0x2e1d1 + +SubmissionEffect: ; 2e1d1 (b:61d1) + ld a, 20 + call DealRecoilDamageToSelf + ret +; 0x2e1d7 + +GolemSelfdestructEffect: ; 2e1d7 (b:61d7) + ld a, 100 + call DealRecoilDamageToSelf + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + call SwapTurn + xor a + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2e1f6 + +GravelerHardenEffect: ; 2e1f6 (b:61f6) + ld a, SUBSTATUS1_HARDEN + call ApplySubstatus1ToDefendingCard + ret +; 0x2e1fc + +Ram_SelectSwitchEffect: ; 2e1fc (b:61fc) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr c, .no_bench + call DuelistSelectForcedSwitch + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +.no_bench + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2e212 + +Ram_RecoilSwitchEffect: ; 2e212 (b:6212) + ld a, 20 + call DealRecoilDamageToSelf + ldh a, [hTemp_ffa0] + call HandleSwitchDefendingPokemonEffect + ret +; 0x2e21d + +LeerEffect: ; 2e21d (b:621d) + ldtx de, IfHeadsOpponentCannotAttackText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $74 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS2_LEER + call ApplySubstatus2ToDefendingCard + ret +; 0x2e231 + +; return carry if opponent has no Bench Pokemon. +StretchKick_CheckBench: ; 2e231 (b:6231) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2e23c + +StretchKick_PlayerSelectEffect: ; 2e23c (b:623c) + ldtx hl, ChoosePkmnInTheBenchToGiveDamageText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2e255 + +StretchKick_AISelectEffect: ; 2e255 (b:6255) +; chooses Bench Pokemon with least amount of remaining HP + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2e25b + +StretchKick_BenchDamageEffect: ; 2e25b (b:625b) + call SwapTurn + ldh a, [hTemp_ffa0] + ld b, a + ld de, 20 + call DealDamageToPlayAreaPokemon + call SwapTurn + ret +; 0x2e26b + +SandAttackEffect: ; 2e26b (b:626b) + ld a, SUBSTATUS2_SAND_ATTACK + call ApplySubstatus2ToDefendingCard + ret +; 0x2e271 + +SandslashFurySwipes_AIEffect: ; 2e271 (b:6271) + ld a, 60 / 2 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2e279 + +SandslashFurySwipes_MultiplierEffect: ; 2e279 (b:6279) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 3 + call TossCoinATimes_BankB + add a + call ATimes10 + call StoreDamageInfo + ret +; 0x2e28f + +EarthquakeEffect: ; 2e28f (b:628f) + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + ret +; 0x2e29a + +PrehistoricPowerEffect: ; 2e29a (b:629a) + scf + ret +; 0x2e29c + +; returns carry if Pkmn Power can't be used. +Peek_OncePerTurnCheck: ; 2e29c (b:629c) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + and USED_PKMN_POWER_THIS_TURN + jr nz, .already_used + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret +.already_used + ldtx hl, OnlyOncePerTurnText + scf + ret +; 0x2e2b4 + +Peek_SelectEffect: ; 2e2b4 (b:62b4) +; set Pkmn Power used flag + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + + ld a, DUELVARS_DUELIST_TYPE + call GetTurnDuelistVariable + cp DUELIST_TYPE_LINK_OPP + jr z, .link_opp + and DUELIST_TYPE_AI_OPP + jr nz, .ai_opp + +; player + call Func_3b31 + call Func_30e7 + ldh [hAIPkmnPowerEffectParam], a + call SerialSend8Bytes + ret + +.link_opp + call SerialRecv8Bytes + ldh [hAIPkmnPowerEffectParam], a + +.ai_opp + ldh a, [hAIPkmnPowerEffectParam] + bit AI_PEEK_TARGET_HAND_F, a + jr z, .prize_or_deck + and ~AI_PEEK_TARGET_HAND ; unset bit to get deck index +; if masked value is higher than $40, then it means +; that AI chose to look at Player's deck. +; all deck indices will be smaller than $40. + cp $40 + jr c, .hand + ldh a, [hAIPkmnPowerEffectParam] + jr .prize_or_deck + +.hand +; AI chose to look at random card in hand, +; so display it to the Player on screen. + call SwapTurn + ldtx hl, PeekWasUsedToLookInYourHandText + bank1call DisplayCardDetailScreen + call SwapTurn + ret + +.prize_or_deck +; AI chose either a prize card or Player's top deck card, +; so show Play Area and draw cursor appropriately. + call Func_3b31 + call SwapTurn + ldh a, [hAIPkmnPowerEffectParam] + xor $80 + call Func_30f9 + call SwapTurn + ldtx hl, CardPeekWasUsedOnText + call DrawWideTextBox_WaitForInput + ret +; 0x2e30f + +BoneAttackEffect: ; 2e30f (b:630f) + ldtx de, IfHeadsOpponentCannotAttackText + call TossCoin_BankB + ret nc + ld a, SUBSTATUS2_BONE_ATTACK + call ApplySubstatus2ToDefendingCard + ret +; 0x2e31c + +; return carry if neither Play Area +; has room for more Bench Pokemon. +Wail_BenchCheck: ; 2e31c (b:631c) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + cp MAX_PLAY_AREA_POKEMON + jr c, .no_carry + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp MAX_PLAY_AREA_POKEMON + jr c, .no_carry + ldtx hl, NoSpaceOnTheBenchText + scf + ret +.no_carry + or a + ret +; 0x2e335 + +Wail_FillBenchEffect: ; 2e335 (b:6335) + call SwapTurn + call .FillBench + call SwapTurn + call .FillBench + +; display both Play Areas + ldtx hl, BasicPokemonWasPlacedOnEachBenchText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + call SwapTurn + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + call SwapTurn + ret + +.FillBench ; 2e35a (b:635a) + call CreateDeckCardList + ret c + ld hl, wDuelTempList + call ShuffleCards + +; if no more space in the Bench, then return. +.check_bench + push hl + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + pop hl + cp MAX_PLAY_AREA_POKEMON + jr nc, .done + +; there's still space, so look for the next +; Basic Pokemon card to put in the Bench. +.loop + ld a, [hli] + ldh [hTempCardIndex_ff98], a + cp $ff + jr z, .done + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .loop ; is Pokemon card? + ld a, [wLoadedCard2Stage] + or a + jr nz, .loop ; is Basic? +; place card in Bench + push hl + ldh a, [hTempCardIndex_ff98] + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + pop hl + jr .check_bench + +.done + call Func_2c0bd + ret +; 0x2e399 + + INCROM $2e399, $30000 diff --git a/src/text/text1.asm b/src/text/text1.asm index e1985c1b..031befbd 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -1073,7 +1073,7 @@ VenomPowderCheckText: ; 37cdf (d:7cdf) line "opponent is Poisoned & Confused." done -Text00e5: ; 37d1f (d:7d1f) +IfTailsYourPokemonBecomesConfusedText: ; 37d1f (d:7d1f) text "If Tails, your Pokémon" line "becomes Confused." done @@ -1088,7 +1088,7 @@ Text00e7: ; 37d70 (d:7d70) line "Draw 1 card from Deck!" done -Text00e8: ; 37d92 (d:7d92) +FlipUntilFailAppears10DamageForEachHeadsText: ; 37d92 (d:7d92) text "Flip until Tails appears." line "10 damage for each Heads!!!" done diff --git a/src/text/text2.asm b/src/text/text2.asm index 90e405fc..d6a982bc 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -32,7 +32,7 @@ IfHeadsDoNotReceiveDamageOrEffectText: ; 38124 (e:4124) line "or effect of opponent's next Attack!" done -Text00fc: ; 3816a (e:416a) +IfHeadsOpponentCannotAttackText: ; 3816a (e:416a) text "If Heads, opponent cannot Attack" line "next turn!" done @@ -237,7 +237,7 @@ ChooseAttackOpponentWillNotBeAbleToUseText: ; 38955 (e:4955) line "not be able to use on the next turn." done -Text0125: ; 3899f (e:499f) +ChooseBasicFightingPokemonFromDeckText: ; 3899f (e:499f) text "Choose a Basic Fighting Pokémon" line "from the Deck." done @@ -270,7 +270,7 @@ ChooseNidoranText: ; 38a61 (e:4a61) line "or a Nidoran♂." done -Text012c: ; 38a83 (e:4a83) +ChooseBasicFightingPokemonText: ; 38a83 (e:4a83) text "Choose a Basic" line "Fighting Pokémon" done @@ -441,7 +441,7 @@ KrabbyText: ; 392f0 (e:52f0) text "Krabby" done -Text0143: ; 392f8 (e:52f8) +FightingPokemonDeckText: ; 392f8 (e:52f8) text "Fighting Pokémon" done @@ -449,12 +449,12 @@ Text0144: ; 3930a (e:530a) text "Basic Energy" done -Text0145: ; 39318 (e:5318) +PeekWasUsedToLookInYourHandText: ; 39318 (e:5318) text "Peek was used to look at the" line " in your Hand." done -Text0146: ; 39346 (e:5346) +CardPeekWasUsedOnText: ; 39346 (e:5346) text "Card Peek was used on" done @@ -468,7 +468,7 @@ WasChosenForTheEffectOfAmnesiaText: ; 39392 (e:5392) line "for the effect of Amnesia." done -Text0149: ; 393bb (e:53bb) +BasicPokemonWasPlacedOnEachBenchText: ; 393bb (e:53bb) text "A Basic Pokémon was placed" line "on each Bench." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index f4ceceec..728a1102 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -230,10 +230,10 @@ TextOffsets:: ; 34000 (d:4000) textpointer PoisonCheckText ; 0x00e2 textpointer ConfusionCheckText ; 0x00e3 textpointer VenomPowderCheckText ; 0x00e4 - textpointer Text00e5 ; 0x00e5 + textpointer IfTailsYourPokemonBecomesConfusedText ; 0x00e5 textpointer DamageCheckIfTailsNoDamageText ; 0x00e6 textpointer Text00e7 ; 0x00e7 - textpointer Text00e8 ; 0x00e8 + textpointer FlipUntilFailAppears10DamageForEachHeadsText ; 0x00e8 textpointer IfHeadPlus10IfTails10ToYourselfText ; 0x00e9 textpointer DamageToOppBenchIfHeadsDamageToYoursIfTailsText ; 0x00ea textpointer IfHeadsChangeOpponentsActivePokemonText ; 0x00eb @@ -253,7 +253,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer PokemonsSleepCheckText ; 0x00f9 textpointer PoisonedIfHeadsConfusedIfTailsText ; 0x00fa textpointer IfHeadsDoNotReceiveDamageOrEffectText ; 0x00fb - textpointer Text00fc ; 0x00fc + textpointer IfHeadsOpponentCannotAttackText ; 0x00fc textpointer AttackUnsuccessfulText ; 0x00fd textpointer UnableToRetreatDueToAcidText ; 0x00fe textpointer UnableToUseTrainerDueToHeadacheText ; 0x00ff @@ -294,14 +294,14 @@ TextOffsets:: ; 34000 (d:4000) textpointer ChooseAKrabbyFromDeckText ; 0x0122 textpointer ChooseDiscardEnergyCardFromOpponentText ; 0x0123 textpointer ChooseAttackOpponentWillNotBeAbleToUseText ; 0x0124 - textpointer Text0125 ; 0x0125 + textpointer ChooseBasicFightingPokemonFromDeckText ; 0x0125 textpointer ChooseAnOddishFromDeckText ; 0x0126 textpointer ChooseAnOddishText ; 0x0127 textpointer ChooseAKrabbyText ; 0x0128 textpointer Text0129 ; 0x0129 textpointer ChooseNidoranFromDeckText ; 0x012a textpointer ChooseNidoranText ; 0x012b - textpointer Text012c ; 0x012c + textpointer ChooseBasicFightingPokemonText ; 0x012c textpointer ProcedureForEnergyTransferText ; 0x012d textpointer ChooseABellsproutFromDeckText ; 0x012e textpointer ChooseABellsproutText ; 0x012f @@ -324,13 +324,13 @@ TextOffsets:: ; 34000 (d:4000) textpointer OddishText ; 0x0140 textpointer BellsproutText ; 0x0141 textpointer KrabbyText ; 0x0142 - textpointer Text0143 ; 0x0143 + textpointer FightingPokemonDeckText ; 0x0143 textpointer Text0144 ; 0x0144 - textpointer Text0145 ; 0x0145 - textpointer Text0146 ; 0x0146 + textpointer PeekWasUsedToLookInYourHandText ; 0x0145 + textpointer CardPeekWasUsedOnText ; 0x0146 textpointer Text0147 ; 0x0147 textpointer WasChosenForTheEffectOfAmnesiaText ; 0x0148 - textpointer Text0149 ; 0x0149 + textpointer BasicPokemonWasPlacedOnEachBenchText ; 0x0149 textpointer WasUnsuccessfulText ; 0x014a textpointer ThereWasNoEffectFromTxRam2Text ; 0x014b textpointer Text014c ; 0x014c From 75fa5549f3a5e7fe5a690454852559e6e1705cb1 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Thu, 4 Jun 2020 16:28:16 +0100 Subject: [PATCH 37/45] Lightning attack effects --- src/constants/charmaps.asm | 1 + src/constants/deck_ai_constants.asm | 3 +- src/constants/duel_constants.asm | 4 + src/data/effect_commands.asm | 106 +-- src/engine/bank05.asm | 22 +- src/engine/bank08.asm | 8 +- src/engine/effect_functions.asm | 1160 +++++++++++++++++++++++++-- src/engine/home.asm | 12 +- src/hram.asm | 19 +- src/text/text1.asm | 4 +- src/text/text2.asm | 12 +- src/text/text_offsets.asm | 16 +- src/wram.asm | 10 +- 13 files changed, 1227 insertions(+), 150 deletions(-) diff --git a/src/constants/charmaps.asm b/src/constants/charmaps.asm index baa3f462..f87e8416 100644 --- a/src/constants/charmaps.asm +++ b/src/constants/charmaps.asm @@ -94,6 +94,7 @@ ENDM fwcharmap 3, "ï¼¼", $98 fwcharmap 3, "â”�", $99 fwcharmap 3, "|", $9a + fwcharmap 3, " ", $9c fwcharmap 3, "!", $9d fwcharmap 3, "#", $9f fwcharmap 3, "$", $a0 diff --git a/src/constants/deck_ai_constants.asm b/src/constants/deck_ai_constants.asm index a10729ca..52b0283e 100644 --- a/src/constants/deck_ai_constants.asm +++ b/src/constants/deck_ai_constants.asm @@ -42,7 +42,8 @@ AI_ENERGY_FLAG_SKIP_ARENA_CARD EQU 1 << 7 ; whether to include Arena card in det ; used by wAIBarrierFlagCounter to determine ; whether Player is running Mewtwo1 mill deck. ; flag set means true, flag not set means false. -AI_FLAG_MEWTWO_MILL EQU 1 << 7 +AI_MEWTWO_MILL_F EQU 7 +AI_MEWTWO_MILL EQU 1 << AI_MEWTWO_MILL_F ; defines the behaviour of HandleAIEnergyTrans, for determining ; whether to move energy cards from the Bench to the Arena or vice-versa diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 028cc10f..a9ff54b3 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -178,6 +178,10 @@ CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F HAS_CHANGED_COLOR_F EQU 7 HAS_CHANGED_COLOR EQU 1 << HAS_CHANGED_COLOR_F +; flag in wDamage + 1 that indicates +; whether damage is unaffected by Weakness/Resistance +UNAFFECTED_BY_WEAKNESS_RESISTANCE_F EQU 7 + ; effect command constants (TryExecuteEffectCommandFunction) ; ordered by (roughly) execution time EFFECTCMDTYPE_INITIAL_EFFECT_1 EQU $01 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index f4a7740c..508d80bf 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -200,7 +200,7 @@ NidoranFCallForFamilyEffectCommands: db $00 NidoranMHornHazardEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HornHazard_Failure50PercentEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HornHazard_Success50PercentEffect dbw EFFECTCMDTYPE_AI, HornHazard_AIEffect db $00 @@ -613,7 +613,7 @@ MoltresWildfireEffectCommands: db $00 Moltres1DiveBombEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres1DiveBomb_Failure50PercentEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres1DiveBomb_Success50PercentEffect dbw EFFECTCMDTYPE_AI, Moltres1DiveBomb_AIEffect db $00 @@ -687,7 +687,7 @@ MoltresFiregiverEffectCommands: db $00 Moltres2DiveBombEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres2DiveBomb_Failure50PercentEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Moltres2DiveBomb_Success50PercentEffect dbw EFFECTCMDTYPE_AI, Moltres2DiveBomb_AIEffect db $00 @@ -841,7 +841,7 @@ SlowbroPsyshockEffectCommands: SlowpokeSpacingOutEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SpacingOut_CheckDamage - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SpacingOut_Failure50PercentEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SpacingOut_Success50PercentEffect dbw EFFECTCMDTYPE_AFTER_DAMAGE, SpacingOut_HealEffect db $00 @@ -1006,18 +1006,18 @@ ElectabuzzThundershockEffectCommands: db $00 ElectabuzzThunderpunchEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $63a1 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $63b0 - dbw EFFECTCMDTYPE_AI, $6399 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Thunderpunch_ModifierEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Thunderpunch_RecoilEffect + dbw EFFECTCMDTYPE_AI, Thunderpunch_AIEffect db $00 ElectabuzzLightScreenEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $63ba + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LightScreenEffect db $00 ElectabuzzQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $63c8 - dbw EFFECTCMDTYPE_AI, $63c0 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ElectabuzzQuickAttack_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, ElectabuzzQuickAttack_AIEffect db $00 MagnemiteThunderWaveEffectCommands: @@ -1025,30 +1025,30 @@ MagnemiteThunderWaveEffectCommands: db $00 MagnemiteSelfdestructEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $63db + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MagnemiteSelfdestructEffect db $00 ZapdosThunderEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $63fa - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6409 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ZapdosThunder_Recoil50PercentEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ZapdosThunder_RecoilEffect db $00 ZapdosThunderboltEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6419 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ThunderboltEffect db $00 ZapdosThunderstormEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6429 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ThunderstormEffect db $00 JolteonQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $64c3 - dbw EFFECTCMDTYPE_AI, $64bb + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, JolteonQuickAttack_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, JolteonQuickAttack_AIEffect db $00 JolteonPinMissileEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $64de - dbw EFFECTCMDTYPE_AI, $64d6 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PinMissile_MultiplierEffect + dbw EFFECTCMDTYPE_AI, PinMissile_AIEffect db $00 FlyingPikachuThundershockEffectCommands: @@ -1056,23 +1056,23 @@ FlyingPikachuThundershockEffectCommands: db $00 FlyingPikachuFlyEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $64fc - dbw EFFECTCMDTYPE_AI, $64f4 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Fly_Success50PercentEffect + dbw EFFECTCMDTYPE_AI, Fly_AIEffect db $00 PikachuThunderJoltEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $651a - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6529 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ThunderJolt_Recoil50PercentEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ThunderJolt_RecoilEffect db $00 PikachuSparkEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6574 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6539 - dbw EFFECTCMDTYPE_AI_SELECTION, $6562 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Spark_BenchDamageEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Spark_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Spark_AISelectEffect db $00 Pikachu3GrowlEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6589 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Pikachu3GrowlEffect db $00 Pikachu3ThundershockEffectCommands: @@ -1080,7 +1080,7 @@ Pikachu3ThundershockEffectCommands: db $00 Pikachu4GrowlEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $658f + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Pikachu4GrowlEffect db $00 Pikachu4ThundershockEffectCommands: @@ -1088,22 +1088,22 @@ Pikachu4ThundershockEffectCommands: db $00 ElectrodeChainLightningEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6595 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ChainLightningEffect db $00 RaichuAgilityEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $65dc + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, RaichuAgilityEffect db $00 RaichuThunderEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $65ee - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $65fd + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, RaichuThunder_Recoil50PercentEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, RaichuThunder_RecoilEffect db $00 RaichuGigashockEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $671f - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $660d - dbw EFFECTCMDTYPE_AI_SELECTION, $66c3 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Gigashock_BenchDamageEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Gigashock_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Gigashock_AISelectEffect db $00 MagnetonThunderWaveEffectCommands: @@ -1111,48 +1111,48 @@ MagnetonThunderWaveEffectCommands: db $00 Magneton1SelfdestructEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6739 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Magneton1SelfdestructEffect db $00 MagnetonSonicboomEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6758 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $675e - dbw EFFECTCMDTYPE_AI, $6758 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MagnetonSonicboom_UnaffectedByColorEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MagnetonSonicboom_NullEffect + dbw EFFECTCMDTYPE_AI, MagnetonSonicboom_UnaffectedByColorEffect db $00 Magneton2SelfdestructEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $675f + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Magneton2SelfdestructEffect db $00 ZapdosPealOfThunderEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $677e - dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, $6780 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PealOfThunder_InitialEffect + dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, PealOfThunder_RandomlyDamageEffect db $00 ZapdosBigThunderEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $67cb + dbw EFFECTCMDTYPE_AFTER_DAMAGE, BigThunderEffect db $00 MagnemiteMagneticStormEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $67d5 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MagneticStormEffect db $00 ElectrodeSonicboomEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6870 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6876 - dbw EFFECTCMDTYPE_AI, $6870 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ElectrodeSonicboom_UnaffectedByColorEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ElectrodeSonicboom_NullEffect + dbw EFFECTCMDTYPE_AI, ElectrodeSonicboom_UnaffectedByColorEffect db $00 ElectrodeEnergySpikeEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6877 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $68f6 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $687b - dbw EFFECTCMDTYPE_AI_SELECTION, $68f1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergySpike_DeckCheck + dbw EFFECTCMDTYPE_AFTER_DAMAGE, EnergySpike_AttachEnergyEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, EnergySpike_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, EnergySpike_AISelectEffect db $00 JolteonDoubleKickEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6938 - dbw EFFECTCMDTYPE_AI, $6930 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, JolteonDoubleKick_MultiplierEffect + dbw EFFECTCMDTYPE_AI, JolteonDoubleKick_AIEffect db $00 JolteonStunNeedleEffectCommands: diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 708bfd93..08551315 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -866,11 +866,9 @@ _CalculateDamage_VersusDefendingPokemon: ; 14462 (5:4462) ldh a, [hTempPlayAreaLocation_ff9d] or a call z, HandleDoubleDamageSubstatus - ; skips the weak/res checks if bit 7 is set - ; I guess to avoid overflowing? - ; should probably just have skipped weakness test instead? - bit 7, d - res 7, d + ; skips the weak/res checks if unaffected. + bit UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, d + res UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, d jr nz, .not_resistant ; handle weakness @@ -1083,8 +1081,8 @@ CalculateDamage_FromDefendingPokemon: ; 1458c (5:458c) call SwapTurn call HandleDoubleDamageSubstatus - bit 7, d - res 7, d + bit UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, d + res UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, d jr nz, .not_resistant ; handle weakness @@ -1339,7 +1337,7 @@ InitAITurnVars: ; 15649 (5:5649) ; check if flag was already set, if so, ; reset wAIBarrierFlagCounter to $80. ld a, [wAIBarrierFlagCounter] - bit 7, a + bit AI_MEWTWO_MILL_F, a jr nz, .set_flag ; if not, increase it by 1 and check if it exceeds 2. @@ -1369,14 +1367,14 @@ InitAITurnVars: ; 15649 (5:5649) jr .done .set_flag - ld a, AI_FLAG_MEWTWO_MILL + 0 + ld a, AI_MEWTWO_MILL ld [wAIBarrierFlagCounter], a jr .done .check_flag ; increase counter by 1 if flag is set ld a, [wAIBarrierFlagCounter] - bit 7, a + bit AI_MEWTWO_MILL_F, a jr z, .reset_2 inc a ld [wAIBarrierFlagCounter], a @@ -4089,7 +4087,7 @@ AIProcessEnergyCards: ; 164fc (5:64fc) ; arena ld a, [wAIBarrierFlagCounter] - bit 7, a + bit AI_MEWTWO_MILL_F, a jr z, .add_to_score ; subtract from score instead @@ -5019,7 +5017,7 @@ AIProcessAttacks: ; 169fc (5:69fc) ; if Player is running Mewtwo1 mill deck, ; skip attack if Barrier counter is 0. ld a, [wAIBarrierFlagCounter] - cp AI_FLAG_MEWTWO_MILL + 0 + cp AI_MEWTWO_MILL + 0 jp z, .dont_attack ; determine AI score of both attacks. diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm index fc81d90b..5360e259 100644 --- a/src/engine/bank08.asm +++ b/src/engine/bank08.asm @@ -4626,7 +4626,7 @@ AIDecide_Gambler: ; 21875 (8:5875) ; check if flag is set for Player using Mewtwo1 only deck ld a, [wAIBarrierFlagCounter] - and AI_FLAG_MEWTWO_MILL + and AI_MEWTWO_MILL jr z, .no_carry ; set carry if number of cards in deck <= 4. @@ -6637,7 +6637,7 @@ HandleAIHeal: ; 22402 (8:6402) ld a, OPPACTION_USE_PKMN_POWER bank1call AIMakeDecision pop af - ldh [hAIHealCard], a + ldh [hPkmnPowerPlayAreaTarget], a ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT bank1call AIMakeDecision ld a, OPPACTION_DUEL_MAIN_SCENE @@ -7380,12 +7380,12 @@ CheckIfPlayerHasPokemonOtherThanMewtwo1: ; 227a9 (8:67a9) HandleAIAntiMewtwoDeckStrategy: ; 227d3 (8:67d3) ; return carry if Player is not playing Mewtwo1 mill deck ld a, [wAIBarrierFlagCounter] - bit 7, a + bit AI_MEWTWO_MILL_F, a jr z, .set_carry ; else, check if there's been less than 2 turns ; without the Player using Barrier. - cp AI_FLAG_MEWTWO_MILL + 2 + cp AI_MEWTWO_MILL + 2 jr c, .count_bench ; if there has been, reset wAIBarrierFlagCounter diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 3a4182f6..70817c08 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -228,7 +228,7 @@ DealDamageToAllBenchedPokemon: ; 2c117 (b:4117) jr .skip_to_bench .loop push bc - call DealDamageToPlayAreaPokemon + call DealDamageToPlayAreaPokemon_RegularAnim pop bc .skip_to_bench inc b @@ -311,7 +311,7 @@ PickRandomPlayAreaCard: ; 2c17e (b:417e) ; 0x2c188 ; outputs in hl the current position -; in hTempCardList list to place a new card. +; in hTempList list to place a new card. GetCurPositionInTempList: ; 2c188 (b:4188) push de ld hl, hEffectItemSelection @@ -319,7 +319,7 @@ GetCurPositionInTempList: ; 2c188 (b:4188) inc [hl] ld e, a ld d, $00 - ld hl, hTempCardList + ld hl, hTempList add hl, de pop de ret @@ -1429,7 +1429,14 @@ PlayAreaSelectionMenuParameters: ; 2c6e0 (b:46e0) dw $0000 ; function pointer if non-0 ; 0x2c6e8 - INCROM $2c6e8, $2c6f0 +BenchSelectionMenuParameters: ; 2c6e8 (b:46e8) + db 0, 3 ; cursor x, cursor y + db 3 ; y displacement between items + db MAX_PLAY_AREA_POKEMON ; number of items + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw $0000 ; function pointer if non-0 +; 0x2c6f0 SpitPoison_AIEffect: ; 2c6f0 (b:46f0) ld a, 10 / 2 @@ -2077,7 +2084,7 @@ HornHazard_AIEffect: ; 2ca8e (b:4a8e) jp StoreAIDamageInfo ; 0x2ca96 -HornHazard_Failure50PercentEffect: ; 2ca96 (b:4a96) +HornHazard_Success50PercentEffect: ; 2ca96 (b:4a96) ldtx de, DamageCheckIfTailsNoDamageText call TossCoin_BankB jr c, .heads @@ -3631,7 +3638,7 @@ IceBreath_RandomPokemonDamageEffect: ; 2d32e (b:532e) call PickRandomPlayAreaCard ld b, a ld de, 40 - call DealDamageToPlayAreaPokemon + call DealDamageToPlayAreaPokemon_RegularAnim call SwapTurn ret ; 0x2d33f @@ -3651,14 +3658,14 @@ PlayerPickFireEnergyCardToDiscard: ; 2d34b (b:534b) bank1call DisplayEnergyDiscardScreen bank1call HandleEnergyDiscardMenuInput ldh a, [hTempCardIndex_ff98] - ldh [hTempCardList], a + ldh [hTempList], a ret ; 0x2d35a AIPickFireEnergyCardToDiscard: ; 2d35a (b:535a) call CreateListOfFireEnergyAttachedToArena ld a, [wDuelTempList] - ldh [hTempCardList], a ; pick first in list + ldh [hTempList], a ; pick first in list ret ; 0x2d363 @@ -3683,7 +3690,7 @@ ArcanineFlamethrower_AISelectEffect: ; 2d375 (b:5375) ; 0x2d379 ArcanineFlamethrower_DiscardEffect: ; 2d379 (b:5379) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d37f @@ -3747,14 +3754,14 @@ FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) FlamesOfRage_AISelectEffect: ; 2d3d5 (b:53d5) call AIPickFireEnergyCardToDiscard ld a, [wDuelTempList + 1] - ldh [hTempCardList + 1], a + ldh [hTempList + 1], a ret ; 0x2d3de FlamesOfRage_DiscardEffect: ; 2d3de (b:53de) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile - ldh a, [hTempCardList + 1] + ldh a, [hTempList + 1] call PutCardInDiscardPile ret ; 0x2d3e9 @@ -3861,7 +3868,7 @@ FireBlast_AISelectEffect: ; 2d475 (b:5475) ; 0x2d479 FireBlast_DiscardEffect: ; 2d479 (b:5479) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d47f @@ -3887,7 +3894,7 @@ Ember_AISelectEffect: ; 2d491 (b:5491) ; 0x2d495 Ember_DiscardEffect: ; 2d495 (b:5495) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d49b @@ -3943,7 +3950,7 @@ Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) Wildfire_AISelectEffect: ; 2d4dd (b:54dd) ; AI always chooses 0 cards to discard xor a - ldh [hTempCardList], a + ldh [hTempList], a ret ; 0x2d4e1 @@ -4009,7 +4016,7 @@ Moltres1DiveBomb_AIEffect: ; 2d523 (b:5523) jp StoreAIDamageInfo ; 0x2d52b -Moltres1DiveBomb_Failure50PercentEffect: ; 2d52b (b:552b) +Moltres1DiveBomb_Success50PercentEffect: ; 2d52b (b:552b) ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText call TossCoin_BankB jr c, .heads @@ -4062,7 +4069,7 @@ FlareonFlamethrower_AISelectEffect: ; 2d56e (b:556e) ; 0x2d572 FlareonFlamethrower_DiscardEffect: ; 2d572 (b:5572) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d578 @@ -4088,7 +4095,7 @@ MagmarFlamethrower_AISelectEffect: ; 2d58a (b:558a) ; 0x2d58e MagmarFlamethrower_DiscardEffect: ; 2d58e (b:558e) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d594 @@ -4126,7 +4133,7 @@ CharmeleonFlamethrower_AISelectEffect: ; 2d5b4 (b:55b4) ; 0x2d5b8 CharmeleonFlamethrower_DiscardEffect: ; 2d5b8 (b:55b8) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d5be @@ -4186,14 +4193,14 @@ FireSpin_AISelectEffect: ; 2d606 (b:5606) call CreateArenaOrBenchEnergyCardList ld hl, wDuelTempList ld a, [hli] - ldh [hTempCardList], a + ldh [hTempList], a ld a, [hl] - ldh [hTempCardList + 1], a + ldh [hTempList + 1], a ret ; 0x2d614 FireSpin_DiscardEffect: ; 2d614 (b:5614) - ld hl, hTempCardList + ld hl, hTempList ld a, [hli] call PutCardInDiscardPile ld a, [hli] @@ -4454,7 +4461,7 @@ Moltres2DiveBomb_AIEffect: ; 2d76e (b:576e) jp StoreAIDamageInfo ; 0x2d776 -Moltres2DiveBomb_Failure50PercentEffect: ; 2d776 (b:5776) +Moltres2DiveBomb_Success50PercentEffect: ; 2d776 (b:5776) ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText call TossCoin_BankB jr c, .heads @@ -4514,7 +4521,7 @@ GetEnergyAttachedMultiplierDamage: ; 2d78c (b:578c) ; for Player to select from. ; the Player can select up to 2 cards from the list. ; these cards are given in $ff-terminated list -; in hTempCardList. +; in hTempList. HandleEnergyCardsInDiscardPileSelection: ; 2d7bc (b:57bc) push hl xor a @@ -4696,7 +4703,7 @@ Curse_PlayerSelectEffect: ; 2d834 (b:5834) Curse_TransferDamageEffect: ; 2d8bb (b:58bb) ; set Pkmn Power as used - ldh a, [hTempCardList] + ldh a, [hTempList] add DUELVARS_ARENA_CARD_FLAGS_C2 call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] @@ -4788,7 +4795,7 @@ GengarDarkMind_DamageBenchEffect: ; 2d93c (b:593c) call SwapTurn ld b, a ld de, 10 - call DealDamageToPlayAreaPokemon + call DealDamageToPlayAreaPokemon_RegularAnim call SwapTurn ret ; 0x2d94f @@ -4817,7 +4824,7 @@ DestinyBond_PlayerSelectEffect: ; 2d964 (b:5964) bank1call HandleEnergyDiscardMenuInput ret c ldh a, [hTempCardIndex_ff98] - ldh [hTempCardList], a + ldh [hTempList], a ret ; 0x2d976 @@ -4826,12 +4833,12 @@ DestinyBond_AISelectEffect: ; 2d976 (b:5976) ld a, TYPE_ENERGY_PSYCHIC call CreateListOfEnergyAttachedToArena ld a, [wDuelTempList] - ldh [hTempCardList], a + ldh [hTempList], a ret ; 0x2d981 DestinyBond_DiscardEffect: ; 2d981 (b:5981) - ldh a, [hTempCardList] + ldh a, [hTempList] call PutCardInDiscardPile ret ; 0x2d987 @@ -4858,7 +4865,7 @@ EnergyConversion_PlayerSelectEffect: ; 2d994 (b:5994) EnergyConversion_AISelectEffect: ; 2d99b (b:599b) call CreateEnergyCardListFromDiscardPile_OnlyBasic ld hl, wDuelTempList - ld de, hTempCardList + ld de, hTempList ld c, 2 ; select the first two energy cards found in Discard Pile .loop @@ -4883,7 +4890,7 @@ EnergyConversion_AddToHandEffect: ; 2d9b4 (b:59b4) ; loop cards that were chosen ; until $ff is reached, ; and move them to the hand. - ld hl, hTempCardList + ld hl, hTempList ld de, wDuelTempList .loop_cards ld a, [hli] @@ -4951,7 +4958,7 @@ Prophecy_PlayerSelectEffect: ; 2da00 (b:5a00) jr nz, Prophecy_PlayerSelectEffect ; loop back to start ldh a, [hCurMenuItem] - ldh [hTempCardList], a ; store selection in first position in list + ldh [hTempList], a ; store selection in first position in list or a jr z, .turn_duelist @@ -4983,7 +4990,7 @@ Prophecy_AISelectEffect: ; 2da3c (b:5a3c) ; 0x2da41 Prophecy_ReorderDeckEffect: ; 2da41 (b:5a41) - ld hl, hTempCardList + ld hl, hTempList ld a, [hli] or a jr z, .ReorderCards ; turn duelist's deck @@ -5028,7 +5035,7 @@ Prophecy_ReorderDeckEffect: ; 2da41 (b:5a41) ; draw and handle Player selection for reordering ; the top 3 cards of Deck. -; the resulting list is output in order in hTempCardList. +; the resulting list is output in order in hTempList. HandleProphecyScreen: ; 2da76 (b:5a76) ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK call GetTurnDuelistVariable @@ -5117,7 +5124,7 @@ HandleProphecyScreen: ; 2da76 (b:5a76) call YesOrNoMenuWithText_LeftAligned jr c, .start ; if not, return back to beginning of selection -; write in hTempCardList the card list +; write in hTempList the card list ; in order that was selected. ld hl, wDuelTempList + 10 ld de, wDuelTempList @@ -5130,7 +5137,7 @@ HandleProphecyScreen: ; 2da76 (b:5a76) push bc ld c, a ld b, $00 - ld hl, hTempCardList + ld hl, hTempList add hl, bc ld a, [de] ld [hl], a @@ -5139,12 +5146,12 @@ HandleProphecyScreen: ; 2da76 (b:5a76) inc de inc c jr .loop_order -; now hTempCardList has the list of card deck indices +; now hTempList has the list of card deck indices ; in the order selected to be place on top of the deck. .done ld b, $00 - ld hl, hTempCardList + 1 + ld hl, hTempList + 1 add hl, bc ld [hl], $ff ; terminating byte or a @@ -5218,7 +5225,7 @@ HypnoDarkMind_DamageBenchEffect: ; 2db64 (b:5b64) call SwapTurn ld b, a ld de, 10 - call DealDamageToPlayAreaPokemon + call DealDamageToPlayAreaPokemon_RegularAnim call SwapTurn ret ; 0x2db77 @@ -5696,7 +5703,7 @@ Mewtwo3EnergyAbsorption_AISelectEffect: ; 2ddd3 (b:5dd3) ; AI picks first 2 energy cards call CreateEnergyCardListFromDiscardPile_OnlyBasic ld hl, wDuelTempList - ld de, hTempCardList + ld de, hTempList ld c, 2 .loop ld a, [hli] @@ -5713,7 +5720,7 @@ Mewtwo3EnergyAbsorption_AISelectEffect: ; 2ddd3 (b:5dd3) ; 0x2ddec Mewtwo3EnergyAbsorption_AddToHandEffect: ; 2ddec (b:5dec) - ld hl, hTempCardList + ld hl, hTempList .loop ld a, [hli] cp $ff @@ -5742,7 +5749,7 @@ Mewtwo2EnergyAbsorption_AISelectEffect: ; 2de0d (b:5e0d) ; AI picks first 2 energy cards call CreateEnergyCardListFromDiscardPile_OnlyBasic ld hl, wDuelTempList - ld de, hTempCardList + ld de, hTempList ld c, 2 .loop ld a, [hli] @@ -5759,7 +5766,7 @@ Mewtwo2EnergyAbsorption_AISelectEffect: ; 2de0d (b:5e0d) ; 0x2de26 Mewtwo2EnergyAbsorption_AddToHandEffect: ; 2de26 (b:5e26) - ld hl, hTempCardList + ld hl, hTempList .loop ld a, [hli] cp $ff @@ -5894,7 +5901,7 @@ SpacingOut_CheckDamage: ; 2ded5 (b:5ed5) ret ; 0x2dee0 -SpacingOut_Failure50PercentEffect: ; 2dee0 (b:5ee0) +SpacingOut_Success50PercentEffect: ; 2dee0 (b:5ee0) ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText call TossCoin_BankB ldh [hTemp_ffa0], a @@ -6523,7 +6530,7 @@ StretchKick_BenchDamageEffect: ; 2e25b (b:625b) ldh a, [hTemp_ffa0] ld b, a ld de, 20 - call DealDamageToPlayAreaPokemon + call DealDamageToPlayAreaPokemon_RegularAnim call SwapTurn ret ; 0x2e26b @@ -6611,7 +6618,7 @@ Peek_SelectEffect: ; 2e2b4 (b:62b4) ldh a, [hAIPkmnPowerEffectParam] bit AI_PEEK_TARGET_HAND_F, a jr z, .prize_or_deck - and ~AI_PEEK_TARGET_HAND ; unset bit to get deck index + and (~AI_PEEK_TARGET_HAND & $ff) ; unset bit to get deck index ; if masked value is higher than $40, then it means ; that AI chose to look at Player's deck. ; all deck indices will be smaller than $40. @@ -6731,4 +6738,1063 @@ Wail_FillBenchEffect: ; 2e335 (b:6335) ret ; 0x2e399 - INCROM $2e399, $30000 +Thunderpunch_AIEffect: ; 2e399 (b:6399) + ld a, (30 + 40) / 2 + lb de, 30, 40 + jp StoreAIDamageInfo +; 0x2e3a1 + +Thunderpunch_ModifierEffect: ; 2e3a1 (b:63a1) + ldtx de, IfHeadPlus10IfTails10ToYourselfText + call TossCoin_BankB + ldh [hTemp_ffa0], a + ret nc ; return if got tails + ld a, 10 + call AddToDamage + ret +; 0x2e3b0 + +Thunderpunch_RecoilEffect: ; 2e3b0 (b:63b0) + ldh a, [hTemp_ffa0] + or a + ret nz ; return if got heads + ld a, 10 + call DealRecoilDamageToSelf + ret +; 0x2e3ba + +LightScreenEffect: ; 2e3ba (b:63ba) + ld a, SUBSTATUS1_HALVE_DAMAGE + call ApplySubstatus1ToDefendingCard + ret +; 0x2e3c0 + +ElectabuzzQuickAttack_AIEffect: ; 2e3c0 (b:63c0) + ld a, (10 + 30) / 2 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2e3c8 + +ElectabuzzQuickAttack_DamageBoostEffect: ; 2e3c8 (b:63c8) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2e3db + +MagnemiteSelfdestructEffect: ; 2e3db (b:63db) + ld a, 40 + call DealRecoilDamageToSelf + + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + call SwapTurn + + xor a + ld [wIsDamageToSelf], a + ld a, 10 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2e3fa + +ZapdosThunder_Recoil50PercentEffect: ; 2e3fa (b:63fa) + ld hl, 30 + call LoadTxRam3 + ldtx de, IfTailsDamageToYourselfTooText + call TossCoin_BankB + ldh [hTemp_ffa0], a + ret +; 0x2e409 + +ZapdosThunder_RecoilEffect: ; 2e409 (b:6409) + ld hl, 30 + call LoadTxRam3 + ldh a, [hTemp_ffa0] + or a + ret nz ; return if got heads + ld a, 30 + call DealRecoilDamageToSelf + ret +; 0x2e419 + +ThunderboltEffect: ; 2e419 (b:6419) + xor a + call CreateArenaOrBenchEnergyCardList + ld hl, wDuelTempList +; put all energy cards in Discard Pile +.loop + ld a, [hli] + cp $ff + ret z + call PutCardInDiscardPile + jr .loop +; 0x2e429 + +ThunderstormEffect: ; 2e429 (b:6429) + ld a, 1 + ldh [hEffectItemSelection], a + + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + ld b, 0 + ld e, b + jr .next_pkmn + +.check_damage + push de + push bc + call .DisplayText + ld de, $0 + call SwapTurn + call TossCoin_BankB + call SwapTurn + push af + call GetCurPositionInTempList + pop af + ld [hl], a ; store result in list + pop bc + pop de + jr c, .next_pkmn + inc b ; increase number of tails + +.next_pkmn + inc e + dec c + jr nz, .check_damage + +; all coins were tossed for each Benched Pokemon + call GetCurPositionInTempList + ld [hl], $ff + ld a, b + ldh [hTemp_ffa0], a + call Func_3b21 + call SwapTurn + +; tally recoil damage + ldh a, [hTemp_ffa0] + or a + jr z, .skip_recoil + ; deal number of tails times 10 to self + call ATimes10 + call DealRecoilDamageToSelf +.skip_recoil + +; deal damage for Bench Pokemon that got heads + call SwapTurn + ld hl, hTempPlayAreaLocation_ffa1 + ld b, PLAY_AREA_BENCH_1 +.loop_bench + ld a, [hli] + cp $ff + jr z, .done + or a + jr z, .skip_damage ; skip if tails + ld de, 20 + call DealDamageToPlayAreaPokemon_RegularAnim +.skip_damage + inc b + jr .loop_bench + +.done + call SwapTurn + ret +; 0x2e491 + +; displays text for current Bench Pokemon, +; printing its Bench number and name. +.DisplayText ; 2e491 (b:6491) + ld b, e + ldtx hl, BenchText + ld de, wDefaultText + call CopyText + ld a, $30 ; 0 FW character + add b + ld [de], a + inc de + ld a, $20 ; space FW character + ld [de], a + inc de + + ld a, DUELVARS_ARENA_CARD + add b + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + ld hl, wLoadedCard2Name + ld a, [hli] + ld h, [hl] + ld l, a + call CopyText + + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2e4bb + +JolteonQuickAttack_AIEffect: ; 2e4bb (b:64bb) + ld a, (10 + 30) / 2 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2e4c3 + +JolteonQuickAttack_DamageBoostEffect: ; 2e4c3 (b:64c3) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2e3d6 + +PinMissile_AIEffect: ; 2e4d6 (b:64d6) + ld a, (20 * 4) / 2 + lb de, 0, 80 + jp StoreAIDamageInfo +; 0x2e4de + +PinMissile_MultiplierEffect: ; 2e4de (b:64de) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 4 + call TossCoinATimes_BankB + add a ; a = 2 * heads + call ATimes10 + call StoreDamageInfo + ret +; 0x2e4f4 + +Fly_AIEffect: ; 2e4f4 (b:64f4) + ld a, 30 / 2 + lb de, 0, 30 + jp StoreAIDamageInfo +; 0x2e4fc + +Fly_Success50PercentEffect: ; 2e4fc (b:64fc) + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + jr c, .heads + xor a + ld [wLoadedMoveAnimation], a + call StoreDamageInfo + call SetWasUnsuccessful + ret +.heads + ld a, $52 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_FLY + call ApplySubstatus1ToDefendingCard + ret +; 0x2e51a + +ThunderJolt_Recoil50PercentEffect: ; 2e51a (b:651a) + ld hl, 10 + call LoadTxRam3 + ldtx de, IfTailsDamageToYourselfTooText + call TossCoin_BankB + ldh [hTemp_ffa0], a + ret +; 0x2e529 + +ThunderJolt_RecoilEffect: ; 2e529 (b:6529) + ld hl, 10 + call LoadTxRam3 + ldh a, [hTemp_ffa0] + or a + ret nz ; return if was heads + ld a, 10 + call DealRecoilDamageToSelf + ret +; 0x2e539 + +Spark_PlayerSelectEffect: ; 2e539 (b:6539) + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + ret c ; has no Bench Pokemon + + ldtx hl, ChoosePkmnInTheBenchToGiveDamageText + call DrawWideTextBox_WaitForInput + call SwapTurn + bank1call HasAlivePokemonInBench + + ; the following two instructions can be removed + ; since Player selection will overwrite it. + ld a, PLAY_AREA_BENCH_1 + ldh [hTempPlayAreaLocation_ff9d], a + +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + call SwapTurn + ret +; 0x2e562 + +Spark_AISelectEffect: ; 2e562 (b:6562) + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + ret c ; has no Bench Pokemon +; AI always picks Pokemon with lowest HP remaining + call AIFindBenchWithLowestHP + ldh [hTemp_ffa0], a + ret +; 0x2e574 + +Spark_BenchDamageEffect: ; 2e574 (b:6574) + ldh a, [hTemp_ffa0] + cp $ff + ret z + call SwapTurn + ldh a, [hTemp_ffa0] + ld b, a + ld de, 10 + call DealDamageToPlayAreaPokemon_RegularAnim + call SwapTurn + ret +; 0x2e589 + +Pikachu3GrowlEffect: ; 2e589 (b:6589) + ld a, SUBSTATUS2_GROWL + call ApplySubstatus2ToDefendingCard + ret +; 0x2e58f + +Pikachu4GrowlEffect: ; 2e58f (b:658f) + ld a, SUBSTATUS2_GROWL + call ApplySubstatus2ToDefendingCard + ret +; 0x2e595 + +ChainLightningEffect: ; 2e595 (b:6595) + ld a, 10 + call StoreDamageInfo + call SwapTurn + call GetArenaCardColor + call SwapTurn + ldh [hEffectItemSelection], a + cp COLORLESS + ret z ; don't damage if colorless + +; opponent's Bench + call SwapTurn + call .DamageSameColorBench + call SwapTurn + +; own Bench + ld a, $01 + ld [wIsDamageToSelf], a + call .DamageSameColorBench + ret +; 0x2e5ba + +.DamageSameColorBench ; 2e5ba (b:65ba) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld e, a + ld d, PLAY_AREA_ARENA + jr .next_bench + +.check_damage + ld a, d + call GetPlayAreaCardColor + ld c, a + ldh a, [hEffectItemSelection] + cp c + jr nz, .next_bench ; skip if not same color +; apply damage to this Bench card + push de + ld b, d + ld de, 10 + call DealDamageToPlayAreaPokemon_RegularAnim + pop de + +.next_bench + inc d + dec e + jr nz, .check_damage + ret +; 0x2e5dc + +RaichuAgilityEffect: ; 2e5dc (b:65dc) + ldtx de, IfHeadsDoNotReceiveDamageOrEffectText + call TossCoin_BankB + ret nc ; skip if got tails + ld a, $52 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_AGILITY + call ApplySubstatus1ToDefendingCard + ret +; 0x2e5ee + +RaichuThunder_Recoil50PercentEffect: ; 2e5ee (b:65ee) + ld hl, 30 + call LoadTxRam3 + ldtx de, IfTailsDamageToYourselfTooText + call TossCoin_BankB + ldh [hTemp_ffa0], a + ret +; 0x2e5fd + +RaichuThunder_RecoilEffect: ; 2e5fd (b:65fd) + ld hl, 30 + call LoadTxRam3 + ldh a, [hTemp_ffa0] + or a + ret nz ; return if got heads + ld a, 30 + call DealRecoilDamageToSelf + ret +; 0x2e60d + +Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + cp 2 + jr nc, .has_bench + call SwapTurn + ld a, $ff + ldh [hTempList], a + ret + +.has_bench + ldtx hl, ChooseUpTo3PkmnOnBenchToGiveDamageText + call DrawWideTextBox_WaitForInput + +; init number of items in list and cursor position + xor a + ldh [hEffectItemSelection], a + ld [wce72], a + bank1call Func_61a1 +.start + bank1call PrintPlayAreaCardList_EnableLCD + push af + ld a, [wce72] + ld hl, BenchSelectionMenuParameters + call InitializeMenuParameters + pop af + +; exclude Arena Pokemon from number of items + dec a + ld [wNumMenuItems], a + +.loop_input + call DoFrame + call HandleMenuInput + jr nc, .loop_input + cp -1 + jr z, .try_cancel + + ld [wce72], a + call .CheckIfChosenAlready + jr nc, .not_chosen + ; play SFX + call Func_3794 + jr .loop_input + +.not_chosen +; mark this Play Area location + ldh a, [hCurMenuItem] + inc a + ld b, SYM_LIGHTNING + call DrawSymbolOnPlayAreaCursor +; store it in the list of chosen Bench Pokemon + call GetCurPositionInTempList + ldh a, [hCurMenuItem] + inc a + ld [hl], a + +; check if 3 were chosen already + ldh a, [hEffectItemSelection] + ld c, a + cp 3 + jr nc, .chosen ; check if already chose 3 + + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + dec a + cp c + jr nz, .start ; if sill more options available, loop back + ; fallthrough if no other options available to choose + +.chosen + ldh a, [hCurMenuItem] + inc a + call Func_2c10b + ldh a, [hKeysPressed] + and B_BUTTON + jr nz, .try_cancel + call SwapTurn + call GetCurPositionInTempList + ld [hl], $ff ; terminating byte + ret + +.try_cancel + ldh a, [hEffectItemSelection] + or a + jr z, .start ; none selected, can safely loop back to start + +; undo last selection made + dec a + ldh [hEffectItemSelection], a + ld e, a + ld d, $00 + ld hl, hTempList + add hl, de + ld a, [hl] + + push af + ld b, SYM_SPACE + call DrawSymbolOnPlayAreaCursor + call EraseCursor + pop af + + dec a + ld [wce72], a + jr .start +; 0x2e6af + +; returns carry if Bench Pokemon +; in register a was already chosen. +.CheckIfChosenAlready: ; 2e6af (b:66af) + inc a + ld c, a + ldh a, [hEffectItemSelection] + ld b, a + ld hl, hTempList + inc b + jr .next_check +.check_chosen + ld a, [hli] + cp c + scf + ret z ; return if chosen already +.next_check + dec b + jr nz, .check_chosen + or a + ret +; 0x2e6c3 + +Gigashock_AISelectEffect: ; 2e6c3 (b:66c3) +; if Bench has 3 Pokemon or less, no need for selection, +; since AI will choose them all. + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp MAX_PLAY_AREA_POKEMON - 1 + jr nc, .start_selection + +; select them all + ld hl, hTempList + ld b, PLAY_AREA_ARENA + jr .next_bench +.select_bench + ld [hl], b + inc hl +.next_bench + inc b + dec a + jr nz, .select_bench + ld [hl], $ff ; terminating byte + ret + +.start_selection +; has more than 3 Bench cards,proceed to sort them +; by lowest remaining HP to highest, and pick first 3. + call SwapTurn + dec a + ld c, a + ld b, PLAY_AREA_BENCH_1 + +; first select all of the Bench Pokemon and write to list + ld hl, hTempList +.loop_all + ld [hl], b + inc hl + inc b + dec c + jr nz, .loop_all + ld [hl], $00 ; end list with $00 + +; then check each of the Bench Pokemon HP +; sort them from lowest remaining HP to highest. + ld de, hTempList +.loop_outer + ld a, [de] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + ld c, a + ld l, e + ld h, d + inc hl + +.loop_inner + ld a, [hli] + or a + jr z, .next ; reaching $00 means it's end of list + + push hl + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + pop hl + cp c + jr c, .loop_inner + ; a Bench Pokemon was found with less HP + ld c, a ; store its HP + +; switch the two + dec hl + ld b, [hl] + ld a, [de] + ld [hli], a + ld a, b + ld [de], a + jr .loop_inner + +.next + inc de + ld a, [de] + or a + jr nz, .loop_outer + +; done + ld a, $ff ; terminating byte + ldh [hTempList + 3], a + call SwapTurn + ret +; 0x2e71f + +Gigashock_BenchDamageEffect: ; 2e71f (b:671f) + call SwapTurn + ld hl, hTempList +.loop_selection + ld a, [hli] + cp $ff + jr z, .done + push hl + ld b, a + ld de, 10 + call DealDamageToPlayAreaPokemon_RegularAnim + pop hl + jr .loop_selection +.done + call SwapTurn + ret +; 0x2e739 + +Magneton1SelfdestructEffect: ; 2e739 (b:6739) + ld a, 80 + call DealRecoilDamageToSelf + +; own bench + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + +; opponent's bench + call SwapTurn + xor a + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2e758 + +MagnetonSonicboom_UnaffectedByColorEffect: ; 2e758 (b:6758) + ld hl, wDamage + 1 + set UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, [hl] + ret +; 0x2e75e + +MagnetonSonicboom_NullEffect: ; 2e75e (b:675e) + ret +; 0x2e75f + +Magneton2SelfdestructEffect: ; 2e75f (b:675f) + ld a, 100 + call DealRecoilDamageToSelf + +; own bench + ld a, $01 + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + +; opponent's bench + call SwapTurn + xor a + ld [wIsDamageToSelf], a + ld a, 20 + call DealDamageToAllBenchedPokemon + call SwapTurn + ret +; 0x2e77e + +PealOfThunder_InitialEffect: ; 2e77e (b:677e) + scf + ret +; 0x2e780 + +PealOfThunder_RandomlyDamageEffect: ; 2e780 (b:6780) + call ExchangeRNG + ld de, 30 ; damage to inflict + call RandomlyDamagePlayAreaPokemon + bank1call Func_6e49 + ret +; 0x2e78d + +; randomly damages a Pokemon in play, except +; card that is in [hTempPlayAreaLocation_ff9d]. +; plays thunder animation when Play Area is shown. +; input: +; de = amount of damage to deal +RandomlyDamagePlayAreaPokemon: ; 2e78d (b:678d) + xor a + ld [wNoDamageOrEffect], a + +; choose randomly which Play Area to attack + call UpdateRNGSources + and 1 + jr nz, .opp_play_area + +; own Play Area + ld a, $01 + ld [wIsDamageToSelf], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + call Random + ld b, a + ; can't select Zapdos + ldh a, [hTempPlayAreaLocation_ff9d] + cp b + jr z, RandomlyDamagePlayAreaPokemon ; re-roll Pokemon to attack + +.damage + ld a, $82 + ld [wLoadedMoveAnimation], a + call DealDamageToPlayAreaPokemon + ret + +.opp_play_area + xor a + ld [wIsDamageToSelf], a + call SwapTurn + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + call Random + ld b, a + call .damage + call SwapTurn + ret +; 0x2e7cb + +BigThunderEffect: ; 2e7cb (b:67cb) + call ExchangeRNG + ld de, 70 ; damage to inflict + call RandomlyDamagePlayAreaPokemon + ret +; 0x2e7d5 + +MagneticStormEffect: ; 2e7d5 (b:67d5) + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable + +; writes in wDuelTempList all deck indices +; of Energy cards attached to Pokemon +; in the Turn Duelist's Play Area. + ld de, wDuelTempList + ld c, 0 +.loop_card_locations + ld a, [hl] + and CARD_LOCATION_PLAY_AREA + jr z, .next_card_location + +; is a card that is in the Play Area + push hl + push de + push bc + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + pop bc + pop de + pop hl + and TYPE_ENERGY + jr z, .next_card_location +; is an Energy card attached to Pokemon in Play Area + ld a, l + ld [de], a + inc de + inc c +.next_card_location + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_card_locations + ld a, $ff ; terminating byte + ld [de], a + +; divide number of energy cards +; by number of Pokemon in Play Area + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld b, a + ld a, c + ld c, -1 +.loop_division + inc c + sub b + jr nc, .loop_division + ; c = floor(a / b) + +; evenly divides the Energy cards randomly +; to every Pokemon in the Play Area. + push bc + ld hl, wDuelTempList + call CountCardsInDuelTempList + call ShuffleCards + ld d, c + ld e, PLAY_AREA_ARENA +.start_attach + ld c, d + inc c + jr .check_done +.attach_energy + ld a, [hli] + push hl + push de + push bc + call AddCardToHand + call PutHandCardInPlayArea + pop bc + pop de + pop hl +.check_done + dec c + jr nz, .attach_energy +; go to next Pokemon in Play Area + inc e ; next in Play Area + dec b + jr nz, .start_attach + pop bc + + push hl + ld hl, hTempList + +; fill hTempList with PLAY_AREA_* locations +; that have Pokemon in them. + push hl + xor a +.loop_init + ld [hli], a + inc a + cp b + jr nz, .loop_init + pop hl + +; shuffle them and distribute +; the remaining cards in random order. + ld a, b + call ShuffleCards + pop hl + ld de, hTempList +.next_random_pokemon + ld a, [hl] + cp $ff + jr z, .done + push hl + push de + ld a, [de] + ld e, a + ld a, [hl] + call AddCardToHand + call PutHandCardInPlayArea + pop de + pop hl + inc hl + inc de + jr .next_random_pokemon + +.done + bank1call DrawDuelMainScene + bank1call DrawDuelHUDs + ldtx hl, TheEnergyCardFromPlayAreaWasMovedText + call DrawWideTextBox_WaitForInput + xor a + call Func_2c10b + ret +; 0x2e870 + +ElectrodeSonicboom_UnaffectedByColorEffect: ; 2e870 (b:6870) + ld hl, wDamage + 1 + set UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, [hl] + ret +; 0x2e876 + +ElectrodeSonicboom_NullEffect: ; 2e876 (b:6876) + ret +; 0x2e877 + +; return carry if no cards in Deck +EnergySpike_DeckCheck: ; 2e877 (b:6877) + call CheckIfDeckIsEmpty + ret +; 0x2e87b + +EnergySpike_PlayerSelectEffect: ; 2e87b (b:687b) + ld a, $ff + ldh [hTemp_ffa0], a + +; search cards in Deck + call CreateDeckCardList + ldtx hl, Choose1BasicEnergyCardFromDeckText + ldtx bc, BasicEnergyText + lb de, SEARCHEFFECT_BASIC_ENERGY, 0 + call LookForCardInDeck + ret c + + bank1call Func_5591 + ldtx hl, ChooseBasicEnergyCardText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText +.select_card + bank1call DisplayCardList + jr c, .try_cancel + call GetCardIDFromDeckIndex + call GetCardType + cp TYPE_ENERGY_DOUBLE_COLORLESS + jr nc, .select_card ; not a Basic Energy card + and TYPE_ENERGY + jr z, .select_card ; not a Basic Energy card + ; Energy card selected + + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + call EmptyScreen + ldtx hl, ChoosePokemonToAttachEnergyCardText + call DrawWideTextBox_WaitForInput + +; choose a Pokemon in Play Area to attach card + bank1call HasAlivePokemonInPlayArea +.loop_input + bank1call OpenPlayAreaScreenForSelection + jr c, .loop_input + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempPlayAreaLocation_ffa1], a + ret + +.play_sfx + call Func_3794 + jr .select_card + +.try_cancel +; Player tried exiting screen, if there are +; any Basic Energy cards, Player is forced to select them. +; otherwise, they can safely exit. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_deck + ld a, [hl] + cp CARD_LOCATION_DECK + jr nz, .next_card + ld a, l + call GetCardIDFromDeckIndex + call GetCardType + and TYPE_ENERGY + jr z, .next_card + cp TYPE_ENERGY_DOUBLE_COLORLESS + jr c, .play_sfx +.next_card + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_deck + ; can exit + + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2e8f1 + +EnergySpike_AISelectEffect: ; 2e8f1 (b:68f1) +; AI doesn't select any card + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2e8f6 + +EnergySpike_AttachEnergyEffect: ; 2e8f6 (b:68f6) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .done + +; add card to hand and attach it to the selected Pokemon + call SearchCardInDeckAndAddToHand + call AddCardToHand + ldh a, [hTempPlayAreaLocation_ffa1] + ld e, a + ldh a, [hTemp_ffa0] + call PutHandCardInPlayArea + call CheckIfTurnDuelistIsPlayer + jr c, .done + +; not Player, so show detail screen +; and which Pokemon was chosen to attach Energy. + ldh a, [hTempPlayAreaLocation_ffa1] + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ld hl, wLoadedCard1Name + ld de, wTxRam2_b + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ldh a, [hTemp_ffa0] + ldtx hl, AttachedEnergyToPokemonText + bank1call DisplayCardDetailScreen + +.done + call Func_2c0bd + ret +; 0x2e930 + +JolteonDoubleKick_AIEffect: ; 2e930 (b:6930) + ld a, 40 / 2 + lb de, 0, 40 + jp StoreAIDamageInfo +; 0x2e938 + +JolteonDoubleKick_MultiplierEffect: ; 2e938 (b:6938) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + add a ; a = 2 * heads + call ATimes10 + call StoreDamageInfo + ret +; 0x2e94e + + INCROM $2e94e, $30000 diff --git a/src/engine/home.asm b/src/engine/home.asm index 80091175..3c659d8b 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -4968,10 +4968,18 @@ PrintKnockedOut: ; 1ad3 (0:1ad3) ; deal damage to turn holder's Pokemon card at play area location at b (PLAY_AREA_*). ; damage to deal is given in de. ; shows the defending player's play area screen when dealing the damage -; instead of the main duel interface, and has a fixed move animation. -DealDamageToPlayAreaPokemon: ; 1af3 (0:1af3) +; instead of the main duel interface with regular attack animation. +DealDamageToPlayAreaPokemon_RegularAnim: ; 1af3 (0:1af3) ld a, $78 ld [wLoadedMoveAnimation], a +; fallthrough + +; deal damage to turn holder's Pokemon card at play area location at b (PLAY_AREA_*). +; damage to deal is given in de. +; shows the defending player's play area screen when dealing the damage +; instead of the main duel interface. +; plays animation that is loaded in wLoadedMoveAnimation. +DealDamageToPlayAreaPokemon: ; 1af8 (0:1af8) ld a, b ld [wTempPlayAreaLocation_cceb], a or a ; cp PLAY_AREA_ARENA diff --git a/src/hram.asm b/src/hram.asm index 1554be6c..d36869b8 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -90,14 +90,6 @@ hTempPlayAreaLocation_ffa1:: ; ffa1 hAIPkmnPowerEffectParam:: ; ffa1 ds $1 -NEXTU - -; list of cards selected for various effects -hTempCardList:: ; ffa0 - ds $2 - -ENDU - UNION ; $ff-terminated list of cards to be discarded upon retreat @@ -119,12 +111,15 @@ hPkmnPowerPlayAreaTarget:: ; ffa2 hAIEnergyTransPlayAreaLocation:: ; ffa3 ds $1 +ENDU + NEXTU -; Play Area location (PLAY_AREA_*) of card -; chosen by AI to use Heal Pkmn Power on. -hAIHealCard:: ; ffa2 - ds $1 +; list of various items, such as +; cards selected for various effects, +; Play Area locations, etc. +hTempList:: ; ffa0 + ds $8 ENDU diff --git a/src/text/text1.asm b/src/text/text1.asm index 031befbd..577bef56 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -327,7 +327,7 @@ PsychicSymbolText: ; 36857 (d:6857) textfw0 "" done -Text004d: ; 3685a (d:685a) +BenchText: ; 3685a (d:685a) text "Bench" done @@ -1113,7 +1113,7 @@ IfHeadsHealIsSuccessfulText: ; 37e73 (d:7e73) line "Heal is successful." done -Text00ed: ; 37e92 (d:7e92) +IfTailsDamageToYourselfTooText: ; 37e92 (d:7e92) text "If Tails, damage" line "to yourself, too." done diff --git a/src/text/text2.asm b/src/text/text2.asm index d6a982bc..9c127f54 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -187,17 +187,17 @@ ChoosePkmnInTheBenchToGiveDamageText: ; 38769 (e:4769) line "to give damage to." done -Text011b: ; 3879b (e:479b) +ChooseUpTo3PkmnOnBenchToGiveDamageText: ; 3879b (e:479b) text "Choose up to 3 Pokémon on the" line "Bench to give damage to." done -Text011c: ; 387d3 (e:47d3) +Choose1BasicEnergyCardFromDeckText: ; 387d3 (e:47d3) text "Choose 1 Basic Energy card" line "from the Deck." done -Text011d: ; 387fe (e:47fe) +ChoosePokemonToAttachEnergyCardText: ; 387fe (e:47fe) text "Choose a Pokémon to attach" line "the Energy card to." done @@ -255,7 +255,7 @@ ChooseAKrabbyText: ; 38a02 (e:4a02) text "Choose a Krabby." done -Text0129: ; 38a14 (e:4a14) +ChooseBasicEnergyCardText: ; 38a14 (e:4a14) text "Choose a Basic" line "Energy card." done @@ -445,7 +445,7 @@ FightingPokemonDeckText: ; 392f8 (e:52f8) text "Fighting Pokémon" done -Text0144: ; 3930a (e:530a) +BasicEnergyText: ; 3930a (e:530a) text "Basic Energy" done @@ -483,7 +483,7 @@ ThereWasNoEffectFromTxRam2Text: ; 393ff (e:53ff) line "from ." done -Text014c: ; 3941c (e:541c) +TheEnergyCardFromPlayAreaWasMovedText: ; 3941c (e:541c) text "The Energy card from 's" line "Play Area was moved." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 728a1102..fad0a83a 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -78,7 +78,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer LightningSymbolText ; 0x004a textpointer FightingSymbolText ; 0x004b textpointer PsychicSymbolText ; 0x004c - textpointer Text004d ; 0x004d + textpointer BenchText ; 0x004d textpointer KnockOutText ; 0x004e textpointer DamageToSelfDueToConfusionText ; 0x004f textpointer ChooseEnergyCardToDiscardText ; 0x0050 @@ -238,7 +238,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer DamageToOppBenchIfHeadsDamageToYoursIfTailsText ; 0x00ea textpointer IfHeadsChangeOpponentsActivePokemonText ; 0x00eb textpointer IfHeadsHealIsSuccessfulText ; 0x00ec - textpointer Text00ed ; 0x00ed + textpointer IfTailsDamageToYourselfTooText ; 0x00ed textpointer SuccessCheckIfHeadsAttackIsSuccessfulText ; 0x00ee textpointer TrainerCardSuccessCheckText ; 0x00ef textpointer Text00f0 ; 0x00f0 @@ -284,9 +284,9 @@ TextOffsets:: ; 34000 (d:4000) textpointer DrawCardsFromTheDeckText ; 0x0118 textpointer CannotDrawCardBecauseNoCardsInDeckText ; 0x0119 textpointer ChoosePkmnInTheBenchToGiveDamageText ; 0x011a - textpointer Text011b ; 0x011b - textpointer Text011c ; 0x011c - textpointer Text011d ; 0x011d + textpointer ChooseUpTo3PkmnOnBenchToGiveDamageText ; 0x011b + textpointer Choose1BasicEnergyCardFromDeckText ; 0x011c + textpointer ChoosePokemonToAttachEnergyCardText ; 0x011d textpointer Text011e ; 0x011e textpointer ChooseAndDiscard2FireEnergyCardsText ; 0x011f textpointer DiscardOppDeckAsManyFireEnergyCardsText ; 0x0120 @@ -298,7 +298,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ChooseAnOddishFromDeckText ; 0x0126 textpointer ChooseAnOddishText ; 0x0127 textpointer ChooseAKrabbyText ; 0x0128 - textpointer Text0129 ; 0x0129 + textpointer ChooseBasicEnergyCardText ; 0x0129 textpointer ChooseNidoranFromDeckText ; 0x012a textpointer ChooseNidoranText ; 0x012b textpointer ChooseBasicFightingPokemonText ; 0x012c @@ -325,7 +325,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer BellsproutText ; 0x0141 textpointer KrabbyText ; 0x0142 textpointer FightingPokemonDeckText ; 0x0143 - textpointer Text0144 ; 0x0144 + textpointer BasicEnergyText ; 0x0144 textpointer PeekWasUsedToLookInYourHandText ; 0x0145 textpointer CardPeekWasUsedOnText ; 0x0146 textpointer Text0147 ; 0x0147 @@ -333,7 +333,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer BasicPokemonWasPlacedOnEachBenchText ; 0x0149 textpointer WasUnsuccessfulText ; 0x014a textpointer ThereWasNoEffectFromTxRam2Text ; 0x014b - textpointer Text014c ; 0x014c + textpointer TheEnergyCardFromPlayAreaWasMovedText ; 0x014c textpointer DrewFireEnergyFromTheHandText ; 0x014d textpointer ThePkmnCardsInHandAndDeckWereShuffledText ; 0x014e textpointer Text014f ; 0x014f diff --git a/src/wram.asm b/src/wram.asm index c16fb56a..578738b7 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -931,6 +931,7 @@ wLoadedMove:: ; cca6 ; the damage field of an used move is loaded here ; doubles as "wAIAverageDamage" when complementing wAIMinDamage and wAIMaxDamage ; little-endian +; second byte may have UNAFFECTED_BY_WEAKNESS_RESISTANCE_F set/unset wDamage:: ; ccb9 ds $2 @@ -1207,8 +1208,8 @@ wAIPokedexCounter:: ; cda6 ds $1 ; variable to keep track of Mewtwo1's Barrier usage during Player' turn. -; AI_FLAG_MEWTWO_MILL set means Player is running Mewtwo1 mill deck. -; - when flag is not set, this counts how many turns in a row +; AI_MEWTWO_MILL set means Player is running Mewtwo1 mill deck. +; - when flag is not set, this counts how many turns in a row ; Player used Mewtwo1's Barrier attack; ; - when flag is set, this counts how many turns in a row ; Player has NOT used Barrier attack. @@ -1684,7 +1685,10 @@ wce70:: ; ce70 wce71:: ; ce71 ds $1 - ds $3 +wce72:: ; ce72 + ds $1 + + ds $2 ; stores the amount of cards that are being ordered. wNumberOfCardsToOrder:: ; ce75 From f1479c9e5072e362ab8c4ed5cd30d578b675dbb2 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 7 Jun 2020 17:11:57 +0100 Subject: [PATCH 38/45] Colorless attack effects --- src/constants/duel_constants.asm | 113 +-- src/data/effect_commands.asm | 194 ++-- src/engine/bank01.asm | 6 +- src/engine/effect_functions.asm | 1530 +++++++++++++++++++++++++++++- src/engine/home.asm | 2 +- src/text/text1.asm | 12 +- src/text/text2.asm | 20 +- src/text/text_offsets.asm | 32 +- src/wram.asm | 32 +- 9 files changed, 1731 insertions(+), 210 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index a9ff54b3..750fac0a 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -25,59 +25,61 @@ DUEL_WIN EQU $0 DUEL_LOSS EQU $1 ; wPlayerDuelVariables or wOpponentDuelVariables constants -DUELVARS_CARD_LOCATIONS EQUS "LOW(wPlayerCardLocations)" ; 00 -DUELVARS_PRIZE_CARDS EQUS "LOW(wPlayerPrizeCards)" ; 3c -DUELVARS_HAND EQUS "LOW(wPlayerHand)" ; 42 -DUELVARS_DECK_CARDS EQUS "LOW(wPlayerDeckCards)" ; 7e -DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK EQUS "LOW(wPlayerNumberOfCardsNotInDeck)" ; ba -DUELVARS_ARENA_CARD EQUS "LOW(wPlayerArenaCard)" ; bb -DUELVARS_BENCH EQUS "LOW(wPlayerBench)" ; bc -DUELVARS_ARENA_CARD_FLAGS_C2 EQU $c2 -DUELVARS_ARENA_CARD_HP EQUS "LOW(wPlayerArenaCardHP)" ; c8 -DUELVARS_BENCH1_CARD_HP EQUS "LOW(wPlayerBench1CardHP)" ; c9 -DUELVARS_BENCH2_CARD_HP EQUS "LOW(wPlayerBench2CardHP)" ; ca -DUELVARS_BENCH3_CARD_HP EQUS "LOW(wPlayerBench3CardHP)" ; cb -DUELVARS_BENCH4_CARD_HP EQUS "LOW(wPlayerBench4CardHP)" ; cc -DUELVARS_BENCH5_CARD_HP EQUS "LOW(wPlayerBench5CardHP)" ; cd -DUELVARS_ARENA_CARD_STAGE EQUS "LOW(wPlayerArenaCardStage)" ; ce -DUELVARS_BENCH1_CARD_STAGE EQUS "LOW(wPlayerBench1CardStage)" ; cf -DUELVARS_BENCH2_CARD_STAGE EQUS "LOW(wPlayerBench2CardStage)" ; d0 -DUELVARS_BENCH3_CARD_STAGE EQUS "LOW(wPlayerBench3CardStage)" ; d1 -DUELVARS_BENCH4_CARD_STAGE EQUS "LOW(wPlayerBench4CardStage)" ; d2 -DUELVARS_BENCH5_CARD_STAGE EQUS "LOW(wPlayerBench5CardStage)" ; d3 -DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 -DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 -DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 -DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 -DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 -DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 -DUELVARS_ARENA_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerArenaCardAttachedDefender)" ; da -DUELVARS_BENCH1_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench1CardAttachedDefender)" ; db -DUELVARS_BENCH2_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench2CardAttachedDefender)" ; dc -DUELVARS_BENCH3_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench3CardAttachedDefender)" ; dd -DUELVARS_BENCH4_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench4CardAttachedDefender)" ; de -DUELVARS_BENCH5_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench5CardAttachedDefender)" ; df -DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerArenaCardAttachedPluspower)" ; e0 -DUELVARS_BENCH1_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench1CardAttachedPluspower)" ; e1 -DUELVARS_BENCH2_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench2CardAttachedPluspower)" ; e2 -DUELVARS_BENCH3_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench3CardAttachedPluspower)" ; e3 -DUELVARS_BENCH4_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench4CardAttachedPluspower)" ; e4 -DUELVARS_BENCH5_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench5CardAttachedPluspower)" ; e5 -DUELVARS_ARENA_CARD_SUBSTATUS1 EQUS "LOW(wPlayerArenaCardSubstatus1)" ; e7 -DUELVARS_ARENA_CARD_SUBSTATUS2 EQUS "LOW(wPlayerArenaCardSubstatus2)" ; e8 -DUELVARS_ARENA_CARD_CHANGED_WEAKNESS EQUS "LOW(wPlayerArenaCardChangedWeakness)" ; e9 -DUELVARS_ARENA_CARD_CHANGED_RESISTANCE EQUS "LOW(wPlayerArenaCardChangedResistance)" ; ea -DUELVARS_ARENA_CARD_SUBSTATUS3 EQUS "LOW(wPlayerArenaCardSubstatus3)" ; eb -DUELVARS_PRIZES EQUS "LOW(wPlayerPrizes)" ; ec -DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE EQUS "LOW(wPlayerNumberOfCardsInDiscardPile)" ; ed -DUELVARS_NUMBER_OF_CARDS_IN_HAND EQUS "LOW(wPlayerNumberOfCardsInHand)" ; ee -DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA EQUS "LOW(wPlayerNumberOfPokemonInPlayArea)" ; ef -DUELVARS_ARENA_CARD_STATUS EQUS "LOW(wPlayerArenaCardStatus)" ; f0 -DUELVARS_DUELIST_TYPE EQUS "LOW(wPlayerDuelistType)" ; f1 -DUELVARS_ARENA_CARD_DISABLED_MOVE_INDEX EQUS "LOW(wPlayerArenaCardDisabledMoveIndex)" ; f2 -DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE EQUS "LOW(wPlayerArenaCardLastTurnDamage)" ; f3 -DUELVARS_ARENA_CARD_LAST_TURN_STATUS EQUS "LOW(wPlayerArenaCardLastTurnStatus)" ; f5 -DUELVARS_ARENA_CARD_LAST_TURN_EFFECT EQUS "LOW(wPlayerArenaCardLastTurnEffect)" ; f8 +DUELVARS_CARD_LOCATIONS EQUS "LOW(wPlayerCardLocations)" ; 00 +DUELVARS_PRIZE_CARDS EQUS "LOW(wPlayerPrizeCards)" ; 3c +DUELVARS_HAND EQUS "LOW(wPlayerHand)" ; 42 +DUELVARS_DECK_CARDS EQUS "LOW(wPlayerDeckCards)" ; 7e +DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK EQUS "LOW(wPlayerNumberOfCardsNotInDeck)" ; ba +DUELVARS_ARENA_CARD EQUS "LOW(wPlayerArenaCard)" ; bb +DUELVARS_BENCH EQUS "LOW(wPlayerBench)" ; bc +DUELVARS_ARENA_CARD_FLAGS_C2 EQU $c2 +DUELVARS_ARENA_CARD_HP EQUS "LOW(wPlayerArenaCardHP)" ; c8 +DUELVARS_BENCH1_CARD_HP EQUS "LOW(wPlayerBench1CardHP)" ; c9 +DUELVARS_BENCH2_CARD_HP EQUS "LOW(wPlayerBench2CardHP)" ; ca +DUELVARS_BENCH3_CARD_HP EQUS "LOW(wPlayerBench3CardHP)" ; cb +DUELVARS_BENCH4_CARD_HP EQUS "LOW(wPlayerBench4CardHP)" ; cc +DUELVARS_BENCH5_CARD_HP EQUS "LOW(wPlayerBench5CardHP)" ; cd +DUELVARS_ARENA_CARD_STAGE EQUS "LOW(wPlayerArenaCardStage)" ; ce +DUELVARS_BENCH1_CARD_STAGE EQUS "LOW(wPlayerBench1CardStage)" ; cf +DUELVARS_BENCH2_CARD_STAGE EQUS "LOW(wPlayerBench2CardStage)" ; d0 +DUELVARS_BENCH3_CARD_STAGE EQUS "LOW(wPlayerBench3CardStage)" ; d1 +DUELVARS_BENCH4_CARD_STAGE EQUS "LOW(wPlayerBench4CardStage)" ; d2 +DUELVARS_BENCH5_CARD_STAGE EQUS "LOW(wPlayerBench5CardStage)" ; d3 +DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 +DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 +DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 +DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 +DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 +DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 +DUELVARS_ARENA_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerArenaCardAttachedDefender)" ; da +DUELVARS_BENCH1_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench1CardAttachedDefender)" ; db +DUELVARS_BENCH2_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench2CardAttachedDefender)" ; dc +DUELVARS_BENCH3_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench3CardAttachedDefender)" ; dd +DUELVARS_BENCH4_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench4CardAttachedDefender)" ; de +DUELVARS_BENCH5_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench5CardAttachedDefender)" ; df +DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerArenaCardAttachedPluspower)" ; e0 +DUELVARS_BENCH1_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench1CardAttachedPluspower)" ; e1 +DUELVARS_BENCH2_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench2CardAttachedPluspower)" ; e2 +DUELVARS_BENCH3_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench3CardAttachedPluspower)" ; e3 +DUELVARS_BENCH4_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench4CardAttachedPluspower)" ; e4 +DUELVARS_BENCH5_CARD_ATTACHED_PLUSPOWER EQUS "LOW(wPlayerBench5CardAttachedPluspower)" ; e5 +DUELVARS_ARENA_CARD_SUBSTATUS1 EQUS "LOW(wPlayerArenaCardSubstatus1)" ; e7 +DUELVARS_ARENA_CARD_SUBSTATUS2 EQUS "LOW(wPlayerArenaCardSubstatus2)" ; e8 +DUELVARS_ARENA_CARD_CHANGED_WEAKNESS EQUS "LOW(wPlayerArenaCardChangedWeakness)" ; e9 +DUELVARS_ARENA_CARD_CHANGED_RESISTANCE EQUS "LOW(wPlayerArenaCardChangedResistance)" ; ea +DUELVARS_ARENA_CARD_SUBSTATUS3 EQUS "LOW(wPlayerArenaCardSubstatus3)" ; eb +DUELVARS_PRIZES EQUS "LOW(wPlayerPrizes)" ; ec +DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE EQUS "LOW(wPlayerNumberOfCardsInDiscardPile)" ; ed +DUELVARS_NUMBER_OF_CARDS_IN_HAND EQUS "LOW(wPlayerNumberOfCardsInHand)" ; ee +DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA EQUS "LOW(wPlayerNumberOfPokemonInPlayArea)" ; ef +DUELVARS_ARENA_CARD_STATUS EQUS "LOW(wPlayerArenaCardStatus)" ; f0 +DUELVARS_DUELIST_TYPE EQUS "LOW(wPlayerDuelistType)" ; f1 +DUELVARS_ARENA_CARD_DISABLED_MOVE_INDEX EQUS "LOW(wPlayerArenaCardDisabledMoveIndex)" ; f2 +DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE EQUS "LOW(wPlayerArenaCardLastTurnDamage)" ; f3 +DUELVARS_ARENA_CARD_LAST_TURN_STATUS EQUS "LOW(wPlayerArenaCardLastTurnStatus)" ; f5 +DUELVARS_ARENA_CARD_LAST_TURN_SUBSTATUS2 EQUS "LOW(wPlayerArenaCardLastTurnSubstatus2)" ; f6 +DUELVARS_ARENA_CARD_LAST_TURN_CHANGE_WEAK EQUS "LOW(wPlayerArenaCardLastTurnChangeWeak)" ; f7 +DUELVARS_ARENA_CARD_LAST_TURN_EFFECT EQUS "LOW(wPlayerArenaCardLastTurnEffect)" ; f8 ; card location constants (DUELVARS_CARD_LOCATIONS) CARD_LOCATION_DECK EQU $00 @@ -154,6 +156,7 @@ SUBSTATUS2_AMNESIA EQU $04 SUBSTATUS2_TAIL_WAG EQU $05 SUBSTATUS2_LEER EQU $06 SUBSTATUS2_POUNCE EQU $07 +SUBSTATUS2_CONVERSION2 EQU $08 SUBSTATUS2_UNABLE_RETREAT EQU $09 SUBSTATUS2_BONE_ATTACK EQU $0b SUBSTATUS2_GROWL EQU $12 @@ -163,9 +166,11 @@ SUBSTATUS3_HEADACHE EQU 1 ; DUELVARS_ARENA_CARD_FLAGS_C2 constants USED_PKMN_POWER_THIS_TURN_F EQU 5 +USED_LEEK_SLAP_THIS_DUEL_F EQU 6 CAN_EVOLVE_THIS_TURN_F EQU 7 USED_PKMN_POWER_THIS_TURN EQU 1 << USED_PKMN_POWER_THIS_TURN_F +USED_LEEK_SLAP_THIS_DUEL EQU 1 << USED_LEEK_SLAP_THIS_DUEL_F CAN_EVOLVE_THIS_TURN EQU 1 << CAN_EVOLVE_THIS_TURN_F ; DUELVARS_ARENA_CARD_LAST_TURN_EFFECT constants @@ -228,7 +233,7 @@ NO_DAMAGE_OR_EFFECT_NSHIELD EQU $05 const OPPACTION_TOSS_COIN_A_TIMES ; $11 const OPPACTION_6B30 ; $12 const OPPACTION_NO_ACTION_13 ; $13 - const OPPACTION_6B3E ; $14 + const OPPACTION_USE_METRONOME_ATTACK ; $14 const OPPACTION_6B15 ; $15 const OPPACTION_DUEL_MAIN_SCENE ; $16 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 508d80bf..b56852e9 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -200,7 +200,7 @@ NidoranFCallForFamilyEffectCommands: db $00 NidoranMHornHazardEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HornHazard_Success50PercentEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, HornHazard_NoDamage50PercentEffect dbw EFFECTCMDTYPE_AI, HornHazard_AIEffect db $00 @@ -444,7 +444,7 @@ DewgongIceBeamEffectCommands: StarmieRecoverEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, StarmieRecover_CheckEnergyHP dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, StarmieRecover_PlayerSelectEffect - dbw EFFECTCMDTYPE_AFTER_DAMAGE, StarmieRecover_HPRecoveryEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, StarmieRecover_HealEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, StarmieRecover_DiscardEffect dbw EFFECTCMDTYPE_AI_SELECTION, StarmieRecover_AISelectEffect db $00 @@ -864,7 +864,7 @@ SlowpokeAmnesiaEffectCommands: KadabraRecoverEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, KadabraRecover_CheckEnergyHP dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, KadabraRecover_PlayerSelectEffect - dbw EFFECTCMDTYPE_AFTER_DAMAGE, KadabraRecover_HPRecoveryEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, KadabraRecover_HealEffect dbw EFFECTCMDTYPE_DISCARD_ENERGY, KadabraRecover_DiscardEffect dbw EFFECTCMDTYPE_AI_SELECTION, KadabraRecover_AISelectEffect db $00 @@ -1160,40 +1160,40 @@ JolteonStunNeedleEffectCommands: db $00 EeveeTailWagEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $694e + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, TailWagEffect db $00 EeveeQuickAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $696a - dbw EFFECTCMDTYPE_AI, $6962 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, EeveeQuickAttack_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, EeveeQuickAttack_AIEffect db $00 SpearowMirrorMoveEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $697f - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6981 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6987 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6989 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6983 - dbw EFFECTCMDTYPE_AI_SELECTION, $6985 - dbw EFFECTCMDTYPE_AI, $697d + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SpearowMirrorMove_InitialEffect1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, SpearowMirrorMove_InitialEffect2 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SpearowMirrorMove_BeforeDamage + dbw EFFECTCMDTYPE_AFTER_DAMAGE, SpearowMirrorMove_AfterDamage + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, SpearowMirrorMove_PlayerSelection + dbw EFFECTCMDTYPE_AI_SELECTION, SpearowMirrorMove_AISelection + dbw EFFECTCMDTYPE_AI, SpearowMirrorMove_AIEffect db $00 FearowAgilityEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6ab8 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FearowAgilityEffect db $00 DragoniteStepInEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6aca - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6ae8 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, StepIn_BenchCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, StepIn_SwitchEffect db $00 Dragonite2SlamEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6afe - dbw EFFECTCMDTYPE_AI, $6af6 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Dragonite2Slam_MultiplierEffect + dbw EFFECTCMDTYPE_AI, Dragonite2Slam_AIEffect db $00 SnorlaxThickSkinnedEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6b15 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ThickSkinnedEffect db $00 SnorlaxBodySlamEffectCommands: @@ -1201,98 +1201,98 @@ SnorlaxBodySlamEffectCommands: db $00 FarfetchdLeekSlapEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6b1f - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6b34 - dbw EFFECTCMDTYPE_DISCARD_ENERGY, $6b2c - dbw EFFECTCMDTYPE_AI, $6b17 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, LeekSlap_OncePerDuelCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LeekSlap_NoDamage50PercentEffect + dbw EFFECTCMDTYPE_DISCARD_ENERGY, LeekSlap_SetUsedThisDuelFlag + dbw EFFECTCMDTYPE_AI, LeekSlap_AIEffect db $00 KangaskhanFetchEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6b40 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, FetchEffect db $00 KangaskhanCometPunchEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6b65 - dbw EFFECTCMDTYPE_AI, $6b5d + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, CometPunch_MultiplerEffect + dbw EFFECTCMDTYPE_AI, CometPunch_AIEffect db $00 TaurosStompEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6b83 - dbw EFFECTCMDTYPE_AI, $6b7b + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, TaurosStomp_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, TaurosStomp_AIEffect db $00 TaurosRampageEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6ba1 - dbw EFFECTCMDTYPE_AI, $6b96 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Rampage_Confusion50PercentEffect + dbw EFFECTCMDTYPE_AI, Rampage_AIEffect db $00 DoduoFuryAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6bc2 - dbw EFFECTCMDTYPE_AI, $6bba + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FuryAttack_MultiplerEffect + dbw EFFECTCMDTYPE_AI, FuryAttack_AIEffect db $00 DodrioRetreatAidEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6bd7 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, RetreatAidEffect db $00 DodrioRageEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6bdf - dbw EFFECTCMDTYPE_AI, $6bd9 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DodrioRage_DamageBoostEffect + dbw EFFECTCMDTYPE_AI, DodrioRage_AIEffect db $00 MeowthPayDayEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6be8 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, PayDayEffect db $00 DragonairSlamEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6c14 - dbw EFFECTCMDTYPE_AI, $6c0c + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DragonairSlam_MultiplierEffect + dbw EFFECTCMDTYPE_AI, DragonairSlam_AIEffect db $00 DragonairHyperBeamEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6c35 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6c2c - dbw EFFECTCMDTYPE_AI_SELECTION, $6c2f + dbw EFFECTCMDTYPE_AFTER_DAMAGE, DragonairHyperBeam_DiscardEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, DragonairHyperBeam_PlayerSelectEffect + dbw EFFECTCMDTYPE_AI_SELECTION, DragonairHyperBeam_AISelectEffect db $00 ClefableMetronomeEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6c77 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6c82 - dbw EFFECTCMDTYPE_AI_SELECTION, $6c7e + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ClefableMetronome_CheckAttacks + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ClefableMetronome_UseAttackEffect + dbw EFFECTCMDTYPE_AI_SELECTION, ClefableMetronome_AISelectEffect db $00 ClefableMinimizeEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6c88 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ClefableMinimizeEffect db $00 PidgeotHurricaneEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6c8e + dbw EFFECTCMDTYPE_AFTER_DAMAGE, HurricaneEffect db $00 PidgeottoWhirlwindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6ce9 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6cd3 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $6cd3 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, PidgeottoWhirlwind_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, PidgeottoWhirlwind_SelectEffect + dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, PidgeottoWhirlwind_SelectEffect db $00 PidgeottoMirrorMoveEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6cf2 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6cf5 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6cfe - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6d01 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6cf8 - dbw EFFECTCMDTYPE_AI_SELECTION, $6cfb - dbw EFFECTCMDTYPE_AI, $6cef + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PidgeottoMirrorMove_InitialEffect1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PidgeottoMirrorMove_InitialEffect2 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PidgeottoMirrorMove_BeforeDamage + dbw EFFECTCMDTYPE_AFTER_DAMAGE, PidgeottoMirrorMove_AfterDamage + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, PidgeottoMirrorMove_PlayerSelection + dbw EFFECTCMDTYPE_AI_SELECTION, PidgeottoMirrorMove_AISelection + dbw EFFECTCMDTYPE_AI, PidgeottoMirrorMove_AIEffect db $00 ClefairySingEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6d04 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SingEffect db $00 ClefairyMetronomeEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6d0b - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6d16 - dbw EFFECTCMDTYPE_AI_SELECTION, $6d12 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ClefairyMetronome_CheckAttacks + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ClefairyMetronome_UseAttackEffect + dbw EFFECTCMDTYPE_AI_SELECTION, ClefairyMetronome_AISelectEffect db $00 WigglytuffLullabyEffectCommands: @@ -1300,8 +1300,8 @@ WigglytuffLullabyEffectCommands: db $00 WigglytuffDoTheWaveEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6d87 - dbw EFFECTCMDTYPE_AI, $6d87 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DoTheWaveEffect + dbw EFFECTCMDTYPE_AI, DoTheWaveEffect db $00 JigglypuffLullabyEffectCommands: @@ -1309,16 +1309,16 @@ JigglypuffLullabyEffectCommands: db $00 JigglypuffFirstAidEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6d94 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6d9f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FirstAid_DamageCheck + dbw EFFECTCMDTYPE_AFTER_DAMAGE, FirstAid_HealEffect db $00 JigglypuffDoubleEdgeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6da6 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, JigglypuffDoubleEdgeEffect db $00 PersianPounceEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6dac + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PounceEffect db $00 LickitungTongueWrapEffectCommands: @@ -1326,82 +1326,82 @@ LickitungTongueWrapEffectCommands: db $00 LickitungSupersonicEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6db2 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LickitungSupersonicEffect db $00 PidgeyWhirlwindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6dcf - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6db9 - dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, $6db9 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, PidgeyWhirlwind_SwitchEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, PidgeyWhirlwind_SelectEffect + dbw EFFECTCMDTYPE_SWITCH_DEFENDING_PKMN, PidgeyWhirlwind_SelectEffect db $00 PorygonConversion1EffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6dd5 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6ded - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6dfb - dbw EFFECTCMDTYPE_AI_SELECTION, $6df7 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Conversion1_WeaknessCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Conversion1_PlayerSelectEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Conversion1_ChangeWeaknessEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Conversion1_AISelectEffect db $00 PorygonConversion2EffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6e1f - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6e31 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6e5e - dbw EFFECTCMDTYPE_AI_SELECTION, $6e3c + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Conversion2_ResistanceCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Conversion2_PlayerSelectEffect + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Conversion2_ChangeResistanceEffect + dbw EFFECTCMDTYPE_AI_SELECTION, Conversion2_AISelectEffect db $00 ChanseyScrunchEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6ee7 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ScrunchEffect db $00 ChanseyDoubleEdgeEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6efb + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ChanseyDoubleEdgeEffect db $00 RaticateSuperFangEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6f07 - dbw EFFECTCMDTYPE_AI, $6f01 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SuperFang_HalfHPEffect + dbw EFFECTCMDTYPE_AI, SuperFang_AIEffect db $00 TrainerCardAsPokemonEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $6f18 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6f3c - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $6f27 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, TrainerCardAsPokemon_BenchCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, TrainerCardAsPokemon_DiscardEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, TrainerCardAsPokemon_PlayerSelectSwitch db $00 DragoniteHealingWindEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $6f51 - dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, $6f53 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, HealingWind_InitialEffect + dbw EFFECTCMDTYPE_PKMN_POWER_TRIGGER, HealingWind_PlayAreaHealEffect db $00 Dragonite1SlamEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $6fa4 - dbw EFFECTCMDTYPE_AI, $6f9c + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Dragonite1Slam_MultiplierEffect + dbw EFFECTCMDTYPE_AI, Dragonite1Slam_AIEffect db $00 MeowthCatPunchEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6fe0 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, CatPunchEffect db $00 DittoMorphEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $6ff6 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, MorphEffect db $00 PidgeotSlicingWindEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $70bf + dbw EFFECTCMDTYPE_AFTER_DAMAGE, SlicingWindEffect db $00 PidgeotGaleEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $70d0 - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $70d6 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Gale_LoadAnimation + dbw EFFECTCMDTYPE_AFTER_DAMAGE, Gale_SwitchEffect db $00 JigglypuffFriendshipSongEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $710d - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $7119 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FriendshipSong_BenchCheck + dbw EFFECTCMDTYPE_AFTER_DAMAGE, FriendshipSong_AddToBench50PercentEffect db $00 JigglypuffExpandEffectCommands: - dbw EFFECTCMDTYPE_AFTER_DAMAGE, $7153 + dbw EFFECTCMDTYPE_AFTER_DAMAGE, ExpandEffect db $00 DoubleColorlessEnergyEffectCommands: diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index f66a4ab6..68ea2937 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -6411,7 +6411,7 @@ OppActionTable: ; 695e (1:695e) dw OppAction_TossCoinATimes dw OppAction_6b30 dw OppAction_NoAction - dw OppAction_6b3e + dw OppAction_UseMetronomeAttack dw OppAction_6b15 dw OppAction_DrawDuelMainScene @@ -6663,7 +6663,7 @@ OppAction_6b30: ; 6b30 (1:6b30) ldh [hWhoseTurn], a ret -OppAction_6b3e: ; 6b3e (1:6b3e) +OppAction_UseMetronomeAttack: ; 6b3e (1:6b3e) call DrawDuelMainScene ld a, DUELVARS_ARENA_CARD_STATUS call GetTurnDuelistVariable @@ -6689,7 +6689,7 @@ OppAction_6b3e: ; 6b3e (1:6b3e) call Func_16f6 pop bc ld a, c - ld [wccf0], a + ld [wMetronomeEnergyCost], a ret OppAction_NoAction: ; 6b7d (1:6b7d) diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 70817c08..c17d4bdf 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -800,9 +800,13 @@ LookForCardInDeck: ; 2c2ec (b:42ec) ret ; 0x2c391 -; outputs the Player selection of attack -; to use Amnesia on. -HandleAmnesiaScreen: ; 2c391 (b:4391) +; handles the Player selection of attack +; to use, i.e. Amnesia or Metronome on. +; returns carry if none selected. +; outputs: +; d = card index of defending card +; e = attack index selected +HandleDefendingPokemonAttackSelection: ; 2c391 (b:4391) bank1call DrawDuelMainScene call SwapTurn xor a @@ -827,7 +831,7 @@ HandleAmnesiaScreen: ; 2c391 (b:4391) jr nz, .open_move_page call HandleMenuInput jr nc, .loop_input - cp $ff + cp -1 jr z, .loop_input ; a move was selected @@ -1187,15 +1191,19 @@ AIFindBenchWithLowestHP: ; 2c564 (b:4564) ret ; 0x2c588 -; handles drawing the Shift Screen and its input. +; handles drawing and selection of screen for +; choosing a color (excluding colorless), for use +; of Shift Pkmn Power and Conversion attacks. ; outputs in a the color that was selected or, ; if B was pressed, returns carry. ; input: -; a = Play Area location (PLAY_AREA_*), with bit 7 set or unset +; a = Play Area location (PLAY_AREA_*), with: +; bit 7 not set if it's applying to opponent's card +; bit 7 set if it's applying to player's card ; hl = text to be printed in the bottom box ; output: ; a = color that was selected -HandleShiftScreen: ; 2c588 (b:4588) +HandleColorChangeScreen: ; 2c588 (b:4588) or a call z, SwapTurn push af @@ -2084,7 +2092,7 @@ HornHazard_AIEffect: ; 2ca8e (b:4a8e) jp StoreAIDamageInfo ; 0x2ca96 -HornHazard_Success50PercentEffect: ; 2ca96 (b:4a96) +HornHazard_NoDamage50PercentEffect: ; 2ca96 (b:4a96) ldtx de, DamageCheckIfTailsNoDamageText call TossCoin_BankB jr c, .heads @@ -2547,7 +2555,7 @@ Shift_PlayerSelectEffect: ; 2cd21 (b:4d21) ldtx hl, ChoosePokemonWishToColorChangeText ldh a, [hTemp_ffa0] or $80 - call HandleShiftScreen + call HandleColorChangeScreen ldh [hAIPkmnPowerEffectParam], a ret c ; cancelled @@ -2832,13 +2840,13 @@ VenusaurMegaDrainEffect: ; 2ceb0 (b:4eb0) ; b = number of Water energy cards needed for paying Energy Cost ; c = number of colorless energy cards needed for paying Energy Cost ApplyExtraWaterEnergyDamageBonus: ; 2cec8 (b:4ec8) - ld a, [wccf0] + ld a, [wMetronomeEnergyCost] or a - jr z, .asm_2ced1 - ld c, a - ld b, 0 + jr z, .not_metronome + ld c, a ; amount of colorless needed for Metronome + ld b, 0 ; no Water energy needed for Metronome -.asm_2ced1 +.not_metronome push bc ldh a, [hTempPlayAreaLocation_ff9d] ld e, a @@ -3251,7 +3259,7 @@ StarmieRecover_DiscardEffect: ; 2d10e (b:510e) ret ; 0x2d114 -StarmieRecover_HPRecoveryEffect: ; 2d114 (b:5114) +StarmieRecover_HealEffect: ; 2d114 (b:5114) ld e, PLAY_AREA_ARENA call GetCardDamageAndMaxHP ld e, a ; all damage for recovery @@ -3332,7 +3340,7 @@ PoliwhirlAmnesia_DisableEffect: ; 2d179 (b:5179) PlayerPickAttackForAmnesia: ; 2d17d (b:517d) ldtx hl, ChooseAttackOpponentWillNotBeAbleToUseText call DrawWideTextBox_WaitForInput - call HandleAmnesiaScreen + call HandleDefendingPokemonAttackSelection ld a, e ldh [hTemp_ffa0], a ret @@ -6061,7 +6069,7 @@ KadabraRecover_DiscardEffect: ; 2dfbd (b:5fbd) ret ; 0x2dfc3 -KadabraRecover_HPRecoveryEffect: ; 2dfc3 (b:5fc3) +KadabraRecover_HealEffect: ; 2dfc3 (b:5fc3) ld e, PLAY_AREA_ARENA call GetCardDamageAndMaxHP ld e, a ; all damage for recovery @@ -7797,4 +7805,1490 @@ JolteonDoubleKick_MultiplierEffect: ; 2e938 (b:6938) ret ; 0x2e94e - INCROM $2e94e, $30000 +TailWagEffect: ; 2e94e (b:694e) + ldtx de, IfHeadsOpponentCannotAttackText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $46 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS2_TAIL_WAG + call ApplySubstatus2ToDefendingCard + ret +; 0x2e962 + +EeveeQuickAttack_AIEffect: ; 2e962 (b:5962) + ld a, (10 + 30) / 2 + lb de, 10, 30 + jp StoreAIDamageInfo +; 0x2e96a + +EeveeQuickAttack_DamageBoostEffect: ; 2e96a (b:596a) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; return if tails + ld a, 20 + call AddToDamage + ret +; 0x2e97d + +SpearowMirrorMove_AIEffect: ; 2e97d (b:697d) + jr MirrorMoveEffects.AIEffect +; 0x2e97f + +SpearowMirrorMove_InitialEffect1: ; 2e97f (b:697f) + jr MirrorMoveEffects.InitialEffect1 +; 0x2e981 + +SpearowMirrorMove_InitialEffect2: ; 2e981 (b:6981) + jr MirrorMoveEffects.InitialEffect2 +; 0x2e983 + +SpearowMirrorMove_PlayerSelection: ; 2e983 (b:6983) + jr MirrorMoveEffects.PlayerSelection +; 0x2e985 + +SpearowMirrorMove_AISelection: ; 2e985 (b:6985) + jr MirrorMoveEffects.AISelection +; 0x2e987 + +SpearowMirrorMove_BeforeDamage: ; 2e987 (b:6987) + jr MirrorMoveEffects.BeforeDamage +; 0x2e989 + +SpearowMirrorMove_AfterDamage: ; 2e989 (b:6989) + jp MirrorMoveEffects.AfterDamage +; 0x2e98c + +; these are effect commands that Mirror Move uses +; in order to mimic last turn's attack. +; it covers all possible effect steps to perform its commands +; (i.e. selection for Amnesia and Energy discarding attacks, etc) +MirrorMoveEffects: ; 2e98c (b:698c) +.AIEffect + ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE + call GetTurnDuelistVariable + ld a, [hl] + ld [wAIMinDamage], a + ld [wAIMaxDamage], a + ret + +.InitialEffect1 + ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE + call GetTurnDuelistVariable + ld a, [hli] + or [hl] + inc hl + or [hl] + inc hl + ret nz ; return if has last turn damage + ld a, [hli] + or a + ret nz ; return if has last turn status + ; no attack received last turn + ldtx hl, YouDidNotReceiveAnAttackToMirrorMoveText + scf + ret + +.InitialEffect2 + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + or a + ret z ; no effect + cp LAST_TURN_EFFECT_AMNESIA + jp z, PlayerPickAttackForAmnesia + or a + ret + +.PlayerSelection + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + or a + ret z ; no effect +; handle Energy card discard effect + cp LAST_TURN_EFFECT_DISCARD_ENERGY + jp z, HandleEnergyDiscardEffectSelection + ret + +.AISelection + ld a, $ff + ldh [hTemp_ffa0], a + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + or a + ret z ; no effect + cp LAST_TURN_EFFECT_DISCARD_ENERGY + jr z, .dicard_energy + cp LAST_TURN_EFFECT_AMNESIA + jr z, .pick_amnesia_attack + ret + +.dicard_energy + call AIPickEnergyCardToDiscardFromDefendingPokemon + ldh [hTemp_ffa0], a + ret + +.pick_amnesia_attack + call AIPickAttackForAmnesia + ldh [hTemp_ffa0], a + ret + +.BeforeDamage +; if was attacked with Amnesia, apply it to the selected attack + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + cp LAST_TURN_EFFECT_AMNESIA + jr z, .apply_amnesia + +; otherwise, check if there was last turn damage, +; and write it to wDamage. + ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE + call GetTurnDuelistVariable + ld de, wDamage + ld a, [hli] + ld [de], a + inc de + ld a, [hld] + ld [de], a + or [hl] + jr z, .no_damage + ld a, $01 + ld [wLoadedMoveAnimation], a +.no_damage + inc hl + inc hl ; DUELVARS_ARENA_CARD_LAST_TURN_STATUS +; check if there was a status applied to Defending Pokemon +; from the attack it used. + push hl + ld a, DUELVARS_ARENA_CARD_STATUS + call GetNonTurnDuelistVariable + ld e, l + ld d, h + pop hl + ld a, [hli] + or a + jr z, .no_status + push hl + push de + call .ExecuteStatusEffect + pop de + pop hl +.no_status +; hl is at DUELVARS_ARENA_CARD_LAST_TURN_SUBSTATUS2 +; apply substatus2 to self + ld e, DUELVARS_ARENA_CARD_SUBSTATUS2 + ld a, [hli] + ld [de], a + ret + +.apply_amnesia + call ApplyAmnesiaToAttack + ret +; 0x2ea28 + +.AfterDamage: ; 2ea28 (b:6a28) + ld a, [wNoDamageOrEffect] + or a + ret nz ; is unaffected + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + cp LAST_TURN_EFFECT_DISCARD_ENERGY + jr nz, .change_weakness + +; execute Energy discard effect for card chosen + call SwapTurn + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY + call SwapTurn + +.change_weakness + ld a, DUELVARS_ARENA_CARD_LAST_TURN_CHANGE_WEAK + call GetTurnDuelistVariable + ld a, [hl] + or a + ret z ; weakness wasn't changed last turn + + push hl + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + call SwapTurn + pop hl + + ld a, [wLoadedCard2Weakness] + or a + ret z ; defending Pokemon has no weakness to change + +; apply same color weakness to Defending Pokemon + ld a, [hl] + push af + ld a, DUELVARS_ARENA_CARD_CHANGED_WEAKNESS + call GetNonTurnDuelistVariable + pop af + ld [hl], a + +; print message of weakness color change + ld c, -1 +.loop_color + inc c + rla + jr nc, .loop_color + ld a, c + call SwapTurn + push af + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + pop af + call LoadCardNameAndInputColor + ldtx hl, ChangedTheWeaknessOfPokemonToColorText + call DrawWideTextBox_PrintText + call SwapTurn + ret +; 0x2ea8f + +.ExecuteStatusEffect: ; 2ea8f (b:6a8f) + ld c, a + and PSN_DBLPSN + jr z, .cnf_slp_prz + ld b, a + cp DOUBLE_POISONED + push bc + call z, DoublePoisonEffect + pop bc + ld a, b + cp POISONED + push bc + call z, PoisonEffect + pop bc +.cnf_slp_prz + ld a, c + and CNF_SLP_PRZ + ret z + cp CONFUSED + jp z, ConfusionEffect + cp ASLEEP + jp z, SleepEffect + cp PARALYZED + jp z, ParalysisEffect + ret +; 0x2eab8 + +FearowAgilityEffect: ; 2eab8 (b:6ab8) + ldtx de, IfHeadsDoNotReceiveDamageOrEffectText + call TossCoin_BankB + ret nc + ld a, $52 + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_AGILITY + call ApplySubstatus1ToDefendingCard + ret +; 0x2eaca + +; return carry if cannot use Step In +StepIn_BenchCheck: ; 2eaca (b:6aca) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ldtx hl, CanOnlyBeUsedOnTheBenchText + or a + jr z, .set_carry + + add DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + ldtx hl, OnlyOncePerTurnText + and USED_PKMN_POWER_THIS_TURN + jr nz, .set_carry + + ldh a, [hTempPlayAreaLocation_ff9d] + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + ret + +.set_carry + scf + ret +; 0x2eae8 + +StepIn_SwitchEffect: ; 2eae8 (b:6ae8) + ldh a, [hTemp_ffa0] + ld e, a + call SwapArenaWithBenchPokemon + ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_PKMN_POWER_THIS_TURN_F, [hl] + ret +; 0x2eaf6 + +Dragonite2Slam_AIEffect: ; 2eaf6 (b:6af6) + ld a, (40 * 2) / 2 + lb de, 0, 80 + jp StoreAIDamageInfo +; 0x2eafe + +Dragonite2Slam_MultiplierEffect: ; 2eafe (b:6afe) + ld hl, 40 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + add a + add a + call ATimes10 + call StoreDamageInfo + ret +; 0x2eb15 + +ThickSkinnedEffect: ; 2eb15 (b:6b15) + scf + ret +; 0x2eb17 + +LeekSlap_AIEffect: ; 2eb17 (b:6b17) + ld a, 30 / 2 + lb de, 0, 30 + jp StoreAIDamageInfo +; 0x2eb1f + +; return carry if already used attack in this duel +LeekSlap_OncePerDuelCheck: ; 2eb1f (b:6b1f) +; can only use attack if it was never used before this duel + ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + and USED_LEEK_SLAP_THIS_DUEL + ret z + ldtx hl, ThisAttackCannotBeUsedTwiceText + scf + ret +; 0x2eb2c + +LeekSlap_SetUsedThisDuelFlag: ; 2eb2c (b:6b2c) + ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + call GetTurnDuelistVariable + set USED_LEEK_SLAP_THIS_DUEL_F, [hl] + ret +; 0x2eb34 + +LeekSlap_NoDamage50PercentEffect: ; 2eb34 (b:6b34) + ldtx de, DamageCheckIfTailsNoDamageText + call TossCoin_BankB + ret c + xor a ; 0 damage + call StoreDamageInfo + ret +; 0x2eb40 + +FetchEffect: ; 2eb40 (b:6b40) + ldtx hl, Draw1CardFromTheDeckText + call DrawWideTextBox_WaitForInput + bank1call DisplayDrawOneCardScreen + call DrawCardFromDeck + ret c ; return if deck is empty + call AddCardToHand + call LoadCardDataToBuffer1_FromDeckIndex + ld a, [wDuelistType] + cp DUELIST_TYPE_PLAYER + ret nz + ; show card on screen if it was Player + bank1call OpenCardPage_FromHand + ret +; 0x2eb5d + +CometPunch_AIEffect: ; 2eb5d (b:6b5d) + ld a, (20 * 4) / 2 + lb de, 0, 80 + jp StoreAIDamageInfo +; 0x2eb65 + +CometPunch_MultiplerEffect: ; 2eb65 (b:6b65) + ld hl, 20 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 4 + call TossCoinATimes_BankB + add a + call ATimes10 + call StoreDamageInfo + ret +; 0x2eb7b + +TaurosStomp_AIEffect: ; 2eb7b (b:6b7b) + ld a, (20 + 30) / 2 + lb de, 20, 30 + jp StoreAIDamageInfo +; 0x2eb83 + +TaurosStomp_DamageBoostEffect: ; 2eb83 (b:6b83) + ld hl, 10 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsPlusDamageText + call TossCoin_BankB + ret nc ; tails + ld a, 10 + call AddToDamage + ret +; 0x2eb96 + +Rampage_AIEffect: ; 2eb96 (b:6b96) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + jp SetMinMaxDamageSameAsDamage +; 0x2eba1 + +Rampage_Confusion50PercentEffect: ; 2eba1 (b:6ba1) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + ldtx de, IfTailsYourPokemonBecomesConfusedText + call TossCoin_BankB + ret c ; heads + call SwapTurn + call ConfusionEffect + call SwapTurn + ret +; 0x2ebba + +FuryAttack_AIEffect: ; 2ebba (b:6bba) + ld a, (10 * 2) / 2 + lb de, 0, 20 + jp StoreAIDamageInfo +; 0x2ebc2 + +FuryAttack_MultiplerEffect: ; 2ebc2 (b:6bc2) + ld hl, 10 + call LoadTxRam3 + ld a, 2 + ldtx de, DamageCheckIfHeadsXDamageText + call TossCoinATimes_BankB + call ATimes10 + call StoreDamageInfo + ret +; 0x2ebd7 + +RetreatAidEffect: ; 2ebd7 (b:6bd7) + scf + ret +; 0x2ebd9 + +DodrioRage_AIEffect: ; 2ebd9 (b:6bd9) + call DodrioRage_DamageBoostEffect + jp SetMinMaxDamageSameAsDamage +; 0x2ebdf + +DodrioRage_DamageBoostEffect: ; 2ebdf (b:6bdf) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + call AddToDamage + ret +; 0x2ebe8 + +PayDayEffect: ; 2ebe8 (b:6be8) + ldtx de, IfHeadsDraw1CardFromDeckText + call TossCoin_BankB + ret nc ; tails + ldtx hl, Draw1CardFromTheDeckText + call DrawWideTextBox_WaitForInput + bank1call DisplayDrawOneCardScreen + call DrawCardFromDeck + ret c ; empty deck + call AddCardToHand + call LoadCardDataToBuffer1_FromDeckIndex + ld a, [wDuelistType] + cp DUELIST_TYPE_PLAYER + ret nz + ; show card on screen if it was Player + bank1call OpenCardPage_FromHand + ret +; 0x2ec0c + +DragonairSlam_AIEffect: ; 2ec0c (b:6c0c) + ld a, (30 * 2) / 2 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2ec14 + +DragonairSlam_MultiplierEffect: ; 2ec14 (b:6c14) + ld hl, 30 + call LoadTxRam3 + ld a, 2 + ldtx de, DamageCheckIfHeadsXDamageText + call TossCoinATimes_BankB + ld e, a + add a + add e + call ATimes10 + call StoreDamageInfo + ret +; 0x2ec2c + +DragonairHyperBeam_PlayerSelectEffect: ; 2ec2c (b:6c2c) + jp HandleEnergyDiscardEffectSelection +; 0x2ec2f + +DragonairHyperBeam_AISelectEffect: ; 2ec2f (b:6c2f) + call AIPickEnergyCardToDiscardFromDefendingPokemon + ldh [hTemp_ffa0], a + ret +; 0x2ec35 + +DragonairHyperBeam_DiscardEffect: ; 2ec35 (b:6c35) + call HandleNoDamageOrEffect + ret c ; is unaffected + ldh a, [hTemp_ffa0] + cp $ff + ret z ; no energy card chosen + call SwapTurn + call PutCardInDiscardPile + ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT + call GetTurnDuelistVariable + ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY + call SwapTurn + ret +; 0x2ec4f + +; handles screen for selecting an Energy card to discard +; that is attached to Defending Pokemon, +; and store the Player selection in [hTemp_ffa0]. +HandleEnergyDiscardEffectSelection: ; 2ec4f (b:6c4f) + call SwapTurn + xor a ; PLAY_AREA_ARENA + call CreateArenaOrBenchEnergyCardList + jr c, .no_energy + ldtx hl, ChooseDiscardEnergyCardFromOpponentText + call DrawWideTextBox_WaitForInput + xor a ; PLAY_AREA_ARENA + bank1call DisplayEnergyDiscardScreen + +.loop_input + bank1call HandleEnergyDiscardMenuInput + jr c, .loop_input + + call SwapTurn + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a ; store selected card to discard + ret + +.no_energy + call SwapTurn + ld a, $ff + ldh [hTemp_ffa0], a + ret +; 0x2ec77 + +; return carry if Defending Pokemon has no attacks +ClefableMetronome_CheckAttacks: ; 2ec77 (b:6c77) + call CheckIfDefendingPokemonHasAnyAttack + ldtx hl, NoAttackMayBeChoosenText + ret +; 0x2ec7e + +ClefableMetronome_AISelectEffect: ; 2ec7e (b:6c7e) + call HandleAIMetronomeEffect + ret +; 0x2ec82 + +ClefableMetronome_UseAttackEffect: ; 2ec82 (b:6c82) + ld a, 1 ; energy cost of this attack + call HandlePlayerMetronomeEffect + ret +; 0x2ec88 + +ClefableMinimizeEffect: ; 2ec88 (b:6c88) + ld a, SUBSTATUS1_REDUCE_BY_20 + call ApplySubstatus1ToDefendingCard + ret +; 0x2ec8e + +HurricaneEffect: ; 2ec8e (b:6c8e) + call HandleNoDamageOrEffect + ret c ; is unaffected + + ld a, DUELVARS_ARENA_CARD_HP + call GetNonTurnDuelistVariable + or a + ret z ; return if Pokemon was KO'd + +; look at all the card locations and put all cards +; that are in the Arena in the hand. + call SwapTurn + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_locations + ld a, [hl] + cp CARD_LOCATION_ARENA + jr nz, .next_card + ; card in Arena found, put in hand + ld a, l + call AddCardToHand +.next_card + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_locations + +; empty the Arena card slot + ld l, DUELVARS_ARENA_CARD + ld a, [hl] + ld [hl], $ff + ld l, DUELVARS_ARENA_CARD_HP + ld [hl], 0 + call LoadCardDataToBuffer1_FromDeckIndex + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam2 + ldtx hl, PokemonAndAllAttachedCardsReturnedToHandText + call DrawWideTextBox_WaitForInput + xor a + ld [wDuelDisplayedScreen], a + call SwapTurn + ret +; 0x2ecd3 + +PidgeottoWhirlwind_SelectEffect: ; 2ecd3 (b:6cd3) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr nc, .switch + ; no Bench Pokemon + ld a, $ff + ldh [hTemp_ffa0], a + ret +.switch + call DuelistSelectForcedSwitch + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2ece9 + +PidgeottoWhirlwind_SwitchEffect: ; 2ece9 (b:6ce9) + ldh a, [hTemp_ffa0] + call HandleSwitchDefendingPokemonEffect + ret +; 0x2ecef + +PidgeottoMirrorMove_AIEffect: ; 2ecef (b:6cef) + jp MirrorMoveEffects.AIEffect +; 0x2ecf2 + +PidgeottoMirrorMove_InitialEffect1: ; 2ecf2 (b:6cf2) + jp MirrorMoveEffects.InitialEffect1 +; 0x2ecf5 + +PidgeottoMirrorMove_InitialEffect2: ; 2ecf5 (b:6cf5) + jp MirrorMoveEffects.InitialEffect2 +; 0x2ecf8 + +PidgeottoMirrorMove_PlayerSelection: ; 2ecf8 (b:6cf8) + jp MirrorMoveEffects.PlayerSelection +; 0x2ecfb + +PidgeottoMirrorMove_AISelection: ; 2ecfb (b:6cfb) + jp MirrorMoveEffects.AISelection +; 0x2ecfe + +PidgeottoMirrorMove_BeforeDamage: ; 2ecfe (b:6cfe) + jp MirrorMoveEffects.BeforeDamage +; 0x2ed01 + +PidgeottoMirrorMove_AfterDamage: ; 2ed01 (b:6d01) + jp MirrorMoveEffects.AfterDamage +; 0x2ed04 + +SingEffect: ; 2ed04 (b:6d04) + call Sleep50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2ed0b + +; return carry if Defending Pokemon has no attacks +ClefairyMetronome_CheckAttacks: ; 2ed0b (b:6d0b) + call CheckIfDefendingPokemonHasAnyAttack + ldtx hl, NoAttackMayBeChoosenText + ret +; 0x2ed12 + +ClefairyMetronome_AISelectEffect: ; 2ed12 (b:6d12) + call HandleAIMetronomeEffect + ret +; 0x2ed16 + +ClefairyMetronome_UseAttackEffect: ; 2ed16 (b:6d16) + ld a, 3 ; energy cost of this attack +; fallthrough + +; handles Metronome selection, and validates +; whether it can use the selected attack. +; if unsuccessful, returns carry. +; input: +; a = amount of colorless energy needed for Metronome +HandlePlayerMetronomeEffect: ; 2ed18 (b:6d18) + ld [wMetronomeEnergyCost], a + ldtx hl, ChooseOppAttackToBeUsedWithMetronomeText + call DrawWideTextBox_WaitForInput + + call HandleDefendingPokemonAttackSelection + ret c ; return if operation cancelled + +; store this attack as selected attack to use + ld hl, wMetronomeSelectedAttack + ld [hl], d + inc hl + ld [hl], e + +; compare selected attack's name with +; the attack that is loaded, which is Metronome. +; if equal, then cannot select it. +; (i.e. cannot use Metronome with Metronome.) + ld hl, wLoadedMoveName + ld a, [hli] + ld h, [hl] + ld l, a + push hl + call SwapTurn + call CopyMoveDataAndDamage_FromDeckIndex + call SwapTurn + pop de + ld hl, wLoadedMoveName + ld a, e + cp [hl] + jr nz, .try_use + inc hl + ld a, d + cp [hl] + jr nz, .try_use + ; cannot select Metronome + ldtx hl, UnableToSelectText +.failed + call DrawWideTextBox_WaitForInput +.set_carry + scf + ret + +.try_use +; run the attack checks to determine +; whether it can be used. + ld a, EFFECTCMDTYPE_INITIAL_EFFECT_1 + call TryExecuteEffectCommandFunction + jr c, .failed + ld a, EFFECTCMDTYPE_INITIAL_EFFECT_2 + call TryExecuteEffectCommandFunction + jr c, .set_carry + ; successful + +; send data to link opponent + bank1call SendAttackDataToLinkOpponent + ld a, OPPACTION_USE_METRONOME_ATTACK + call SetOppAction_SerialSendDuelData + ld hl, wMetronomeSelectedAttack + ld d, [hl] + inc hl + ld e, [hl] + ld a, [wMetronomeEnergyCost] + ld c, a + call SerialSend8Bytes + + ldh a, [hTempCardIndex_ff9f] + ld [wPlayerAttackingCardIndex], a + ld a, [wSelectedAttack] + ld [wPlayerAttackingMoveIndex], a + ld a, [wTempCardID_ccc2] + ld [wPlayerAttackingCardID], a + or a + ret +; 0x2ed86 + +; does nothing for AI. +HandleAIMetronomeEffect: ; 2ed86 (b:6d86) + ret +; 0x2ed87 + +DoTheWaveEffect: ; 2ed87 (b:6d87) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + dec a ; don't count arena card + call ATimes10 + call AddToDamage + ret +; 0x2ed94 + +; return carry if no damage counters +FirstAid_DamageCheck: ; 2ed94 (b:6d94) + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ldtx hl, NoDamageCountersText + cp 10 + ret +; 0x2ed9f + +FirstAid_HealEffect: ; 2ed9f (b:6d9f) + lb de, 0, 10 + call ApplyAndAnimateHPRecovery + ret +; 0x2eda6 + +JigglypuffDoubleEdgeEffect: ; 2eda6 (b:6da6) + ld a, 20 + call DealRecoilDamageToSelf + ret +; 0x2edac + +PounceEffect: ; 2edac (b:6dac) + ld a, SUBSTATUS2_POUNCE + call ApplySubstatus2ToDefendingCard + ret +; 0x2edb2 + +LickitungSupersonicEffect: ; 2edb2 (b:6db2) + call Confusion50PercentEffect + call nc, SetNoEffectFromStatus + ret +; 0x2edb9 + +PidgeyWhirlwind_SelectEffect: ; 2edb9 (b:6db9) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + cp 2 + jr nc, .switch + ; no Bench Pokemon + ld a, $ff + ldh [hTemp_ffa0], a + ret +.switch + call DuelistSelectForcedSwitch + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2edcf + +PidgeyWhirlwind_SwitchEffect: ; 2edcf (b:6dcf) + ldh a, [hTemp_ffa0] + call HandleSwitchDefendingPokemonEffect + ret +; 0x2edd5 + +; return carry if Defending card has no weakness +Conversion1_WeaknessCheck: ; 2edd5 (b:6dd5) + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + call SwapTurn + ld a, [wLoadedCard2Weakness] + or a + ret nz + ldtx hl, NoWeaknessText + scf + ret +; 0x2eded + +Conversion1_PlayerSelectEffect: ; 2eded (b:6ded) + ldtx hl, ChooseWeaknessYouWishToChangeText + xor a ; PLAY_AREA_ARENA + call HandleColorChangeScreen + ldh [hTemp_ffa0], a + ret +; 0x2edf7 + +Conversion1_AISelectEffect: ; 2edf7 (b:6df7) + call AISelectConversionColor + ret +; 0x2edfb + +Conversion1_ChangeWeaknessEffect: ; 2edfb (b:6dfb) + call HandleNoDamageOrEffect + ret c ; is unaffected + +; apply changed weakness + ld a, DUELVARS_ARENA_CARD_CHANGED_WEAKNESS + call GetNonTurnDuelistVariable + ldh a, [hTemp_ffa0] + call TranslateColorToWR + ld [hl], a + ld l, DUELVARS_ARENA_CARD_LAST_TURN_CHANGE_WEAK + ld [hl], a + +; print text box + call SwapTurn + ldtx hl, ChangedTheWeaknessOfPokemonToColorText + call PrintArenaCardNameAndColorText + call SwapTurn + +; apply substatus + ld a, SUBSTATUS2_CONVERSION2 + call ApplySubstatus2ToDefendingCard + ret +; 0x2ee1f + +; returns carry if Active Pokemon has no Resistance. +Conversion2_ResistanceCheck: ; 2ee1f (b:6e1f) + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Resistance] + or a + ret nz + ldtx hl, NoResistanceText + scf + ret +; 0x2ee31 + +Conversion2_PlayerSelectEffect: ; 2ee31 (b:6e31) + ldtx hl, ChooseResistanceYouWishToChangeText + ld a, $80 + call HandleColorChangeScreen + ldh [hTemp_ffa0], a + ret +; 0x2ee3c + +Conversion2_AISelectEffect: ; 2ee3c (b:6e3c) +; AI will choose Defending Pokemon's color +; unless it is colorless. + call SwapTurn + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + call SwapTurn + ld a, [wLoadedCard1Type] + cp COLORLESS + jr z, .is_colorless + ldh [hTemp_ffa0], a + ret + +.is_colorless + call SwapTurn + call AISelectConversionColor + call SwapTurn + ret +; 0x2ee5e + +Conversion2_ChangeResistanceEffect: ; 2ee5e (b:6e5e) +; apply changed resistance + ld a, DUELVARS_ARENA_CARD_CHANGED_RESISTANCE + call GetTurnDuelistVariable + ldh a, [hTemp_ffa0] + call TranslateColorToWR + ld [hl], a + ldtx hl, ChangedTheResistanceOfPokemonToColorText +; fallthrough + +; prints text that requires card name and color, +; with the card name of the Turn Duelist's Arena Pokemon +; and color in [hTemp_ffa0]. +; input: +; hl = text to print +PrintArenaCardNameAndColorText: ; 2ee6c (b:6e6c) + push hl + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ldh a, [hTemp_ffa0] + call LoadCardNameAndInputColor + pop hl + call DrawWideTextBox_PrintText + ret +; 0x2ee7f + +; handles AI logic for selecting a new color +; for weakness/resistance. +; - if within the context of Conversion1, looks +; in own Bench for a non-colorless card that can attack. +; - if within the context of Conversion2, looks +; in Player's Bench for a non-colorless card that can attack. +AISelectConversionColor: ; 2ee7f (b:6e7f) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld d, a + ld e, PLAY_AREA_ARENA + jr .next_pkmn_atk + +; look for a non-colorless Bench Pokemon +; that has enough energy to use an attack. +.loop_atk + push de + call GetPlayAreaCardAttachedEnergies + ld a, e + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld d, a + call LoadCardDataToBuffer1_FromDeckIndex + ld a, [wLoadedCard1Type] + cp COLORLESS + jr z, .skip_pkmn_atk ; skip colorless Pokemon + ld e, FIRST_ATTACK_OR_PKMN_POWER + bank1call _CheckIfEnoughEnergiesToMove + jr nc, .found + ld e, SECOND_ATTACK + bank1call _CheckIfEnoughEnergiesToMove + jr nc, .found +.skip_pkmn_atk + pop de +.next_pkmn_atk + inc e + dec d + jr nz, .loop_atk + +; none found in Bench. +; next, look for a non-colorless Bench Pokemon +; that has any Energy cards attached. + ld d, e ; number of Play Area Pokemon + ld e, PLAY_AREA_ARENA + jr .next_pkmn_energy + +.loop_energy + push de + call GetPlayAreaCardAttachedEnergies + ld a, [wTotalAttachedEnergies] + or a + jr z, .skip_pkmn_energy + ld a, e + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ld d, a + call LoadCardDataToBuffer1_FromDeckIndex + ld a, [wLoadedCard1Type] + cp COLORLESS + jr nz, .found +.skip_pkmn_energy + pop de +.next_pkmn_energy + inc e + dec d + jr nz, .loop_energy + +; otherwise, just select a random energy. + ld a, NUM_COLORED_TYPES + call Random + ldh [hTemp_ffa0], a + ret + +.found + pop de + ld a, [wLoadedCard1Type] + and TYPE_PKMN + ldh [hTemp_ffa0], a + ret +; 0x2eee7 + +ScrunchEffect: ; 2eee7 (b:6ee7) + ldtx de, IfHeadsNoDamageNextTurnText + call TossCoin_BankB + jp nc, SetWasUnsuccessful + ld a, $6b + ld [wLoadedMoveAnimation], a + ld a, SUBSTATUS1_NO_DAMAGE_17 + call ApplySubstatus1ToDefendingCard + ret +; 0x2eefb + +ChanseyDoubleEdgeEffect: ; 2eefb (b:6efb) + ld a, 80 + call DealRecoilDamageToSelf + ret +; 0x2ef01 + +SuperFang_AIEffect: ; 2ef01 (b:6f01) + call SuperFang_HalfHPEffect + jp SetMinMaxDamageSameAsDamage +; 0x2ef07 + +SuperFang_HalfHPEffect: ; 2ef07 (b:6f07) + ld a, DUELVARS_ARENA_CARD_HP + call GetNonTurnDuelistVariable + srl a + bit 0, a + jr z, .rounded + ; round up + add 5 +.rounded + call StoreDamageInfo + ret +; 0x2ef18 + +; return carry if no Pokemon in Bench +TrainerCardAsPokemon_BenchCheck: ; 2ef18 (b:6f18) + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2ef27 + +TrainerCardAsPokemon_PlayerSelectSwitch: ; 2ef27 (b:6f27) + ldh a, [hTemp_ffa0] + or a + ret nz ; no need to switch if it's not Arena card + + ldtx hl, SelectPokemonToPlaceInTheArenaText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + bank1call OpenPlayAreaScreenForSelection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2ef3c + +TrainerCardAsPokemon_DiscardEffect: ; 2ef3c (b:6f3c) + ldh a, [hTemp_ffa0] + ld e, a + call MovePlayAreaCardToDiscardPile + ldh a, [hTemp_ffa0] + or a + jr nz, .shift_cards + ldh a, [hTempPlayAreaLocation_ffa1] + ld e, a + call SwapArenaWithBenchPokemon +.shift_cards + call ShiftAllPokemonToFirstPlayAreaSlots + ret +; 0x2ef51 + +HealingWind_InitialEffect: ; 2ef51 (b:6f51) + scf + ret +; 0x2ef53 + +HealingWind_PlayAreaHealEffect: ; 2ef53 (b:6f53) +; play initial animation + ldh a, [hTempPlayAreaLocation_ff9d] + ld b, a + ld c, $00 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + ld a, $86 + ld [wLoadedMoveAnimation], a + + + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld d, a + ld e, PLAY_AREA_ARENA +.loop_play_area + push de + ld a, e + ldh [hTempPlayAreaLocation_ff9d], a + call GetCardDamageAndMaxHP + or a + jr z, .next_pkmn ; skip if no damage + +; if less than 20 damage, cap recovery at 10 damage + ld de, 20 + cp e + jr nc, .heal + ld e, a + +.heal +; add HP to this card + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + add e + ld [hl], a + +; play heal animation + ldh a, [hTempPlayAreaLocation_ff9d] + ld b, a + ld c, $01 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation +.next_pkmn + pop de + inc e + dec d + jr nz, .loop_play_area + + ret +; 0x2ef9c + +Dragonite1Slam_AIEffect: ; 2ef9c (b:6f9c) + ld a, (30 * 2) / 2 + lb de, 0, 60 + jp StoreAIDamageInfo +; 0x2efa4 + +Dragonite1Slam_MultiplierEffect: ; 2efa4 (b:6fa4) + ld hl, 30 + call LoadTxRam3 + ldtx de, DamageCheckIfHeadsXDamageText + ld a, 2 + call TossCoinATimes_BankB + ld c, a + add a + add c + call ATimes10 + call StoreDamageInfo + ret +; 0x2efbc + + INCROM $2efbc, $2efe0 + +CatPunchEffect: ; 2efe0 (b:6fe0) + call SwapTurn + call PickRandomPlayAreaCard + ld b, a + ld a, $83 + ld [wLoadedMoveAnimation], a + ld de, 20 + call DealDamageToPlayAreaPokemon + call SwapTurn + ret +; 0x2eff6 + +MorphEffect: ; 2eff6 (b:6ff6) + call ExchangeRNG + call .PickRandomBasicPokemonFromDeck + jr nc, .successful + ldtx hl, AttackUnsuccessfulText + call DrawWideTextBox_WaitForInput + ret + +.successful + ld a, DUELVARS_ARENA_CARD_STAGE + call GetTurnDuelistVariable + or a + jr z, .skip_discard_stage_below + +; if this is a stage 1 Pokemon (in case it's used +; by Clefable's Metronome attack) then first discard +; the lower stage card. + push hl + xor a + ldh [hTempPlayAreaLocation_ff9d], a + bank1call GetCardOneStageBelow + ld a, d + call PutCardInDiscardPile + pop hl + ld [hl], BASIC + +.skip_discard_stage_below +; overwrite card ID + ldh a, [hTempCardIndex_ff98] + call GetCardIDFromDeckIndex + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ldh [hTempCardIndex_ff98], a + call _GetCardIDFromDeckIndex + ld [hl], e + +; overwrite HP to new card's maximum HP + ld e, PLAY_AREA_ARENA + call GetCardDamageAndMaxHP + ld a, DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + ld [hl], c + +; clear changed color and status + ld l, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld [hl], $00 + call ClearAllStatusConditions + +; load both card's names for printing text + ld a, [wTempTurnDuelistCardID] + ld e, a + ld d, $00 + call LoadCardDataToBuffer2_FromCardID + ld hl, wLoadedCard2Name + ld de, wTxRam2 + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + ldh a, [hTempCardIndex_ff98] + call LoadCardDataToBuffer2_FromDeckIndex + ld hl, wLoadedCard2Name + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ldtx hl, MetamorphsToText + call DrawWideTextBox_WaitForInput + + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2f06a + +; picks a random Pokemon in the Deck to morph. +; needs to be a Basic Pokemon that doesn't have +; the same ID as the Arena card. +; returns carry if no Pokemon were found. +.PickRandomBasicPokemonFromDeck ; 2f06a (b:706a) + call CreateDeckCardList + ret c ; empty deck + ld hl, wDuelTempList + call ShuffleCards +.loop_deck + ld a, [hli] + ldh [hTempCardIndex_ff98], a + cp $ff + jr z, .set_carry + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .loop_deck ; skip non-Pokemon cards + ld a, [wLoadedCard2Stage] + or a + jr nz, .loop_deck ; skip non-Basic cards + ld a, [wLoadedCard2ID] + cp DUELVARS_ARENA_CARD + jr z, .loop_deck ; skip cards with same ID as Arena card + ldh a, [hTempCardIndex_ff98] + or a + ret +.set_carry + scf + ret +; 0x2f098 + +; returns in a and [hTempCardIndex_ff98] the deck index +; of random Basic Pokemon card in deck. +; if none are found, return carry. +PickRandomBasicCardFromDeck: ; 2f098 (b:7098) + call CreateDeckCardList + ret c ; return if empty deck + ld hl, wDuelTempList + call ShuffleCards +.loop_deck + ld a, [hli] + ldh [hTempCardIndex_ff98], a + cp $ff + jr z, .set_carry + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .loop_deck ; skip if not Pokemon card + ld a, [wLoadedCard2Stage] + or a + jr nz, .loop_deck ; skip if not Basic stage + ldh a, [hTempCardIndex_ff98] + or a + ret +.set_carry + scf + ret +; 0x2f0bf + +SlicingWindEffect: ; 2f0bf (b:70bf) + call SwapTurn + call PickRandomPlayAreaCard + ld b, a + ld de, 30 + call DealDamageToPlayAreaPokemon_RegularAnim + call SwapTurn + ret +; 0x2f0d0 + +Gale_LoadAnimation: ; 2f0d0 (b:70d0) + ld a, $87 + ld [wLoadedMoveAnimation], a + ret +; 0x2f0d6 + +Gale_SwitchEffect: ; 2f0d6 (b:70d6) +; if Defending card is unaffected by attack +; jump directly to switching this card only. + call HandleNoDamageOrEffect + jr c, .SwitchWithRandomBenchPokemon + +; handle switching Defending card + ld a, DUELVARS_ARENA_CARD_HP + call GetNonTurnDuelistVariable + or a + jr nz, .skip_destiny_bond + bank1call HandleDestinyBondSubstatus +.skip_destiny_bond + call SwapTurn + call .SwitchWithRandomBenchPokemon + jr c, .skip_clear_damage +; clear dealt damage because Pokemon was switched + xor a + ld hl, wDealtDamage + ld [hli], a + ld [hl], a +.skip_clear_damage + call SwapTurn +; fallthrough for attacking card switch + +.SwitchWithRandomBenchPokemon + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + cp 2 + ret c ; return if no Bench Pokemon + +; get random Bench location and swap + dec a + call Random + inc a + ld e, a + call SwapArenaWithBenchPokemon + + xor a + ld [wDuelDisplayedScreen], a + ret +; 0x2f10d + +; return carry if Bench is full +FriendshipSong_BenchCheck: ; 2f10d (b:710d) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2f119 + +FriendshipSong_AddToBench50PercentEffect: ; 2f119 (b:7119) + ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText + call TossCoin_BankB + jr c, .successful + +.none_came_text + ldtx hl, NoneCameText + call DrawWideTextBox_WaitForInput + ret + +.successful + call PickRandomBasicCardFromDeck + jr nc, .put_in_bench + ld a, $6a + call Func_2c12e + call .none_came_text + call Func_2c0bd + ret + +.put_in_bench + call SearchCardInDeckAndAddToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + ld a, $6a + call Func_2c12e + ldh a, [hTempCardIndex_ff98] + ldtx hl, CameToTheBenchText + bank1call DisplayCardDetailScreen + call Func_2c0bd + ret +; 0x2f153 + +ExpandEffect: ; 2f153 (b:7153) + ld a, SUBSTATUS1_REDUCE_BY_10 + call ApplySubstatus1ToDefendingCard + ret +; 0x2f159 + + INCROM $2f159, $30000 diff --git a/src/engine/home.asm b/src/engine/home.asm index 3c659d8b..fb6c145f 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -4379,7 +4379,7 @@ Func_16f6: ; 16f6 (0:16f6) ld [wEffectFailed], a ld [wIsDamageToSelf], a ld [wccef], a - ld [wccf0], a + ld [wMetronomeEnergyCost], a ld [wNoEffectFromStatus], a bank1call ClearNonTurnTemporaryDuelvars_CopyStatus ret diff --git a/src/text/text1.asm b/src/text/text1.asm index 577bef56..23ad017d 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -927,21 +927,21 @@ NoAttackMayBeChoosenText: ; 3781b (d:781b) text "No Attacks may be choosen." done -Text00c6: ; 37837 (d:7837) +YouDidNotReceiveAnAttackToMirrorMoveText: ; 37837 (d:7837) text "You did not receive an Attack" line "to Mirror Move." done -Text00c7: ; 37866 (d:7866) +ThisAttackCannotBeUsedTwiceText: ; 37866 (d:7866) text "This attack cannot" line "be used twice." done -Text00c8: ; 37889 (d:7889) +NoWeaknessText: ; 37889 (d:7889) text "No Weakness." done -Text00c9: ; 37897 (d:7897) +NoResistanceText: ; 37897 (d:7897) text "No Resistance." done @@ -977,7 +977,7 @@ CannotUseBecauseItWillBeKnockedOutText: ; 37982 (d:7982) line "it will be Knocked Out." done -Text00d1: ; 379ae (d:79ae) +CanOnlyBeUsedOnTheBenchText: ; 379ae (d:79ae) text "Can only be used on the Bench." done @@ -1083,7 +1083,7 @@ DamageCheckIfTailsNoDamageText: ; 37d4a (d:7d4a) line "If Tails, no damage!!!" done -Text00e7: ; 37d70 (d:7d70) +IfHeadsDraw1CardFromDeckText: ; 37d70 (d:7d70) text "If Heads," line "Draw 1 card from Deck!" done diff --git a/src/text/text2.asm b/src/text/text2.asm index 9c127f54..9d328b6d 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -116,7 +116,7 @@ NoDamageOrEffectDueToTransparencyText: ; 384d8 (e:44d8) line "due to the effects of Transparency" done -Text010d: ; 3851f (e:451f) +MetamorphsToText: ; 3851f (e:451f) text "" line "metamorphs to ." done @@ -136,12 +136,12 @@ DuelistIsSelectingPokemonToPlaceInArenaText: ; 3859e (e:459e) line "to place in the Arena." done -Text0111: ; 385cf (e:45cf) +ChooseWeaknessYouWishToChangeText: ; 385cf (e:45cf) text "Choose the Weakness you wish" line "to change with Conversion 1." done -Text0112: ; 3860a (e:460a) +ChooseResistanceYouWishToChangeText: ; 3860a (e:460a) text "Choose the Resistance you wish" line "to change with Conversion 2." done @@ -151,13 +151,13 @@ ChoosePokemonWishToColorChangeText: ; 38647 (e:4647) line "wish to change with Color change." done -Text0114: ; 3868d (e:468d) +ChangedTheWeaknessOfPokemonToColorText: ; 3868d (e:468d) text "Changed the Weakness of" line "" text " to ." done -Text0115: ; 386af (e:46af) +ChangedTheResistanceOfPokemonToColorText: ; 386af (e:46af) text "Changed the Resistance of" line "" text " to ." @@ -169,7 +169,7 @@ ChangedTheColorOfText: ; 386d3 (e:46d3) text " to ." done -Text0117: ; 386f2 (e:46f2) +Draw1CardFromTheDeckText: ; 386f2 (e:46f2) text "Draw 1 card from the Deck." done @@ -401,7 +401,7 @@ ProcedureForStrangeBehaviorText: ; 390b4 (e:50b4) line " Slowbro will be Knocked Out." done -Text013a: ; 391dc (e:51dc) +ChooseOppAttackToBeUsedWithMetronomeText: ; 391dc (e:51dc) text "Choose the opponent's Attack" line "to be used with Metronome." done @@ -458,7 +458,7 @@ CardPeekWasUsedOnText: ; 39346 (e:5346) text "Card Peek was used on" done -Text0147: ; 3935d (e:535d) +PokemonAndAllAttachedCardsReturnedToHandText: ; 3935d (e:535d) text " and all attached" line "cards were returned to the Hand." done @@ -689,11 +689,11 @@ Text0175: ; 39adb (e:5adb) line "from the Hand." done -Text0176: ; 39af7 (e:5af7) +NoneCameText: ; 39af7 (e:5af7) text "None came!" done -Text0177: ; 39b03 (e:5b03) +CameToTheBenchText: ; 39b03 (e:5b03) text "" line "came to the Bench!" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index fad0a83a..a7af9bec 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -199,10 +199,10 @@ TextOffsets:: ; 34000 (d:4000) textpointer NotEnoughWaterEnergyText ; 0x00c3 textpointer ThereAreNoTrainerCardsInDiscardPileText ; 0x00c4 textpointer NoAttackMayBeChoosenText ; 0x00c5 - textpointer Text00c6 ; 0x00c6 - textpointer Text00c7 ; 0x00c7 - textpointer Text00c8 ; 0x00c8 - textpointer Text00c9 ; 0x00c9 + textpointer YouDidNotReceiveAnAttackToMirrorMoveText ; 0x00c6 + textpointer ThisAttackCannotBeUsedTwiceText ; 0x00c7 + textpointer NoWeaknessText ; 0x00c8 + textpointer NoResistanceText ; 0x00c9 textpointer OnlyOncePerTurnText ; 0x00ca textpointer CannotUseDueToStatusText ; 0x00cb textpointer CannotBeUsedInTurnWhichWasPlayedText ; 0x00cc @@ -210,7 +210,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer NoGrassEnergyText ; 0x00ce textpointer CannotUseSinceTheresOnly1PkmnText ; 0x00cf textpointer CannotUseBecauseItWillBeKnockedOutText ; 0x00d0 - textpointer Text00d1 ; 0x00d1 + textpointer CanOnlyBeUsedOnTheBenchText ; 0x00d1 textpointer ThereAreNoPokemonOnBenchText ; 0x00d2 textpointer OpponentIsNotAsleepText ; 0x00d3 textpointer UnableDueToToxicGasText ; 0x00d4 @@ -232,7 +232,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer VenomPowderCheckText ; 0x00e4 textpointer IfTailsYourPokemonBecomesConfusedText ; 0x00e5 textpointer DamageCheckIfTailsNoDamageText ; 0x00e6 - textpointer Text00e7 ; 0x00e7 + textpointer IfHeadsDraw1CardFromDeckText ; 0x00e7 textpointer FlipUntilFailAppears10DamageForEachHeadsText ; 0x00e8 textpointer IfHeadPlus10IfTails10ToYourselfText ; 0x00e9 textpointer DamageToOppBenchIfHeadsDamageToYoursIfTailsText ; 0x00ea @@ -270,17 +270,17 @@ TextOffsets:: ; 34000 (d:4000) textpointer UnableToUseAttackDueToNShieldText ; 0x010a textpointer NoDamageOrEffectDueToNShieldText ; 0x010b textpointer NoDamageOrEffectDueToTransparencyText ; 0x010c - textpointer Text010d ; 0x010d + textpointer MetamorphsToText ; 0x010d textpointer SelectPkmnOnBenchToSwitchWithActiveText ; 0x010e textpointer SelectPokemonToPlaceInTheArenaText ; 0x010f textpointer DuelistIsSelectingPokemonToPlaceInArenaText ; 0x0110 - textpointer Text0111 ; 0x0111 - textpointer Text0112 ; 0x0112 + textpointer ChooseWeaknessYouWishToChangeText ; 0x0111 + textpointer ChooseResistanceYouWishToChangeText ; 0x0112 textpointer ChoosePokemonWishToColorChangeText ; 0x0113 - textpointer Text0114 ; 0x0114 - textpointer Text0115 ; 0x0115 + textpointer ChangedTheWeaknessOfPokemonToColorText ; 0x0114 + textpointer ChangedTheResistanceOfPokemonToColorText ; 0x0115 textpointer ChangedTheColorOfText ; 0x0116 - textpointer Text0117 ; 0x0117 + textpointer Draw1CardFromTheDeckText ; 0x0117 textpointer DrawCardsFromTheDeckText ; 0x0118 textpointer CannotDrawCardBecauseNoCardsInDeckText ; 0x0119 textpointer ChoosePkmnInTheBenchToGiveDamageText ; 0x011a @@ -315,7 +315,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer ProcedureForDamageSwapText ; 0x0137 textpointer ProcedureForDevolutionBeamText ; 0x0138 textpointer ProcedureForStrangeBehaviorText ; 0x0139 - textpointer Text013a ; 0x013a + textpointer ChooseOppAttackToBeUsedWithMetronomeText ; 0x013a textpointer ThereIsNoInTheDeckText ; 0x013b textpointer WouldYouLikeToCheckTheDeckText ; 0x013c textpointer PleaseSelectTheDeckText ; 0x013d @@ -328,7 +328,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer BasicEnergyText ; 0x0144 textpointer PeekWasUsedToLookInYourHandText ; 0x0145 textpointer CardPeekWasUsedOnText ; 0x0146 - textpointer Text0147 ; 0x0147 + textpointer PokemonAndAllAttachedCardsReturnedToHandText ; 0x0147 textpointer WasChosenForTheEffectOfAmnesiaText ; 0x0148 textpointer BasicPokemonWasPlacedOnEachBenchText ; 0x0149 textpointer WasUnsuccessfulText ; 0x014a @@ -375,8 +375,8 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0173 ; 0x0173 textpointer DiscardedCardsFromDeckText ; 0x0174 textpointer Text0175 ; 0x0175 - textpointer Text0176 ; 0x0176 - textpointer Text0177 ; 0x0177 + textpointer NoneCameText ; 0x0176 + textpointer CameToTheBenchText ; 0x0177 textpointer Text0178 ; 0x0178 textpointer Text0179 ; 0x0179 textpointer PokemonDevolvedToText ; 0x017a diff --git a/src/wram.asm b/src/wram.asm index 578738b7..4e65d0b5 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -196,7 +196,14 @@ wPlayerArenaCardLastTurnDamage:: ; c2f3 wPlayerArenaCardLastTurnStatus:: ; c2f5 ds $1 - ds $2 +; substatus2 that the opponent card got last turn +wPlayerArenaCardLastTurnSubstatus2:: ; c2f6 + ds $1 + +; indicates color of weakness that was changed +; for this card last turn +wPlayerArenaCardLastTurnChangeWeak:: ; c2f7 + ds $1 ; stores an effect that was used on the Arena card last turn. ; see LAST_TURN_EFFECT_* constants. @@ -343,10 +350,17 @@ wOpponentArenaCardLastTurnDamage:: ; c3f3 wOpponentArenaCardLastTurnStatus:: ; c3f5 ds $1 - ds $2 +; substatus2 that the player card got last turn +wOpponentArenaCardLastTurnSubstatus2:: ; c3f6 + ds $1 + +; indicates color of weakness that was changed +; for this card last turn +wOpponentArenaCardLastTurnChangeWeak:: ; c3f7 + ds $1 ; whether any attached energy card was discarded last turn (0 if not) -wOpponentArenaCardLastTurnEffect:: ; c2f8 +wOpponentArenaCardLastTurnEffect:: ; c3f8 ds $1 ds $7 @@ -1035,7 +1049,11 @@ wccee:: ; ccee wccef:: ; ccef ds $1 -wccf0:: ; ccf0 +; stores the energy cost of the Metronome attack being used. +; it's used to know how many attached Energy cards are being used +; to pay for the attack for damage calculation. +; if equal to 0, then the attack wasn't invoked by Metronome. +wMetronomeEnergyCost:: ; ccf0 ds $1 ; effect functions return a status condition constant here when it had no effect @@ -1688,13 +1706,17 @@ wce71:: ; ce71 wce72:: ; ce72 ds $1 +; card index and its attack index chosen +; to be used by Metronome. +wMetronomeSelectedAttack:: ; ce73 ds $2 ; stores the amount of cards that are being ordered. wNumberOfCardsToOrder:: ; ce75 ds $1 - ds $6 +wce76:: ; ce76 + ds MAX_PLAY_AREA_POKEMON ; used in CountPokemonIDInPlayArea wTempPokemonID_ce7c:: ; ce7c From 999e27c0a2ca7984e02b29595cc53515868e7644 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Tue, 15 Dec 2020 21:48:36 +0000 Subject: [PATCH 39/45] (Most) trainer effects --- src/constants/card_data_constants.asm | 1 + src/data/effect_commands.asm | 154 +- src/engine/bank01.asm | 14 +- src/engine/bank05.asm | 2 +- src/engine/bank08.asm | 2 +- src/engine/effect_functions.asm | 2507 ++++++++++++++++++++++++- src/engine/home.asm | 14 +- src/hram.asm | 6 +- src/text/text1.asm | 20 +- src/text/text2.asm | 64 +- src/text/text_offsets.asm | 84 +- 11 files changed, 2604 insertions(+), 264 deletions(-) diff --git a/src/constants/card_data_constants.asm b/src/constants/card_data_constants.asm index 3f26e4d8..0731218a 100644 --- a/src/constants/card_data_constants.asm +++ b/src/constants/card_data_constants.asm @@ -146,6 +146,7 @@ PRO EQU $8 BASIC EQU $00 STAGE1 EQU $01 STAGE2 EQU $02 +STAGE2_WITHOUT_STAGE1 EQU $03 ; CARD_DATA_WEAKNESS and CARD_DATA_RESISTANCE constants WR_FIRE EQU $80 diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index b56852e9..900f5594 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -1426,68 +1426,68 @@ GrassEnergyEffectCommands: db $00 SuperPotionEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7159 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7167 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $71b5 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, SuperPotion_DamageEnergyCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, SuperPotion_PlayerSelectEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, SuperPotion_HealEffect db $00 ImakuniEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7216 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ImakuniEffect db $00 EnergyRemovalEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7252 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $725f - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7273 - dbw EFFECTCMDTYPE_AI_SELECTION, $726f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergyRemoval_EnergyCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, EnergyRemoval_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, EnergyRemoval_DiscardEffect + dbw EFFECTCMDTYPE_AI_SELECTION, EnergyRemoval_AISelection db $00 EnergyRetrievalEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $728e - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $72a0 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $72f8 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $72b9 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergyRetrieval_HandEnergyCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, EnergyRetrieval_PlayerHandSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, EnergyRetrieval_DiscardAndAddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, EnergyRetrieval_PlayerDiscardPileSelection db $00 EnergySearchEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $731c - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7372 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $7328 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, EnergySearch_DeckCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, EnergySearch_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, EnergySearch_PlayerSelection db $00 ProfessorOakEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $73a1 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ProfessorOakEffect db $00 PotionEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $73ca - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $73d1 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $73ef + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Potion_DamageCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Potion_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Potion_HealEffect db $00 GamblerEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $73f9 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, GamblerEffect db $00 ItemFinderEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $743b - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $744a - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7463 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ItemFinder_HandDiscardPileCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ItemFinder_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ItemFinder_DiscardAddToHandEffect db $00 DefenderEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7488 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7499 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Defender_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Defender_AttachDefenderEffect db $00 MysteriousFossilEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $74b3 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $74bf + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, MysteriousFossil_BenchCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MysteriousFossil_PlaceInPlayAreaEffect db $00 FullHealEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $74c5 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $74d1 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, FullHeal_StatusCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FullHeal_ClearStatusEffect db $00 ImposterProfessorOakEffectCommands: @@ -1495,105 +1495,105 @@ ImposterProfessorOakEffectCommands: db $00 ComputerSearchEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7513 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $752a - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7545 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $752e + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ComputerSearch_HandDeckCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ComputerSearch_PlayerDiscardHandSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ComputerSearch_DiscardAddToHandEfect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, ComputerSearch_PlayerDeckSelection db $00 ClefairyDollEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7561 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $756d + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ClefairyDoll_BenchCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ClefairyDoll_PlaceInPlayAreaEffect db $00 MrFujiEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7573 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $757e - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $758f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, MrFuji_BenchCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, MrFuji_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, MrFuji_ReturnToDeckEffect db $00 PlusPowerEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $75e0 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PlusPowerEffect db $00 SwitchEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $75ee - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $75f9 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $760a + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Switch_BenchCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Switch_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Switch_SwitchEffect db $00 PokemonCenterEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7611 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7618 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PokemonCenter_DamageCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PokemonCenter_HealDiscardEnergyEffect db $00 PokemonFluteEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7659 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7672 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $768f + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PokemonFlute_BenchCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PokemonFlute_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PokemonFlute_PlaceInPlayAreaText db $00 PokemonBreederEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $76b3 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $76c1 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $76f4 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PokemonBreeder_HandPlayAreaCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PokemonBreeder_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PokemonBreeder_EvolveEffect db $00 ScoopUpEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7795 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $77a0 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $77c3 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ScoopUp_BenchCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ScoopUp_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ScoopUp_ReturnToHandEffect db $00 PokemonTraderEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7826 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7838 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $788d - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $7853 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PokemonTrader_HandDeckCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, PokemonTrader_PlayerHandSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PokemonTrader_TradeCardsEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, PokemonTrader_PlayerDeckSelection db $00 PokedexEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $78e1 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $79aa - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $78ed + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Pokedex_DeckCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Pokedex_OrderDeckCardsEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Pokedex_PlayerSelection db $00 BillEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $79c4 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, BillEffect db $00 LassEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $79e3 + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, LassEffect db $00 MaintenanceEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7a70 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7a7b - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7a85 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Maintenance_HandCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Maintenance_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Maintenance_ReturnToDeckAndDrawEffect db $00 PokeBallEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7aad - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7b15 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $7ab9 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, PokeBall_DeckCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, PokeBall_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, PokeBall_PlayerSelection db $00 RecycleEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7b36 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7b68 - dbw EFFECTCMDTYPE_REQUIRE_SELECTION, $7b41 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Recycle_DiscardPileCheck + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Recycle_AddToHandEffect + dbw EFFECTCMDTYPE_REQUIRE_SELECTION, Recycle_PlayerSelection db $00 ReviveEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7b80 - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7b93 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7bb0 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, Revive_BenchCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, Revive_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, Revive_PlaceInPlayAreaEffect db $00 DevolutionSprayEffectCommands: - dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, $7c0b - dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, $7c24 - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, $7c99 + dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, DevolutionSpray_PlayAreaEvolutionCheck + dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, DevolutionSpray_PlayerSelection + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, DevolutionSpray_DevolutionEffect db $00 SuperEnergyRemovalEffectCommands: diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 68ea2937..6d3c4fb0 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -778,7 +778,7 @@ PlayPokemonCard: ; 44db (1:44db) ldh [hTemp_ffa0], a ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTempPlayAreaLocation_ffa1], a - call EvolvePokemonCard + call EvolvePokemonCardIfPossible jr c, .try_evolve_loop ; jump if evolution wasn't successsful somehow ld a, OPPACTION_EVOLVE_PKMN call SetOppAction_SerialSendDuelData @@ -1442,6 +1442,13 @@ CheckIfActiveCardParalyzedOrAsleep: ; 4918 (1:4918) ; if there isn't any card left in the deck, let the player know with a text message DisplayDrawOneCardScreen: ; 4933 (1:4933) ld a, 1 +; fallthrough + +; display the animation of the turn duelist drawing number of cards that is in a. +; if there isn't any card left in the deck, let the player know with a text message. +; input: +; - a = number of cards to draw +DisplayDrawNCardsScreen: ; 4935 (1:4935) push hl push de push bc @@ -6454,7 +6461,7 @@ OppAction_EvolvePokemonCard: ; 69c5 (1:69c5) ldh [hTempCardIndex_ff98], a call LoadCardDataToBuffer1_FromDeckIndex call DrawLargePictureOfCard - call EvolvePokemonCard + call EvolvePokemonCardIfPossible call PrintPokemonEvolvedIntoPokemon call Func_161e call DrawDuelMainScene @@ -7497,7 +7504,8 @@ GetCardOneStageBelow: ; 7045 (1:7045) ld hl, wAllStagesIndices ; pointing to basic cp STAGE1 jr z, .done - cp STAGE2 + 1 ; unnecessary check? + ; if stage1 was skipped, hl should point to Basic stage card + cp STAGE2_WITHOUT_STAGE1 jr z, .done inc hl ; pointing to stage 1 .done diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 08551315..f9396327 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -6412,7 +6412,7 @@ AISelectSpecialAttackParameters: ; 17161 (5:7161) ld a, CARD_LOCATION_DISCARD_PILE call CheckIfAnyCardIDinLocation ldh [hTemp_ffa0], a - farcall CreateEnergyCardListFromDiscardPile_OnlyBasic + farcall CreateEnergyCardListFromDiscardPile_AllEnergy ; find any energy card different from ; the one found by CheckIfAnyCardIDinLocation. diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm index 5360e259..5283497d 100644 --- a/src/engine/bank08.asm +++ b/src/engine/bank08.asm @@ -6637,7 +6637,7 @@ HandleAIHeal: ; 22402 (8:6402) ld a, OPPACTION_USE_PKMN_POWER bank1call AIMakeDecision pop af - ldh [hPkmnPowerPlayAreaTarget], a + ldh [hPlayAreaEffectTarget], a ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT bank1call AIMakeDecision ld a, OPPACTION_DUEL_MAIN_SCENE diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index c17d4bdf..07192271 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -310,11 +310,12 @@ PickRandomPlayAreaCard: ; 2c17e (b:417e) ret ; 0x2c188 -; outputs in hl the current position -; in hTempList list to place a new card. -GetCurPositionInTempList: ; 2c188 (b:4188) +; outputs in hl the next position +; in hTempList to place a new card, +; and increments hCurSelectionItem. +GetNextPositionInTempList: ; 2c188 (b:4188) push de - ld hl, hEffectItemSelection + ld hl, hCurSelectionItem ld a, [hl] inc [hl] ld e, a @@ -571,15 +572,15 @@ CreateTrainerCardListFromDiscardPile: ; 2c26e (b:426e) ; 0x2c2a0 ; makes a list in wDuelTempList with the deck indices -; of all energy cards (including Double Colorless) -; found in Turn Duelist's Discard Pile. -CreateEnergyCardListFromDiscardPile_IncludeDoubleColorless: ; 2c2a0 (b:42a0) +; of all basic energy cards found in Turn Duelist's Discard Pile. +CreateEnergyCardListFromDiscardPile_OnlyBasic: ; 2c2a0 (b:42a0) ld c, $01 jr CreateEnergyCardListFromDiscardPile ; makes a list in wDuelTempList with the deck indices -; of all basic energy cards found in Turn Duelist's Discard Pile. -CreateEnergyCardListFromDiscardPile_OnlyBasic: ; 2c2a4 (b:42a4) +; of all energy cards (including Double Colorless) +; found in Turn Duelist's Discard Pile. +CreateEnergyCardListFromDiscardPile_AllEnergy: ; 2c2a4 (b:42a4) ld c, $00 ; fallthrough @@ -675,8 +676,8 @@ CheckIfDeckIsEmpty: ; 2c2e0 (b:42e0) ; e = (optional) card ID to search for in deck ; hl = text to print if Deck has card(s) ; output: -; carry set if refuse to look at deck -LookForCardInDeck: ; 2c2ec (b:42ec) +; carry set if refused to look at deck +LookForCardsInDeck: ; 2c2ec (b:42ec) push hl push bc ld a, [wDuelTempList] @@ -810,12 +811,12 @@ HandleDefendingPokemonAttackSelection: ; 2c391 (b:4391) bank1call DrawDuelMainScene call SwapTurn xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a .start bank1call PrintAndLoadMovesToDuelTempList push af - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, .menu_parameters call InitializeMenuParameters pop af @@ -855,7 +856,7 @@ HandleDefendingPokemonAttackSelection: ; 2c391 (b:4391) .open_move_page ldh a, [hCurMenuItem] - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ld a, DUELVARS_ARENA_CARD call GetTurnDuelistVariable call LoadCardDataToBuffer1_FromDeckIndex @@ -983,12 +984,14 @@ ResetDevolvedCardStatus: ; 2c45d (b:445d) ; prompts the Player with a Yes/No question ; whether to quit the screen, even though ; they can select more cards from list. -; [hEffectItemSelection] holds number of cards +; [hCurSelectionItem] holds number of cards ; that were already selected by the Player. ; input: ; - a = total number of cards that can be selected +; output: +; - carry set if "No" was selected AskWhetherToQuitSelectingCards: ; 2c476 (b:4476) - ld hl, hEffectItemSelection + ld hl, hCurSelectionItem sub [hl] ld l, a ld h, $00 @@ -1717,7 +1720,7 @@ Sprout_PlayerSelectEffect: ; 2c85a (b:485a) ldtx hl, ChooseAnOddishFromDeckText ldtx bc, OddishText lb de, SEARCHEFFECT_CARD_ID, ODDISH - call LookForCardInDeck + call LookForCardsInDeck ret c ; draw Deck list interface and print text @@ -1990,7 +1993,7 @@ NidoranFCallForFamily_PlayerSelectEffect: ; 2c9eb (b:49eb) ldtx hl, ChooseNidoranFromDeckText ldtx bc, NidoranMNidoranFText lb de, SEARCHEFFECT_NIDORAN, $00 - call LookForCardInDeck + call LookForCardsInDeck ret c ; draw Deck list interface and print text @@ -2268,13 +2271,13 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) .player xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a bank1call Func_61a1 .draw_play_area bank1call PrintPlayAreaCardList_EnableLCD push af - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, PlayAreaSelectionMenuParameters call InitializeMenuParameters pop af @@ -2290,7 +2293,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) ; a press ldh [hAIPkmnPowerEffectParam], a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a call CheckIfCardHasGrassEnergyAttached jr c, .play_sfx ; no Grass attached @@ -2319,7 +2322,7 @@ EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) jr z, .remove_symbol ; a press - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ldh [hAIEnergyTransPlayAreaLocation], a ld a, OPPACTION_6B15 call SetOppAction_SerialSendDuelData @@ -2426,7 +2429,7 @@ BellsproutCallForFamily_PlayerSelectEffect: ; 2cc50 (b:4c50) ldtx hl, ChooseABellsproutFromDeckText ldtx bc, BellsproutText lb de, SEARCHEFFECT_CARD_ID, BELLSPROUT - call LookForCardInDeck + call LookForCardsInDeck ret c ; draw Deck list interface and print text @@ -2689,7 +2692,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) bank1call OpenPlayAreaScreenForSelection jr c, .loop_input ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hPkmnPowerPlayAreaTarget], a + ldh [hPlayAreaEffectTarget], a ld e, a call GetCardDamageAndMaxHP or a @@ -2700,7 +2703,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) .link_opp call SerialRecv8Bytes - ldh [hPkmnPowerPlayAreaTarget], a + ldh [hPlayAreaEffectTarget], a ; fallthrough .done @@ -2713,12 +2716,12 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) or a ret z ; return if coin was tails - ldh a, [hPkmnPowerPlayAreaTarget] + ldh a, [hPlayAreaEffectTarget] add DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable add 10 ; remove 1 damage counter ld [hl], a - ldh a, [hPkmnPowerPlayAreaTarget] + ldh a, [hPlayAreaEffectTarget] call Func_2c10b call ExchangeRNG ret @@ -2981,7 +2984,7 @@ KrabbyCallForFamily_PlayerSelectEffect: ; 2cf6d (b:4f6d) ldtx hl, ChooseAKrabbyFromDeckText ldtx bc, KrabbyText lb de, SEARCHEFFECT_CARD_ID, KRABBY - call LookForCardInDeck + call LookForCardsInDeck ret c ; draw Deck list interface and print text @@ -3741,18 +3744,18 @@ FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) call DrawWideTextBox_WaitForInput xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a call CreateListOfFireEnergyAttachedToArena xor a bank1call DisplayEnergyDiscardScreen .loop_input bank1call HandleEnergyDiscardMenuInput ret c - call GetCurPositionInTempList + call GetNextPositionInTempList ldh a, [hTempCardIndex_ff98] ld [hl], a call RemoveCardFromDuelTempList - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] cp 2 ret nc ; return when 2 have been chosen bank1call DisplayEnergyDiscardMenu @@ -3922,7 +3925,7 @@ Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) call DrawWideTextBox_WaitForInput xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a call CreateListOfFireEnergyAttachedToArena xor a bank1call DisplayEnergyDiscardScreen @@ -3933,11 +3936,11 @@ Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) xor a ld [wcbfa], a .loop - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld [wcbfb], a bank1call HandleEnergyDiscardMenuInput jr c, .done - ld hl, hEffectItemSelection + ld hl, hCurSelectionItem inc [hl] call RemoveCardFromDuelTempList jr c, .done @@ -3947,7 +3950,7 @@ Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) .done ; return carry if no cards were discarded ; output the result in hTemp_ffa0 - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ldh [hTemp_ffa0], a or a ret nz @@ -4166,7 +4169,7 @@ FireSpin_PlayerSelectEffect: ; 2d5cd (b:55cd) call DrawWideTextBox_WaitForInput xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a xor a call CreateArenaOrBenchEnergyCardList call SortCardsInDuelTempListByID @@ -4178,12 +4181,12 @@ FireSpin_PlayerSelectEffect: ; 2d5cd (b:55cd) .loop_input bank1call HandleEnergyDiscardMenuInput ret c - call GetCurPositionInTempList + call GetNextPositionInTempList ldh a, [hTempCardIndex_ff98] ld [hl], a ld hl, wcbfb inc [hl] - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] cp 2 jr nc, .done ldh a, [hTempCardIndex_ff98] @@ -4276,7 +4279,7 @@ MixUpEffect: ; 2d647 (b:5647) .done_hand ld a, c - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a push bc ldtx hl, ThePkmnCardsInHandAndDeckWereShuffledText call DrawWideTextBox_WaitForInput @@ -4284,7 +4287,7 @@ MixUpEffect: ; 2d647 (b:5647) call Func_2c0bd call CreateDeckCardList pop bc - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] or a jr z, .done ; if no cards were removed from Hand, return @@ -4393,7 +4396,7 @@ Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) ld a, c .ok - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ; load correct Move animation depending ; on what side the effect is from. ld d, $84 @@ -4407,7 +4410,7 @@ Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) ld [wLoadedMoveAnimation], a ; start loop for adding Energy cards to hand - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld c, a ld hl, wDuelTempList .loop_energy @@ -4453,7 +4456,7 @@ Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) jr nz, .loop_energy ; load the number of cards added to hand and print text - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld l, a ld h, $00 call LoadTxRam3 @@ -4533,8 +4536,8 @@ GetEnergyAttachedMultiplierDamage: ; 2d78c (b:578c) HandleEnergyCardsInDiscardPileSelection: ; 2d7bc (b:57bc) push hl xor a - ldh [hEffectItemSelection], a - call CreateEnergyCardListFromDiscardPile_OnlyBasic + ldh [hCurSelectionItem], a + call CreateEnergyCardListFromDiscardPile_AllEnergy pop hl jr c, .finish @@ -4559,19 +4562,19 @@ HandleEnergyCardsInDiscardPileSelection: ; 2d7bc (b:57bc) .selected ; a card was selected, so add it to list - call GetCurPositionInTempList + call GetNextPositionInTempList ldh a, [hTempCardIndex_ff98] ld [hl], a call RemoveCardFromDuelTempList or a jr z, .finish ; no more cards? - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] cp 2 jr c, .loop ; already selected 2 cards? .finish ; place terminating byte on list - call GetCurPositionInTempList + call GetNextPositionInTempList ld [hl], $ff or a ret @@ -4622,12 +4625,12 @@ Curse_PlayerSelectEffect: ; 2d834 (b:5834) bank1call DrawWholeScreenTextBox call SwapTurn xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a bank1call Func_61a1 .start bank1call PrintPlayAreaCardList_EnableLCD push af - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, PlayAreaSelectionMenuParameters call InitializeMenuParameters pop af @@ -4640,7 +4643,7 @@ Curse_PlayerSelectEffect: ; 2d834 (b:5834) jr nc, .loop_input_first cp $ff jr z, .cancel - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ldh [hTempPlayAreaLocation_ffa1], a call GetCardDamageAndMaxHP or a @@ -4674,7 +4677,7 @@ Curse_PlayerSelectEffect: ; 2d834 (b:5834) call DoFrame call HandleMenuInput jr nc, .loop_input_second - ldh [hPkmnPowerPlayAreaTarget], a + ldh [hPlayAreaEffectTarget], a cp $ff jr nz, .a_press ; was a pressed? @@ -4728,7 +4731,7 @@ Curse_TransferDamageEffect: ; 2d8bb (b:58bb) bank1call Func_61a1 .vs_player ; transfer the damage counter to the targets that were selected. - ldh a, [hPkmnPowerPlayAreaTarget] + ldh a, [hPlayAreaEffectTarget] add DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable sub 10 @@ -4746,7 +4749,7 @@ Curse_TransferDamageEffect: ; 2d8bb (b:58bb) cp DUELIST_TYPE_PLAYER jr z, .done ; vs. opponent - ldh a, [hPkmnPowerPlayAreaTarget] + ldh a, [hPlayAreaEffectTarget] ldh [hTempPlayAreaLocation_ff9d], a bank1call Func_6194 @@ -4859,7 +4862,7 @@ DestinyBond_DestinyBondEffect: ; 2d987 (b:5987) ; returns carry if no Energy cards in Discard Pile. EnergyConversion_CheckEnergy: ; 2d98d (b:598d) - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ldtx hl, ThereAreNoEnergyCardsInDiscardPileText ret ; 0x2d994 @@ -4871,7 +4874,7 @@ EnergyConversion_PlayerSelectEffect: ; 2d994 (b:5994) ; 0x2d99b EnergyConversion_AISelectEffect: ; 2d99b (b:599b) - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ld hl, wDuelTempList ld de, hTempList ld c, 2 @@ -5082,7 +5085,7 @@ HandleProphecyScreen: ; 2da76 (b:5a76) call CountCardsInDuelTempList ld b, a ld a, 1 ; start at 1 - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ; initialize buffer ahead in wDuelTempList. ld hl, wDuelTempList + 10 @@ -5116,12 +5119,12 @@ HandleProphecyScreen: ; 2da76 (b:5a76) ; being here means card hasn't been selected yet, ; so add its order number to buffer and increment ; the sort number for the next card. - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld [hl], a inc a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a bank1call Func_5744 - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, wNumberOfCardsToOrder cp [hl] jr c, .loop_selection ; still more cards @@ -5167,7 +5170,7 @@ HandleProphecyScreen: ; 2da76 (b:5a76) .clear ; check if any reordering was done. - ld hl, hEffectItemSelection + ld hl, hCurSelectionItem ld a, [hl] cp 1 jr z, .loop_selection ; none done, go back @@ -5287,13 +5290,13 @@ DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) ldtx hl, ProcedureForDamageSwapText bank1call DrawWholeScreenTextBox xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a bank1call Func_61a1 .start bank1call PrintPlayAreaCardList_EnableLCD push af - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, PlayAreaSelectionMenuParameters call InitializeMenuParameters pop af @@ -5308,7 +5311,7 @@ DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) ret z ; quit when B button is pressed ldh [hTempPlayAreaLocation_ffa1], a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ; if card has no damage, play sfx and return to start call GetCardDamageAndMaxHP @@ -5345,8 +5348,8 @@ DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) ; try to give the card selected the damage counter ; if it would KO, ignore it. - ldh [hPkmnPowerPlayAreaTarget], a - ldh [hEffectItemSelection], a + ldh [hPlayAreaEffectTarget], a + ldh [hCurSelectionItem], a call TryGiveDamageCounter_DamageSwap jr c, .loop_input_second @@ -5365,7 +5368,7 @@ DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) jr .loop_input_first ; 0x2dc27 -; tries to give damage counter to hPkmnPowerPlayAreaTarget, +; tries to give damage counter to hPlayAreaEffectTarget, ; and if successful updates UI screen. DamageSwap_SwapEffect: ; 2dc27 (b:5c27) call TryGiveDamageCounter_DamageSwap @@ -5376,11 +5379,11 @@ DamageSwap_SwapEffect: ; 2dc27 (b:5c27) ; 0x2dc30 ; tries to give the damage counter to the target -; chosen by the Player (hPkmnPowerPlayAreaTarget). +; chosen by the Player (hPlayAreaEffectTarget). ; if the damage counter would KO card, then do ; not give the damage counter and return carry. TryGiveDamageCounter_DamageSwap: ; 2dc30 (b:5c30) - ldh a, [hPkmnPowerPlayAreaTarget] + ldh a, [hPlayAreaEffectTarget] add DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable sub 10 @@ -5696,7 +5699,7 @@ Barrier_BarrierEffect: ; 2ddbf (b:5dbf) ; 0x2ddc5 Mewtwo3EnergyAbsorption_CheckDiscardPile: ; 2ddc5 (b:5dc5) - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ldtx hl, ThereAreNoEnergyCardsInDiscardPileText ret ; 0x2ddcc @@ -5709,7 +5712,7 @@ Mewtwo3EnergyAbsorption_PlayerSelectEffect: ; 2ddcc (b:5dcc) Mewtwo3EnergyAbsorption_AISelectEffect: ; 2ddd3 (b:5dd3) ; AI picks first 2 energy cards - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ld hl, wDuelTempList ld de, hTempList ld c, 2 @@ -5742,7 +5745,7 @@ Mewtwo3EnergyAbsorption_AddToHandEffect: ; 2ddec (b:5dec) ; 0x2ddff Mewtwo2EnergyAbsorption_CheckDiscardPile: ; 2ddff (b:5dff) - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ldtx hl, ThereAreNoEnergyCardsInDiscardPileText ret ; 0x2de06 @@ -5755,7 +5758,7 @@ Mewtwo2EnergyAbsorption_PlayerSelectEffect: ; 2de06 (b:5e06) Mewtwo2EnergyAbsorption_AISelectEffect: ; 2de0d (b:5e0d) ; AI picks first 2 energy cards - call CreateEnergyCardListFromDiscardPile_OnlyBasic + call CreateEnergyCardListFromDiscardPile_AllEnergy ld hl, wDuelTempList ld de, hTempList ld c, 2 @@ -5828,12 +5831,12 @@ StrangeBehavior_SelectAndSwapEffect: ; 2de5b (b:5e5b) bank1call DrawWholeScreenTextBox xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a bank1call Func_61a1 .start bank1call PrintPlayAreaCardList_EnableLCD push af - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld hl, PlayAreaSelectionMenuParameters call InitializeMenuParameters pop af @@ -5846,7 +5849,7 @@ StrangeBehavior_SelectAndSwapEffect: ; 2de5b (b:5e5b) cp -1 ret z ; return when B button is pressed - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ldh [hTempPlayAreaLocation_ffa1], a ld hl, hTemp_ffa0 cp [hl] @@ -6320,7 +6323,7 @@ MarowakCallForFamily_PlayerSelectEffect: ; 2e110 (b:6110) ldtx hl, ChooseBasicFightingPokemonFromDeckText ldtx bc, FightingPokemonDeckText lb de, SEARCHEFFECT_BASIC_FIGHTING, $00 - call LookForCardInDeck + call LookForCardsInDeck ret c ; draw Deck list interface and print text @@ -6847,7 +6850,7 @@ ThunderboltEffect: ; 2e419 (b:6419) ThunderstormEffect: ; 2e429 (b:6429) ld a, 1 - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a call SwapTurn ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA @@ -6866,7 +6869,7 @@ ThunderstormEffect: ; 2e429 (b:6429) call TossCoin_BankB call SwapTurn push af - call GetCurPositionInTempList + call GetNextPositionInTempList pop af ld [hl], a ; store result in list pop bc @@ -6880,7 +6883,7 @@ ThunderstormEffect: ; 2e429 (b:6429) jr nz, .check_damage ; all coins were tossed for each Benched Pokemon - call GetCurPositionInTempList + call GetNextPositionInTempList ld [hl], $ff ld a, b ldh [hTemp_ffa0], a @@ -7096,7 +7099,7 @@ ChainLightningEffect: ; 2e595 (b:6595) call SwapTurn call GetArenaCardColor call SwapTurn - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a cp COLORLESS ret z ; don't damage if colorless @@ -7123,7 +7126,7 @@ ChainLightningEffect: ; 2e595 (b:6595) ld a, d call GetPlayAreaCardColor ld c, a - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] cp c jr nz, .next_bench ; skip if not same color ; apply damage to this Bench card @@ -7188,7 +7191,7 @@ Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) ; init number of items in list and cursor position xor a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ld [wce72], a bank1call Func_61a1 .start @@ -7224,13 +7227,13 @@ Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) ld b, SYM_LIGHTNING call DrawSymbolOnPlayAreaCursor ; store it in the list of chosen Bench Pokemon - call GetCurPositionInTempList + call GetNextPositionInTempList ldh a, [hCurMenuItem] inc a ld [hl], a ; check if 3 were chosen already - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld c, a cp 3 jr nc, .chosen ; check if already chose 3 @@ -7250,18 +7253,18 @@ Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) and B_BUTTON jr nz, .try_cancel call SwapTurn - call GetCurPositionInTempList + call GetNextPositionInTempList ld [hl], $ff ; terminating byte ret .try_cancel - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] or a jr z, .start ; none selected, can safely loop back to start ; undo last selection made dec a - ldh [hEffectItemSelection], a + ldh [hCurSelectionItem], a ld e, a ld d, $00 ld hl, hTempList @@ -7284,7 +7287,7 @@ Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) .CheckIfChosenAlready: ; 2e6af (b:66af) inc a ld c, a - ldh a, [hEffectItemSelection] + ldh a, [hCurSelectionItem] ld b, a ld hl, hTempList inc b @@ -7677,7 +7680,7 @@ EnergySpike_PlayerSelectEffect: ; 2e87b (b:687b) ldtx hl, Choose1BasicEnergyCardFromDeckText ldtx bc, BasicEnergyText lb de, SEARCHEFFECT_BASIC_ENERGY, 0 - call LookForCardInDeck + call LookForCardsInDeck ret c bank1call Func_5591 @@ -9291,4 +9294,2326 @@ ExpandEffect: ; 2f153 (b:7153) ret ; 0x2f159 - INCROM $2f159, $30000 +; returns carry if either there are no damage counters +; or no Energy cards attached in the Play Area. +SuperPotion_DamageEnergyCheck: ; 2f159 (b:7159) + call CheckIfPlayAreaHasAnyDamage + ldtx hl, NoPokemonWithDamageCountersText + ret c ; no damage counters + call CheckIfThereAreAnyEnergyCardsAttached + ldtx hl, ThereIsNoEnergyCardAttachedText + ret +; 0x2f167 + +SuperPotion_PlayerSelectEffect: ; 2f167 (b:7167) + ldtx hl, ChoosePokemonToRemoveDamageCounterFromText + call DrawWideTextBox_WaitForInput +.start + bank1call HasAlivePokemonInPlayArea +.read_input + bank1call OpenPlayAreaScreenForSelection + ret c ; exit if B is pressed + ld e, a + call GetCardDamageAndMaxHP + or a + jr z, .read_input ; Pokemon has no damage? + ldh a, [hCurMenuItem] + ld e, a + call GetPlayAreaCardAttachedEnergies + ld a, [wTotalAttachedEnergies] + or a + jr nz, .got_pkmn + ; no energy cards attached + ldtx hl, NoEnergyCardsText + call DrawWideTextBox_WaitForInput + jr .start + +.got_pkmn +; Pokemon has damage and Energy cards attached, +; prompt the Player for Energy selection to discard. + ldh a, [hCurMenuItem] + bank1call CreateArenaOrBenchEnergyCardList + ldh a, [hCurMenuItem] + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ret c ; exit if B was pressed + + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempPlayAreaLocation_ffa1], a + ld e, a + +; cap the healing damage if +; it would make it exceed max HP. + call GetCardDamageAndMaxHP + ld c, 40 + cp 40 + jr nc, .heal + ld c, a +.heal + ld a, c + ldh [hPlayAreaEffectTarget], a + or a + ret +; 0x2f1b5 + +SuperPotion_HealEffect: ; 2f1b5 (b:71b5) + ldh a, [hTemp_ffa0] + call PutCardInDiscardPile + ldh a, [hTempPlayAreaLocation_ffa1] + ldh [hTempPlayAreaLocation_ff9d], a + ldh a, [hPlayAreaEffectTarget] + call HealPlayAreaCardHP + ret +; 0x2f1c4 + +; checks if there is at least one Energy card +; attached to some card in the Turn Duelist's Play Area. +; return no carry if one is found, +; and returns carry set if none is found. +CheckIfThereAreAnyEnergyCardsAttached: ; 2f1c4 (b:71c4) + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_deck + ld a, [hl] + bit CARD_LOCATION_PLAY_AREA_F, a + jr z, .next_card ; skip if not in Play Area + ld a, l + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_TRAINER + jr z, .next_card ; skip if it's a Trainer card + cp TYPE_ENERGY + jr nc, .found +.next_card + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_deck + scf + ret +.found + or a + ret +; 0x2f1e7 + +; handles Player selection for Pokemon in Play Area, +; then opens screen to choose one of the energy cards +; attached to that selected Pokemon. +; outputs the selection in: +; [hTemp_ffa0] = play area location +; [hTempPlayAreaLocation_ffa1] = index of energy card +HandlePokemonAndEnergySelectionScreen: ; 2f1e7 (b:71e7) + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + ret c ; exit if B is pressed + ld e, a + call GetPlayAreaCardAttachedEnergies + ld a, [wTotalAttachedEnergies] + or a + jr nz, .has_energy + ldtx hl, NoEnergyCardsText + call DrawWideTextBox_WaitForInput + jr HandlePokemonAndEnergySelectionScreen ; loop back to start + +.has_energy + ldh a, [hCurMenuItem] + bank1call CreateArenaOrBenchEnergyCardList + ldh a, [hCurMenuItem] + bank1call DisplayEnergyDiscardScreen + bank1call HandleEnergyDiscardMenuInput + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ldh a, [hTempCardIndex_ff98] + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2f216 + +ImakuniEffect: ; 2f216 (b:7216) + ld a, DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ld a, [wLoadedCard1ID] + +; cannot confuse Clefairy Doll and Mysterious Fossil + cp CLEFAIRY_DOLL + jr z, .failed + cp MYSTERIOUS_FOSSIL + jr z, .failed + +; cannot confuse Snorlax if its Pkmn Power is active + cp SNORLAX + jr nz, .success + xor a + call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 + jr c, .success + ; fallthrough if Thick Skinned is active + +.failed +; play confusion animation and print failure text + ld a, $7f + call Func_2fea9 + ldtx hl, ThereWasNoEffectText + call DrawWideTextBox_WaitForInput + ret + +.success +; play confusion animation and confuse card + ld a, $7f + call Func_2fea9 + ld a, DUELVARS_ARENA_CARD_STATUS + call GetTurnDuelistVariable + and PSN_DBLPSN + or CONFUSED + ld [hl], a + bank1call DrawDuelHUDs + ret +; 0x2f252 + +; returns carry if opponent has no energy cards attached +EnergyRemoval_EnergyCheck: ; 2f252 (b:7252) + call SwapTurn + call CheckIfThereAreAnyEnergyCardsAttached + ldtx hl, NoEnergyAttachedToOpponentsActiveText + call SwapTurn + ret +; 0x2f25f + +EnergyRemoval_PlayerSelection: ; 2f25f (b:725f) + ldtx hl, ChoosePokemonToRemoveEnergyFromText + call DrawWideTextBox_WaitForInput + call SwapTurn + call HandlePokemonAndEnergySelectionScreen + call SwapTurn + ret +; 0x2f26f + +EnergyRemoval_AISelection: ; 2f26f (b:726f) + call AIPickEnergyCardToDiscardFromDefendingPokemon + ret +; 0x2f273 + +EnergyRemoval_DiscardEffect: ; 2f273 (b:7273) + call SwapTurn + ldh a, [hTempPlayAreaLocation_ffa1] + call PutCardInDiscardPile + call SwapTurn + call CheckIfTurnDuelistIsPlayer + ret c + +; show Player which Pokemon was affected + call SwapTurn + ldh a, [hTemp_ffa0] + call Func_2c10b + call SwapTurn + ret +; 0x2f28e + +; return carry if no other card in hand to discard +; or if there are no Basic Energy cards in Discard Pile. +EnergyRetrieval_HandEnergyCheck: ; 2f28e (b:728e) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + cp 2 + ldtx hl, NotEnoughCardsInHandText + ret c ; return if doesn't have another card to discard + call CreateEnergyCardListFromDiscardPile_OnlyBasic + ldtx hl, ThereAreNoBasicEnergyCardsInDiscardPileText + ret +; 0x2f2a0 + +EnergyRetrieval_PlayerHandSelection: ; 2f2a0 (b:72a0) + ldtx hl, ChooseCardToDiscardFromHandText + call DrawWideTextBox_WaitForInput + call CreateHandCardList + ldh a, [hTempCardIndex_ff9f] + call RemoveCardFromDuelTempList + bank1call Func_5591 + bank1call DisplayCardList + ldh a, [hTempCardIndex_ff98] + ldh [hTempList], a + ret +; 0x2f2b9 + +EnergyRetrieval_PlayerDiscardPileSelection: ; 2f2b9 (b:72b9) + ld a, 1 ; start at 1 due to card selected from hand + ldh [hCurSelectionItem], a + ldtx hl, Choose2BasicEnergyCardsFromDiscardPileText + call DrawWideTextBox_WaitForInput + call CreateEnergyCardListFromDiscardPile_OnlyBasic + +.select_card + bank1call InitAndDrawCardListScreenLayout + ldtx hl, PleaseSelectCardText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText + bank1call DisplayCardList + jr nc, .selected + ; B was pressed + ld a, 2 + 1 ; includes the card selected from hand + call AskWhetherToQuitSelectingCards + jr c, .select_card ; player selected No + jr .done + +.selected + call GetNextPositionInTempList_TrainerEffects + ldh a, [hTempCardIndex_ff98] + ld [hl], a + call RemoveCardFromDuelTempList + jr c, .done + ldh a, [hCurSelectionItem] + cp 2 + 1 ; includes the card selected from hand + jr c, .select_card + +.done + call GetNextPositionInTempList_TrainerEffects + ld [hl], $ff ; terminating byte + or a + ret +; 0x2f2f8 + +EnergyRetrieval_DiscardAndAddToHandEffect: ; 2f2f8 (b:72f8) + ld hl, hTempList + ld a, [hli] + call RemoveCardFromHand + call PutCardInDiscardPile + ld de, wDuelTempList +.loop + ld a, [hli] + ld [de], a + inc de + cp $ff + jr z, .done + call MoveDiscardPileCardToHand + call AddCardToHand + jr .loop +.done + call CheckIfTurnDuelistIsPlayer + ret c + bank1call Func_4b38 + ret +; 0x2f31c + +; return carry if no cards left in Deck. +EnergySearch_DeckCheck: ; 2f31c (b:731c) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + cp DECK_SIZE + ccf + ldtx hl, NoCardsLeftInTheDeckText + ret +; 0x2f328 + +EnergySearch_PlayerSelection: ; 2f328 (b:7328) + ld a, $ff + ldh [hTemp_ffa0], a + call CreateDeckCardList + ldtx hl, Choose1BasicEnergyCardFromDeckText + lb de, SEARCHEFFECT_BASIC_ENERGY, 0 + ldtx bc, BasicEnergyText + call LookForCardsInDeck + ret c ; skip showing deck + + bank1call Func_5591 + ldtx hl, ChooseBasicEnergyCardText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText +.read_input + bank1call DisplayCardList + jr c, .try_exit ; B pressed? + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + call CheckIfCardIsBasicEnergy + jr c, .play_sfx + or a + ret +.play_sfx + call Func_3794 + jr .read_input + +.try_exit +; check if Player can exit without selecting anything + ld hl, wDuelTempList +.next_card + ld a, [hli] + cp $ff + jr z, .exit + call CheckIfCardIsBasicEnergy + jr c, .next_card + jr .read_input ; no, has to select Energy card +.exit + ld a, $ff + ldh [hTemp_ffa0], a + or a + ret +; 0x2f372 + +EnergySearch_AddToHandEffect: ; 2f372 (b:7372) + ldh a, [hTemp_ffa0] + cp $ff + jr z, .done +; add to hand + call SearchCardInDeckAndAddToHand + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + jr c, .done ; done if Player played card +; display card in screen + ldh a, [hTemp_ffa0] + ldtx hl, WasPlacedInTheHandText + bank1call DisplayCardDetailScreen +.done + call Func_2c0bd + ret + +; check if card index in a is a Basic Energy card. +; returns carry in case it's not. +CheckIfCardIsBasicEnergy ; 2f38f (b:738f) + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr c, .not_basic_energy + cp TYPE_ENERGY_DOUBLE_COLORLESS + jr nc, .not_basic_energy +; is basic energy + or a + ret +.not_basic_energy + scf + ret +; 0x2f3a1 + +ProfessorOakEffect: ; 2f3a1 (b:73a1) +; discard hand + call CreateHandCardList + call SortCardsInDuelTempListByID + ld hl, wDuelTempList +.discard_loop + ld a, [hli] + cp $ff + jr z, .draw_cards + call RemoveCardFromHand + call PutCardInDiscardPile + jr .discard_loop + +.draw_cards + ld a, 7 + bank1call DisplayDrawNCardsScreen + ld c, 7 +.draw_loop + call DrawCardFromDeck + jr c, .done + call AddCardToHand + dec c + jr nz, .draw_loop +.done + ret +; 0x2f3ca + +Potion_DamageCheck: ; 2f3ca (b:73ca) + call CheckIfPlayAreaHasAnyDamage + ldtx hl, NoPokemonWithDamageCountersText + ret +; 0x2f3d1 + +Potion_PlayerSelection: ; 2f3d1 (b:73d1) + bank1call HasAlivePokemonInPlayArea +.read_input + bank1call OpenPlayAreaScreenForSelection + ret c ; exit is B was pressed + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ld e, a + call GetCardDamageAndMaxHP + or a + jr z, .read_input ; no damage, loop back to start +; cap damage + ld c, 20 + cp 20 + jr nc, .skip_cap + ld c, a +.skip_cap + ld a, c + ldh [hTempPlayAreaLocation_ffa1], a + or a + ret +; 0x2f3ef + +Potion_HealEffect: ; 2f3ef (b:73ef) + ldh a, [hTemp_ffa0] + ldh [hTempPlayAreaLocation_ff9d], a + ldh a, [hTempPlayAreaLocation_ffa1] + call HealPlayAreaCardHP + ret +; 0x2f3f9 + +GamblerEffect: ; 2f3f9 (b:73f9) + ldtx de, CardCheckIfHeads8CardsIfTails1CardText + call TossCoin_BankB + ldh [hTemp_ffa0], a +; discard Gambler card from hand + ldh a, [hTempCardIndex_ff9f] + call RemoveCardFromHand + call PutCardInDiscardPile + +; shuffle cards into deck + call CreateHandCardList + call SortCardsInDuelTempListByID + ld hl, wDuelTempList +.loop_return_deck + ld a, [hli] + cp $ff + jr z, .check_coin_toss + call RemoveCardFromHand + call ReturnCardToDeck + jr .loop_return_deck + +.check_coin_toss + call Func_2c0bd + ld c, 8 + ldh a, [hTemp_ffa0] + or a + jr nz, .draw_cards ; coin toss was heads? + ; if tails, number of cards to draw is 1 + ld c, 1 + +; correct number of cards to draw is in c +.draw_cards + ld a, c + bank1call DisplayDrawNCardsScreen +.draw_loop + call DrawCardFromDeck + jr c, .done + call AddCardToHand + dec c + jr nz, .draw_loop +.done + ret +; 0x2f43b + +; return carry if not enough cards in hand to discard +; or if there are no cards in the Discard Pile +ItemFinder_HandDiscardPileCheck: ; 2f43b (b:743b) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + ldtx hl, NotEnoughCardsInHandText + cp 3 + ret c + call CreateTrainerCardListFromDiscardPile + ret +; 0x2f44a + +ItemFinder_PlayerSelection: ; 2f44a (b:744a) + call HandlePlayerSelection2HandCardsToDiscard + ret c ; was operation cancelled? + +; cards were selected to discard from hand. +; now to choose a Trainer card from Discard Pile. + call CreateTrainerCardListFromDiscardPile + bank1call Func_5591 + ldtx hl, ChooseCardToPlaceInHandText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText + bank1call DisplayCardList + ldh [hTempList + 2], a ; placed after the 2 cards selected to discard + ret +; 0x2f463 + +ItemFinder_DiscardAddToHandEffect: ; 2f463 (b:7463) +; discard cards from hand + ld hl, hTempList + ld a, [hli] + call RemoveCardFromHand + call PutCardInDiscardPile + ld a, [hli] + call RemoveCardFromHand + call PutCardInDiscardPile + +; place card from Discard Pile to hand + ld a, [hl] + call MoveDiscardPileCardToHand + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + ret c +; display card in screen + ldh a, [hTempList + 2] + ldtx hl, WasPlacedInTheHandText + bank1call DisplayCardDetailScreen + ret +; 0x2f488 + +Defender_PlayerSelection: ; 2f488 (b:7488) + ldtx hl, ChoosePokemonToAttachDefenderToText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2f499 + +Defender_AttachDefenderEffect: ; 2f499 (b:7499) +; attach Trainer card to Play Area Pokemon + ldh a, [hTemp_ffa0] + ld e, a + ldh a, [hTempCardIndex_ff9f] + call PutHandCardInPlayArea + +; increase number of Defender cards of this location by 1 + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD_ATTACHED_DEFENDER + call GetTurnDuelistVariable + inc [hl] + call CheckIfTurnDuelistIsPlayer + ret c + + ldh a, [hTemp_ffa0] + call Func_2c10b + ret +; 0x2f4b3 + +; return carry if Bench is full. +MysteriousFossil_BenchCheck: ; 2f4b3 (b:74b3) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + cp MAX_PLAY_AREA_POKEMON + ccf + ldtx hl, NoSpaceOnTheBenchText + ret +; 0x2f4bf + +MysteriousFossil_PlaceInPlayAreaEffect: ; 2f4bf (b:74bf) + ldh a, [hTempCardIndex_ff9f] + call PutHandPokemonCardInPlayArea + ret +; 0x2f4c5 + +; return carry if Arena card has no status to heal. +FullHeal_StatusCheck: ; 2f4c5 (b:74c5) + ld a, DUELVARS_ARENA_CARD_STATUS + call GetTurnDuelistVariable + or a + ret nz + ldtx hl, NotAffectedByPoisonSleepParalysisOrConfusionText + scf + ret +; 0x2f4d1 + +FullHeal_ClearStatusEffect: ; 2f4d1 (b:74d1) + ld a, $8a + call Func_2fea9 + ld a, DUELVARS_ARENA_CARD_STATUS + call GetTurnDuelistVariable + ld [hl], NO_STATUS + bank1call DrawDuelHUDs + ret +; 0x2f4e1 + +ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) + call SwapTurn + call CreateHandCardList + call SortCardsInDuelTempListByID + +; first return all cards in hand to the deck. + ld hl, wDuelTempList +.loop_return_deck + ld a, [hli] + cp $ff + jr z, .done_return + call RemoveCardFromHand + call ReturnCardToDeck + jr .loop_return_deck + +; then draw 7 cards from the deck. +.done_return + call Func_2c0bd + ld a, 7 + bank1call DisplayDrawNCardsScreen + ld c, 7 +.loop_draw + call DrawCardFromDeck + jr c, .done + call AddCardToHand + dec c + jr nz, .loop_draw +.done + call SwapTurn + ret +; 0x2f513 + +; return carry if not enough cards in hand to discard +; or if there are no cards left in the deck. +ComputerSearch_HandDeckCheck: ; 2f513 (b:7513) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + ldtx hl, NotEnoughCardsInHandText + cp 3 + ret c + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ldtx hl, NoCardsLeftInTheDeckText + cp DECK_SIZE + ccf + ret +; 0x2f52a + +ComputerSearch_PlayerDiscardHandSelection: ; 2f52a (b:752a) + call HandlePlayerSelection2HandCardsToDiscard + ret +; 0x2f52e + +ComputerSearch_PlayerDeckSelection: ; 2f52e (b:752e) + call CreateDeckCardList + bank1call Func_5591 + ldtx hl, ChooseCardToPlaceInHandText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText +.loop_input + bank1call DisplayCardList + jr c, .loop_input ; can't exit with B button + ldh [hTempList + 2], a + ret +; 0x2f545 + +ComputerSearch_DiscardAddToHandEfect: ; 2f545 (b:7545) +; discard cards from hand + ld hl, hTempList + ld a, [hli] + call RemoveCardFromHand + call PutCardInDiscardPile + ld a, [hli] + call RemoveCardFromHand + call PutCardInDiscardPile + +; add card from deck to hand + ld a, [hl] + call SearchCardInDeckAndAddToHand + call AddCardToHand + call Func_2c0bd + ret +; 0x2f561 + +; return carry if Bench is full. +ClefairyDoll_BenchCheck: ; 2f561 (b:7561) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret +; 0x2f56d + +ClefairyDoll_PlaceInPlayAreaEffect: ; 2f56d (b:756d) + ldh a, [hTempCardIndex_ff9f] + call PutHandPokemonCardInPlayArea + ret +; 0x2f573 + +; return carry if no Pokemon in the Bench. +MrFuji_BenchCheck: ; 2f573 (b:7573) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2f57e + +MrFuji_PlayerSelection: ; 2f57e (b:757e) + ldtx hl, ChoosePokemonToReturnToTheDeckText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + bank1call OpenPlayAreaScreenForSelection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2f58f + +MrFuji_ReturnToDeckEffect: ; 2f58f (b:758f) +; get Play Area location's card index + ldh a, [hTemp_ffa0] + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + ldh [hTempCardIndex_ff98], a + +; find all cards that are in the same location +; (previous evolutions and energy cards attached) +; and return them all to the deck. + ldh a, [hTemp_ffa0] + or CARD_LOCATION_PLAY_AREA + ld e, a + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop_cards + push de + push hl + ld a, [hl] + cp e + jr nz, .next_card + ld a, l + call ReturnCardToDeck +.next_card + pop hl + pop de + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_cards + +; clear Play Area location of card + ldh a, [hTemp_ffa0] + ld e, a + call EmptyPlayAreaSlot + ld l, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + dec [hl] + call ShiftAllPokemonToFirstPlayAreaSlots + +; if Trainer card wasn't played by the Player, +; print the selected Pokemon's name and show card on screen. + call CheckIfTurnDuelistIsPlayer + jr c, .done + ldh a, [hTempCardIndex_ff98] + call LoadCardDataToBuffer1_FromDeckIndex + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam2 + bank1call DrawLargePictureOfCard + ldtx hl, PokemonAndAllAttachedCardsWereReturnedToDeckText + call DrawWideTextBox_WaitForInput +.done + call Func_2c0bd + ret +; 0x2f5e0 + +PlusPowerEffect: ; 2f5e0 (b:75e0) +; attach Trainer card to Arena Pokemon + ld e, PLAY_AREA_ARENA + ldh a, [hTempCardIndex_ff9f] + call PutHandCardInPlayArea + +; increase number of Defender cards of this location by 1 + ld a, DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER + call GetTurnDuelistVariable + inc [hl] + ret +; 0x2f5ee + +; return carry if no Pokemon in the Bench. +Switch_BenchCheck: ; 2f5ee (b:75ee) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2f5f9 + +Switch_PlayerSelection: ; 2f5f9 (b:75f9) + ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + bank1call OpenPlayAreaScreenForSelection + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTemp_ffa0], a + ret +; 0x2f60a + +Switch_SwitchEffect: ; 2f60a (b:760a) + ldh a, [hTemp_ffa0] + ld e, a + call SwapArenaWithBenchPokemon + ret +; 0x2f611 + +PokemonCenter_DamageCheck: ; 2f611 (b:7611) + call CheckIfPlayAreaHasAnyDamage + ldtx hl, NoPokemonWithDamageCountersText + ret +; 0x2f618 + +PokemonCenter_HealDiscardEnergyEffect: ; 2f618 (b:7618) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld d, a + ld e, PLAY_AREA_ARENA + +; go through every Pokemon in the Play Area +; and heal all damage & discard their Energy cards. +.loop_play_area +; check its damage + ld a, e + ldh [hTempPlayAreaLocation_ff9d], a + call GetCardDamageAndMaxHP + or a + jr z, .next_pkmn ; if no damage, skip Pokemon + +; heal all its damage + push de + ld e, a + ld d, $00 + call HealPlayAreaCardHP + +; loop all cards in deck and for all the Energy cards +; that are attached to this Play Area location Pokemon, +; place them in the Discard Pile. + ldh a, [hTempPlayAreaLocation_ff9d] + or CARD_LOCATION_PLAY_AREA + ld e, a + ld a, $00 + call GetTurnDuelistVariable +.loop_deck + ld a, [hl] + cp e + jr nz, .next_card_deck ; not attached to card, skip + ld a, l + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + and TYPE_ENERGY + jr z, .next_card_deck ; not Energy, skip + ld a, l + call PutCardInDiscardPile +.next_card_deck + inc l + ld a, l + cp DECK_SIZE + jr c, .loop_deck + + pop de +.next_pkmn + inc e + dec d + jr nz, .loop_play_area + ret +; 0x2f659 + +; return carry if non-Turn Duelist has full Bench +; or if they have no Basic Pokemon cards in Discard Pile. +PokemonFlute_BenchCheck: ; 2f659 (b:7659) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret c ; not enough space in Bench + ; check Discard Pile + call SwapTurn + call CreateBasicPokemonCardListFromDiscardPile + ldtx hl, ThereAreNoPokemonInDiscardPileText + call SwapTurn + ret +; 0x2f672 + +PokemonFlute_PlayerSelection: ; 2f672 (b:7672) +; create Discard Pile list + call SwapTurn + call CreateBasicPokemonCardListFromDiscardPile + +; display selection screen and store Player's selection + bank1call Func_5591 + ldtx hl, ChoosePokemonToPlaceInPlayText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText + bank1call DisplayCardList + call SwapTurn + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + ret +; 0x2f68f + +PokemonFlute_PlaceInPlayAreaText: ; 2f68f (b:768f) +; place selected card in non-Turn Duelist's Bench + call SwapTurn + ldh a, [hTemp_ffa0] + call MoveDiscardPileCardToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + call SwapTurn + +; unless it was the Player who played the card, +; display the Pokemon card on screen. + call CheckIfTurnDuelistIsPlayer + ret c + call SwapTurn + ldh a, [hTemp_ffa0] + ldtx hl, CardWasChosenText + bank1call DisplayCardDetailScreen + call SwapTurn + ret +; 0x2f6b3 + +PokemonBreeder_HandPlayAreaCheck: ; 2f6b3 (b:76b3) + call CreatePlayableStage2PokemonCardListFromHand + jr c, .cannot_evolve + bank1call IsPrehistoricPowerActive + ret +.cannot_evolve + ldtx hl, ConditionsForEvolvingToStage2NotFulfilledText + scf + ret +; 0x2f6c1 + +PokemonBreeder_PlayerSelection: ; 2f6c1 (b:76c1) +; create hand list of playable Stage2 cards + call CreatePlayableStage2PokemonCardListFromHand + bank1call Func_5591 + +; handle Player selection of Stage2 card + ldtx hl, PleaseSelectCardText + ldtx de, DuelistHandText + bank1call SetCardListHeaderText + bank1call DisplayCardList + ret c ; exit if B was pressed + + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + ldtx hl, ChooseBasicPokemonToEvolveText + call DrawWideTextBox_WaitForInput + +; handle Player selection of Basic card to evolve + bank1call HasAlivePokemonInPlayArea +.read_input + bank1call OpenPlayAreaScreenForSelection + ret c ; exit if B was pressed + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempPlayAreaLocation_ffa1], a + ld e, a + ldh a, [hTemp_ffa0] + ld d, a + call CheckIfCanEvolveInto_BasicToStage2 + jr c, .read_input ; loop back if cannot evolve this card + or a + ret +; 0x2f6f4 + +PokemonBreeder_EvolveEffect: ; 2f6f4 (b:76f4) + ldh a, [hTempCardIndex_ff9f] + push af + ld hl, hTemp_ffa0 + ld a, [hli] + ldh [hTempCardIndex_ff98], a + ld a, [hl] ; hTempPlayAreaLocation_ffa1 + ldh [hTempPlayAreaLocation_ff9d], a + +; load the Basic Pokemon card name to RAM + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam2 + +; evolve card and overwrite its stage as STAGE2_WITHOUT_STAGE1 + ldh a, [hTempCardIndex_ff98] + call EvolvePokemonCard + ld [hl], STAGE2_WITHOUT_STAGE1 + +; load Stage2 Pokemon card name to RAM + ldh a, [hTempCardIndex_ff98] + call LoadCardDataToBuffer1_FromDeckIndex + ld a, 18 + call CopyCardNameAndLevel + xor a + ld [hl], a ; $0 character + ld hl, wTxRam2_b + ld [hli], a + ld [hl], a + +; display Pokemon picture and play sfx, +; print the corresponding card names. + bank1call DrawLargePictureOfCard + ld a, $5e + call PlaySFX + ldtx hl, PokemonEvolvedIntoPokemonText + call DrawWideTextBox_WaitForInput + bank1call Func_161e + pop af + ldh [hTempCardIndex_ff9f], a + ret +; 0x2f73e + +; creates list in wDuelTempList of all Stage2 Pokemon cards +; in the hand that can evolve a Basic Pokemon card in Play Area +; through use of Pokemon Breeder. +; returns carry if that list is empty. +CreatePlayableStage2PokemonCardListFromHand: ; 2f73e (b:773e) + call CreateHandCardList + ret c ; return if no hand cards + +; check if hand Stage2 Pokemon cards can be made +; to evolve a Basic Pokemon in the Play Area and, if so, +; add it to the wDuelTempList. + ld hl, wDuelTempList + ld e, l + ld d, h +.loop_hand + ld a, [hl] + cp $ff + jr z, .done + call .CheckIfCanEvolveAnyPlayAreaBasicCard + jr c, .next_hand_card + ld a, [hl] + ld [de], a + inc de +.next_hand_card + inc hl + jr .loop_hand + +.done + ld a, $ff ; terminating byte + ld [de], a + ld a, [wDuelTempList] + cp $ff + scf + ret z ; return carry if empty + ; not empty + or a + ret + +; return carry if Stage2 card in a cannot evolve any +; of the Basic Pokemon in Play Area through Pokemon Breeder. +.CheckIfCanEvolveAnyPlayAreaBasicCard + push de + ld d, a + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .set_carry ; skip if not Pokemon card + ld a, [wLoadedCard2Stage] + cp STAGE2 + jr nz, .set_carry ; skip if not Stage2 + +; check if can evolve any Play Area cards + push hl + push bc + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + ld e, PLAY_AREA_ARENA +.loop_play_area + push bc + push de + call CheckIfCanEvolveInto_BasicToStage2 + pop de + pop bc + jr nc, .done_play_area + inc e + dec c + jr nz, .loop_play_area +; set carry + scf +.done_play_area + pop bc + pop hl + pop de + ret +.set_carry + pop de + scf + ret +; 0x2f795 + +; return carry if no cards in the Bench. +ScoopUp_BenchCheck: ; 2f795 (b:7795) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, EffectNoPokemonOnTheBenchText + cp 2 + ret +; 0x2f7a0 + +ScoopUp_PlayerSelection: ; 2f7a0 (b:77a0) +; print text box + ldtx hl, ChoosePokemonToScoopUpText + call DrawWideTextBox_WaitForInput + +; handle Player selection + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + ret c ; exit if B was pressed + + ldh [hTemp_ffa0], a + or a + ret nz ; if it wasn't the Active Pokemon, we are done + +; handle switching to a Pokemon in Bench and store location selected. + call EmptyScreen + ldtx hl, SelectPokemonToPlaceInTheArenaText + call DrawWideTextBox_WaitForInput + bank1call HasAlivePokemonInBench + bank1call OpenPlayAreaScreenForSelection + ldh [hTempPlayAreaLocation_ffa1], a + ret +; 0x2f7c3 + +ScoopUp_ReturnToHandEffect: ; 2f7c3 (b:77c3) +; store chosen card location to Scoop Up + ldh a, [hTemp_ffa0] + or CARD_LOCATION_PLAY_AREA + ld e, a + +; find Basic Pokemon card that is in the selected Play Area location +; and add it to the hand, discarding all cards attached. + ld a, DUELVARS_CARD_LOCATIONS + call GetTurnDuelistVariable +.loop + ld a, [hl] + cp e + jr nz, .next_card ; skip if not in selected location + ld a, l + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .next_card ; skip if not Pokemon card + ld a, [wLoadedCard2Stage] + or a + jr nz, .next_card ; skip if not Basic stage +; found + ld a, l + ldh [hTempCardIndex_ff98], a + call AddCardToHand + ; optimization: break loop here, since + ; no two Basic Pokemon cards may occupy + ; the same Play Area location. +.next_card + inc l + ld a, l + cp DECK_SIZE + jr c, .loop + +; since the card has been moved to hand, +; MovePlayAreaCardToDiscardPile will take care +; of discarding every higher stage cards and other cards attached. + ldh a, [hTemp_ffa0] + ld e, a + call MovePlayAreaCardToDiscardPile + +; if the Pokemon was in the Arena, clear status + ldh a, [hTemp_ffa0] + or a + jr nz, .skip_clear_status + call ClearAllStatusConditions +.skip_clear_status + +; if card was not played by Player, show detail screen +; and print corresponding text. + call CheckIfTurnDuelistIsPlayer + jr c, .shift_or_switch + ldtx hl, PokemonWasReturnedFromArenaToHandText + ldh a, [hTemp_ffa0] + or a + jr z, .display_detail_screen + ldtx hl, PokemonWasReturnedFromBenchToHandText +.display_detail_screen + ldh a, [hTempCardIndex_ff98] + bank1call DisplayCardDetailScreen + +.shift_or_switch +; if card was in Bench, simply shift Pokemon slots... + ldh a, [hTemp_ffa0] + or a + jr z, .switch + call ShiftAllPokemonToFirstPlayAreaSlots + ret + +.switch +; ...if Pokemon was in Arena, then switch it with the selected Bench card. + ldh a, [hTempPlayAreaLocation_ffa1] + ld d, a + ld e, PLAY_AREA_ARENA + call SwapPlayAreaPokemon + call ShiftAllPokemonToFirstPlayAreaSlots + ret +; 0x2f826 + +; return carry if no other cards in hand, +; or if there are no Pokemon cards in hand. +PokemonTrader_HandDeckCheck: ; 2f826 (b:7826) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + ldtx hl, ThereAreNoCardsInHandThatYouCanChangeText + cp 2 + ret c ; return if no other cards in hand + call CreatePokemonCardListFromHand + ldtx hl, ThereAreNoCardsInHandThatYouCanChangeText + ret +; 0x2f838 + +PokemonTrader_PlayerHandSelection: ; 2f838 (b:7838) +; print text box + ldtx hl, ChooseCardFromYourHandToSwitchText + call DrawWideTextBox_WaitForInput + +; create list with all Pokemon cards in hand + call CreatePokemonCardListFromHand + bank1call Func_5591 + +; handle Player selection + ldtx hl, ChooseCardToSwitchText + ldtx de, DuelistHandText + bank1call SetCardListHeaderText + bank1call DisplayCardList + ldh [hTemp_ffa0], a + ret +; 0x2f853 + +PokemonTrader_PlayerDeckSelection: ; 2f853 (b:7853) +; temporarily place chosen hand card in deck +; so it can be potentially chosen to be traded. + ldh a, [hTemp_ffa0] + call RemoveCardFromHand + call ReturnCardToDeck + +; display deck card list screen + ldtx hl, ChooseBasicOrEvolutionPokemonCardFromDeckText + call DrawWideTextBox_WaitForInput + call CreateDeckCardList + bank1call Func_5591 + ldtx hl, ChoosePokemonCardText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + +; handle Player selection +.read_input + bank1call DisplayCardList + jr c, .read_input ; pressing B loops back to selection + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .read_input ; can't select non-Pokemon cards + +; a valid card was selected, store its card index and +; place the selected hand card back to the hand. + ldh a, [hTempCardIndex_ff98] + ldh [hTempPlayAreaLocation_ffa1], a + ldh a, [hTemp_ffa0] + call SearchCardInDeckAndAddToHand + call AddCardToHand + or a + ret +; 0x2f88d + +PokemonTrader_TradeCardsEffect: ; 2f88d (b:788d) +; place hand card in deck + ldh a, [hTemp_ffa0] + call RemoveCardFromHand + call ReturnCardToDeck + +; place deck card in hand + ldh a, [hTempPlayAreaLocation_ffa1] + call SearchCardInDeckAndAddToHand + call AddCardToHand + +; display cards if the Pokemon Trader wasn't played by Player + call CheckIfTurnDuelistIsPlayer + jr c, .done + ldh a, [hTemp_ffa0] + ldtx hl, PokemonWasReturnedToDeckText + bank1call DisplayCardDetailScreen + ldh a, [hTempPlayAreaLocation_ffa1] + ldtx hl, WasPlacedInTheHandText + bank1call DisplayCardDetailScreen +.done + call Func_2c0bd + ret +; 0x2f8b6 + +; makes list in wDuelTempList with all Pokemon cards +; that are in Turn Duelist's hand. +; if list turns out empty, return carry. +CreatePokemonCardListFromHand: ; 2f8b6 (b:78b6) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + ld c, a + ld l, DUELVARS_HAND + ld de, wDuelTempList +.loop + ld a, [hl] + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .next_hand_card + ld a, [hl] + ld [de], a + inc de +.next_hand_card + inc l + dec c + jr nz, .loop + ld a, $ff ; terminating byte + ld [de], a + ld a, [wDuelTempList] + cp $ff + jr z, .set_carry + or a + ret +.set_carry + scf + ret +; 0x2f8e1 + +; return carry if no cards in deck +Pokedex_DeckCheck: ; 2f8e1 (b:78e1) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ldtx hl, NoCardsLeftInTheDeckText + cp DECK_SIZE + ccf + ret +; 0x2f8ed + +Pokedex_PlayerSelection: ; 2f8ed (b:78ed) +; print text box + ldtx hl, RearrangeThe5CardsAtTopOfDeckText + call DrawWideTextBox_WaitForInput + +; cap the number of cards to reorder up to +; number of cards left in the deck (maximum of 5) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ld b, a + ld a, DECK_SIZE + sub [hl] + ld c, 5 + cp c + jr nc, .no_cap + ld c, a +.no_cap + +; fill wDuelTempList with cards that are going to be sorted + ld a, c + inc a + ld [wNumberOfCardsToOrder], a + ld a, b + add DUELVARS_DECK_CARDS + ld l, a + ld de, wDuelTempList +.loop_cards_to_order + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop_cards_to_order + ld a, $ff ; terminating byte + ld [de], a + +.clear_list +; wDuelTempList + 10 will be filled with numbers from 1 +; to 5 (or whatever the maximum order card is). +; so that the first item in that list corresponds to the first card +; the second item corresponds to the second card, etc. +; and the number in the list corresponds to the ordering number. + call CountCardsInDuelTempList + ld b, a + ld a, 1 +; fill order list with zeroes + ldh [hCurSelectionItem], a + ld hl, wDuelTempList + 10 + xor a +.loop_init + ld [hli], a + dec b + jr nz, .loop_init + ld [hl], $ff ; terminating byte + +; display card list to order + bank1call InitAndDrawCardListScreenLayout + ldtx hl, ChooseTheOrderOfTheCardsText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText + bank1call Func_5735 + +.read_input + bank1call DisplayCardList + jr c, .undo ; if B is pressed, undo last order selection + +; a card was selected, check if it's already been selected + ldh a, [hCurMenuItem] + ld e, a + ld d, $00 + ld hl, wDuelTempList + 10 + add hl, de + ld a, [hl] + or a + jr nz, .read_input ; already has an ordering number + +; hasn't been ordered yet, apply to it current ordering number +; and increase it by 1. + ldh a, [hCurSelectionItem] + ld [hl], a + inc a + ldh [hCurSelectionItem], a + +; refresh screen + push af + bank1call Func_5744 + pop af + +; check if we're done ordering + ldh a, [hCurSelectionItem] + ld hl, wNumberOfCardsToOrder + cp [hl] + jr c, .read_input ; if still more cards to select, loop back up + +; we're done selecting cards + call EraseCursor + ldtx hl, IsThisOKText + call YesOrNoMenuWithText_LeftAligned + jr c, .clear_list ; "No" was selected, start over + ; selection was confirmed + +; now wDuelTempList + 10 will be overwritten with the +; card indices in order of selection. + ld hl, wDuelTempList + 10 + ld de, wDuelTempList + ld c, 0 +.loop_write_indices + ld a, [hli] + cp $ff + jr z, .done_write_indices + push hl + push bc + ld c, a + ld b, $00 + ld hl, hTempCardIndex_ff9f + add hl, bc + ld a, [de] + ld [hl], a + pop bc + pop hl + inc de + inc c + jr .loop_write_indices + +.done_write_indices + ld b, $00 + ld hl, hTempList + add hl, bc + ld [hl], $ff ; terminating byte + or a + ret + +.undo +; undo last selection and get previous order number + ld hl, hCurSelectionItem + ld a, [hl] + cp 1 + jr z, .read_input ; already at first input, nothing to undo + dec a + ld [hl], a + ld c, a + ld hl, wDuelTempList + 10 +.asm_2f99e + ld a, [hli] + cp c + jr nz, .asm_2f99e + dec hl + ld [hl], $00 ; overwrite order number with 0 + bank1call Func_5744 + jr .read_input +; 0x2f9aa + +Pokedex_OrderDeckCardsEffect: ; 2f9aa (b:79aa) +; place cards in order to the hand. + ld hl, hTempList + ld c, 0 +.loop_place_hand + ld a, [hli] + cp $ff + jr z, .place_top_deck + call SearchCardInDeckAndAddToHand + inc c + jr .loop_place_hand + +.place_top_deck +; go to last card in list and iterate in decreasing order +; placing each card in top of deck. + dec hl + dec hl +.loop_place_deck + ld a, [hld] + call ReturnCardToDeck + dec c + jr nz, .loop_place_deck + ret +; 0x2f9c4 + +BillEffect: ; 2f9c4 (b:79c4) + ld a, 2 + bank1call DisplayDrawNCardsScreen + ld c, 2 +.loop_draw + call DrawCardFromDeck + jr c, .done + ldh [hTempCardIndex_ff98], a + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + jr nc, .skip_display_screen + push bc + bank1call DisplayPlayerDrawCardScreen + pop bc +.skip_display_screen + dec c + jr nz, .loop_draw +.done + ret +; 0x2f9e3 + +LassEffect: ; 2f9e3 (b:79e3) +; first discard Lass card that was used + ldh a, [hTempCardIndex_ff9f] + call RemoveCardFromHand + call PutCardInDiscardPile + + ldtx hl, PleaseCheckTheOpponentsHandText + call DrawWideTextBox_WaitForInput + + call .DisplayLinkOrCPUHand + ; do for non-Turn Duelist + call SwapTurn + call .ShuffleDuelistHandTrainerCardsInDeck + call SwapTurn + ; do for Turn Duelist +; fallthrough + +.ShuffleDuelistHandTrainerCardsInDeck + call CreateHandCardList + call SortCardsInDuelTempListByID + xor a + ldh [hCurSelectionItem], a + ld hl, wDuelTempList + +; go through all cards in hand +; and any Trainer card is returned to deck. +.loop_hand + ld a, [hli] + ldh [hTempCardIndex_ff98], a + cp $ff + jr z, .done + call GetCardIDFromDeckIndex + call GetCardType + cp TYPE_TRAINER + jr nz, .loop_hand + ldh a, [hTempCardIndex_ff98] + call RemoveCardFromHand + call ReturnCardToDeck + push hl + ld hl, hCurSelectionItem + inc [hl] + pop hl + jr .loop_hand +.done +; show card list + ldh a, [hCurSelectionItem] + or a + call nz, Func_2c0bd ; only show list if there were any Trainer cards + ret +; 0x2fa31 + +.DisplayLinkOrCPUHand ; 2fa31 (b:7a31) + ld a, [wDuelType] + or a + jr z, .cpu_opp + +; link duel + ldh a, [hWhoseTurn] + push af + ld a, OPPONENT_TURN + ldh [hWhoseTurn], a + call .DisplayOppHand + pop af + ldh [hWhoseTurn], a + ret + +.cpu_opp + call SwapTurn + call .DisplayOppHand + call SwapTurn + ret +; 0x2fa4f + +.DisplayOppHand ; 2fa4f (b:7a4f) + call CreateHandCardList + jr c, .no_cards + bank1call InitAndDrawCardListScreenLayout + ldtx hl, ChooseTheCardYouWishToExamineText + ldtx de, DuelistHandText + bank1call SetCardListHeaderText + ld a, A_BUTTON | START + ld [wNoItemSelectionMenuKeys], a + bank1call DisplayCardList + ret +.no_cards + ldtx hl, DuelistHasNoCardsInHandText + call DrawWideTextBox_WaitForInput + ret +; 0x2fa70 + +; return carry if not enough cards in hand for effect +Maintenance_HandCheck: ; 2fa70 (b:7a70) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND + call GetTurnDuelistVariable + ldtx hl, NotEnoughCardsInHandText + cp 3 + ret +; 0x2fa7b + +Maintenance_PlayerSelection: ; 2fa7b (b:7a7b) + ldtx hl, Choose2HandCardsFromHandToReturnToDeckText + ldtx de, ChooseTheCardToPutBackText + call HandlePlayerSelection2HandCards + ret +; 0x2fa85 + +Maintenance_ReturnToDeckAndDrawEffect: ; 2fa85 (b:7a85) +; return both selected cards to the deck + ldh a, [hTempList] + call RemoveCardFromHand + call ReturnCardToDeck + ldh a, [hTempList + 1] + call RemoveCardFromHand + call ReturnCardToDeck + call Func_2c0bd + +; draw one card + ld a, 1 + bank1call DisplayDrawNCardsScreen + call DrawCardFromDeck + ldh [hTempCardIndex_ff98], a + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + ret nc + ; show card on screen if played by Player + bank1call DisplayPlayerDrawCardScreen + ret +; 0x2faad + +; return carry if no cards in deck +PokeBall_DeckCheck: ; 2faad (b:7aad) + ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK + call GetTurnDuelistVariable + ldtx hl, NoCardsLeftInTheDeckText + cp DECK_SIZE + ccf + ret +; 0x2fab9 + +PokeBall_PlayerSelection: ; 2fab9 (b:7ab9) + ld de, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call Func_2c08a + ldh [hTempList], a ; store coin result + ret nc + +; create list of all Pokemon cards in deck to search for + call CreateDeckCardList + ldtx hl, ChooseBasicOrEvolutionPokemonCardFromDeckText + ldtx bc, EvolutionCardText + lb de, SEARCHEFFECT_POKEMON, 0 + call LookForCardsInDeck + jr c, .no_pkmn ; return if Player chose not to check deck + +; handle input + bank1call Func_5591 + ldtx hl, ChoosePokemonCardText + ldtx de, DuelistDeckText + bank1call SetCardListHeaderText +.read_input + bank1call DisplayCardList + jr c, .try_exit ; B was pressed, check if Player can cancel operation + ldh a, [hTempCardIndex_ff98] + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .play_sfx ; can't select non-Pokemon card + ldh a, [hTempCardIndex_ff98] + ldh [hTempList + 1], a + or a + ret + +.no_pkmn + ld a, $ff + ldh [hTempList + 1], a + or a + ret + +.play_sfx + call Func_3794 + jr .read_input + +.try_exit +; Player can only exit screen if there are no cards to choose + ld hl, wDuelTempList +.loop + ld a, [hli] + cp $ff + jr z, .no_pkmn + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .loop + jr .read_input +; 0x2fb15 + +PokeBall_AddToHandEffect: ; 2fb15 (b:7b15) + ldh a, [hTempList] + or a + ret z ; return if coin toss was tails + + ldh a, [hTempList + 1] + cp $ff + jr z, .done ; skip if no Pokemon was chosen + +; add Pokemon card to hand and show in screen if +; it wasn't the Player who played the Trainer card. + call SearchCardInDeckAndAddToHand + call AddCardToHand + call CheckIfTurnDuelistIsPlayer + jr c, .done + ldh a, [hTempList + 1] + ldtx hl, WasPlacedInTheHandText + bank1call DisplayCardDetailScreen +.done + call Func_2c0bd + ret +; 0x2fb36 + +; return carry if no cards in the Discard Pile +Recycle_DiscardPileCheck: ; 2fb36 (b:7b36) + ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE + call GetTurnDuelistVariable + ldtx hl, ThereAreNoCardsInTheDiscardPileText + cp 1 + ret +; 0x2fb41 + +Recycle_PlayerSelection: ; 2fb41 (b:7b41) + ld de, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call Func_2c08a + jr nc, .tails + + call CreateDiscardPileCardList + bank1call Func_5591 + ldtx hl, PleaseSelectCardText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText +.read_input + bank1call DisplayCardList + jr c, .read_input ; can't cancel with B button + +; Discard Pile card was chosen + ldh a, [hTempCardIndex_ff98] + ldh [hTempList], a + ret + +.tails + ld a, $ff + ldh [hTempList], a + or a + ret +; 0x2fb68 + +Recycle_AddToHandEffect: ; 2fb68 (b:7b68) + ldh a, [hTempList] + cp $ff + ret z ; return if no card was selected + +; add card to hand and show in screen if +; it wasn't the Player who played the Trainer card. + call MoveDiscardPileCardToHand + call ReturnCardToDeck + call CheckIfTurnDuelistIsPlayer + ret c + ldh a, [hTempList] + ldtx hl, CardWasChosenText + bank1call DisplayCardDetailScreen + ret +; 0x2fb80 + +; return carry if Bench is full or +; if no Basic Pokemon cards in Discard Pile. +Revive_BenchCheck: ; 2fb80 (b:7b80) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ldtx hl, NoSpaceOnTheBenchText + cp MAX_PLAY_AREA_POKEMON + ccf + ret c + call CreateBasicPokemonCardListFromDiscardPile + ldtx hl, ThereAreNoPokemonInDiscardPileText + ret +; 0x2fb93 + +Revive_PlayerSelection: ; 2fb93 (b:7b93) +; create Basic Pokemon card list from Discard Pile + ldtx hl, ChooseBasicPokemonToPlaceOnBenchText + call DrawWideTextBox_WaitForInput + call CreateBasicPokemonCardListFromDiscardPile + bank1call Func_5591 + +; display screen to select Pokemon + ldtx hl, PleaseSelectCardText + ldtx de, PlayerDiscardPileText + bank1call SetCardListHeaderText + bank1call DisplayCardList + +; store selection + ldh a, [hTempCardIndex_ff98] + ldh [hTemp_ffa0], a + ret +; 0x2fbb0 + +Revive_PlaceInPlayAreaEffect: ; 2fbb0 (b:7bb0) +; place selected Pokemon in the Bench + ldh a, [hTemp_ffa0] + call MoveDiscardPileCardToHand + call AddCardToHand + call PutHandPokemonCardInPlayArea + +; set HP to half, rounded up + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + srl a + bit 0, a + jr z, .rounded + add 5 ; round up HP to nearest 10 +.rounded + ld [hl], a + call CheckIfTurnDuelistIsPlayer + ret c ; done if Player played Revive + +; display card + ldh a, [hTemp_ffa0] + ldtx hl, PlacedOnTheBenchText + bank1call DisplayCardDetailScreen + ret +; 0x2fbd6 + +; makes list in wDuelTempList with all Basic Pokemon cards +; that are in Turn Duelist's Discard Pile. +; if list turns out empty, return carry. +CreateBasicPokemonCardListFromDiscardPile: ; 2fbd6 (b:7bd6) +; gets hl to point at end of Discard Pile cards +; and iterates the cards in reverse order. + ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE + call GetTurnDuelistVariable + ld b, a + add DUELVARS_DECK_CARDS + ld l, a + ld de, wDuelTempList + inc b + jr .next_discard_pile_card + +.check_card + ld a, [hl] + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Type] + cp TYPE_ENERGY + jr nc, .next_discard_pile_card ; if not Pokemon card, skip + ld a, [wLoadedCard2Stage] + or a + jr nz, .next_discard_pile_card ; if not Basic stage, skip + +; write this card'sindex to wDuelTempList + ld a, [hl] + ld [de], a + inc de +.next_discard_pile_card + dec l + dec b + jr nz, .check_card + +; done with the loop. + ld a, $ff ; terminating byte + ld [de], a + ld a, [wDuelTempList] + cp $ff + jr z, .set_carry + or a + ret +.set_carry + scf + ret +; 0x2fc0b + +; return carry if Turn Duelist has not Evolution cards in Play Area +DevolutionSpray_PlayAreaEvolutionCheck: ; 2fc0b (b:7c0b) + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + ld c, a + ld l, DUELVARS_ARENA_CARD +.loop + ld a, [hli] + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Stage] + or a + ret nz ; found an Evolution card + dec c + jr nz, .loop + + ldtx hl, ThereAreNoStage1PokemonText + scf + ret +; 0x2fc24 + +DevolutionSpray_PlayerSelection: ; 2fc24 (b:7c24) +; display textbox + ldtx hl, ChooseEvolutionCardAndPressAButtonToDevolveText + call DrawWideTextBox_WaitForInput + +; have Player select an Evolution card in Play Area + ld a, 1 + ldh [hCurSelectionItem], a + bank1call HasAlivePokemonInPlayArea +.read_input + bank1call OpenPlayAreaScreenForSelection + ret c ; exit if B was pressed + bank1call GetCardOneStageBelow + jr c, .read_input ; can't select Basic cards + +; get pre-evolution card data + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + push hl + push af + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_STAGE + ld l, a + ld a, [hl] + push hl + push af + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD + ld l, a + ld a, [hl] + push hl + push af + jr .update_data + +.repeat_devolution +; show Play Area screen with static cursor +; so that the Player either presses A to do one more devolution +; or presses B to finish selection. + bank1call Func_6194 + jr c, .done_selection ; if B pressed, end selection instead + ; do one more devolution + bank1call GetCardOneStageBelow + +.update_data +; overwrite the card data to new devolved stats + ld a, d + call UpdateDevolvedCardHPAndStage + call GetNextPositionInTempList_TrainerEffects + ld [hl], e + ld a, d + call LoadCardDataToBuffer2_FromDeckIndex + ld a, [wLoadedCard2Stage] + or a + jr nz, .repeat_devolution ; can do one more devolution + +.done_selection + call GetNextPositionInTempList_TrainerEffects + ld [hl], $ff ; terminating byte + +; store this Play Area location in first item of temp list + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hTempList], a + +; update Play Area location display of this Pokemon + call EmptyScreen + ldh a, [hTempPlayAreaLocation_ff9d] + ld hl, wHUDEnergyAndHPBarsX + ld [hli], a + ld [hl], $00 + bank1call PrintPlayAreaCardInformationAndLocation + call EnableLCD + pop bc + pop hl + +; rewrite all duelvars from before the selection was done +; this is so that if "No" is selected in confirmation menu, +; then the Pokemon isn't devolved and remains unchanged. + ld [hl], b + ldtx hl, IsThisOKText + call YesOrNoMenuWithText + pop bc + pop hl + + ld [hl], b + pop bc + pop hl + + ld [hl], b + ret +; 0x2fc99 + +DevolutionSpray_DevolutionEffect: ; 2fc99 (b:7c99) +; first byte in list is Play Area location chosen + ld hl, hTempList + ld a, [hli] + ldh [hTempPlayAreaLocation_ff9d], a + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + push hl + push af + +; loop through devolutions selected + ld hl, hTempList + 1 +.loop_devolutions + ld a, [hl] + cp $ff + jr z, .check_ko ; list is over + ; devolve card to its stage below + push hl + bank1call GetCardOneStageBelow + ld a, d + call UpdateDevolvedCardHPAndStage + call ResetDevolvedCardStatus + pop hl + ld a, [hli] + call PutCardInDiscardPile + jr .loop_devolutions + +.check_ko + pop af + ld e, a + pop hl + ld d, [hl] + call PrintDevolvedCardNameAndLevelText + ldh a, [hTempList] + call PrintPlayAreaCardKnockedOutIfNoHP + bank1call Func_6e49 + ret +; 0x2fcd0 + +Func_2fcd0: ; 2fcd0 (b:7cd0) + call CheckIfThereAreAnyEnergyCardsAttached + ldtx hl, NoEnergyCardsAttachedToPokemonInYourPlayAreaText + ret c + call SwapTurn + call CheckIfThereAreAnyEnergyCardsAttached + ldtx hl, NoEnergyCardsAttachedToPokemonInOppPlayAreaText + call SwapTurn + ret +; 0x2fce4 + +Func_2fce4: ; 2fce4 (b:7ce4) +; handle selection of Energy to discard in own Play Area + ldtx hl, ChoosePokemonInYourAreaThenPokemonInYourOppText + call DrawWideTextBox_WaitForInput + call HandlePokemonAndEnergySelectionScreen + ret c ; return if operation was cancelled + + ldtx hl, ChoosePokemonToRemoveEnergyFromText + call DrawWideTextBox_WaitForInput + + call SwapTurn + ld a, 3 + ldh [hCurSelectionItem], a +.select_opp_pkmn + bank1call HasAlivePokemonInPlayArea + bank1call OpenPlayAreaScreenForSelection + jr nc, .opp_pkmn_selected + ; B was pressed + call SwapTurn + ret ; return if operation was cancelled +.opp_pkmn_selected + ld e, a + call GetPlayAreaCardAttachedEnergies + ld a, [wTotalAttachedEnergies] + or a + jr nz, .has_energy ; has any energy cards attached? + ; no energy, loop back + ldtx hl, NoEnergyCardsText + call DrawWideTextBox_WaitForInput + jr .select_opp_pkmn + +.has_energy +; store this Pokemon's Play Area location + ldh a, [hTempPlayAreaLocation_ff9d] + ldh [hPlayAreaEffectTarget], a + + bank1call CreateArenaOrBenchEnergyCardList + ldh a, [hTempPlayAreaLocation_ff9d] + bank1call DisplayEnergyDiscardScreen + ld a, 2 + ld [wcbfa], a +.asm_2fd2a + bank1call HandleEnergyDiscardMenuInput + jr nc, .asm_2fd4a + ld a, 5 + call AskWhetherToQuitSelectingCards + jr nc, .asm_2fd69 + ld a, [wcbfb] + push af + ldh a, [hTempPlayAreaLocation_ff9d] + bank1call DisplayEnergyDiscardScreen + ld a, 2 + ld [wcbfa], a + pop af + ld [wcbfb], a + jr .asm_2fd2a +.asm_2fd4a + call GetNextPositionInTempList_TrainerEffects + ldh a, [hTempCardIndex_ff98] + ld [hl], a + call RemoveCardFromDuelTempList + ld hl, wcbfb + inc [hl] + ldh a, [hCurSelectionItem] + cp $05 + jr nc, .asm_2fd69 + ld a, [wDuelTempList] + cp $ff + jr z, .asm_2fd69 + bank1call DisplayEnergyDiscardMenu + jr .asm_2fd2a +.asm_2fd69 + call GetNextPositionInTempList_TrainerEffects + ld [hl], $ff + call SwapTurn + or a + ret +; 0x2fd73 + + INCROM $2fd73, $2fe25 + +; outputs in hl the next position +; in hTempList to place a new card, +; and increments hCurSelectionItem. +; identical to GetNextPositionInTempList. +GetNextPositionInTempList_TrainerEffects: ; 2fe25 (b:7e25) + push de + ld hl, hCurSelectionItem + ld a, [hl] + inc [hl] + ld e, a + ld d, $00 + ld hl, hTempList + add hl, de + pop de + ret +; 0x2fe34 + +; handles screen for Player to select 2 cards from the hand to discard. +; first prints text informing Player to choose cards to discard +; then runs HandlePlayerSelection2HandCards routine. +HandlePlayerSelection2HandCardsToDiscard: ; 2fe34 (b:7e34) + ldtx hl, Choose2CardsFromHandToDiscardText + ldtx de, ChooseTheCardToDiscardText +; fallthrough + +; handles screen for Player to select 2 cards from the hand +; to activate some Trainer card effect. +; assumes Trainer card index being used is in [hTempCardIndex_ff9f]. +; stores selection of cards in hTempList. +; returns carry if Player cancels operation. +; input: +; hl = text to print in text box; +; de = text to print in screen header. +HandlePlayerSelection2HandCards: ; 2fe3a (b:7e3a) + push de + call DrawWideTextBox_WaitForInput + +; remove the Trainer card being used from list +; of cards to select from hand. + call CreateHandCardList + ldh a, [hTempCardIndex_ff9f] + call RemoveCardFromDuelTempList + + xor a + ldh [hCurSelectionItem], a + pop hl +.loop + push hl + bank1call Func_5591 + pop hl + bank1call SetCardListInfoBoxText + push hl + bank1call DisplayCardList + pop hl + jr c, .set_carry ; was B pressed? + push hl + call GetNextPositionInTempList_TrainerEffects + ldh a, [hTempCardIndex_ff98] + ld [hl], a + call RemoveCardFromDuelTempList + pop hl + ldh a, [hCurSelectionItem] + cp 2 + jr c, .loop ; is selection over? + or a + ret +.set_carry + scf + ret +; 0x2fe6e + + INCROM $2fe6e, $2fea9 + +; input: +; a = move animation to play +Func_2fea9: ; 2fea9 (b:7ea9) + ld [wLoadedMoveAnimation], a + bank1call Func_7415 + ld bc, $0 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + ret +; 0x2febc + +; heals amount of damage in register e for card in +; Play Area location in [hTempPlayAreaLocation_ff9d]. +; plays healing animation and prints text with card's name. +; input: +; e = amount of HP to heal +; [hTempPlayAreaLocation_ff9d] = Play Area location of card to heal +HealPlayAreaCardHP: ; 2febc (b:7ebc) + ld e, a + ld d, $00 + +; play heal animation + push de + bank1call Func_7415 + ld a, $86 + ld [wLoadedMoveAnimation], a + ldh a, [hTempPlayAreaLocation_ff9d] + ld b, a + ld c, $01 + ldh a, [hWhoseTurn] + ld h, a + bank1call PlayMoveAnimation + bank1call WaitMoveAnimation + pop hl + +; print Pokemon card name and damage healed + push hl + call LoadTxRam3 + ld hl, $0000 + call LoadTxRam2 + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + call LoadCardDataToBuffer1_FromDeckIndex + ld a, 18 + call CopyCardNameAndLevel + ld [hl], $00 ; terminating character on end of the name + ldtx hl, PokemonHealedDamageText + call DrawWideTextBox_WaitForInput + pop de + +; heal the target Pokemon + ldh a, [hTempPlayAreaLocation_ff9d] + add DUELVARS_ARENA_CARD_HP + call GetTurnDuelistVariable + add e + ld [hl], a + ret +; 0x2ff03 + +rept $fd + db $ff +endr diff --git a/src/engine/home.asm b/src/engine/home.asm index fb6c145f..d1e6f202 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -3604,6 +3604,7 @@ GetCardIDFromDeckIndex: ; 1324 (0:1324) ret ; remove card c from wDuelTempList (it contains a $ff-terminated list of deck indexes) +; returns carry if no matches were found. RemoveCardFromDuelTempList: ; 132f (0:132f) push hl push de @@ -3703,9 +3704,9 @@ LoadCardDataToBuffer2_FromDeckIndex: ; 138c (0:138c) ret ; evolve a turn holder's Pokemon card in the play area slot determined by hTempPlayAreaLocation_ff9d -; into another turn holder's Pokemon card identifier by it's deck index (0-59) in hTempCardIndex_ff98. -; return nc if evolution was succesful. -EvolvePokemonCard: ; 13a2 (0:13a2) +; into another turn holder's Pokemon card identifier by its deck index (0-59) in hTempCardIndex_ff98. +; return nc if evolution was successful. +EvolvePokemonCardIfPossible: ; 13a2 (0:13a2) ; first make sure the attempted evolution is viable ldh a, [hTempCardIndex_ff98] ld d, a @@ -3713,7 +3714,12 @@ EvolvePokemonCard: ; 13a2 (0:13a2) ld e, a call CheckIfCanEvolveInto ret c ; return if it's not capable of evolving into the selected Pokemon - ; place the evolved Pokemon card in the play area location of the pre-evolved Pokemon card +; fallthrough + +; evolve a turn holder's Pokemon card in the play area slot determined by hTempPlayAreaLocation_ff9d +; into another turn holder's Pokemon card identifier by its deck index (0-59) in hTempCardIndex_ff98. +EvolvePokemonCard: ; 13ac (0:13ac) +; place the evolved Pokemon card in the play area location of the pre-evolved Pokemon card ldh a, [hTempPlayAreaLocation_ff9d] ld e, a add DUELVARS_ARENA_CARD diff --git a/src/hram.asm b/src/hram.asm index d36869b8..9aa15040 100644 --- a/src/hram.asm +++ b/src/hram.asm @@ -104,8 +104,8 @@ NEXTU hAIEnergyTransEnergyCard:: ; ffa2 ; PLAY_AREA_* of target selected for some Pkmn Powers, -; like the targets chosen for Curse or Damage Swap. -hPkmnPowerPlayAreaTarget:: ; ffa2 +; (e.g. Curse, Damage Swap) and for trainer card effect. +hPlayAreaEffectTarget:: ; ffa2 ds $1 hAIEnergyTransPlayAreaLocation:: ; ffa3 @@ -165,7 +165,7 @@ hCurMenuItem:: ; ffb1 ds $1 ; stores the item number in the selection menu of various effects -hEffectItemSelection:: ; ffb2 +hCurSelectionItem:: ; ffb2 ds $1 ds $2 diff --git a/src/text/text1.asm b/src/text/text1.asm index 23ad017d..fa1d585a 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -826,7 +826,7 @@ ThereAreNoEnergyCardsInDiscardPileText: ; 3746a (d:746a) line "in the the Discard Pile." done -Text00b0: ; 3749e (d:749e) +ThereAreNoBasicEnergyCardsInDiscardPileText: ; 3749e (d:749e) text "There are no Basic Energy cards" line "in the Discard Pile." done @@ -854,7 +854,7 @@ NotAffectedByPoisonSleepParalysisOrConfusionText: ; 37583 (d:7583) line "Sleep, Paralysis, or Confusion." done -Text00b6: ; 375bc (d:75bc) +NotEnoughCardsInHandText: ; 375bc (d:75bc) text "Not enough cards in Hand." done @@ -862,22 +862,22 @@ EffectNoPokemonOnTheBenchText: ; 375d7 (d:75d7) text "No Pokémon on the Bench." done -Text00b8: ; 375f1 (d:75f1) +ThereAreNoPokemonInDiscardPileText: ; 375f1 (d:75f1) text "There are no Pokémon" line "in the Discard Pile." done -Text00b9: ; 3761c (d:761c) +ConditionsForEvolvingToStage2NotFulfilledText: ; 3761c (d:761c) text "Conditions for evolving to" line "Stage 2 not fulfilled." done -Text00ba: ; 3764f (d:764f) +ThereAreNoCardsInHandThatYouCanChangeText: ; 3764f (d:764f) text "There are no cards in Hand" line "that you can change." done -Text00bb: ; 37680 (d:7680) +ThereAreNoCardsInTheDiscardPileText: ; 37680 (d:7680) text "There are no cards in the" line "Discard Pile." done @@ -887,12 +887,12 @@ ThereAreNoStage1PokemonText: ; 376a9 (d:76a9) line "in the Play Area." done -Text00bd: ; 376d9 (d:76d9) +NoEnergyCardsAttachedToPokemonInYourPlayAreaText: ; 376d9 (d:76d9) text "No Energy cards are attached to" line "Pokémon in your Play Area." done -Text00be: ; 37715 (d:7715) +NoEnergyCardsAttachedToPokemonInOppPlayAreaText: ; 37715 (d:7715) text "No Energy cards attached to Pokémon" line "in your opponent's Play Area." done @@ -959,7 +959,7 @@ CannotBeUsedInTurnWhichWasPlayedText: ; 378ef (d:78ef) line "which it was played." done -Text00cd: ; 37923 (d:7923) +ThereIsNoEnergyCardAttachedText: ; 37923 (d:7923) text "There is no Energy card attached." done @@ -1128,7 +1128,7 @@ TrainerCardSuccessCheckText: ; 37eea (d:7eea) line "If Heads, you're successful!" done -Text00f0: ; 37f24 (d:7f24) +CardCheckIfHeads8CardsIfTails1CardText: ; 37f24 (d:7f24) text "Card check!" line "If Heads, 8 cards! If Tails, 1 card!" done diff --git a/src/text/text2.asm b/src/text/text2.asm index 9d328b6d..43a8ba55 100644 --- a/src/text/text2.asm +++ b/src/text/text2.asm @@ -503,22 +503,22 @@ Text014f: ; 394a6 (e:54a6) line "A Button is pressed. B Button quits." done -Text0150: ; 394f0 (e:54f0) +ChoosePokemonToRemoveDamageCounterFromText: ; 394f0 (e:54f0) text "Choose a Pokémon to remove" line "the Damage counter from." done -Text0151: ; 39525 (e:5525) +ChooseCardToDiscardFromHandText: ; 39525 (e:5525) text "Choose the card to Discard" line "from the Hand." done -Text0152: ; 39550 (e:5550) +ChoosePokemonToRemoveEnergyFromText: ; 39550 (e:5550) text "Choose a Pokémon to remove" line "Energy from and choose the Energy." done -Text0153: ; 3958f (e:558f) +Choose2BasicEnergyCardsFromDiscardPileText: ; 3958f (e:558f) text "Choose 2 Basic Energy cards" line "from the Discard Pile." done @@ -528,22 +528,22 @@ Text0154: ; 395c3 (e:55c3) line "Button to remove Damage counters." done -Text0155: ; 39607 (e:5607) +Choose2CardsFromHandToDiscardText: ; 39607 (e:5607) text "Choose 2 cards from the Hand" line "to Discard." done -Text0156: ; 39631 (e:5631) +Choose2HandCardsFromHandToReturnToDeckText: ; 39631 (e:5631) text "Choose 2 cards from the Hand" line "to return to the Deck." done -Text0157: ; 39666 (e:5666) +ChooseCardToPlaceInHandText: ; 39666 (e:5666) text "Choose a card to" line "place in the Hand." done -Text0158: ; 3968b (e:568b) +ChoosePokemonToAttachDefenderToText: ; 3968b (e:568b) text "Choose a Pokémon to" line "attach Defender to." done @@ -553,75 +553,75 @@ Text0159: ; 396b4 (e:56b4) line "A to Draw, B to End." done -Text015a: ; 396e6 (e:56e6) +ChoosePokemonToReturnToTheDeckText: ; 396e6 (e:56e6) text "Choose a Pokémon to" line "return to the Deck." done -Text015b: ; 3970f (e:570f) +ChoosePokemonToPlaceInPlayText: ; 3970f (e:570f) text "Choose a Pokémon to" line "place in play." done -Text015c: ; 39733 (e:5733) +ChooseBasicPokemonToEvolveText: ; 39733 (e:5733) text "Choose a Basic Pokémon" line "to Evolve." done -Text015d: ; 39756 (e:5756) +ChoosePokemonToScoopUpText: ; 39756 (e:5756) text "Choose a Pokémon to" line "Scoop Up." done -Text015e: ; 39775 (e:5775) +ChooseCardFromYourHandToSwitchText: ; 39775 (e:5775) text "Choose a card from your" line "Hand to Switch." done -Text015f: ; 3979e (e:579e) +ChooseCardToSwitchText: ; 3979e (e:579e) text "Choose a card to" line "Switch." done -Text0160: ; 397b8 (e:57b8) +ChooseBasicOrEvolutionPokemonCardFromDeckText: ; 397b8 (e:57b8) text "Choose a Basic or Evolution" line "Pokémon card from the Deck." done -Text0161: ; 397f1 (e:57f1) +ChoosePokemonCardText: ; 397f1 (e:57f1) text "Choose" line "a Pokémon card." done -Text0162: ; 39809 (e:5809) +RearrangeThe5CardsAtTopOfDeckText: ; 39809 (e:5809) text "Rearrange the 5 cards at" line "the top of the Deck." done -Text0163: ; 39838 (e:5838) +PleaseCheckTheOpponentsHandText: ; 39838 (e:5838) text "Please check the opponent's" line "Hand." done -Text0164: ; 3985b (e:585b) +EvolutionCardText: ; 3985b (e:585b) text "Evolution card" done -Text0165: ; 3986b (e:586b) +CardWasChosenText: ; 3986b (e:586b) text " was chosen." done -Text0166: ; 3987a (e:587a) +ChooseBasicPokemonToPlaceOnBenchText: ; 3987a (e:587a) text "Choose a Basic Pokémon" line "to place on the Bench." done -Text0167: ; 398a9 (e:58a9) +ChooseEvolutionCardAndPressAButtonToDevolveText: ; 398a9 (e:58a9) text "Choose an Evolution card and" line "press the A Button to Devolve 1." done -Text0168: ; 398e8 (e:58e8) +ChoosePokemonInYourAreaThenPokemonInYourOppText: ; 398e8 (e:58e8) text "Choose a Pokémon in your Area, then" line "a Pokémon in your opponent's." done @@ -636,22 +636,22 @@ Text016a: ; 39952 (e:5952) line "with the Active Pokémon." done -Text016b: ; 39987 (e:5987) +PokemonAndAllAttachedCardsWereReturnedToDeckText: ; 39987 (e:5987) text " and all attached" line "cards were returned to the Deck." done -Text016c: ; 399bc (e:59bc) +PokemonWasReturnedFromArenaToHandText: ; 399bc (e:59bc) text " was returned" line "from the Arena to the Hand." done -Text016d: ; 399e8 (e:59e8) +PokemonWasReturnedFromBenchToHandText: ; 399e8 (e:59e8) text " was returned" line "from the Bench to the Hand." done -Text016e: ; 39a14 (e:5a14) +PokemonWasReturnedToDeckText: ; 39a14 (e:5a14) text " was returned" line "to the Deck." done @@ -669,12 +669,12 @@ YouReceivedTheseCardsText: ; 39a63 (e:5a63) text "You received these cards:" done -Text0172: ; 39a7e (e:5a7e) +ChooseTheCardToPutBackText: ; 39a7e (e:5a7e) text "Choose the card" line "to put back." done -Text0173: ; 39a9c (e:5a9c) +ChooseTheCardToDiscardText: ; 39a9c (e:5a9c) text "Choose the card" line "to Discard." done @@ -698,12 +698,12 @@ CameToTheBenchText: ; 39b03 (e:5b03) line "came to the Bench!" done -Text0178: ; 39b19 (e:5b19) +DuelistHasNoCardsInHandText: ; 39b19 (e:5b19) text " has" line "no cards in Hand!" done -Text0179: ; 39b32 (e:5b32) +PokemonHealedDamageText: ; 39b32 (e:5b32) text " healed" line " damage!" done @@ -721,7 +721,7 @@ YouCanSelectMoreCardsQuitText: ; 39b73 (e:5b73) text "You can select more cards. Quit?" done -Text017d: ; 39b97 (e:5b97) +ThereWasNoEffectText: ; 39b97 (e:5b97) text "There was no effect!" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index a7af9bec..b44dc3ef 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -177,21 +177,21 @@ TextOffsets:: ; 34000 (d:4000) textpointer NoDamageCountersText ; 0x00ad textpointer NoEnergyAttachedToOpponentsActiveText ; 0x00ae textpointer ThereAreNoEnergyCardsInDiscardPileText ; 0x00af - textpointer Text00b0 ; 0x00b0 + textpointer ThereAreNoBasicEnergyCardsInDiscardPileText ; 0x00b0 textpointer NoCardsLeftInTheDeckText ; 0x00b1 textpointer NoSpaceOnTheBenchText ; 0x00b2 textpointer NoPokemonCapableOfEvolvingText ; 0x00b3 textpointer CantEvolvePokemonInSameTurnItsPlacedText ; 0x00b4 textpointer NotAffectedByPoisonSleepParalysisOrConfusionText ; 0x00b5 - textpointer Text00b6 ; 0x00b6 + textpointer NotEnoughCardsInHandText ; 0x00b6 textpointer EffectNoPokemonOnTheBenchText ; 0x00b7 - textpointer Text00b8 ; 0x00b8 - textpointer Text00b9 ; 0x00b9 - textpointer Text00ba ; 0x00ba - textpointer Text00bb ; 0x00bb + textpointer ThereAreNoPokemonInDiscardPileText ; 0x00b8 + textpointer ConditionsForEvolvingToStage2NotFulfilledText ; 0x00b9 + textpointer ThereAreNoCardsInHandThatYouCanChangeText ; 0x00ba + textpointer ThereAreNoCardsInTheDiscardPileText ; 0x00bb textpointer ThereAreNoStage1PokemonText ; 0x00bc - textpointer Text00bd ; 0x00bd - textpointer Text00be ; 0x00be + textpointer NoEnergyCardsAttachedToPokemonInYourPlayAreaText ; 0x00bd + textpointer NoEnergyCardsAttachedToPokemonInOppPlayAreaText ; 0x00be textpointer EnergyCardsRequiredToRetreatText ; 0x00bf textpointer NotEnoughEnergyCardsText ; 0x00c0 textpointer NotEnoughFireEnergyText ; 0x00c1 @@ -206,7 +206,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer OnlyOncePerTurnText ; 0x00ca textpointer CannotUseDueToStatusText ; 0x00cb textpointer CannotBeUsedInTurnWhichWasPlayedText ; 0x00cc - textpointer Text00cd ; 0x00cd + textpointer ThereIsNoEnergyCardAttachedText ; 0x00cd textpointer NoGrassEnergyText ; 0x00ce textpointer CannotUseSinceTheresOnly1PkmnText ; 0x00cf textpointer CannotUseBecauseItWillBeKnockedOutText ; 0x00d0 @@ -241,7 +241,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer IfTailsDamageToYourselfTooText ; 0x00ed textpointer SuccessCheckIfHeadsAttackIsSuccessfulText ; 0x00ee textpointer TrainerCardSuccessCheckText ; 0x00ef - textpointer Text00f0 ; 0x00f0 + textpointer CardCheckIfHeads8CardsIfTails1CardText ; 0x00f0 textpointer IfHeadsNoDamageNextTurnText ; 0x00f1 textpointer Text00f2 ; 0x00f2 textpointer DamageCheckIfHeadsPlusDamageText ; 0x00f3 @@ -337,52 +337,52 @@ TextOffsets:: ; 34000 (d:4000) textpointer DrewFireEnergyFromTheHandText ; 0x014d textpointer ThePkmnCardsInHandAndDeckWereShuffledText ; 0x014e textpointer Text014f ; 0x014f - textpointer Text0150 ; 0x0150 - textpointer Text0151 ; 0x0151 - textpointer Text0152 ; 0x0152 - textpointer Text0153 ; 0x0153 + textpointer ChoosePokemonToRemoveDamageCounterFromText ; 0x0150 + textpointer ChooseCardToDiscardFromHandText ; 0x0151 + textpointer ChoosePokemonToRemoveEnergyFromText ; 0x0152 + textpointer Choose2BasicEnergyCardsFromDiscardPileText ; 0x0153 textpointer Text0154 ; 0x0154 - textpointer Text0155 ; 0x0155 - textpointer Text0156 ; 0x0156 - textpointer Text0157 ; 0x0157 - textpointer Text0158 ; 0x0158 + textpointer Choose2CardsFromHandToDiscardText ; 0x0155 + textpointer Choose2HandCardsFromHandToReturnToDeckText ; 0x0156 + textpointer ChooseCardToPlaceInHandText ; 0x0157 + textpointer ChoosePokemonToAttachDefenderToText ; 0x0158 textpointer Text0159 ; 0x0159 - textpointer Text015a ; 0x015a - textpointer Text015b ; 0x015b - textpointer Text015c ; 0x015c - textpointer Text015d ; 0x015d - textpointer Text015e ; 0x015e - textpointer Text015f ; 0x015f - textpointer Text0160 ; 0x0160 - textpointer Text0161 ; 0x0161 - textpointer Text0162 ; 0x0162 - textpointer Text0163 ; 0x0163 - textpointer Text0164 ; 0x0164 - textpointer Text0165 ; 0x0165 - textpointer Text0166 ; 0x0166 - textpointer Text0167 ; 0x0167 - textpointer Text0168 ; 0x0168 + textpointer ChoosePokemonToReturnToTheDeckText ; 0x015a + textpointer ChoosePokemonToPlaceInPlayText ; 0x015b + textpointer ChooseBasicPokemonToEvolveText ; 0x015c + textpointer ChoosePokemonToScoopUpText ; 0x015d + textpointer ChooseCardFromYourHandToSwitchText ; 0x015e + textpointer ChooseCardToSwitchText ; 0x015f + textpointer ChooseBasicOrEvolutionPokemonCardFromDeckText ; 0x0160 + textpointer ChoosePokemonCardText ; 0x0161 + textpointer RearrangeThe5CardsAtTopOfDeckText ; 0x0162 + textpointer PleaseCheckTheOpponentsHandText ; 0x0163 + textpointer EvolutionCardText ; 0x0164 + textpointer CardWasChosenText ; 0x0165 + textpointer ChooseBasicPokemonToPlaceOnBenchText ; 0x0166 + textpointer ChooseEvolutionCardAndPressAButtonToDevolveText ; 0x0167 + textpointer ChoosePokemonInYourAreaThenPokemonInYourOppText ; 0x0168 textpointer Text0169 ; 0x0169 textpointer Text016a ; 0x016a - textpointer Text016b ; 0x016b - textpointer Text016c ; 0x016c - textpointer Text016d ; 0x016d - textpointer Text016e ; 0x016e + textpointer PokemonAndAllAttachedCardsWereReturnedToDeckText ; 0x016b + textpointer PokemonWasReturnedFromArenaToHandText ; 0x016c + textpointer PokemonWasReturnedFromBenchToHandText ; 0x016d + textpointer PokemonWasReturnedToDeckText ; 0x016e textpointer WasPlacedInTheHandText ; 0x016f textpointer TheCardYouReceivedText ; 0x0170 textpointer YouReceivedTheseCardsText ; 0x0171 - textpointer Text0172 ; 0x0172 - textpointer Text0173 ; 0x0173 + textpointer ChooseTheCardToPutBackText ; 0x0172 + textpointer ChooseTheCardToDiscardText ; 0x0173 textpointer DiscardedCardsFromDeckText ; 0x0174 textpointer Text0175 ; 0x0175 textpointer NoneCameText ; 0x0176 textpointer CameToTheBenchText ; 0x0177 - textpointer Text0178 ; 0x0178 - textpointer Text0179 ; 0x0179 + textpointer DuelistHasNoCardsInHandText ; 0x0178 + textpointer PokemonHealedDamageText ; 0x0179 textpointer PokemonDevolvedToText ; 0x017a textpointer ThereWasNoFireEnergyText ; 0x017b textpointer YouCanSelectMoreCardsQuitText ; 0x017c - textpointer Text017d ; 0x017d + textpointer ThereWasNoEffectText ; 0x017d textpointer ThereWasNoEffectFromToxicText ; 0x017e textpointer ThereWasNoEffectFromPoisonText ; 0x017f textpointer ThereWasNoEffectFromSleepText ; 0x0180 From c35e81e3614ef410b06b5abaebde6ddfd9203955 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Wed, 16 Dec 2020 09:27:45 +0000 Subject: [PATCH 40/45] Add minor corrections --- src/engine/bank07.asm | 8 ++++---- src/engine/effect_functions.asm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index aab0cd94..a4aa5f8f 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -559,9 +559,9 @@ Func_1c8bc: ; 1c8bc (7:48bc) push hl push bc call Set_OBJ_8x8 - ld a, $a2 + ld a, LOW(Func_3ba2) ld [wDoFrameFunction], a - ld a, $3b + ld a, HIGH(Func_3ba2) ld [wDoFrameFunction + 1], a ld a, $ff ld hl, wAnimationQueue @@ -934,9 +934,9 @@ Func_1ccbc: ; 1ccbc (7:4cbc) ldh [rSCX], a ldh [hSCY], a ld hl, wd4b9 - ld [hl], $bc + ld [hl], LOW(Func_1ccbc) inc hl - ld [hl], $4c + ld [hl], HIGH(Func_1ccbc) ret ; 0x1ccd4 diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 07192271..32d13e0c 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -9668,7 +9668,7 @@ EnergySearch_AddToHandEffect: ; 2f372 (b:7372) ; check if card index in a is a Basic Energy card. ; returns carry in case it's not. -CheckIfCardIsBasicEnergy ; 2f38f (b:738f) +CheckIfCardIsBasicEnergy: ; 2f38f (b:738f) call LoadCardDataToBuffer2_FromDeckIndex ld a, [wLoadedCard2Type] cp TYPE_ENERGY From 166dc2eda578a07cb21950bc752dc90ff877929c Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 20 Dec 2020 14:28:15 +0000 Subject: [PATCH 41/45] Rename DUELVARS_ARENA_CARD_FLAGS --- src/constants/duel_constants.asm | 4 ++-- src/engine/bank01.asm | 2 +- src/engine/effect_functions.asm | 32 ++++++++++++++++---------------- src/engine/home.asm | 10 +++++----- src/wram.asm | 10 ++++++++-- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 750fac0a..769e16b1 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -32,7 +32,7 @@ DUELVARS_DECK_CARDS EQUS "LOW(wPlayerDeckCards)" DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK EQUS "LOW(wPlayerNumberOfCardsNotInDeck)" ; ba DUELVARS_ARENA_CARD EQUS "LOW(wPlayerArenaCard)" ; bb DUELVARS_BENCH EQUS "LOW(wPlayerBench)" ; bc -DUELVARS_ARENA_CARD_FLAGS_C2 EQU $c2 +DUELVARS_ARENA_CARD_FLAGS EQUS "LOW(wPlayerArenaCardFlags)" ; c2 DUELVARS_ARENA_CARD_HP EQUS "LOW(wPlayerArenaCardHP)" ; c8 DUELVARS_BENCH1_CARD_HP EQUS "LOW(wPlayerBench1CardHP)" ; c9 DUELVARS_BENCH2_CARD_HP EQUS "LOW(wPlayerBench2CardHP)" ; ca @@ -164,7 +164,7 @@ SUBSTATUS2_GROWL EQU $12 SUBSTATUS3_THIS_TURN_DOUBLE_DAMAGE EQU 0 SUBSTATUS3_HEADACHE EQU 1 -; DUELVARS_ARENA_CARD_FLAGS_C2 constants +; DUELVARS_ARENA_CARD_FLAGS constants USED_PKMN_POWER_THIS_TURN_F EQU 5 USED_LEEK_SLAP_THIS_DUEL_F EQU 6 CAN_EVOLVE_THIS_TURN_F EQU 7 diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 6d3c4fb0..a40bf992 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -7563,7 +7563,7 @@ SetAllPlayAreaPokemonCanEvolve: ; 70f6 (1:70f6) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable ld c, a - ld l, DUELVARS_ARENA_CARD_FLAGS_C2 + ld l, DUELVARS_ARENA_CARD_FLAGS .next_pkmn_loop res 5, [hl] set CAN_EVOLVE_THIS_TURN_F, [hl] diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 32d13e0c..5886f83b 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -975,7 +975,7 @@ ResetDevolvedCardStatus: ; 2c45d (b:445d) ld [hl], $00 ; reset C2 flags ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS ld l, a ld [hl], $00 ret @@ -2541,7 +2541,7 @@ WeezingSelfdestructEffect: ; 2ccea (b:4cea) Shift_OncePerTurnCheck: ; 2cd09 (b:4d09) ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and USED_PKMN_POWER_THIS_TURN jr nz, .already_used @@ -2607,7 +2607,7 @@ Shift_ChangeColorEffect: ; 2cd5d (b:4d5d) call LoadCardDataToBuffer1_FromDeckIndex ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] @@ -2652,7 +2652,7 @@ TangelaPoisonPowder_AIEffect: ; 2cda0 (b:4da0) Heal_OncePerTurnCheck: ; 2cda8 (b:4da8) ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and USED_PKMN_POWER_THIS_TURN jr nz, .already_used @@ -2709,7 +2709,7 @@ Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) .done ; flag Pkmn Power as being used regardless of coin outcome ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] ldh a, [hAIPkmnPowerEffectParam] @@ -2759,7 +2759,7 @@ PoisonWhip_AIEffect: ; 2ce4b (b:4e4b) SolarPower_CheckUse: ; 2ce53 (b:4e53) ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and USED_PKMN_POWER_THIS_TURN jr nz, .already_used @@ -2803,7 +2803,7 @@ SolarPower_RemoveStatusEffect: ; 2ce82 (b:4e82) bank1call WaitMoveAnimation ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] ld l, DUELVARS_ARENA_CARD_STATUS @@ -3541,7 +3541,7 @@ Cowardice_Check: ; 2d28b (b:528b) ret c ; return if no bench ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable ldtx hl, CannotBeUsedInTurnWhichWasPlayedText and CAN_EVOLVE_THIS_TURN @@ -4587,7 +4587,7 @@ Curse_CheckDamageAndBench: ; 2d7fc (b:57fc) ldh [hTemp_ffa0], a ; fail if Pkmn Power has already been used - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable ldtx hl, OnlyOncePerTurnText and USED_PKMN_POWER_THIS_TURN @@ -4715,7 +4715,7 @@ Curse_PlayerSelectEffect: ; 2d834 (b:5834) Curse_TransferDamageEffect: ; 2d8bb (b:58bb) ; set Pkmn Power as used ldh a, [hTempList] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] @@ -6587,7 +6587,7 @@ PrehistoricPowerEffect: ; 2e29a (b:629a) Peek_OncePerTurnCheck: ; 2e29c (b:629c) ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and USED_PKMN_POWER_THIS_TURN jr nz, .already_used @@ -6603,7 +6603,7 @@ Peek_OncePerTurnCheck: ; 2e29c (b:629c) Peek_SelectEffect: ; 2e2b4 (b:62b4) ; set Pkmn Power used flag ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] @@ -8103,7 +8103,7 @@ StepIn_BenchCheck: ; 2eaca (b:6aca) or a jr z, .set_carry - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable ldtx hl, OnlyOncePerTurnText and USED_PKMN_POWER_THIS_TURN @@ -8122,7 +8122,7 @@ StepIn_SwitchEffect: ; 2eae8 (b:6ae8) ldh a, [hTemp_ffa0] ld e, a call SwapArenaWithBenchPokemon - ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + ld a, DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_PKMN_POWER_THIS_TURN_F, [hl] ret @@ -8161,7 +8161,7 @@ LeekSlap_AIEffect: ; 2eb17 (b:6b17) ; return carry if already used attack in this duel LeekSlap_OncePerDuelCheck: ; 2eb1f (b:6b1f) ; can only use attack if it was never used before this duel - ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + ld a, DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and USED_LEEK_SLAP_THIS_DUEL ret z @@ -8171,7 +8171,7 @@ LeekSlap_OncePerDuelCheck: ; 2eb1f (b:6b1f) ; 0x2eb2c LeekSlap_SetUsedThisDuelFlag: ; 2eb2c (b:6b2c) - ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + ld a, DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable set USED_LEEK_SLAP_THIS_DUEL_F, [hl] ret diff --git a/src/engine/home.asm b/src/engine/home.asm index d1e6f202..65d6b2d6 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -3744,7 +3744,7 @@ EvolvePokemonCard: ; 13ac (0:13ac) ld [hl], a ; reset status (if in arena) and set the flag that prevents it from evolving again this turn ld a, e - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS ld l, a ld [hl], $00 ld a, e @@ -3791,7 +3791,7 @@ CheckIfCanEvolveInto: ; 13f7 (0:13f7) jr nz, .cant_evolve ; jump if they are incompatible to evolve pop de ld a, e - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and CAN_EVOLVE_THIS_TURN jr nz, .can_evolve @@ -3816,7 +3816,7 @@ CheckIfCanEvolveInto: ; 13f7 (0:13f7) ; return carry if not basic to stage 2 evolution, or if evolution not possible this turn. CheckIfCanEvolveInto_BasicToStage2: ; 142b (0:142b) ld a, e - add DUELVARS_ARENA_CARD_FLAGS_C2 + add DUELVARS_ARENA_CARD_FLAGS call GetTurnDuelistVariable and CAN_EVOLVE_THIS_TURN jr nz, .can_evolve @@ -3910,7 +3910,7 @@ PutHandPokemonCardInPlayArea: ; 1485 (0:1485) ld l, a ld a, [wLoadedCard2HP] ld [hl], a ; set card's HP - ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + ld a, DUELVARS_ARENA_CARD_FLAGS add e ld l, a ld [hl], $0 @@ -4057,7 +4057,7 @@ SwapPlayAreaPokemon: ; 1548 (0:1548) call .swap_duelvar ld a, DUELVARS_ARENA_CARD_HP call .swap_duelvar - ld a, DUELVARS_ARENA_CARD_FLAGS_C2 + ld a, DUELVARS_ARENA_CARD_FLAGS call .swap_duelvar ld a, DUELVARS_ARENA_CARD_STAGE call .swap_duelvar diff --git a/src/wram.asm b/src/wram.asm index 4e65d0b5..8d6f860e 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -73,7 +73,10 @@ wPlayerArenaCard:: ; c2bb wPlayerBench:: ; c2bc ds MAX_BENCH_POKEMON + 1 - ds $6 +wPlayerArenaCardFlags:: ; c2c2 + ds $1 + + ds $5 wPlayerArenaCardHP:: ; c2c8 ds $1 @@ -235,7 +238,10 @@ wOpponentArenaCard:: ; c3bb wOpponentBench:: ; c3bc ds MAX_BENCH_POKEMON + 1 - ds $6 +wOpponentArenaCardFlags:: ; c3c2 + ds $1 + + ds $5 wOpponentArenaCardHP:: ; c3c8 ds $1 From 6943eea3d770b935020086008054c8a9bd2c28af Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 20 Dec 2020 14:28:15 +0000 Subject: [PATCH 42/45] Typos and other effect function fixeS --- src/constants/deck_ai_constants.asm | 10 ++--- src/engine/effect_functions.asm | 70 ++++++++++++++--------------- src/engine/home.asm | 2 +- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/constants/deck_ai_constants.asm b/src/constants/deck_ai_constants.asm index 52b0283e..4533c998 100644 --- a/src/constants/deck_ai_constants.asm +++ b/src/constants/deck_ai_constants.asm @@ -55,11 +55,11 @@ AI_ENERGY_TRANS_TO_BENCH EQU $e ; moves energy cards away from Arena card ; used to know which AI routine to call in ; the AIAction pointer tables in AIDoAction const_def 1 - const AIACTION_DO_TURN ; $1 - const AIACTION_START_DUEL ; $2 - const AIACTION_FORCED_SWITCH ; $3 - const AIACTION_KO_SWITCH ; $4 - const AIACTION_TAKE_PRIZE ; $5 + const AIACTION_DO_TURN ; $1 + const AIACTION_START_DUEL ; $2 + const AIACTION_FORCED_SWITCH ; $3 + const AIACTION_KO_SWITCH ; $4 + const AIACTION_TAKE_PRIZE ; $5 ; this bit is set when the AI decides to use Peek on their Prize cards, ; with the following bits deciding which one to Peek. That is: diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 5886f83b..f9a352ad 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -146,8 +146,8 @@ Func_2c0bd: ; 2c0bd (b:40bd) call ShuffleDeck ret -; return carry if Turn Duelist is the Player -CheckIfTurnDuelistIsPlayer: ; 2c0c7 (b:40c7) +; return carry if Player is the Turn Duelist +IsPlayerTurn: ; 2c0c7 (b:40c7) ld a, DUELVARS_DUELIST_TYPE call GetTurnDuelistVariable cp DUELIST_TYPE_PLAYER @@ -300,8 +300,8 @@ SetMinMaxDamageSameAsDamage: ; 2c174 (b:4174) ret ; 0x2c17e -; returns in a a random Play Area location -; of card in Turn Duelist's Play Area. +; returns in a some random occupied Play Area location +; in Turn Duelist's Play Area. PickRandomPlayAreaCard: ; 2c17e (b:417e) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable @@ -333,8 +333,8 @@ CreateListOfFireEnergyAttachedToArena: ; 2c197 (b:4197) ; fallthrough ; creates in wDuelTempList a list of cards that -; are in the Arena that are the same type as input a. -; used to list are Energy cards of a specific type +; are in the Arena of the same type as input a. +; this is called to list Energy cards of a specific type ; that are attached to the Arena Pokemon. ; input: ; a = TYPE_ENERGY_* constant @@ -478,7 +478,7 @@ ApplyAndAnimateHPRecovery: ; 2c221 (b:4221) ld bc, $01 ; arrow bank1call PlayMoveAnimation -; compare HP to be restores with max HP +; compare HP to be restored with max HP ; if HP to be restored would cause HP to ; be larger than max HP, cap it accordingly ld e, PLAY_AREA_ARENA @@ -526,7 +526,7 @@ CheckIfPlayAreaHasAnyDamage: ; 2c25b (b:425b) ; makes a list in wDuelTempList with the deck indices ; of Trainer cards found in Turn Duelist's Discard Pile. -; returns carry set if no Trainer cars found, and loads +; returns carry set if no Trainer cards found, and loads ; corresponding text to notify this. CreateTrainerCardListFromDiscardPile: ; 2c26e (b:426e) ; get number of cards in Discard Pile @@ -705,7 +705,7 @@ LookForCardsInDeck: ; 2c2ec (b:42ec) ; 0x2c317 .search_table - dw .SearchDeckForE + dw .SearchDeckForCardID dw .SearchDeckForNidoran dw .SearchDeckForBasicFighting dw .SearchDeckForBasicEnergy @@ -718,7 +718,7 @@ LookForCardsInDeck: ; 2c2ec (b:42ec) ; returns carry if no card with ; same card ID as e is found in Deck -.SearchDeckForE ; 2c323 (b:4323) +.SearchDeckForCardID ; 2c323 (b:4323) ld hl, wDuelTempList .loop_deck_e ld a, [hli] @@ -1797,7 +1797,7 @@ Sprout_PutInPlayAreaEffect: ; 2c8cc (b:48cc) call SearchCardInDeckAndAddToHand call AddCardToHand call PutHandPokemonCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shuffle ; display card on screen ldh a, [hTemp_ffa0] @@ -2078,7 +2078,7 @@ NidoranFCallForFamily_PutInPlayAreaEffect: ; 2ca6e (b:4a6e) call SearchCardInDeckAndAddToHand call AddCardToHand call PutHandPokemonCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shuffle ; display card on screen ldh a, [hTemp_ffa0] @@ -2506,7 +2506,7 @@ BellsproutCallForFamily_PutInPlayAreaEffect: ; 2ccc2 (b:4cc2) call SearchCardInDeckAndAddToHand call AddCardToHand call PutHandPokemonCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shuffle ldh a, [hTemp_ffa0] ldtx hl, PlacedOnTheBenchText @@ -3061,7 +3061,7 @@ KrabbyCallForFamily_PutInPlayAreaEffect: ; 2cfca (b:4fca) call SearchCardInDeckAndAddToHand call AddCardToHand call PutHandPokemonCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shuffle ldh a, [hTemp_ffa0] ldtx hl, PlacedOnTheBenchText @@ -3367,7 +3367,7 @@ ApplyAmnesiaToAttack: ; 2d18a (b:518a) ld l, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT ld [hl], LAST_TURN_EFFECT_AMNESIA - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ; return if Player ; the rest of the routine if for Opponent @@ -4914,7 +4914,7 @@ EnergyConversion_AddToHandEffect: ; 2d9b4 (b:59b4) jr .loop_cards .done - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c bank1call Func_4b38 ret @@ -5036,7 +5036,7 @@ Prophecy_ReorderDeckEffect: ; 2da41 (b:5a41) call ReturnCardToDeck dec c jr nz, .loop_return_deck - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ; print text in case it was the opponent ldtx hl, ExchangedCardsInDuelistsHandText @@ -6000,7 +6000,7 @@ Scavenge_AddToHandEffect: ; 2df5f (b:5f5f) ldh a, [hTempPlayAreaLocation_ffa1] call MoveDiscardPileCardToHand call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ldh a, [hTempPlayAreaLocation_ffa1] ldtx hl, WasPlacedInTheHandText @@ -6409,7 +6409,7 @@ MarowakCallForFamily_PutInPlayAreaEffect: ; 2e194 (b:6194) call SearchCardInDeckAndAddToHand call AddCardToHand call PutHandPokemonCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shuffle ; display card on screen ldh a, [hTemp_ffa0] @@ -7765,7 +7765,7 @@ EnergySpike_AttachEnergyEffect: ; 2e8f6 (b:68f6) ld e, a ldh a, [hTemp_ffa0] call PutHandCardInPlayArea - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .done ; not Player, so show detail screen @@ -9499,7 +9499,7 @@ EnergyRemoval_DiscardEffect: ; 2f273 (b:7273) ldh a, [hTempPlayAreaLocation_ffa1] call PutCardInDiscardPile call SwapTurn - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ; show Player which Pokemon was affected @@ -9589,7 +9589,7 @@ EnergyRetrieval_DiscardAndAddToHandEffect: ; 2f2f8 (b:72f8) call AddCardToHand jr .loop .done - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c bank1call Func_4b38 ret @@ -9656,7 +9656,7 @@ EnergySearch_AddToHandEffect: ; 2f372 (b:7372) ; add to hand call SearchCardInDeckAndAddToHand call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .done ; done if Player played card ; display card in screen ldh a, [hTemp_ffa0] @@ -9833,7 +9833,7 @@ ItemFinder_DiscardAddToHandEffect: ; 2f463 (b:7463) ld a, [hl] call MoveDiscardPileCardToHand call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ; display card in screen ldh a, [hTempList + 2] @@ -9864,7 +9864,7 @@ Defender_AttachDefenderEffect: ; 2f499 (b:7499) add DUELVARS_ARENA_CARD_ATTACHED_DEFENDER call GetTurnDuelistVariable inc [hl] - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ldh a, [hTemp_ffa0] @@ -10069,7 +10069,7 @@ MrFuji_ReturnToDeckEffect: ; 2f58f (b:758f) ; if Trainer card wasn't played by the Player, ; print the selected Pokemon's name and show card on screen. - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .done ldh a, [hTempCardIndex_ff98] call LoadCardDataToBuffer1_FromDeckIndex @@ -10231,7 +10231,7 @@ PokemonFlute_PlaceInPlayAreaText: ; 2f68f (b:768f) ; unless it was the Player who played the card, ; display the Pokemon card on screen. - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c call SwapTurn ldh a, [hTemp_ffa0] @@ -10498,7 +10498,7 @@ ScoopUp_ReturnToHandEffect: ; 2f7c3 (b:77c3) ; if card was not played by Player, show detail screen ; and print corresponding text. - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .shift_or_switch ldtx hl, PokemonWasReturnedFromArenaToHandText ldh a, [hTemp_ffa0] @@ -10606,7 +10606,7 @@ PokemonTrader_TradeCardsEffect: ; 2f88d (b:788d) call AddCardToHand ; display cards if the Pokemon Trader wasn't played by Player - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .done ldh a, [hTemp_ffa0] ldtx hl, PokemonWasReturnedToDeckText @@ -10848,7 +10848,7 @@ BillEffect: ; 2f9c4 (b:79c4) jr c, .done ldh [hTempCardIndex_ff98], a call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr nc, .skip_display_screen push bc bank1call DisplayPlayerDrawCardScreen @@ -10982,7 +10982,7 @@ Maintenance_ReturnToDeckAndDrawEffect: ; 2fa85 (b:7a85) call DrawCardFromDeck ldh [hTempCardIndex_ff98], a call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret nc ; show card on screen if played by Player bank1call DisplayPlayerDrawCardScreen @@ -11068,7 +11068,7 @@ PokeBall_AddToHandEffect: ; 2fb15 (b:7b15) ; it wasn't the Player who played the Trainer card. call SearchCardInDeckAndAddToHand call AddCardToHand - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn jr c, .done ldh a, [hTempList + 1] ldtx hl, WasPlacedInTheHandText @@ -11122,7 +11122,7 @@ Recycle_AddToHandEffect: ; 2fb68 (b:7b68) ; it wasn't the Player who played the Trainer card. call MoveDiscardPileCardToHand call ReturnCardToDeck - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ldh a, [hTempList] ldtx hl, CardWasChosenText @@ -11179,7 +11179,7 @@ Revive_PlaceInPlayAreaEffect: ; 2fbb0 (b:7bb0) add 5 ; round up HP to nearest 10 .rounded ld [hl], a - call CheckIfTurnDuelistIsPlayer + call IsPlayerTurn ret c ; done if Player played Revive ; display card @@ -11236,7 +11236,7 @@ CreateBasicPokemonCardListFromDiscardPile: ; 2fbd6 (b:7bd6) ret ; 0x2fc0b -; return carry if Turn Duelist has not Evolution cards in Play Area +; return carry if Turn Duelist has no Evolution cards in Play Area DevolutionSpray_PlayAreaEvolutionCheck: ; 2fc0b (b:7c0b) ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable diff --git a/src/engine/home.asm b/src/engine/home.asm index 65d6b2d6..adf70d8c 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -5189,7 +5189,7 @@ MoveCardToDiscardPileIfInArena: ; 1c13 (0:1c13) jr c, .next_card ret -; calculate damage an max HP of card at PLAY_AREA_* in e. +; calculate damage and max HP of card at PLAY_AREA_* in e. ; input: ; e = PLAY_AREA_* of card; ; output: From 180af7b96f32afa74d6fc77e0132de8655fee318 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Sun, 20 Dec 2020 15:21:24 +0000 Subject: [PATCH 43/45] Change color to type --- src/constants/duel_constants.asm | 12 ++++++------ src/engine/effect_functions.asm | 6 +++--- src/engine/home.asm | 14 +++++++------- src/wram.asm | 24 ++++++++++++------------ 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 769e16b1..4d2daf2f 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -45,12 +45,12 @@ DUELVARS_BENCH2_CARD_STAGE EQUS "LOW(wPlayerBench2CardStage)" DUELVARS_BENCH3_CARD_STAGE EQUS "LOW(wPlayerBench3CardStage)" ; d1 DUELVARS_BENCH4_CARD_STAGE EQUS "LOW(wPlayerBench4CardStage)" ; d2 DUELVARS_BENCH5_CARD_STAGE EQUS "LOW(wPlayerBench5CardStage)" ; d3 -DUELVARS_ARENA_CARD_CHANGED_COLOR EQUS "LOW(wPlayerArenaCardChangedColor)" ; d4 -DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedColor)" ; d5 -DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedColor)" ; d6 -DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedColor)" ; d7 -DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedColor)" ; d8 -DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedColor)" ; d9 +DUELVARS_ARENA_CARD_CHANGED_TYPE EQUS "LOW(wPlayerArenaCardChangedType)" ; d4 +DUELVARS_BENCH1_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench1CardChangedType)" ; d5 +DUELVARS_BENCH2_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench2CardChangedType)" ; d6 +DUELVARS_BENCH3_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench3CardChangedType)" ; d7 +DUELVARS_BENCH4_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench4CardChangedType)" ; d8 +DUELVARS_BENCH5_CARD_CHANGED_COLOR EQUS "LOW(wPlayerBench5CardChangedType)" ; d9 DUELVARS_ARENA_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerArenaCardAttachedDefender)" ; da DUELVARS_BENCH1_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench1CardAttachedDefender)" ; db DUELVARS_BENCH2_CARD_ATTACHED_DEFENDER EQUS "LOW(wPlayerBench2CardAttachedDefender)" ; dc diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index f9a352ad..cf187cb4 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -970,7 +970,7 @@ ResetDevolvedCardStatus: ; 2c45d (b:445d) .skip_clear_status ; reset changed color status ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_CHANGED_COLOR + add DUELVARS_ARENA_CARD_CHANGED_TYPE call GetTurnDuelistVariable ld [hl], $00 ; reset C2 flags @@ -2612,7 +2612,7 @@ Shift_ChangeColorEffect: ; 2cd5d (b:4d5d) set USED_PKMN_POWER_THIS_TURN_F, [hl] ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_CHANGED_COLOR + add DUELVARS_ARENA_CARD_CHANGED_TYPE ld l, a ldh a, [hAIPkmnPowerEffectParam] or HAS_CHANGED_COLOR @@ -9094,7 +9094,7 @@ MorphEffect: ; 2eff6 (b:6ff6) ld [hl], c ; clear changed color and status - ld l, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld l, DUELVARS_ARENA_CARD_CHANGED_TYPE ld [hl], $00 call ClearAllStatusConditions diff --git a/src/engine/home.asm b/src/engine/home.asm index adf70d8c..c3c1024c 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -3748,7 +3748,7 @@ EvolvePokemonCard: ; 13ac (0:13ac) ld l, a ld [hl], $00 ld a, e - add DUELVARS_ARENA_CARD_CHANGED_COLOR + add DUELVARS_ARENA_CARD_CHANGED_TYPE ld l, a ld [hl], $00 ld a, e @@ -3914,7 +3914,7 @@ PutHandPokemonCardInPlayArea: ; 1485 (0:1485) add e ld l, a ld [hl], $0 - ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE add e ld l, a ld [hl], $0 @@ -3994,7 +3994,7 @@ EmptyPlayAreaSlot: ; 14f8 (0:14f8) call .init_duelvar ld a, DUELVARS_ARENA_CARD_STAGE call .init_duelvar - ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE call .init_duelvar ld a, DUELVARS_ARENA_CARD_ATTACHED_DEFENDER call .init_duelvar @@ -4061,7 +4061,7 @@ SwapPlayAreaPokemon: ; 1548 (0:1548) call .swap_duelvar ld a, DUELVARS_ARENA_CARD_STAGE call .swap_duelvar - ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE call .swap_duelvar ld a, DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER call .swap_duelvar @@ -10295,7 +10295,7 @@ ClearChangedTypesIfMuk: ; 36d9 (0:36d9) call .zero_changed_types call SwapTurn .zero_changed_types - ld a, DUELVARS_ARENA_CARD_CHANGED_COLOR + ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE call GetTurnDuelistVariable ld c, MAX_PLAY_AREA_POKEMON .zero_changed_types_loop @@ -10316,7 +10316,7 @@ GetPlayAreaCardColor: ; 36f7 (0:36f7) push hl push de ld e, a - add DUELVARS_ARENA_CARD_CHANGED_COLOR + add DUELVARS_ARENA_CARD_CHANGED_TYPE call GetTurnDuelistVariable bit HAS_CHANGED_COLOR_F, a jr nz, .has_changed_color @@ -10338,7 +10338,7 @@ GetPlayAreaCardColor: ; 36f7 (0:36f7) call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 jr c, .regular_color ; jump if can't use Shift ld a, e - add DUELVARS_ARENA_CARD_CHANGED_COLOR + add DUELVARS_ARENA_CARD_CHANGED_TYPE call GetTurnDuelistVariable pop de pop hl diff --git a/src/wram.asm b/src/wram.asm index 8d6f860e..bfa032ee 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -106,17 +106,17 @@ wPlayerBench5CardStage:: ; c2d3 ; changed type from Venomoth's Shift Pokemon Power ; if bit 7 == 1, then bits 0-3 override the Pokemon's actual color -wPlayerArenaCardChangedColor:: ; c2d4 +wPlayerArenaCardChangedType:: ; c2d4 ds $1 -wPlayerBench1CardChangedColor:: ; c2d5 +wPlayerBench1CardChangedType:: ; c2d5 ds $1 -wPlayerBench2CardChangedColor:: ; c2d6 +wPlayerBench2CardChangedType:: ; c2d6 ds $1 -wPlayerBench3CardChangedColor:: ; c2d7 +wPlayerBench3CardChangedType:: ; c2d7 ds $1 -wPlayerBench4CardChangedColor:: ; c2d8 +wPlayerBench4CardChangedType:: ; c2d8 ds $1 -wPlayerBench5CardChangedColor:: ; c2d9 +wPlayerBench5CardChangedType:: ; c2d9 ds $1 wPlayerArenaCardAttachedDefender:: ; c2da @@ -269,17 +269,17 @@ wOpponentBench4CardStage:: ; c3d2 wOpponentBench5CardStage:: ; c3d3 ds $1 -wOpponentArenaCardChangedColor:: ; c3d4 +wOpponentArenaCardChangedType:: ; c3d4 ds $1 -wOpponentBench1CardChangedColor:: ; c3d5 +wOpponentBench1CardChangedType:: ; c3d5 ds $1 -wOpponentBench2CardChangedColor:: ; c3d6 +wOpponentBench2CardChangedType:: ; c3d6 ds $1 -wOpponentBench3CardChangedColor:: ; c3d7 +wOpponentBench3CardChangedType:: ; c3d7 ds $1 -wOpponentBench4CardChangedColor:: ; c3d8 +wOpponentBench4CardChangedType:: ; c3d8 ds $1 -wOpponentBench5CardChangedColor:: ; c3d9 +wOpponentBench5CardChangedType:: ; c3d9 ds $1 wOpponentArenaCardAttachedDefender:: ; c3da From f7346b9491715307b31ff3d8003e16a976e60961 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Sun, 20 Dec 2020 13:22:52 -0600 Subject: [PATCH 44/45] No more '+ -x' it was only needed because of a very old rgbds bug --- src/constants/card_constants.asm | 2 +- src/constants/card_data_constants.asm | 2 +- src/constants/charmaps.asm | 2 +- src/constants/deck_constants.asm | 6 +++--- src/macros/data.asm | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/constants/card_constants.asm b/src/constants/card_constants.asm index df6da6b8..a079f728 100644 --- a/src/constants/card_constants.asm +++ b/src/constants/card_constants.asm @@ -227,4 +227,4 @@ const POKEMON_FLUTE ; $e2 const GAMBLER ; $e3 const RECYCLE ; $e4 -NUM_CARDS EQU const_value + -1 +NUM_CARDS EQU const_value - 1 diff --git a/src/constants/card_data_constants.asm b/src/constants/card_data_constants.asm index 0731218a..cfb855b0 100644 --- a/src/constants/card_data_constants.asm +++ b/src/constants/card_data_constants.asm @@ -116,7 +116,7 @@ TYPE_ENERGY EQU const_value const TYPE_ENERGY_UNUSED ; $0f const TYPE_TRAINER ; $10 const TYPE_TRAINER_UNUSED ; $11 -NUM_CARD_TYPES EQU const_value + -1 +NUM_CARD_TYPES EQU const_value - 1 TYPE_PKMN EQU %111 TYPE_ENERGY_F EQU 3 diff --git a/src/constants/charmaps.asm b/src/constants/charmaps.asm index 4803d29c..44b8e0b4 100644 --- a/src/constants/charmaps.asm +++ b/src/constants/charmaps.asm @@ -317,7 +317,7 @@ FW_SPACE EQU $70 txsymbol: MACRO const SYM_\1 - charmap "\1>", const_value + -1 + charmap "\1>", const_value - 1 ENDM ; TX_SYMBOL diff --git a/src/constants/deck_constants.asm b/src/constants/deck_constants.asm index 8c8e8c99..02c8ac99 100644 --- a/src/constants/deck_constants.asm +++ b/src/constants/deck_constants.asm @@ -1,6 +1,6 @@ deck_const: MACRO if const_value >= 2 -\1_ID EQU const_value + -2 +\1_ID EQU const_value - 2 endc const \1 ENDM @@ -65,6 +65,6 @@ ENDM deck_const FLAMETHROWER_DECK ; $34 deck_const RESHUFFLE_DECK ; $35 deck_const IMAKUNI_DECK ; $36 -DECKS_END EQU const_value + -1 -DECK_IDS_END EQU DECKS_END -2 +DECKS_END EQU const_value - 1 +DECK_IDS_END EQU DECKS_END - 2 diff --git a/src/macros/data.asm b/src/macros/data.asm index d08ec4e6..23de2084 100644 --- a/src/macros/data.asm +++ b/src/macros/data.asm @@ -20,7 +20,7 @@ dx: MACRO x = 8 * ((\1) - 1) rept \1 db ((\2) >> x) & $ff -x = x + -8 +x = x - 8 endr ENDM From 9fab715759ddf919b0c4bb9a01095c4c225fcac0 Mon Sep 17 00:00:00 2001 From: dannye <33dannye@gmail.com> Date: Sun, 20 Dec 2020 14:11:21 -0600 Subject: [PATCH 45/45] Fix typos --- src/constants/animation_constants.asm | 2 +- src/constants/hardware_constants.asm | 2 +- src/data/booster_packs.asm | 2 +- src/data/effect_commands.asm | 8 ++-- src/data/move_animations.asm | 2 +- src/engine/bank01.asm | 30 ++++++------- src/engine/bank04.asm | 14 +++---- src/engine/bank05.asm | 14 +++---- src/engine/bank06.asm | 2 +- src/engine/bank08.asm | 26 ++++++------ src/engine/booster_packs.asm | 2 +- .../deck_ai/decks/legendary_articuno.asm | 2 +- .../deck_ai/decks/legendary_dragonite.asm | 2 +- src/engine/deck_ai/decks/sams_practice.asm | 4 +- src/engine/effect_functions.asm | 18 ++++---- src/engine/home.asm | 42 +++++++++---------- src/text/text1.asm | 2 +- src/text/text_offsets.asm | 2 +- src/wram.asm | 8 ++-- 19 files changed, 92 insertions(+), 92 deletions(-) diff --git a/src/constants/animation_constants.asm b/src/constants/animation_constants.asm index bdf93f8a..645cb5ef 100644 --- a/src/constants/animation_constants.asm +++ b/src/constants/animation_constants.asm @@ -2,7 +2,7 @@ ANIM_SPELL_MOVE EQU $01 ANIM_GET_HIT EQU $07 ANIM_THUNDER_SHOCK EQU $0a -ANIM_FURY_SWEEPES EQU $24 +ANIM_FURY_SWIPES EQU $24 ; Special animations ANIM_SHOW_DAMAGE EQU $09 diff --git a/src/constants/hardware_constants.asm b/src/constants/hardware_constants.asm index 3b36a9d2..6879ffd8 100644 --- a/src/constants/hardware_constants.asm +++ b/src/constants/hardware_constants.asm @@ -101,7 +101,7 @@ rNR34 EQU $ff1e ; Channel 3 Frequency's higher data (R/W) rNR41 EQU $ff20 ; Channel 4 Sound Length (R/W) rNR42 EQU $ff21 ; Channel 4 Volume Envelope (R/W) rNR43 EQU $ff22 ; Channel 4 Polynomial Counter (R/W) -rNR44 EQU $ff23 ; Channel 4 Counter/consecutive; Inital (R/W) +rNR44 EQU $ff23 ; Channel 4 Counter/consecutive; Initial (R/W) rNR50 EQU $ff24 ; Channel control / ON-OFF / Volume (R/W) rNR51 EQU $ff25 ; Selection of Sound output terminal (R/W) diff --git a/src/data/booster_packs.asm b/src/data/booster_packs.asm index 8524ca67..44a401ff 100644 --- a/src/data/booster_packs.asm +++ b/src/data/booster_packs.asm @@ -12,7 +12,7 @@ booster_set: MACRO ENDM ; For the energy or energy generation function, there are three options: -; - Ponter to a function that generates energies (some generate one, some generate a full pack) +; - Pointer to a function that generates energies (some generate one, some generate a full pack) ; - A single energy of a specific type ; - $0000 if no card in the pack is an energy diff --git a/src/data/effect_commands.asm b/src/data/effect_commands.asm index 5d38cb45..f90fe805 100644 --- a/src/data/effect_commands.asm +++ b/src/data/effect_commands.asm @@ -11,7 +11,7 @@ EffectCommands: ; 186f7 (6:46f7) ; - EFFECTCMDTYPE_INITIAL_EFFECT_1: Executed right after move or trainer card is used. Bypasses Smokescreen and Sand Attack effects. ; - EFFECTCMDTYPE_INITIAL_EFFECT_2: Executed right after move, Pokemon Power, or trainer card is used. ; - EFFECTCMDTYPE_DISCARD_ENERGY: For moves or trainer cards that require putting one or more attached energy cards into the discard pile. -; - EFFECTCMDTYPE_REQUIRE_SELECTION: For moves, Pokemon Powers, or trainer cards requring the user to select a card (from e.g. play area screen or card list). +; - EFFECTCMDTYPE_REQUIRE_SELECTION: For moves, Pokemon Powers, or trainer cards requiring the user to select a card (from e.g. play area screen or card list). ; - EFFECTCMDTYPE_BEFORE_DAMAGE: Effect command of a move executed prior to the damage step. For trainer card or Pokemon Power, usually the main effect. ; - EFFECTCMDTYPE_AFTER_DAMAGE: Effect command executed after the damage step. ; - EFFECTCMDTYPE_AI_SWITCH_DEFENDING_PKMN: For moves that may result in the defending Pokemon being switched out. Called only for AI-executed moves. @@ -1215,7 +1215,7 @@ KangaskhanFetchEffectCommands: db $00 KangaskhanCometPunchEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, CometPunch_MultiplerEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, CometPunch_MultiplierEffect dbw EFFECTCMDTYPE_AI, CometPunch_AIEffect db $00 @@ -1230,7 +1230,7 @@ TaurosRampageEffectCommands: db $00 DoduoFuryAttackEffectCommands: - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FuryAttack_MultiplerEffect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, FuryAttack_MultiplierEffect dbw EFFECTCMDTYPE_AI, FuryAttack_AIEffect db $00 @@ -1500,7 +1500,7 @@ ImposterProfessorOakEffectCommands: ComputerSearchEffectCommands: dbw EFFECTCMDTYPE_INITIAL_EFFECT_1, ComputerSearch_HandDeckCheck dbw EFFECTCMDTYPE_INITIAL_EFFECT_2, ComputerSearch_PlayerDiscardHandSelection - dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ComputerSearch_DiscardAddToHandEfect + dbw EFFECTCMDTYPE_BEFORE_DAMAGE, ComputerSearch_DiscardAddToHandEffect dbw EFFECTCMDTYPE_REQUIRE_SELECTION, ComputerSearch_PlayerDeckSelection db $00 diff --git a/src/data/move_animations.asm b/src/data/move_animations.asm index 9ead157b..222a6d76 100644 --- a/src/data/move_animations.asm +++ b/src/data/move_animations.asm @@ -391,7 +391,7 @@ MoveAnimation_53eb: MoveAnimation_53f6: anim_player ANIM_SPELL_MOVE - anim_opponent ANIM_FURY_SWEEPES + anim_opponent ANIM_FURY_SWIPES anim_opponent ANIM_GET_HIT anim_normal ANIM_SHAKE1 anim_opponent ANIM_SHOW_DAMAGE diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 556f2cd7..a7184a6d 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -187,7 +187,7 @@ MainDuelLoop: ; 40ee (1:40ee) cp TURN_PLAYER_WON jr z, .active_duelist_won_battle cp TURN_PLAYER_LOST - jr z, .active_duelist_lost_batte + jr z, .active_duelist_lost_battle ld a, $5f ld c, MUSIC_DARK_DIDDLY ldtx hl, DuelWasADrawText @@ -205,7 +205,7 @@ MainDuelLoop: ; 40ee (1:40ee) ldtx hl, WonDuelText jr .handle_duel_finished -.active_duelist_lost_batte +.active_duelist_lost_battle ldh a, [hWhoseTurn] cp PLAYER_TURN jr nz, .player_won_battle @@ -779,7 +779,7 @@ PlayPokemonCard: ; 44db (1:44db) ldh a, [hTempPlayAreaLocation_ff9d] ldh [hTempPlayAreaLocation_ffa1], a call EvolvePokemonCardIfPossible - jr c, .try_evolve_loop ; jump if evolution wasn't successsful somehow + jr c, .try_evolve_loop ; jump if evolution wasn't successful somehow ld a, OPPACTION_EVOLVE_PKMN call SetOppAction_SerialSendDuelData call PrintPlayAreaCardList_EnableLCD @@ -1554,7 +1554,7 @@ PrintDeckAndHandIconsAndNumberOfCards: ; 49ca (1:49ca) ; prints, for each duelist, the number of cards in the hand, and the number ; of cards in the deck, according to their placement in the draw card(s) screen. ; input: wNumCardsBeingDrawn = number of cards being drawn (in order to add -; them to the hand cards and substract them from the deck cards). +; them to the hand cards and subtract them from the deck cards). PrintNumberOfHandAndDeckCards: ; 49ed (1:49ed) ldh a, [hWhoseTurn] cp PLAYER_TURN @@ -1948,7 +1948,7 @@ ChooseInitialArenaAndBenchPokemon: ; 4cd5 (1:4cd5) ; link opponent's turn .exchange_duelvars - ldtx hl, TransmitingDataText + ldtx hl, TransmittingDataText call DrawWideTextBox_PrintText call ExchangeRNG ld hl, wPlayerDuelVariables @@ -2580,7 +2580,7 @@ DrawDuelHUD: ; 5093 (1:5093) .done ret -; draws an horizonal line that separates the arena side of each duelist +; draws an horizontal line that separates the arena side of each duelist ; also colorizes the line on CGB DrawDuelHorizontalSeparator: ; 516f (1:516f) ld hl, DuelHorizontalSeparatorTileData @@ -3211,7 +3211,7 @@ Func_5591: ; 5591 (1:5591) ; Discard Pile card list, including a bottom-right image of the current card. ; since this loads the text for the Hand card list screen, SetDiscardPileScreenTexts ; is called after this if the screen corresponds to a Discard Pile list. -; the dimensions of text box where the card list is printed are 20x13, in order to accomodate +; the dimensions of text box where the card list is printed are 20x13, in order to accommodate ; another text box below it (wCardListInfoBoxText) as well as the image of the selected card. InitAndDrawCardListScreenLayout: ; 559a (1:559a) xor a @@ -3446,7 +3446,7 @@ CardListItemSelectionMenu: ; 56c2 (1:56c2) ret ItemSelectionMenuParameters: ; 5708 (1:5708) - db 1, 14 ; corsor x, cursor y + db 1, 14 ; cursor x, cursor y db 2 ; y displacement between items db 2 ; number of items db SYM_CURSOR_R ; cursor tile number @@ -3792,7 +3792,7 @@ GoToFirstOrNextCardPage: ; 58e2 (1:58e2) ; stay in this page if it exists, or skip to previous page if it doesn't or a ret nz - ; non-existant page: skip to next + ; non-existent page: skip to next jr .advance_page .set_card_page ld [wCardPageNumber], a @@ -3809,7 +3809,7 @@ GoToPreviousCardPage: ; 5911 (1:5911) ; stay in this page if it exists, or skip to previous page if it doesn't or a ret nz - ; non-existant page: skip to previous + ; non-existent page: skip to previous jr GoToPreviousCardPage .set_card_page ld [wCardPageNumber], a @@ -3828,7 +3828,7 @@ GoToPreviousCardPage: ; 5911 (1:5911) ; return with the equivalent to one of these three actions: ; stay in card page trying to switch to (nc, nz) ; change to card page returned in a if D_LEFT/D_RIGHT pressed, or exit if A_BUTTON/START pressed (c) - ; non-existant page, so skip to next/previous (nc, z) + ; non-existent page, so skip to next/previous (nc, z) SwitchCardPage: ; 5930 (1:5930) ld hl, CardPageSwitchPointerTable jp JumpToFunctionInTable @@ -5827,10 +5827,10 @@ TwoByteNumberToTxSymbol_TrimLeadingZeros_Bank1: ; 65d1 (1:65d1) .get_digit ld a, SYM_0 - 1 -.substract_loop +.subtract_loop inc a add hl, bc - jr c, .substract_loop + jr c, .subtract_loop ld [de], a inc de ld a, l @@ -6987,7 +6987,7 @@ Func_6d3f: ; 6d3f (1:6d3f) ld d, $00 ld a, DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable - call SubstractHP + call SubtractHP push hl ld a, $8c call Func_6cab @@ -8120,7 +8120,7 @@ PlayAttackAnimation_DealAttackDamageSimple: ; 7469 (1:7469) call WaitMoveAnimation pop de pop hl - call SubstractHP + call SubtractHP ld a, [wDuelDisplayedScreen] cp DUEL_MAIN_SCENE ret nz diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 7d84d19d..e3f65f09 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1087,7 +1087,7 @@ MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst: ;1224b db $05, $02 ; cursor starting x, y db $02 ; number of tiles the cursor moves per toggle db $03 ; cursor max index - db $0f ; curor image + db $0f ; cursor image db $00, $00, $00 ; marker bytes -- end of config table @@ -1104,7 +1104,7 @@ MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck: ;12264 db $05, $02 ; cursor starting x, y db $02 ; number of tiles the cursor moves per toggle db $03 ; cursor max index - db $0f ; curor image + db $0f ; cursor image db $00, $00, $00 ; marker bytes -- end of config table @@ -1117,7 +1117,7 @@ SamNormalMultichoice_ConfigurationTable: ;1227d db $0b, $02 ; cursor starting x, y db $02 ; number of tiles the cursor moves per toggle db $04 ; cursor max index - db $0f ; curor image + db $0f ; cursor image db $00, $00, $00 ; marker bytes -- end of config table @@ -1130,7 +1130,7 @@ SamTutorialMultichoice_ConfigurationTable: ;1228e db $07, $02 ; cursor starting x, y db $02 ; number of tiles the cursor moves per toggle db $08 ; cursor max index - db $0f ; curor image + db $0f ; cursor image db $00, $00, $00 ; marker bytes -- end of config table @@ -1291,7 +1291,7 @@ Unknown_128fb: ; 128fb Func_1296e: ; 1296e (4:696e) INCROM $1296e, $1299f -; creates a new entry in SpriteAnimBuffer, Alse loads the sprite if need be +; creates a new entry in SpriteAnimBuffer, else loads the sprite if need be CreateSpriteAndAnimBufferEntry: ; 1299f (4:699f) push af ld a, [wd5d7] @@ -1550,7 +1550,7 @@ HandleAnimationFrame: ; 12b13 (4:6b13) call GetAnimFramePointerFromOffset inc de ld a, [de] - call SetAimationCounterAndLoop + call SetAnimationCounterAndLoop jr c, .tryHandlingFrame inc de ld bc, SPRITE_ANIM_COORD_X @@ -1608,7 +1608,7 @@ GetAnimFramePointerFromOffset: ; 12b6a (4:6b6a) ; Sets the animation counter for the current sprite. If the value is zero, loop the animation ; a - new animation counter -SetAimationCounterAndLoop: ; 12b89 (4:6b89) +SetAnimationCounterAndLoop: ; 12b89 (4:6b89) push hl push bc ld bc, SPRITE_ANIM_COUNTER diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm index 79c168ff..2b59c962 100644 --- a/src/engine/bank05.asm +++ b/src/engine/bank05.asm @@ -1223,7 +1223,7 @@ LookForCardIDInHandList_Bank5: ; 155d2 (5:55d2) ; input: ; a = card ID ; b = PLAY_AREA_* to start with -; ouput: +; output: ; a = PLAY_AREA_* of found card ; carry set if found LookForCardIDInPlayArea_Bank5: ; 155ef (5:55ef) @@ -3972,7 +3972,7 @@ AIProcessButDontPlayEnergy_SkipEvolutionAndArena: ; 164ba (5:64ba) jr AIProcessEnergyCards ; copies wTempPlayAreaAIScore to wPlayAreaAIScore -; and loads wAIscore with value in wTempAIScore. +; and loads wAIScore with value in wTempAIScore. ; identical to RetrievePlayAreaAIScoreFromBackup2. RetrievePlayAreaAIScoreFromBackup1: ; 164d3 (5:64d3) push af @@ -4611,7 +4611,7 @@ CheckIfEvolutionNeedsEnergyForMove: ; 16805 (5:6805) ; returns in e the card ID of the energy required for ; the Discard/Energy Boost attack loaded in wSelectedAttack. ; if it's Zapdos2's Thunderbolt attack, return no carry. -; if it's Charizard's Fire Spin or Exeggutor's Big Eggplosion +; if it's Charizard's Fire Spin or Exeggutor's Big Eggsplosion ; attack, don't return energy card ID, but set carry. ; output: ; b = 1 if needs color energy, 0 otherwise; @@ -4879,7 +4879,7 @@ CheckSpecificDecksToAttachDoubleColorless: ; 1696e (5:696e) push de push hl -; check if AI is playing any of the aplicable decks. +; check if AI is playing any of the applicable decks. ld a, [wOpponentDeckID] cp LEGENDARY_DRAGONITE_DECK_ID jr z, .legendary_dragonite_deck @@ -4974,7 +4974,7 @@ AIProcessButDontUseAttack: ; 169ca (5:69ca) jr AIProcessAttacks ; copies wTempPlayAreaAIScore to wPlayAreaAIScore -; and loads wAIscore with value in wTempAIScore. +; and loads wAIScore with value in wTempAIScore. ; identical to RetrievePlayAreaAIScoreFromBackup1. RetrievePlayAreaAIScoreFromBackup2: ; 169e3 (5:69e3) push af @@ -6630,7 +6630,7 @@ CheckCardEvolutionInHandOrDeck: ; 17274 (5:7274) scf ret -; sets up the inital hand of boss deck. +; sets up the initial hand of boss deck. ; always draws at least 2 Basic Pokemon cards and 2 Energy cards. ; also sets up so that the next cards to be drawn have ; some minimum number of Basic Pokemon and Energy cards. @@ -7221,7 +7221,7 @@ Func_174f2: ; 174f2 (5:74f2) jp .loop_play_area ; loads wcdea + play area location in e -; with nenergy * 2 + $80 - floor(dam / 10) +; with energy * 2 + $80 - floor(dam / 10) ; loads wcdfa + play area location in e ; with $01 Func_17583: ; 17583 (5:7583) diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 9c8d24ff..4dcad9d7 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -915,7 +915,7 @@ OpenGlossaryScreen: ; 184c8 (6:44c8) ; unit: 5 bytes. ; [structure] -; horizonal align (1) / title text id (2) / desc. text id (2) +; horizontal align (1) / title text id (2) / desc. text id (2) glossary_entry: MACRO db \1 tx \2 diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm index 5283497d..d674a9c4 100644 --- a/src/engine/bank08.asm +++ b/src/engine/bank08.asm @@ -974,7 +974,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5) ; return carry if move is useable but cannot KO. .check_can_ko ; 205d7 (8:45d7) farcall CheckIfSelectedMoveIsUnusable - jr c, .unuseable + jr c, .unusable ld a, [wSelectedAttack] farcall EstimateDamage_VersusDefendingCard ld a, DUELVARS_ARENA_CARD_HP @@ -987,7 +987,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5) ; can't KO. scf ret -.unuseable +.unusable or a ret @@ -995,12 +995,12 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5) ; move is useable and minimum damage > 0. .check_random ; 205f6 (8:45f6) farcall CheckIfSelectedMoveIsUnusable - jr c, .unuseable + jr c, .unusable ld a, [wSelectedAttack] farcall EstimateDamage_VersusDefendingCard ld a, [wAIMinDamage] cp 10 - jr c, .unuseable + jr c, .unusable ld a, 10 call Random cp 3 @@ -3559,7 +3559,7 @@ AIDecide_Pokedex: ; 212dc (8:52dc) jp PickPokedexCards ; bug, should be jp nz ; picks order of the cards in deck from the effects of Pokedex. -; prioritises Pokemon cards, then Trainer cards, then energy cards. +; prioritizes Pokemon cards, then Trainer cards, then energy cards. ; stores the resulting order in wce1a. PickPokedexCards_Unreferenced: ; 212ff (8:52ff) ; unreferenced @@ -3690,7 +3690,7 @@ PickPokedexCards_Unreferenced: ; 212ff (8:52ff) ret ; picks order of the cards in deck from the effects of Pokedex. -; prioritises energy cards, then Pokemon cards, then Trainer cards. +; prioritizes energy cards, then Pokemon cards, then Trainer cards. ; stores the resulting order in wce1a. PickPokedexCards: ; 2138e (8:538e) xor a @@ -4168,7 +4168,7 @@ AIDecide_ScoopUp: ; 21506 (8:5506) scf ret -; this deck will use Scoop Up on a benched Articuno2, Zapdos3 or Molres2. +; this deck will use Scoop Up on a benched Articuno2, Zapdos3 or Moltres2. ; interestingly, does not check for Muk in both Play Areas. .HandleLegendaryRonald ; 215e7 (8:55e7) ; if less than 3 Play Area Pokemon cards, skip. @@ -6042,7 +6042,7 @@ AIDecide_PokemonTrader_FlowerGarden: ; 220a8 (8:60a8) AIDecide_PokemonTrader_StrangePower: ; 22122 (8:6122) ; looks for a Pokemon in hand to trade with Mr Mime in deck. -; inputing Mr Mime in register e for the function is redundant +; inputting Mr Mime in register e for the function is redundant ; since it already checks whether a Mr Mime exists in the hand. ld a, MR_MIME ld e, MR_MIME @@ -6764,7 +6764,7 @@ HandleAIShift: ; 22476 (8:6476) ld a, OPPACTION_USE_PKMN_POWER bank1call AIMakeDecision -; converts WR_* to apropriate color +; converts WR_* to appropriate color ld a, [wAIDefendingPokemonWeakness] ld b, 0 .loop_color @@ -7535,7 +7535,7 @@ AIPickEnergyCardToDiscard: ; 2282e (8:682e) ; returns in a the deck index of an energy card attached to card ; in player's Play Area location a to remove. -; prioritises double colorless energy, then any useful energy, +; prioritizes double colorless energy, then any useful energy, ; then defaults to the first energy card attached if neither ; of those are found. ; returns $ff in a if there are no energy cards attached. @@ -7614,7 +7614,7 @@ PickAttachedEnergyCardToRemove: ; 22875 (8:6875) ; stores in wTempAI and wCurCardCanAttack the deck indices ; of energy cards attached to card in Play Area location a. -; prioritises double colorless energy, then any useful energy, +; prioritizes double colorless energy, then any useful energy, ; then defaults to the first two energy cards attached if neither ; of those are found. ; returns $ff in a if there are no energy cards attached. @@ -8014,7 +8014,7 @@ LookForCardIDInDeck_GivenCardIDInHand: ; 22a49 (8:6a49) ; input: ; a = card ID ; b = PLAY_AREA_* to start with -; ouput: +; output: ; a = PLAY_AREA_* of found card ; carry set if found LookForCardIDInPlayArea_Bank8: ; 22a72 (8:6a72) @@ -8134,7 +8134,7 @@ RemoveFromListDifferentCardOfGivenType: ; 22a95 (8:6a95) ; e = card ID 2 ; output: ; a = deck index of card ID 1 found in deck -; e = deck index of Pokemon card in hand dfferent than card ID 2 +; e = deck index of Pokemon card in hand different than card ID 2 LookForCardIDToTradeWithDifferentHandCard: ; 22ae0 (8:6ae0) ld hl, wCurCardCanAttack ld [hl], e diff --git a/src/engine/booster_packs.asm b/src/engine/booster_packs.asm index 238a8b2e..25acec19 100644 --- a/src/engine/booster_packs.asm +++ b/src/engine/booster_packs.asm @@ -452,7 +452,7 @@ PutEnergiesAndNonEnergiesTogether: ; 1e3f3 (7:63f3) pop hl ret -; add the final cards drawn from the booster pack to the player's colection (sCardCollection) +; add the final cards drawn from the booster pack to the player's collection (sCardCollection) AddBoosterCardsToCollection: ; 1e40a (7:640a) push hl ld hl, wBoosterCardsDrawn diff --git a/src/engine/deck_ai/decks/legendary_articuno.asm b/src/engine/deck_ai/decks/legendary_articuno.asm index 62ee2468..562e7c51 100644 --- a/src/engine/deck_ai/decks/legendary_articuno.asm +++ b/src/engine/deck_ai/decks/legendary_articuno.asm @@ -78,7 +78,7 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b) ret ; this routine handles how Legendary Articuno -; prioritises playing energy cards to each Pokémon. +; prioritizes playing energy cards to each Pokémon. ; first, it makes sure that all Lapras have at least ; 3 energy cards before moving on to Articuno, ; and then to Dewgong and Seel diff --git a/src/engine/deck_ai/decks/legendary_dragonite.asm b/src/engine/deck_ai/decks/legendary_dragonite.asm index 7090e509..2b8cef61 100644 --- a/src/engine/deck_ai/decks/legendary_dragonite.asm +++ b/src/engine/deck_ai/decks/legendary_dragonite.asm @@ -105,7 +105,7 @@ AIDoTurn_LegendaryDragonite: ; 14def (5:4def) or a jr nz, .skip_energy_attach_1 -; if Arena card is Kangaskhan and doens't +; if Arena card is Kangaskhan and doesn't ; have Energy cards attached, try attaching from hand. ; otherwise run normal AI energy attach routine. ld a, DUELVARS_ARENA_CARD diff --git a/src/engine/deck_ai/decks/sams_practice.asm b/src/engine/deck_ai/decks/sams_practice.asm index b7642a8a..10ce8115 100644 --- a/src/engine/deck_ai/decks/sams_practice.asm +++ b/src/engine/deck_ai/decks/sams_practice.asm @@ -15,7 +15,7 @@ AIActionTable_SamPractice: ; 147bd (05:47bd) call AIMainTurnLogic ret .scripted_1 ; use scripted actions instead - call AIPerformSciptedTurn + call AIPerformScriptedTurn ret .start_duel ; 147d6 (5:47d6) @@ -93,7 +93,7 @@ GetPlayAreaLocationOfRaticateOrRattata: ; 1481f (5:481f) ret ; has AI execute some scripted actions depending on Duel turn. -AIPerformSciptedTurn: ; 1483a (5:483a) +AIPerformScriptedTurn: ; 1483a (5:483a) ld a, [wDuelTurns] srl a ld hl, .scripted_actions_list diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm index 77c03754..92a1f3d6 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/effect_functions.asm @@ -4728,7 +4728,7 @@ Curse_TransferDamageEffect: ; 2d8bb (b:58bb) cp DUELIST_TYPE_PLAYER jr z, .vs_player -; vs. oppponent +; vs. opponent bank1call Func_61a1 .vs_player ; transfer the damage counter to the targets that were selected. @@ -5608,7 +5608,7 @@ HandleEvolvedCardSelection: ; 2dd50 (b:5d50) ret ; 0x2dd62 -; finds first occurence in Play Area +; finds first occurrence in Play Area ; of Stage 1 or 2 card, and outputs its ; Play Area location in a, with carry set. ; if none found, don't return carry set. @@ -5799,7 +5799,7 @@ StrangeBehavior_CheckDamage: ; 2de39 (b:5e39) call CheckIfPlayAreaHasAnyDamage ldtx hl, NoPokemonWithDamageCountersText jr c, .set_carry -; can Slowbro receive any damage counters without KOing? +; can Slowbro receive any damage counters without KO-ing? ldh a, [hTempPlayAreaLocation_ff9d] add DUELVARS_ARENA_CARD_HP call GetTurnDuelistVariable @@ -7925,12 +7925,12 @@ MirrorMoveEffects: ; 2e98c (b:698c) or a ret z ; no effect cp LAST_TURN_EFFECT_DISCARD_ENERGY - jr z, .dicard_energy + jr z, .discard_energy cp LAST_TURN_EFFECT_AMNESIA jr z, .pick_amnesia_attack ret -.dicard_energy +.discard_energy call AIPickEnergyCardToDiscardFromDefendingPokemon ldh [hTemp_ffa0], a ret @@ -8209,7 +8209,7 @@ CometPunch_AIEffect: ; 2eb5d (b:6b5d) jp SetExpectedAIDamage ; 0x2eb65 -CometPunch_MultiplerEffect: ; 2eb65 (b:6b65) +CometPunch_MultiplierEffect: ; 2eb65 (b:6b65) ld hl, 20 call LoadTxRam3 ldtx de, DamageCheckIfHeadsXDamageText @@ -8264,7 +8264,7 @@ FuryAttack_AIEffect: ; 2ebba (b:6bba) jp SetExpectedAIDamage ; 0x2ebc2 -FuryAttack_MultiplerEffect: ; 2ebc2 (b:6bc2) +FuryAttack_MultiplierEffect: ; 2ebc2 (b:6bc2) ld hl, 10 call LoadTxRam3 ld a, 2 @@ -9976,7 +9976,7 @@ ComputerSearch_PlayerDeckSelection: ; 2f52e (b:752e) ret ; 0x2f545 -ComputerSearch_DiscardAddToHandEfect: ; 2f545 (b:7545) +ComputerSearch_DiscardAddToHandEffect: ; 2f545 (b:7545) ; discard cards from hand ld hl, hTempList ld a, [hli] @@ -11215,7 +11215,7 @@ CreateBasicPokemonCardListFromDiscardPile: ; 2fbd6 (b:7bd6) or a jr nz, .next_discard_pile_card ; if not Basic stage, skip -; write this card'sindex to wDuelTempList +; write this card's index to wDuelTempList ld a, [hl] ld [de], a inc de diff --git a/src/engine/home.asm b/src/engine/home.asm index 140fcc9b..a5125c40 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -579,7 +579,7 @@ FlushAllCGBPalettes: ; 0458 (0:0458) jr FlushPalettesIfRequested.done ; copy b bytes of CGB palette data starting at -; (wBackgroundPalettesCGB + a palettes) into rBGPD or rOGPD. +; (wBackgroundPalettesCGB + a palettes) into rBGPD or rOBPD. CopyCGBPalettes: ; 0467 (0:0467) add a add a @@ -1007,10 +1007,10 @@ TwoByteNumberToText: ; 0663 (0:0663) ret .get_digit ld a, "0" - 1 -.substract_loop +.subtract_loop inc a add hl, bc - jr c, .substract_loop + jr c, .subtract_loop ld [de], a inc de ld a, l @@ -1175,7 +1175,7 @@ CopyGfxData: ; 070c (0:070c) jr nz, .next_tile ret -; copy bc bytes from hl to de. preserves all regsters except af +; copy bc bytes from hl to de. preserves all registers except af CopyDataHLtoDE_SaveRegisters: ; 0732 (0:0732) push hl push de @@ -2036,10 +2036,10 @@ MltReq2Packet: ; 0bbb (0:0bbb) Func_0bcb: ; 0bcb (0:0bcb) di push de -.wait_vbalnk +.wait_vblank ldh a, [rLY] cp LY_VBLANK + 3 - jr nz, .wait_vbalnk + jr nz, .wait_vblank ld a, LCDC_BGON | LCDC_OBJON | LCDC_WIN9C00 ldh [rLCDC], a ld a, %11100100 @@ -2779,7 +2779,7 @@ ExchangeRNG: ; 0f58 (0:0f58) ; hTemp_ffa0, and hTempPlayAreaLocation_ffa1, and hTempRetreatCostCards. ; finally exchange RNG data. ; the receiving side will use this data to read the OPPACTION_* value in -; [hOppActionTableIndex] and match it by calling the correspoding OppAction* function +; [hOppActionTableIndex] and match it by calling the corresponding OppAction* function SetOppAction_SerialSendDuelData: ; 0f7f (0:0f7f) push hl push bc @@ -3031,7 +3031,7 @@ ShuffleDeck: ; 10bc (0:10bc) ret ; draw a card from the turn holder's deck, saving its location as CARD_LOCATION_JUST_DRAWN. -; returns carry if deck is empty, nc if a card was succesfully drawn. +; returns carry if deck is empty, nc if a card was successfully drawn. ; AddCardToHand is meant to be called next (unless this function returned carry). DrawCardFromDeck: ; 10cf (0:10cf) push hl @@ -4466,7 +4466,7 @@ PlayAttackAnimation_DealAttackDamage: ; 179a (0:179a) call WaitMoveAnimation pop hl pop de - call SubstractHP + call SubtractHP ld a, [wDuelDisplayedScreen] cp DUEL_MAIN_SCENE jr nz, .skip_draw_huds @@ -4899,10 +4899,10 @@ ApplyAttachedDefender: ; 1a7e (0:1a7e) ld d, a ret -; hl: address to substract HP from -; de: how much HP to substract (damage to deal) +; hl: address to subtract HP from +; de: how much HP to subtract (damage to deal) ; returns carry if the HP does not become 0 as a result -SubstractHP: ; 1a96 (0:1a96) +SubtractHP: ; 1a96 (0:1a96) push hl push de ld a, [hl] @@ -6146,7 +6146,7 @@ LoadDuelCardSymbolTiles2: ; 20c4 (0:20c4) ld b, $c jr CopyFontsOrDuelGraphicsTiles -; load the face down basic / stage1 / stage2 card images shown in the ckeck Pokemon screens +; load the face down basic / stage1 / stage2 card images shown in the check Pokemon screens LoadDuelFaceDownCardTiles: ; 20d8 (0:20d8) ld b, $10 jr LoadDuelCheckPokemonScreenTiles.got_num_tiles @@ -6239,7 +6239,7 @@ Func_212f: ; 212f (0:212f) ld b, $30 jr CopyFontsOrDuelGraphicsTiles -; load the graphics and draw the duel box message given a BOXMSC_* constant in a +; load the graphics and draw the duel box message given a BOXMSG_* constant in a DrawDuelBoxMessage: ; 2167 (0:2167) ld l, a ld h, 40 tiles / 4 ; boxes are 10x4 tiles @@ -6888,10 +6888,10 @@ TwoByteNumberToTxSymbol_TrimLeadingZeros: ; 245d (0:245d) ld [de], a inc de ld a, SYM_0 - 1 -.substract_loop +.subtract_loop inc a add hl, bc - jr c, .substract_loop + jr c, .subtract_loop ld [de], a inc de ld a, l @@ -7978,7 +7978,7 @@ DrawNarrowTextBox_WaitForInput: ; 2a7c (0:2a7c) ret NarrowTextBoxMenuParameters: ; 2a96 (0:2a96) - db 10, 17 ; corsor x, cursor y + db 10, 17 ; cursor x, cursor y db 1 ; y displacement between items db 1 ; number of items db SYM_CURSOR_D ; cursor tile number @@ -9138,7 +9138,7 @@ AddToDamage: ; 3055 (0:3055) ret ; [wDamage] -= a -SubstractFromDamage: ; 3061 (0:3061) +SubtractFromDamage: ; 3061 (0:3061) push de push hl ld e, a @@ -9662,7 +9662,7 @@ HandleStrikesBack_AgainstDamagingMove: ; 3317 (0:3317) .in_bench push hl push de - ; substract 10 HP from attacking Pokemon (turn holder's arena Pokemon) + ; subtract 10 HP from attacking Pokemon (turn holder's arena Pokemon) call SwapTurn ld a, DUELVARS_ARENA_CARD call GetTurnDuelistVariable @@ -9672,7 +9672,7 @@ HandleStrikesBack_AgainstDamagingMove: ; 3317 (0:3317) push af push hl ld de, 10 - call SubstractHP + call SubtractHP ld a, [wLoadedCard2ID] ld [wTempNonTurnDuelistCardID], a ld hl, 10 @@ -10271,7 +10271,7 @@ ApplyStrikesBack_AgainstResidualMove: ; 36a2 (0:36a2) pop de push af push hl - call SubstractHP + call SubtractHP ldtx hl, ReceivesDamageDueToStrikesBackText call DrawWideTextBox_PrintText pop hl diff --git a/src/text/text1.asm b/src/text/text1.asm index fa1d585a..93c389fe 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -372,7 +372,7 @@ ChooseTheCardYouWishToExamineText: ; 3697c (d:697c) line "you wish to examine." done -TransmitingDataText: ; 369a2 (d:69a2) +TransmittingDataText: ; 369a2 (d:69a2) text "Transmitting data..." done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index b44dc3ef..23a7ddfe 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -88,7 +88,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer YouPlaySecondText ; 0x0054 textpointer TransmissionErrorText ; 0x0055 textpointer ChooseTheCardYouWishToExamineText ; 0x0056 - textpointer TransmitingDataText ; 0x0057 + textpointer TransmittingDataText ; 0x0057 textpointer WaitingHandExamineText ; 0x0058 textpointer SelectingBenchPokemonHandExamineBackText ; 0x0059 textpointer RetreatedToTheBenchText ; 0x005a diff --git a/src/wram.asm b/src/wram.asm index a3c44d05..dc1d91fb 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -733,7 +733,7 @@ wNoItemSelectionMenuKeys:: ; cbd6 ds $1 ; when viewing a card page, which keys (among B_BUTTON, D_UP, and D_DOWN) will exit the page, -; either to go back to the previous menu orlist, or to load the card page of the card above/below it +; either to go back to the previous menu or list, or to load the card page of the card above/below it wCardPageExitKeys:: ; cbd7 ds $1 @@ -2085,10 +2085,10 @@ wBoosterViableCardList:: ; d133 NEXTU -; permission map of the current room with unpassable objects (walls, NPCs, etc). +; permission map of the current room with impassable objects (walls, NPCs, etc). ; $00: passable (floor) -; $40: unpassable and talkable (NPC or talkable wall) -; $80: unpassable and untalkable (wall) +; $40: impassable and talkable (NPC or talkable wall) +; $80: impassable and untalkable (wall) wPermissionMap:: ; d133 ds $100