; NAME: Control Bowser
; GAMES: MP2_USA
; EXECUTION: Direct

; Set this event as "Before player turn". It is designed to allow the
; player who obtains the Bowser Bomb to control Bowser as he moves
; around the board.

;===Insert Hook===
.align 4
ADDIU SP SP -32
SW RA 28(SP)

LUI T0 hi(HookData)
ADDIU T0 T0 lo(HookData)
LW V0 0(T0) ; Load HookData operation
LUI V1 0x8006 ; 0x80060000
ORI V1 V1 0x53BC ; 0x800653BC, Hook Location
SW V0 0(V1) ; Insert hook to CustomCode
LW V0 4(T0) ; Load HookData operation 2
SW V0 4(V1) ; Insert operation 2

LW RA 28(SP)
JR RA
ADDIU SP SP 32

;===Hook Data===
.align 4
HookData:
J CustomCode ; Hook to jump to CustomCode
ADDU A0 S2 R0 ; Pass Bowser struct on A0

;===Custom Code===
.align 4
CustomCode:
ADDIU SP SP -64
SW RA 60(SP)
SW S0 56(SP)
SW S1 52(SP)
SW A0 48(SP)
SW V1 44(SP)
SW T0 40(SP)
SW T1 36(SP)

; A0 / S0 = Bowser Struct
; S1 = Player Index

MOVE S0 A0 ; Copy A0 to S0
LI S1 0 ; Start with P1
CustomCodeLoop:
JAL GetPlayerStruct
MOVE A0 S1 ; Get player struct at V0
LBU T0 0x19(V0) ; Load player item into T0
LI A0 0x03 ; Bowser Bomb index
BEQ T0 A0 SetPlayer
NOP
J CustomCodeLoop
ADDIU S1 S1 1 ; Add 1 to get next player

SetPlayer:
LBU T0 3(V0) ; Load player controller part into T0
SB T0 3(S0) ; Store player controller part into Bowser struct
LHU V0 6(V0) ; Load player CPU flag into T0

FixHook:
LUI T1 hi(OriginalData)
ADDIU T1 T1 lo(OriginalData)
LW T0 0(T1) ; Load OriginalData operation
LUI V1 0x8006 ; 0x80060000
ORI V1 V1 0x53BC ; 0x800653BC, Hook Location
SW T0 0(V1) ; Insert original code in hook location
LW T0 4(T1) ; Load OriginalData operation 2
SW T0 4(V1) ; Insert original code 2

LW RA 60(SP)
LW S0 56(SP)
LW S1 52(SP)
LW A0 48(SP)
LW V1 44(SP)
LW T0 40(SP)
LW T1 36(SP)
J 0x800653C4 ; SH V0 6(S2)
ADDIU SP SP 64

;===Original Data===
.align 4
OriginalData:
LHU V0 6(S2) ; Original code
ORI V0 V0 1 ; Original code 2