summaryrefslogtreecommitdiff
path: root/src/home/effect_commands.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/home/effect_commands.asm')
-rw-r--r--src/home/effect_commands.asm85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/home/effect_commands.asm b/src/home/effect_commands.asm
new file mode 100644
index 0000000..e28e170
--- /dev/null
+++ b/src/home/effect_commands.asm
@@ -0,0 +1,85 @@
+; Checks if the command type at a is one of the commands of the attack or
+; card effect currently in use, and executes its associated function if so.
+; input:
+ ; a = command type to check
+ ; [wLoadedAttackEffectCommands] = pointer to list of commands of current attack or trainer card
+ TryExecuteEffectCommandFunction: ; 2fd9 (0:2fd9)
+ push af
+ ; grab pointer to command list from wLoadedAttackEffectCommands
+ ld hl, wLoadedAttackEffectCommands
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ call CheckMatchingCommand
+ jr nc, .execute_function
+ ; return if no matching command was found
+ or a
+ ret
+
+.execute_function
+ ; execute the function at [wEffectFunctionsBank]:hl
+ ldh a, [hBankROM]
+ push af
+ ld a, [wEffectFunctionsBank]
+ call BankswitchROM
+ or a
+ call CallHL
+ push af
+ ; restore original bank and return
+ pop bc
+ pop af
+ call BankswitchROM
+ push bc
+ pop af
+ ret
+
+; input:
+ ; a = command type to check
+ ; hl = list of commands of current attack or trainer card
+; return nc if command type matching a is found, carry otherwise
+CheckMatchingCommand: ; 2ffe (0:2ffe)
+ ld c, a
+ ld a, l
+ or h
+ jr nz, .not_null_pointer
+ ; return carry if pointer is NULL
+ scf
+ ret
+
+.not_null_pointer
+ ldh a, [hBankROM]
+ push af
+ ld a, BANK(EffectCommands)
+ call BankswitchROM
+ ; store the bank number of command functions ($b) in wEffectFunctionsBank
+ ld a, BANK("Effect Functions")
+ ld [wEffectFunctionsBank], a
+.check_command_loop
+ ld a, [hli]
+ or a
+ jr z, .no_more_commands
+ cp c
+ jr z, .matching_command_found
+ ; skip function pointer for this command and move to the next one
+ inc hl
+ inc hl
+ jr .check_command_loop
+
+.matching_command_found
+ ; load function pointer for this command
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ; restore bank and return nc
+ pop af
+ call BankswitchROM
+ or a
+ ret
+
+.no_more_commands
+ ; restore bank and return c
+ pop af
+ call BankswitchROM
+ scf
+ ret