2879 lines
104 KiB
Python
2879 lines
104 KiB
Python
normal_door_hook = [
|
|
0x00862021, # ADDU A0, A0, A2
|
|
0x80849C60, # LB A0, 0x9C60 (A0)
|
|
0x0C0FF174, # JAL 0x803FC5D0
|
|
0x308900FF # ANDI T1, A0, 0x00FF
|
|
]
|
|
|
|
normal_door_code = [
|
|
0x00024080, # SLL T0, V0, 2
|
|
0x3C048039, # LUI A0, 0x8039
|
|
0x00882021, # ADDU A0, A0, T0
|
|
0x8C849BE4, # LW A0, 0x9BE4 (A0)
|
|
0x8C6A0008, # LW T2, 0x0008 (V1)
|
|
0x008A5824, # AND T3, A0, T2
|
|
0x11600003, # BEQZ T3, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x24020003, # ADDIU V0, R0, 0x0003
|
|
0x27FF006C, # ADDIU RA, RA, 0x006C
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
ct_door_hook = [
|
|
0x0C0FF182, # JAL 0x803FC608
|
|
0x00000000, # NOP
|
|
0x315900FF # ANDI T9, T2, 0x00FF
|
|
]
|
|
|
|
ct_door_code = [
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x8D429BF8, # LW V0, 0x9BF8 (T2)
|
|
0x01465021, # ADDU T2, T2, A2
|
|
0x814A9C60, # LB T2, 0x9C60 (T2)
|
|
0x00495824, # AND T3, V0, T1
|
|
0x55600001, # BNEZL T3, [forward 0x01]
|
|
0x27FF0010, # ADDIU RA, RA, 0x0010
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
stage_select_overwrite = [
|
|
# Replacement for the "wipe world state" function when using the warp menu. Now it's the "Special1 jewel checker"
|
|
# to see how many destinations can be selected on it with the current count.
|
|
0x8FA60018, # LW A2, 0x0018 (SP)
|
|
0xA0606437, # SB R0, 0x6437 (V1)
|
|
0x10000029, # B [forward 0x29]
|
|
0x00000000, # NOP
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x254A9C4B, # ADDIU T2, T2, 0x9C4B
|
|
0x814B0000, # LB T3, 0x0000 (T2)
|
|
0x240C000A, # ADDIU T4, R0, 0x000A
|
|
0x016C001B, # DIVU T3, T4
|
|
0x00003012, # MFLO A2
|
|
0x24C60001, # ADDIU A2, A2, 0x0001
|
|
0x28CA0009, # SLTI T2, A2, 0x0009
|
|
0x51400001, # BEQZL T2, 0x8012AC7C
|
|
0x24060008, # ADDIU A2, R0, 0x0008
|
|
0x3C0A800D, # LUI T2, 0x800D
|
|
0x914A5E20, # LBU T2, 0x5E20 (T2)
|
|
0x314A0040, # ANDI T2, T2, 0x0040
|
|
0x11400003, # BEQZ T2, [forward 0x03]
|
|
0x240BFFFE, # ADDIU T3, R0, 0xFFFE
|
|
0x3C0C8034, # LUI T4, 0x8034
|
|
0xAD8B2084, # SW T3, 0x2084 (T4)
|
|
0x03200008, # JR T9
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
]
|
|
|
|
custom_code_loader = [
|
|
# On boot, when the company logos show up, this will trigger and load most of the custom ASM data in this module
|
|
# off from ROM offsets 0xBFC000-0xBFFFFF and into the 803FC000-803FFFFF range in RAM.
|
|
0x3C080C10, # LUI T0, 0x0C10
|
|
0x2508F1C0, # ADDIU T0, T0, 0xF1C0
|
|
0x3C098000, # LUI T1, 0x8000
|
|
0xAD282438, # SW T0, 0x2438 (T1)
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x9108C000, # ADDIU T0, 0xC000 (T0)
|
|
0x15000007, # BNEZ T0, [forward 0x07]
|
|
0x3C0400C0, # LUI A0, 0x00C0
|
|
0x2484C000, # ADDIU A0, A0, 0xC000
|
|
0x3C058040, # LUI A1, 0x8040
|
|
0x24A5C000, # ADDIU A1, A1, 0xC000
|
|
0x24064000, # ADDIU A2, R0, 0x4000
|
|
0x08005DFB, # J 0x800177EC
|
|
0x00000000, # NOP
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
remote_item_giver = [
|
|
# The essential multiworld function. Every frame wherein the player is in control and not looking at a text box,
|
|
# this thing will check some bytes in RAM to see if an item or DeathLink has been received and trigger the right
|
|
# functions accordingly to either reward items or kill the player.
|
|
|
|
# Primary checks
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x9509244A, # LHU T1, 0x244A (T0)
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x910A9EFB, # LBU T2, 0x9EFF (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x910A9EFF, # LBU T2, 0x9EFF (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x910A9CCF, # LBU T2, 0x9CCF (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x910A9EEF, # LBU T2, 0x9EEF (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x910A9CD3, # LBU T2, 0x9CD3 (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x3C088038, # LUI T0, 0x8038
|
|
0x910A7ADD, # LBU T2, 0x7ADD (T0)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916A9BE0, # LBU T2, 0x9BE0 (T3)
|
|
0x012A4821, # ADDU T1, T1, T2
|
|
0x11200006, # BEQZ T1, [forward 0x06]
|
|
0x00000000, # NOP
|
|
0x11400002, # BEQZ T2, [forward 0x02]
|
|
0x254AFFFF, # ADDIU T2, T2, 0xFFFF
|
|
0xA16A9BE0, # SB T2, 0x9BE0 (T3)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Item-specific checks
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x91082891, # LBU T0, 0x2891 (T0)
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x15090012, # BNE T0, T1, [forward 0x12]
|
|
0x00000000, # NOP
|
|
0x256B9BDF, # ADDIU T3, T3, 0x9BDF
|
|
0x91640000, # LBU A0, 0x0000 (T3)
|
|
0x14800003, # BNEZ A0, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x10000005, # B [forward 0x05]
|
|
0x256B0002, # ADDIU T3, T3, 0x0002
|
|
0x2409000F, # ADDIU T1, R0, 0x000F
|
|
0xA1690001, # SB T1, 0x0001 (T3)
|
|
0x080FF8DD, # J 0x803FE374
|
|
0xA1600000, # SB R0, 0x0000 (T3)
|
|
0x91640000, # LBU A0, 0x0000 (T3)
|
|
0x14800002, # BNEZ A0, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x10000003, # B [forward 0x03]
|
|
0x2409000F, # ADDIU T1, R0, 0x000F
|
|
0x080FF864, # J 0x803FE190
|
|
0xA169FFFF, # SB T1, 0xFFFF (T3)
|
|
# DeathLink-specific checks
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x256B9BE1, # ADDIU T3, T3, 0x9BE1
|
|
0x91640002, # LBU A0, 0x0002 (T3)
|
|
0x14800002, # BNEZ A0, [forward 0x02]
|
|
0x916900A7, # LBU T1, 0x00A7 (T3)
|
|
0x080FF9C0, # J 0x803FE700
|
|
0x312A0080, # ANDI T2, T1, 0x0080
|
|
0x11400002, # BEQZ T2, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0x35290080, # ORI T1, T1, 0x0080
|
|
0xA16900A7, # SB T1, 0x00A7 (T3)
|
|
0x2484FFFF, # ADDIU A0, A0, 0xFFFF
|
|
0x24080001, # ADDIU T0, R0, 0x0001
|
|
0x03E00008, # JR RA
|
|
0xA168FFFD, # SB T0, 0xFFFD (T3)
|
|
]
|
|
|
|
deathlink_nitro_edition = [
|
|
# Alternative to the end of the above DeathLink-specific checks that kills the player with the Nitro explosion
|
|
# instead of the normal death.
|
|
0x91690043, # LBU T1, 0x0043 (T3)
|
|
0x080FF9C0, # J 0x803FE700
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x91082BFE, # LBU T0, 0x2BFE (T0)
|
|
0x11000002, # BEQZ T0, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0x35290080, # ORI T1, T1, 0x0080
|
|
0xA1690043, # SB T1, 0x0043 (T3)
|
|
0x2484FFFF, # ADDIU A0, A0, 0xFFFF
|
|
0x24080001, # ADDIU T0, R0, 0x0001
|
|
0x03E00008, # JR RA
|
|
0xA168FFFD, # SB T0, 0xFFFD (T3)
|
|
]
|
|
|
|
launch_fall_killer = [
|
|
# Custom code to force the instant fall death if at a high enough falling speed after getting killed by something
|
|
# that launches you (whether it be the Nitro explosion or a Big Toss hit). The game doesn't normally run the check
|
|
# that would trigger the fall death after you get killed by some other means, which could result in a softlock
|
|
# when a killing blow launches you into an abyss.
|
|
0x3C0C8035, # LUI T4, 0x8035
|
|
0x918807E2, # LBU T0, 0x07E2 (T4)
|
|
0x24090008, # ADDIU T1, R0, 0x0008
|
|
0x11090002, # BEQ T0, T1, [forward 0x02]
|
|
0x2409000C, # ADDIU T1, R0, 0x000C
|
|
0x15090006, # BNE T0, T1, [forward 0x06]
|
|
0x3C098035, # LUI T1, 0x8035
|
|
0x91290810, # LBU T1, 0x0810 (T1)
|
|
0x240A00C1, # ADDIU T2, R0, 0x00C1
|
|
0x152A0002, # BNE T1, T2, [forward 0x02]
|
|
0x240B0001, # ADDIU T3, R0, 0x0001
|
|
0xA18B07E2, # SB T3, 0x07E2 (T4)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
deathlink_counter_decrementer = [
|
|
# Decrements the DeathLink counter if it's above zero upon loading a previous state. Checking this number will be
|
|
# how the client will tell if a player's cause of death was something in-game or a DeathLink (and send a DeathLink
|
|
# to the server if it was the former). Also resets the remote item values to 00 so the player's received items don't
|
|
# get mucked up in-game.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099BE3, # LBU T1, 0x9BE3 (T0)
|
|
0x11200002, # BEQZ T1, 0x803FC154
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1099BE3, # SB T1, 0x9BE3
|
|
0x240900FF, # ADDIU T1, R0, 0x00FF
|
|
0xA1099BE0, # SB T1, 0x9BE0 (T0)
|
|
0xA1009BDF, # SB R0, 0x9BDF (T0)
|
|
0xA1009BE1, # SB R0, 0x9BE1 (T0)
|
|
0x91099BDE, # LBU T1, 0x9BDE (T0)
|
|
0x55200001, # BNEZL T1, [forward 0x01]
|
|
0x24090000, # ADDIU T1, R0, 0x0000
|
|
0xA1099BDE, # SB T1, 0x9BDE (T0)
|
|
0x91099C24, # LBU T1, 0x9C24 (T0)
|
|
0x312A0080, # ANDI T2, T1, 0x0080
|
|
0x55400001, # BNEZL T2, [forward 0x01]
|
|
0x3129007F, # ANDI T1, T1, 0x007F
|
|
0x03E00008, # JR RA
|
|
0xA1099C24 # SB T1, 0x9C24 (T0)
|
|
]
|
|
|
|
death_flag_unsetter = [
|
|
# Un-sets the Death status bitflag when overwriting the "Restart this stage" state and sets health to full if it's
|
|
# empty. This is to ensure DeathLinked players won't get trapped in a perpetual death loop for eternity should they
|
|
# receive one right before transitioning to a different stage.
|
|
0x3C048039, # LUI A0, 0x8039
|
|
0x90889C88, # LBU T0, 0x9C88 (A0)
|
|
0x31090080, # ANDI T1, T0, 0x0080
|
|
0x01094023, # SUBU T0, T0, T1
|
|
0x908A9C3F, # LBU T2, 0x9C3F (A0)
|
|
0x24090064, # ADDIU T1, R0, 0x0064
|
|
0x51400001, # BEQZL T2, [forward 0x01]
|
|
0xA0899C3F, # SB T1, 0x9C3F (A0)
|
|
0x08006DAE, # J 0x8001B6B8
|
|
0xA0889C88 # SB T0, 0x9C88 (A0)
|
|
]
|
|
|
|
warp_menu_opener = [
|
|
# Enables opening the Stage Select menu by pausing while holding Z + R when not in a boss fight, the castle
|
|
# crumbling sequence following Fake Dracula, or Renon's arena (in the few seconds after his health bar vanishes).
|
|
0x3C08800D, # LUI T0, 0x800D
|
|
0x85095E20, # LH T1, 0x5E20 (T0)
|
|
0x24083010, # ADDIU T0, R0, 0x3010
|
|
0x15090011, # BNE T0, T1, [forward 0x11]
|
|
0x3C088035, # LUI T0, 0x8035
|
|
0x9108F7D8, # LBU T0, 0xF7D8 (T0)
|
|
0x24090020, # ADDIU T1, R0, 0x0020
|
|
0x1109000D, # BEQ T0, T1, [forward 0x0D]
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099BFA, # LBU T1, 0x9BFA (T0)
|
|
0x31290001, # ANDI T1, T1, 0x0001
|
|
0x15200009, # BNEZ T1, [forward 0x09]
|
|
0x8D099EE0, # LW T1, 0x9EE0
|
|
0x3C0A001B, # LUI T2, 0x001B
|
|
0x254A0003, # ADDIU T2, T2, 0x0003
|
|
0x112A0005, # BEQ T1, T2, [forward 0x05]
|
|
0x3C098034, # LUI T1, 0x8034
|
|
0xA1009BE1, # SB R0, 0x9BE1 (T0)
|
|
0x2408FFFC, # ADDIU T0, R0, 0xFFFC
|
|
0x0804DA70, # J 0x80136960
|
|
0xAD282084, # SW T0, 0x2084 (T1)
|
|
0x0804DA70, # J 0x80136960
|
|
0xA44E6436 # SH T6, 0x6436 (V0)
|
|
]
|
|
|
|
give_subweapon_stopper = [
|
|
# Extension to "give subweapon" function to not change the player's weapon if the received item is a Stake or Rose.
|
|
# Can also increment the Ice Trap counter if getting a Rose or jump to prev_subweapon_dropper if applicable.
|
|
0x24090011, # ADDIU T1, R0, 0x0011
|
|
0x11240009, # BEQ T1, A0, [forward 0x09]
|
|
0x24090012, # ADDIU T1, R0, 0x0012
|
|
0x11240003, # BEQ T1, A0, [forward 0x03]
|
|
0x9465618A, # LHU A1, 0x618A (V1)
|
|
0xA46D618A, # SH T5, 0x618A (V1)
|
|
0x0804F0BF, # J 0x8013C2FC
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x912A9BE2, # LBU T2, 0x9BE2 (T1)
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0xA12A9BE2, # SB T2, 0x9BE2 (T1)
|
|
0x0804F0BF, # J 0x8013C2FC
|
|
]
|
|
|
|
give_powerup_stopper = [
|
|
# Extension to "give PowerUp" function to not increase the player's PowerUp count beyond 2
|
|
0x240D0002, # ADDIU T5, R0, 0x0002
|
|
0x556D0001, # BNEL T3, T5, [forward 0x01]
|
|
0xA46C6234, # SH T4, 0x6234 (V1)
|
|
0x0804F0BF # J 0x8013C2FC
|
|
]
|
|
|
|
npc_item_hack = [
|
|
# Hack to make NPC items show item textboxes when received (and decrease the Countdown if applicable).
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x001F5602, # SRL T2, RA, 24
|
|
0x240B0080, # ADDIU T3, R0, 0x0080
|
|
0x114B001F, # BEQ T2, T3, [forward 0x1F]
|
|
0x240A001A, # ADDIU T2, R0, 0x001A
|
|
0x27BD0020, # ADDIU SP, SP, 0x20
|
|
0x15440004, # BNE T2, A0, [forward 0x04]
|
|
0x240B0029, # ADDIU T3, R0, 0x0029
|
|
0x34199464, # ORI T9, R0, 0x9464
|
|
0x10000004, # B [forward 0x04]
|
|
0x240C0002, # ADDIU T4, R0, 0x0002
|
|
0x3419DA64, # ORI T9, R0, 0xDA64
|
|
0x240B0002, # ADDIU T3, R0, 0x0002
|
|
0x240C000E, # ADDIU T4, R0, 0x000E
|
|
0x012C7021, # ADDU T6, T1, T4
|
|
0x316C00FF, # ANDI T4, T3, 0x00FF
|
|
0x000B5A02, # SRL T3, T3, 8
|
|
0x91CA9CA4, # LBU T2, 0x9CA4 (T6)
|
|
0x3C0D8040, # LUI T5, 0x8040
|
|
0x256FFFFF, # ADDIU T7, T3, 0xFFFF
|
|
0x01AF6821, # ADDU T5, T5, T7
|
|
0x91B8D71C, # LBU T8, 0xD71C (T5)
|
|
0x29EF0019, # SLTI T7, T7, 0x0019
|
|
0x51E00001, # BEQZL T7, [forward 0x01]
|
|
0x91B8D71F, # LBU T8, 0xD71F (T5)
|
|
0x13000002, # BEQZ T8, [forward 0x02]
|
|
0x254AFFFF, # ADDIU T2, T2, 0xFFFF
|
|
0xA1CA9CA4, # SB T2, 0x9CA4 (T6)
|
|
0xA12C9BDF, # SB T4, 0x9BDF (T1)
|
|
0x3C0400BB, # LUI A0, 0x00BB
|
|
0x00992025, # OR A0, A0, T9
|
|
0x3C058019, # LUI A1, 0x8019
|
|
0x24A5BF98, # ADDIU A1, A1, 0xBF98
|
|
0x08005DFB, # J 0x800177EC
|
|
0x24060100, # ADDIU A2, R0, 0x0100
|
|
0x0804EFFD, # J 0x8013BFF4
|
|
0xAFBF0014 # SW RA, 0x0014 (SP)
|
|
]
|
|
|
|
overlay_modifiers = [
|
|
# Whenever a compressed overlay gets decompressed and mapped in the 0F or 0E domains, this thing will check the
|
|
# number ID in the T0 register to tell which one it is and overwrite some instructions in it on-the-fly accordingly
|
|
# to said number before it runs. Confirmed to NOT be a foolproof solution on console and Simple64; the instructions
|
|
# may not be properly overwritten on the first execution of the overlay.
|
|
|
|
# Prevent being able to throw Nitro into the Hazardous Waste Disposals
|
|
0x3C0A2402, # LUI T2, 0x2402
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x24090023, # ADDIU T1, R0, 0x0023
|
|
0x15090003, # BNE T0, T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x03200008, # JR T9
|
|
0xAF2A01D4, # SW T2, 0x01D4 (T9)
|
|
# Make it so nothing can be taken from the Nitro or Mandragora shelves through the textboxes
|
|
0x24090022, # ADDIU T1, R0, 0x0022
|
|
0x11090002, # BEQ T0, T1, [forward 0x02]
|
|
0x24090021, # ADDIU T1, R0, 0x0021
|
|
0x15090003, # BNE T0, T1, [forward 0x03]
|
|
0x254AFFFF, # ADDIU T2, T2, 0xFFFF
|
|
0x03200008, # JR T9
|
|
0xAF2A0194, # SW T2, 0x0194 (T9)
|
|
# Fix to allow placing both bomb components at a cracked wall at once while having multiple copies of each, and
|
|
# prevent placing them at the downstairs crack altogether until the seal is removed. Also enables placing both in
|
|
# one interaction.
|
|
0x24090024, # ADDIU T1, R0, 0x0024
|
|
0x15090012, # BNE T0, T1, [forward 0x12]
|
|
0x240A0040, # ADDIU T2, R0, 0x0040
|
|
0x240BC338, # ADDIU T3, R0, 0xC338
|
|
0x240CC3D4, # ADDIU T4, R0, 0xC3D4
|
|
0x240DC38C, # ADDIU T5, R0, 0xC38C
|
|
0xA32A030F, # SB T2, 0x030F (T9)
|
|
0xA72B0312, # SH T3, 0x0312 (T9)
|
|
0xA32A033F, # SB T2, 0x033F (T9)
|
|
0xA72B0342, # SH T3, 0x0342 (T9)
|
|
0xA32A03E3, # SB T2, 0x03E3 (T9)
|
|
0xA72C03E6, # SH T4, 0x03E6 (T9)
|
|
0xA32A039F, # SB T2, 0x039F (T9)
|
|
0xA72D03A2, # SH T5, 0x03A2 (T9)
|
|
0xA32A03CB, # SB T2, 0x03CB (T9)
|
|
0xA72D03CE, # SH T5, 0x03CE (T9)
|
|
0xA32A05CF, # SB T2, 0x05CF (T9)
|
|
0x240EE074, # ADDIU T6, R0, 0xE074
|
|
0xA72E05D2, # SH T6, 0x05D2 (T9)
|
|
0x03200008, # JR T9
|
|
# Disable the costume and Hard Mode flag checks so that pressing Up on the Player Select screen will always allow
|
|
# the characters' alternate costumes to be used as well as Hard Mode being selectable without creating save data.
|
|
0x2409012E, # ADDIU T1, R0, 0x012E
|
|
0x1509000A, # BNE T0, T1, [forward 0x0A]
|
|
0x3C0A3C0B, # LUI T2, 0x3C0B
|
|
0x254A8000, # ADDIU T2, T2, 0x8000
|
|
0x240B240E, # ADDIU T3, R0, 0x240E
|
|
0x240C240F, # ADDIU T4, R0, 0x240F
|
|
0x240D0024, # ADDIU T5, R0, 0x0024
|
|
0xAF2A0C78, # SW T2, 0x0C78 (T9)
|
|
0xA72B0CA0, # SH T3, 0x0CA0 (T9)
|
|
0xA72C0CDC, # SH T4, 0x0CDC (T9)
|
|
0xA32D0168, # SB T5, 0x0024 (T9)
|
|
0x03200008, # JR T9
|
|
# Overwrite instructions in the Forest end cutscene script to store a spawn position ID instead of a cutscene ID.
|
|
0x2409002E, # ADDIU T1, R0, 0x002E
|
|
0x15090005, # BNE T0, T1, [forward 0x05]
|
|
0x3C0AA058, # LUI T2, 0xA058
|
|
0x254A642B, # ADDIU T2, T2, 0x642B
|
|
0xAF2A0D88, # SW T2, 0x0D88 (T9)
|
|
0xAF200D98, # SW R0, 0x0D98 (T9)
|
|
0x03200008, # JR T9
|
|
# Disable the rapid flashing effect in the CC planetarium cutscene to ensure it won't trigger seizures.
|
|
0x2409003E, # ADDIU T1, R0, 0x003E
|
|
0x1509000C, # BNE T0, T1, [forward 0x0C]
|
|
0x00000000, # NOP
|
|
0xAF200C5C, # SW R0, 0x0C5C
|
|
0xAF200CD0, # SW R0, 0x0CD0
|
|
0xAF200C64, # SW R0, 0x0C64
|
|
0xAF200C74, # SW R0, 0x0C74
|
|
0xAF200C80, # SW R0, 0x0C80
|
|
0xAF200C88, # SW R0, 0x0C88
|
|
0xAF200C90, # SW R0, 0x0C90
|
|
0xAF200C9C, # SW R0, 0x0C9C
|
|
0xAF200CB4, # SW R0, 0x0CB4
|
|
0xAF200CC8, # SW R0, 0x0CC8
|
|
0x03200008, # JR T9
|
|
0x24090134, # ADDIU T1, R0, 0x0134
|
|
0x15090005, # BNE T0, T1, [forward 0x05]
|
|
0x340B8040, # ORI T3, R0, 0x8040
|
|
0x340CDD20, # ORI T4, R0, 0xDD20
|
|
0xA72B1D1E, # SH T3, 0x1D1E (T9)
|
|
0xA72C1D22, # SH T4, 0x1D22 (T9)
|
|
0x03200008, # JR T9
|
|
# Make the Ice Trap model check branch properly
|
|
0x24090125, # ADDIU T1, R0, 0x0125
|
|
0x15090003, # BNE T0, T1, [forward 0x03]
|
|
0x3C0B3C19, # LUI T3, 0x3C19
|
|
0x356B803F, # ORI T3, T3, 0x803F
|
|
0xAF2B04D0, # SW T3, 0x04D0 (T9)
|
|
0x03200008 # JR T9
|
|
]
|
|
|
|
double_component_checker = [
|
|
# When checking to see if a bomb component can be placed at a cracked wall, this will run if the code lands at the
|
|
# "no need to set 2" outcome to see if the other can be set.
|
|
|
|
# Mandragora checker
|
|
0x10400007, # BEQZ V0, [forward 0x07]
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x31098000, # ANDI T1, T0, 0x8000
|
|
0x15200008, # BNEZ T1, [forward 0x08]
|
|
0x91499C5D, # LBU T1, 0x9C5D (T2)
|
|
0x11200006, # BEQZ T1, 0x80183938
|
|
0x00000000, # NOP
|
|
0x10000007, # B [forward 0x07]
|
|
0x31E90100, # ANDI T1, T7, 0x0100
|
|
0x15200002, # BNEZ T1, [forward 0x02]
|
|
0x91499C5D, # LBU T1, 0x9C5D (T2)
|
|
0x15200003, # BNEZ T1, [forward 0x03]
|
|
0x3C198000, # LUI T9, 0x8000
|
|
0x27391590, # ADDIU T9, T9, 0x1590
|
|
0x03200008, # JR T9
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0xA4E9004C, # SH T1, 0x004C (A3)
|
|
0x3C190E00, # LUI T9, 0x0E00
|
|
0x273903E0, # ADDIU T9, T9, 0x03E0
|
|
0x03200008, # JR T9
|
|
0x00000000, # NOP
|
|
# Nitro checker
|
|
0x10400007, # BEQZ V0, [forward 0x07]
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x31694000, # ANDI T1, T3, 0x4000
|
|
0x15200008, # BNEZ T1, [forward 0x08]
|
|
0x91499C5C, # LBU T1, 0x9C5C
|
|
0x11200006, # BEQZ T1, [forward 0x06]
|
|
0x00000000, # NOP
|
|
0x1000FFF4, # B [backward 0x0B]
|
|
0x914F9C18, # LBU T7, 0x9C18 (T2)
|
|
0x31E90002, # ANDI T1, T7, 0x0002
|
|
0x1520FFEC, # BNEZ T1, [backward 0x13]
|
|
0x91499C5C, # LBU T1, 0x9C5C (T2)
|
|
0x1520FFEF, # BNEZ T1, [backward 0x15]
|
|
0x00000000, # NOP
|
|
0x1000FFE8, # B [backward 0x17]
|
|
0x00000000, # NOP
|
|
]
|
|
|
|
downstairs_seal_checker = [
|
|
# This will run specifically for the downstairs crack to see if the seal has been removed before then deciding to
|
|
# let the player set the bomb components or not. An anti-dick measure, since there is a limited number of each
|
|
# component per world.
|
|
0x14400004, # BNEZ V0, [forward 0x04]
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x914A9C18, # LBU T2, 0x9C18 (T2)
|
|
0x314A0001, # ANDI T2, T2, 0x0001
|
|
0x11400003, # BEQZ T2, [forward 0x03]
|
|
0x3C198000, # LUI T9, 0x8000
|
|
0x27391448, # ADDIU T9, T9, 0x1448
|
|
0x03200008, # JR T9
|
|
0x3C190E00, # LUI T9, 0x0E00
|
|
0x273902B4, # ADDIU T9, T9, 0x02B4
|
|
0x03200008, # JR T9
|
|
0x00000000, # NOP
|
|
]
|
|
|
|
map_data_modifiers = [
|
|
# Overwrites the map data table on-the-fly after it loads and before the game reads it to load objects. Good for
|
|
# changing anything that is part of a compression chain in the ROM data, including some freestanding item IDs.
|
|
# Also jumps to the function that overwrites the "Restart this stage" data if entering through the back of a level.
|
|
|
|
0x08006DAA, # J 0x8001B6A8
|
|
0x00000000, # NOP
|
|
# Demo checker (if we're in a title demo, don't do any of this)
|
|
0x3C028034, # LUI V0, 0x8034
|
|
0x9449244A, # LHU T1, 0x244A (V0)
|
|
0x11200002, # BEQZ T1, [forward 0x02]
|
|
# Zero checker (if there are zeroes in the word at 0x8034244A, where the entity list address is stored, don't do
|
|
# any of this either)
|
|
0x8C422B00, # LW V0, 0x2B00 (V0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
0x14400002, # BNEZ V0, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91199EE3, # LBU T9, 0x9EE3 (T0)
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
# Forest of Silence (replaces 1 invisible chicken)
|
|
0x15000006, # BNEZ T0, [forward 0x06]
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Werewolf plaque
|
|
0xA44A01C8, # SH T2, 0x01C8 (V0)
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0x1139FFED, # BEQ T1, T9, [backward 0x12]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Villa front yard (replaces 1 moneybag and 2 beefs)
|
|
0x24090003, # ADDIU T1, R0, 0x0003
|
|
0x15090008, # BNE T0, T1, [forward 0x08]
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Fountain FL
|
|
0x340B0001, # ORI T3, R0, 0x0001 <- Fountain RL
|
|
0x340C001F, # ORI T4, R0, 0x0001 <- Dog food gate
|
|
0xA44A0058, # SH T2, 0x0058 (V0)
|
|
0xA44B0038, # SH T3, 0x0038 (V0)
|
|
0xA44C0068, # SH T4, 0x0068 (V0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Villa living area (Replaces 1 chicken, 1 knife, and 3 invisible Purifyings and assigns flags to the sub-weapons)
|
|
0x24090005, # ADDIU T1, R0, 0x0005
|
|
0x15090025, # BNE T0, T1, [forward 0x25]
|
|
0x340B0010, # ORI T3, R0, 0x0001 <- Hallway axe
|
|
0xA44B00B8, # SH T3, 0x00B8 (V0)
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Storeroom R
|
|
0x340B0010, # ORI T3, R0, 0x0001 <- Hallway knife
|
|
0x340C0001, # ORI T4, R0, 0x0001 <- Living Room painting
|
|
0x340D0001, # ORI T5, R0, 0x0001 <- Dining Room vase
|
|
0x340E0001, # ORI T6, R0, 0x0001 <- Archives table
|
|
0xA44A0078, # SH T2, 0x0078 (V0)
|
|
0xA44B00C8, # SH T3, 0x00C8 (V0)
|
|
0xA44C0108, # SH T4, 0x0108 (V0)
|
|
0xA44D0128, # SH T5, 0x0128 (V0)
|
|
0xA44E0138, # SH T6, 0x0138 (V0)
|
|
0x340A0000, # ORI T2, R0, 0x0000 <- Sub-weapons left flag half
|
|
0xA44A009C, # SH T2, 0x009C (V0)
|
|
0xA44A00AC, # SH T2, 0x00AC (V0)
|
|
0xA44A00BC, # SH T2, 0x00BC (V0)
|
|
0xA44A00CC, # SH T2, 0x00CC (V0)
|
|
0x340A0000, # ORI T2, R0, 0x0000 <- Sub-weapons right flag halves
|
|
0x240B0000, # ADDIU T3, R0, 0x0000
|
|
0x240C0000, # ADDIU T4, R0, 0x0000
|
|
0x240D0000, # ADDIU T5, R0, 0x0000
|
|
0xA44A00CA, # SH T2, 0x00CA (V0)
|
|
0xA44B00BA, # SH T3, 0x00BA (V0)
|
|
0xA44C009A, # SH T4, 0x009A (V0)
|
|
0xA44D00AA, # SH T5, 0x00AA (V0)
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Near bed
|
|
0x340B0010, # ORI T3, R0, 0x0001 <- Storeroom L
|
|
0x340C0001, # ORI T4, R0, 0x0001 <- Storeroom statue
|
|
0x340D0001, # ORI T5, R0, 0x0001 <- Exit knight
|
|
0x340E0001, # ORI T6, R0, 0x0001 <- Sitting room table
|
|
0xA44A0048, # SH T2, 0x0078 (V0)
|
|
0xA44B0088, # SH T3, 0x00C8 (V0)
|
|
0xA44C00D8, # SH T4, 0x0108 (V0)
|
|
0xA44D00F8, # SH T5, 0x0128 (V0)
|
|
0xA44E0118, # SH T6, 0x0138 (V0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Tunnel (replaces 1 invisible Cure Ampoule)
|
|
0x24090007, # ADDIU T1, R0, 0x0007
|
|
0x1509000A, # BNE T0, T1, [forward 0x0A]
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Twin arrow signs
|
|
0xA44A0268, # SH T2, 0x0268 (V0)
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Bucket
|
|
0xA44A0258, # SH T2, 0x0258 (V0)
|
|
0x240B0005, # ADDIU T3, R0, 0x0005
|
|
0xA04B0150, # SB T3, 0x0150 (V0)
|
|
0x24090011, # ADDIU T1, R0, 0x0011
|
|
0x1139FFB0, # BEQ T1, T9, [backward 0x50]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Castle Center factory floor (replaces 1 moneybag, 1 jewel, and gives every lizard man coffin item a unique flag)
|
|
0x2409000B, # ADDIU T1, R0, 0x000B
|
|
0x15090016, # BNE T0, T1, [forward 0x16]
|
|
0x340A001A, # ORI T2, R0, 0x001A <- Lizard coffin nearside mid-right
|
|
0x340B0003, # ORI T3, R0, 0x0003 <- Lizard coffin nearside mid-left
|
|
0xA44A00C8, # SH T2, 0x00C8 (V0)
|
|
0xA44B00D8, # SH T3, 0x00D8 (V0)
|
|
0x240A1000, # ADDIU T2, R0, 0x1000
|
|
0x240B2000, # ADDIU T3, R0, 0x2000
|
|
0x240C0400, # ADDIU T4, R0, 0x0400
|
|
0x240D0800, # ADDIU T5, R0, 0x0800
|
|
0x240E0200, # ADDIU T6, R0, 0x0200
|
|
0x240F0100, # ADDIU T7, R0, 0x0100
|
|
0xA44A009A, # SH T2, 0x009A (V0)
|
|
0xA44B00AA, # SH T3, 0x00AA (V0)
|
|
0xA44C00CA, # SH T4, 0x00CA (V0)
|
|
0xA44D00BA, # SH T5, 0x00BA (V0)
|
|
0xA44E00DA, # SH T6, 0x00DA (V0)
|
|
0xA44F00EA, # SH T7, 0x00EA (V0)
|
|
0x340A0017, # ORI T2, R0, 0x0017 <- Lizard coffin nearside mid-right
|
|
0x340B000C, # ORI T3, R0, 0x000C <- Lizard coffin nearside mid-left
|
|
0xA44A00A8, # SH T2, 0x00C8 (V0)
|
|
0xA44B00E8, # SH T3, 0x00D8 (V0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Duel Tower (replaces a flame on top of a rotating lion pillar with a White Jewel on the invisible bridge ledge)
|
|
0x24090013, # ADDIU T1, R0, 0x0013
|
|
0x1509000F, # BNE T0, T1, [forward 0x0F]
|
|
0x3C0A00B9, # LUI T2, 0x00BB
|
|
0x254A012B, # ADDIU T2, T2, 0x012B
|
|
0x3C0BFE2A, # LUI T3, 0xFE2A
|
|
0x256B0027, # ADDIU T3, T3, 0x0027
|
|
0x3C0C0001, # LUI T4, 0x0001
|
|
0x3C0D0022, # LUI T5, 0x0022
|
|
0x25AD0100, # ADDIU T5, T5, 0x0100
|
|
0xAC4A0A80, # SW T2, 0x0AE0 (V0)
|
|
0xAC4B0A84, # SW T3, 0x0AE4 (V0)
|
|
0xAC4C0A88, # SW T4, 0x0AE8 (V0)
|
|
0xAC4D0A8C, # SW T5, 0x0AEC (V0)
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0x1139FF87, # BEQ T1, T9, [backward 0x77]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Castle Keep outside (replaces 1 invisible Healing Kit and gives both invisible Healing Kits pickup flags)
|
|
0x24090014, # ADDIU T1, R0, 0x0014
|
|
0x1509000A, # BNE T0, T1, [forward 0x0A]
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Right flame
|
|
0xA44A0058, # SH T2, 0x0058 (V0)
|
|
0x240A0001, # ADDIU T2, R0, 0x0001
|
|
0x240B0002, # ADDIU T3, R0, 0x0002
|
|
0xA44A004A, # SH T2, 0x004A (V0)
|
|
0xA44B005A, # SH T3, 0x005A (V0)
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x1139FF7B, # BEQ T0, T1, [backward 0x74]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Castle Wall main area (sets a flag for the freestanding Holy Water if applicable and the "beginning of stage"
|
|
# state if entered from the rear)
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x15090006, # BNE T0, T1, [forward 0x06]
|
|
0x24090000, # ADDIU T1, R0, 0x0000
|
|
0xA049009B, # SB T1, 0x009B (V0)
|
|
0x24090010, # ADDIU T1, R0, 0x0010
|
|
0x1139FF73, # BEQ T1, T9, [backward 0x8D]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Villa vampire crypt (sets the "beginning of stage" state if entered from the rear, as well as the "can warp here"
|
|
# flag if arriving for the first time)
|
|
0x2409001A, # ADDIU T1, R0, 0x001A
|
|
0x15090008, # BNE T0, T1, [forward 0x08]
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x914B9C1C, # LBU T3, 0x9C1C (T2)
|
|
0x356B0001, # ORI T3, T3, 0x0001
|
|
0xA14B9C1C, # SB T3, 0x9C1C (T2)
|
|
0x24090003, # ADDIU T1, R0, 0x0003
|
|
0x1139FF69, # BEQ T1, T9, [backward 0x98]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Underground Waterway (sets the "beginning of stage" state if entered from the rear)
|
|
0x24090008, # ADDIU T1, R0, 0x0008
|
|
0x15090004, # BNE T0, T1, [forward 0x04]
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0x1139FF63, # BEQ T1, T9, [backward 0x9F]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Castle Center elevator top (sets the "beginning of stage" state if entered from either rear, as well as the "can
|
|
# warp here" flag if arriving for the first time)
|
|
0x2409000F, # ADDIU T1, R0, 0x000F
|
|
0x1509000A, # BNE T0, T1, [forward 0x0A]
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x914B9C1C, # LBU T3, 0x9C1C (T2)
|
|
0x356B0002, # ORI T3, T3, 0x0002
|
|
0xA14B9C1C, # SB T3, 0x9C1C (T2)
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x1139FF59, # BEQ T1, T9, [backward 0xAA]
|
|
0x24090003, # ADDIU T1, R0, 0x0003
|
|
0x1139FF57, # BEQ T1, T9, [backward 0xAC]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Tower of Execution (sets the "beginning of stage" state if entered from the rear)
|
|
0x24090010, # ADDIU T1, R0, 0x0010
|
|
0x15090004, # BNE T0, T1, [forward 0x10]
|
|
0x24090012, # ADDIU T1, R0, 0x0012
|
|
0x1139FF51, # BEQ T1, T9, [backward 0xAF]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Tower of Sorcery (sets the "beginning of stage" state if entered from the rear)
|
|
0x24090011, # ADDIU T1, R0, 0x0011
|
|
0x15090004, # BNE T0, T1, [forward 0x04]
|
|
0x24090013, # ADDIU T1, R0, 0x0013
|
|
0x1139FF4B, # BEQ T1, T9, [backward 0xBA]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Tower of Science (sets the "beginning of stage" state if entered from the rear)
|
|
0x24090012, # ADDIU T1, R0, 0x0012
|
|
0x15090004, # BNE T0, T1, [forward 0x04]
|
|
0x24090004, # ADDIU T1, R0, 0x0004
|
|
0x1139FF45, # BEQ T1, T9, [backward 0xC1]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Room of Clocks (changes 2 candle settings if applicable and sets the "begging of stage" state if spawning at end)
|
|
0x2409001B, # ADDIU T1, R0, 0x001B
|
|
0x15090008, # BNE T0, T1, [forward 0x08]
|
|
0x24090006, # ADDIU T1, R0, 0x0006
|
|
0x240A0006, # ADDIU T2, R0, 0x0006
|
|
0xA0490059, # SB T1, 0x0059 (V0)
|
|
0xA04A0069, # SB T2, 0x0069 (V0)
|
|
0x24090014, # ADDIU T1, R0, 0x0014
|
|
0x1139FF3B, # BEQ T1, T9, [backward 0xCC]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
# Castle Center basement (changes 2 non-pickup-able Mandragoras into 2 real items and moves the torture shelf item
|
|
# forward slightly if it's turned visible)
|
|
0x24090009, # ADDIU T1, R0, 0x0009
|
|
0x15090011, # BNE T0, T1, [forward 0x11]
|
|
0x3409FFFC, # ORI T1, R0, 0xFFFC
|
|
0xA44907C0, # SH T1, 0x07C0 (V0)
|
|
0xA44907D0, # SH T1, 0x07D0 (V0)
|
|
0x240A0027, # ADDIU T2, R0, 0x0027
|
|
0xA44A07C6, # SH T2, 0x07C6 (V0)
|
|
0xA44A07D6, # SH T2, 0x07D6 (V0)
|
|
0x340B0001, # ORI T3, R0, 0x0001 <- Right Mandragora
|
|
0x340C0001, # ORI T4, R0, 0x0001 <- Left Mandragora
|
|
0xA44B07C8, # SH T3, 0x07C8 (V0)
|
|
0xA44C07D8, # SH T4, 0x07D8 (V0)
|
|
0x240D00F5, # ADDIU T5, R0, 0x00F5
|
|
0xA04D06D1, # SB T5, 0x06D1 (V0)
|
|
0x24090040, # ADDIU T1, R0, 0x0040
|
|
0x240A0080, # ADDIU T2, R0, 0x0080
|
|
0xA04907CA, # SB T1, 0x07CA (V0)
|
|
0xA04A07DA, # SB T2, 0x07DA (V0)
|
|
0x03E00008, # JR RA
|
|
# Castle Center nitro area (changes 2 non-pickup-able Nitros into 2 real items)
|
|
0x2409000E, # ADDIU T1, R0, 0x000E
|
|
0x15090015, # BNE T0, T1, [forward 0x15]
|
|
0x240900C0, # ADDIU T1, R0, 0x00C0
|
|
0x240A00CE, # ADDIU T2, R0, 0x00CE
|
|
0xA0490471, # SB T1, 0x0471 (V0)
|
|
0xA04A04A1, # SB T2, 0x04A1 (V0)
|
|
0x24090027, # ADDIU T1, R0, 0x0027
|
|
0xA4490476, # SH T1, 0x0476 (V0)
|
|
0xA44904A6, # SH T1, 0x04A6 (V0)
|
|
0x340A0001, # ORI T2, R0, 0x0001 <- Invention-side shelf
|
|
0x340B0001, # ORI T3, R0, 0x0001 <- Heinrich-side shelf
|
|
0xA44A0478, # SH T2, 0x0478 (V0)
|
|
0xA44B04A8, # SH T3, 0x04A8 (V0)
|
|
0x24090080, # ADDIU T1, R0, 0x0080
|
|
0xA049047A, # SB T1, 0x047A (V0)
|
|
0xA440047C, # SH R0, 0x047C (V0)
|
|
0x240A0400, # ADDIU T2, R0, 0x0400
|
|
0x340BFF05, # ORI T3, R0, 0xFF05
|
|
0xA44A04AA, # SH T2, 0x04AA (V0)
|
|
0xA44B04AC, # SH T3, 0x04AC (V0)
|
|
0x24090046, # ADDIU T1, R0, 0x0046
|
|
0xA04904A3, # SB T1, 0x04A3 (V0)
|
|
0x03E00008, # JR RA
|
|
# Fan meeting room (sets "beginning of stage" flag)
|
|
0x24090019, # ADDIU T1, R0, 0x0019
|
|
0x1109FF0D, # BEQ T1, T9, [backward 0xFB]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
]
|
|
|
|
renon_cutscene_checker = [
|
|
# Prevents Renon's departure/pre-fight cutscene from playing if the player is either in the escape sequence or both
|
|
# did not spend the required 30K to fight him and lacks the required Special2s to fight Dracula.
|
|
0x15810002, # BNE T4, AT, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08049EB3, # J 0x80127ACC
|
|
0x24090016, # ADDIU T1, R0, 0x0016
|
|
0x11C90002, # BEQ T6, T1, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08049ECA, # J 0x80127B28
|
|
0x24190000, # ADDIU T9, R0, 0x0000
|
|
0x8C696208, # LW T1, 0x6208 (V1)
|
|
0x292A7531, # SLTI T2, T1, 0x7531
|
|
0x51400001, # BEQZL T2, [forward 0x01]
|
|
0x24190001, # ADDIU T9, R0, 0x0001
|
|
0x3C0B8013, # LUI T3, 0x8013
|
|
0x916BAC9F, # LBU T3, 0xAC9F (T3)
|
|
0x906C6194, # LBU T4, 0x6194 (V1)
|
|
0x018B502A, # SLT T2, T4, T3
|
|
0x51400001, # BEQZL T2, [forward 0x01]
|
|
0x24190001, # ADDIU T9, R0, 0x0001
|
|
0x90696142, # LBU T1, 0x6142 (V1)
|
|
0x31290002, # ANDI T1, T1, 0x0002
|
|
0x55200001, # BNEZL T1, [forward 0x01]
|
|
0x24190000, # ADDIU T9, R0, 0x0000
|
|
0x17200003, # BNEZ T9, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x08049ECC, # J 0x80127B30
|
|
0x00000000, # NOP
|
|
0x08049ECA # J 0x80127B28
|
|
]
|
|
|
|
renon_cutscene_checker_jr = [
|
|
# Like renon_cutscene_checker, but without the checks for the Special2 and spent money counters. Inserted instead if
|
|
# the player chooses to guarantee or disable the Renon fight on their YAML.
|
|
0x15810002, # BNE T4, AT, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08049EB3, # J 0x80127ACC
|
|
0x24090016, # ADDIU T1, R0, 0x0016
|
|
0x11C90002, # BEQ T6, T1, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08049ECA, # J 0x80127B28
|
|
0x24190001, # ADDIU T9, R0, 0x0001
|
|
0x90696142, # LBU T1, 0x6142 (V1)
|
|
0x31290002, # ANDI T1, T1, 0x0002
|
|
0x55200001, # BNEZL T1, [forward 0x01]
|
|
0x24190000, # ADDIU T9, R0, 0x0000
|
|
0x17200003, # BNEZ T9, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x08049ECC, # J 0x80127B30
|
|
0x00000000, # NOP
|
|
0x08049ECA # J 0x80127B28
|
|
]
|
|
|
|
ck_door_music_player = [
|
|
# Plays Castle Keep's song if you spawn in front of Dracula's door (teleporting via the warp menu) and haven't
|
|
# started the escape sequence yet.
|
|
0x17010002, # BNE T8, AT, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08063DF9, # J 0x8018F7E4
|
|
0x240A0000, # ADDIU T2, R0, 0x0000
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089BFA, # LBU T0, 0x9BFA (T0)
|
|
0x31080002, # ANDI T0, T0, 0x0002
|
|
0x51090001, # BEQL T0, T1, [forward 0x01]
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x24080003, # ADDIU T0, R0, 0x0003
|
|
0x51180001, # BEQL T0, T8, [forward 0x01]
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x240B0002, # ADDIU T3, R0, 0x0002
|
|
0x114B0002, # BEQ T2, T3, [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x08063DFD, # J 0x8018F7F4
|
|
0x00000000, # NOP
|
|
0x08063DF9 # J 0x8018F7E4
|
|
]
|
|
|
|
dracula_door_text_redirector = [
|
|
# Switches the standard pointer to the map text with one to a custom message for Dracula's chamber door if the
|
|
# current scene is Castle Keep exterior (Scene 0x14).
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
0x24090014, # ADDIU T1, R0, 0x0014
|
|
0x15090006, # BNE T0, T1, [forward 0x06]
|
|
0x3C088014, # LUI T0, 0x8014
|
|
0x2508B9F4, # ADDIU T0, T0, 0xB9F4
|
|
0x151F0003, # BNE T0, RA, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x3C028040, # LUI V0, 0x8040
|
|
0x2442CC48, # ADDIU V0, V0, 0xCC48
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
coffin_time_checker = [
|
|
# When entering the Villa coffin, this will check to see whether it's day or night and send you to either the Tunnel
|
|
# or Underground Waterway level slot accordingly regardless of which character you are
|
|
0x28490006, # SLTI T1, V0, 0x0006
|
|
0x15200005, # BNEZ T1, [forward 0x05]
|
|
0x28490012, # SLTI T1, V0, 0x0012
|
|
0x11200003, # BEQZ T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x08055AEB, # J 0x80156BAC
|
|
0x00000000, # NOP
|
|
0x08055AED # J 0x80156BB4
|
|
]
|
|
|
|
werebull_flag_unsetter = [
|
|
# This will un-set Were-bull's defeat flag in Duel Tower after beating him so that the check above his arena can
|
|
# still be acquired later, if it hasn't been acquired already. This is the only check in the entire game that can be
|
|
# permanently missed even with the ability to return to levels.
|
|
0x3C0E0400, # LUI T6, 0x0400
|
|
0x15CF0006, # BNE T6, T7, [forward 0x06]
|
|
0x00187402, # SRL T6, T8, 16
|
|
0x31CE2000, # ANDI T6, T6, 0x2000
|
|
0x15C00003, # BNEZ T6, [forward 0x03]
|
|
0x3C0E0020, # LUI T6, 0x0020
|
|
0x014E5025, # OR T2, T2, T6
|
|
0xAC4A613C, # SW T2, 0x613C (V0)
|
|
0x03200008 # JR T9
|
|
]
|
|
|
|
werebull_flag_unsetter_special2_electric_boogaloo = [
|
|
# Like werebull_flag_unsetter, but with the added feature of awarding a Special2 after determining the player isn't
|
|
# trying to beat Were-bull twice! This will be inserted over the former if the goal is set to boss hunt.
|
|
0x3C0E0400, # LUI T6, 0x0400
|
|
0x15CF0008, # BNE T6, T7, [forward 0x06]
|
|
0x00187402, # SRL T6, T8, 16
|
|
0x31CE2000, # ANDI T6, T6, 0x2000
|
|
0x15C00005, # BNEZ T6, [forward 0x05]
|
|
0x3C0E0020, # LUI T6, 0x0020
|
|
0x014EC024, # AND T8, T2, T6
|
|
0x014E5025, # OR T2, T2, T6
|
|
0xAC4A613C, # SW T2, 0x613C (V0)
|
|
0x17000003, # BNEZ T8, [forward 0x03]
|
|
0x3C188039, # LUI T8, 0x8039
|
|
0x240E0005, # ADDIU T6, R0, 0x0005
|
|
0xA30E9BDF, # SB T6, 0x9BDF (T8)
|
|
0x03200008 # JR T9
|
|
]
|
|
|
|
werebull_flag_pickup_setter = [
|
|
# Checks to see if an item being picked up is the one on top of Were-bull's arena. If it is, then it'll check to see
|
|
# if our makeshift "Were-bull defeated once" flag and, if it is, set Were-bull's arena flag proper, so it'll
|
|
# permanently stay down.
|
|
0x3C088038, # LUI T0, 0x8038
|
|
0x25083AC8, # ADDIU T0, T0, 0x3AC8
|
|
0x15020007, # BNE T0, V0, [forward 0x07]
|
|
0x3C082000, # LUI T0, 0x2000
|
|
0x15040005, # BNE T0, A0, [forward 0x05]
|
|
0x9449612C, # LHU T1, 0x612C (V0)
|
|
0x31290020, # ANDI T1, T1, 0x0020
|
|
0x11200002, # BEQZ T1, [forward 0x02]
|
|
0x3C0A0400, # LUI T2, 0x0400
|
|
0x014D6825, # OR T5, T2, T5
|
|
0xAC4D612C, # SW T5, 0x612C (V0)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
boss_special2_giver = [
|
|
# Enables the rewarding of Special2s upon the vanishing of a boss's health bar when defeating it.
|
|
|
|
# Also sets a flag in the case of the Castle Wall White Dragons' health bar going away. Their defeat flag in vanilla
|
|
# is tied to hitting the lever after killing them, so this alternate flag is used to track them for the "All Bosses"
|
|
# goal in the event someone kills them and then warps out opting to not be a Konami pachinko champ.
|
|
0x3C118035, # LUI S1, 0x8035
|
|
0x962DF834, # LHU T5, 0xF834 (S1)
|
|
0x240E3F73, # ADDIU T6, R0, 0x3F73
|
|
0x15AE0012, # BNE T5, T6, [forward 0x12]
|
|
0x3C118039, # LUI S1, 0x8039
|
|
0x922D9EE1, # LBU T5, 0x9EE1 (S1)
|
|
0x240E0013, # ADDIU T6, R0, 0x0013
|
|
0x11AE000E, # BEQ T5, T6, [forward 0x0E]
|
|
0x922F9BFA, # LBU T7, 0x9BFA (S1)
|
|
0x31EF0001, # ANDI T7, T7, 0x0001
|
|
0x15E0000B, # BNEZ T7, [forward 0x0B]
|
|
0x240E0002, # ADDIU T6, R0, 0x0002
|
|
0x15AE0006, # BNE T5, T6, [forward 0x06]
|
|
0x00000000, # NOP
|
|
0x862F9BF4, # LH T7, 0x9BF4 (S1)
|
|
0x31ED0080, # ANDI T5, T7, 0x0080
|
|
0x15A00005, # BNEZ T5, [forward 0x05]
|
|
0x35EF0080, # ORI T7, T7, 0x0080
|
|
0xA62F9BF4, # SH T7, 0x9BF4 (S1)
|
|
0x240D0005, # ADDIU T5, R0, 0x0005
|
|
0xA22D9BDF, # SB T5, 0x9BDF (S1)
|
|
0xA22D9BE0, # SB T5, 0x9BE0 (S1)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
boss_goal_checker = [
|
|
# Checks each boss flag to see if every boss with a health meter has been defeated and puts 0x0004 in V0 to
|
|
# disallow opening Dracula's door if not all have been.
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x954B9BF4, # LHU T3, 0x9BF4 (T2)
|
|
0x316D0BA0, # ANDI T5, T3, 0x0BA0
|
|
0x914B9BFB, # LBU T3, 0x9BFB (T2)
|
|
0x000B6182, # SRL T4, T3, 6
|
|
0x11800010, # BEQZ T4, [forward 0x10]
|
|
0x240C00C0, # ADDIU T4, R0, 0x00C0
|
|
0x01AC6821, # ADDU T5, T5, T4
|
|
0x914B9BFD, # LBU T3, 0x9BFD (T2)
|
|
0x316C0020, # ANDI T4, T3, 0x0020
|
|
0x01AC6821, # ADDU T5, T5, T4
|
|
0x914B9BFE, # LBU T3, 0x9BFE (T2)
|
|
0x316C0010, # ANDI T4, T3, 0x0010
|
|
0x01AC6821, # ADDU T5, T5, T4
|
|
0x914B9C18, # LBU T3, 0x9C18 (T2)
|
|
0x316C0010, # ANDI T4, T3, 0x0010
|
|
0x01AC6821, # ADDU T5, T5, T4
|
|
0x914B9C1B, # LBU T3, 0x9C1B (T2)
|
|
0x000B6102, # SRL T4, T3, 4
|
|
0x11800005, # BEQZ T4, [forward 0x05]
|
|
0x240C0050, # ADDIU T4, R0, 0x0050
|
|
0x01AC6821, # ADDU T5, T5, T4
|
|
0x240E0CF0, # ADDIU T6, R0, 0x0CF0
|
|
0x55CD0001, # BNEL T6, T5, [forward 0x01]
|
|
0x24020004, # ADDIU V0, R0, 0x0004
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
special_goal_checker = [
|
|
# Checks the Special2 counter to see if the specified threshold has been reached and puts 0x0001 in V0 to disallow
|
|
# opening Dracula's door if it hasn't been.
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x914B9C4C, # LBU T3, 0x9C4C (T2)
|
|
0x296A001E, # SLTI T2, T3, 0x001E
|
|
0x55400001, # BNEZL T2, 0x8012AC8C
|
|
0x24020001, # ADDIU V0, R0, 0x0001
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
warp_menu_rewrite = [
|
|
# Rewrite to the warp menu code to ensure each option can have its own scene ID, spawn ID, and fade color.
|
|
# Start Warp
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x1000001F, # B [forward 0x1F]
|
|
0x3C0F8000, # LUI T7, 0x8000
|
|
# Warp 1
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x1000001B, # B [forward 0x1B]
|
|
0x3C0F8040, # LUI T7, 0x8040
|
|
# Warp 2
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x10000017, # B [forward 0x17]
|
|
0x3C0F8080, # LUI T7, 0x8080
|
|
# Warp 3
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x10000013, # B [forward 0x13]
|
|
0x3C0F0080, # LUI T7, 0x0080
|
|
# Warp 4
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x3C0F0080, # LUI T7, 0x0080
|
|
0x1000000E, # B [forward 0x0E]
|
|
0x25EF8000, # ADDIU T7, T7, 0x8000
|
|
# Warp 5
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x1000000A, # B [forward 0x0A]
|
|
0x340F8000, # ORI T7, R0, 0x8000
|
|
# Warp 6
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x3C0F8000, # LUI T7, 0x8000
|
|
0x10000005, # B [forward 0x05]
|
|
0x35EF8000, # ORI T7, T7, 0x8000
|
|
# Warp 7
|
|
0x3C0E0000, # LUI T6, 0x0000
|
|
0x25CE0000, # ADDIU T6, T6, 0x0000
|
|
0x3C0F8040, # LUI T7, 0x8040
|
|
0x35EF8000, # ORI T7, T7, 0x8000
|
|
# Warp Crypt
|
|
0x3C18800D, # LUI T8, 0x800D
|
|
0x97185E20, # LHU T8, 0x5E20 (T8)
|
|
0x24192000, # ADDIU T9, R0, 0x2000
|
|
0x17190009, # BNE T8, T9, [forward 0x09]
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089C1C, # LBU T0, 0x9C1C (T0)
|
|
0x31080001, # ANDI T0, T0, 0x0001
|
|
0x1100000F, # BEQZ T0, [forward 0x0F]
|
|
0x00000000, # NOP
|
|
0x3C0E001A, # LUI T6, 0x001A
|
|
0x25CE0003, # ADDIU T6, T6, 0x0003
|
|
0x1000000B, # B [forward 0x0B]
|
|
0x240F0000, # ADDIU T7, R0, 0x0000
|
|
# Warp Elevator
|
|
0x24190010, # ADDIU T9, R0, 0x0010
|
|
0x17190008, # BNE T8, T9, [forward 0x08]
|
|
0x91089C1C, # LBU T0, 0x9C1C (T0)
|
|
0x31080002, # ANDI T0, T0, 0x0002
|
|
0x11000005, # BEQZ T0, [forward 0x05]
|
|
0x00000000, # NOP
|
|
0x3C0E000F, # LUI T6, 0x000F
|
|
0x25CE0001, # ADDIU T6, T6, 0x0001
|
|
0x3C0F8080, # LUI T7, 0x8080
|
|
0x35EF8000, # ORI T7, T7, 0x8000
|
|
# All
|
|
0xAC6E6428, # SW T6, 0x6428 (V1)
|
|
0xAC6F642C, # SW T7, 0x642C (V1)
|
|
0x2402001E, # ADDIU V0, R0, 0x001E
|
|
0xA4626430, # SH V0, 0x6430 (V1)
|
|
0xA4626432, # SH V0, 0x6432 (V1)
|
|
]
|
|
|
|
warp_pointer_table = [
|
|
# Changed pointer table addresses to go with the warp menu rewrite
|
|
0x8012AD74,
|
|
0x8012AD84,
|
|
0x8012AD94,
|
|
0x8012ADA4,
|
|
0x8012ADB4,
|
|
0x8012ADC8,
|
|
0x8012ADD8,
|
|
0x8012ADEC,
|
|
]
|
|
|
|
spawn_coordinates_extension = [
|
|
# Checks if the 0x10 bit is set in the spawn ID and references the below list of custom spawn coordinates if it is.
|
|
0x316A0010, # ANDI T2, T3, 0x0010
|
|
0x11400003, # BEQZ T2, [forward 0x03]
|
|
0x8CD90008, # LW T9, 0x0008 (A2)
|
|
0x3C198040, # LUI T9, 0x8040
|
|
0x2739C2CC, # ADDIU T9, T9, 0xC2CC
|
|
0x08054A83, # J 0x80152A0C
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
|
|
# Castle Wall end: 10
|
|
# player camera focus point
|
|
# x = 0xFFFF 0xFFFF 0xFFFF
|
|
# y = 0x0003 0x0012 0x000D
|
|
# z = 0xFFF3 0xEDFF 0xFFF3
|
|
# r = 0xC000
|
|
0x0000FFFF,
|
|
0x0003FFF3,
|
|
0xC000FFFF,
|
|
0x0012FFED,
|
|
0xFFFF000D,
|
|
0xFFF30000,
|
|
|
|
# Tunnel end: 11
|
|
# player camera focus point
|
|
# x = 0x0088 0x0087 0x0088
|
|
# y = 0x01D6 0x01F1 0x01E5
|
|
# z = 0xF803 0xF7D2 0xF803
|
|
# r = 0xC000
|
|
0x008801D6,
|
|
0xF803C000,
|
|
0x008701F1,
|
|
0xF7D20088,
|
|
0x01E5F803,
|
|
|
|
# Tower of Execution end: 12
|
|
# player camera focus point
|
|
# x = 0x00AC 0x00EC 0x00AC
|
|
# y = 0x0154 0x0183 0x0160
|
|
# z = 0xFE8F 0xFE8F 0xFE8F
|
|
# r = 0x8000
|
|
0x000000AC,
|
|
0x0154FE8F,
|
|
0x800000EC,
|
|
0x0183FE8F,
|
|
0x00AC0160,
|
|
0xFE8F0000,
|
|
|
|
# Tower of Sorcery end: 13
|
|
# player camera focus point
|
|
# x = 0xFEB0 0xFE60 0xFEB0
|
|
# y = 0x0348 0x036D 0x0358
|
|
# z = 0xFEFB 0xFEFB 0xFEFB
|
|
# r = 0x0000
|
|
0xFEB00348,
|
|
0xFEFB0000,
|
|
0xFE60036D,
|
|
0xFEFBFEB0,
|
|
0x0358FEFB,
|
|
|
|
# Room of Clocks end: 14
|
|
# player camera focus point
|
|
# x = 0x01B1 0x01BE 0x01B1
|
|
# y = 0x0006 0x001B 0x0015
|
|
# z = 0xFFCD 0xFFCD 0xFFCD
|
|
# r = 0x8000
|
|
0x000001B1,
|
|
0x0006FFCD,
|
|
0x800001BE,
|
|
0x001BFFCD,
|
|
0x01B10015,
|
|
0xFFCD0000,
|
|
|
|
# Duel Tower savepoint: 15
|
|
# player camera focus point
|
|
# x = 0x00B9 0x00B9 0x00B9
|
|
# y = 0x012B 0x0150 0x0138
|
|
# z = 0xFE20 0xFE92 0xFE20
|
|
# r = 0xC000
|
|
0x00B9012B,
|
|
0xFE20C000,
|
|
0x00B90150,
|
|
0xFE9200B9,
|
|
0x0138FE20
|
|
]
|
|
|
|
waterway_end_coordinates = [
|
|
# Underground Waterway end: 01
|
|
# player camera focus point
|
|
# x = 0x0397 0x03A1 0x0397
|
|
# y = 0xFFC4 0xFFDC 0xFFD3
|
|
# z = 0xFDB9 0xFDB8 0xFDB9
|
|
# r = 0x8000
|
|
0x00000397,
|
|
0xFFC4FDB9,
|
|
0x800003A1,
|
|
0xFFDCFDB8,
|
|
0x0397FFD3,
|
|
0xFDB90000
|
|
]
|
|
|
|
continue_cursor_start_checker = [
|
|
# This is used to improve the Game Over screen's "Continue" menu by starting the cursor on whichever checkpoint
|
|
# is most recent instead of always on "Previously saved". If a menu has a cursor start value of 0xFF in its text
|
|
# data, this will read the byte at 0x80389BC0 to determine which option to start the cursor on.
|
|
0x8208001C, # LB T0, 0x001C(S0)
|
|
0x05010003, # BGEZ T0, [forward 0x03]
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x81289BC0, # LB T0, 0x9BC0 (T1)
|
|
0xA208001C, # SB T0, 0x001C (S0)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
savepoint_cursor_updater = [
|
|
# Sets the value at 0x80389BC0 to 0x00 after saving to let the Game Over screen's "Continue" menu know to start the
|
|
# cursor on "Previously saved" as well as updates the entrance variable for B warping. It then jumps to
|
|
# deathlink_counter_decrementer in the event we're loading a save from the Game Over screen.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099C95, # LBU T1, 0x9C95 (T0)
|
|
0x000948C0, # SLL T1, T1, 3
|
|
0x3C0A8018, # LUI T2, 0x8018
|
|
0x01495021, # ADDU T2, T2, T1
|
|
0x914B17CF, # LBU T3, 0x17CF (T2)
|
|
0xA10B9EE3, # SB T3, 0x9EE3 (T0)
|
|
0xA1009BC0, # SB R0, 0x9BC0 (T0)
|
|
0x080FF8F0 # J 0x803FE3C0
|
|
]
|
|
|
|
stage_start_cursor_updater = [
|
|
# Sets the value at 0x80389BC0 to 0x01 after entering a stage to let the Game Over screen's "Continue" menu know to
|
|
# start the cursor on "Restart this stage".
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0xA1099BC0, # SB T1, 0x9BC0 (T0)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
elevator_flag_checker = [
|
|
# Prevents the top elevator in Castle Center from activating if the bottom elevator switch is not turned on.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089C07, # LBU T0, 0x9C07 (T0)
|
|
0x31080002, # ANDI T0, T0, 0x0002
|
|
0x15000002, # BNEZ T0, [forward 0x02]
|
|
0x848E004C, # LH T6, 0x004C (A0)
|
|
0x240E0000, # ADDIU T6, R0, 0x0000
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
crystal_special2_giver = [
|
|
# Gives a Special2 upon activating the big crystal in CC basement.
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x24190005, # ADDIU T9, R0, 0x0005
|
|
0xA1399BDF, # SB T9, 0x9BDF (T1)
|
|
0x03E00008, # JR RA
|
|
0x3C198000 # LUI T9, 0x8000
|
|
]
|
|
|
|
boss_save_stopper = [
|
|
# Prevents usage of a White Jewel if in a boss fight. Important for the lizard-man trio in Waterway as escaping
|
|
# their fight by saving/reloading can render a Special2 permanently missable.
|
|
0x24080001, # ADDIU T0, R0, 0x0001
|
|
0x15030005, # BNE T0, V1, [forward 0x05]
|
|
0x3C088035, # LUI T0, 0x8035
|
|
0x9108F7D8, # LBU T0, 0xF7D8 (T0)
|
|
0x24090020, # ADDIU T1, R0, 0x0020
|
|
0x51090001, # BEQL T0, T1, [forward 0x01]
|
|
0x24020000, # ADDIU V0, R0, 0x0000
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
music_modifier = [
|
|
# Uses the ID of a song about to be played to pull a switcheroo by grabbing a new ID from a custom table to play
|
|
# instead. A hacky way to circumvent song IDs in the compressed overlays' "play song" function calls, but it works!
|
|
0xAFBF001C, # SW RA, 0x001C (SP)
|
|
0x0C004A6B, # JAL 0x800129AC
|
|
0x44800000, # MTC1 R0, F0
|
|
0x10400003, # BEQZ V0, [forward 0x03]
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01044821, # ADDU T1, T0, A0
|
|
0x9124CD20, # LBU A0, 0xCD20 (T1)
|
|
0x08004E64 # J 0x80013990
|
|
]
|
|
|
|
music_comparer_modifier = [
|
|
# The same as music_modifier, but for the function that compares the "song to play" ID with the one that's currently
|
|
# playing. This will ensure the randomized music doesn't reset when going through a loading zone in Villa or CC.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01044821, # ADDU T1, T0, A0
|
|
0x9124CD20, # LBU A0, 0xCD20 (T1)
|
|
0x08004A60, # J 0x80012980
|
|
]
|
|
|
|
item_customizer = [
|
|
# Allows changing an item's appearance settings and visibility independent of what it actually is as well as setting
|
|
# its bitflag literally anywhere in the save file by changing things in the item actor's data as it's being created
|
|
# for the below three functions to then utilize.
|
|
0x03205825, # OR T3, T9, R0
|
|
0x000B5A02, # SRL T3, T3, 8
|
|
0x316C0080, # ANDI T4, T3, 0x0080
|
|
0xA0CC0041, # SB T4, 0x0041 (A2)
|
|
0x016C5823, # SUBU T3, T3, T4
|
|
0xA0CB0040, # SB T3, 0x0040 (A2)
|
|
0x333900FF, # ANDI T9, T9, 0x00FF
|
|
0xA4D90038, # SH T9, 0x0038 (A2)
|
|
0x8CCD0058, # LW T5, 0x0058 (A2)
|
|
0x31ACFF00, # ANDI T4, T5, 0xFF00
|
|
0x340EFF00, # ORI T6, R0, 0xFF00
|
|
0x158E000A, # BNE T4, T6, [forward 0x0A]
|
|
0x31AC00FF, # ANDI T4, T5, 0x00FF
|
|
0x240E0002, # ADDIU T6, R0, 0x0002
|
|
0x018E001B, # DIVU T4, T6
|
|
0x00006010, # MFHI T4
|
|
0x000D5C02, # SRL T3, T5, 16
|
|
0x51800001, # BEQZL T4, [forward 0x01]
|
|
0x000B5C00, # SLL T3, T3, 16
|
|
0x00006012, # MFLO T4
|
|
0xA0CC0055, # SB T4, 0x0055 (A2)
|
|
0xACCB0058, # SW T3, 0x0058 (A2)
|
|
0x080494E5, # J 0x80125394
|
|
0x032A0019 # MULTU T9, T2
|
|
]
|
|
|
|
item_appearance_switcher = [
|
|
# Determines an item's model appearance by checking to see if a different item appearance ID was written in a
|
|
# specific spot in the actor's data; if one wasn't, then the appearance value will be grabbed from the item's entry
|
|
# in the item property table like normal instead.
|
|
0x92080040, # LBU T0, 0x0040 (S0)
|
|
0x55000001, # BNEZL T0, T1, [forward 0x01]
|
|
0x01002025, # OR A0, T0, R0
|
|
0x03E00008, # JR RA
|
|
0xAFA70024 # SW A3, 0x0024 (SP)
|
|
]
|
|
|
|
item_model_visibility_switcher = [
|
|
# If 80 is written one byte ahead of the appearance switch value in the item's actor data, parse 0C00 to the
|
|
# function that checks if an item should be invisible or not. Otherwise, grab that setting from the item property
|
|
# table like normal.
|
|
0x920B0041, # LBU T3, 0x0041 (S0)
|
|
0x316E0080, # ANDI T6, T3, 0x0080
|
|
0x11C00003, # BEQZ T6, [forward 0x03]
|
|
0x240D0C00, # ADDIU T5, R0, 0x0C00
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0x958D0004 # LHU T5, 0x0004 (T4)
|
|
]
|
|
|
|
item_shine_visibility_switcher = [
|
|
# Same as the above, but for item shines instead of the model.
|
|
0x920B0041, # LBU T3, 0x0041 (S0)
|
|
0x31690080, # ANDI T1, T3, 0x0080
|
|
0x11200003, # BEQZ T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0x240C0C00, # ADDIU T4, R0, 0x0C00
|
|
0x03E00008, # JR RA
|
|
0x958CA908 # LHU T4, 0xA908 (T4)
|
|
]
|
|
|
|
three_hit_item_flags_setter = [
|
|
# As the function to create items from the 3HB item lists iterates through said item lists, this will pass unique
|
|
# flag values to each item when calling the "create item instance" function by right-shifting said flag by a number
|
|
# of bits depending on which item in the list it is. Unlike the vanilla game which always puts flags of 0x00000000
|
|
# on each of these.
|
|
0x8DC80008, # LW T0, 0x0008 (T6)
|
|
0x240A0000, # ADDIU T2, R0, 0x0000
|
|
0x00084C02, # SRL T1, T0, 16
|
|
0x3108FFFF, # ANDI T0, T0, 0xFFFF
|
|
0x00094842, # SRL T1, T1, 1
|
|
0x15200003, # BNEZ T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x34098000, # ORI T1, R0, 0x8000
|
|
0x25080001, # ADDIU T0, T0, 0x0001
|
|
0x0154582A, # SLT T3, T2, S4
|
|
0x1560FFF9, # BNEZ T3, [backward 0x07]
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x00094C00, # SLL T1, T1, 16
|
|
0x01094025, # OR T0, T0, T1
|
|
0x0805971E, # J 0x80165C78
|
|
0xAFA80010 # SW T0, 0x0010 (SP)
|
|
]
|
|
|
|
chandelier_item_flags_setter = [
|
|
# Same as the above, but for the unique function made specifically and ONLY for the Villa foyer chandelier's item
|
|
# list. KCEK, why the heck did you have to do this!?
|
|
0x8F280014, # LW T0, 0x0014 (T9)
|
|
0x240A0000, # ADDIU T2, R0, 0x0000
|
|
0x00084C02, # SRL T1, T0, 16
|
|
0x3108FFFF, # ANDI T0, T0, 0xFFFF
|
|
0x00094842, # SRL T1, T1, 1
|
|
0x15200003, # BNEZ T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x34098000, # ORI T1, R0, 0x8000
|
|
0x25080001, # ADDIU T0, T0, 0x0001
|
|
0x0155582A, # SLT T3, T2, S5
|
|
0x1560FFF9, # BNEZ T3, [backward 0x07]
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x00094C00, # SLL T1, T1, 16
|
|
0x01094025, # OR T0, T0, T1
|
|
0x0805971E, # J 0x80165C78
|
|
0xAFA80010 # SW T0, 0x0010 (SP)
|
|
]
|
|
|
|
prev_subweapon_spawn_checker = [
|
|
# When picking up a sub-weapon this will check to see if it's different from the one the player already had (if they
|
|
# did have one) and jump to prev_subweapon_dropper, which will spawn a subweapon actor of what they had before
|
|
# directly behind them.
|
|
0x322F3031, # Previous sub-weapon bytes
|
|
0x10A00009, # BEQZ A1, [forward 0x09]
|
|
0x00000000, # NOP
|
|
0x10AD0007, # BEQ A1, T5, [forward 0x07]
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01054021, # ADDU T0, T0, A1
|
|
0x0C0FF418, # JAL 0x803FD060
|
|
0x9104CFC3, # LBU A0, 0xCFC3 (T0)
|
|
0x2484FF9C, # ADDIU A0, A0, 0xFF9C
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0xAD049BD4, # SW A0, 0x9BD4 (T0)
|
|
0x0804F0BF, # J 0x8013C2FC
|
|
0x24020001 # ADDIU V0, R0, 0x0001
|
|
]
|
|
|
|
prev_subweapon_fall_checker = [
|
|
# Checks to see if a pointer to a previous sub-weapon drop actor spawned by prev_subweapon_dropper is in 80389BD4
|
|
# and calls the function in prev_subweapon_dropper to lower the weapon closer to the ground on the next frame if a
|
|
# pointer exists and its actor ID is 0x0027. Once it hits the ground or despawns, the connection to the actor will
|
|
# be severed by 0-ing out the pointer.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x8D049BD4, # LW A0, 0x9BD4 (T0)
|
|
0x10800008, # BEQZ A0, [forward 0x08]
|
|
0x00000000, # NOP
|
|
0x84890000, # LH T1, 0x0000 (A0)
|
|
0x240A0027, # ADDIU T2, R0, 0x0027
|
|
0x152A0004, # BNE T1, T2, [forward 0x04]
|
|
0x00000000, # NOP
|
|
0x0C0FF452, # JAL 0x803FD148
|
|
0x00000000, # NOP
|
|
0x50400001, # BEQZL V0, [forward 0x01]
|
|
0xAD009BD4, # SW R0, 0x9BD4 (T0)
|
|
0x080FF40F # J 0x803FD03C
|
|
]
|
|
|
|
prev_subweapon_dropper = [
|
|
# Spawns a pickup actor of the sub-weapon the player had before picking up a new one behind them at their current
|
|
# position like in other CVs. This will enable them to pick it back up again if they still want it.
|
|
# Courtesy of Moisés; see derp.c in the src folder for the C source code.
|
|
0x27BDFFC8,
|
|
0xAFBF001C,
|
|
0xAFA40038,
|
|
0xAFB00018,
|
|
0x0C0006B4,
|
|
0x2404016C,
|
|
0x00402025,
|
|
0x0C000660,
|
|
0x24050027,
|
|
0x1040002B,
|
|
0x00408025,
|
|
0x3C048035,
|
|
0x848409DE,
|
|
0x00042023,
|
|
0x0C0230D4,
|
|
0x3084FFFF,
|
|
0x44822000,
|
|
0x3C018040,
|
|
0xC428D370,
|
|
0x468021A0,
|
|
0x3C048035,
|
|
0x848409DE,
|
|
0x00042023,
|
|
0x46083282,
|
|
0x3084FFFF,
|
|
0x0C01FFAC,
|
|
0xE7AA0024,
|
|
0x44828000,
|
|
0x3C018040,
|
|
0xC424D374,
|
|
0x468084A0,
|
|
0x27A40024,
|
|
0x00802825,
|
|
0x3C064100,
|
|
0x46049182,
|
|
0x0C004562,
|
|
0xE7A6002C,
|
|
0x3C058035,
|
|
0x24A509D0,
|
|
0x26040064,
|
|
0x0C004530,
|
|
0x27A60024,
|
|
0x3C018035,
|
|
0xC42809D4,
|
|
0x3C0140A0,
|
|
0x44815000,
|
|
0x00000000,
|
|
0x460A4400,
|
|
0xE6100068,
|
|
0xC6120068,
|
|
0xE6120034,
|
|
0x8FAE0038,
|
|
0xA60E0038,
|
|
0x8FBF001C,
|
|
0x8FB00018,
|
|
0x27BD0038,
|
|
0x03E00008,
|
|
0x00000000,
|
|
0x3C068040,
|
|
0x24C6D368,
|
|
0x90CE0000,
|
|
0x27BDFFE8,
|
|
0xAFBF0014,
|
|
0x15C00027,
|
|
0x00802825,
|
|
0x240400DB,
|
|
0x0C0006B4,
|
|
0xAFA50018,
|
|
0x44802000,
|
|
0x3C038040,
|
|
0x2463D364,
|
|
0x3C068040,
|
|
0x24C6D368,
|
|
0x8FA50018,
|
|
0x1040000A,
|
|
0xE4640000,
|
|
0x8C4F0024,
|
|
0x3C013F80,
|
|
0x44814000,
|
|
0xC5E60044,
|
|
0xC4700000,
|
|
0x3C018040,
|
|
0x46083280,
|
|
0x460A8480,
|
|
0xE432D364,
|
|
0x94A20038,
|
|
0x2401000F,
|
|
0x24180001,
|
|
0x10410006,
|
|
0x24010010,
|
|
0x10410004,
|
|
0x2401002F,
|
|
0x10410002,
|
|
0x24010030,
|
|
0x14410005,
|
|
0x3C014040,
|
|
0x44813000,
|
|
0xC4640000,
|
|
0x46062200,
|
|
0xE4680000,
|
|
0xA0D80000,
|
|
0x10000023,
|
|
0x24020001,
|
|
0x3C038040,
|
|
0x2463D364,
|
|
0xC4600000,
|
|
0xC4A20068,
|
|
0x3C038039,
|
|
0x24639BD0,
|
|
0x4600103E,
|
|
0x00001025,
|
|
0x45000006,
|
|
0x00000000,
|
|
0x44808000,
|
|
0xE4A00068,
|
|
0xA0C00000,
|
|
0x10000014,
|
|
0xE4700000,
|
|
0x3C038039,
|
|
0x24639BD0,
|
|
0x3C018019,
|
|
0xC42AC870,
|
|
0xC4600000,
|
|
0x460A003C,
|
|
0x00000000,
|
|
0x45000006,
|
|
0x3C018019,
|
|
0xC432C878,
|
|
0x46120100,
|
|
0xE4640000,
|
|
0xC4600000,
|
|
0xC4A20068,
|
|
0x46001181,
|
|
0x24020001,
|
|
0xE4A60068,
|
|
0xC4A80068,
|
|
0xE4A80034,
|
|
0x8FBF0014,
|
|
0x27BD0018,
|
|
0x03E00008,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x0000001B,
|
|
0x060048E0,
|
|
0x40000000,
|
|
0x06AEFFD3,
|
|
0x06004B30,
|
|
0x40000000,
|
|
0x00000000,
|
|
0x06004CB8,
|
|
0x0000031A,
|
|
0x002C0000,
|
|
0x060059B8,
|
|
0x40000248,
|
|
0xFFB50186,
|
|
0x06005B68,
|
|
0xC00001DF,
|
|
0x00000000,
|
|
0x06005C88,
|
|
0x80000149,
|
|
0x00000000,
|
|
0x06005DC0,
|
|
0xC0000248,
|
|
0xFFB5FE7B,
|
|
0x06005F70,
|
|
0xC00001E0,
|
|
0x00000000,
|
|
0x06006090,
|
|
0x8000014A,
|
|
0x00000000,
|
|
0x06007D28,
|
|
0x4000010E,
|
|
0xFFF100A5,
|
|
0x06007F60,
|
|
0xC0000275,
|
|
0x00000000,
|
|
0x06008208,
|
|
0x800002B2,
|
|
0x00000000,
|
|
0x060083B0,
|
|
0xC000010D,
|
|
0xFFF2FF5C,
|
|
0x060085E8,
|
|
0xC0000275,
|
|
0x00000000,
|
|
0x06008890,
|
|
0x800002B2,
|
|
0x00000000,
|
|
0x3D4CCCCD,
|
|
0x3FC00000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0xB8000100,
|
|
0xB8000100,
|
|
]
|
|
|
|
subweapon_surface_checker = [
|
|
# During the process of remotely giving an item received via multiworld, this will check to see if the item being
|
|
# received is a subweapon and, if it is, wait until the player is not above an abyss or instant kill surface before
|
|
# giving it. This is to ensure dropped previous subweapons won't land somewhere inaccessible.
|
|
0x2408000D, # ADDIU T0, R0, 0x000D
|
|
0x11040006, # BEQ T0, A0, [forward 0x06]
|
|
0x2409000E, # ADDIU T1, R0, 0x000E
|
|
0x11240004, # BEQ T1, A0, [forward 0x04]
|
|
0x2408000F, # ADDIU T0, R0, 0x000F
|
|
0x11040002, # BEQ T0, A0, [forward 0x02]
|
|
0x24090010, # ADDIU T1, R0, 0x0010
|
|
0x1524000B, # BNE T1, A0, [forward 0x0B]
|
|
0x3C0A800D, # LUI T2, 0x800D
|
|
0x8D4A7B5C, # LW T2, 0x7B5C (T2)
|
|
0x1140000E, # BEQZ T2, [forward 0x0E]
|
|
0x00000000, # NOP
|
|
0x914A0001, # LBU T2, 0x0001 (T2)
|
|
0x240800A2, # ADDIU T0, R0, 0x00A2
|
|
0x110A000A, # BEQ T0, T2, [forward 0x0A]
|
|
0x24090092, # ADDIU T1, R0, 0x0092
|
|
0x112A0008, # BEQ T1, T2, [forward 0x08]
|
|
0x24080080, # ADDIU T0, R0, 0x0080
|
|
0x110A0006, # BEQ T0, T2, [forward 0x06]
|
|
0x956C00DD, # LHU T4, 0x00DD (T3)
|
|
0xA1600000, # SB R0, 0x0000 (T3)
|
|
0x258C0001, # ADDIU T4, T4, 0x0001
|
|
0x080FF8D0, # J 0x803FE340
|
|
0xA56C00DD, # SH T4, 0x00DD (T3)
|
|
0x00000000, # NOP
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
countdown_number_displayer = [
|
|
# Displays a number below the HUD clock of however many items are left to find in whichever stage the player is in.
|
|
# Which number in the save file to display depends on which map the player is currently on. It can track either
|
|
# items marked progression only or all locations in the stage.
|
|
# Courtesy of Moisés; see print_text_ovl.c in the src folder for the C source code.
|
|
0x27BDFFD8,
|
|
0xAFBF0024,
|
|
0x00002025,
|
|
0x0C000360,
|
|
0x2405000C,
|
|
0x3C038040,
|
|
0x3C198034,
|
|
0x2463D6D0,
|
|
0x37392814,
|
|
0x240E0002,
|
|
0x3C0F0860,
|
|
0x24180014,
|
|
0xAC620000,
|
|
0xAFB80018,
|
|
0xAFAF0014,
|
|
0xAFAE0010,
|
|
0xAFB9001C,
|
|
0x00002025,
|
|
0x00402825,
|
|
0x2406001E,
|
|
0x0C0FF55D,
|
|
0x24070028,
|
|
0x8FBF0024,
|
|
0x3C018040,
|
|
0xAC22D6D4,
|
|
0x03E00008,
|
|
0x27BD0028,
|
|
0x27BDFFE0,
|
|
0xAFA40020,
|
|
0x93AE0023,
|
|
0x3C058039,
|
|
0xAFBF001C,
|
|
0x3C048040,
|
|
0x3C068040,
|
|
0x240F0014,
|
|
0x00AE2821,
|
|
0x90A59CA4,
|
|
0xAFAF0010,
|
|
0x8CC6D6D0,
|
|
0x8C84D6D4,
|
|
0x0C0FF58A,
|
|
0x24070002,
|
|
0x8FBF001C,
|
|
0x27BD0020,
|
|
0x03E00008,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x90820000,
|
|
0x00001825,
|
|
0x50400008,
|
|
0xA4A00000,
|
|
0xA4A20000,
|
|
0x90820001,
|
|
0x24840001,
|
|
0x24A50002,
|
|
0x1440FFFB,
|
|
0x24630001,
|
|
0xA4A00000,
|
|
0x03E00008,
|
|
0x00601025,
|
|
0x27BDFFD8,
|
|
0xAFBF0024,
|
|
0xAFB0001C,
|
|
0xAFA40028,
|
|
0xAFA5002C,
|
|
0xAFB10020,
|
|
0xAFA60030,
|
|
0xAFA70034,
|
|
0x00008025,
|
|
0x24050064,
|
|
0x0C000360,
|
|
0x00002025,
|
|
0x8FA40040,
|
|
0x00408825,
|
|
0x3C05800A,
|
|
0x10800004,
|
|
0x8FA6003C,
|
|
0x0C04B2E2,
|
|
0x8CA5B450,
|
|
0x00408025,
|
|
0x5200001A,
|
|
0x8FBF0024,
|
|
0x12200017,
|
|
0x8FAE0028,
|
|
0x11C00015,
|
|
0x02002025,
|
|
0x97A5002E,
|
|
0x97A60032,
|
|
0x0C04B33F,
|
|
0x24070001,
|
|
0x02002025,
|
|
0x83A50037,
|
|
0x87A6003A,
|
|
0x00003825,
|
|
0x0C04B345,
|
|
0xAFA00010,
|
|
0x8FA40028,
|
|
0x0C0FF51C,
|
|
0x02202825,
|
|
0x0C006CF0,
|
|
0x02202025,
|
|
0x02002025,
|
|
0x02202825,
|
|
0x00003025,
|
|
0x0C04B34E,
|
|
0x00003825,
|
|
0x8FBF0024,
|
|
0x02001025,
|
|
0x8FB0001C,
|
|
0x8FB10020,
|
|
0x03E00008,
|
|
0x27BD0028,
|
|
0x27BDFFD8,
|
|
0x8FAE0044,
|
|
0xAFB00020,
|
|
0xAFBF0024,
|
|
0xAFA40028,
|
|
0xAFA5002C,
|
|
0xAFA60030,
|
|
0xAFA70034,
|
|
0x11C00007,
|
|
0x00008025,
|
|
0x3C05800A,
|
|
0x8CA5B450,
|
|
0x01C02025,
|
|
0x0C04B2E2,
|
|
0x8FA6003C,
|
|
0x00408025,
|
|
0x12000017,
|
|
0x8FAF002C,
|
|
0x11E00015,
|
|
0x02002025,
|
|
0x97A50032,
|
|
0x97A60036,
|
|
0x0C04B33F,
|
|
0x24070001,
|
|
0x02002025,
|
|
0x24050001,
|
|
0x24060064,
|
|
0x00003825,
|
|
0x0C04B345,
|
|
0xAFA00010,
|
|
0x8FA40028,
|
|
0x8FA5002C,
|
|
0x93A6003B,
|
|
0x0C04B5BD,
|
|
0x8FA70040,
|
|
0x02002025,
|
|
0x8FA5002C,
|
|
0x00003025,
|
|
0x0C04B34E,
|
|
0x00003825,
|
|
0x8FBF0024,
|
|
0x02001025,
|
|
0x8FB00020,
|
|
0x03E00008,
|
|
0x27BD0028,
|
|
0x27BDFFE8,
|
|
0xAFBF0014,
|
|
0xAFA40018,
|
|
0xAFA5001C,
|
|
0xAFA60020,
|
|
0x10C0000B,
|
|
0xAFA70024,
|
|
0x00A02025,
|
|
0x00C02825,
|
|
0x93A60027,
|
|
0x0C04B5BD,
|
|
0x8FA70028,
|
|
0x8FA20018,
|
|
0x3C010100,
|
|
0x8C4F0000,
|
|
0x01E1C025,
|
|
0xAC580000,
|
|
0x8FBF0014,
|
|
0x27BD0018,
|
|
0x03E00008,
|
|
0x00000000,
|
|
0xAFA50004,
|
|
0x1080000E,
|
|
0x30A500FF,
|
|
0x24010001,
|
|
0x54A10008,
|
|
0x8C980000,
|
|
0x8C8E0000,
|
|
0x3C017FFF,
|
|
0x3421FFFF,
|
|
0x01C17824,
|
|
0x03E00008,
|
|
0xAC8F0000,
|
|
0x8C980000,
|
|
0x3C018000,
|
|
0x0301C825,
|
|
0xAC990000,
|
|
0x03E00008,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000
|
|
]
|
|
|
|
countdown_number_manager = [
|
|
# Tables and code for managing things about the Countdown number at the appropriate times.
|
|
0x00010102, # Map ID offset table start
|
|
0x02020D03,
|
|
0x04050505,
|
|
0x0E0E0E05,
|
|
0x07090806,
|
|
0x0C0C000B,
|
|
0x0C050D0A,
|
|
0x00000000, # Table end
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000001, # Major identifiers table start
|
|
0x01000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x01000000,
|
|
0x01010000,
|
|
0x00010101,
|
|
0x01010101,
|
|
0x01010101,
|
|
0x01010000,
|
|
0x00000000, # Table end
|
|
# Decrements the counter upon picking up an item if the counter should be decremented.
|
|
0x90E80039, # LBU T0, 0x0039 (A3)
|
|
0x240B0011, # ADDIU T3, R0, 0x0011
|
|
0x110B0002, # BEQ T0, T3, [forward 0x02]
|
|
0x90EA0040, # LBU T2, 0x0040 (A3)
|
|
0x2548FFFF, # ADDIU T0, T2, 0xFFFF
|
|
0x3C098040, # LUI T1, 0x8040
|
|
0x01284821, # ADDIU T1, T1, T0
|
|
0x9129D71C, # LBU T1, 0xD71C (T1)
|
|
0x11200009, # BEQZ T1, [forward 0x09]
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099EE1, # LBU T1, 0x9EE1 (T0)
|
|
0x3C0A8040, # LUI T2, 0x8040
|
|
0x01495021, # ADDU T2, T2, T1
|
|
0x914AD6DC, # LBU T2, 0xD6DC (T2)
|
|
0x010A4021, # ADDU T0, T0, T2
|
|
0x91099CA4, # LBU T1, 0x9CA4 (T0)
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1099CA4, # SB T1, 0x9CA4 (T0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Moves the number to/from its pause menu position when pausing/un-pausing.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x8D08D6D4, # LW T0, 0xD6D4
|
|
0x11000009, # BEQZ T0, [forward 0x09]
|
|
0x92090000, # LBU T1, 0x0000 (S0)
|
|
0x14200004, # BNEZ AT, [forward 0x04]
|
|
0x3C0A0033, # LUI T2, 0x0033
|
|
0x254A001F, # ADDIU T2, T2, 0x001F
|
|
0x03E00008, # JR RA
|
|
0xAD0A0014, # SW T2, 0x0014 (T0)
|
|
0x3C0A00D4, # LUI T2, 0x00D4
|
|
0x254A003C, # ADDIU T2, T2, 0x003C
|
|
0xAD0A0014, # SW T2, 0x0014 (T0)
|
|
0x03E00008, # JR RA
|
|
0x00000000, # NOP
|
|
# Hides the number when going into a cutscene or the Options menu.
|
|
0x3C048040, # LUI A0, 0x8040
|
|
0x8C84D6D4, # LW A0, 0xD6D4 (A0)
|
|
0x0C0FF59F, # JAL 0x803FD67C
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x0804DFE0, # J 0x80137FB0
|
|
0x3C048000, # LUI A0, 0x8000
|
|
0x00000000, # NOP
|
|
# Un-hides the number when leaving a cutscene or the Options menu.
|
|
0x3C048040, # LUI A0, 0x8040
|
|
0x8C84D6D4, # LW A0, 0xD6D4 (A0)
|
|
0x0C0FF59F, # JAL 0x803FD67C
|
|
0x24050001, # ADDIU A1, R0, 0x0000
|
|
0x0804DFFA, # J 0x8013
|
|
0x3C047FFF, # LUI A0, 0x7FFFF
|
|
0x00000000, # NOP
|
|
# Kills the last map's pointer to the Countdown stuff.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0xFD00D6D0, # SD R0, 0xD6D0 (T0)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
new_game_extras = [
|
|
# Upon starting a new game, this will write anything extra to the save file data that the run should have at the
|
|
# start. The initial Countdown numbers begin here.
|
|
0x24080000, # ADDIU T0, R0, 0x0000
|
|
0x24090010, # ADDIU T1, R0, 0x0010
|
|
0x11090008, # BEQ T0, T1, [forward 0x08]
|
|
0x3C0A8040, # LUI T2, 0x8040
|
|
0x01485021, # ADDU T2, T2, T0
|
|
0x8D4AD818, # LW T2, 0xD818 (T2)
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x01685821, # ADDU T3, T3, T0
|
|
0xAD6A9CA4, # SW T2, 0x9CA4 (T3)
|
|
0x1000FFF8, # B [backward 0x08]
|
|
0x25080004, # ADDIU T0, T0, 0x0004
|
|
# start_inventory begins here
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099C27, # LBU T1, 0x9C27 (T0)
|
|
0x31290010, # ANDI T1, T1, 0x0010
|
|
0x15200005, # BNEZ T1, [forward 0x05]
|
|
0x24090000, # ADDIU T1, R0, 0x0000 <- Starting jewels
|
|
0xA1099C49, # SB T1, 0x9C49
|
|
0x3C0A8040, # LUI T2, 0x8040
|
|
0x8D4BE514, # LW T3, 0xE514 (T2) <- Starting money
|
|
0xAD0B9C44, # SW T3, 0x9C44 (T0)
|
|
0x24090000, # ADDIU T1, R0, 0x0000 <- Starting PowerUps
|
|
0xA1099CED, # SB T1, 0x9CED (T0)
|
|
0x24090000, # ADDIU T1, R0, 0x0000 <- Starting sub-weapon
|
|
0xA1099C43, # SB T1, 0x9C43 (T0)
|
|
0x24090000, # ADDIU T1, R0, 0x0000 <- Starting Ice Traps
|
|
0xA1099BE2, # SB T1, 0x9BE2 (T0)
|
|
0x240C0000, # ADDIU T4, R0, 0x0000
|
|
0x240D0022, # ADDIU T5, R0, 0x0022
|
|
0x11AC0007, # BEQ T5, T4, [forward 0x07]
|
|
0x3C0A8040, # LUI T2, 0x8040
|
|
0x014C5021, # ADDU T2, T2, T4
|
|
0x814AE518, # LB T2, 0xE518 <- Starting inventory items
|
|
0x25080001, # ADDIU T0, T0, 0x0001
|
|
0xA10A9C4A, # SB T2, 0x9C4A (T0)
|
|
0x1000FFF9, # B [backward 0x07]
|
|
0x258C0001, # ADDIU T4, T4, 0x0001
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
shopsanity_stuff = [
|
|
# Everything related to shopsanity.
|
|
# Flag table (in bytes) start
|
|
0x80402010,
|
|
0x08000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00040200,
|
|
# Replacement item table (in halfwords) start
|
|
0x00030003,
|
|
0x00030003,
|
|
0x00030000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000003,
|
|
0x00030000,
|
|
# Switches the vanilla item being bought with the randomized one, if its flag is un-set, and sets its flag.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01044021, # ADDU T0, T0, A0
|
|
0x9109D8CA, # LBU T1, 0xD8CA (T0)
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916A9C1D, # LBU T2, 0x9C1D (T3)
|
|
0x01496024, # AND T4, T2, T1
|
|
0x15800005, # BNEZ T4, [forward 0x05]
|
|
0x01495025, # OR T2, T2, T1
|
|
0xA16A9C1D, # SB T2, 0x9C1D (T3)
|
|
0x01044021, # ADDU T0, T0, A0
|
|
0x9504D8D8, # LHU A0, 0xD8D8 (T0)
|
|
0x308400FF, # ANDI A0, A0, 0x00FF
|
|
0x0804EFFB, # J 0x8013BFEC
|
|
0x00000000, # NOP
|
|
# Switches the vanilla item model on the buy menu with the randomized item if the randomized item isn't purchased.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01044021, # ADDU T0, T0, A0
|
|
0x9109D8CA, # LBU T1, 0xD8CA (T0)
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916A9C1D, # LBU T2, 0x9C1D (T3)
|
|
0x01495024, # AND T2, T2, T1
|
|
0x15400005, # BNEZ T2, [forward 0x05]
|
|
0x01044021, # ADDU T0, T0, A0
|
|
0x9504D8D8, # LHU A0, 0xD8D8 (T0)
|
|
0x00046202, # SRL T4, A0, 8
|
|
0x55800001, # BNEZL T4, [forward 0x01]
|
|
0x01802021, # ADDU A0, T4, R0
|
|
0x0804F180, # J 0x8013C600
|
|
0x00000000, # NOP
|
|
# Replacement item names table start.
|
|
0x00010203,
|
|
0x04000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00050600,
|
|
0x00000000,
|
|
# Switches the vanilla item name in the shop menu with the randomized item if the randomized item isn't purchased.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01064021, # ADDU T0, T0, A2
|
|
0x9109D8CA, # LBU T1, 0xD8CA (T0)
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916A9C1D, # LBU T2, 0x9C1D (T3)
|
|
0x01495024, # AND T2, T2, T1
|
|
0x15400004, # BNEZ T2, [forward 0x04]
|
|
0x00000000, # NOP
|
|
0x9105D976, # LBU A1, 0xD976 (T0)
|
|
0x3C048001, # LUI A0, 8001
|
|
0x3484A100, # ORI A0, A0, 0xA100
|
|
0x0804B39F, # J 0x8012CE7C
|
|
0x00000000, # NOP
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
# Displays "Not purchased." if the selected randomized item is nor purchased, or the current holding amount of that
|
|
# slot's vanilla item if it is.
|
|
0x3C0C8040, # LUI T4, 0x8040
|
|
0x018B6021, # ADDU T4, T4, T3
|
|
0x918DD8CA, # LBU T5, 0xD8CA (T4)
|
|
0x3C0E8039, # LUI T6, 0x8039
|
|
0x91D89C1D, # LBU T8, 0x9C1D (T6)
|
|
0x030DC024, # AND T8, T8, T5
|
|
0x13000003, # BEQZ T8, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0804E819, # J 0x8013A064
|
|
0x00000000, # NOP
|
|
0x0804E852, # J 0x8013A148
|
|
0x820F0061, # LB T7, 0x0061 (S0)
|
|
0x00000000, # NOP
|
|
# Displays a custom item description if the selected randomized item is not purchased.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x01054021, # ADDU T0, T0, A1
|
|
0x9109D8D0, # LBU T1, 0xD8D0 (T0)
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x914B9C1D, # LBU T3, 0x9C1D (T2)
|
|
0x01695824, # AND T3, T3, T1
|
|
0x15600003, # BNEZ T3, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x3C048002, # LUI A0, 0x8002
|
|
0x24849C00, # ADDIU A0, A0, 0x9C00
|
|
0x0804B39F # J 0x8012CE7C
|
|
]
|
|
|
|
special_sound_notifs = [
|
|
# Plays a distinct sound whenever you get enough Special1s to unlock a new location or enough Special2s to unlock
|
|
# Dracula's door.
|
|
0x3C088013, # LUI A0, 0x8013
|
|
0x9108AC9F, # LBU T0, 0xAC57 (T0)
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x91299C4C, # LBU T1, 0x9C4B (T1)
|
|
0x15090003, # BNE T0, T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x24040162, # ADDIU A0, R0, 0x0162
|
|
0x0804F0BF, # J 0x8013C2FC
|
|
0x00000000, # NOP
|
|
0x3C088013, # LUI T0, 0x8013
|
|
0x9108AC57, # LBU T0, 0xAC57 (T0)
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x91299C4B, # LBU T1, 0x9C4B (T1)
|
|
0x0128001B, # DIVU T1, T0
|
|
0x00005010, # MFHI
|
|
0x15400006, # BNEZ T2, [forward 0x06]
|
|
0x00005812, # MFLO T3
|
|
0x296C0008, # SLTI T4, T3, 0x0008
|
|
0x11800003, # BEQZ T4, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x2404019E, # ADDIU A0, R0, 0x019E
|
|
0x0804F0BF # J 0x8013C2FC
|
|
]
|
|
|
|
map_text_redirector = [
|
|
# Checks for Map Texts 06 or 08 if in the Forest or Castle Wall Main maps respectively and redirects the text
|
|
# pointer to a blank string, skipping all the yes/no prompt text for pulling levers.
|
|
0x0002FFFF, # Dummy text string
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x91689EE1, # LBU T0, 0x9EE1 (T3)
|
|
0x1100000F, # BEQZ T0, [forward 0x0F]
|
|
0x24090006, # ADDIU T1, R0, 0x0006
|
|
0x240A0002, # ADDIU T2, R0, 0x0002
|
|
0x110A000C, # BEQ T0, T2, [forward 0x0C]
|
|
0x24090008, # ADDIU T1, R0, 0x0008
|
|
0x240A0009, # ADDIU T2, R0, 0x0009
|
|
0x110A0009, # BEQ T0, T2, [forward 0x09]
|
|
0x24090004, # ADDIU T1, R0, 0x0004
|
|
0x240A000A, # ADDIU T2, R0, 0x000A
|
|
0x110A0006, # BEQ T0, T2, [forward 0x06]
|
|
0x24090001, # ADDIU T1, R0, 0x0001
|
|
0x240A000C, # ADDIU T2, R0, 0x000C
|
|
0x110A0003, # BEQ T0, T2, [forward 0x03]
|
|
0x2409000C, # ADDIU T1, R0, 0x000C
|
|
0x10000008, # B 0x803FDB34
|
|
0x00000000, # NOP
|
|
0x15250006, # BNE T1, A1, [forward 0x06]
|
|
0x00000000, # NOP
|
|
0x3C04803F, # LUI A0, 0x803F
|
|
0x3484DACC, # ORI A0, A0, 0xDACC
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x0804B39F, # J 0x8012CE7C
|
|
0x00000000, # NOP
|
|
# Redirects to a custom message if you try placing the bomb ingredients at the bottom CC crack before deactivating
|
|
# the seal.
|
|
0x24090009, # ADDIU T1, R0, 0x0009
|
|
0x15090009, # BNE T0, T1, [forward 0x09]
|
|
0x240A0002, # ADDIU T2, R0, 0x0002
|
|
0x15450007, # BNE T2, A1, [forward 0x07]
|
|
0x916A9C18, # LBU T2, 0x9C18 (T3)
|
|
0x314A0001, # ANDI T2, T2, 0x0001
|
|
0x15400004, # BNEZ T2, [forward 0x04]
|
|
0x00000000, # NOP
|
|
0x3C04803F, # LUI A0, 0x803F
|
|
0x3484DBAC, # ORI A0, A0, 0xDBAC
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x0804B39F, # J 0x8012CE7C
|
|
0x00000000, # NOP
|
|
# Checks for Map Texts 02 or 00 if in the Villa hallway or CC lizard lab maps respectively and redirects the text
|
|
# pointer to a blank string, skipping all the NPC dialogue mandatory for checks.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
0x240A0005, # ADDIU T2, R0, 0x0005
|
|
0x110A0006, # BEQ T0, T2, [forward 0x06]
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x240A000C, # ADDIU T2, R0, 0x000C
|
|
0x110A0003, # BEQ T0, T2, [forward 0x03]
|
|
0x24090000, # ADDIU T1, R0, 0x0000
|
|
0x0804B39F, # J 0x8012CE7C
|
|
0x00000000, # NOP
|
|
0x15250004, # BNE T1, A1, [forward 0x04]
|
|
0x00000000, # NOP
|
|
0x3C04803F, # LUI A0, 0x803F
|
|
0x3484DACC, # ORI A0, A0, 0xDACC
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x0804B39F # J 0x8012CE7C
|
|
]
|
|
|
|
special_descriptions_redirector = [
|
|
# Redirects the menu description when looking at the Special1 and 2 items to different, custom strings that tell
|
|
# how many are needed per warp and to fight Dracula respectively, and how many there are of both in the whole seed.
|
|
0x240A0003, # ADDIU T2, R0, 0x0003
|
|
0x10AA0005, # BEQ A1, T2, [forward 0x05]
|
|
0x240A0004, # ADDIU T2, R0, 0x0004
|
|
0x10AA0003, # BEQ A1, T2, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0804B39F, # J 0x8012CE7C
|
|
0x00000000, # NOP
|
|
0x3C04803F, # LUI A0, 0x803F
|
|
0x3484E53C, # ORI A0, A0, 0xE53C
|
|
0x24A5FFFD, # ADDIU A1, A1, 0xFFFD
|
|
0x0804B39F # J 0x8012CE7C
|
|
]
|
|
|
|
forest_cw_villa_intro_cs_player = [
|
|
# Plays the Forest, Castle Wall, or Villa intro cutscene after transitioning to a different map if the map being
|
|
# transitioned to is the start of their levels respectively. Gets around the fact that they have to be set on the
|
|
# previous loading zone for them to play normally.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x8D099EE0, # LW T1, 0x9EE0 (T0)
|
|
0x1120000B, # BEQZ T1 T1, [forward 0x0B]
|
|
0x240B0000, # ADDIU T3, R0, 0x0000
|
|
0x3C0A0002, # LUI T2, 0x0002
|
|
0x112A0008, # BEQ T1, T2, [forward 0x08]
|
|
0x240B0007, # ADDIU T3, R0, 0x0007
|
|
0x254A0007, # ADDIU T2, T2, 0x0007
|
|
0x112A0005, # BEQ T1, T2, [forward 0x05]
|
|
0x3C0A0003, # LUI T2, 0x0003
|
|
0x112A0003, # BEQ T1, T2, [forward 0x03]
|
|
0x240B0003, # ADDIU T3, R0, 0x0003
|
|
0x08005FAA, # J 0x80017EA8
|
|
0x00000000, # NOP
|
|
0x010B6021, # ADDU T4, T0, T3
|
|
0x918D9C08, # LBU T5, 0x9C08 (T4)
|
|
0x31AF0001, # ANDI T7, T5, 0x0001
|
|
0x15E00009, # BNEZ T7, [forward 0x09]
|
|
0x240E0009, # ADDIU T6, R0, 0x0009
|
|
0x3C180003, # LUI T8, 0x0003
|
|
0x57090001, # BNEL T8, T1, [forward 0x01]
|
|
0x240E0004, # ADDIU T6, R0, 0x0004
|
|
0x15200003, # BNEZ T1, [forward 0x03]
|
|
0x240F0001, # ADDIU T7, R0, 0x0001
|
|
0xA18F9C08, # SB T7, 0x9C08 (T4)
|
|
0x240E003C, # ADDIU T6, R0, 0x003C
|
|
0xA10E9EFF, # SB T6, 0x9EFF (T0)
|
|
0x08005FAA # J 0x80017EA8
|
|
]
|
|
|
|
map_id_refresher = [
|
|
# After transitioning to a different map, if this detects the map ID being transitioned to as FF, it will write back
|
|
# the past map ID so that the map will reset. Useful for thngs like getting around a bug wherein the camera fixes in
|
|
# place if you enter a loading zone that doesn't actually change the map, which can happen in a seed that gives you
|
|
# any character tower stage at the very start.
|
|
0x240800FF, # ADDIU T0, R0, 0x00FF
|
|
0x110E0003, # BEQ T0, T6, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x03E00008, # JR RA
|
|
0xA44E61D8, # SH T6, 0x61D8
|
|
0x904961D9, # LBU T1, 0x61D9
|
|
0xA0496429, # SB T1, 0x6429
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
character_changer = [
|
|
# Changes the character being controlled if the player is holding L while loading into a map by swapping the
|
|
# character ID.
|
|
0x3C08800D, # LUI T0, 0x800D
|
|
0x910B5E21, # LBU T3, 0x5E21 (T0)
|
|
0x31680020, # ANDI T0, T3, 0x0020
|
|
0x3C0A8039, # LUI T2, 0x8039
|
|
0x1100000B, # BEQZ T0, [forward 0x0B]
|
|
0x91499C3D, # LBU T1, 0x9C3D (T2)
|
|
0x11200005, # BEQZ T1, [forward 0x05]
|
|
0x24080000, # ADDIU T0, R0, 0x0000
|
|
0xA1489C3D, # SB T0, 0x9C3D (T2)
|
|
0x25080001, # ADDIU T0, T0, 0x0001
|
|
0xA1489BC2, # SB T0, 0x9BC2 (T2)
|
|
0x10000004, # B [forward 0x04]
|
|
0x24080001, # ADDIU T0, R0, 0x0001
|
|
0xA1489C3D, # SB T0, 0x9C3D (T2)
|
|
0x25080001, # ADDIU T0, T0, 0x0001
|
|
0xA1489BC2, # SB T0, 0x9BC2 (T2)
|
|
# Changes the alternate costume variables if the player is holding C-up.
|
|
0x31680008, # ANDI T0, T3, 0x0008
|
|
0x11000009, # BEQZ T0, [forward 0x09]
|
|
0x91499C24, # LBU T1, 0x9C24 (T2)
|
|
0x312B0040, # ANDI T3, T1, 0x0040
|
|
0x2528FFC0, # ADDIU T0, T1, 0xFFC0
|
|
0x15600003, # BNEZ T3, [forward 0x03]
|
|
0x240C0000, # ADDIU T4, R0, 0x0000
|
|
0x25280040, # ADDIU T0, T1, 0x0040
|
|
0x240C0001, # ADDIU T4, R0, 0x0001
|
|
0xA1489C24, # SB T0, 0x9C24 (T2)
|
|
0xA14C9CEE, # SB T4, 0x9CEE (T2)
|
|
0x080062AA, # J 0x80018AA8
|
|
0x00000000, # NOP
|
|
# Plays the attack sound of the character being changed into to indicate the change was successful.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099BC2, # LBU T1, 0x9BC2 (T0)
|
|
0xA1009BC2, # SB R0, 0x9BC2 (T0)
|
|
0xA1009BC1, # SB R0, 0x9BC1 (T0)
|
|
0x11200006, # BEQZ T1, [forward 0x06]
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0x240402F6, # ADDIU A0, R0, 0x02F6
|
|
0x55200001, # BNEZL T1, [forward 0x01]
|
|
0x240402F8, # ADDIU A0, R0, 0x02F8
|
|
0x08004FAB, # J 0x80013EAC
|
|
0x00000000, # NOP
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
panther_dash = [
|
|
# Changes various movement parameters when holding C-right so the player will move way faster.
|
|
# Increases movement speed and speeds up the running animation.
|
|
0x3C08800D, # LUI T0, 0x800D
|
|
0x91085E21, # LBU T0, 0x5E21 (T0)
|
|
0x31080001, # ANDI T0, T0, 0x0001
|
|
0x24093FEA, # ADDIU T1, R0, 0x3FEA
|
|
0x11000004, # BEQZ T0, [forward 0x04]
|
|
0x240B0010, # ADDIU T3, R0, 0x0010
|
|
0x3C073F20, # LUI A3, 0x3F20
|
|
0x240940AA, # ADDIU T1, R0, 0x40AA
|
|
0x240B000A, # ADDIU T3, R0, 0x000A
|
|
0x3C0C8035, # LUI T4, 0x8035
|
|
0xA18B07AE, # SB T3, 0x07AE (T4)
|
|
0xA18B07C2, # SB T3, 0x07C2 (T4)
|
|
0x3C0A8034, # LUI T2, 0x8034
|
|
0x03200008, # JR T9
|
|
0xA5492BD8, # SH T1, 0x2BD8 (T2)
|
|
0x00000000, # NOP
|
|
# Increases the turning speed so that handling is better.
|
|
0x3C08800D, # LUI T0, 0x800D
|
|
0x91085E21, # LBU T0, 0x5E21 (T0)
|
|
0x31080001, # ANDI T0, T0, 0x0001
|
|
0x11000002, # BEQZ T0, [forward 0x02]
|
|
0x240A00D9, # ADDIU T2, R0, 0x00D9
|
|
0x240A00F0, # ADDIU T2, R0, 0x00F0
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916B9C3D, # LBU T3, 0x9C3D (T3)
|
|
0x11600003, # BEQZ T3, [forward 0x03]
|
|
0xD428DD58, # LDC1 F8, 0xDD58 (AT)
|
|
0x03E00008, # JR RA
|
|
0xA02ADD59, # SB T2, 0xDD59 (AT)
|
|
0xD428D798, # LDC1 F8, 0xD798 (AT)
|
|
0x03E00008, # JR RA
|
|
0xA02AD799, # SB T2, 0xD799 (AT)
|
|
0x00000000, # NOP
|
|
# Increases crouch-walking x and z speed.
|
|
0x3C08800D, # LUI T0, 0x800D
|
|
0x91085E21, # LBU T0, 0x5E21 (T0)
|
|
0x31080001, # ANDI T0, T0, 0x0001
|
|
0x11000002, # BEQZ T0, [forward 0x02]
|
|
0x240A00C5, # ADDIU T2, R0, 0x00C5
|
|
0x240A00F8, # ADDIU T2, R0, 0x00F8
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x916B9C3D, # LBU T3, 0x9C3D (T3)
|
|
0x15600005, # BNEZ T3, [forward 0x05]
|
|
0x00000000, # NOP
|
|
0xA02AD801, # SB T2, 0xD801 (AT)
|
|
0xA02AD809, # SB T2, 0xD809 (AT)
|
|
0x03E00008, # JR RA
|
|
0xD430D800, # LDC1 F16, 0xD800 (AT)
|
|
0xA02ADDC1, # SB T2, 0xDDC1 (AT)
|
|
0xA02ADDC9, # SB T2, 0xDDC9 (AT)
|
|
0x03E00008, # JR RA
|
|
0xD430DDC0 # LDC1 F16, 0xDDC0 (AT)
|
|
]
|
|
|
|
panther_jump_preventer = [
|
|
# Optional hack to prevent jumping while moving at the increased panther dash speed as a way to prevent logic
|
|
# sequence breaks that would otherwise be impossible without it. Such sequence breaks are never considered in logic
|
|
# either way.
|
|
|
|
# Decreases a "can running jump" value by 1 per frame unless it's at 0, or while in the sliding state. When the
|
|
# player lets go of C-right, their running speed should have returned to a normal amount by the time it hits 0.
|
|
0x9208007F, # LBU T0, 0x007F (S0)
|
|
0x24090008, # ADDIU T1, R0, 0x0008
|
|
0x11090005, # BEQ T0, T1, [forward 0x05]
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099BC1, # LBU T1, 0x9BC1 (T0)
|
|
0x11200002, # BEQZ T1, [forward 0x02]
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1099BC1, # SB T1, 0x9BC1 (T0)
|
|
0x080FF413, # J 0x803FD04C
|
|
0x00000000, # NOP
|
|
# Increases the "can running jump" value by 2 per frame while panther dashing unless it's at 8 or higher, at which
|
|
# point the player should be at the max panther dash speed.
|
|
0x00074402, # SRL T0, A3, 16
|
|
0x29083F7F, # SLTI T0, T0, 0x3F7F
|
|
0x11000006, # BEQZ T0, [forward 0x06]
|
|
0x3C098039, # LUI T1, 0x8039
|
|
0x912A9BC1, # LBU T2, 0x9BC1 (T1)
|
|
0x254A0002, # ADDIU T2, T2, 0x0002
|
|
0x294B0008, # SLTI T3, T2, 0x0008
|
|
0x55600001, # BNEZL T3, [forward 0x01]
|
|
0xA12A9BC1, # SB T2, 0x9BC1 (T1)
|
|
0x03200008, # JR T9
|
|
0x00000000, # NOP
|
|
# Makes running jumps only work while the "can running jump" value is at 0. Otherwise, their state won't change.
|
|
0x3C010001, # LUI AT, 0x0001
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089BC1, # LBU T0, 0x9BC1 (T0)
|
|
0x55000001, # BNEZL T0, [forward 0x01]
|
|
0x3C010000, # LUI AT, 0x0000
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
gondola_skipper = [
|
|
# Upon stepping on one of the gondolas in Tunnel to activate it, this will instantly teleport you to the other end
|
|
# of the gondola course depending on which one activated, skipping the entire 3-minute wait to get there.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x240900FF, # ADDIU T1, R0, 0x00FF
|
|
0xA1099EE1, # SB T1, 0x9EE1 (T0)
|
|
0x31EA0020, # ANDI T2, T7, 0x0020
|
|
0x3C0C3080, # LUI T4, 0x3080
|
|
0x358C9700, # ORI T4, T4, 0x9700
|
|
0x154B0003, # BNE T2, T3, [forward 0x03]
|
|
0x24090002, # ADDIU T1, R0, 0x0002
|
|
0x24090003, # ADDIU T1, R0, 0x0003
|
|
0x3C0C7A00, # LUI T4, 0x7A00
|
|
0xA1099EE3, # SB T1, 0x9EE3 (T0)
|
|
0xAD0C9EE4, # SW T4, 0x9EE4 (T0)
|
|
0x3C0D0010, # LUI T5, 0x0010
|
|
0x25AD0010, # ADDIU T5, T5, 0x0010
|
|
0xAD0D9EE8, # SW T5, 0x9EE8 (T0)
|
|
0x08063E68 # J 0x8018F9A0
|
|
]
|
|
|
|
mandragora_with_nitro_setter = [
|
|
# When setting a Nitro, if Mandragora is in the inventory too and the wall's "Mandragora set" flag is not set, this
|
|
# will automatically subtract a Mandragora from the inventory and set its flag so the wall can be blown up in just
|
|
# one interaction instead of two.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x81099EE1, # LB T1, 0x9EE1 (T0)
|
|
0x240A000C, # ADDIU T2, R0, 0x000C
|
|
0x112A000E, # BEQ T1, T2, [forward 0x0E]
|
|
0x81099C18, # LB T1, 0x9C18 (T0)
|
|
0x31290002, # ANDI T1, T1, 0x0002
|
|
0x11200009, # BEQZ T1, [forward 0x09]
|
|
0x91099C5D, # LBU T1, 0x9C5D (T0)
|
|
0x11200007, # BEQZ T1, [forward 0x07]
|
|
0x910B9C1A, # LBU T3, 0x9C1A (T0)
|
|
0x316A0001, # ANDI T2, T3, 0x0001
|
|
0x15400004, # BNEZ T2, [forward 0x04]
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1099C5D, # SB T1, 0x9C5D (T0)
|
|
0x356B0001, # ORI T3, T3, 0x0001
|
|
0xA10B9C1A, # SB T3, 0x9C1A (T0)
|
|
0x08000512, # J 0x80001448
|
|
0x00000000, # NOP
|
|
0x810B9BF2, # LB T3, 0x9BF2 (T0)
|
|
0x31690040, # ANDI T1, T3, 0x0040
|
|
0x11200008, # BEQZ T1, [forward 0x08]
|
|
0x91099C5D, # LBU T1, 0x9C5D (T0)
|
|
0x11200006, # BEQZ T1, [forward 0x06]
|
|
0x316A0080, # ANDI T2, T3, 0x0080
|
|
0x15400004, # BNEZ T2, 0x803FE0E8
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1099C5D, # SB T1, 0x9C5D (T0)
|
|
0x356B0080, # ORI T3, T3, 0x0080
|
|
0xA10B9BF2, # SB T3, 0x9BF2 (T0)
|
|
0x08000512 # J 0x80001448
|
|
]
|
|
|
|
ambience_silencer = [
|
|
# Silences all map-specific ambience when loading into a different map, so we don't have to live with, say, Tower of
|
|
# Science/Clock Tower machinery noises everywhere until either resetting, dying, or going into a map that is
|
|
# normally set up to disable said noises.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
0x24090012, # ADDIU T1, R0, 0x0012
|
|
0x11090003, # BEQ T0, T1, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x3404818C, # ORI A0, R0, 0x818C
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x34048134, # ORI A0, R0, 0x8134
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x34048135, # ORI A0, R0, 0x8135
|
|
0x0C004FAB, # JAL 0x80013EAC
|
|
0x34048136, # ORI A0, R0, 0x8136
|
|
0x08054987, # J 0x8015261C
|
|
0x00000000, # NOP
|
|
# Plays the fan ambience when loading into the fan meeting room if this detects the active character's cutscene flag
|
|
# here already being set.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91099EE1, # LBU T1, 0x9EE1 (T0)
|
|
0x240A0019, # ADDIU T2, R0, 0x0019
|
|
0x152A000A, # BNE T1, T2, [forward 0x0A]
|
|
0x910B9BFE, # LBU T3, 0x9BFE (T0)
|
|
0x910C9C3D, # LBU T4, 0x9C3D (T0)
|
|
0x240D0001, # ADDIU T5, R0, 0x0001
|
|
0x55800001, # BNEZL T4, [forward 0x01]
|
|
0x240D0002, # ADDIU T5, R0, 0x0002
|
|
0x016D7024, # AND T6, T3, T5
|
|
0x11C00003, # BEQZ T6, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x0C0052B4, # JAL 0x80014AD0
|
|
0x34040169, # ORI A0, R0, 0x0169
|
|
0x0805581C # J 0x80156070
|
|
]
|
|
|
|
coffin_cutscene_skipper = [
|
|
# Kills the normally-unskippable "Found a hidden path" cutscene at the end of Villa if this detects, in the current
|
|
# module in the modules array, the cutscene's module number of 0x205C and the "skip" value 0f 0x01 normally set by
|
|
# all cutscenes upon pressing Start.
|
|
0x10A0000B, # BEQZ A1, [forward 0x0B]
|
|
0x00000000, # NOP
|
|
0x94A80000, # LHU T0, 0x0000 (A1)
|
|
0x2409205C, # ADDIU T1, R0, 0x205C
|
|
0x15090007, # BNE T0, T1, [forward 0x07]
|
|
0x90AA0070, # LBU T2, 0x0070 (A1)
|
|
0x11400005, # BEQZ T2, [forward 0x05]
|
|
0x90AB0009, # LBU T3, 0x0009 (A1)
|
|
0x240C0003, # ADDIU T4, R0, 0x0003
|
|
0x156C0002, # BNE T3, T4, [forward 0x02]
|
|
0x240B0004, # ADDIU T3, R0, 0x0004
|
|
0xA0AB0009, # SB T3, 0x0009 (A1)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
multiworld_item_name_loader = [
|
|
# When picking up an item from another world, this will load from ROM the custom message for that item explaining
|
|
# in the item textbox what the item is and who it's for. The flag index it calculates determines from what part of
|
|
# the ROM to load the item name from. If the item being picked up is a white jewel or a contract, it will always
|
|
# load from a part of the ROM that has nothing in it to ensure their set "flag" values don't yield unintended names.
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0xAD03E238, # SW V1, 0xE238 (T0)
|
|
0x92080039, # LBU T0, 0x0039 (S0)
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x24090012, # ADDIU T1, R0, 0x0012
|
|
0x15090003, # BNE T0, T1, [forward 0x03]
|
|
0x24080000, # ADDIU T0, R0, 0x0000
|
|
0x10000010, # B [forward 0x10]
|
|
0x24080000, # ADDIU T0, R0, 0x0000
|
|
0x920C0055, # LBU T4, 0x0055 (S0)
|
|
0x8E090058, # LW T1, 0x0058 (S0)
|
|
0x1120000C, # BEQZ T1, [forward 0x0C]
|
|
0x298A0011, # SLTI T2, T4, 0x0011
|
|
0x51400001, # BEQZL T2, [forward 0x01]
|
|
0x258CFFED, # ADDIU T4, T4, 0xFFED
|
|
0x240A0000, # ADDIU T2, R0, 0x0000
|
|
0x00094840, # SLL T1, T1, 1
|
|
0x5520FFFE, # BNEZL T1, [backward 0x02]
|
|
0x254A0001, # ADDIU T2, T2, 0x0001
|
|
0x240B0020, # ADDIU T3, R0, 0x0020
|
|
0x018B0019, # MULTU T4, T3
|
|
0x00004812, # MFLO T1
|
|
0x012A4021, # ADDU T0, T1, T2
|
|
0x00084200, # SLL T0, T0, 8
|
|
0x3C0400BB, # LUI A0, 0x00BB
|
|
0x24847164, # ADDIU A0, A0, 0x7164
|
|
0x00882020, # ADD A0, A0, T0
|
|
0x3C058018, # LUI A1, 0x8018
|
|
0x34A5BF98, # ORI A1, A1, 0xBF98
|
|
0x0C005DFB, # JAL 0x800177EC
|
|
0x24060100, # ADDIU A2, R0, 0x0100
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x8D03E238, # LW V1, 0xE238 (T0)
|
|
0x3C1F8012, # LUI RA, 0x8012
|
|
0x27FF5BA4, # ADDIU RA, RA, 0x5BA4
|
|
0x0804EF54, # J 0x8013BD50
|
|
0x94640002, # LHU A0, 0x0002 (V1)
|
|
# Changes the Y screen position of the textbox depending on how many line breaks there are.
|
|
0x3C088019, # LUI T0, 0x8019
|
|
0x9108C097, # LBU T0, 0xC097 (T0)
|
|
0x11000005, # BEQZ T0, [forward 0x05]
|
|
0x2508FFFF, # ADDIU T0, T0, 0xFFFF
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x1000FFFC, # B [backward 0x04]
|
|
0x24C6FFF1, # ADDIU A2, A2, 0xFFF1
|
|
0x0804B33F, # J 0x8012CCFC
|
|
# Changes the length and number of lines on the textbox if there's a multiworld message in the buffer.
|
|
0x3C088019, # LUI T0, 0x8019
|
|
0x9108C097, # LBU T0, 0xC097 (T0)
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0x00082821, # ADDU A1, R0, T0
|
|
0x240600B6, # ADDIU A2, R0, 0x00B6
|
|
0x0804B345, # J 0x8012CD14
|
|
0x00000000, # NOP
|
|
# Redirects the text to the multiworld message buffer if a message exists in it.
|
|
0x3C088019, # LUI T0, 0x8019
|
|
0x9108C097, # LBU T0, 0xC097 (T0)
|
|
0x11000004, # BEQZ T0, [forward 0x04]
|
|
0x00000000, # NOP
|
|
0x3C048018, # LUI A0, 0x8018
|
|
0x3484BF98, # ORI A0, A0, 0xBF98
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x0804B39F, # J 0x8012CE7C
|
|
# Copy the "item from player" text when being given an item through the multiworld via the game's copy function.
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x00000000, # NOP
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0xAD1FE33C, # SW RA, 0xE33C (T0)
|
|
0xA104E338, # SB A0, 0xE338 (T0)
|
|
0x3C048019, # LUI A0, 0x8019
|
|
0x2484C0A8, # ADDIU A0, A0, 0xC0A8
|
|
0x3C058019, # LUI A1, 0x8019
|
|
0x24A5BF98, # ADDIU A1, A1, 0xBF98
|
|
0x0C000234, # JAL 0x800008D0
|
|
0x24060100, # ADDIU A2, R0, 0x0100
|
|
0x3C088040, # LUI T0, 0x8040
|
|
0x8D1FE33C, # LW RA, 0xE33C (T0)
|
|
0x0804EDCE, # J 0x8013B738
|
|
0x9104E338, # LBU A0, 0xE338 (T0)
|
|
0x00000000, # NOP
|
|
# Neuters the multiworld item text buffer if giving a non-multiworld item through the in-game remote item rewarder
|
|
# byte before then jumping to item_prepareTextbox.
|
|
0x24080011, # ADDIU T0, R0, 0x0011
|
|
0x10880004, # BEQ A0, T0, [forward 0x04]
|
|
0x24080012, # ADDIU T0, R0, 0x0012
|
|
0x10880002, # BEQ A0, T0, [forward 0x02]
|
|
0x3C088019, # LUI T0, 0x8019
|
|
0xA100C097, # SB R0, 0xC097 (T0)
|
|
0x0804EDCE # J 0x8013B738
|
|
]
|
|
|
|
ice_trap_initializer = [
|
|
# During a map load, creates the module that allows the ice block model to appear while in the frozen state if not
|
|
# on the intro narration map (map 0x16).
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
0x24090016, # ADDIU T1, R0, 0x0016
|
|
0x11090004, # BEQ T0, T1, [forward 0x04]
|
|
0x3C048034, # LUI A0, 0x8034
|
|
0x24842ACC, # ADDIU A0, A0, 0x2ACC
|
|
0x08000660, # J 0x80001980
|
|
0x24052125, # ADDIU A1, R0, 0x2125
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
the_deep_freezer = [
|
|
# Writes 000C0000 into the player state to freeze the player on the spot if Ice Traps have been received, writes the
|
|
# Ice Trap code into the pointer value (0x20B8, which is also Camilla's boss code),and decrements the Ice Traps
|
|
# remaining counter. All after verifying the player is in a "safe" state to be frozen in.
|
|
0x3C0B8039, # LUI T3, 0x8039
|
|
0x91699BE2, # LBU T3, 0x9BE2 (T0)
|
|
0x11200015, # BEQZ T1, [forward 0x15]
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x910827A9, # LBU T0, 0x27A9 (T0)
|
|
0x240A0005, # ADDIU T2, R0, 0x0005
|
|
0x110A0011, # BEQ T0, T2, [forward 0x11]
|
|
0x240A000C, # ADDIU T2, R0, 0x000C
|
|
0x110A000F, # BEQ T0, T2, [forward 0x0F]
|
|
0x240A0002, # ADDIU T2, R0, 0x0002
|
|
0x110A000D, # BEQ T0, T2, [forward 0x0D]
|
|
0x240A0008, # ADDIU T2, R0, 0x0008
|
|
0x110A000B, # BEQ T0, T2, [forward 0x0B]
|
|
0x2529FFFF, # ADDIU T1, T1, 0xFFFF
|
|
0xA1699BE2, # SB T1, 0x9BE2 (T3)
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x3C09000C, # LUI T1, 0x000C
|
|
0xAD0927A8, # SW T1, 0x27A8 (T0)
|
|
0x240C20B8, # ADDIU T4, R0, 0x20B8
|
|
0xA56C9E6E, # SH T4, 0x9E6E (T3)
|
|
0x8D0927C8, # LW T1, 0x27C8 (T0)
|
|
0x912A0048, # LBU T2, 0x0068 (T1)
|
|
0x314A007F, # ANDI T2, T2, 0x007F
|
|
0xA12A0048, # SB T2, 0x0068 (T1)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
freeze_verifier = [
|
|
# Verifies for the ice chunk module that a freeze should spawn the ice model. The player must be in the frozen state
|
|
# (0x000C) and 0x20B8 must be in either the freeze pointer value or the current boss ID (Camilla's); otherwise, we
|
|
# weill assume that the freeze happened due to a vampire grab or Actrise shard tornado and not spawn the ice chunk.
|
|
0x8C4E000C, # LW T6, 0x000C (V0)
|
|
0x00803025, # OR A2, A0, R0
|
|
0x8DC30008, # LW V1, 0x0008 (T6)
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x240920B8, # ADDIU T1, R0, 0x20B8
|
|
0x950A9E72, # LHU T2, 0x9E72 (T0)
|
|
0x3C0C8034, # LUI T4, 0x8034
|
|
0x918C27A9, # LBU T4, 0x27A9 (T4)
|
|
0x240D000C, # ADDIU T5, R0, 0x000C
|
|
0x158D0004, # BNE T4, T5, [forward 0x04]
|
|
0x3C0B0F00, # LUI T3, 0x0F00
|
|
0x112A0005, # BEQ T1, T2, [forward 0x05]
|
|
0x950A9E78, # LHU T2, 0x9E78 (T0)
|
|
0x112A0003, # BEQ T1, T2, [forward 0x03]
|
|
0x357996A0, # ORI T9, T3, 0x96A0
|
|
0x03200008, # JR T9
|
|
0x00000000, # NOP
|
|
0x35799640, # ORI T9, T3, 0x9640
|
|
0x03200008, # JR T9
|
|
]
|
|
|
|
countdown_extra_safety_check = [
|
|
# Checks to see if the multiworld message is a red flashing trap before then truly deciding to decrement the
|
|
# Countdown number. This was a VERY last minute thing I caught, since Ice Traps for other CV64 players can take the
|
|
# appearance of majors with no other way of the game knowing.
|
|
0x3C0B8019, # LUI T3, 0x8019
|
|
0x956BBF98, # LHU T3, 0xBF98 (T3)
|
|
0x240C0000, # ADDIU T4, R0, 0x0000
|
|
0x358CA20B, # ORI T4, T4, 0xA20B
|
|
0x556C0001, # BNEL T3, T4, [forward 0x01]
|
|
0xA1099CA4, # SB T1, 0x9CA4 (T0)
|
|
0x03E00008 # JR RA
|
|
]
|
|
|
|
countdown_demo_hider = [
|
|
# Hides the Countdown number if we are not in the Gameplay state (state 2), which would happen if we were in the
|
|
# Demo state (state 9). This is to ensure the demo maps' number is not peep-able before starting a run proper, for
|
|
# the sake of preventing a marginal unfair advantage. Otherwise, updates the number once per frame.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0x91089EE1, # LBU T0, 0x9EE1 (T0)
|
|
0x3C098040, # LUI T1, 0x8040
|
|
0x01284821, # ADDU T1, T1, T0
|
|
0x0C0FF507, # JAL 0x803FD41C
|
|
0x9124D6DC, # LBU A0, 0xD6DC (T1)
|
|
0x3C088034, # LUI T0, 0x8034
|
|
0x91092087, # LBU T0, 0x2087 (T0)
|
|
0x240A0002, # ADDIU T2, R0, 0x0002
|
|
0x112A0003, # BEQ T1, T2, [forward 0x03]
|
|
0x3C048040, # LUI A0, 0x8040
|
|
0x8C84D6D4, # LW A0, 0xD6D4 (A0)
|
|
0x0C0FF59F, # JAL 0x803FD67C
|
|
0x24050000, # ADDIU A1, R0, 0x0000
|
|
0x080FF411, # J 0x803FD044
|
|
]
|
|
|
|
item_drop_spin_corrector = [
|
|
# Corrects how far AP-placed items drop and how fast they spin based on what appearance they take.
|
|
|
|
# Pickup actor ID table for the item appearance IDs to reference.
|
|
0x01020304,
|
|
0x05060708,
|
|
0x090A0B0C,
|
|
0x100D0E0F,
|
|
0x11121314,
|
|
0x15161718,
|
|
0x191D1E1F,
|
|
0x20212223,
|
|
0x24252627,
|
|
0x28291A1B,
|
|
0x1C000000,
|
|
0x00000000,
|
|
# Makes AP-placed items in 1-hit breakables drop to their correct, dev-intended height depending on what appearance
|
|
# we gave it. Primarily intended for the Axe and the Cross to ensure they don't land half buried in the ground.
|
|
0x000C4202, # SRL T0, T4, 8
|
|
0x318C00FF, # ANDI T4, T4, 0x00FF
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x3C098040, # LUI T1, 0x8040
|
|
0x01284821, # ADDU T1, T1, T0
|
|
0x912CE7DB, # LBU T4, 0xE7D8
|
|
0x03E00008, # JR RA
|
|
0xAC600000, # SW R0, 0x0000 (V1)
|
|
0x00000000, # NOP
|
|
# Makes items with changed appearances spin at their correct speed. Unless it's a local Ice Trap, wherein it will
|
|
# instead spin at the speed it isn't supposed to.
|
|
0x920B0040, # LBU T3, 0x0040 (S0)
|
|
0x1160000D, # BEQZ T3, [forward 0x0D]
|
|
0x3C0C8040, # LUI T4, 0x8040
|
|
0x016C6021, # ADDU T4, T3, T4
|
|
0x918CE7DB, # LBU T4, 0xE7DB (T4)
|
|
0x258CFFFF, # ADDIU T4, T4, 0xFFFF
|
|
0x240D0011, # ADDIU T5, R0, 0x0011
|
|
0x154D0006, # BNE T2, T5, [forward 0x06]
|
|
0x29AE0006, # SLTI T6, T5, 0x0006
|
|
0x240A0001, # ADDIU T2, R0, 0x0001
|
|
0x55C00001, # BNEZL T6, [forward 0x01]
|
|
0x240A0007, # ADDIU T2, R0, 0x0007
|
|
0x10000002, # B [forward 0x02]
|
|
0x00000000, # NOP
|
|
0x258A0000, # ADDIU T2, T4, 0x0000
|
|
0x08049648, # J 0x80125920
|
|
0x3C028017, # LUI V0, 0x8017
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
# Makes AP-placed items in 3-hit breakables drop to their correct, dev-intended height depending on what appearance
|
|
# we gave it.
|
|
0x00184202, # SRL T0, T8, 8
|
|
0x331800FF, # ANDI T8, T8, 0x00FF
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x3C098040, # LUI T1, 0x8040
|
|
0x01284821, # ADDU T1, T1, T0
|
|
0x9138E7DB, # LBU T8, 0xE7D8
|
|
0x03E00008, # JR RA
|
|
0xAC60FFD8, # SW R0, 0xFFD8 (V1)
|
|
0x00000000,
|
|
# Makes AP-placed items in the Villa chandelier drop to their correct, dev-intended height depending on what
|
|
# appearance we gave it. (why must this singular breakable be such a problem child with its own code? :/)
|
|
0x000D4202, # SRL T0, T5, 8
|
|
0x31AD00FF, # ANDI T5, T5, 0x00FF
|
|
0x11000003, # BEQZ T0, [forward 0x03]
|
|
0x3C098040, # LUI T1, 0x8040
|
|
0x01284821, # ADDU T1, T1, T0
|
|
0x912DE7DB, # LBU T5, 0xE7D8
|
|
0x03E00008, # JR RA
|
|
0xAC60FFD8, # SW R0, 0xFFD8 (V1)
|
|
]
|
|
|
|
big_tosser = [
|
|
# Makes every hit the player takes that does not immobilize them send them flying backwards with the power of
|
|
# Behemoth's charge.
|
|
0x3C0A8038, # LUI T2, 0x8038
|
|
0x914A7D7E, # LBU T2, 0x7D7E (T2)
|
|
0x314A0020, # ANDI T2, T2, 0x0020
|
|
0x1540000D, # BEQZ T2, [forward 0x0D]
|
|
0x3C0A800E, # LUI T2, 0x800E
|
|
0x954B8290, # LHU T3, 0x8290 (T2)
|
|
0x356B2000, # ORI T3, T3, 0x2000
|
|
0xA54B8290, # SH T3, 0x8290 (T2)
|
|
0x3C0C8035, # LUI T4, 0x8035
|
|
0x958C09DE, # LHU T4, 0x09DE (T4)
|
|
0x258C8000, # ADDIU T4, T4, 0x8000
|
|
0x3C0D8039, # LUI T5, 0x8039
|
|
0xA5AC9CF0, # SH T4, 0x9CF0 (T5)
|
|
0x3C0C4160, # LUI T4, 0x4160
|
|
0xADAC9CF4, # SW T4, 0x9CF4 (T5)
|
|
0x3C0C4040, # LUI T4, 0x4040
|
|
0xADAC9CF8, # SW T4, 0x9CF8 (T5)
|
|
0x03E00008, # JR RA
|
|
0x8C680048, # LW T0, 0x0048 (V1)
|
|
0x00000000,
|
|
0x00000000,
|
|
# Allows pressing A while getting launched to cancel all XZ momentum. Useful for saving oneself from getting
|
|
# launched into an instant death trap.
|
|
0x3C088038, # LUI T0, 0x8038
|
|
0x91087D80, # LBU T0, 0x7D80 (T0)
|
|
0x31090080, # ANDI T1, T0, 0x0080
|
|
0x11200009, # BEQZ T1, [forward 0x09]
|
|
0x3C088035, # LUI T0, 0x8035
|
|
0x8D0A079C, # LW T2, 0x079C (T0)
|
|
0x3C0B000C, # LUI T3, 0x000C
|
|
0x256B4000, # ADDIU T3, T3, 0x4000
|
|
0x014B5024, # AND T2, T2, T3
|
|
0x154B0003, # BNE T2, T3, [forward 0x03]
|
|
0x00000000, # NOP
|
|
0xAD00080C, # SW R0, 0x080C (T0)
|
|
0xAD000814, # SW R0, 0x0814 (T0)
|
|
0x03200008 # JR T9
|
|
]
|
|
|
|
dog_bite_ice_trap_fix = [
|
|
# Sets the freeze timer to 0 when a maze garden dog bites the player to ensure the ice chunk model will break if the
|
|
# player gets bitten while frozen via Ice Trap.
|
|
0x3C088039, # LUI T0, 0x8039
|
|
0xA5009E76, # SH R0, 0x9E76 (T0)
|
|
0x3C090F00, # LUI T1, 0x0F00
|
|
0x25291CB8, # ADDIU T1, T1, 0x1CB8
|
|
0x01200008 # JR T1
|
|
]
|