Archipelago/worlds/cvcotm/data/patches.py

432 lines
20 KiB
Python

remote_textbox_shower = [
# Pops up the textbox(s) of whatever textbox IDs is written at 0x02025300 and 0x02025302 and increments the current
# received item index at 0x020253D0 if a number to increment it by is written at 0x02025304. Also plays the sound
# effect of the ID written at 0x02025306, if one is written there. This will NOT give any items on its own; the item
# has to be written by the client into the inventory alongside writing the above-mentioned things.
# Make sure we didn't hit the lucky one frame before room transitioning wherein Nathan is on top of the room
# transition tile.
0x0C, 0x88, # ldrh r4, [r1]
0x80, 0x20, # movs r0, #0x80
0x20, 0x40, # ands r0, r4
0x00, 0x28, # cmp r0, #0
0x2F, 0xD1, # bne 0x87FFF8A
0x11, 0xB4, # push r0, r4
# Check the cutscene value to make sure we are not in a cutscene; forcing a textbox while there's already another
# textbox on-screen messes things up.
0x1E, 0x4A, # ldr r2, =0x2026000
0x13, 0x78, # ldrb r3, [r2]
0x00, 0x2B, # cmp r0, #0
0x29, 0xD1, # bne 0x87FFF88
# Check our "delay" timer buffer for a non-zero. If it is, decrement it by one and skip straight to the return part
# of this code, as we may have received an item on a frame wherein it's "unsafe" to pop the item textbox.
0x16, 0x4A, # ldr r2, =0x2025300
0x13, 0x89, # ldrh r3, [r2, #8]
0x00, 0x2B, # cmp r0, #0
0x02, 0xD0, # beq 0x87FFF42
0x01, 0x3B, # subs r3, #1
0x13, 0x81, # strh r3, [r2, #8]
0x22, 0xE0, # beq 0x87FFF88
# Check our first custom "textbox ID" buffers for a non-zero number.
0x10, 0x88, # ldrh r0, [r2]
0x00, 0x28, # cmp r0, #0
0x12, 0xD0, # beq 0x87FFF6E
# Increase the "received item index" by the specified number in our "item index amount to increase" buffer.
0x93, 0x88, # ldrh r3, [r2, #4]
0xD0, 0x32, # adds r2, #0xD0
0x11, 0x88, # ldrh r1, [r2]
0xC9, 0x18, # adds r1, r1, r3
0x11, 0x80, # strh r1, [r2]
# Check our second custom "textbox ID" buffers for a non-zero number.
0xD0, 0x3A, # subs r2, #0xD0
0x51, 0x88, # ldrh r1, [r2, #2]
0x00, 0x29, # cmp r1, #0
0x01, 0xD0, # beq 0x87FFF5E
# If we have a second textbox ID, run the "display two textboxes" function.
# Otherwise, run the "display one textbox" function.
0x0E, 0x4A, # ldr r2, =0x805F104
0x00, 0xE0, # b 0x87FFF60
0x0E, 0x4A, # ldr r2, =0x805F0C8
0x7B, 0x46, # mov r3, r15
0x05, 0x33, # adds r3, #5
0x9E, 0x46, # mov r14, r3
0x97, 0x46, # mov r15, r2
0x09, 0x48, # ldr r0, =0x2025300
0x02, 0x21, # movs r1, #2
0x01, 0x81, # strh r1, [r0, #8]
# Check our "sound effect ID" buffer and run the "play sound" function if it's a non-zero number.
0x08, 0x48, # ldr r0, =0x2025300
0xC0, 0x88, # ldrh r0, [r0, #6]
0x00, 0x28, # cmp r0, #0
0x04, 0xD0, # beq 0x87FFF7E
0x0B, 0x4A, # ldr r2, =0x8005E80
0x7B, 0x46, # mov r3, r15
0x05, 0x33, # adds r3, #5
0x9E, 0x46, # mov r14, r3
0x97, 0x46, # mov r15, r2
# Clear all our buffers and return to the "check for Nathan being in a room transition" function we've hooked into.
0x03, 0x48, # ldr r0, =0x2025300
0x00, 0x21, # movs r1, #0
0x01, 0x60, # str r1, [r0]
0x41, 0x60, # str r1, [r0, #4]
0x11, 0xBC, # pop r0, r4
0x04, 0x4A, # ldr r2, =0x8007D68
0x00, 0x28, # cmp r0, #0
0x97, 0x46, # mov r15, r2
# LDR number pool
0x00, 0x53, 0x02, 0x02,
0x04, 0xF1, 0x05, 0x08,
0xC8, 0xF0, 0x05, 0x08,
0x68, 0x7D, 0x00, 0x08,
0x90, 0x1E, 0x02, 0x02,
0x80, 0x5E, 0x00, 0x08,
0x00, 0x60, 0x02, 0x02
]
transition_textbox_delayer = [
# Sets the remote item textbox delay timer whenever the player screen transitions to ensure the item textbox won't
# pop during said transition.
0x40, 0x78, # ldrb r0, [r0, #1]
0x28, 0x70, # strb r0, [r5]
0xF8, 0x6D, # ldr r0, [r7, #0x5C]
0x20, 0x18, # adds r0, r4, r0
0x02, 0x4A, # ldr r2, =0x2025300
0x10, 0x23, # movs r3, #0x10
0x13, 0x80, # strh r3, [r2]
0x02, 0x4A, # ldr r2, =0x806CE1C
0x97, 0x46, # mov r15, r2
0x00, 0x00,
# LDR number pool
0x08, 0x53, 0x02, 0x02,
0x1C, 0xCE, 0x06, 0x08,
]
magic_item_sfx_customizer = [
# Enables a different sound to be played depending on which Magic Item was picked up. The array starting at 086797C0
# contains each 2-byte sound ID for each Magic Item. Putting 0000 for a sound will cause no sound to play; this is
# currently used for the dummy AP Items as their sound is played by the "sent" textbox instead.
0x70, 0x68, # ldr r0, [r6, #4]
0x80, 0x79, # ldrb r0, [r0, #6]
0x40, 0x00, # lsl r0, r0, 1
0x07, 0x49, # ldr r1, =0x86797C0
0x08, 0x5A, # ldrh r0, [r1, r0]
0x00, 0x28, # cmp r0, 0
0x04, 0xD0, # beq 0x8679818
0x03, 0x4A, # ldr r2, =0x8005E80
0x7B, 0x46, # mov r3, r15
0x05, 0x33, # adds r3, #5
0x9E, 0x46, # mov r14, r3
0x97, 0x46, # mov r15, r2
0x01, 0x48, # ldr r0, =0x8095BEC
0x87, 0x46, # mov r15, r0
# LDR number pool
0x80, 0x5E, 0x00, 0x08,
0xEC, 0x5B, 0x09, 0x08,
0xC0, 0x97, 0x67, 0x08,
]
start_inventory_giver = [
# This replaces AutoDashBoots.ips from standalone CotMR by allowing the player to start with any set of items, not
# just the Dash Boots. If playing Magician Mode, they will be given all cards that were not put into the starting
# inventory right after this code runs.
# Magic Items
0x13, 0x48, # ldr r0, =0x202572F
0x14, 0x49, # ldr r1, =0x8680080
0x00, 0x22, # mov r2, #0
0x8B, 0x5C, # ldrb r3, [r1, r2]
0x83, 0x54, # strb r3, [r0, r2]
0x01, 0x32, # adds r2, #1
0x08, 0x2A, # cmp r2, #8
0xFA, 0xDB, # blt 0x8680006
# Max Ups
0x11, 0x48, # ldr r0, =0x202572C
0x12, 0x49, # ldr r1, =0x8680090
0x00, 0x22, # mov r2, #0
0x8B, 0x5C, # ldrb r3, [r1, r2]
0x83, 0x54, # strb r3, [r0, r2]
0x01, 0x32, # adds r2, #1
0x03, 0x2A, # cmp r2, #3
0xFA, 0xDB, # blt 0x8680016
# Cards
0x0F, 0x48, # ldr r0, =0x2025674
0x10, 0x49, # ldr r1, =0x86800A0
0x00, 0x22, # mov r2, #0
0x8B, 0x5C, # ldrb r3, [r1, r2]
0x83, 0x54, # strb r3, [r0, r2]
0x01, 0x32, # adds r2, #1
0x14, 0x2A, # cmp r2, #0x14
0xFA, 0xDB, # blt 0x8680026
# Inventory Items (not currently supported)
0x0D, 0x48, # ldr r0, =0x20256ED
0x0E, 0x49, # ldr r1, =0x86800C0
0x00, 0x22, # mov r2, #0
0x8B, 0x5C, # ldrb r3, [r1, r2]
0x83, 0x54, # strb r3, [r0, r2]
0x01, 0x32, # adds r2, #1
0x36, 0x2A, # cmp r2, #36
0xFA, 0xDB, # blt 0x8680036
# Return to the function that checks for Magician Mode.
0xBA, 0x21, # movs r1, #0xBA
0x89, 0x00, # lsls r1, r1, #2
0x70, 0x18, # adds r0, r6, r1
0x04, 0x70, # strb r4, [r0]
0x00, 0x4A, # ldr r2, =0x8007F78
0x97, 0x46, # mov r15, r2
# LDR number pool
0x78, 0x7F, 0x00, 0x08,
0x2F, 0x57, 0x02, 0x02,
0x80, 0x00, 0x68, 0x08,
0x2C, 0x57, 0x02, 0x02,
0x90, 0x00, 0x68, 0x08,
0x74, 0x56, 0x02, 0x02,
0xA0, 0x00, 0x68, 0x08,
0xED, 0x56, 0x02, 0x02,
0xC0, 0x00, 0x68, 0x08,
]
max_max_up_checker = [
# Whenever the player picks up a Max Up, this will check to see if they currently have 255 of that particular Max Up
# and only increment the number further if they don't. This is necessary for extreme Item Link seeds, as going over
# 255 of any Max Up will reset the counter to 0.
0x08, 0x78, # ldrb r0, [r1]
0xFF, 0x28, # cmp r0, 0xFF
0x17, 0xD1, # bne 0x86A0036
# If it's an HP Max, refill our HP.
0xFF, 0x23, # mov r3, #0xFF
0x0B, 0x40, # and r3, r1
0x2D, 0x2B, # cmp r3, 0x2D
0x03, 0xD1, # bne 0x86A0016
0x0D, 0x4A, # ldr r2, =0x202562E
0x93, 0x88, # ldrh r3, [r2, #4]
0x13, 0x80, # strh r3, [r2]
0x11, 0xE0, # b 0x86A003A
# If it's an MP Max, refill our MP.
0x2E, 0x2B, # cmp r3, 0x2E
0x03, 0xD1, # bne 0x86A0022
0x0B, 0x4A, # ldr r2, =0x2025636
0x93, 0x88, # ldrh r3, [r2, #4]
0x13, 0x80, # strh r3, [r2]
0x0B, 0xE0, # b 0x86A003A
# Else, meaning it's a Hearts Max, add +6 Hearts. If adding +6 Hearts would put us over our current max, set our
# current amount to said current max instead.
0x0A, 0x4A, # ldr r2, =0x202563C
0x13, 0x88, # ldrh r3, [r2]
0x06, 0x33, # add r3, #6
0x51, 0x88, # ldrh r1, [r2, #2]
0x8B, 0x42, # cmp r3, r1
0x00, 0xDB, # blt 0x86A0030
0x0B, 0x1C, # add r3, r1, #0
0x13, 0x80, # strh r3, [r2]
0x02, 0xE0, # b 0x86A003A
0x00, 0x00,
# Increment the Max Up count like normal. Should only get here if the Max Up count was determined to be less than
# 255, branching past if not the case.
0x01, 0x30, # adds r0, #1
0x08, 0x70, # strb r0, [r1]
# Return to the function that gives Max Ups normally.
0x05, 0x48, # ldr r0, =0x1B3
0x00, 0x4A, # ldr r2, =0x805E170
0x97, 0x46, # mov r15, r2
# LDR number pool
0x78, 0xE1, 0x05, 0x08,
0x2E, 0x56, 0x02, 0x02,
0x36, 0x56, 0x02, 0x02,
0x3C, 0x56, 0x02, 0x02,
0xB3, 0x01, 0x00, 0x00,
]
maiden_detonator = [
# Detonates the iron maidens upon picking up the Maiden Detonator item by setting the "broke iron maidens" flag.
0x2A, 0x20, # mov r0, #0x2A
0x03, 0x4A, # ldr r2, =0x8007E24
0x7B, 0x46, # mov r3, r15
0x05, 0x33, # adds r3, #5
0x9E, 0x46, # mov r14, r3
0x97, 0x46, # mov r15, r2
0x01, 0x4A, # ldr r2, =0x8095BE4
0x97, 0x46, # mov r15, r2
# LDR number pool
0x24, 0x7E, 0x00, 0x08,
0xE4, 0x5B, 0x09, 0x08,
]
doubleless_roc_midairs_preventer = [
# Prevents being able to Roc jump in midair without the Double. Will pass if the jump counter is 0 or if Double is
# in the inventory.
# Check for Roc Wing in the inventory normally.
0x58, 0x18, # add r0, r3, r1
0x00, 0x78, # ldrb r0, [r0]
0x00, 0x28, # cmp r0, 0
0x11, 0xD0, # beq 0x8679A2C
# Check the "jumps since last on the ground" counter. Is it 0?
# If so, then we are on the ground and can advance to the Kick Boots question. If not, advance to the Double check.
0x0B, 0x48, # ldr r0, =0x2000080
0x01, 0x78, # ldrb r1, [r0]
0x00, 0x29, # cmp r1, 0
0x03, 0xD0, # beq 0x8679A18
# Check for Double in the inventory. Is it there?
# If not, then it's not time to Roc! Otherwise, advance to the next check.
0x0A, 0x4A, # ldr r2, =0x202572F
0x52, 0x78, # ldrb r2, [r2, 1]
0x00, 0x2A, # cmp r2, 0
0x09, 0xD0, # beq 0x8679A2C
# Check for Kick Boots in the inventory. Are they there?
# If they are, then we can definitely Roc! If they aren't, however, then on to the next question...
0x08, 0x4A, # ldr r2, =0x202572F
0xD2, 0x78, # ldrb r2, [r2, 3]
0x00, 0x2A, # cmp r2, 0
0x03, 0xD1, # bne 0x8679A28
# Is our "jumps since last on the ground" counter 2?
# If it is, then we already Double jumped and should not Roc jump as well.
# Should always pass if we came here from the "on the ground" 0 check.
0x02, 0x29, # cmp r1, 2
0x03, 0xD0, # beq 0x8679A2C
# If we did not Double jump yet, then set the above-mentioned counter to 2, and now we can finally Roc on!
0x02, 0x21, # mov r1, 2
0x01, 0x70, # strb r1, [r0]
# Go to the "Roc jump" code.
0x01, 0x4A, # ldr r2, =0x806B8A8
0x97, 0x46, # mov r15, r2
# Go to the "don't Roc jump" code.
0x01, 0x4A, # ldr r2, =0x806B93C
0x97, 0x46, # mov r15, r2
# LDR number pool
0xA8, 0xB8, 0x06, 0x08,
0x3C, 0xB9, 0x06, 0x08,
0x80, 0x00, 0x00, 0x02,
0x2F, 0x57, 0x02, 0x02,
]
kickless_roc_height_shortener = [
# Shortens the amount of time spent rising with Roc Wing if the player doesn't have Kick Boots.
0x06, 0x49, # ldr r1, =0x202572F
0xC9, 0x78, # ldrb r1, [r1, 3]
0x00, 0x29, # cmp r1, 0
0x00, 0xD1, # bne 0x8679A6A
0x10, 0x20, # mov r0, 0x12
0xA8, 0x65, # str r0, [r5, 0x58]
# Go back to the Roc jump code.
0x00, 0x24, # mov r4, 0
0x2C, 0x64, # str r4, [r5, 0x40]
0x03, 0x49, # ldr r1, =0x80E03A0
0x01, 0x4A, # ldr r2, =0x806B8BC
0x97, 0x46, # mov r15, r2
0x00, 0x00,
# LDR number pool
0xBC, 0xB8, 0x06, 0x08,
0x2F, 0x57, 0x02, 0x02,
0xA0, 0x03, 0x0E, 0x08
]
missing_char_data = {
# The pixel data for all ASCII characters missing from the game's dialogue textbox font.
# Each character consists of 8 bytes, with each byte representing one row of pixels in the character. The bytes are
# arranged from top to bottom row going from left to right.
# Each bit within each byte represents the following pixels within that row:
# 8- = -+------
# 4- = +-------
# 2- = ---+----
# 1- = --+-----
# -8 = -----+--
# -4 = ----+---
# -2 = -------+
# -1 = ------+-
0x396C54: [0x00, 0x9C, 0x9C, 0x18, 0x84, 0x00, 0x00, 0x00], # "
0x396C5C: [0x00, 0x18, 0xBD, 0x18, 0x18, 0x18, 0xBD, 0x18], # #
0x396C64: [0x00, 0x0C, 0x2D, 0x0C, 0x21, 0x00, 0x00, 0x00], # *
0x396C6C: [0x00, 0x20, 0x3C, 0xA0, 0x34, 0x28, 0xB4, 0x20], # $
0x396C74: [0x00, 0x34, 0x88, 0x80, 0xB4, 0x88, 0x88, 0x34], # 6
0x396C7C: [0x00, 0xBC, 0x88, 0x04, 0x04, 0x20, 0x20, 0x20], # 7
0x396CBC: [0x00, 0x34, 0x88, 0x88, 0x3C, 0x08, 0x88, 0x34], # 9
0x396CC4: [0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0], # :
0x396CCC: [0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x80, 0x40], # ;
0x396D0C: [0x00, 0x00, 0x09, 0x24, 0x90, 0x24, 0x09, 0x00], # <
0x396D14: [0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0xFD, 0x00], # =
0x396D1C: [0x00, 0x00, 0xC0, 0x30, 0x0C, 0x30, 0xC0, 0x00], # >
0x396D54: [0x00, 0x34, 0x88, 0xAC, 0xA8, 0xAC, 0x80, 0x34], # @
0x396D5C: [0x00, 0x34, 0x88, 0x88, 0xA8, 0x8C, 0x88, 0x35], # Q
0x396D64: [0x00, 0x40, 0x80, 0x10, 0x20, 0x04, 0x08, 0x01], # \
0x396D6C: [0x00, 0x20, 0x14, 0x88, 0x00, 0x00, 0x00, 0x00], # ^
0x396D9C: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD], # _
0x396DA4: [0x00, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00], # `
0x396DAC: [0x00, 0x08, 0x04, 0x04, 0x20, 0x04, 0x04, 0x08], # {
0x396DB4: [0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20], # |
0x396DBC: [0x00, 0x80, 0x10, 0x10, 0x20, 0x10, 0x10, 0x80], # }
0x396DF4: [0x00, 0x00, 0x00, 0x90, 0x61, 0x0C, 0x00, 0x00], # ~
}
extra_item_sprites = [
# The VRAM data for all the extra item sprites, including the Archipelago Items.
# NOTE: The Archipelago logo is © 2022 by Krista Corkos and Christopher Wilson
# and licensed under Attribution-NonCommercial 4.0 International.
# See LICENSES.txt at the root of this apworld's directory for more licensing information.
# Maiden Detonator
0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0xCC, 0x00, 0x00, 0xC1, 0xBB, 0x00, 0x10, 0x1C, 0xB8,
0x00, 0x10, 0x1C, 0xB1, 0x00, 0x10, 0xBC, 0xBB, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0xCC, 0xBB,
0x11, 0x00, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x00, 0xBB, 0x1C, 0x00, 0x00, 0x8B, 0xC1, 0x01, 0x00,
0x1B, 0xC1, 0x01, 0x00, 0xBB, 0xCB, 0x01, 0x00, 0x11, 0x11, 0x00, 0x00, 0xBB, 0xCC, 0x01, 0x00,
0x00, 0x10, 0x11, 0x11, 0x00, 0xC1, 0xBC, 0x1B, 0x00, 0x10, 0x11, 0x11, 0x00, 0xC1, 0xBC, 0x1B,
0x00, 0x10, 0x11, 0x11, 0x00, 0xC1, 0xBC, 0x1B, 0x00, 0xC1, 0xBC, 0x1B, 0x00, 0x10, 0x11, 0x01,
0x11, 0x11, 0x01, 0x00, 0xB1, 0xCB, 0x1C, 0x00, 0x11, 0x11, 0x01, 0x00, 0xB1, 0xCB, 0x1C, 0x00,
0x11, 0x11, 0x01, 0x00, 0xB1, 0xCB, 0x1C, 0x00, 0xB1, 0xCB, 0x1C, 0x00, 0x10, 0x11, 0x01, 0x00,
# Archipelago Filler
0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x88, 0x00, 0x22, 0x82, 0x88, 0x20, 0x66, 0x26, 0x88,
0x62, 0x66, 0x62, 0x82, 0x62, 0x66, 0x66, 0x82, 0x62, 0x22, 0x62, 0x22, 0x20, 0xAA, 0x2A, 0x00,
0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x82, 0x22, 0x02, 0x00, 0x28, 0xCC, 0x2C, 0x00,
0xC2, 0xCC, 0xC2, 0x02, 0xC2, 0xCC, 0xCC, 0x02, 0xC2, 0x22, 0xC2, 0x02, 0x20, 0xFF, 0x2F, 0x00,
0xA2, 0xAA, 0xA2, 0x02, 0xA2, 0xAA, 0xAA, 0x22, 0xA2, 0xAA, 0x2A, 0x77, 0x20, 0xAA, 0x72, 0x77,
0x00, 0x22, 0x72, 0x77, 0x00, 0x00, 0x72, 0x77, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x00, 0x22,
0xF2, 0xFF, 0xF2, 0x02, 0xF2, 0xFF, 0xFF, 0x02, 0x27, 0xFF, 0xFF, 0x02, 0x72, 0xF2, 0x2F, 0x00,
0x77, 0x22, 0x02, 0x00, 0x77, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
# Archipelago Useful
0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x88, 0x00, 0x22, 0x82, 0x88, 0x20, 0x66, 0x26, 0x88,
0x62, 0x66, 0x62, 0x82, 0x62, 0x66, 0x66, 0x82, 0x62, 0x22, 0x62, 0x22, 0x20, 0xAA, 0x2A, 0x00,
0x02, 0xAA, 0x0A, 0x00, 0x28, 0x9A, 0x0A, 0x00, 0xAA, 0x9A, 0xAA, 0x0A, 0x9A, 0x99, 0x99, 0x0A,
0xAA, 0x9A, 0xAA, 0x0A, 0xC2, 0x9A, 0xCA, 0x02, 0xC2, 0xAA, 0xCA, 0x02, 0x20, 0xFF, 0x2F, 0x00,
0xA2, 0xAA, 0xA2, 0x02, 0xA2, 0xAA, 0xAA, 0x22, 0xA2, 0xAA, 0x2A, 0x77, 0x20, 0xAA, 0x72, 0x77,
0x00, 0x22, 0x72, 0x77, 0x00, 0x00, 0x72, 0x77, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x00, 0x22,
0xF2, 0xFF, 0xF2, 0x02, 0xF2, 0xFF, 0xFF, 0x02, 0x27, 0xFF, 0xFF, 0x02, 0x72, 0xF2, 0x2F, 0x00,
0x77, 0x22, 0x02, 0x00, 0x77, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
# Archipelago Progression
0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x88, 0x00, 0x22, 0x82, 0x88, 0x20, 0x66, 0x26, 0x88,
0x62, 0x66, 0x62, 0x82, 0x62, 0x66, 0x66, 0x82, 0x62, 0x22, 0x62, 0x22, 0x20, 0xAA, 0x2A, 0x00,
0x02, 0x10, 0x00, 0x00, 0x28, 0x71, 0x01, 0x00, 0x12, 0x77, 0x17, 0x00, 0x71, 0x77, 0x77, 0x01,
0x11, 0x77, 0x17, 0x01, 0x12, 0x77, 0x17, 0x02, 0x12, 0x11, 0x11, 0x02, 0x20, 0xFF, 0x2F, 0x00,
0xA2, 0xAA, 0xA2, 0x02, 0xA2, 0xAA, 0xAA, 0x22, 0xA2, 0xAA, 0x2A, 0x77, 0x20, 0xAA, 0x72, 0x77,
0x00, 0x22, 0x72, 0x77, 0x00, 0x00, 0x72, 0x77, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x00, 0x22,
0xF2, 0xFF, 0xF2, 0x02, 0xF2, 0xFF, 0xFF, 0x02, 0x27, 0xFF, 0xFF, 0x02, 0x72, 0xF2, 0x2F, 0x00,
0x77, 0x22, 0x02, 0x00, 0x77, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
# Archipelago Trap
0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x88, 0x00, 0x22, 0x82, 0x82, 0x20, 0x66, 0x26, 0x88,
0x62, 0x62, 0x66, 0x82, 0x62, 0x66, 0x66, 0x82, 0x62, 0x22, 0x62, 0x22, 0x20, 0xAA, 0x2A, 0x00,
0x02, 0x10, 0x00, 0x00, 0x28, 0x71, 0x01, 0x00, 0x18, 0x77, 0x17, 0x00, 0x71, 0x77, 0x77, 0x01,
0x11, 0x77, 0x17, 0x01, 0x12, 0x77, 0x17, 0x02, 0x12, 0x11, 0x11, 0x02, 0x20, 0xFF, 0x2F, 0x00,
0xA2, 0xA2, 0xAA, 0x02, 0xA2, 0xAA, 0xAA, 0x22, 0xA2, 0xAA, 0x2A, 0x77, 0x20, 0xAA, 0x72, 0x72,
0x00, 0x22, 0x72, 0x77, 0x00, 0x00, 0x72, 0x77, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x00, 0x22,
0xF2, 0xF2, 0xFF, 0x02, 0xF2, 0xFF, 0xFF, 0x02, 0x27, 0xFF, 0xFF, 0x02, 0x77, 0xF2, 0x2F, 0x00,
0x77, 0x22, 0x02, 0x00, 0x77, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
# Archipelago Progression + Useful
0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x88, 0x00, 0x22, 0x82, 0x88, 0x20, 0x66, 0x26, 0x88,
0x62, 0x66, 0x62, 0x82, 0x62, 0x66, 0x66, 0x82, 0x62, 0x22, 0x62, 0x22, 0x20, 0xAA, 0x2A, 0x00,
0x02, 0x10, 0x00, 0x00, 0x28, 0x71, 0x01, 0x00, 0x12, 0x77, 0x17, 0x00, 0x71, 0x77, 0x77, 0x01,
0x11, 0x77, 0x17, 0x01, 0x12, 0x77, 0x17, 0x02, 0x12, 0x11, 0x11, 0x02, 0x20, 0xFF, 0x2F, 0x00,
0xA2, 0xAA, 0xA2, 0x02, 0xA2, 0xAA, 0xAA, 0x22, 0xA2, 0xAA, 0x2A, 0x77, 0x20, 0xAA, 0x72, 0x77,
0x00, 0x22, 0x72, 0x77, 0x00, 0x00, 0x72, 0x77, 0x00, 0x00, 0x20, 0x77, 0x00, 0x00, 0x00, 0x22,
0xF2, 0xFF, 0xF2, 0x02, 0xF2, 0xAA, 0xFA, 0x02, 0x27, 0x9A, 0xFA, 0x02, 0xAA, 0x9A, 0xAA, 0x0A,
0x9A, 0x99, 0x99, 0x0A, 0xAA, 0x9A, 0xAA, 0x0A, 0x27, 0x9A, 0x0A, 0x00, 0x02, 0xAA, 0x0A, 0x00,
# Hourglass (Specifically used to represent Max Sand from Timespinner)
0x00, 0x00, 0xFF, 0xFF, 0x00, 0xF0, 0xEE, 0xCC, 0x00, 0xF0, 0x43, 0x42, 0x00, 0xF0, 0x12, 0x11,
0x00, 0x00, 0x1F, 0x11, 0x00, 0x00, 0x2F, 0x88, 0x00, 0x00, 0xF0, 0x82, 0x00, 0x00, 0x00, 0x1F,
0xFF, 0xFF, 0x00, 0x00, 0xCC, 0xEE, 0x0F, 0x00, 0x42, 0x34, 0x0F, 0x00, 0x11, 0x21, 0x0F, 0x00,
0x11, 0xF1, 0x00, 0x00, 0x98, 0xF2, 0x00, 0x00, 0x29, 0x0F, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x81, 0x00, 0x00, 0x2F, 0x81, 0x00, 0x00, 0x1F, 0x88,
0x00, 0xF0, 0x12, 0xA9, 0x00, 0xF0, 0x43, 0x24, 0x00, 0xF0, 0xEE, 0xCC, 0x00, 0x00, 0xFF, 0xFF,
0xF9, 0x00, 0x00, 0x00, 0x19, 0x0F, 0x00, 0x00, 0x99, 0xF2, 0x00, 0x00, 0xA9, 0xF1, 0x00, 0x00,
0xAA, 0x21, 0x0F, 0x00, 0x42, 0x34, 0x0F, 0x00, 0xCC, 0xEE, 0x0F, 0x00, 0xFF, 0xFF, 0x00, 0x00,
]