From b170cf51a65eaf01a1eea08c3b9decdef3ce5ef3 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 19 Dec 2023 04:08:08 -0500 Subject: [PATCH] Beta-9 --- Client.py | 79 +-- Items.py | 2 + Locations.py | 1184 +++++++++++++++++++++-------------------- Options.py | 26 + Regions.py | 18 +- Rom.py | 24 +- Rules.py | 56 +- StateLogic.py | 2 +- __init__.py | 16 +- data/basepatch.bsdiff | Bin 16541 -> 16029 bytes 10 files changed, 784 insertions(+), 623 deletions(-) diff --git a/Client.py b/Client.py index 49cfc8d..1bbdfdd 100644 --- a/Client.py +++ b/Client.py @@ -116,7 +116,7 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: from CommonClient import logger try: read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), - (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x3FE4, 1, "IWRAM"), (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x4800, 6, "EWRAM"), (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM")]) + (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x304A, 1, "EWRAM"), (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x4800, 6, "EWRAM"), (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), (0x2339, 1, "IWRAM")]) flags = read_state[0] room = (read_state[1][1] << 8) + read_state[1][0] shop_init = read_state[2][0] @@ -126,6 +126,7 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: logo = bytes([byte for byte in read_state[6] if byte < 0x70]).decode("UTF-8") received_index = (read_state[7][0] << 8) + read_state[7][1] cackletta = (read_state[8][0] & 0x40) + shopping = (read_state[9][0] & 0xF) if logo != "MLSSAP": return @@ -135,23 +136,54 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: # Checking shop purchases if is_buy: - await bizhawk.write(ctx.bizhawk_ctx, [(0x304B, [0x0], "EWRAM")]) - if shop_init <= 0x81: - if shop_address != 0x3c0618 and shop_address != 0x3c0684: - location = shop[shop_address][shop_scroll] + await bizhawk.write(ctx.bizhawk_ctx, [(0x304A, [0x0, 0x0], "EWRAM")]) + if shop_address != 0x3c0618 and shop_address != 0x3c0684: + location = shop[shop_address][shop_scroll] + else: + if shop_init & 0x1 != 0: + location = badge[shop_address][shop_scroll] else: - if shop_init & 0x1 != 0: - location = badge[shop_address][shop_scroll] - else: - location = pants[shop_address][shop_scroll] - if location in ctx.server_locations: - locs_to_send.add(location) + location = pants[shop_address][shop_scroll] + if location in ctx.server_locations: + locs_to_send.add(location) + + for i in range(len(ctx.items_received) - received_index): + item_data = items_by_id[ctx.items_received[received_index + i].item] + b = await bizhawk.read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")]) + await asyncio.sleep(.05) + if b[0][0] == 0: + await bizhawk.write(ctx.bizhawk_ctx, [(0x3057, [id_to_RAM(item_data.itemID)], "EWRAM"), (0x4808, [(received_index + i + 1) // 0x100, (received_index + i + 1) % 0x100], "EWRAM")]) + else: + break + + '''for i, item in enumerate(ctx.items_received): + if i < received_index: + i += 1 + continue + item_data = items_by_id[item.item] + b = await bizhawk.read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")]) + await asyncio.sleep(.05) + if b[0][0] == 0: + await bizhawk.write(ctx.bizhawk_ctx, [(0x3057, [id_to_RAM(item_data.itemID)], "EWRAM"), (0x4808, [(i + 1) // 0x100, (i + 1) % 0x100], "EWRAM")]) + else: + break ''' + + if shopping & 0x3 == 0x3: + if locs_to_send != self.local_checked_locations: + self.local_checked_locations = locs_to_send + + if locs_to_send is not None: + await ctx.send_msgs([{ + "cmd": "LocationChecks", + "locations": list(locs_to_send) + }]) + return # Checking flags that aren't digspots or blocks for item in nonBlock: - if is_buy: - break address, mask, location = item + if location in self.local_checked_locations: + continue flag_bytes = await bizhawk.read(ctx.bizhawk_ctx, [(address, 1, "EWRAM"), (0x4800, 6, "EWRAM")]) flag_byte = flag_bytes[0][0] backup_logo = bytes([byte for byte in flag_bytes[1] if byte < 0x70]).decode("UTF-8") @@ -160,7 +192,10 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: if flag_byte & mask != 0: if location in roomException: if roomException[location] != room: - exception = True + if (location == 0xDA0001 or location == 0x2578e7) and room == 0x79: + exception = False + else: + exception = True else: exception = False else: @@ -177,8 +212,6 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: # Check for set location flags. for byte_i, byte in enumerate(bytearray(flags)): - if is_buy: - break for j in range(8): if j in self.checked_flags[byte_i]: continue @@ -203,20 +236,6 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: self.checked_flags[byte_i] += [j] locs_to_send.add(pointer) - for i, item in enumerate(ctx.items_received): - if is_buy: - break - if i < received_index: - i += 1 - continue - item_data = items_by_id[item.item] - b = await bizhawk.read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")]) - await asyncio.sleep(.05) - if b[0][0] == 0: - await bizhawk.write(ctx.bizhawk_ctx, [(0x3057, [id_to_RAM(item_data.itemID)], "EWRAM"), (0x4808, [(i + 1) // 0x100, (i + 1) % 0x100], "EWRAM")]) - else: - break - if not ctx.finished_game and cackletta != 0: await ctx.send_msgs([{ "cmd": "StatusUpdate", diff --git a/Items.py b/Items.py index 9a30a5e..4f73c9c 100644 --- a/Items.py +++ b/Items.py @@ -15,6 +15,7 @@ class MLSSItem(Item): itemList: typing.List[ItemData] = [ + ItemData(77771000, "5 Coins", ItemClassification.filler, 0x4), ItemData(77771001, "Mushroom", ItemClassification.filler, 0xA), ItemData(77771002, "Super Mushroom", ItemClassification.filler, 0xB), ItemData(77771003, "Ultra Mushroom", ItemClassification.filler, 0xC), @@ -169,6 +170,7 @@ class MLSSItem(Item): ] item_frequencies: typing.Dict[str, int] = { + "5 Coins": 40, "Mushroom": 55, "Super Mushroom": 15, "Ultra Mushroom": 12, diff --git a/Locations.py b/Locations.py index d648a89..383bb5d 100644 --- a/Locations.py +++ b/Locations.py @@ -7,15 +7,10 @@ class LocationData: name: str = "" id: int = 0x00 - flag_byte: int = 0x2000000 - flag_mask: int = 0x01 - - def __init__(self, name, id_, itemType, flag, mask): + def __init__(self, name, id_, itemType): self.name = name self.itemType = itemType self.id = id_ - self.flag_byte = flag - self.flag_mask = mask class MLSSLocation(Location): @@ -86,288 +81,331 @@ class MLSSLocation(Location): mainArea: typing.List[LocationData] = [ - LocationData("Stardust Fields Room 1 Block 1", 0x39d65d, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 1 Block 2", 0x39d665, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 2 Block", 0x39d678, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 3 Block", 0x39d6ad, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 4 Block 1", 0x39d6ca, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 4 Block 2", 0x39d6c2, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 4 Block 3", 0x39d6ba, 0, 0x02000000, 0x00), - LocationData("Stardust Fields Room 5 Block", 0x39d713, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Hammer House Block", 0x39d731, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Below Summit Block 1", 0x39d873, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Below Summit Block 2", 0x39d87b, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Below Summit Block 3", 0x39d883, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain After Hoohooros Block 1", 0x39d890, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain After Hoohooros Block 2", 0x39d8a0, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Hoohooros Room Block 1", 0x39d8ad, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Hoohooros Room Block 2", 0x39d8b5, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Before Hoohooros Block", 0x39d8d2, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Fountain Room Block 1", 0x39d8f2, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Fountain Room Block 2", 0x39d8fa, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Room 1 Block 1", 0x39d91c, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Room 1 Block 2", 0x39d924, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Room 1 Block 3", 0x39d92c, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Room 1 Block", 0x39d939, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Right Side Block", 0x39d957, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Bridge Room Block 1", 0x39d96f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Bridge Room Block 2", 0x39d97f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Bridge Room Block 3", 0x39d98f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Bridge Room Block 1", 0x39d99c, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Bridge Room Block 2", 0x39d9a4, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Bridge Room Block 3", 0x39d9ac, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Bridge Room Block 4", 0x39d9b4, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Bridge Room Digspot", 0x39d9bc, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Boostatue Room Block 1", 0x39d9c9, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Boostatue Room Block 2", 0x39d9d1, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Boostatue Room Digspot 1", 0x39d9d9, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Boostatue Room Digspot 2", 0x39d9e1, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Grassy Area Block 1", 0x39d9fe, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Grassy Area Block 2", 0x39d9f6, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base After Minecart Minigame Block 1", 0x39da35, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base After Minecart Minigame Block 2", 0x39da2d, 0, 0x02000000, 0x00), - LocationData("Cave Connecting Stardust Fields and Hoohoo Village Block 1", 0x39da77, 0, 0x02000000, 0x00), - LocationData("Cave Connecting Stardust Fields and Hoohoo Village Block 2", 0x39da7f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village South Cave Block", 0x39dacd, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village North Cave Room 1 Block", 0x39da98, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village North Cave Room 2 Block", 0x39daad, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Surf Beach Block", 0x39dd03, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Star Room Block 1", 0x39e13d, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Star Room Block 2", 0x39e145, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Star Room Block 3", 0x39e14d, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Sun Door Block 1", 0x39e15a, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Sun Door Block 2", 0x39e162, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 4 Block 1", 0x39e1f0, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 4 Block 2", 0x39e1f8, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 4 Block 3", 0x39e200, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Fountain Room 2 Block", 0x39e8f5, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Past Hoohooros Connector Room Block", 0x39e912, 0, 0x02000000, 0x00), - LocationData("Outside Woohoo Hooniversity Block", 0x39e9b5, 0, 0x02000000, 0x00), - LocationData("Shop Starting Flag 1", 0x3c05f0, 3, 0x02000000, 0x00), - LocationData("Shop Starting Flag 2", 0x3c05f2, 3, 0x02000000, 0x00), - LocationData("Shop Starting Flag 3", 0x3c05f4, 3, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Summit Digspot", 0x39d85e, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Below Summit Digspot", 0x39d86b, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain After Hoohooros Digspot", 0x39d898, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Hoohooros Room Digspot 1", 0x39d8bd, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Hoohooros Room Digspot 2", 0x39d8c5, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Before Hoohooros Digspot", 0x39d8e2, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Room 2 Digspot 1", 0x39d907, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Room 2 Digspot 2", 0x39d90f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Room 1 Digspot", 0x39d941, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Right Side Digspot", 0x39d95f, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Super Hammer Cave Digspot", 0x39db02, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village Super Hammer Cave Block", 0x39daea, 0, 0x02000000, 0x00), - LocationData("Hoohoo Village North Cave Room 2 Digspot", 0x39dab5, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Minecart Cave Digspot", 0x39db0f, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Farm Room Digspot 1", 0x39db22, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Farm Room Digspot 2", 0x39db2a, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Farm Room Digspot 3", 0x39db32, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NW Block", 0x39db87, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NW Digspot", 0x39db97, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts W Digspot 1", 0x39dbac, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts W Digspot 2", 0x39dbb4, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts W Digspot 3", 0x39dbbc, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SW Digspot 1", 0x39dbc9, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SW Digspot 2", 0x39dbd9, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SW Digspot 3", 0x39dbe1, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts N Room 1 Digspot", 0x39dbee, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts N Room 2 Digspot", 0x39dbfb, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 1 Digspot 1", 0x39dc08, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 1 Block", 0x39dc20, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 1 Digspot 2", 0x39dc28, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 2 Block 1", 0x39dc4d, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NE Digspot 1", 0x39dc7a, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NE Digspot 2", 0x39dc82, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts E Digspot 1", 0x39dc8f, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts E Digspot 2", 0x39dc97, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts E Digspot 3", 0x39dc9f, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SE Digspot 1", 0x39dcac, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SE Digspot 2", 0x39dcbc, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts SE Digspot 3", 0x39dcc4, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts North Beach Digspot 1", 0x39dcd1, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts North Beach Digspot 2", 0x39dce1, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts North Beach Digspot 3", 0x39dcd9, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts South Beach Digspot", 0x39dcee, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room Digspot 1", 0x39e17f, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room Digspot 2", 0x39e187, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 2 Digspot", 0x39e1d6, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 3 Digspot", 0x39e1e3, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 4 Digspot 1", 0x39e208, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 4 Digspot 2", 0x39e210, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity West of Star Room 5 Digspot", 0x39e21d, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Entrance to Mini Mario Room Digspot 1", 0x39e22a, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Entrance to Mini Mario Room Digspot 2", 0x39e232, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Entrance to Mini Mario Room 2 Digspot", 0x39e23f, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Block", 0x39e24c, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Digspot", 0x39e254, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 1", 0x39e261, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 2", 0x39e269, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 3", 0x39e271, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 4", 0x39e279, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Fountain Room 2 Digspot", 0x39e8fd, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Past Hoohooros Connector Room Digspot 1", 0x39e90a, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Past Hoohooros Connector Room Digspot 2", 0x39e91a, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Secret Scroll 1", 0x1e9411, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Secret Scroll 2", 0x1e9412, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 1", 0x229345, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 2", 0x22954d, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 3", 0x228a17, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 4", 0x22913a, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 5", 0x22890e, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 6", 0x228775, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Bean Fruit 7", 0x1e9431, 2, 0x02000000, 0x00), - LocationData("Hoohoo Village Mole Behind Turtle", 0x277ab2, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Thunder Hand Mole", 0x2779C8, 1, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Peasley's Rose", 0x1E9430, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Super Hammer Upgrade", 0x1E9404, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Ultra Hammer Upgrade", 0x1e9405, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NE Solo Mario Mole 1", 0x1e9435, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts NE Solo Mario Mole 2", 0x1e9436, 2, 0x02000000, 0x00), - LocationData("Hoohoo Village Hammers", 0x1e9403, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Solo Luigi Cave Mole", 0x242888, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Farm Room Mole Reward 1", 0x243844, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Farm Room Mole Reward 2", 0x24387d, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 1", 0x39e990, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 2", 0x39e998, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 3", 0x39e9a0, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 1", 0x39eb5a, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 2", 0x39eb62, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Pipe 2 Room Digspot", 0x39ec40, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Pipe 4 Room Digspot", 0x39ec4d, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Mini Mario Block 1", 0x39d813, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Mini Mario Block 2", 0x39d81b, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Mini Mario Block 3", 0x39d823, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Mini Mario Block 4", 0x39d82b, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Mini Mario Block 5", 0x39d833, 0, 0x02000000, 0x00) + LocationData("Stardust Fields Room 1 Block 1", 0x39d65d, 0), + LocationData("Stardust Fields Room 1 Block 2", 0x39d665, 0), + LocationData("Stardust Fields Room 2 Block", 0x39d678, 0), + LocationData("Stardust Fields Room 3 Block", 0x39d6ad, 0), + LocationData("Stardust Fields Room 4 Block 1", 0x39d6ca, 0), + LocationData("Stardust Fields Room 4 Block 2", 0x39d6c2, 0), + LocationData("Stardust Fields Room 4 Block 3", 0x39d6ba, 0), + LocationData("Stardust Fields Room 5 Block", 0x39d713, 0), + LocationData("Hoohoo Village Hammer House Block", 0x39d731, 0), + LocationData("Hoohoo Mountain Below Summit Block 1", 0x39d873, 0), + LocationData("Hoohoo Mountain Below Summit Block 2", 0x39d87b, 0), + LocationData("Hoohoo Mountain Below Summit Block 3", 0x39d883, 0), + LocationData("Hoohoo Mountain After Hoohooros Block 1", 0x39d890, 0), + LocationData("Hoohoo Mountain After Hoohooros Block 2", 0x39d8a0, 0), + LocationData("Hoohoo Mountain Hoohooros Room Block 1", 0x39d8ad, 0), + LocationData("Hoohoo Mountain Hoohooros Room Block 2", 0x39d8b5, 0), + LocationData("Hoohoo Mountain Before Hoohooros Block", 0x39d8d2, 0), + LocationData("Hoohoo Mountain Fountain Room Block 1", 0x39d8f2, 0), + LocationData("Hoohoo Mountain Fountain Room Block 2", 0x39d8fa, 0), + LocationData("Hoohoo Mountain Room 1 Block 1", 0x39d91c, 0), + LocationData("Hoohoo Mountain Room 1 Block 2", 0x39d924, 0), + LocationData("Hoohoo Mountain Room 1 Block 3", 0x39d92c, 0), + LocationData("Hoohoo Mountain Base Room 1 Block", 0x39d939, 0), + LocationData("Hoohoo Village Right Side Block", 0x39d957, 0), + LocationData("Hoohoo Village Bridge Room Block 1", 0x39d96f, 0), + LocationData("Hoohoo Village Bridge Room Block 2", 0x39d97f, 0), + LocationData("Hoohoo Village Bridge Room Block 3", 0x39d98f, 0), + LocationData("Hoohoo Mountain Base Bridge Room Block 1", 0x39d99c, 0), + LocationData("Hoohoo Mountain Base Bridge Room Block 2", 0x39d9a4, 0), + LocationData("Hoohoo Mountain Base Bridge Room Block 3", 0x39d9ac, 0), + LocationData("Hoohoo Mountain Base Bridge Room Block 4", 0x39d9b4, 0), + LocationData("Hoohoo Mountain Base Bridge Room Digspot", 0x39d9bc, 0), + LocationData("Hoohoo Mountain Base Boostatue Room Block 1", 0x39d9c9, 0), + LocationData("Hoohoo Mountain Base Boostatue Room Block 2", 0x39d9d1, 0), + LocationData("Hoohoo Mountain Base Boostatue Room Digspot 1", 0x39d9d9, 0), + LocationData("Hoohoo Mountain Base Boostatue Room Digspot 2", 0x39d9e1, 0), + LocationData("Hoohoo Mountain Base Grassy Area Block 1", 0x39d9fe, 0), + LocationData("Hoohoo Mountain Base Grassy Area Block 2", 0x39d9f6, 0), + LocationData("Hoohoo Mountain Base After Minecart Minigame Block 1", 0x39da35, 0), + LocationData("Hoohoo Mountain Base After Minecart Minigame Block 2", 0x39da2d, 0), + LocationData("Cave Connecting Stardust Fields and Hoohoo Village Block 1", 0x39da77, 0), + LocationData("Cave Connecting Stardust Fields and Hoohoo Village Block 2", 0x39da7f, 0), + LocationData("Hoohoo Village South Cave Block", 0x39dacd, 0), + LocationData("Hoohoo Village North Cave Room 1 Block", 0x39da98, 0), + LocationData("Hoohoo Village North Cave Room 2 Block", 0x39daad, 0), + LocationData("Beanbean Outskirts Surf Beach Block", 0x39dd03, 0), + LocationData("Woohoo Hooniversity Star Room Block 1", 0x39e13d, 0), + LocationData("Woohoo Hooniversity Star Room Block 2", 0x39e145, 0), + LocationData("Woohoo Hooniversity Star Room Block 3", 0x39e14d, 0), + LocationData("Woohoo Hooniversity Sun Door Block 1", 0x39e15a, 0), + LocationData("Woohoo Hooniversity Sun Door Block 2", 0x39e162, 0), + LocationData("Woohoo Hooniversity West of Star Room 4 Block 1", 0x39e1f0, 0), + LocationData("Woohoo Hooniversity West of Star Room 4 Block 2", 0x39e1f8, 0), + LocationData("Woohoo Hooniversity West of Star Room 4 Block 3", 0x39e200, 0), + LocationData("Hoohoo Mountain Fountain Room 2 Block", 0x39e8f5, 0), + LocationData("Hoohoo Mountain Past Hoohooros Connector Room Block", 0x39e912, 0), + LocationData("Outside Woohoo Hooniversity Block", 0x39e9b5, 0), + LocationData("Shop Starting Flag 1", 0x3c05f0, 3), + LocationData("Shop Starting Flag 2", 0x3c05f2, 3), + LocationData("Shop Starting Flag 3", 0x3c05f4, 3), + LocationData("Hoohoo Mountain Summit Digspot", 0x39d85e, 0), + LocationData("Hoohoo Mountain Below Summit Digspot", 0x39d86b, 0), + LocationData("Hoohoo Mountain After Hoohooros Digspot", 0x39d898, 0), + LocationData("Hoohoo Mountain Hoohooros Room Digspot 1", 0x39d8bd, 0), + LocationData("Hoohoo Mountain Hoohooros Room Digspot 2", 0x39d8c5, 0), + LocationData("Hoohoo Mountain Before Hoohooros Digspot", 0x39d8e2, 0), + LocationData("Hoohoo Mountain Room 2 Digspot 1", 0x39d907, 0), + LocationData("Hoohoo Mountain Room 2 Digspot 2", 0x39d90f, 0), + LocationData("Hoohoo Mountain Base Room 1 Digspot", 0x39d941, 0), + LocationData("Hoohoo Village Right Side Digspot", 0x39d95f, 0), + LocationData("Hoohoo Village Super Hammer Cave Digspot", 0x39db02, 0), + LocationData("Hoohoo Village Super Hammer Cave Block", 0x39daea, 0), + LocationData("Hoohoo Village North Cave Room 2 Digspot", 0x39dab5, 0), + LocationData("Hoohoo Mountain Base Minecart Cave Digspot", 0x39db0f, 0), + LocationData("Beanbean Outskirts Farm Room Digspot 1", 0x39db22, 0), + LocationData("Beanbean Outskirts Farm Room Digspot 2", 0x39db2a, 0), + LocationData("Beanbean Outskirts Farm Room Digspot 3", 0x39db32, 0), + LocationData("Beanbean Outskirts NW Block", 0x39db87, 0), + LocationData("Beanbean Outskirts NW Digspot", 0x39db97, 0), + LocationData("Beanbean Outskirts W Digspot 1", 0x39dbac, 0), + LocationData("Beanbean Outskirts W Digspot 2", 0x39dbb4, 0), + LocationData("Beanbean Outskirts W Digspot 3", 0x39dbbc, 0), + LocationData("Beanbean Outskirts SW Digspot 1", 0x39dbc9, 0), + LocationData("Beanbean Outskirts SW Digspot 2", 0x39dbd9, 0), + LocationData("Beanbean Outskirts SW Digspot 3", 0x39dbe1, 0), + LocationData("Beanbean Outskirts N Room 1 Digspot", 0x39dbee, 0), + LocationData("Beanbean Outskirts N Room 2 Digspot", 0x39dbfb, 0), + LocationData("Beanbean Outskirts S Room 1 Digspot 1", 0x39dc08, 0), + LocationData("Beanbean Outskirts S Room 1 Block", 0x39dc20, 0), + LocationData("Beanbean Outskirts S Room 1 Digspot 2", 0x39dc28, 0), + LocationData("Beanbean Outskirts S Room 2 Block 1", 0x39dc4d, 0), + LocationData("Beanbean Outskirts NE Digspot 1", 0x39dc7a, 0), + LocationData("Beanbean Outskirts NE Digspot 2", 0x39dc82, 0), + LocationData("Beanbean Outskirts E Digspot 1", 0x39dc8f, 0), + LocationData("Beanbean Outskirts E Digspot 2", 0x39dc97, 0), + LocationData("Beanbean Outskirts E Digspot 3", 0x39dc9f, 0), + LocationData("Beanbean Outskirts SE Digspot 1", 0x39dcac, 0), + LocationData("Beanbean Outskirts SE Digspot 2", 0x39dcbc, 0), + LocationData("Beanbean Outskirts SE Digspot 3", 0x39dcc4, 0), + LocationData("Beanbean Outskirts North Beach Digspot 1", 0x39dcd1, 0), + LocationData("Beanbean Outskirts North Beach Digspot 2", 0x39dce1, 0), + LocationData("Beanbean Outskirts North Beach Digspot 3", 0x39dcd9, 0), + LocationData("Beanbean Outskirts South Beach Digspot", 0x39dcee, 0), + LocationData("Woohoo Hooniversity West of Star Room Digspot 1", 0x39e17f, 0), + LocationData("Woohoo Hooniversity West of Star Room Digspot 2", 0x39e187, 0), + LocationData("Woohoo Hooniversity West of Star Room 2 Digspot", 0x39e1d6, 0), + LocationData("Woohoo Hooniversity West of Star Room 3 Digspot", 0x39e1e3, 0), + LocationData("Woohoo Hooniversity West of Star Room 4 Digspot 1", 0x39e208, 0), + LocationData("Woohoo Hooniversity West of Star Room 4 Digspot 2", 0x39e210, 0), + LocationData("Woohoo Hooniversity West of Star Room 5 Digspot", 0x39e21d, 0), + LocationData("Woohoo Hooniversity Entrance to Mini Mario Room Digspot 1", 0x39e22a, 0), + LocationData("Woohoo Hooniversity Entrance to Mini Mario Room Digspot 2", 0x39e232, 0), + LocationData("Woohoo Hooniversity Entrance to Mini Mario Room 2 Digspot", 0x39e23f, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Block", 0x39e24c, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Digspot", 0x39e254, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 1", 0x39e261, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 2", 0x39e269, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 3", 0x39e271, 0), + LocationData("Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 4", 0x39e279, 0), + LocationData("Hoohoo Mountain Fountain Room 2 Digspot", 0x39e8fd, 0), + LocationData("Hoohoo Mountain Past Hoohooros Connector Room Digspot 1", 0x39e90a, 0), + LocationData("Hoohoo Mountain Past Hoohooros Connector Room Digspot 2", 0x39e91a, 0), + LocationData("Beanbean Outskirts Secret Scroll 1", 0x1e9411, 2), + LocationData("Beanbean Outskirts Secret Scroll 2", 0x1e9412, 2), + LocationData("Beanbean Outskirts Bean Fruit 1", 0x229345, 1), + LocationData("Beanbean Outskirts Bean Fruit 2", 0x22954d, 1), + LocationData("Beanbean Outskirts Bean Fruit 3", 0x228a17, 1), + LocationData("Beanbean Outskirts Bean Fruit 4", 0x22913a, 1), + LocationData("Beanbean Outskirts Bean Fruit 5", 0x22890e, 1), + LocationData("Beanbean Outskirts Bean Fruit 6", 0x228775, 1), + LocationData("Beanbean Outskirts Bean Fruit 7", 0x1e9431, 2), + LocationData("Hoohoo Village Mole Behind Turtle", 0x277ab2, 1), + LocationData("Beanbean Outskirts Thunder Hand Mole", 0x2779C8, 1), + LocationData("Hoohoo Mountain Peasley's Rose", 0x1E9430, 2), + LocationData("Beanbean Outskirts Super Hammer Upgrade", 0x1E9404, 2), + LocationData("Beanbean Outskirts Ultra Hammer Upgrade", 0x1e9405, 2), + LocationData("Beanbean Outskirts NE Solo Mario Mole 1", 0x1e9435, 2), + LocationData("Beanbean Outskirts NE Solo Mario Mole 2", 0x1e9436, 2), + LocationData("Hoohoo Village Hammers", 0x1e9403, 2), + LocationData("Beanbean Outskirts Solo Luigi Cave Mole", 0x242888, 1), + LocationData("Beanbean Outskirts Farm Room Mole Reward 1", 0x243844, 1), + LocationData("Beanbean Outskirts Farm Room Mole Reward 2", 0x24387d, 1), + LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 1", 0x39e990, 0), + LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 2", 0x39e998, 0), + LocationData("Beanbean Outskirts South of Hooniversity Guards Digspot 3", 0x39e9a0, 0), + LocationData("Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 1", 0x39eb5a, 0), + LocationData("Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 2", 0x39eb62, 0), + LocationData("Beanbean Outskirts Pipe 2 Room Digspot", 0x39ec40, 0), + LocationData("Beanbean Outskirts Pipe 4 Room Digspot", 0x39ec4d, 0), + LocationData("Beanbean Castle Town Mini Mario Block 1", 0x39d813, 0), + LocationData("Beanbean Castle Town Mini Mario Block 2", 0x39d81b, 0), + LocationData("Beanbean Castle Town Mini Mario Block 3", 0x39d823, 0), + LocationData("Beanbean Castle Town Mini Mario Block 4", 0x39d82b, 0), + LocationData("Beanbean Castle Town Mini Mario Block 5", 0x39d833, 0) +] + +coins: typing.List[LocationData] = [ + LocationData("Stardust Fields Room 2 Coin Block 1", 0x39d680, 0), + LocationData("Stardust Fields Room 2 Coin Block 2", 0x39d688, 0), + LocationData("Stardust Fields Room 2 Coin Block 3", 0x39d690, 0), + LocationData("Stardust Fields Room 3 Coin Block 1", 0x39d69d, 0), + LocationData("Stardust Fields Room 3 Coin Block 2", 0x39d6a5, 0), + LocationData("Stardust Fields Room 5 Coin Block 1", 0x39d6d7, 0), + LocationData("Stardust Fields Room 5 Coin Block 2", 0x39d6df, 0), + LocationData("Stardust Fields Room 7 Coin Block 1", 0x39d70b, 0), + LocationData("Stardust Fields Room 7 Coin Block 2", 0x39d71b, 0), + LocationData("Beanbean Castle Town Passport Photo Room Coin Block", 0x39d803, 0), + LocationData("Hoohoo Mountain Before Hoohooros Coin Block", 0x39d8da, 0), + LocationData("Hoohoo Village Bridge Room Coin Block 1", 0x39d977, 0), + LocationData("Hoohoo Village Bridge Room Coin Block 2", 0x39d987, 0), + LocationData("Hoohoo Village North Cave Room 1 Coin Block", 0x39daa0, 0), + LocationData("Hoohoo Village South Cave Coin Block 1", 0x39dac5, 0), + LocationData("Hoohoo Village South Cave Coin Block 2", 0x39dad5, 0), + LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 1", 0x39dae2, 0), + LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", 0x39daf2, 0), + LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", 0x39dafa, 0), + LocationData("Beanbean Outskirts NW Coin Block", 0x39db8f, 0), + LocationData("Beanbean Outskirts S Room 1 Coin Block", 0x39dc18, 0), + LocationData("Beanbean Outskirts S Room 2 Coin Block", 0x39dc3d, 0), + LocationData("Chateau Popple Room Coin Block 1", 0x39dd30, 0), + LocationData("Chateau Popple Room Coin Block 2", 0x39dd40, 0), + LocationData("Chucklehuck Woods Cave Room 1 Coin Block", 0x39dd7a, 0), + LocationData("Chucklehuck Woods Cave Room 2 Coin Block", 0x39dd97, 0), + LocationData("Chucklehuck Woods Cave Room 3 Coin Block", 0x39ddb4, 0), + LocationData("Chucklehuck Woods Pipe 5 Room Coin Block", 0x39dde6, 0), + LocationData("Chucklehuck Woods Room 7 Coin Block", 0x39de31, 0), + LocationData("Chucklehuck Woods After Chuckleroot Coin Block", 0x39df14, 0), + LocationData("Chucklehuck Woods Koopa Room Coin Block", 0x39df53, 0), + LocationData("Chucklehuck Woods Winkle Area Cave Coin Block", 0x39df80, 0), + LocationData("Sewers Prison Room Coin Block", 0x39e01e, 0), + LocationData("Teehee Valley Past Ultra Hammer Rocks Coin Block", 0x39e588, 0), + LocationData("S.S Chuckola Storage Room Coin Block 1", 0x39e618, 0), + LocationData("S.S Chuckola Storage Room Coin Block 2", 0x39e620, 0), + LocationData("Jokes End Second Floor West Room Coin Block", 0x39e771, 0), + LocationData("Outside Woohoo Hooniversity Coin Block 1", 0x39e9ad, 0), + LocationData("Outside Woohoo Hooniversity Coin Block 2", 0x39e9bd, 0), + LocationData("Outside Woohoo Hooniversity Coin Block 3", 0x39e9c5, 0), ] baseUltraRocks: typing.List[LocationData] = [ - LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 1", 0x39da42, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 2", 0x39da4a, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 3", 0x39da52, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Boostatue Room Digspot 3", 0x39d9e9, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Mole Near Teehee Valley", 0x277a45, 1, 0x02000000, 0x00), - LocationData("Teehee Valley Entrance To Hoohoo Mountain Digspot", 0x39e5b5, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Solo Luigi Maze Room 2 Digspot 1", 0x39e5c8, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Solo Luigi Maze Room 2 Digspot 2", 0x39e5d0, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Guffawha Ruins Entrance Digspot", 0x39da0b, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Teehee Valley Entrance Digspot", 0x39da20, 0, 0x02000000, 0x00), - LocationData("Hoohoo Mountain Base Teehee Valley Entrance Block", 0x39da18, 0, 0x02000000, 0x00) + LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 1", 0x39da42, 0), + LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 2", 0x39da4a, 0), + LocationData("Hoohoo Mountain Base Past Ultra Hammer Rocks Block 3", 0x39da52, 0), + LocationData("Hoohoo Mountain Base Boostatue Room Digspot 3", 0x39d9e9, 0), + LocationData("Hoohoo Mountain Base Mole Near Teehee Valley", 0x277a45, 1), + LocationData("Teehee Valley Entrance To Hoohoo Mountain Digspot", 0x39e5b5, 0), + LocationData("Teehee Valley Solo Luigi Maze Room 2 Digspot 1", 0x39e5c8, 0), + LocationData("Teehee Valley Solo Luigi Maze Room 2 Digspot 2", 0x39e5d0, 0), + LocationData("Hoohoo Mountain Base Guffawha Ruins Entrance Digspot", 0x39da0b, 0), + LocationData("Hoohoo Mountain Base Teehee Valley Entrance Digspot", 0x39da20, 0), + LocationData("Hoohoo Mountain Base Teehee Valley Entrance Block", 0x39da18, 0) ] booStatue: typing.List[LocationData] = [ - LocationData("Beanbean Outskirts Before Harhall Digspot 1", 0x39e951, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Before Harhall Digspot 2", 0x39e959, 0, 0x02000000, 0x00), - LocationData("Beanstar Piece Harhall", 0x1e9441, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Boo Statue Mole", 0x1e9434, 2, 0x02000000, 0x00), - LocationData("Harhall's Pants", 0x1e9444, 2, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 2 Digspot 1", 0x39dc65, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 2 Digspot 2", 0x39dc5d, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 2 Block 2", 0x39dc45, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts S Room 2 Digspot 3", 0x39dc35, 0, 0x02000000, 0x00) + LocationData("Beanbean Outskirts Before Harhall Digspot 1", 0x39e951, 0), + LocationData("Beanbean Outskirts Before Harhall Digspot 2", 0x39e959, 0), + LocationData("Beanstar Piece Harhall", 0x1e9441, 2), + LocationData("Beanbean Outskirts Boo Statue Mole", 0x1e9434, 2), + LocationData("Harhall's Pants", 0x1e9444, 2), + LocationData("Beanbean Outskirts S Room 2 Digspot 1", 0x39dc65, 0), + LocationData("Beanbean Outskirts S Room 2 Digspot 2", 0x39dc5d, 0), + LocationData("Beanbean Outskirts S Room 2 Block 2", 0x39dc45, 0), + LocationData("Beanbean Outskirts S Room 2 Digspot 3", 0x39dc35, 0) ] chucklehuck: typing.List[LocationData] = [ - LocationData("Chateau Room 1 Digspot", 0x39dd20, 0, 0x02000000, 0x00), - LocationData("Chateau Popple Fight Room Block 1", 0x39dd38, 0, 0x02000000, 0x00), - LocationData("Chateau Popple Fight Room Block 2", 0x39dd48, 0, 0x02000000, 0x00), - LocationData("Chateau Popple Fight Room Digspot", 0x39dd50, 0, 0x02000000, 0x00), - LocationData("Chateau Barrel Room Digspot ", 0x39dd5d, 0, 0x02000000, 0x00), - LocationData("Chateau Goblet Room Digspot", 0x39dd6d, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Cave Room 1 Block 1", 0x39dd82, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Cave Room 1 Block 2", 0x39dd8a, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Cave Room 2 Block", 0x39dd9f, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Cave Room 3 Block", 0x39ddac, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 2 Block", 0x39ddc1, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 2 Digspot", 0x39ddc9, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Pipe Room Block 1", 0x39ddd6, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Pipe Room Block 2", 0x39ddde, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Pipe Room Digspot 1", 0x39ddee, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Pipe Room Digspot 2", 0x39ddf6, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 4 Block 1", 0x39de06, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 4 Block 2", 0x39de0e, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 4 Block 3", 0x39de16, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 7 Block 1", 0x39de29, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 7 Block 2", 0x39de39, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 7 Digspot 1", 0x39de41, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 7 Digspot 2", 0x39de49, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 8 Digspot", 0x39de56, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods East of Chuckleroot Digspot", 0x39de66, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 1", 0x39de73, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 2", 0x39de7b, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 3", 0x39de83, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 4", 0x39de8b, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods White Fruit Room Digspot 1", 0x39de98, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods White Fruit Room Digspot 2", 0x39dea0, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods White Fruit Room Digspot 3", 0x39dea8, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods West of Chuckleroot Block", 0x39deb5, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Southwest of Chuckleroot Block", 0x39dec2, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Wiggler room Digspot 1", 0x39decf, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Wiggler room Digspot 2", 0x39ded7, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 1", 0x39dee4, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 2", 0x39deec, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 3", 0x39def4, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 4", 0x39defc, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 5", 0x39df04, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods After Chuckleroot Block 6", 0x39df0c, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Koopa Room Block 1", 0x39df4b, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Koopa Room Block 2", 0x39df5b, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Koopa Room Digspot", 0x39df63, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Room 1 Digspot", 0x39e1c9, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Brooch Guards Room Digspot 1", 0x39e966, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Brooch Guards Room Digspot 2", 0x39e96e, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Chateau Entrance Digspot 1", 0x39e97b, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Chateau Entrance Digspot 2", 0x39e983, 0, 0x02000000, 0x00), - LocationData("Chateau Green Goblet", 0x24e628, 1, 0x02000000, 0x00), - LocationData("Chateau Red Goblet", 0x1e943e, 2, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Red Chuckola Fruit", 0x250621, 2, 0x02000000, 0x00), - LocationData("Chucklehuck Woods White Chuckola Fruit", 0x24ff18, 2, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Purple Chuckola Fruit", 0x24ed74, 1, 0x02000000, 0x00) + LocationData("Chateau Room 1 Digspot", 0x39dd20, 0), + LocationData("Chateau Popple Fight Room Block 1", 0x39dd38, 0), + LocationData("Chateau Popple Fight Room Block 2", 0x39dd48, 0), + LocationData("Chateau Popple Fight Room Digspot", 0x39dd50, 0), + LocationData("Chateau Barrel Room Digspot ", 0x39dd5d, 0), + LocationData("Chateau Goblet Room Digspot", 0x39dd6d, 0), + LocationData("Chucklehuck Woods Cave Room 1 Block 1", 0x39dd82, 0), + LocationData("Chucklehuck Woods Cave Room 1 Block 2", 0x39dd8a, 0), + LocationData("Chucklehuck Woods Cave Room 2 Block", 0x39dd9f, 0), + LocationData("Chucklehuck Woods Cave Room 3 Block", 0x39ddac, 0), + LocationData("Chucklehuck Woods Room 2 Block", 0x39ddc1, 0), + LocationData("Chucklehuck Woods Room 2 Digspot", 0x39ddc9, 0), + LocationData("Chucklehuck Woods Pipe Room Block 1", 0x39ddd6, 0), + LocationData("Chucklehuck Woods Pipe Room Block 2", 0x39ddde, 0), + LocationData("Chucklehuck Woods Pipe Room Digspot 1", 0x39ddee, 0), + LocationData("Chucklehuck Woods Pipe Room Digspot 2", 0x39ddf6, 0), + LocationData("Chucklehuck Woods Room 4 Block 1", 0x39de06, 0), + LocationData("Chucklehuck Woods Room 4 Block 2", 0x39de0e, 0), + LocationData("Chucklehuck Woods Room 4 Block 3", 0x39de16, 0), + LocationData("Chucklehuck Woods Room 7 Block 1", 0x39de29, 0), + LocationData("Chucklehuck Woods Room 7 Block 2", 0x39de39, 0), + LocationData("Chucklehuck Woods Room 7 Digspot 1", 0x39de41, 0), + LocationData("Chucklehuck Woods Room 7 Digspot 2", 0x39de49, 0), + LocationData("Chucklehuck Woods Room 8 Digspot", 0x39de56, 0), + LocationData("Chucklehuck Woods East of Chuckleroot Digspot", 0x39de66, 0), + LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 1", 0x39de73, 0), + LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 2", 0x39de7b, 0), + LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 3", 0x39de83, 0), + LocationData("Chucklehuck Woods Northeast of Chuckleroot Digspot 4", 0x39de8b, 0), + LocationData("Chucklehuck Woods White Fruit Room Digspot 1", 0x39de98, 0), + LocationData("Chucklehuck Woods White Fruit Room Digspot 2", 0x39dea0, 0), + LocationData("Chucklehuck Woods White Fruit Room Digspot 3", 0x39dea8, 0), + LocationData("Chucklehuck Woods West of Chuckleroot Block", 0x39deb5, 0), + LocationData("Chucklehuck Woods Southwest of Chuckleroot Block", 0x39dec2, 0), + LocationData("Chucklehuck Woods Wiggler room Digspot 1", 0x39decf, 0), + LocationData("Chucklehuck Woods Wiggler room Digspot 2", 0x39ded7, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 1", 0x39dee4, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 2", 0x39deec, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 3", 0x39def4, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 4", 0x39defc, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 5", 0x39df04, 0), + LocationData("Chucklehuck Woods After Chuckleroot Block 6", 0x39df0c, 0), + LocationData("Chucklehuck Woods Koopa Room Block 1", 0x39df4b, 0), + LocationData("Chucklehuck Woods Koopa Room Block 2", 0x39df5b, 0), + LocationData("Chucklehuck Woods Koopa Room Digspot", 0x39df63, 0), + LocationData("Chucklehuck Woods Room 1 Digspot", 0x39e1c9, 0), + LocationData("Beanbean Outskirts Brooch Guards Room Digspot 1", 0x39e966, 0), + LocationData("Beanbean Outskirts Brooch Guards Room Digspot 2", 0x39e96e, 0), + LocationData("Beanbean Outskirts Chateau Entrance Digspot 1", 0x39e97b, 0), + LocationData("Beanbean Outskirts Chateau Entrance Digspot 2", 0x39e983, 0), + LocationData("Chateau Green Goblet", 0x24e628, 1), + LocationData("Chateau Red Goblet", 0x1e943e, 2), + LocationData("Chucklehuck Woods Red Chuckola Fruit", 0x250621, 2), + LocationData("Chucklehuck Woods White Chuckola Fruit", 0x24ff18, 2), + LocationData("Chucklehuck Woods Purple Chuckola Fruit", 0x24ed74, 1) ] castleTown: typing.List[LocationData] = [ - LocationData("Beanbean Castle Town Left Side House Block 1", 0x39d7a4, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Left Side House Block 2", 0x39d7ac, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Left Side House Block 3", 0x39d7b4, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Left Side House Block 4", 0x39d7bc, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Right Side House Block 1", 0x39d7d8, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Right Side House Block 2", 0x39d7e0, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Right Side House Block 3", 0x39d7e8, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Right Side House Block 4", 0x39d7f0, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Peach's Extra Dress", 0x1e9433, 2, 0x02000000, 0x00), - LocationData("Beanbean Castle Fake Beanstar", 0x1e9432, 2, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet 1", 0x251347, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet 2", 0x2513fb, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet 3", 0x2513a1, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet 4", 0x251988, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet 5", 0x25192e, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 1", 0x251288, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 2", 0x2512e1, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 3", 0x25122f, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 4", 0x25117d, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 5", 0x2511d6, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 6", 0x25170b, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 7", 0x251767, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 8", 0x25187b, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 9", 0x2517c3, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone 10", 0x25181f, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 1", 0x253515, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 2", 0x253776, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 3", 0x253c70, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 4", 0x254324, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 5", 0x254718, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 6", 0x254a34, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Brew Reward 7", 0x254e24, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Woohoo Blend", 0x252d07, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Hoohoo Blend", 0x252d28, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Chuckle Blend", 0x252d49, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Teehee Blend", 0x252d6a, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Hoolumbian", 0x252d8b, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Chuckoccino", 0x252dac, 1, 0x02000000, 0x00), - LocationData("Coffee Shop Teeheespresso", 0x252dcd, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanstone Reward", 0x251071, 1, 0x02000000, 0x00), - LocationData("Beanbean Castle Town Beanlet Reward", 0x2515eb, 1, 0x02000000, 0x00) + LocationData("Beanbean Castle Town Left Side House Block 1", 0x39d7a4, 0), + LocationData("Beanbean Castle Town Left Side House Block 2", 0x39d7ac, 0), + LocationData("Beanbean Castle Town Left Side House Block 3", 0x39d7b4, 0), + LocationData("Beanbean Castle Town Left Side House Block 4", 0x39d7bc, 0), + LocationData("Beanbean Castle Town Right Side House Block 1", 0x39d7d8, 0), + LocationData("Beanbean Castle Town Right Side House Block 2", 0x39d7e0, 0), + LocationData("Beanbean Castle Town Right Side House Block 3", 0x39d7e8, 0), + LocationData("Beanbean Castle Town Right Side House Block 4", 0x39d7f0, 0), + LocationData("Beanbean Castle Peach's Extra Dress", 0x1e9433, 2), + LocationData("Beanbean Castle Fake Beanstar", 0x1e9432, 2), + LocationData("Beanbean Castle Town Beanlet 1", 0x251347, 1), + LocationData("Beanbean Castle Town Beanlet 2", 0x2513fb, 1), + LocationData("Beanbean Castle Town Beanlet 3", 0x2513a1, 1), + LocationData("Beanbean Castle Town Beanlet 4", 0x251988, 1), + LocationData("Beanbean Castle Town Beanlet 5", 0x25192e, 1), + LocationData("Beanbean Castle Town Beanstone 1", 0x25117d, 1), + LocationData("Beanbean Castle Town Beanstone 2", 0x2511d6, 1), + LocationData("Beanbean Castle Town Beanstone 3", 0x25122f, 1), + LocationData("Beanbean Castle Town Beanstone 4", 0x251288, 1), + LocationData("Beanbean Castle Town Beanstone 5", 0x2512E1, 1), + LocationData("Beanbean Castle Town Beanstone 6", 0x25170b, 1), + LocationData("Beanbean Castle Town Beanstone 7", 0x251767, 1), + LocationData("Beanbean Castle Town Beanstone 8", 0x2517c3, 1), + LocationData("Beanbean Castle Town Beanstone 9", 0x25181F, 1), + LocationData("Beanbean Castle Town Beanstone 10", 0x25187B, 1), + LocationData("Coffee Shop Brew Reward 1", 0x253515, 1), + LocationData("Coffee Shop Brew Reward 2", 0x253776, 1), + LocationData("Coffee Shop Brew Reward 3", 0x253c70, 1), + LocationData("Coffee Shop Brew Reward 4", 0x254324, 1), + LocationData("Coffee Shop Brew Reward 5", 0x254718, 1), + LocationData("Coffee Shop Brew Reward 6", 0x254a34, 1), + LocationData("Coffee Shop Brew Reward 7", 0x254e24, 1), + LocationData("Coffee Shop Woohoo Blend", 0x252d07, 1), + LocationData("Coffee Shop Hoohoo Blend", 0x252d28, 1), + LocationData("Coffee Shop Chuckle Blend", 0x252d49, 1), + LocationData("Coffee Shop Teehee Blend", 0x252d6a, 1), + LocationData("Coffee Shop Hoolumbian", 0x252d8b, 1), + LocationData("Coffee Shop Chuckoccino", 0x252dac, 1), + LocationData("Coffee Shop Teeheespresso", 0x252dcd, 1), + LocationData("Beanbean Castle Town Beanstone Reward", 0x251071, 1), + LocationData("Beanbean Castle Town Beanlet Reward", 0x2515eb, 1) ] eReward: typing.List[int] = [ @@ -381,369 +419,369 @@ class MLSSLocation(Location): ] startingFlag: typing.List[LocationData] = [ - LocationData("Badge Shop Starting Flag 1", 0x3c0618, 2, 0x02000000, 0x00), - LocationData("Badge Shop Starting Flag 2", 0x3c061a, 2, 0x02000000, 0x00), - LocationData("Pants Shop Starting Flag 1", 0x3c061c, 2, 0x02000000, 0x00), - LocationData("Pants Shop Starting Flag 2", 0x3c061e, 2, 0x02000000, 0x00), - LocationData("Pants Shop Starting Flag 3", 0x3c0620, 2, 0x02000000, 0x00) + LocationData("Badge Shop Starting Flag 1", 0x3c0618, 2), + LocationData("Badge Shop Starting Flag 2", 0x3c061a, 2), + LocationData("Pants Shop Starting Flag 1", 0x3c061c, 2), + LocationData("Pants Shop Starting Flag 2", 0x3c061e, 2), + LocationData("Pants Shop Starting Flag 3", 0x3c0620, 2) ] chuckolatorFlag: typing.List[LocationData] = [ - LocationData("Shop Chuckolator Flag", 0x3c05f8, 3, 0x02000000, 0x00), - LocationData("Pants Shop Chuckolator Flag 1", 0x3c062a, 2, 0x02000000, 0x00), - LocationData("Pants Shop Chuckolator Flag 2", 0x3c062c, 2, 0x02000000, 0x00), - LocationData("Pants Shop Chuckolator Flag 3", 0x3c062e, 2, 0x02000000, 0x00), - LocationData("Badge Shop Chuckolator Flag 1", 0x3c0624, 2, 0x02000000, 0x00), - LocationData("Badge Shop Chuckolator Flag 2", 0x3c0626, 2, 0x02000000, 0x00), - LocationData("Badge Shop Chuckolator Flag 3", 0x3c0628, 2, 0x02000000, 0x00) + LocationData("Shop Chuckolator Flag", 0x3c05f8, 3), + LocationData("Pants Shop Chuckolator Flag 1", 0x3c062a, 2), + LocationData("Pants Shop Chuckolator Flag 2", 0x3c062c, 2), + LocationData("Pants Shop Chuckolator Flag 3", 0x3c062e, 2), + LocationData("Badge Shop Chuckolator Flag 1", 0x3c0624, 2), + LocationData("Badge Shop Chuckolator Flag 2", 0x3c0626, 2), + LocationData("Badge Shop Chuckolator Flag 3", 0x3c0628, 2) ] piranhaFlag: typing.List[LocationData] = [ - LocationData("Shop Mom Piranha Flag 1", 0x3c05fc, 3, 0x02000000, 0x00), - LocationData("Shop Mom Piranha Flag 2", 0x3c05fe, 3, 0x02000000, 0x00), - LocationData("Shop Mom Piranha Flag 3", 0x3c0600, 3, 0x02000000, 0x00), - LocationData("Shop Mom Piranha Flag 4", 0x3c0602, 3, 0x02000000, 0x00), - LocationData("Pants Shop Mom Piranha Flag 1", 0x3c0638, 2, 0x02000000, 0x00), - LocationData("Pants Shop Mom Piranha Flag 2", 0x3c063a, 2, 0x02000000, 0x00), - LocationData("Pants Shop Mom Piranha Flag 3", 0x3c063c, 2, 0x02000000, 0x00), - LocationData("Badge Shop Mom Piranha Flag 1", 0x3c0632, 2, 0x02000000, 0x00), - LocationData("Badge Shop Mom Piranha Flag 2", 0x3c0634, 2, 0x02000000, 0x00), - LocationData("Badge Shop Mom Piranha Flag 3", 0x3c0636, 2, 0x02000000, 0x00) + LocationData("Shop Mom Piranha Flag 1", 0x3c05fc, 3), + LocationData("Shop Mom Piranha Flag 2", 0x3c05fe, 3), + LocationData("Shop Mom Piranha Flag 3", 0x3c0600, 3), + LocationData("Shop Mom Piranha Flag 4", 0x3c0602, 3), + LocationData("Pants Shop Mom Piranha Flag 1", 0x3c0638, 2), + LocationData("Pants Shop Mom Piranha Flag 2", 0x3c063a, 2), + LocationData("Pants Shop Mom Piranha Flag 3", 0x3c063c, 2), + LocationData("Badge Shop Mom Piranha Flag 1", 0x3c0632, 2), + LocationData("Badge Shop Mom Piranha Flag 2", 0x3c0634, 2), + LocationData("Badge Shop Mom Piranha Flag 3", 0x3c0636, 2) ] kidnappedFlag: typing.List[LocationData] = [ - LocationData("Badge Shop Peach Kidnapped Flag 1", 0x3c0640, 2, 0x02000000, 0x00), - LocationData("Badge Shop Peach Kidnapped Flag 2", 0x3c0642, 2, 0x02000000, 0x00), - LocationData("Badge Shop Peach Kidnapped Flag 3", 0x3c0644, 2, 0x02000000, 0x00), - LocationData("Pants Shop Peach Kidnapped Flag 1", 0x3c0646, 2, 0x02000000, 0x00), - LocationData("Pants Shop Peach Kidnapped Flag 2", 0x3c0648, 2, 0x02000000, 0x00), - LocationData("Pants Shop Peach Kidnapped Flag 3", 0x3c064a, 2, 0x02000000, 0x00), - LocationData("Shop Peach Kidnapped Flag 1", 0x3c0606, 3, 0x02000000, 0x00), - LocationData("Shop Peach Kidnapped Flag 2", 0x3c0608, 3, 0x02000000, 0x00) + LocationData("Badge Shop Peach Kidnapped Flag 1", 0x3c0640, 2), + LocationData("Badge Shop Peach Kidnapped Flag 2", 0x3c0642, 2), + LocationData("Badge Shop Peach Kidnapped Flag 3", 0x3c0644, 2), + LocationData("Pants Shop Peach Kidnapped Flag 1", 0x3c0646, 2), + LocationData("Pants Shop Peach Kidnapped Flag 2", 0x3c0648, 2), + LocationData("Pants Shop Peach Kidnapped Flag 3", 0x3c064a, 2), + LocationData("Shop Peach Kidnapped Flag 1", 0x3c0606, 3), + LocationData("Shop Peach Kidnapped Flag 2", 0x3c0608, 3) ] beanstarFlag: typing.List[LocationData] = [ - LocationData("Badge Shop Beanstar Complete Flag 1", 0x3c064e, 2, 0x02000000, 0x00), - LocationData("Badge Shop Beanstar Complete Flag 2", 0x3c0650, 2, 0x02000000, 0x00), - LocationData("Badge Shop Beanstar Complete Flag 3", 0x3c0652, 2, 0x02000000, 0x00), - LocationData("Pants Shop Beanstar Complete Flag 1", 0x3c0654, 2, 0x02000000, 0x00), - LocationData("Pants Shop Beanstar Complete Flag 2", 0x3c0656, 2, 0x02000000, 0x00), - LocationData("Pants Shop Beanstar Complete Flag 3", 0x3c0658, 2, 0x02000000, 0x00), - LocationData("Shop Beanstar Complete Flag 1", 0x3c060c, 3, 0x02000000, 0x00), - LocationData("Shop Beanstar Complete Flag 2", 0x3c060e, 3, 0x02000000, 0x00), - LocationData("Shop Beanstar Complete Flag 3", 0x3c0610, 3, 0x02000000, 0x00) + LocationData("Badge Shop Beanstar Complete Flag 1", 0x3c064e, 2), + LocationData("Badge Shop Beanstar Complete Flag 2", 0x3c0650, 2), + LocationData("Badge Shop Beanstar Complete Flag 3", 0x3c0652, 2), + LocationData("Pants Shop Beanstar Complete Flag 1", 0x3c0654, 2), + LocationData("Pants Shop Beanstar Complete Flag 2", 0x3c0656, 2), + LocationData("Pants Shop Beanstar Complete Flag 3", 0x3c0658, 2), + LocationData("Shop Beanstar Complete Flag 1", 0x3c060c, 3), + LocationData("Shop Beanstar Complete Flag 2", 0x3c060e, 3), + LocationData("Shop Beanstar Complete Flag 3", 0x3c0610, 3) ] birdoFlag: typing.List[LocationData] = [ - LocationData("Badge Shop Birdo Flag 1", 0x3c065c, 2, 0x02000000, 0x00), - LocationData("Badge Shop Birdo Flag 2", 0x3c065e, 2, 0x02000000, 0x00), - LocationData("Badge Shop Birdo Flag 3", 0x3c0660, 2, 0x02000000, 0x00), - LocationData("Pants Shop Birdo Flag 1", 0x3c0662, 2, 0x02000000, 0x00), - LocationData("Pants Shop Birdo Flag 2", 0x3c0664, 2, 0x02000000, 0x00), - LocationData("Pants Shop Birdo Flag 3", 0x3c0666, 2, 0x02000000, 0x00), - LocationData("Shop Birdo Flag", 0x3c0614, 3, 0x02000000, 0x00) + LocationData("Badge Shop Birdo Flag 1", 0x3c065c, 2), + LocationData("Badge Shop Birdo Flag 2", 0x3c065e, 2), + LocationData("Badge Shop Birdo Flag 3", 0x3c0660, 2), + LocationData("Pants Shop Birdo Flag 1", 0x3c0662, 2), + LocationData("Pants Shop Birdo Flag 2", 0x3c0664, 2), + LocationData("Pants Shop Birdo Flag 3", 0x3c0666, 2), + LocationData("Shop Birdo Flag", 0x3c0614, 3) ] winkle: typing.List[LocationData] = [ - LocationData("Chucklehuck Woods Winkle Cave Block 1", 0x39df70, 0, 0x02000000, 0x00), - LocationData("Chucklehuck Woods Winkle Cave Block 2", 0x39df78, 0, 0x02000000, 0x00), - LocationData("Winkle Area Beanstar Room Block", 0x39df21, 0, 0x02000000, 0x00), - LocationData("Winkle Area Digspot", 0x39df2e, 0, 0x02000000, 0x00), - LocationData("Winkle Area Outside Colloseum Block", 0x39df3b, 0, 0x02000000, 0x00), - LocationData("Winkle Area Colloseum Digspot", 0x39e8a3, 0, 0x02000000, 0x00), - LocationData("Beanstar Piece Winkle Area", 0x1e9440, 2, 0x02000000, 0x00), - LocationData("Winkle Area Winkle Card", 0x261658, 1, 0x02000000, 0x00) + LocationData("Chucklehuck Woods Winkle Cave Block 1", 0x39df70, 0), + LocationData("Chucklehuck Woods Winkle Cave Block 2", 0x39df78, 0), + LocationData("Winkle Area Beanstar Room Block", 0x39df21, 0), + LocationData("Winkle Area Digspot", 0x39df2e, 0), + LocationData("Winkle Area Outside Colloseum Block", 0x39df3b, 0), + LocationData("Winkle Area Colloseum Digspot", 0x39e8a3, 0), + LocationData("Beanstar Piece Winkle Area", 0x1e9440, 2), + LocationData("Winkle Area Winkle Card", 0x261658, 1) ] sewers: typing.List[LocationData] = [ - LocationData("Sewers Room 3 Block 1", 0x39dfe6, 0, 0x02000000, 0x00), - LocationData("Sewers Room 3 Block 2", 0x39dfee, 0, 0x02000000, 0x00), - LocationData("Sewers Room 3 Block 3", 0x39dff6, 0, 0x02000000, 0x00), - LocationData("Sewers Room 5 Block 1", 0x39e006, 0, 0x02000000, 0x00), - LocationData("Sewers Room 5 Block 2", 0x39e00e, 0, 0x02000000, 0x00), - LocationData("Sewers Prison Room Block 1", 0x39e026, 0, 0x02000000, 0x00), - LocationData("Sewers Prison Room Block 2", 0x39e02e, 0, 0x02000000, 0x00), - LocationData("Sewers Prison Room Block 3", 0x39e036, 0, 0x02000000, 0x00), - LocationData("Sewers Prison Room Block 4", 0x39e03e, 0, 0x02000000, 0x00), - LocationData("Beanbean Castle Beanbean Brooch", 0x2578e7, 1, 0x02000000, 0x00) + LocationData("Sewers Room 3 Block 1", 0x39dfe6, 0), + LocationData("Sewers Room 3 Block 2", 0x39dfee, 0), + LocationData("Sewers Room 3 Block 3", 0x39dff6, 0), + LocationData("Sewers Room 5 Block 1", 0x39e006, 0), + LocationData("Sewers Room 5 Block 2", 0x39e00e, 0), + LocationData("Sewers Prison Room Block 1", 0x39e026, 0), + LocationData("Sewers Prison Room Block 2", 0x39e02e, 0), + LocationData("Sewers Prison Room Block 3", 0x39e036, 0), + LocationData("Sewers Prison Room Block 4", 0x39e03e, 0), + LocationData("Beanbean Castle Beanbean Brooch", 0x2578e7, 1) ] hooniversity: typing.List[LocationData] = [ - LocationData("Woohoo Hooniversity South Of Star Room Block", 0x39e16f, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Digspot 1", 0x39e194, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 1", 0x39e19c, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 2", 0x39e1a4, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 3", 0x39e1ac, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 4", 0x39e1b4, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Digspot 2", 0x39e1bc, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Sun Door Block 1", 0x39e28c, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Sun Door Block 2", 0x39e294, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Sun Door Block 3", 0x39e29c, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Cackletta Room 1 Block", 0x39e2ac, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Cackletta Room 2 Block 1", 0x39e2bf, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Cackletta Room 2 Block 2", 0x39e2c7, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Past Cackletta Room 2 Digspot", 0x39e2cf, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Basement Room 1 Digspot", 0x39e4c6, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Basement Room 2 Digspot", 0x39e4d3, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Basement Room 3 Block", 0x39e4e0, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Basement Room 4 Block", 0x39e4ed, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Popple Room Digspot 1", 0x39e4fa, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Popple Room Digspot 2", 0x39e502, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 1", 0x39ec05, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 2", 0x39ec0d, 0, 0x02000000, 0x00), - LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 3", 0x39ec15, 0, 0x02000000, 0x00) + LocationData("Woohoo Hooniversity South Of Star Room Block", 0x39e16f, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Digspot 1", 0x39e194, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 1", 0x39e19c, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 2", 0x39e1a4, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 3", 0x39e1ac, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Block 4", 0x39e1b4, 0), + LocationData("Woohoo Hooniversity Barrel Puzzle Entrance Digspot 2", 0x39e1bc, 0), + LocationData("Woohoo Hooniversity Past Sun Door Block 1", 0x39e28c, 0), + LocationData("Woohoo Hooniversity Past Sun Door Block 2", 0x39e294, 0), + LocationData("Woohoo Hooniversity Past Sun Door Block 3", 0x39e29c, 0), + LocationData("Woohoo Hooniversity Past Cackletta Room 1 Block", 0x39e2ac, 0), + LocationData("Woohoo Hooniversity Past Cackletta Room 2 Block 1", 0x39e2bf, 0), + LocationData("Woohoo Hooniversity Past Cackletta Room 2 Block 2", 0x39e2c7, 0), + LocationData("Woohoo Hooniversity Past Cackletta Room 2 Digspot", 0x39e2cf, 0), + LocationData("Woohoo Hooniversity Basement Room 1 Digspot", 0x39e4c6, 0), + LocationData("Woohoo Hooniversity Basement Room 2 Digspot", 0x39e4d3, 0), + LocationData("Woohoo Hooniversity Basement Room 3 Block", 0x39e4e0, 0), + LocationData("Woohoo Hooniversity Basement Room 4 Block", 0x39e4ed, 0), + LocationData("Woohoo Hooniversity Popple Room Digspot 1", 0x39e4fa, 0), + LocationData("Woohoo Hooniversity Popple Room Digspot 2", 0x39e502, 0), + LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 1", 0x39ec05, 0), + LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 2", 0x39ec0d, 0), + LocationData("Woohoo Hooniversity Solo Mario Barrel Area Block 3", 0x39ec15, 0) ] surfable: typing.List[LocationData] = [ - LocationData("Ocean North Whirlpool Block 1", 0x39e0a5, 0, 0x02000000, 0x00), - LocationData("Ocean North Whirlpool Block 2", 0x39e0ad, 0, 0x02000000, 0x00), - LocationData("Ocean North Whirlpool Block 3", 0x39e0b5, 0, 0x02000000, 0x00), - LocationData("Ocean North Whirlpool Block 4", 0x39e0bd, 0, 0x02000000, 0x00), - LocationData("Ocean North Whirlpool Digspot 1", 0x39e0c5, 0, 0x02000000, 0x00), - LocationData("Ocean North Whirlpool Digspot 2", 0x39e0cd, 0, 0x02000000, 0x00), - LocationData("Oho Ocean Fire Puzzle Room Digspot", 0x39e057, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 1", 0x39e0da, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 2", 0x39e0e2, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 3", 0x39e0ea, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 4", 0x39e0f2, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 5", 0x39e0fa, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Digspot 6", 0x39e102, 0, 0x02000000, 0x00), - LocationData("Ocean South Whirlpool Room 2 Digspot", 0x39e10f, 0, 0x02000000, 0x00), - LocationData("Jokes End Pipe Digspot", 0x39e6c2, 0, 0x02000000, 0x00), - LocationData("Jokes End Staircase Digspot", 0x39e6cf, 0, 0x02000000, 0x00), - LocationData("Surf Minigame", 0x2753ea, 1, 0x02000000, 0x00), - LocationData("North Ocean Whirlpool Mole", 0x277956, 1, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Surf Beach Digspot 1", 0x39dcfb, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Surf Beach Digspot 2", 0x39dd0b, 0, 0x02000000, 0x00), - LocationData("Beanbean Outskirts Surf Beach Digspot 3", 0x39dd13, 0, 0x02000000, 0x00) + LocationData("Ocean North Whirlpool Block 1", 0x39e0a5, 0), + LocationData("Ocean North Whirlpool Block 2", 0x39e0ad, 0), + LocationData("Ocean North Whirlpool Block 3", 0x39e0b5, 0), + LocationData("Ocean North Whirlpool Block 4", 0x39e0bd, 0), + LocationData("Ocean North Whirlpool Digspot 1", 0x39e0c5, 0), + LocationData("Ocean North Whirlpool Digspot 2", 0x39e0cd, 0), + LocationData("Oho Ocean Fire Puzzle Room Digspot", 0x39e057, 0), + LocationData("Ocean South Whirlpool Digspot 1", 0x39e0da, 0), + LocationData("Ocean South Whirlpool Digspot 2", 0x39e0e2, 0), + LocationData("Ocean South Whirlpool Digspot 3", 0x39e0ea, 0), + LocationData("Ocean South Whirlpool Digspot 4", 0x39e0f2, 0), + LocationData("Ocean South Whirlpool Digspot 5", 0x39e0fa, 0), + LocationData("Ocean South Whirlpool Digspot 6", 0x39e102, 0), + LocationData("Ocean South Whirlpool Room 2 Digspot", 0x39e10f, 0), + LocationData("Jokes End Pipe Digspot", 0x39e6c2, 0), + LocationData("Jokes End Staircase Digspot", 0x39e6cf, 0), + LocationData("Surf Minigame", 0x2753ea, 1), + LocationData("North Ocean Whirlpool Mole", 0x277956, 1), + LocationData("Beanbean Outskirts Surf Beach Digspot 1", 0x39dcfb, 0), + LocationData("Beanbean Outskirts Surf Beach Digspot 2", 0x39dd0b, 0), + LocationData("Beanbean Outskirts Surf Beach Digspot 3", 0x39dd13, 0) ] airport: typing.List[LocationData] = [ - LocationData("Airport Entrance Digspot", 0x39e2dc, 0, 0x02000000, 0x00), - LocationData("Airport Lobby Digspot", 0x39e2e9, 0, 0x02000000, 0x00), - LocationData("Airport Leftside Digspot 1", 0x39e2f6, 0, 0x02000000, 0x00), - LocationData("Airport Leftside Digspot 2", 0x39e2fe, 0, 0x02000000, 0x00), - LocationData("Airport Leftside Digspot 3", 0x39e306, 0, 0x02000000, 0x00), - LocationData("Airport Leftside Digspot 4", 0x39e30e, 0, 0x02000000, 0x00), - LocationData("Airport Leftside Digspot 5", 0x39e316, 0, 0x02000000, 0x00), - LocationData("Airport Middle Digspot 1", 0x39e323, 0, 0x02000000, 0x00), - LocationData("Airport Middle Digspot 2", 0x39e32b, 0, 0x02000000, 0x00), - LocationData("Airport Middle Digspot 3", 0x39e333, 0, 0x02000000, 0x00), - LocationData("Airport Middle Digspot 4", 0x39e33b, 0, 0x02000000, 0x00), - LocationData("Airport Middle Digspot 5", 0x39e343, 0, 0x02000000, 0x00), - LocationData("Airport Right Digspot 1", 0x39e350, 0, 0x02000000, 0x00), - LocationData("Airport Right Digspot 2", 0x39e358, 0, 0x02000000, 0x00), - LocationData("Airport Right Digspot 3", 0x39e360, 0, 0x02000000, 0x00), - LocationData("Airport Right Digspot 4", 0x39e368, 0, 0x02000000, 0x00), - LocationData("Airport Right Digspot 5", 0x39e370, 0, 0x02000000, 0x00) + LocationData("Airport Entrance Digspot", 0x39e2dc, 0), + LocationData("Airport Lobby Digspot", 0x39e2e9, 0), + LocationData("Airport Leftside Digspot 1", 0x39e2f6, 0), + LocationData("Airport Leftside Digspot 2", 0x39e2fe, 0), + LocationData("Airport Leftside Digspot 3", 0x39e306, 0), + LocationData("Airport Leftside Digspot 4", 0x39e30e, 0), + LocationData("Airport Leftside Digspot 5", 0x39e316, 0), + LocationData("Airport Middle Digspot 1", 0x39e323, 0), + LocationData("Airport Middle Digspot 2", 0x39e32b, 0), + LocationData("Airport Middle Digspot 3", 0x39e333, 0), + LocationData("Airport Middle Digspot 4", 0x39e33b, 0), + LocationData("Airport Middle Digspot 5", 0x39e343, 0), + LocationData("Airport Right Digspot 1", 0x39e350, 0), + LocationData("Airport Right Digspot 2", 0x39e358, 0), + LocationData("Airport Right Digspot 3", 0x39e360, 0), + LocationData("Airport Right Digspot 4", 0x39e368, 0), + LocationData("Airport Right Digspot 5", 0x39e370, 0) ] gwarharEntrance: typing.List[LocationData] = [ - LocationData("Gwarhar Lagoon Pipe Room Digspot", 0x39e37d, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Massage Parlor Entrance Digspot", 0x39e396, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon First Underwater Area Room 1 Block", 0x39e438, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon First Underwater Area Room 2 Block 1", 0x39e445, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon First Underwater Area Room 2 Block 2", 0x39e44d, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Red Pearl Bean", 0x235c1c, 1, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Green Pearl Bean", 0x235a5b, 1, 0x02000000, 0x00), - LocationData("Oho Ocean South Room 1 Block", 0x39e06a, 0, 0x02000000, 0x00), - LocationData("Oho Ocean South Room 2 Digspot", 0x39e077, 0, 0x02000000, 0x00) + LocationData("Gwarhar Lagoon Pipe Room Digspot", 0x39e37d, 0), + LocationData("Gwarhar Lagoon Massage Parlor Entrance Digspot", 0x39e396, 0), + LocationData("Gwarhar Lagoon First Underwater Area Room 1 Block", 0x39e438, 0), + LocationData("Gwarhar Lagoon First Underwater Area Room 2 Block 1", 0x39e445, 0), + LocationData("Gwarhar Lagoon First Underwater Area Room 2 Block 2", 0x39e44d, 0), + LocationData("Gwarhar Lagoon Red Pearl Bean", 0x235c1c, 1), + LocationData("Gwarhar Lagoon Green Pearl Bean", 0x235a5b, 1), + LocationData("Oho Ocean South Room 1 Block", 0x39e06a, 0), + LocationData("Oho Ocean South Room 2 Digspot", 0x39e077, 0) ] gwarharMain: typing.List[LocationData] = [ - LocationData("Gwarhar Lagoon Past Hermie Digspot", 0x39e3a6, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon East of Stone Bridge Block", 0x39e403, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon North of Spangle Room Digspot", 0x39e40b, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon West of Spangle Room Digspot", 0x39e41b, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 4 Digspot", 0x39e462, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 2 Digspot 1", 0x39e46f, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 2 Digspot 2", 0x39e477, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 1", 0x39e484, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 2", 0x39e48c, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 3", 0x39e494, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Second Underwater Area Room 1 Block", 0x39e4a1, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Entrance to West Underwater Area Digspot", 0x39e3bc, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 1", 0x39e3c9, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 2", 0x39e3d1, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 2 Digspot", 0x39e3de, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 1", 0x39e3eb, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 2", 0x39e3f3, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Spangle Room Block", 0x39e428, 0, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Spangle Reward", 0x236e73, 1, 0x02000000, 0x00), - LocationData("Beanstar Piece Hermie", 0x1e9443, 2, 0x02000000, 0x00), - LocationData("Gwarhar Lagoon Spangle", 0x1e9437, 2, 0x02000000, 0x00) + LocationData("Gwarhar Lagoon Past Hermie Digspot", 0x39e3a6, 0), + LocationData("Gwarhar Lagoon East of Stone Bridge Block", 0x39e403, 0), + LocationData("Gwarhar Lagoon North of Spangle Room Digspot", 0x39e40b, 0), + LocationData("Gwarhar Lagoon West of Spangle Room Digspot", 0x39e41b, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 4 Digspot", 0x39e462, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 2 Digspot 1", 0x39e46f, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 2 Digspot 2", 0x39e477, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 1", 0x39e484, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 2", 0x39e48c, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 3 Block 3", 0x39e494, 0), + LocationData("Gwarhar Lagoon Second Underwater Area Room 1 Block", 0x39e4a1, 0), + LocationData("Gwarhar Lagoon Entrance to West Underwater Area Digspot", 0x39e3bc, 0), + LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 1", 0x39e3c9, 0), + LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 2", 0x39e3d1, 0), + LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 2 Digspot", 0x39e3de, 0), + LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 1", 0x39e3eb, 0), + LocationData("Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 2", 0x39e3f3, 0), + LocationData("Gwarhar Lagoon Spangle Room Block", 0x39e428, 0), + LocationData("Gwarhar Lagoon Spangle Reward", 0x236e73, 1), + LocationData("Beanstar Piece Hermie", 0x1e9443, 2), + LocationData("Gwarhar Lagoon Spangle", 0x1e9437, 2) ] teeheeValley: typing.List[LocationData] = [ - LocationData("Teehee Valley Room 1 Digspot 1", 0x39e51e, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Room 1 Digspot 2", 0x39e526, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Room 1 Digspot 3", 0x39e52e, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Room 2 Digspot 1", 0x39e53b, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Room 2 Digspot 2", 0x39e543, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Room 2 Digspot 3", 0x39e54b, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Past Ultra Hammers Block 1", 0x39e580, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Past Ultra Hammers Block 2", 0x39e590, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Past Ultra Hammers Digspot 1", 0x39e598, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Past Ultra Hammers Digspot 3", 0x39e5a8, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Solo Luigi Maze Room 1 Block", 0x39e5e0, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Before Trunkle Digspot", 0x39e5f0, 0, 0x02000000, 0x00), - LocationData("S.S Chuckola Storage Room Block 1", 0x39e610, 0, 0x02000000, 0x00), - LocationData("S.S Chuckola Storage Room Block 2", 0x39e628, 0, 0x02000000, 0x00), - LocationData("S.S Chuckola Membership Card", 0x260637, 1, 0x02000000, 0x00) + LocationData("Teehee Valley Room 1 Digspot 1", 0x39e51e, 0), + LocationData("Teehee Valley Room 1 Digspot 2", 0x39e526, 0), + LocationData("Teehee Valley Room 1 Digspot 3", 0x39e52e, 0), + LocationData("Teehee Valley Room 2 Digspot 1", 0x39e53b, 0), + LocationData("Teehee Valley Room 2 Digspot 2", 0x39e543, 0), + LocationData("Teehee Valley Room 2 Digspot 3", 0x39e54b, 0), + LocationData("Teehee Valley Past Ultra Hammers Block 1", 0x39e580, 0), + LocationData("Teehee Valley Past Ultra Hammers Block 2", 0x39e590, 0), + LocationData("Teehee Valley Past Ultra Hammers Digspot 1", 0x39e598, 0), + LocationData("Teehee Valley Past Ultra Hammers Digspot 3", 0x39e5a8, 0), + LocationData("Teehee Valley Solo Luigi Maze Room 1 Block", 0x39e5e0, 0), + LocationData("Teehee Valley Before Trunkle Digspot", 0x39e5f0, 0), + LocationData("S.S Chuckola Storage Room Block 1", 0x39e610, 0), + LocationData("S.S Chuckola Storage Room Block 2", 0x39e628, 0), + LocationData("S.S Chuckola Membership Card", 0x260637, 1) ] fungitown: typing.List[LocationData] = [ - LocationData("Teehee Valley Trunkle Room Digspot", 0x39e5fd, 0, 0x02000000, 0x00), - LocationData("Fungitown Embassy Room Block", 0x39e66b, 0, 0x02000000, 0x00), - LocationData("Fungitown Entrance Room Block", 0x39e67e, 0, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Starting Flag 1", 0x3c0684, 2, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Starting Flag 2", 0x3c0686, 2, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Starting Flag 3", 0x3c0688, 2, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 1", 0x3c066a, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 2", 0x3c066c, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 3", 0x3c066e, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 4", 0x3c0670, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 5", 0x3c0672, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 6", 0x3c0674, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 7", 0x3c0676, 3, 0x02000000, 0x00), - LocationData("Fungitown Shop Starting Flag 8", 0x3c0678, 3, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Starting Flag 1", 0x3c068a, 2, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Starting Flag 2", 0x3c068c, 2, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Starting Flag 3", 0x3c068e, 2, 0x02000000, 0x00) + LocationData("Teehee Valley Trunkle Room Digspot", 0x39e5fd, 0), + LocationData("Fungitown Embassy Room Block", 0x39e66b, 0), + LocationData("Fungitown Entrance Room Block", 0x39e67e, 0), + LocationData("Fungitown Badge Shop Starting Flag 1", 0x3c0684, 2), + LocationData("Fungitown Badge Shop Starting Flag 2", 0x3c0686, 2), + LocationData("Fungitown Badge Shop Starting Flag 3", 0x3c0688, 2), + LocationData("Fungitown Shop Starting Flag 1", 0x3c066a, 3), + LocationData("Fungitown Shop Starting Flag 2", 0x3c066c, 3), + LocationData("Fungitown Shop Starting Flag 3", 0x3c066e, 3), + LocationData("Fungitown Shop Starting Flag 4", 0x3c0670, 3), + LocationData("Fungitown Shop Starting Flag 5", 0x3c0672, 3), + LocationData("Fungitown Shop Starting Flag 6", 0x3c0674, 3), + LocationData("Fungitown Shop Starting Flag 7", 0x3c0676, 3), + LocationData("Fungitown Shop Starting Flag 8", 0x3c0678, 3), + LocationData("Fungitown Pants Shop Starting Flag 1", 0x3c068a, 2), + LocationData("Fungitown Pants Shop Starting Flag 2", 0x3c068c, 2), + LocationData("Fungitown Pants Shop Starting Flag 3", 0x3c068e, 2) ] fungitownBeanstar: typing.List[LocationData] = [ - LocationData("Fungitown Badge Shop Beanstar Complete Flag 1", 0x3c0692, 2, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Beanstar Complete Flag 2", 0x3c0694, 2, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Beanstar Complete Flag 1", 0x3c0696, 2, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Beanstar Complete Flag 2", 0x3c0698, 2, 0x02000000, 0x00), - LocationData("Fungitown Shop Beanstar Complete Flag", 0x3c067c, 3, 0x02000000, 0x00) + LocationData("Fungitown Badge Shop Beanstar Complete Flag 1", 0x3c0692, 2), + LocationData("Fungitown Badge Shop Beanstar Complete Flag 2", 0x3c0694, 2), + LocationData("Fungitown Pants Shop Beanstar Complete Flag 1", 0x3c0696, 2), + LocationData("Fungitown Pants Shop Beanstar Complete Flag 2", 0x3c0698, 2), + LocationData("Fungitown Shop Beanstar Complete Flag", 0x3c067c, 3) ] fungitownBirdo: typing.List[LocationData] = [ - LocationData("Fungitown Shop Birdo Flag", 0x3c0680, 3, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Birdo Flag 1", 0x3c06a0, 2, 0x02000000, 0x00), - LocationData("Fungitown Pants Shop Birdo Flag 2", 0x3c06a2, 2, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Birdo Flag 1", 0x3c069c, 2, 0x02000000, 0x00), - LocationData("Fungitown Badge Shop Birdo Flag 2", 0x3c069e, 2, 0x02000000, 0x00) + LocationData("Fungitown Shop Birdo Flag", 0x3c0680, 3), + LocationData("Fungitown Pants Shop Birdo Flag 1", 0x3c06a0, 2), + LocationData("Fungitown Pants Shop Birdo Flag 2", 0x3c06a2, 2), + LocationData("Fungitown Badge Shop Birdo Flag 1", 0x3c069c, 2), + LocationData("Fungitown Badge Shop Birdo Flag 2", 0x3c069e, 2) ] bowsers: typing.List[LocationData] = [ - LocationData("Bowser's Castle Entrance Block 1", 0x39e9d2, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Entrance Block 2", 0x39e9da, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Entrance Digspot", 0x39e9e2, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Iggy & Morton Hallway Block 1", 0x39e9ef, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Iggy & Morton Hallway Block 2", 0x39e9f7, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Iggy & Morton Hallway Digspot", 0x39e9ff, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle After Morton Block", 0x39ea0c, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Morton Room 1 Digspot", 0x39ea89, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Lemmy Room 1 Block", 0x39ea9c, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Lemmy Room 1 Digspot", 0x39eaa4, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Ludwig Room 1 Block", 0x39eaba, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Lemmy Room Mole", 0x277b1f, 1, 0x02000000, 0x00) + LocationData("Bowser's Castle Entrance Block 1", 0x39e9d2, 0), + LocationData("Bowser's Castle Entrance Block 2", 0x39e9da, 0), + LocationData("Bowser's Castle Entrance Digspot", 0x39e9e2, 0), + LocationData("Bowser's Castle Iggy & Morton Hallway Block 1", 0x39e9ef, 0), + LocationData("Bowser's Castle Iggy & Morton Hallway Block 2", 0x39e9f7, 0), + LocationData("Bowser's Castle Iggy & Morton Hallway Digspot", 0x39e9ff, 0), + LocationData("Bowser's Castle After Morton Block", 0x39ea0c, 0), + LocationData("Bowser's Castle Morton Room 1 Digspot", 0x39ea89, 0), + LocationData("Bowser's Castle Lemmy Room 1 Block", 0x39ea9c, 0), + LocationData("Bowser's Castle Lemmy Room 1 Digspot", 0x39eaa4, 0), + LocationData("Bowser's Castle Ludwig Room 1 Block", 0x39eaba, 0), + LocationData("Bowser's Castle Lemmy Room Mole", 0x277b1f, 1) ] bowsersMini: typing.List[LocationData] = [ - LocationData("Bowser's Castle Ludwig & Roy Hallway Block 1", 0x39ea1c, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Ludwig & Roy Hallway Block 2", 0x39ea24, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Roy Corridor Block 1", 0x39ea31, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Roy Corridor Block 2", 0x39ea39, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Mini Mario Sidescroller Block 1", 0x39ead6, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Mini Mario Sidescroller Block 2", 0x39eade, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Mini Mario Maze Block 1", 0x39eaeb, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Mini Mario Maze Block 2", 0x39eaf3, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Before Wendy Fight Block 1", 0x39eb12, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Before Wendy Fight Block 2", 0x39eb1a, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Larry Room Block", 0x39ebb6, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Wendy & Larry Hallway Digspot", 0x39ea46, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Before Fawful Fight Block 1", 0x39ea56, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Before Fawful Fight Block 2", 0x39ea5e, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Great Door Block 1", 0x39ea6b, 0, 0x02000000, 0x00), - LocationData("Bowser's Castle Great Door Block 2", 0x39ea73, 0, 0x02000000, 0x00) + LocationData("Bowser's Castle Ludwig & Roy Hallway Block 1", 0x39ea1c, 0), + LocationData("Bowser's Castle Ludwig & Roy Hallway Block 2", 0x39ea24, 0), + LocationData("Bowser's Castle Roy Corridor Block 1", 0x39ea31, 0), + LocationData("Bowser's Castle Roy Corridor Block 2", 0x39ea39, 0), + LocationData("Bowser's Castle Mini Mario Sidescroller Block 1", 0x39ead6, 0), + LocationData("Bowser's Castle Mini Mario Sidescroller Block 2", 0x39eade, 0), + LocationData("Bowser's Castle Mini Mario Maze Block 1", 0x39eaeb, 0), + LocationData("Bowser's Castle Mini Mario Maze Block 2", 0x39eaf3, 0), + LocationData("Bowser's Castle Before Wendy Fight Block 1", 0x39eb12, 0), + LocationData("Bowser's Castle Before Wendy Fight Block 2", 0x39eb1a, 0), + LocationData("Bowser's Castle Larry Room Block", 0x39ebb6, 0), + LocationData("Bowser's Castle Wendy & Larry Hallway Digspot", 0x39ea46, 0), + LocationData("Bowser's Castle Before Fawful Fight Block 1", 0x39ea56, 0), + LocationData("Bowser's Castle Before Fawful Fight Block 2", 0x39ea5e, 0), + LocationData("Bowser's Castle Great Door Block 1", 0x39ea6b, 0), + LocationData("Bowser's Castle Great Door Block 2", 0x39ea73, 0) ] jokesEntrance: typing.List[LocationData] = [ - LocationData("Jokes End West of First Boiler Room Block 1", 0x39e6e5, 0, 0x02000000, 0x00), - LocationData("Jokes End West of First Boiler Room Block 2", 0x39e6ed, 0, 0x02000000, 0x00), - LocationData("Jokes End First Boiler Room Digspot 1", 0x39e6fa, 0, 0x02000000, 0x00), - LocationData("Jokes End First Boiler Room Digspot 2", 0x39e702, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Floor West Room Block 1", 0x39e761, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Floor West Room Block 2", 0x39e769, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Floor West Room Block 3", 0x39e779, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Floor West Room Block 4", 0x39e781, 0, 0x02000000, 0x00), - LocationData("Jokes End Mole Reward 1", 0x27788e, 1, 0x02000000, 0x00), - LocationData("Jokes End Mole Reward 2", 0x2778d2, 1, 0x02000000, 0x00) + LocationData("Jokes End West of First Boiler Room Block 1", 0x39e6e5, 0), + LocationData("Jokes End West of First Boiler Room Block 2", 0x39e6ed, 0), + LocationData("Jokes End First Boiler Room Digspot 1", 0x39e6fa, 0), + LocationData("Jokes End First Boiler Room Digspot 2", 0x39e702, 0), + LocationData("Jokes End Second Floor West Room Block 1", 0x39e761, 0), + LocationData("Jokes End Second Floor West Room Block 2", 0x39e769, 0), + LocationData("Jokes End Second Floor West Room Block 3", 0x39e779, 0), + LocationData("Jokes End Second Floor West Room Block 4", 0x39e781, 0), + LocationData("Jokes End Mole Reward 1", 0x27788e, 1), + LocationData("Jokes End Mole Reward 2", 0x2778d2, 1) ] jokesMain: typing.List[LocationData] = [ - LocationData("Jokes End Furnace Room 1 Block 1", 0x39e70f, 0, 0x02000000, 0x00), - LocationData("Jokes End Furnace Room 1 Block 2", 0x39e717, 0, 0x02000000, 0x00), - LocationData("Jokes End Furnace Room 1 Block 3", 0x39e71f, 0, 0x02000000, 0x00), - LocationData("Jokes End Northeast of Boiler Room 1 Block", 0x39e732, 0, 0x02000000, 0x00), - LocationData("Jokes End Northeast of Boiler Room 3 Digspot", 0x39e73f, 0, 0x02000000, 0x00), - LocationData("Jokes End Northeast of Boiler Room 2 Block", 0x39e74c, 0, 0x02000000, 0x00), - LocationData("Jokes End Northeast of Boiler Room 2 Digspot", 0x39e754, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Floor East Room Digspot", 0x39e794, 0, 0x02000000, 0x00), - LocationData("Jokes End Final Split up Room Digspot", 0x39e7a7, 0, 0x02000000, 0x00), - LocationData("Jokes End South of Bridge Room Block", 0x39e7b4, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Luigi Room 1 Block", 0x39e7c4, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Luigi Room 1 Digspot", 0x39e7cc, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Final Room Block 1", 0x39e7d9, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Final Room Block 2", 0x39e7e1, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Final Room Block 3", 0x39e7e9, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Luigi Room 2 Digspot", 0x39e7fc, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Room 1 Digspot", 0x39e809, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Room 2 Block 1", 0x39e819, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Room 2 Block 2", 0x39e821, 0, 0x02000000, 0x00), - LocationData("Jokes End Solo Mario Room 2 Block 3", 0x39e829, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Boiler Room Digspot 1", 0x39e84f, 0, 0x02000000, 0x00), - LocationData("Jokes End Second Boiler Room Digspot 2", 0x39e857, 0, 0x02000000, 0x00), - LocationData("Jokes End North of Second Boiler Room Block 1", 0x39e864, 0, 0x02000000, 0x00), - LocationData("Jokes End North of Second Boiler Room Block 2", 0x39e86c, 0, 0x02000000, 0x00), - LocationData("Jokes End Before Jojora Room Block 1", 0x39e927, 0, 0x02000000, 0x00), - LocationData("Jokes End Before Jojora Room Block 2", 0x39e92f, 0, 0x02000000, 0x00), - LocationData("Jokes End Before Jojora Room Digspot", 0x39e937, 0, 0x02000000, 0x00), - LocationData("Jokes End Jojora Room Digspot", 0x39e944, 0, 0x02000000, 0x00) + LocationData("Jokes End Furnace Room 1 Block 1", 0x39e70f, 0), + LocationData("Jokes End Furnace Room 1 Block 2", 0x39e717, 0), + LocationData("Jokes End Furnace Room 1 Block 3", 0x39e71f, 0), + LocationData("Jokes End Northeast of Boiler Room 1 Block", 0x39e732, 0), + LocationData("Jokes End Northeast of Boiler Room 3 Digspot", 0x39e73f, 0), + LocationData("Jokes End Northeast of Boiler Room 2 Block", 0x39e74c, 0), + LocationData("Jokes End Northeast of Boiler Room 2 Digspot", 0x39e754, 0), + LocationData("Jokes End Second Floor East Room Digspot", 0x39e794, 0), + LocationData("Jokes End Final Split up Room Digspot", 0x39e7a7, 0), + LocationData("Jokes End South of Bridge Room Block", 0x39e7b4, 0), + LocationData("Jokes End Solo Luigi Room 1 Block", 0x39e7c4, 0), + LocationData("Jokes End Solo Luigi Room 1 Digspot", 0x39e7cc, 0), + LocationData("Jokes End Solo Mario Final Room Block 1", 0x39e7d9, 0), + LocationData("Jokes End Solo Mario Final Room Block 2", 0x39e7e1, 0), + LocationData("Jokes End Solo Mario Final Room Block 3", 0x39e7e9, 0), + LocationData("Jokes End Solo Luigi Room 2 Digspot", 0x39e7fc, 0), + LocationData("Jokes End Solo Mario Room 1 Digspot", 0x39e809, 0), + LocationData("Jokes End Solo Mario Room 2 Block 1", 0x39e819, 0), + LocationData("Jokes End Solo Mario Room 2 Block 2", 0x39e821, 0), + LocationData("Jokes End Solo Mario Room 2 Block 3", 0x39e829, 0), + LocationData("Jokes End Second Boiler Room Digspot 1", 0x39e84f, 0), + LocationData("Jokes End Second Boiler Room Digspot 2", 0x39e857, 0), + LocationData("Jokes End North of Second Boiler Room Block 1", 0x39e864, 0), + LocationData("Jokes End North of Second Boiler Room Block 2", 0x39e86c, 0), + LocationData("Jokes End Before Jojora Room Block 1", 0x39e927, 0), + LocationData("Jokes End Before Jojora Room Block 2", 0x39e92f, 0), + LocationData("Jokes End Before Jojora Room Digspot", 0x39e937, 0), + LocationData("Jokes End Jojora Room Digspot", 0x39e944, 0) ] postJokes: typing.List[LocationData] = [ - LocationData("Teehee Valley Past Ultra Hammers Digspot 2", 0x39e5a0, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Before Popple Digspot 1", 0x39e55b, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Before Popple Digspot 2", 0x39e563, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Before Popple Digspot 3", 0x39e56b, 0, 0x02000000, 0x00), - LocationData("Teehee Valley Before Popple Digspot 4", 0x39e573, 0, 0x02000000, 0x00) + LocationData("Teehee Valley Past Ultra Hammers Digspot 2", 0x39e5a0, 0), + LocationData("Teehee Valley Before Popple Digspot 1", 0x39e55b, 0), + LocationData("Teehee Valley Before Popple Digspot 2", 0x39e563, 0), + LocationData("Teehee Valley Before Popple Digspot 3", 0x39e56b, 0), + LocationData("Teehee Valley Before Popple Digspot 4", 0x39e573, 0) ] theater: typing.List[LocationData] = [ - LocationData("Yoshi Theater Blue Yoshi", 0x241155, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Red Yoshi", 0x240ebe, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Green Yoshi", 0x241afa, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Yellow Yoshi", 0x241c3c, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Purple Yoshi", 0x241297, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Orange Yoshi", 0x241000, 1, 0x02000000, 0x00), - LocationData("Yoshi Theater Azure Yoshi", 0x241d7e, 1, 0x02000000, 0x00), - LocationData("Beanstar Piece Yoshi Theater", 0x1e9442, 2, 0x02000000, 0x00) + LocationData("Yoshi Theater Blue Yoshi", 0x241155, 1), + LocationData("Yoshi Theater Red Yoshi", 0x240ebe, 1), + LocationData("Yoshi Theater Green Yoshi", 0x241afa, 1), + LocationData("Yoshi Theater Yellow Yoshi", 0x241c3c, 1), + LocationData("Yoshi Theater Purple Yoshi", 0x241297, 1), + LocationData("Yoshi Theater Orange Yoshi", 0x241000, 1), + LocationData("Yoshi Theater Azure Yoshi", 0x241d7e, 1), + LocationData("Beanstar Piece Yoshi Theater", 0x1e9442, 2) ] oasis: typing.List[LocationData] = [ - LocationData("Oho Oasis West Digspot", 0x39df9f, 0, 0x02000000, 0x00), - LocationData("Oho Oasis Fire Palace Block", 0x39dfbe, 0, 0x02000000, 0x00), - LocationData("Oho Ocean Spike Room Digspot 1", 0x39e08a, 0, 0x02000000, 0x00), - LocationData("Oho Ocean Spike Room Digspot 2", 0x39e092, 0, 0x02000000, 0x00), - LocationData("Oho Oasis Firebrand", 0x1e9408, 2, 0x02000000, 0x00), - LocationData("Oho Oasis Thunderhand", 0x1e9409, 2, 0x02000000, 0x00) + LocationData("Oho Oasis West Digspot", 0x39df9f, 0), + LocationData("Oho Oasis Fire Palace Block", 0x39dfbe, 0), + LocationData("Oho Ocean Spike Room Digspot 1", 0x39e08a, 0), + LocationData("Oho Ocean Spike Room Digspot 2", 0x39e092, 0), + LocationData("Oho Oasis Firebrand", 0x1e9408, 2), + LocationData("Oho Oasis Thunderhand", 0x1e9409, 2) ] event: typing.List[LocationData] = [ - LocationData("Dragohoho", 0xDA0000, 0, 0x02000000, 0x00), - LocationData("Queen Bean", 0xDA0001, 0, 0x02000000, 0x00), - LocationData("Chuckolator", 0xDA0002, 0, 0x02000000, 0x00), - LocationData("Popple 2", 0xDA0003, 0, 0x02000000, 0x00), - LocationData("Mom Piranha", 0xDA0004, 0, 0x02000000, 0x00), - LocationData("Fungitown", 0xDA0005, 0, 0x02000000, 0x00), - LocationData("Beanstar", 0xDA0006, 2, 0x02000000, 0x00), - LocationData("Jojora", 0xDA0007, 2, 0x02000000, 0x00), - LocationData("Birdo", 0xDA0008, 2, 0x02000000, 0x00) + LocationData("Dragohoho", 0xDA0000, 0), + LocationData("Queen Bean", 0xDA0001, 0), + LocationData("Chuckolator", 0xDA0002, 0), + LocationData("Popple 2", 0xDA0003, 0), + LocationData("Mom Piranha", 0xDA0004, 0), + LocationData("Fungitown", 0xDA0005, 0), + LocationData("Beanstar", 0xDA0006, 2), + LocationData("Jojora", 0xDA0007, 2), + LocationData("Birdo", 0xDA0008, 2) ] nonBlock: list[(int, int, int)] = [ @@ -852,11 +890,11 @@ class MLSSLocation(Location): 0x25122F: 0x39d74e, 0x251288: 0x39d756, 0x2512E1: 0x39d75e, - 0x2517C3: 0x39d76b, - 0x25181F: 0x39d773, - 0x25187B: 0x39d77b, - 0x25170B: 0x39d783, - 0x251767: 0x39d78b + 0x25170B: 0x39d76b, + 0x251767: 0x39d773, + 0x2517C3: 0x39d77b, + 0x25181F: 0x39d783, + 0x25187B: 0x39d78b } roomCount: dict[int, int] = { @@ -1083,6 +1121,6 @@ class MLSSLocation(Location): chuckolatorFlag + piranhaFlag + kidnappedFlag + beanstarFlag + birdoFlag + \ winkle + sewers + hooniversity + surfable + airport + gwarharEntrance + \ teeheeValley + fungitown + fungitownBeanstar + fungitownBirdo + bowsers + \ - jokesEntrance + jokesMain + postJokes + theater + oasis + gwarharMain + bowsersMini + baseUltraRocks + event + jokesEntrance + jokesMain + postJokes + theater + oasis + gwarharMain + bowsersMini + baseUltraRocks + event + coins location_table: typing.Dict[str, int] = {locData.name: locData.id for locData in all_locations} diff --git a/Options.py b/Options.py index 28c6cc7..595cf47 100644 --- a/Options.py +++ b/Options.py @@ -203,6 +203,20 @@ class HiddenVisible(Toggle): display_name = "Hidden Blocks Visible" +class BlocksInvisible(Toggle): + """ + Turns any item blocks in the game into hidden blocks. + """ + display_name = "Item Blocks Invisible" + + +class Coins(Toggle): + """ + Add all coin blocks in the game to the location pool. + """ + display_name = "Coin Blocks" + + class HarhallsPants(Toggle): """ This will remove the Harhall's Pants check from the pool. @@ -210,6 +224,15 @@ class HarhallsPants(Toggle): display_name = "Remove Harhall's Pants" +class DifficultLogic(Toggle): + """ + This adjusts the logic to be more difficult in a few areas, + allowing for the logic to account for players getting to certain area's in unintended ways. + Enable at your own risk, this is not an option made for beginners. + """ + display_name = "Difficult Logic Toggle" + + class ChuckleBeans(Choice): """ Choose how you want chuckle bean digspots to be randomized. @@ -226,6 +249,8 @@ class ChuckleBeans(Choice): mlss_options: typing.Dict[str, type(Option)] = { "start_inventory_from_pool": StartInventoryPool, + "coins": Coins, + "difficult_logic": DifficultLogic, "skip_intro": IntroSkip, "castle_skip": BowsersCastleSkip, "castle_start": CastleStart, @@ -233,6 +258,7 @@ class ChuckleBeans(Choice): "disable_surf": DisableSurf, "harhalls_pants": HarhallsPants, "hidden_visible": HiddenVisible, + "blocks_invisible": BlocksInvisible, "chuckle_beans": ChuckleBeans, "randomize_music": RandomMusic, "disable_music": DisableMusic, diff --git a/Regions.py b/Regions.py index e75714d..b8c7249 100644 --- a/Regions.py +++ b/Regions.py @@ -5,7 +5,7 @@ from .Locations import MLSSLocation, mainArea, chucklehuck, castleTown, startingFlag, chuckolatorFlag, piranhaFlag, \ kidnappedFlag, beanstarFlag, birdoFlag, surfable, hooniversity, gwarharEntrance, gwarharMain, \ fungitown, fungitownBeanstar, fungitownBirdo, teeheeValley, winkle, sewers, airport, \ - bowsers, bowsersMini, jokesEntrance, jokesMain, theater, booStatue, oasis, postJokes, baseUltraRocks, event + bowsers, bowsersMini, jokesEntrance, jokesMain, theater, booStatue, oasis, postJokes, baseUltraRocks, event, coins from . import StateLogic from .Names.LocationName import LocationName @@ -95,6 +95,10 @@ def create_regions(world: MultiWorld, player: int, excluded: typing.List[str]): event_region = create_region(world, player, "Event", event, excluded) world.regions.append(event_region) + if world.coins[player]: + coins_region = create_region(world, player, "Coins", coins, excluded) + world.regions.append(coins_region) + if not world.castle_skip[player]: bowsers_region = create_region(world, player, "Bowser's Castle", bowsers, excluded) world.regions.append(bowsers_region) @@ -110,6 +114,8 @@ def connect_regions(world: MultiWorld, player: int): connect(world, player, names, "Menu", "Main Area") connect(world, player, names, "Main Area", "Event") + if world.coins[player]: + connect(world, player, names, "Main Area", "Coins") connect(world, player, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, player)) connect(world, player, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, player)) connect(world, player, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, player)) @@ -134,14 +140,18 @@ def connect_regions(world: MultiWorld, player: int): connect(world, player, names, "Surfable", "GwarharEntrance") connect(world, player, names, "Surfable", "Oasis") connect(world, player, names, "Surfable", "JokesEntrance", lambda state: StateLogic.fire(state, player)) - connect(world, player, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, player) and StateLogic.canDig(state, player)) connect(world, player, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, player)) if not world.castle_skip[player]: connect(world, player, names, "PostJokes", "Bowser's Castle") - connect(world, player, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, player)) + connect(world, player, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, player) and StateLogic.thunder(state, player)) connect(world, player, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, player)) connect(world, player, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, player)) - connect(world, player, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, player) and StateLogic.canCrash(state, player)) + if world.difficult_logic[player]: + connect(world, player, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, player)) + connect(world, player, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, player)) + else: + connect(world, player, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, player) and StateLogic.canCrash(state, player)) + connect(world, player, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, player) and StateLogic.canDig(state, player)) def create_region(world, player, name, locations, excluded): diff --git a/Rom.py b/Rom.py index 4e0dbec..ca3f8fe 100644 --- a/Rom.py +++ b/Rom.py @@ -150,12 +150,14 @@ def item_inject(self, location: int, item_type: int, item: Item): if item_type == 0: self.stream.seek(location, 0) self.stream.write(bytes([code])) - if self.world.hidden_visible[self.player]: + self.stream.seek(location - 6, 0) + b = self.stream.read(1) + if b[0] == 0x10 and self.world.hidden_visible[self.player]: self.stream.seek(location - 6, 0) - b = self.stream.read(1) - if b[0] == 0x10: - self.stream.seek(location - 6, 0) - self.stream.write(bytes([0x0])) + self.stream.write(bytes([0x0])) + if b[0] == 0x0 and self.world.blocks_invisible[self.player]: + self.stream.seek(location - 6, 0) + self.stream.write(bytes([0x10])) elif item_type == 1: if code == 0x1D or code == 0x1E: code += 0xE @@ -249,17 +251,15 @@ def patch_options(self): self.stream.seek(0x25FD4E, 0) self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) self.stream.seek(0x25FD83, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF])) self.stream.seek(0x25FDB8, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + self.stream.write(bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) self.stream.seek(0x25FDED, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + self.stream.write(bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) self.stream.seek(0x25FE22, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + self.stream.write(bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) self.stream.seek(0x25FE57, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) - self.stream.seek(0x25FD4E, 0) - self.stream.write(bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + self.stream.write(bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF])) self.swap_colors(colors[self.world.mario_color[self.player]], 0) self.swap_colors(colors[self.world.luigi_color[self.player]], 1) diff --git a/Rules.py b/Rules.py index c446de0..5b7f0ef 100644 --- a/Rules.py +++ b/Rules.py @@ -15,8 +15,10 @@ def set_rules(world: MultiWorld, player: int, excluded): add_rule(world.get_location(location.name, player), lambda state: StateLogic.canDig(state, player)) if "Beanstone" in location.name: add_rule(world.get_location(location.name, player), lambda state: StateLogic.canDig(state, player)) - if "Shop" in location.name and location not in excluded: + if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: forbid_item(world.get_location(location.name, player), "Hammers", player) + if location.itemType != 0 and location.name not in excluded: + forbid_item(world.get_location(location.name, player), "5 Coins", player) if world.chuckle_beans[player] == 2: add_rule(world.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, player), @@ -218,3 +220,55 @@ def set_rules(world: MultiWorld, player: int, excluded): lambda state: StateLogic.brooch(state, player) and StateLogic.canDig(state, player)) add_rule(world.get_location(LocationName.ChateauRedGoblet, player), lambda state: StateLogic.brooch(state, player) and StateLogic.canMini(state, player)) + if world.difficult_logic[player]: + add_rule(world.get_location(LocationName.GwarharLagoonSpangleReward, player), + lambda state: StateLogic.canCrash(state, player)) + add_rule(world.get_location(LocationName.BeanstarPieceHermie, player), + lambda state: StateLogic.canCrash(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonPastHermieDigspot, player), + lambda state: StateLogic.canCrash(state, player)) + + if world.coins[player]: + add_rule(world.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 1", player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location("Beanbean Outskirts NW Coin Block", player), + lambda state: StateLogic.super(state, player)) + add_rule(world.get_location("Beanbean Outskirts S Room 1 Coin Block", player), + lambda state: StateLogic.ultra(state, player) and StateLogic.thunder(state, player)) + add_rule(world.get_location("Beanbean Outskirts S Room 2 Coin Block", player), + lambda state: StateLogic.canCrash(state, player)) + add_rule(world.get_location("Chateau Popple Room Coin Block 1", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chateau Popple Room Coin Block 2", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chucklehuck Woods Cave Room 1 Coin Block", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chucklehuck Woods Cave Room 2 Coin Block", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chucklehuck Woods Cave Room 3 Coin Block", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", player), + lambda state: StateLogic.brooch(state, player) and StateLogic.hammers(state, player)) + add_rule(world.get_location("Chucklehuck Woods Room 7 Coin Block", player), + lambda state: StateLogic.brooch(state, player) and StateLogic.hammers(state, player)) + add_rule(world.get_location("Chucklehuck Woods After Chuckleroot Coin Block", player), + lambda state: StateLogic.brooch(state, player) and StateLogic.fruits(state, player)) + add_rule(world.get_location("Chucklehuck Woods Koopa Room Coin Block", player), + lambda state: StateLogic.brooch(state, player)) + add_rule(world.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", player), + lambda state: StateLogic.brooch(state, player) and StateLogic.canDash(state, player)) + add_rule(world.get_location("Sewers Prison Room Coin Block", player), + lambda state: StateLogic.rose(state, player)) + add_rule(world.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location("S.S Chuckola Storage Room Coin Block 1", player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location("S.S Chuckola Storage Room Coin Block 2", player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location("Jokes End Second Floor West Room Coin Block", player), + lambda state: StateLogic.ultra(state, player) and StateLogic.fire(state, player) and (StateLogic.membership(state, player) or (StateLogic.canDig(state, player) and StateLogic.canMini(state, player)))) + diff --git a/StateLogic.py b/StateLogic.py index 6398067..edb9f99 100644 --- a/StateLogic.py +++ b/StateLogic.py @@ -85,7 +85,7 @@ def surfable(state, player): def postJokes(state, player): - return surfable(state, player) and canDig(state, player) and canDash(state, player) and canCrash(state, player) and dressBeanstar(state, player) and pieces(state, player) and fruits(state, player) and brooch(state, player) and rose(state, player) + return surfable(state, player) and canDig(state, player) and dressBeanstar(state, player) and pieces(state, player) and fruits(state, player) and brooch(state, player) and rose(state, player) def teehee(state, player): diff --git a/__init__.py b/__init__.py index eac466d..3f7c6ef 100644 --- a/__init__.py +++ b/__init__.py @@ -3,7 +3,7 @@ from typing import Dict, Any from BaseClasses import Tutorial, ItemClassification from ..AutoWorld import WebWorld, World -from .Locations import all_locations, location_table, bowsers, bowsersMini, event, hidden +from .Locations import all_locations, location_table, bowsers, bowsersMini, event, hidden, coins from .Options import mlss_options from .Regions import create_regions, connect_regions from .Rules import set_rules @@ -58,6 +58,8 @@ def generate_early(self) -> None: self.excluded_locations = [] if self.multiworld.chuckle_beans[self.player] == 0: self.excluded_locations += [location.name for location in all_locations if "Digspot" in location.name] + if self.multiworld.castle_skip[self.player]: + self.excluded_locations += [location.name for location in all_locations if "Bowser" in location.name] if self.multiworld.chuckle_beans[self.player] == 1: self.excluded_locations = [location.name for location in all_locations if location.id in hidden] if self.multiworld.skip_minecart[self.player]: @@ -66,6 +68,8 @@ def generate_early(self) -> None: self.excluded_locations += [LocationName.SurfMinigame] if self.multiworld.harhalls_pants[self.player]: self.excluded_locations += [LocationName.HarhallsPants] + if not self.multiworld.harhalls_pants[self.player]: + self.excluded_locations += [location.name for location in all_locations if location in coins] def create_regions(self) -> None: create_regions(self.multiworld, self.player, self.excluded_locations) @@ -77,7 +81,9 @@ def fill_slot_data(self) -> dict: "SkipMinecart": self.multiworld.skip_minecart[self.player].value, "DisableSurf": self.multiworld.disable_surf[self.player].value, "HarhallsPants": self.multiworld.harhalls_pants[self.player].value, - "ChuckleBeans": self.multiworld.chuckle_beans[self.player].value + "ChuckleBeans": self.multiworld.chuckle_beans[self.player].value, + "DifficultLogic": self.multiworld.difficult_logic[self.player].value, + "Coins": self.multiworld.coins[self.player].value } def generate_basic(self) -> None: @@ -126,6 +132,8 @@ def create_items(self) -> None: filler_items = [] for item in itemList: if item.progression == ItemClassification.filler: + if item.itemName == "5 Coins" and not self.multiworld.coins[self.player]: + continue freq = item_frequencies.get(item.itemName) if self.multiworld.chuckle_beans[self.player] == 0: if item.itemName == "Chuckle Bean": @@ -150,6 +158,8 @@ def create_items(self) -> None: remaining -= 186 if self.multiworld.chuckle_beans[self.player] == 1: remaining -= 58 + if not self.multiworld.coins[self.player]: + remaining -= len(coins) for i in range(remaining): filler_item_name = self.multiworld.random.choice(filler_items) item = self.create_item(filler_item_name) @@ -173,6 +183,8 @@ def generate_output(self, output_directory: str) -> None: continue if (self.multiworld.chuckle_beans[self.player] == 0 and "Digspot" in location_name) or (self.multiworld.chuckle_beans[self.player] == 1 and location_table[location_name] in hidden): continue + if not self.multiworld.coins[self.player] and "Coin" in location_name: + continue location = self.multiworld.get_location(location_name, self.player) if location in self.multiworld.get_region("Event", self.player).locations: continue diff --git a/data/basepatch.bsdiff b/data/basepatch.bsdiff index 0d5c4fc8b9d384dab52dcd77202ce8b59df5795d..aaa3fe591c75a04084816ce53ca3d67c60b31d2e 100644 GIT binary patch literal 16029 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 literal 16541 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

PhMl;@hF}9l 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 T@zd^K*25_0LW)nbn4JF$dq0W@