2866 lines
		
	
	
		
			104 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			2866 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) | ||
|  | ] | ||
|  | 
 | ||
|  | nitro_fall_killer = [ | ||
|  |     # Custom code to force the instant fall death if at a high enough falling speed after getting killed by the Nitro | ||
|  |     # explosion, since the game doesn't run the checks for the fall death after getting hit by said explosion and could | ||
|  |     # result in a softlock when getting blown into an abyss. | ||
|  |     0x3C0C8035,  # LUI   T4, 0x8035 | ||
|  |     0x918807E2,  # LBU   T0, 0x07E2 (T4) | ||
|  |     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 | ||
|  | ] |