From 77bb3c32a5629ee3d7eef155e57a6448217758a5 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 15:26:51 -0500 Subject: [PATCH 01/79] Commit for PR --- README.md | 4 + docs/CODEOWNERS | 3 + worlds/mlss/Client.py | 285 +++++ worlds/mlss/Enemies.py | 208 +++ worlds/mlss/Items.py | 197 +++ worlds/mlss/Locations.py | 1128 +++++++++++++++++ worlds/mlss/Names/LocationName.py | 532 ++++++++ worlds/mlss/Options.py | 273 ++++ worlds/mlss/Regions.py | 186 +++ worlds/mlss/Rom.py | 629 +++++++++ worlds/mlss/Rules.py | 278 ++++ worlds/mlss/StateLogic.py | 100 ++ worlds/mlss/__init__.py | 199 +++ worlds/mlss/colors/Black.txt | 265 ++++ worlds/mlss/colors/Blue.txt | 265 ++++ worlds/mlss/colors/Chaos.txt | 156 +++ worlds/mlss/colors/Cyan.txt | 265 ++++ worlds/mlss/colors/Green.txt | 265 ++++ worlds/mlss/colors/Orange.txt | 265 ++++ worlds/mlss/colors/Pink.txt | 265 ++++ worlds/mlss/colors/Purple.txt | 265 ++++ worlds/mlss/colors/Red.txt | 265 ++++ worlds/mlss/colors/Silhouette.txt | 812 ++++++++++++ worlds/mlss/colors/TrueChaos.txt | 812 ++++++++++++ worlds/mlss/colors/White.txt | 265 ++++ worlds/mlss/colors/Yellow.txt | 265 ++++ worlds/mlss/colors/pants/Black.txt | 68 + worlds/mlss/colors/pants/Blue.txt | 68 + worlds/mlss/colors/pants/Chaos.txt | 37 + worlds/mlss/colors/pants/Custom.txt | 37 + worlds/mlss/colors/pants/Cyan.txt | 68 + worlds/mlss/colors/pants/Green.txt | 68 + worlds/mlss/colors/pants/Orange.txt | 68 + worlds/mlss/colors/pants/Pink.txt | 68 + worlds/mlss/colors/pants/Purple.txt | 68 + worlds/mlss/colors/pants/Red.txt | 68 + worlds/mlss/colors/pants/TrueChaos.txt | 37 + worlds/mlss/colors/pants/Vanilla.txt | 37 + worlds/mlss/colors/pants/White.txt | 68 + worlds/mlss/colors/pants/Yellow.txt | 68 + worlds/mlss/data/basepatch.bsdiff | Bin 0 -> 16021 bytes .../docs/en_Mario & Luigi Superstar Saga.md | 56 + worlds/mlss/docs/setup_en.md | 53 + 43 files changed, 9389 insertions(+) create mode 100644 worlds/mlss/Client.py create mode 100644 worlds/mlss/Enemies.py create mode 100644 worlds/mlss/Items.py create mode 100644 worlds/mlss/Locations.py create mode 100644 worlds/mlss/Names/LocationName.py create mode 100644 worlds/mlss/Options.py create mode 100644 worlds/mlss/Regions.py create mode 100644 worlds/mlss/Rom.py create mode 100644 worlds/mlss/Rules.py create mode 100644 worlds/mlss/StateLogic.py create mode 100644 worlds/mlss/__init__.py create mode 100644 worlds/mlss/colors/Black.txt create mode 100644 worlds/mlss/colors/Blue.txt create mode 100644 worlds/mlss/colors/Chaos.txt create mode 100644 worlds/mlss/colors/Cyan.txt create mode 100644 worlds/mlss/colors/Green.txt create mode 100644 worlds/mlss/colors/Orange.txt create mode 100644 worlds/mlss/colors/Pink.txt create mode 100644 worlds/mlss/colors/Purple.txt create mode 100644 worlds/mlss/colors/Red.txt create mode 100644 worlds/mlss/colors/Silhouette.txt create mode 100644 worlds/mlss/colors/TrueChaos.txt create mode 100644 worlds/mlss/colors/White.txt create mode 100644 worlds/mlss/colors/Yellow.txt create mode 100644 worlds/mlss/colors/pants/Black.txt create mode 100644 worlds/mlss/colors/pants/Blue.txt create mode 100644 worlds/mlss/colors/pants/Chaos.txt create mode 100644 worlds/mlss/colors/pants/Custom.txt create mode 100644 worlds/mlss/colors/pants/Cyan.txt create mode 100644 worlds/mlss/colors/pants/Green.txt create mode 100644 worlds/mlss/colors/pants/Orange.txt create mode 100644 worlds/mlss/colors/pants/Pink.txt create mode 100644 worlds/mlss/colors/pants/Purple.txt create mode 100644 worlds/mlss/colors/pants/Red.txt create mode 100644 worlds/mlss/colors/pants/TrueChaos.txt create mode 100644 worlds/mlss/colors/pants/Vanilla.txt create mode 100644 worlds/mlss/colors/pants/White.txt create mode 100644 worlds/mlss/colors/pants/Yellow.txt create mode 100644 worlds/mlss/data/basepatch.bsdiff create mode 100644 worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md create mode 100644 worlds/mlss/docs/setup_en.md diff --git a/README.md b/README.md index ce2130ce8e7c..e61e91007a2d 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,11 @@ Currently, the following games are supported: * Heretic * Landstalker: The Treasures of King Nole * Final Fantasy Mystic Quest +<<<<<<< Updated upstream * TUNIC +======= +* Mario & Luigi: Superstar Saga +>>>>>>> Stashed changes For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 95c0baea3a1f..bf479a4e2650 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -83,6 +83,9 @@ /worlds/lufia2ac/ @el-u /worlds/lufia2ac/docs/ @wordfcuk @el-u +# Mario & Luigi: Superstar Saga +/worlds/mlss/ @jamesbrq + # Meritous /worlds/meritous/ @FelicitusNeko diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py new file mode 100644 index 000000000000..9f476a031474 --- /dev/null +++ b/worlds/mlss/Client.py @@ -0,0 +1,285 @@ +import time +from typing import TYPE_CHECKING, Optional, Dict, Set, List +import struct +from BaseClasses import MultiWorld +from NetUtils import ClientStatus +from .Locations import roomCount, nonBlock, beanstones, roomException, shop, badge, pants, eReward +from .Items import items_by_id, ItemData +from collections import defaultdict +import sys +import logging +import math +import asyncio + +# This imports the bizhawk apworld if it's not already imported. This code block should be removed for a PR. +if "worlds._bizhawk" not in sys.modules: + import importlib + import os + import zipimport + + bh_apworld_path = os.path.join(os.path.dirname(sys.modules["worlds"].__file__), "_bizhawk.apworld") + if os.path.isfile(bh_apworld_path): + importer = zipimport.zipimporter(bh_apworld_path) + spec = importer.find_spec(os.path.basename(bh_apworld_path).rsplit(".", 1)[0]) + mod = importlib.util.module_from_spec(spec) + mod.__package__ = f"worlds.{mod.__package__}" + mod.__name__ = f"worlds.{mod.__name__}" + sys.modules[mod.__name__] = mod + importer.exec_module(mod) + elif not os.path.isdir(os.path.splitext(bh_apworld_path)[0]): + raise Exception("Did not find _bizhawk.apworld required to play Mario & Luigi Superstar Saga.") + +import worlds._bizhawk as bizhawk +from worlds._bizhawk.client import BizHawkClient + +if TYPE_CHECKING: + from worlds._bizhawk.context import BizHawkClientContext +else: + BizHawkClientContext = object + +ROOM_ARRAY_POINTER = 0x51fa00 + +# Add .apmlss suffix to bizhawk client +from worlds.LauncherComponents import SuffixIdentifier, components +for component in components: + if component.script_name == "BizHawkClient": + component.file_identifier = SuffixIdentifier(*(*component.file_identifier.suffixes, ".apmlss")) + break + + +class MLSSClient(BizHawkClient): + game = "Mario & Luigi Superstar Saga" + system = "GBA" + local_checked_locations: Set[int] + goal_flag: int + rom_slot_name: Optional[str] + player: int + eCount: int + eUsed: [int] + player_name: Optional[str] + checked_flags: dict[int, list] = {} + + def __init__(self) -> None: + super().__init__() + self.local_checked_locations = set() + self.local_set_events = {} + self.local_found_key_items = {} + self.rom_slot_name = None + self.lock = asyncio.Lock + self.eCount = 0 + self.eUsed = [] + + async def validate_rom(self, ctx: BizHawkClientContext) -> bool: + from CommonClient import logger + + try: + # Check ROM name/patch version + rom_name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")]))[0]) + rom_name = bytes([byte for byte in rom_name_bytes if byte != 0]).decode("UTF-8") + if not rom_name.startswith("MARIO&LUIGIU"): + return False + if rom_name == "MARIO&LUIGIUA8": + logger.info("ERROR: You appear to be running an unpatched version of Mario & Luigi Superstar Saga. " + "You need to generate a patch file and use it to create a patched ROM.") + return False + if rom_name != "MARIO&LUIGIUAP": + logger.info("ERROR: The patch file used to create this ROM is not compatible with " + "this client. Double check your client version against the version being " + "used by the generator.") + return False + except UnicodeDecodeError: + return False + except bizhawk.RequestFailedError: + return False # Should verify on the next pass + + ctx.game = self.game + ctx.items_handling = 0b101 + ctx.want_slot_data = True + ctx.watcher_timeout = 0.125 + self.rom_slot_name = rom_name + name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xB0, 16, "ROM")]))[0]) + player = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xAF, 1, "ROM")]))[0][0]) + self.player = player + 1 + name = bytes([byte for byte in name_bytes if byte != 0]).decode("UTF-8") + self.player_name = name + logger.info(name) + + for i in range(59): + self.checked_flags[i] = [9, 10] + + return True + + async def set_auth(self, ctx: BizHawkClientContext) -> None: + ctx.auth = self.player_name + + 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"), (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] + shop_scroll = read_state[3][0] & 0x1F + is_buy = (read_state[4][0] != 0) + shop_address = (struct.unpack(' value: + leftover -= value + else: + return key, leftover + + +def id_to_RAM(id_: int): + code = id_ + if code == 0x1D or code == 0x1E: + code += 0xE + if 0x20 <= code <= 0x26: + code -= 0x4 + return code diff --git a/worlds/mlss/Enemies.py b/worlds/mlss/Enemies.py new file mode 100644 index 000000000000..48fee4f96c93 --- /dev/null +++ b/worlds/mlss/Enemies.py @@ -0,0 +1,208 @@ +class EnemyGroup: + def __init__(self, id: bytes, type: bytes, position: int, data: bytes, boss, group_type=0x64): + self.id = id + self.type = type + self.position = position + self.data = data + self.boss = boss + self.group_type = group_type + + @property + def size(self): + return len(self.id) + + +class Enemy: + def __init__(self, id, type): + self.id = id + self.type = type + + +class StatCount: + def __init__(self, id): + self.id = id + self.count = 1 + self.total = 0 + + +class EnemyRandomize: + def __init__(self): + self.groups = [] + self.stardustGroups = [] + self.groupSizes = [] + self.enemies = [] + self.spikedEnemies = [] + self.bossGroups = [] + self.enemyCount = [] + + +enemies = [ + 0x5030EC, + 0x50310C, + 0x50312C, + 0x50314C, + 0x50316C, + 0x50318C, + 0x5031AC, + 0x5031CC, + 0x5031EC, + 0x50328C, + 0x5032AC, + 0x5032CC, + 0x5032EC, + 0x50330C, + 0x50332C, + 0x50334C, + 0x50336C, + 0x50338C, + 0x5033AC, + 0x5033CC, + 0x50340C, + 0x50342C, + 0x50344C, + 0x50346C, + 0x50348C, + 0x5034AC, + 0x5034CC, + 0x5034EC, + 0x50350C, + 0x50356C, + 0x50358C, + 0x5035AC, + 0x5035CC, + 0x5035EC, + 0x50366C, + 0x50368C, + 0x5036AC, + 0x5036CC, + 0x5036EC, + 0x50370C, + 0x50372C, + 0x50374C, + 0x50376C, + 0x50378C, + 0x5037EC, + 0x50380C, + 0x50382C, + 0x50384C, + 0x50386C, + 0x50388C, + 0x5038AC, + 0x5038CC, + 0x5038EC, + 0x50390C, + 0x50392C, + 0x50394C, + 0x50398C, + 0x5039AC, + 0x5039CC, + 0x5039EC, + 0x503A0C, + 0x503A2C, + 0x503A4C, + 0x503A6C, + 0x503AAC, + 0x503ACC, + 0x503AEC, + 0x503B0C, + 0x503B2C, + 0x503B4C, + 0x503B6C, + 0x503B8C, + 0x503BAC, + 0x503BCC, + 0x503BEC, + 0x503C0C, + 0x503C2C, + 0x503C4C, + 0x503C6C, + 0x503C8C, + 0x503CAC, + 0x503CCC, + 0x503CEC, + 0x503D0C, + 0x503D2C, + 0x503D4C, + 0x503D8C, + 0x503DAC, + 0x503DCC, + 0x503DEC, + 0x503E0C, + 0x503E2C, + 0x503E4C, + 0x503E6C, + 0x503E8C, + 0x503EAC, + 0x503ECC, + 0x503EEC, + 0x503F2C, + 0x503F4C, + 0x503F6C, + 0x503F8C, + 0x503FAC, + 0x503FCC, + 0x503FEC, + 0x50400C, + 0x50404C, + 0x50406C, + 0x50408C, + 0x5040AC, + 0x5040CC, + 0x5040EC, + 0x50410C, + 0x50412C, + 0x50414C, + 0x50416C, + 0x50418C, + 0x5041AC, + 0x5041CC, + 0x5041EC, + 0x50420C, + 0x50422C, + 0x50436C, + 0x5043AC, + 0x5043CC, + 0x5043EC, + 0x50440C, + 0x50442C, + 0x50444C, + 0x50446C, + 0x50448C, + 0x5044AC, + 0x5044CC, + 0x5044EC, + 0x50450C, + 0x50452C, + 0x50454C, + 0x50456C, + 0x50458C, + 0x5045AC, + 0x50468C, + 0x5046CC, + 0x5046EC, + 0x50470C +] + +bosses = [ + 0x5030CC, + 0x50320C, + 0x50322C, + 0x50352C, + 0x50360C, + 0x5037AC, + 0x5037CC, + 0x503A8C, + 0x503D6C, + 0x503F0C, + 0x50424C, + 0x50426C, + 0x50428C, + 0x5042AC, + 0x5042CC, + 0x5042EC, + 0x50430C, + # 0x50438C, Popple 3 + 0x5045CC, + 0x5045EC, + 0x50460C +] diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py new file mode 100644 index 000000000000..b32664806d72 --- /dev/null +++ b/worlds/mlss/Items.py @@ -0,0 +1,197 @@ +import typing + +from BaseClasses import Item, ItemClassification + + +class ItemData(typing.NamedTuple): + code: int + itemName: str + progression: ItemClassification + itemID: int + + +class MLSSItem(Item): + game: str = "Mario & Luigi Superstar Saga" + + +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), + ItemData(77771004, "Max Mushroom", ItemClassification.filler, 0xD), + ItemData(77771005, "Nuts", ItemClassification.filler, 0xE), + ItemData(77771006, "Super Nuts", ItemClassification.filler, 0xF), + ItemData(77771007, "Ultra Nuts", ItemClassification.useful, 0x10), + ItemData(77771008, "Max Nuts", ItemClassification.useful, 0x11), + ItemData(77771009, "Syrup", ItemClassification.filler, 0x12), + ItemData(77771010, "Super Syrup", ItemClassification.filler, 0x13), + ItemData(77771011, "Ultra Syrup", ItemClassification.useful, 0x14), + ItemData(77771012, "Max Syrup", ItemClassification.useful, 0x15), + ItemData(77771013, "1-UP Mushroom", ItemClassification.useful, 0x16), + ItemData(77771014, "1-UP Super", ItemClassification.useful, 0x17), + ItemData(77771015, "Golden Mushroom", ItemClassification.useful, 0x18), + ItemData(77771016, "Refreshing Herb", ItemClassification.filler, 0x19), + ItemData(77771017, "Red Pepper", ItemClassification.filler, 0x1A), + ItemData(77771018, "Green Pepper", ItemClassification.filler, 0x1B), + ItemData(77771019, "Hoo Bean", ItemClassification.filler, 0x1D), + ItemData(77771020, "Chuckle Bean", ItemClassification.filler, 0x1E), + ItemData(77771021, "Woohoo Blend", ItemClassification.useful, 0x20), + ItemData(77771022, "Hoohoo Blend", ItemClassification.useful, 0x21), + ItemData(77771023, "Chuckle Blend", ItemClassification.useful, 0x22), + ItemData(77771024, "Teehee Blend", ItemClassification.useful, 0x23), + ItemData(77771025, "Hoolumbian", ItemClassification.useful, 0x24), + ItemData(77771026, "Chuckoccino", ItemClassification.useful, 0x25), + ItemData(77771027, "Teeheespresso", ItemClassification.useful, 0x26), + ItemData(77771028, "Peasley's Rose", ItemClassification.progression, 0x31), + ItemData(77771029, "Beanbean Brooch", ItemClassification.progression, 0x32), + ItemData(77771030, "Red Goblet", ItemClassification.progression, 0x33), + ItemData(77771031, "Green Goblet", ItemClassification.progression, 0x34), + ItemData(77771032, "Red Chuckola Fruit", ItemClassification.progression, 0x35), + ItemData(77771033, "White Chuckola Fruit", ItemClassification.progression, 0x36), + ItemData(77771034, "Purple Chuckola Fruit", ItemClassification.progression, 0x37), + ItemData(77771035, "Hammers", ItemClassification.progression, 0x38), + ItemData(77771036, "Firebrand", ItemClassification.progression, 0x39), + ItemData(77771037, "Thunder Hand", ItemClassification.progression, 0x3A), + ItemData(77771038, "Membership Card", ItemClassification.progression, 0x40), + ItemData(77771039, "Winkle Card", ItemClassification.progression, 0x41), + ItemData(77771040, "Peach's Extra Dress", ItemClassification.progression, 0x42), + ItemData(77771041, "Fake Beanstar", ItemClassification.progression, 0x43), + ItemData(77771042, "Red Pearl Bean", ItemClassification.progression, 0x45), + ItemData(77771043, "Green Pearl Bean", ItemClassification.progression, 0x46), + ItemData(77771044, "Beanfruit 1", ItemClassification.progression_skip_balancing, 0x47), + ItemData(77771045, "Beanfruit 2", ItemClassification.progression_skip_balancing, 0x50), + ItemData(77771046, "Beanfruit 3", ItemClassification.progression_skip_balancing, 0x51), + ItemData(77771047, "Beanfruit 4", ItemClassification.progression_skip_balancing, 0x52), + ItemData(77771048, "Beanfruit 5", ItemClassification.progression_skip_balancing, 0x53), + ItemData(77771049, "Beanfruit 6", ItemClassification.progression_skip_balancing, 0x54), + ItemData(77771050, "Beanfruit 7", ItemClassification.progression_skip_balancing, 0x55), + ItemData(77771051, "Blue Neon Egg", ItemClassification.progression, 0x56), + ItemData(77771052, "Red Neon Egg", ItemClassification.progression, 0x57), + ItemData(77771053, "Green Neon Egg", ItemClassification.progression, 0x60), + ItemData(77771054, "Yellow Neon Egg", ItemClassification.progression, 0x61), + ItemData(77771055, "Purple Neon Egg", ItemClassification.progression, 0x62), + ItemData(77771056, "Orange Neon Egg", ItemClassification.progression, 0x63), + ItemData(77771057, "Azure Neon Egg", ItemClassification.progression, 0x64), + ItemData(77771058, "Beanstar Piece 1", ItemClassification.progression, 0x65), + ItemData(77771059, "Beanstar Piece 2", ItemClassification.progression, 0x66), + ItemData(77771060, "Beanstar Piece 3", ItemClassification.progression, 0x67), + ItemData(77771061, "Beanstar Piece 4", ItemClassification.progression, 0x70), + ItemData(77771062, "Spangle", ItemClassification.progression, 0x72), + ItemData(77771063, "Beanlet 1", ItemClassification.useful, 0x73), + ItemData(77771064, "Beanlet 2", ItemClassification.useful, 0x74), + ItemData(77771065, "Beanlet 3", ItemClassification.useful, 0x75), + ItemData(77771066, "Beanlet 4", ItemClassification.useful, 0x76), + ItemData(77771067, "Beanlet 5", ItemClassification.useful, 0x77), + ItemData(77771068, "Beanstone 1", ItemClassification.useful, 0x80), + ItemData(77771069, "Beanstone 2", ItemClassification.useful, 0x81), + ItemData(77771070, "Beanstone 3", ItemClassification.useful, 0x82), + ItemData(77771071, "Beanstone 4", ItemClassification.useful, 0x83), + ItemData(77771072, "Beanstone 5", ItemClassification.useful, 0x84), + ItemData(77771073, "Beanstone 6", ItemClassification.useful, 0x85), + ItemData(77771074, "Beanstone 7", ItemClassification.useful, 0x86), + ItemData(77771075, "Beanstone 8", ItemClassification.useful, 0x87), + ItemData(77771076, "Beanstone 9", ItemClassification.useful, 0x90), + ItemData(77771077, "Beanstone 10", ItemClassification.useful, 0x91), + ItemData(77771078, "Secret Scroll 1", ItemClassification.useful, 0x92), + ItemData(77771079, "Secret Scroll 2", ItemClassification.useful, 0x93), + ItemData(77771080, "Castle Badge", ItemClassification.useful, 0x9F), + ItemData(77771081, "Pea Badge", ItemClassification.useful, 0xA0), + ItemData(77771082, "Bean B. Badge", ItemClassification.useful, 0xA1), + ItemData(77771083, "Counter Badge", ItemClassification.useful, 0xA2), + ItemData(77771084, "Charity Badge", ItemClassification.useful, 0xA3), + ItemData(77771085, "Bros. Badge", ItemClassification.useful, 0xA4), + ItemData(77771086, "Miracle Badge", ItemClassification.useful, 0xA5), + ItemData(77771087, "Ohoracle Badge", ItemClassification.useful, 0xA6), + ItemData(77771088, "Mush Badge", ItemClassification.useful, 0xA7), + ItemData(77771089, "Mari-Lui Badge", ItemClassification.useful, 0xA8), + ItemData(77771090, "Muscle Badge", ItemClassification.useful, 0xA9), + ItemData(77771091, "Spiny Badge AA", ItemClassification.useful, 0xAA), + ItemData(77771092, "Mush Badge A", ItemClassification.useful, 0xAB), + ItemData(77771093, "Grab Badge", ItemClassification.useful, 0xAC), + ItemData(77771094, "Mush Badge AA", ItemClassification.useful, 0xAD), + ItemData(77771095, "Power Badge", ItemClassification.useful, 0xAE), + ItemData(77771096, "Wonder Badge", ItemClassification.useful, 0xAF), + ItemData(77771097, "Beauty Badge", ItemClassification.useful, 0xB0), + ItemData(77771098, "Salvage Badge", ItemClassification.useful, 0xB1), + ItemData(77771099, "Oh-Pah Badge", ItemClassification.useful, 0xB2), + ItemData(77771100, "Brilliant Badge", ItemClassification.useful, 0xB3), + ItemData(77771101, "Sarge Badge", ItemClassification.useful, 0xB4), + ItemData(77771102, "General Badge", ItemClassification.useful, 0xB5), + ItemData(77771103, "Tank Badge", ItemClassification.useful, 0xB6), + ItemData(77771104, "Bros. Rock", ItemClassification.useful, 0xBD), + ItemData(77771105, "Soulful Bros.", ItemClassification.useful, 0xC0), + ItemData(77771106, "High-End Badge", ItemClassification.useful, 0xC1), + ItemData(77771107, "Bean Pants", ItemClassification.useful, 0xCC), + ItemData(77771108, "Bean Trousers", ItemClassification.useful, 0xCD), + ItemData(77771109, "Blue Jeans", ItemClassification.useful, 0xCE), + ItemData(77771110, "Parasol Pants", ItemClassification.useful, 0xCF), + ItemData(77771111, "Hard Pants", ItemClassification.useful, 0xD0), + ItemData(77771112, "Heart Jeans", ItemClassification.useful, 0xD1), + ItemData(77771113, "Plaid Trousers", ItemClassification.useful, 0xD2), + ItemData(77771114, "#1 Trousers", ItemClassification.useful, 0xD3), + ItemData(77771115, "Safety Slacks", ItemClassification.useful, 0xD4), + ItemData(77771116, "Shroom Pants", ItemClassification.useful, 0xD5), + ItemData(77771117, "Shroom Bells", ItemClassification.useful, 0xD6), + ItemData(77771118, "Shroom Slacks", ItemClassification.useful, 0xD7), + ItemData(77771119, "Peachy Jeans", ItemClassification.useful, 0xD8), + ItemData(77771120, "Mushwin Pants", ItemClassification.useful, 0xD9), + ItemData(77771121, "Mushluck Pants", ItemClassification.useful, 0xDA), + ItemData(77771122, "Scandal Jeans", ItemClassification.useful, 0xDB), + ItemData(77771123, "Street Jeans", ItemClassification.useful, 0xDC), + ItemData(77771124, "Tropic Slacks", ItemClassification.useful, 0xDD), + ItemData(77771125, "Hermetic Pants", ItemClassification.useful, 0xDE), + ItemData(77771126, "Beanstar Pants", ItemClassification.useful, 0xDF), + ItemData(77771127, "Peasley Slacks", ItemClassification.useful, 0xE0), + ItemData(77771128, "Queen B. Jeans", ItemClassification.useful, 0xE1), + ItemData(77771129, "B. Brand Jeans", ItemClassification.useful, 0xE2), + ItemData(77771130, "Heart Slacks", ItemClassification.useful, 0xE3), + ItemData(77771131, "Casual Slacks", ItemClassification.useful, 0xE4), + ItemData(77771132, "Casual Coral", ItemClassification.useful, 0xEB), + ItemData(77771133, "Harhall's Pants", ItemClassification.useful, 0xF1), + ItemData(77771134, "Wool Trousers", ItemClassification.useful, 0xF3), + ItemData(77771135, "Iron Pants", ItemClassification.useful, 0xF7), + ItemData(77771136, "Greed Wallet", ItemClassification.useful, 0xF8), + ItemData(77771137, "Bonus Ring", ItemClassification.useful, 0xF9), + ItemData(77771138, "Excite Spring", ItemClassification.useful, 0xFA), + ItemData(77771139, "Great Force", ItemClassification.useful, 0xFB), + ItemData(77771140, "Power Grip", ItemClassification.useful, 0xFC), + ItemData(77771141, "Cobalt Necktie", ItemClassification.useful, 0xFD), + ItemData(77771142, "Gameboy Horror SP", ItemClassification.useful, 0xFE), + ItemData(77771143, "Dragohoho Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771144, "Queen Bean Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771145, "Chuckolator Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771146, "Oasis Access", ItemClassification.skip_balancing, 0x0), + ItemData(77771147, "Mom Piranha Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771148, "Entered Fungitown", ItemClassification.skip_balancing, 0x0), + ItemData(77771149, "Beanstar Complete", ItemClassification.skip_balancing, 0x0), + ItemData(77771150, "Jojora Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771151, "Birdo Defeated", ItemClassification.skip_balancing, 0x0) +] + +item_frequencies: typing.Dict[str, int] = { + "5 Coins": 40, + "Mushroom": 55, + "Super Mushroom": 15, + "Ultra Mushroom": 12, + "Nuts": 10, + "Super Nuts": 5, + "Ultra Nuts": 5, + "Max Nuts": 2, + "Syrup": 28, + "Super Syrup": 10, + "Ultra Syrup": 10, + "Max Syrup": 2, + "1-Up Mushroom": 15, + "1-Up Super": 5, + "Golden Mushroom": 3, + "Refreshing Herb": 9, + "Red Pepper": 2, + "Green Pepper": 2, + "Hoo Bean": 100, + "Chuckle Bean": 200, + "Hammers": 3 +} + +item_table: typing.Dict[str, ItemData] = {item.itemName: item for item in itemList} +items_by_id: typing.Dict[int, ItemData] = {item.code: item for item in itemList} diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py new file mode 100644 index 000000000000..be1b169d2102 --- /dev/null +++ b/worlds/mlss/Locations.py @@ -0,0 +1,1128 @@ +import typing + +from BaseClasses import Location + + +class LocationData: + name: str = "" + id: int = 0x00 + + def __init__(self, name, id_, itemType): + self.name = name + self.itemType = itemType + self.id = id_ + + +class MLSSLocation(Location): + game: str = "Mario & Luigi Superstar Saga" + + +hidden: typing.List[int] = [ + 0x39D8C5, + 0x39D90F, + 0x39D9E9, + 0x39DB02, + 0x39DAB5, + 0x39DB0F, + 0x39DB2A, + 0x39DB32, + 0x39DBBC, + 0x39DBE1, + 0x39DC65, + 0x39DC5D, + 0x39DC82, + 0x39DCC4, + 0x39DCE1, + 0x39DD13, + 0x39DDF6, + 0x39DEA8, + 0x39DED7, + 0x39DF63, + 0x39E077, + 0x39E092, + 0x39E0CD, + 0x39E0FA, + 0x39E102, + 0x39E187, + 0x39E1BC, + 0x39E1C9, + 0x39E1E3, + 0x39E21D, + 0x39E232, + 0x39E2DC, + 0x39E2E9, + 0x39E316, + 0x39E343, + 0x39E370, + 0x39E396, + 0x39E3D1, + 0x39E3F3, + 0x39E462, + 0x39E477, + 0x39E51E, + 0x39E5B5, + 0x39E5C8, + 0x39E5D0, + 0x39E5F0, + 0x39E5FD, + 0x39E6C2, + 0x39E6CF, + 0x39E702, + 0x39E857, + 0x39E8A3, + 0x39E91A, + 0x39E944, + 0x39E959, + 0x39E983, + 0x39E9A0, + 0x39EC40, + 0x39EC4D +] + + +mainArea: typing.List[LocationData] = [ + 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("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", 0x39e455, 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("Jokes End North of Bridge Room Coin Block", 0x39e836, 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), + 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), + 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), + 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), + 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] = [ + 0x253515, + 0x253776, + 0x253c70, + 0x254324, + 0x254718, + 0x254a34, + 0x254e24 +] + +startingFlag: typing.List[LocationData] = [ + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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), + LocationData("Queen Bean", 0xDA0001, 0), + LocationData("Chuckolator", 0xDA0002, 0), + LocationData("Oasis", 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)] = [ + (0x434B, 0x1, 0x243844), # Farm Mole 1 + (0x434B, 0x1, 0x24387d), # Farm Mole 2 + (0x4373, 0x8, 0x2779C8), # Simulblock Mole + (0x42F9, 0x4, 0x1E9403), # Hammers + (0x434B, 0x10, 0x1E9435), # Solo Mario Mole 1 + (0x434B, 0x20, 0x1E9436), # Solo Mario Mole 2 + (0x4359, 0x20, 0x1E9404), # Super Hammers + (0x4359, 0x40, 0x1E9405), # Ultra Hammers + (0x42F9, 0x2, 0x1E9430), # Rose + (0x434B, 0x4, 0x242888), # Solo Luigi Cave Mole + (0x4373, 0x20, 0x277ab2), # Hoohoo Village Turtle Mole + (0x432D, 0x20, 0x1e9431), # Piranha Bean + (0x434E, 0x2, 0x1e9411), # Secret Scroll 1 + (0x434E, 0x4, 0x1e9412), # Secret Scroll 2 + (0x4375, 0x8, 0x260637), # Membership Card + (0x4373, 0x10, 0x277a45), # Teehee Valley Mole + (0x434D, 0x8, 0x1E9444), # Harhall's Pants + (0x432E, 0x10, 0x1e9441), # Harhall Beanstar Piece + (0x434B, 0x8, 0x1e9434), # Outskirts Boo Statue Mole + (0x42FE, 0x2, 0x1e943E), # Red Goblet + (0x42FE, 0x4, 0x24e628), # Green Goblet + (0x4301, 0x10, 0x250621), # Red Chuckola Fruit + (0x42FE, 0x80, 0x24ed74), # Purple Chuckola Fruit + (0x4302, 0x4, 0x24ff18), # White Chuckola Fruit + (0x42FF, 0x8, 0x251347), # Beanlet 1 + (0x42FF, 0x20, 0x2513fb), # Beanlet 2 + (0x42FF, 0x10, 0x2513a1), # Beanlet 3 + (0x42FF, 0x4, 0x251988), # Beanlet 4 + (0x42FF, 0x2, 0x25192e), # Beanlet 5 + (0x42FF, 0x1, 0x2515eb), # Beanlet Reward + (0x4371, 0x40, 0x253515), # Espresso 1 + (0x4371, 0x80, 0x253776), # Espresso 2 + (0x4372, 0x1, 0x253c70), # Espresso 3 + (0x4372, 0x2, 0x254324), # Espresso 4 + (0x4372, 0x4, 0x254718), # Espresso 5 + (0x4372, 0x8, 0x254a34), # Espresso 6 + (0x4372, 0x10, 0x254e24), # Espresso 7 + (0x472F, 0x1, 0x252d07), # Woohoo Blend + (0x472F, 0x2, 0x252d28), # Hoohoo Blend + (0x472F, 0x4, 0x252d49), # Chuckle Blend + (0x472F, 0x8, 0x252d6a), # Teehee Blend + (0x472F, 0x10, 0x252d8b), # Hoolumbian + (0x472F, 0x20, 0x252dac), # Chuckoccino + (0x472F, 0x40, 0x252dcd), # Teeheespresso + (0x430B, 0x10, 0x1e9433), # Extra Dress + (0x430B, 0x10, 0x1e9432), # Fake Beanstar + (0x430F, 0x1, 0x1e9440), # Popple Beanstar Piece + (0x430C, 0x80, 0x261658), # Winkle Card + (0x4300, 0x40, 0x2578e7), # Brooch + (0x4375, 0x2, 0x2753ea), # Surf Minigame + (0x4373, 0x1, 0x277956), # North Whirlpool Mole + (0x4346, 0x40, 0x235a5b), # Green Pearl Bean + (0x4346, 0x80, 0x235c1c), # Red Pearl Bean + (0x4340, 0x20, 0x1e9443), # Hermie Beanstar Piece + (0x434A, 0x40, 0x1e9437), # Spangle + (0x434A, 0x80, 0x236e73), # Spangle Reward + (0x4373, 0x40, 0x277b1f), # Bowser's Castle Mole + (0x4372, 0x80, 0x27788e), # Jokes end Mole 1 + (0x4372, 0x80, 0x2778d2), # Jokes end Mole 2 + (0x434C, 0x80, 0x241000), # Orange Neon Egg + (0x434D, 0x1, 0x240ebe), # Red Neon Egg + (0x434C, 0x40, 0x241155), # Blue Neon Egg + (0x434D, 0x2, 0x241297), # Purple Neon Egg + (0x434C, 0x8, 0x241afa), # Green Neon Egg + (0x434C, 0x10, 0x241d7e), # Azure Neon Egg + (0x434C, 0x20, 0x241c3c), # Yellow Neon Egg + (0x4406, 0x8, 0x1e9442), # Theater Beanstar Piece + (0x4345, 0x8, 0x1e9408), # Firebrand + (0x4345, 0x4, 0x1e9409), # Thunder Hand + (0x42FF, 0x80, 0x251071), # Beanstone Reward + (0x42F9, 0x2, 0xDA0000), # Dragohoho + (0x4300, 0x40, 0xDA0001), # Queen Bean + (0x433D, 0x1, 0xDA0002), # Chuckolator + (0x43FC, 0x80, 0xDA0003), # Popple 2 + (0x433D, 0x2, 0xDA0004), # Mom Piranha + (0x4342, 0x10, 0xDA0005), # Fungitowm + (0x433D, 0x8, 0xDA0006), # Beanstar + (0x430F, 0x40, 0xDA0007), # Jojora + (0x433D, 0x10, 0xDA0008) # Birdo +] + +roomException: dict[int, int] = { + 0x1e9437: 0xFF, + 0x24ed74: 0x95, + 0x250621: 0x95, + 0x24ff18: 0x95, + 0x261658: 0x9E, + 0x260637: 0x135, + 0x1E9403: 0x4D, + 0xDA0001: 0x192, + 0x2578e7: 0x192 +} + +beanstones: dict[int, int] = { + 0x229345: 0x39dc72, # Bean fruit 1 - 6 + 0x22954D: 0x39dcb4, + 0x228A17: 0x39dbd1, + 0x22913A: 0x39dc10, + 0x22890E: 0x39dba4, + 0x228775: 0x39db7f, + 0x25117D: 0x39d73e, # Beanstone 1 - 10 + 0x2511D6: 0x39d746, + 0x25122F: 0x39d74e, + 0x251288: 0x39d756, + 0x2512E1: 0x39d75e, + 0x25170B: 0x39d76b, + 0x251767: 0x39d773, + 0x2517C3: 0x39d77b, + 0x25181F: 0x39d783, + 0x25187B: 0x39d78b +} + +roomCount: dict[int, int] = { + 0x15: 2, + 0x18: 4, + 0x19: 3, + 0x1A: 3, + 0x1B: 2, + 0x1E: 1, + 0x23: 3, + 0x27: 1, + 0x28: 5, + 0x29: 5, + 0x2E: 4, + 0x34: 4, + 0x37: 1, + 0x39: 5, + 0x44: 1, + 0x45: 4, + 0x46: 3, + 0x47: 4, + 0x48: 3, + 0x4A: 2, + 0x4B: 2, + 0x4C: 3, + 0x4D: 2, + 0x51: 2, + 0x53: 5, + 0x54: 5, + 0x55: 5, + 0x56: 2, + 0x57: 1, + 0x58: 2, + 0x59: 2, + 0x5A: 3, + 0x63: 2, + 0x68: 2, + 0x69: 2, + 0x6B: 3, + 0x6C: 5, + 0x6D: 1, + 0x70: 3, + 0x74: 2, + 0x75: 2, + 0x76: 1, + 0x77: 4, + 0x78: 4, + 0x79: 4, + 0x7A: 1, + 0x7B: 1, + 0x7C: 5, + 0x7D: 7, + 0x7E: 3, + 0x7F: 3, + 0x80: 4, + 0x81: 3, + 0x82: 1, + 0x83: 4, + 0x84: 1, + 0x86: 5, + 0x87: 1, + 0x89: 1, + 0x8A: 3, + 0x8B: 2, + 0x8C: 2, + 0x8D: 2, + 0x8E: 5, + 0x90: 3, + 0x93: 5, + 0x94: 1, + 0x96: 1, + 0x97: 4, + 0x98: 3, + 0x99: 1, + 0x9A: 1, + 0x9B: 2, + 0x9C: 7, + 0x9D: 1, + 0x9E: 1, + 0x9F: 1, + 0xA1: 4, + 0xA2: 3, + 0xA9: 1, + 0xB0: 1, + 0xBA: 3, + 0xBC: 2, + 0xBE: 5, + 0xC3: 1, + 0xC6: 1, + 0xC7: 1, + 0xCA: 2, + 0xCD: 6, + 0xCE: 6, + 0xCF: 1, + 0xDB: 3, + 0xDC: 2, + 0xDD: 1, + 0xDF: 2, + 0xE0: 6, + 0xE1: 1, + 0xE2: 1, + 0xE3: 1, + 0xE4: 5, + 0xE5: 1, + 0xE6: 2, + 0xE7: 1, + 0xE8: 2, + 0xE9: 4, + 0xEC: 3, + 0xEE: 1, + 0xF1: 3, + 0xF2: 1, + 0xF3: 1, + 0xF4: 5, + 0xF5: 5, + 0xF6: 5, + 0xF7: 1, + 0xFC: 1, + 0xFE: 1, + 0x102: 1, + 0x103: 2, + 0x104: 1, + 0x105: 2, + 0x107: 2, + 0x109: 1, + 0x10A: 1, + 0x10C: 1, + 0x10D: 3, + 0x10E: 1, + 0x10F: 2, + 0x110: 3, + 0x111: 1, + 0x112: 2, + 0x114: 1, + 0x115: 1, + 0x116: 1, + 0x117: 1, + 0x118: 2, + 0x11E: 3, + 0x11F: 3, + 0x121: 4, + 0x122: 6, + 0x123: 1, + 0x126: 2, + 0x128: 1, + 0x12A: 1, + 0x12B: 1, + 0x12E: 4, + 0x139: 2, + 0x13B: 1, + 0x13E: 1, + 0x147: 1, + 0x14E: 1, + 0x14F: 1, + 0x153: 2, + 0x154: 2, + 0x155: 3, + 0x158: 1, + 0x159: 1, + 0x15A: 2, + 0x15B: 5, + 0x15E: 1, + 0x161: 1, + 0x162: 1, + 0x164: 2, + 0x165: 3, + 0x168: 1, + 0x169: 1, + 0x16B: 3, + 0x16C: 1, + 0x171: 2, + 0x172: 2, + 0x181: 1, + 0x186: 3, + 0x187: 1, + 0x18D: 2, + 0x18E: 3, + 0x18F: 3, + 0x190: 1, + 0x191: 2, + 0x192: 2, + 0x193: 2, + 0x194: 3, + 0x195: 4, + 0x196: 3, + 0x197: 3, + 0x198: 1, + 0x19A: 2, + 0x19B: 2, + 0x19C: 1, + 0x19E: 2, + 0x1A0: 2, + 0x1A3: 1, + 0x1A6: 2, + 0x1AA: 1, + 0x1B0: 2, + 0x1B1: 2, + 0x1B8: 2, + 0x1CA: 2, + 0x1D1: 2, + 0x1D2: 3, + 0x1D4: 1, + 0x1EB: 3, + 0x1F6: 1, + 0x1F7: 1, +} + +shop: dict[int, []] = { + 0x3c05f0: [0x3c05f0, 0x3c05f2, 0x3c05f4, 0x3c05f8, 0x3c05fc, 0x3c05fe, 0x3c0600, 0x3c0602, 0x3c0606, 0x3c0608, 0x3c060c, 0x3c060e, 0x3c0610, 0x3c0614], + 0x3c066a: [0x3c066a, 0x3c066c, 0x3c066e, 0x3c0670, 0x3c0672, 0x3c0674, 0x3c0676, 0x3c0678, 0x3c067c, 0x3c0680] +} + +badge: dict[int, []] = { + 0x3c0618: [0x3c0618, 0x3c061a, 0x3c0624, 0x3c0626, 0x3c0628, 0x3c0632, 0x3c0634, 0x3c0636, 0x3c0640, 0x3c0642, 0x3c0644, 0x3c064e, 0x3c0650, 0x3c0652, 0x3c065c, 0x3c065e, 0x3c0660], + 0x3c0684: [0x3c0684, 0x3c0686, 0x3c0688, 0x3c0692, 0x3c0694, 0x3c069c, 0x3c069e] +} + +pants: dict[int, []] = { + 0x3c0618: [0x3c061C, 0x3c061E, 0x3c0620, 0x3c062a, 0x3c062c, 0x3c062e, 0x3c0638, 0x3c063a, 0x3c063c, 0x3c0646, 0x3c0648, 0x3c064a, 0x3c0654, 0x3c0656, 0x3c0658, 0x3c0662, 0x3c0664, 0x3c0666], + 0x3c0684: [0x3c068a, 0x3c068c, 0x3c068e, 0x3c0696, 0x3c0698, 0x3c06a0, 0x3c06a2] +} + +all_locations: typing.List[LocationData] = mainArea + booStatue + chucklehuck + castleTown + startingFlag + \ + 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 + coins + +location_table: typing.Dict[str, int] = {locData.name: locData.id for locData in all_locations} diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py new file mode 100644 index 000000000000..5ff39f91275e --- /dev/null +++ b/worlds/mlss/Names/LocationName.py @@ -0,0 +1,532 @@ +class LocationName(): + StardustFields1Block1 = "Stardust Fields Room 1 Block 1" + StardustFields1Block2 = "Stardust Fields Room 1 Block 2" + StardustFields2Block = "Stardust Fields Room 2 Block" + StardustFields3Block = "Stardust Fields Room 3 Block" + StardustFields4Block1 = "Stardust Fields Room 4 Block 1" + StardustFields4Block2 = "Stardust Fields Room 4 Block 2" + StardustFields4Block3 = "Stardust Fields Room 4 Block 3" + StardustFields5Block = "Stardust Fields Room 5 Block" + HoohooVillageHammerHouseBlock = "Hoohoo Village Hammer House Block" + BeanbeanCastleTownLeftSideHouseBlock1 = "Beanbean Castle Town Left Side House Block 1" + BeanbeanCastleTownLeftSideHouseBlock2 = "Beanbean Castle Town Left Side House Block 2" + BeanbeanCastleTownLeftSideHouseBlock3 = "Beanbean Castle Town Left Side House Block 3" + BeanbeanCastleTownLeftSideHouseBlock4 = "Beanbean Castle Town Left Side House Block 4" + BeanbeanCastleTownRightSideHouseBlock1 = "Beanbean Castle Town Right Side House Block 1" + BeanbeanCastleTownRightSideHouseBlock2 = "Beanbean Castle Town Right Side House Block 2" + BeanbeanCastleTownRightSideHouseBlock3 = "Beanbean Castle Town Right Side House Block 3" + BeanbeanCastleTownRightSideHouseBlock4 = "Beanbean Castle Town Right Side House Block 4" + BeanbeanCastleTownMiniMarioBlock1 = "Beanbean Castle Town Mini Mario Block 1" + BeanbeanCastleTownMiniMarioBlock2 = "Beanbean Castle Town Mini Mario Block 2" + BeanbeanCastleTownMiniMarioBlock3 = "Beanbean Castle Town Mini Mario Block 3" + BeanbeanCastleTownMiniMarioBlock4 = "Beanbean Castle Town Mini Mario Block 4" + BeanbeanCastleTownMiniMarioBlock5 = "Beanbean Castle Town Mini Mario Block 5" + HoohooMountainSummitDigspot = "Hoohoo Mountain Summit Digspot" + HoohooMountainBelowSummitDigspot = "Hoohoo Mountain Below Summit Digspot" + HoohooMountainBelowSummitBlock1 = "Hoohoo Mountain Below Summit Block 1" + HoohooMountainBelowSummitBlock2 = "Hoohoo Mountain Below Summit Block 2" + HoohooMountainBelowSummitBlock3 = "Hoohoo Mountain Below Summit Block 3" + HoohooMountainAfterHoohoorosBlock1 = "Hoohoo Mountain After Hoohooros Block 1" + HoohooMountainAfterHoohoorosDigspot = "Hoohoo Mountain After Hoohooros Digspot" + HoohooMountainAfterHoohoorosBlock2 = "Hoohoo Mountain After Hoohooros Block 2" + HoohooMountainHoohoorosRoomBlock1 = "Hoohoo Mountain Hoohooros Room Block 1" + HoohooMountainHoohoorosRoomBlock2 = "Hoohoo Mountain Hoohooros Room Block 2" + HoohooMountainHoohoorosRoomDigspot1 = "Hoohoo Mountain Hoohooros Room Digspot 1" + HoohooMountainHoohoorosRoomDigspot2 = "Hoohoo Mountain Hoohooros Room Digspot 2" + HoohooMountainBeforeHoohoorosBlock = "Hoohoo Mountain Before Hoohooros Block" + HoohooMountainBeforeHoohoorosDigspot = "Hoohoo Mountain Before Hoohooros Digspot" + HoohooMountainFountainRoomBlock1 = "Hoohoo Mountain Fountain Room Block 1" + HoohooMountainFountainRoomBlock2 = "Hoohoo Mountain Fountain Room Block 2" + HoohooMountainRoom2Digspot1 = "Hoohoo Mountain Room 2 Digspot 1" + HoohooMountainRoom2Digspot2 = "Hoohoo Mountain Room 2 Digspot 2" + HoohooMountainRoom1Block1 = "Hoohoo Mountain Room 1 Block 1" + HoohooMountainRoom1Block2 = "Hoohoo Mountain Room 1 Block 2" + HoohooMountainRoom1Block3 = "Hoohoo Mountain Room 1 Block 3" + HoohooMountainBaseRoom1Block = "Hoohoo Mountain Base Room 1 Block" + HoohooMountainBaseRoom1Digspot = "Hoohoo Mountain Base Room 1 Digspot" + HoohooVillageRightSideBlock = "Hoohoo Village Right Side Block" + HoohooVillageRightSideDigspot = "Hoohoo Village Right Side Digspot" + HoohooVillageBridgeRoomBlock1 = "Hoohoo Village Bridge Room Block 1" + HoohooVillageBridgeRoomBlock2 = "Hoohoo Village Bridge Room Block 2" + HoohooVillageBridgeRoomBlock3 = "Hoohoo Village Bridge Room Block 3" + HoohooMountainBaseBridgeRoomBlock1 = "Hoohoo Mountain Base Bridge Room Block 1" + HoohooMountainBaseBridgeRoomBlock2 = "Hoohoo Mountain Base Bridge Room Block 2" + HoohooMountainBaseBridgeRoomBlock3 = "Hoohoo Mountain Base Bridge Room Block 3" + HoohooMountainBaseBridgeRoomBlock4 = "Hoohoo Mountain Base Bridge Room Block 4" + HoohooMountainBaseBridgeRoomDigspot = "Hoohoo Mountain Base Bridge Room Digspot" + HoohooMountainBaseBoostatueRoomBlock1 = "Hoohoo Mountain Base Boostatue Room Block 1" + HoohooMountainBaseBoostatueRoomBlock2 = "Hoohoo Mountain Base Boostatue Room Block 2" + HoohooMountainBaseBoostatueRoomDigspot1 = "Hoohoo Mountain Base Boostatue Room Digspot 1" + HoohooMountainBaseBoostatueRoomDigspot2 = "Hoohoo Mountain Base Boostatue Room Digspot 2" + HoohooMountainBaseBoostatueRoomDigspot3 = "Hoohoo Mountain Base Boostatue Room Digspot 3" + BeanbeanOutskirtsBooStatueMole = "Beanbean Outskirts Boo Statue Mole" + HoohooMountainBaseGrassyAreaBlock1 = "Hoohoo Mountain Base Grassy Area Block 1" + HoohooMountainBaseGrassyAreaBlock2 = "Hoohoo Mountain Base Grassy Area Block 2" + HoohooMountainBaseGuffawhaRuinsEntranceDigspot = "Hoohoo Mountain Base Guffawha Ruins Entrance Digspot" + HoohooMountainBaseTeeheeValleyEntranceDigspot = "Hoohoo Mountain Base Teehee Valley Entrance Digspot" + HoohooMountainBaseTeeheeValleyEntranceBlock = "Hoohoo Mountain Base Teehee Valley Entrance Block" + HoohooMountainBaseAfterMinecartMinigameBlock1 = "Hoohoo Mountain Base After Minecart Minigame Block 1" + HoohooMountainBaseAfterMinecartMinigameBlock2 = "Hoohoo Mountain Base After Minecart Minigame Block 2" + HoohooMountainBasePastUltraHammerRocksBlock1 = "Hoohoo Mountain Base Past Ultra Hammer Rocks Block 1" + HoohooMountainBasePastUltraHammerRocksBlock2 = "Hoohoo Mountain Base Past Ultra Hammer Rocks Block 2" + HoohooMountainBasePastUltraHammerRocksBlock3 = "Hoohoo Mountain Base Past Ultra Hammer Rocks Block 3" + CaveConnectingStardustFieldsAndHoohooVillageBlock1 = "Cave Connecting Stardust Fields and Hoohoo Village Block 1" + CaveConnectingStardustFieldsAndHoohooVillageBlock2 = "Cave Connecting Stardust Fields and Hoohoo Village Block 2" + HoohooVillageSouthCaveBlock = "Hoohoo Village South Cave Block" + HoohooVillageSuperHammerCaveDigspot = "Hoohoo Village Super Hammer Cave Digspot" + HoohooVillageSuperHammerCaveBlock = "Hoohoo Village Super Hammer Cave Block" + HoohooVillageNorthCaveRoom1Block = "Hoohoo Village North Cave Room 1 Block" + HoohooVillageNorthCaveRoom2Block = "Hoohoo Village North Cave Room 2 Block" + HoohooVillageNorthCaveRoom2Digspot = "Hoohoo Village North Cave Room 2 Digspot" + HoohooMountainBaseMinecartCaveDigspot = "Hoohoo Mountain Base Minecart Cave Digspot" + BeanbeanOutskirtsFarmRoomDigspot1 = "Beanbean Outskirts Farm Room Digspot 1" + BeanbeanOutskirtsFarmRoomDigspot2 = "Beanbean Outskirts Farm Room Digspot 2" + BeanbeanOutskirtsFarmRoomDigspot3 = "Beanbean Outskirts Farm Room Digspot 3" + BeanbeanOutskirtsNWBlock = "Beanbean Outskirts NW Block" + BeanbeanOutskirtsNWDigspot = "Beanbean Outskirts NW Digspot" + BeanbeanOutskirtsWDigspot1 = "Beanbean Outskirts W Digspot 1" + BeanbeanOutskirtsWDigspot2 = "Beanbean Outskirts W" + BeanbeanOutskirtsNRoom1Digspot = "Beanbean Outskirts N Room 1 Digspot" + BeanbeanOutskirtsNRoom2Digspot = "Beanbean Outskirts N Room 2 Digspot" + BeanbeanOutskirtsSRoom1Digspot1 = "Beanbean Outskirts S Room 1 Digspot 1" + BeanbeanOutskirtsSRoom1Block = "Beanbean Outskirts S Room 1 Block" + BeanbeanOutskirtsSRoom1Digspot2 = "Beanbean Outskirts S Room 1 Digspot 2" + BeanbeanOutskirtsSRoom2Block1 = "Beanbean Outskirts S Room 2 Block 1" + BeanbeanOutskirtsSRoom2Digspot1 = "Beanbean Outskirts S Room 2 Digspot 1" + BeanbeanOutskirtsSRoom2Digspot2 = "Beanbean Outskirts S Room 2 Digspot 2" + BeanbeanOutskirtsSRoom2Block2 = "Beanbean Outskirts S Room 2 Block 2" + BeanbeanOutskirtsSRoom2Digspot3 = "Beanbean Outskirts S Room 2 Digspot 3" + BeanbeanOutskirtsNEDigspot1 = "Beanbean Outskirts NE Digspot 1" + BeanbeanOutskirtsNEDigspot2 = "Beanbean Outskirts NE Digspot 2" + BeanbeanOutskirtsEDigspot1 = "Beanbean Outskirts E Digspot 1" + BeanbeanOutskirtsEDigspot2 = "Beanbean Outskirts E Digspot 2" + BeanbeanOutskirtsEDigspot3 = "Beanbean Outskirts E Digspot 3" + BeanbeanOutskirtsSEDigspot1 = "Beanbean Outskirts SE Digspot 1" + BeanbeanOutskirtsSEDigspot2 = "Beanbean Outskirts SE Digspot 2" + BeanbeanOutskirtsSEDigspot3 = "Beanbean Outskirts SE Digspot 3" + BeanbeanOutskirtsNorthBeachDigspot1 = "Beanbean Outskirts North Beach Digspot 1" + BeanbeanOutskirtsNorthBeachDigspot2 = "Beanbean Outskirts North Beach Digspot 2" + BeanbeanOutskirtsNorthBeachDigspot3 = "Beanbean Outskirts North Beach Digspot 3" + BeanbeanOutskirtsSouthBeachDigspot = "Beanbean Outskirts South Beach Digspot" + BeanbeanOutskirtsSurfBeachDigspot1 = "Beanbean Outskirts Surf Beach Digspot 1" + BeanbeanOutskirtsSurfBeachBlock = "Beanbean Outskirts Surf Beach Block" + BeanbeanOutskirtsSurfBeachDigspot2 = "Beanbean Outskirts Surf Beach Digspot 2" + BeanbeanOutskirtsSurfBeachDigspot3 = "Beanbean Outskirts Surf Beach Digspot 3" + ChateauRoom1Digspot = "Chateau Room 1 Digspot" + ChateauPoppleFightRoomBlock1 = "Chateau Popple Fight Room Block 1" + ChateauPoppleFightRoomBlock2 = "Chateau Popple Fight Room Block 2" + ChateauPoppleFightRoomDigspot = "Chateau Popple Fight Room Digspot" + ChateauBarrelRoomDigspot = "Chateau Barrel Room Digspot" + ChateauGobletRoomDigspot = "Chateau Goblet Room Digspot" + ChucklehuckWoodsCaveRoom1Block1 = "Chucklehuck Woods Cave Room 1 Block 1" + ChucklehuckWoodsCaveRoom1Block2 = "Chucklehuck Woods Cave Room 1 Block 2" + ChucklehuckWoodsCaveRoom2Block = "Chucklehuck Woods Cave Room 2 Block" + ChucklehuckWoodsCaveRoom3Block = "Chucklehuck Woods Cave Room 3 Block" + ChucklehuckWoodsRoom2Block = "Chucklehuck Woods Room 2 Block" + ChucklehuckWoodsRoom2Digspot = "Chucklehuck Woods Room 2 Digspot" + ChucklehuckWoodsPipeRoomBlock1 = "Chucklehuck Woods Pipe Room Block 1" + ChucklehuckWoodsPipeRoomBlock2 = "Chucklehuck Woods Pipe Room Block 2" + ChucklehuckWoodsPipeRoomDigspot1 = "Chucklehuck Woods Pipe Room Digspot 1" + ChucklehuckWoodsPipeRoomDigspot2 = "Chucklehuck Woods Pipe Room Digspot 2" + ChucklehuckWoodsRoom4Block1 = "Chucklehuck Woods Room 4 Block 1" + ChucklehuckWoodsRoom4Block2 = "Chucklehuck Woods Room 4 Block 2" + ChucklehuckWoodsRoom4Block3 = "Chucklehuck Woods Room 4 Block 3" + ChucklehuckWoodsRoom7Block1 = "Chucklehuck Woods Room 7 Block 1" + ChucklehuckWoodsRoom7Block2 = "Chucklehuck Woods Room 7 Block 2" + ChucklehuckWoodsRoom7Digspot1 = "Chucklehuck Woods Room 7 Digspot 1" + ChucklehuckWoodsRoom7Digspot2 = "Chucklehuck Woods Room 7 Digspot 2" + ChucklehuckWoodsRoom8Digspot = "Chucklehuck Woods Room 8 Digspot" + ChucklehuckWoodsEastOfChucklerootDigspot = "Chucklehuck Woods East of Chuckleroot Digspot" + ChucklehuckWoodsNortheastOfChucklerootDigspot1 = "Chucklehuck Woods Northeast of Chuckleroot Digspot 1" + ChucklehuckWoodsNortheastOfChucklerootDigspot2 = "Chucklehuck Woods Northeast of Chuckleroot Digspot 2" + ChucklehuckWoodsNortheastOfChucklerootDigspot3 = "Chucklehuck Woods Northeast of Chuckleroot Digspot 3" + ChucklehuckWoodsNortheastOfChucklerootDigspot4 = "Chucklehuck Woods Northeast of Chuckleroot Digspot 4" + ChucklehuckWoodsWhiteFruitRoomDigspot1 = "Chucklehuck Woods White Fruit Room Digspot 1" + ChucklehuckWoodsWhiteFruitRoomDigspot2 = "Chucklehuck Woods White Fruit Room Digspot 2" + ChucklehuckWoodsWhiteFruitRoomDigspot3 = "Chucklehuck Woods White Fruit Room Digspot 3" + ChucklehuckWoodsWestOfChucklerootBlock = "Chucklehuck Woods West of Chuckleroot Block" + ChucklehuckWoodsSouthwestOfChucklerootBlock = "Chucklehuck Woods Southwest of Chuckleroot Block" + ChucklehuckWoodsWigglerRoomDigspot1 = "Chucklehuck Woods Wiggler Room Digspot 1" + ChucklehuckWoodsWigglerRoomDigspot2 = "Chucklehuck Woods Wiggler Room Digspot 2" + ChucklehuckWoodsAfterChucklerootBlock1 = "Chucklehuck Woods After Chuckleroot Block 1" + ChucklehuckWoodsAfterChucklerootBlock2 = "Chucklehuck Woods After Chuckleroot Block 2" + ChucklehuckWoodsAfterChucklerootBlock3 = "Chucklehuck Woods After Chuckleroot Block 3" + ChucklehuckWoodsAfterChucklerootBlock4 = "Chucklehuck Woods After Chuckleroot Block 4" + ChucklehuckWoodsAfterChucklerootBlock5 = "Chucklehuck Woods After Chuckleroot Block 5" + ChucklehuckWoodsAfterChucklerootBlock6 = "Chucklehuck Woods After Chuckleroot Block 6" + WinkleAreaBeanstarRoomBlock = "Winkle Area Beanstar Room Block" + WinkleAreaDigspot = "Winkle Area Digspot" + WinkleAreaOutsideColosseumBlock = "Winkle Area Outside Colosseum Block" + ChucklehuckWoodsKoopaRoomBlock1 = "Chucklehuck Woods Koopa Room Block 1" + ChucklehuckWoodsKoopaRoomBlock2 = "Chucklehuck Woods Koopa Room Block 2" + ChucklehuckWoodsKoopaRoomDigspot = "Chucklehuck Woods Koopa Room Digspot" + ChucklehuckWoodsWinkleCaveBlock1 = "Chucklehuck Woods Winkle Cave Block 1" + ChucklehuckWoodsWinkleCaveBlock2 = "Chucklehuck Woods Winkle Cave Block 2" + OhoOasisWestDigspot = "Oho Oasis West Digspot" + OhoOasisFirePalaceBlock = "Oho Oasis Fire Palace Block" + SewersRoom3Block1 = "Sewers Room 3 Block 1" + SewersRoom3Block2 = "Sewers Room 3 Block 2" + SewersRoom3Block3 = "Sewers Room 3 Block 3" + SewersRoom5Block1 = "Sewers Room 5 Block 1" + SewersRoom5Block2 = "Sewers Room 5 Block 2" + SewersPrisonRoomBlock1 = "Sewers Prison Room Block 1" + SewersPrisonRoomBlock2 = "Sewers Prison Room Block 2" + SewersPrisonRoomBlock3 = "Sewers Prison Room Block 3" + SewersPrisonRoomBlock4 = "Sewers Prison Room Block 4" + OhoOceanFirePuzzleRoomDigspot = "Oho Ocean Fire Puzzle Room Digspot" + OhoOceanSouthRoom1Block = "Oho Ocean South Room 1 Block" + OhoOceanSouthRoom2Digspot = "Oho Ocean South Room 2 Digspot" + OhoOceanSpikeRoomDigspot1 = "Oho Ocean Spike Room Digspot 1" + OhoOceanSpikeRoomDigspot2 = "Oho Ocean Spike Room Digspot 2" + OceanNorthWhirlpoolBlock1 = "Ocean North Whirlpool Block 1" + OceanNorthWhirlpoolBlock2 = "Ocean North Whirlpool Block 2" + OceanNorthWhirlpoolBlock3 = "Ocean North Whirlpool Block 3" + OceanNorthWhirlpoolBlock4 = "Ocean North Whirlpool Block 4" + OceanNorthWhirlpoolDigspot1 = "Ocean North Whirlpool Digspot 1" + OceanNorthWhirlpoolDigspot2 = "Ocean North Whirlpool Digspot 2" + OceanSouthWhirlpoolDigspot1 = "Ocean South Whirlpool Digspot 1" + OceanSouthWhirlpoolDigspot2 = "Ocean South Whirlpool Digspot 2" + OceanSouthWhirlpoolDigspot3 = "Ocean South Whirlpool Digspot 3" + OceanSouthWhirlpoolDigspot4 = "Ocean South Whirlpool Digspot 4" + OceanSouthWhirlpoolDigspot5 = "Ocean South Whirlpool Digspot 5" + OceanSouthWhirlpoolDigspot6 = "Ocean South Whirlpool Digspot 6" + OceanSouthWhirlpoolRoom2Digspot = "Ocean South Whirlpool Room 2 Digspot" + WoohooHooniversityStarRoomBlock1 = "Woohoo Hooniversity Star Room Block 1" + WoohooHooniversityStarRoomBlock2 = "Woohoo Hooniversity Star Room Block 2" + WoohooHooniversityStarRoomBlock3 = "Woohoo Hooniversity Star Room Block 3" + WoohooHooniversitySunDoorBlock1 = "Woohoo Hooniversity Sun Door Block 1" + WoohooHooniversitySunDoorBlock2 = "Woohoo Hooniversity Sun Door Block 2" + WoohooHooniversitySouthOfStarRoomBlock = "Woohoo Hooniversity South Of Star Room Block" + WoohooHooniversityWestOfStarRoomDigspot1 = "Woohoo Hooniversity West Of Star Room Digspot 1" + WoohooHooniversityWestOfStarRoomDigspot2 = "Woohoo Hooniversity West Of Star Room Digspot 2" + WoohooHooniversityBarrelPuzzleEntranceDigspot1 = "Woohoo Hooniversity Barrel Puzzle Entrance Digspot 1" + WoohooHooniversityBarrelPuzzleEntranceBlock1 = "Woohoo Hooniversity Barrel Puzzle Entrance Block 1" + WoohooHooniversityBarrelPuzzleEntranceBlock2 = "Woohoo Hooniversity Barrel Puzzle Entrance Block 2" + WoohooHooniversityBarrelPuzzleEntranceBlock3 = "Woohoo Hooniversity Barrel Puzzle Entrance Block 3" + WoohooHooniversityBarrelPuzzleEntranceBlock4 = "Woohoo Hooniversity Barrel Puzzle Entrance Block 4" + WoohooHooniversityBarrelPuzzleEntranceDigspot2 = "Woohoo Hooniversity Barrel Puzzle Entrance Digspot 2" + ChucklehuckWoodsRoom1Digspot = "Chucklehuck Woods Room 1 Digspot" + WoohooHooniversityWestOfStarRoom2Digspot = "Woohoo Hooniversity West of Star Room 2 Digspot" + WoohooHooniversityWestOfStarRoom3Digspot = "Woohoo Hooniversity West of Star Room 3 Digspot" + WoohooHooniversityWestOfStarRoom4Block1 = "Woohoo Hooniversity West of Star Room 4 Block 1" + WoohooHooniversityWestOfStarRoom4Block2 = "Woohoo Hooniversity West of Star Room 4 Block 2" + WoohooHooniversityWestOfStarRoom4Block3 = "Woohoo Hooniversity West of Star Room 4 Block 3" + WoohooHooniversityWestOfStarRoom4Digspot1 = "Woohoo Hooniversity West of Star Room 4 Digspot 1" + WoohooHooniversityWestOfStarRoom4Digspot2 = "Woohoo Hooniversity West of Star Room 4 Digspot 2" + WoohooHooniversityWestOfStarRoom5Digspot = "Woohoo Hooniversity West of Star Room 5 Digspot" + WoohooHooniversityEntranceToMiniMarioRoomDigspot1 = "Woohoo Hooniversity Entrance to Mini Mario Room Digspot 1" + WoohooHooniversityEntranceToMiniMarioRoomDigspot2 = "Woohoo Hooniversity Entrance to Mini Mario Room Digspot 2" + WoohooHooniversityEntranceToMiniMarioRoom2Digspot = "Woohoo Hooniversity Entrance to Mini Mario Room 2 Digspot" + WoohooHooniversityMiniMarioPuzzleBlock = "Woohoo Hooniversity Mini Mario Puzzle Block" + WoohooHooniversityMiniMarioPuzzleDigspot = "Woohoo Hooniversity Mini Mario Puzzle Digspot" + WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1 = "Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 1" + WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2 = "Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 2" + WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3 = "Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 3" + WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4 = "Woohoo Hooniversity Mini Mario Puzzle Secret Area Block 4" + WoohooHooniversityPastSunDoorBlock1 = "Woohoo Hooniversity Past Sun Door Block 1" + WoohooHooniversityPastSunDoorBlock2 = "Woohoo Hooniversity Past Sun Door Block 2" + WoohooHooniversityPastSunDoorBlock3 = "Woohoo Hooniversity Past Sun Door Block 3" + WoohooHooniversityPastCacklettaRoom1Block = "Woohoo Hooniversity Past Cackletta Room 1 Block" + WoohooHooniversityPastCacklettaRoom2Block1 = "Woohoo Hooniversity Past Cackletta Room 2 Block 1" + WoohooHooniversityPastCacklettaRoom2Block2 = "Woohoo Hooniversity Past Cackletta Room 2 Block 2" + WoohooHooniversityPastCacklettaRoom2Digspot = "Woohoo Hooniversity Past Cackletta Room 2 Digspot" + AirportEntranceDigspot = "Airport Entrance Digspot" + AirportLobbyDigspot = "Airport Lobby Digspot" + AirportLeftsideDigspot1 = "Airport Leftside Digspot 1" + AirportLeftsideDigspot2 = "Airport Leftside Digspot 2" + AirportLeftsideDigspot3 = "Airport Leftside Digspot 3" + AirportLeftsideDigspot4 = "Airport Leftside Digspot 4" + AirportLeftsideDigspot5 = "Airport Leftside Digspot 5" + AirportMiddleDigspot1 = "Airport Middle Digspot 1" + AirportMiddleDigspot2 = "Airport Middle Digspot 2" + AirportMiddleDigspot3 = "Airport Middle Digspot 3" + AirportMiddleDigspot4 = "Airport Middle Digspot 4" + AirportMiddleDigspot5 = "Airport Middle Digspot 5" + AirportRightDigspot1 = "Airport Right Digspot 1" + AirportRightDigspot2 = "Airport Right Digspot 2" + AirportRightDigspot3 = "Airport Right Digspot 3" + AirportRightDigspot4 = "Airport Right Digspot 4" + AirportRightDigspot5 = "Airport Right Digspot 5" + GwarharLagoonPipeRoomDigspot = "Gwarhar Lagoon Pipe Room Digspot" + GwarharLagoonMassageParlorEntranceDigspot = "Gwarhar Lagoon Massage Parlor Entrance Digspot" + GwarharLagoonPastHermieDigspot = "Gwarhar Lagoon Past Hermie Digspot" + GwarharLagoonEntranceToWestUnderwaterAreaDigspot = "Gwarhar Lagoon Entrance to West Underwater Area Digspot" + GwarharLagoonFireDashPuzzleRoom1Digspot1 = "Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 1" + GwarharLagoonFireDashPuzzleRoom1Digspot2 = "Gwarhar Lagoon Fire Dash Puzzle Room 1 Digspot 2" + GwarharLagoonFireDashPuzzleRoom2Digspot = "Gwarhar Lagoon Fire Dash Puzzle Room 2 Digspot" + GwarharLagoonFireDashPuzzleRoom3Digspot1 = "Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 1" + GwarharLagoonFireDashPuzzleRoom3Digspot2 = "Gwarhar Lagoon Fire Dash Puzzle Room 3 Digspot 2" + GwarharLagoonEastOfStoneBridgeBlock = "Gwarhar Lagoon East of Stone Bridge Block" + GwarharLagoonNorthOfSpangleRoomDigspot = "Gwarhar Lagoon North of Spangle Room Digspot" + GwarharLagoonWestOfSpangleRoomDigspot = "Gwarhar Lagoon West of Spangle Room Digspot" + GwarharLagoonSpangleRoomBlock = "Gwarhar Lagoon Spangle Room Block" + GwarharLagoonFirstUnderwaterAreaRoom1Block = "Gwarhar Lagoon First Underwater Area Room 1 Block" + GwarharLagoonFirstUnderwaterAreaRoom2Block1 = "Gwarhar Lagoon First Underwater Area Room 2 Block 1" + GwarharLagoonFirstUnderwaterAreaRoom2Block2 = "Gwarhar Lagoon First Underwater Area Room 2 Block 2" + GwarharLagoonSecondUnderwaterAreaRoom4Digspot = "Gwarhar Lagoon Second Underwater Area Room 4 Digspot" + GwarharLagoonSecondUnderwaterAreaRoom2Digspot1 = "Gwarhar Lagoon Second Underwater Area Room 2 Digspot 1" + GwarharLagoonSecondUnderwaterAreaRoom2Digspot2 = "Gwarhar Lagoon Second Underwater Area Room 2 Digspot 2" + GwarharLagoonSecondUnderwaterAreaRoom3Block1 = "Gwarhar Lagoon Second Underwater Area Room 3 Block 1" + GwarharLagoonSecondUnderwaterAreaRoom3Block2 = "Gwarhar Lagoon Second Underwater Area Room 3 Block 2" + GwarharLagoonSecondUnderwaterAreaRoom3Block3 = "Gwarhar Lagoon Second Underwater Area Room 3 Block 3" + GwarharLagoonSecondUnderwaterAreaRoom1Digspot = "Gwarhar Lagoon Second Underwater Area Room 1 Digspot" + WoohooHooniversityBasementRoom1Digspot = "Woohoo Hooniversity Basement Room 1 Digspot" + WoohooHooniversityBasementRoom2Digspot = "Woohoo Hooniversity Basement Room 2 Digspot" + WoohooHooniversityBasementRoom3Block = "Woohoo Hooniversity Basement Room 3 Block" + WoohooHooniversityBasementRoom4Block = "Woohoo Hooniversity Basement Room 4 Block" + WoohooHooniversityPoppleRoomDigspot1 = "Woohoo Hooniversity Popple Room Digspot 1" + WoohooHooniversityPoppleRoomDigspot2 = "Woohoo Hooniversity Popple Room Digspot 2" + TeeheeValleyBeforePoppleDigspot1 = "Teehee Valley Before Popple Digspot 1" + TeeheeValleyBeforePoppleDigspot2 = "Teehee Valley Before Popple Digspot 2" + TeeheeValleyBeforePoppleDigspot3 = "Teehee Valley Before Popple Digspot 3" + TeeheeValleyBeforePoppleDigspot4 = "Teehee Valley Before Popple Digspot 4" + TeeheeValleyRoom1Digspot1 = "Teehee Valley Room 1 Digspot 1" + TeeheeValleyRoom1Digspot2 = "Teehee Valley Room 1 Digspot 2" + TeeheeValleyRoom1Digspot3 = "Teehee Valley Room 1 Digspot 3" + TeeheeValleyEastRoomDigspot1 = "Teehee Valley East Room Digspot 1" + TeeheeValleyEastRoomDigspot2 = "Teehee Valley East Room Digspot 2" + TeeheeValleyEastRoomDigspot3 = "Teehee Valley East Room Digspot 3" + TeeheeValleySoloMarioRoomDigspot1 = "Teehee Valley Solo Mario Room Digspot 1" + TeeheeValleySoloMarioRoomDigspot2 = "Teehee Valley Solo Mario Room Digspot 2" + TeeheeValleySoloMarioRoomDigspot3 = "Teehee Valley Solo Mario Room Digspot 3" + TeeheeValleySoloMarioRoomDigspot4 = "Teehee Valley Solo Mario Room Digspot 4" + TeeheeValleyPastUltraHammersBlock1 = "Teehee Valley Past Ultra Hammers Block 1" + TeeheeValleyPastUltraHammersBlock2 = "Teehee Valley Past Ultra Hammers Block 2" + TeeheeValleyPastUltraHammersDigspot1 = "Teehee Valley Past Ultra Hammers Digspot 1" + TeeheeValleyPastUltraHammersDigspot2 = "Teehee Valley Past Ultra Hammers Digspot 2" + TeeheeValleyPastUltraHammersDigspot3 = "Teehee Valley Past Ultra Hammers Digspot 3" + TeeheeValleyEntranceToHoohooMountainDigspot = "Teehee Valley Entrance To Hoohoo Mountain Digspot" + TeeheeValleySoloLuigiMazeRoom2Digspot1 = "Teehee Valley Solo Luigi Maze Room 2 Digspot 1" + TeeheeValleySoloLuigiMazeRoom2Digspot2 = "Teehee Valley Solo Luigi Maze Room 2 Digspot 2" + TeeheeValleySoloLuigiMazeRoom1Block = "Teehee Valley Solo Luigi Maze Room 1 Block" + TeeheeValleyBeforeTrunkleDigspot = "Teehee Valley Before Trunkle Digspot" + TeeheeValleyTrunkleRoomDigspot = "Teehee Valley Trunkle Room Digspot" + SSChuckolaStorageRoomBlock1 = "S.S Chuckola Storage Room Block 1" + SSChuckolaStorageRoomBlock2 = "S.S Chuckola Storage Room Block 2" + LittleFungitownEmbassyRoomBlock = "Little Fungitown Embassy Room Block" + LittleFungitownEntranceRoomBlock = "Little Fungitown Entrance Room Block" + JokesEndPipeDigspot = "Jokes End Pipe Digspot" + JokesEndStaircaseDigspot = "Jokes End Staircase Digspot" + JokesEndWestOfFirstBoilerRoomBlock1 = "Jokes End West Of First Boiler Room Block 1" + JokesEndWestOfFirstBoilerRoomBlock2 = "Jokes End West Of First Boiler Room Block 2" + JokesEndFirstBoilerRoomDigspot1 = "Jokes End First Boiler Room Digspot 1" + JokesEndFirstBoilerRoomDigspot2 = "Jokes End First Boiler Room Digspot 2" + JokesEndFurnaceRoom1Block1 = "Jokes End Furnace Room 1 Block 1" + JokesEndFurnaceRoom1Block2 = "Jokes End Furnace Room 1 Block 2" + JokesEndFurnaceRoom1Block3 = "Jokes End Furnace Room 1 Block 3" + JokesEndNortheastOfBoilerRoom1Block = "Jokes End Northeast Of Boiler Room 1 Block" + JokesEndNortheastOfBoilerRoom3Digspot = "Jokes End Northeast Of Boiler Room 3 Digspot" + JokesEndNortheastOfBoilerRoom2Block1 = "Jokes End Northeast Of Boiler Room 2 Block" + JokesEndNortheastOfBoilerRoom2Block2 = "Jokes End Northeast Of Boiler Room 2 Digspot" + JokesEndSecondFloorWestRoomBlock1 = "Jokes End Second Floor West Room Block 1" + JokesEndSecondFloorWestRoomBlock2 = "Jokes End Second Floor West Room Block 2" + JokesEndSecondFloorWestRoomBlock3 = "Jokes End Second Floor West Room Block 3" + JokesEndSecondFloorWestRoomBlock4 = "Jokes End Second Floor West Room Block 4" + JokesEndSecondFloorEastRoomDigspot = "Jokes End Second Floor East Room Digspot" + JokesEndFinalSplitUpRoomDigspot = "Jokes End Final Split Up Room Digspot" + JokesEndSouthOfBridgeRoomBlock = "Jokes End South Of Bridge Room Block" + JokesEndSoloLuigiRoom1Block = "Jokes End Solo Luigi Room 1 Block" + JokesEndSoloLuigiRoom1Digspot = "Jokes End Solo Luigi Room 1 Digspot" + JokesEndSoloMarioFinalRoomBlock1 = "Jokes End Solo Mario Final Room Block 1" + JokesEndSoloMarioFinalRoomBlock2 = "Jokes End Solo Mario Final Room Block 2" + JokesEndSoloMarioFinalRoomBlock3 = "Jokes End Solo Mario Final Room Block 3" + JokesEndSoloLuigiRoom2Digspot = "Jokes End Solo Luigi Room 2 Digspot" + JokesEndSoloMarioRoom1Digspot = "Jokes End Solo Mario Room 1 Digspot" + JokesEndSoloMarioRoom2Block1 = "Jokes End Solo Mario Room 2 Block 1" + JokesEndSoloMarioRoom2Block2 = "Jokes End Solo Mario Room 2 Block 2" + JokesEndSoloMarioRoom2Block3 = "Jokes End Solo Mario Room 2 Block 3" + JokesEndSecondBoilerRoomDigspot1 = "Jokes End Second Boiler Room Digspot 1" + JokesEndSecondBoilerRoomDigspot2 = "Jokes End Second Boiler Room Digspot 2" + JokesEndNorthOfSecondBoilerRoomBlock1 = "Jokes End North Of Second Boiler Room Block 1" + JokesEndNorthOfSecondBoilerRoomBlock2 = "Jokes End North Of Second Boiler Room Block 2" + WinkleAreaColloseumDigspot = "Winkle Area Colloseum Digspot" + HoohooMountainFountainRoom2Block = "Hoohoo Mountain Fountain Room 2 Block" + HoohooMountainFountainRoom2Digspot = "Hoohoo Mountain Fountain Room 2 Digspot" + HoohooMountainPastHoohoorosConnectorRoomDigspot1 = "Hoohoo Mountain Past Hoohooros Connector Room Digspot 1" + HoohooMountainPastHoohoorosConnectorRoomBlock = "Hoohoo Mountain Past Hoohooros Connector Room Block" + HoohooMountainPastHoohoorosConnectorRoomDigspot2 = "Hoohoo Mountain Past Hoohooros Connector Room Digspot 2" + JokesEndBeforeJojoraRoomBlock1 = "Jokes End Before Jojora Room Block 1" + JokesEndBeforeJojoraRoomBlock2 = "Jokes End Before Jojora Room Block 2" + JokesEndBeforeJojoraRoomDigspot = "Jokes End Before Jojora Room Digspot" + JokesEndJojoraRoomDigspot = "Jokes End Jojora Room Digspot" + BeanbeanOutskirtsBeforeHarhallDigspot1 = "Beanbean Outskirts Before Harhall Digspot 1" + BeanbeanOutskirtsBeforeHarhallDigspot2 = "Beanbean Outskirts Before Harhall Digspot 2" + BeanbeanOutskirtsBroochGuardsRoomDigspot1 = "Beanbean Outskirts Brooch Guards Room Digspot 1" + BeanbeanOutskirtsBroochGuardsRoomDigspot2 = "Beanbean Outskirts Brooch Guards Room Digspot 2" + BeanbeanOutskirtsChateauEntranceDigspot1 = "Beanbean Outskirts Chateau Entrance Digspot 1" + BeanbeanOutskirtsChateauEntranceDigspot2 = "Beanbean Outskirts Chateau Entrance Digspot 2" + BeanbeanOutskirtsSouthOfHooniversityGuardsDigspot1 = "Beanbean Outskirts South of Hooniversity Guards Digspot 1" + BeanbeanOutskirtsSouthOfHooniversityGuardsDigspot2 = "Beanbean Outskirts South of Hooniversity Guards Digspot 2" + BeanbeanOutskirtsSouthOfHooniversityGuardsDigspot3 = "Beanbean Outskirts South of Hooniversity Guards Digspot 3" + OutsideWoohooHooniversityBlock = "Outside Woohoo Hooniversity Block" + BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot1 = "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 1" + BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot2 = "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 2" + WoohooHooniversitySoloMarioBarrelAreaBlock1 = "Woohoo Hooniversity Solo Mario Barrel Area Block 1" + WoohooHooniversitySoloMarioBarrelAreaBlock2 = "Woohoo Hooniversity Solo Mario Barrel Area Block 2" + WoohooHooniversitySoloMarioBarrelAreaBlock3 = "Woohoo Hooniversity Solo Mario Barrel Area Block 3" + BeanbeanOutskirtsPipe2RoomDigspot = "Beanbean Outskirts Pipe 2 Room Digspot" + BeanbeanOutskirtsPipe4RoomDigspot = "Beanbean Outskirts Pipe 4 Room Digspot" + BeanbeanCastleTownBeanletReward = "Beanbean Castle Town Beanlet Reward" + HoohooVillageMoleBehindTurtle = "Hoohoo Village Mole Behind Turtle" + HoohooMountainBaseMoleNearTeeheeValley = "Hoohoo Mountain Base Mole Near Teehee Valley" + BeanbeanOutskirtsSoloLuigiCaveMole = "Beanbean Outskirts Solo Luigi Cave Mole" + BeanbeanOutskirtsFarmRoomMoleReward1 = "Beanbean Outskirts Farm Room Mole Reward 1" + BeanbeanOutskirtsFarmRoomMoleReward2 = "Beanbean Outskirts Farm Room Mole Reward 2" + JokesEndMoleReward1 = "Jokes End Mole Reward 1" + JokesEndMoleReward2 = "Jokes End Mole Reward 2" + NorthOceanWhirlpoolMole = "North Ocean Whirlpool Mole" + BeanbeanOutskirtsNESoloMarioMole1 = "Beanbean Outskirts NE Solo Mario Mole 1" + HoohooVillageHammers = "Hoohoo Village Hammers" + BeanbeanOutskirtsSuperHammerUpgrade = "Beanbean Outskirts Super Hammer Upgrade" + BeanbeanOutskirtsUltraHammerUpgrade = "Beanbean Outskirts Ultra Hammer Upgrade" + OhoOasisFirebrand = "Oho Oasis Firebrand" + OhoOasisThunderhand = "Oho Oasis Thunderhand" + ChucklehuckWoodsRedChuckolaFruit = "Chucklehuck Woods Red Chuckola Fruit" + ChucklehuckWoodsWhiteChuckolaFruit = "Chucklehuck Woods White Chuckola Fruit" + ChucklehuckWoodsPurpleChuckolaFruit = "Chucklehuck Woods Purple Chuckola Fruit" + SSChuckolaMembershipCard = "S.S Chuckola Membership Card" + WinkleAreaWinkleCard = "Winkle Area Winkle Card" + BeanbeanCastlePeachsExtraDress = "Beanbean Castle Peach's Extra Dress" + BeanbeanCastleFakeBeastar = "Beanbean Castle Fake Beanstar" + BeanbeanCastleTownBeanlet1 = "Beanbean Castle Town Beanlet 1" + BeanbeanCastleTownBeanlet2 = "Beanbean Castle Town Beanlet 2" + BeanbeanCastleTownBeanlet3 = "Beanbean Castle Town Beanlet 3" + BeanbeanCastleTownBeanlet4 = "Beanbean Castle Town Beanlet 4" + BeanbeanCastleTownBeanlet5 = "Beanbean Castle Town Beanlet 5" + BeanbeanCastleTownBeanstone1 = "Beanbean Castle Town Beanstone 1" + BeanbeanCastleTownBeanstone2 = "Beanbean Castle Town Beanstone 2" + BeanbeanCastleTownBeanstone3 = "Beanbean Castle Town Beanstone 3" + BeanbeanCastleTownBeanstone4 = "Beanbean Castle Town Beanstone 4" + BeanbeanCastleTownBeanstone5 = "Beanbean Castle Town Beanstone 5" + BeanbeanCastleTownBeanstone6 = "Beanbean Castle Town Beanstone 6" + BeanbeanCastleTownBeanstone7 = "Beanbean Castle Town Beanstone 7" + BeanbeanCastleTownBeanstone8 = "Beanbean Castle Town Beanstone 8" + BeanbeanCastleTownBeanstone9 = "Beanbean Castle Town Beanstone 9" + BeanbeanCastleTownBeanstone10 = "Beanbean Castle Town Beanstone 10" + YoshiTheaterBlueYoshi = "Yoshi Theater Blue Yoshi" + YoshiTheaterRedYoshi = "Yoshi Theater Red Yoshi" + YoshiTheaterGreenYoshi = "Yoshi Theater Green Yoshi" + YoshiTheaterYellowYoshi = "Yoshi Theater Yellow Yoshi" + YoshiTheaterPurpleYoshi = "Yoshi Theater Purple Yoshi" + YoshiTheaterOrangeYoshi = "Yoshi Theater Orange Yoshi" + YoshiTheaterAzureYoshi = "Yoshi Theater Azure Yoshi" + BeanbeanCastleBeanbeanBrooch = "Beanbean Castle Beanbean Brooch" + BeanbeanOutskirtsSecretScroll1 = "Beanbean Outskirts Secret Scroll 1" + BeanbeanOutskirtsSecretScroll2 = "Beanbean Outskirts Secret Scroll 2" + BeanbeanOutskirtsBeanFruit1 = "Beanbean Outskirts Bean Fruit 1" + BeanbeanOutskirtsBeanFruit2 = "Beanbean Outskirts Bean Fruit 2" + BeanbeanOutskirtsBeanFruit3 = "Beanbean Outskirts Bean Fruit 3" + BeanbeanOutskirtsBeanFruit4 = "Beanbean Outskirts Bean Fruit 4" + BeanbeanOutskirtsBeanFruit5 = "Beanbean Outskirts Bean Fruit 5" + BeanbeanOutskirtsBeanFruit6 = "Beanbean Outskirts Bean Fruit 6" + BeanbeanOutskirtsBeanFruit7 = "Beanbean Outskirts Bean Fruit 7" + HoohooMountainPeasleysRose = "Hoohoo Mountain Peasley's Rose" + ChateauGreenGoblet = "Chateau Green Goblet" + ChateauRedGoblet = "Chateau Red Goblet" + GwarharLagoonRedPearlBean = "Gwarhar Lagoon Red Pearl Bean" + GwarharLagoonGreenPearlBean = "Gwarhar Lagoon Green Pearl Bean" + GwarharLagoonSpangle = "Gwarhar Lagoon Spangle" + BeanstarPieceWinkleArea = "Beanstar Piece Winkle Area" + BeanstarPieceHarhall = "Beanstar Piece Harhall" + BeanstarPieceYoshiTheater = "Beanstar Piece Yoshi Theater" + BeanstarPieceHermie = "Beanstar Piece Hermie" + ShopStartingFlag1 = "Shop Starting Flag 1" + ShopStartingFlag2 = "Shop Starting Flag 2" + ShopStartingFlag3 = "Shop Starting Flag 3" + ShopChuckolatorFlag = "Shop Chuckolator Flag" + ShopMomPiranhaFlag1 = "Shop Mom Piranha Flag 1" + ShopMomPiranhaFlag2 = "Shop Mom Piranha Flag 2" + ShopMomPiranhaFlag3 = "Shop Mom Piranha Flag 3" + ShopMomPiranhaFlag4 = "Shop Mom Piranha Flag 4" + ShopPeachKidnappedFlag1 = "Shop Peach Kidnapped Flag 1" + ShopPeachKidnappedFlag2 = "Shop Peach Kidnapped Flag 2" + FungitownShopStartingFlag1 = "Fungitown Shop Starting Flag 1" + FungitownShopStartingFlag2 = "Fungitown Shop Starting Flag 2" + FungitownShopStartingFlag3 = "Fungitown Shop Starting Flag 3" + FungitownShopStartingFlag4 = "Fungitown Shop Starting Flag 4" + FungitownShopStartingFlag5 = "Fungitown Shop Starting Flag 5" + FungitownShopStartingFlag6 = "Fungitown Shop Starting Flag 6" + FungitownShopStartingFlag7 = "Fungitown Shop Starting Flag 7" + FungitownShopStartingFlag8 = "Fungitown Shop Starting Flag 8" + ShopBeanstarCompleteFlag1 = "Shop Beanstar Complete Flag 1" + ShopBeanstarCompleteFlag2 = "Shop Beanstar Complete Flag 2" + ShopBeanstarCompleteFlag3 = "Shop Beanstar Complete Flag 3" + FungitownShopBeanstarCompleteFlag = "Fungitown Shop Beanstar Complete Flag" + ShopBirdoFlag = "Shop Birdo Flag" + FungitownShopBirdoFlag = "Fungitown Shop Birdo Flag" + CoffeeShopBrewReward1 = "Coffee Shop Brew Reward 1" + CoffeeShopBrewReward2 = "Coffee Shop Brew Reward 2" + CoffeeShopBrewReward3 = "Coffee Shop Brew Reward 3" + CoffeeShopBrewReward4 = "Coffee Shop Brew Reward 4" + CoffeeShopBrewReward5 = "Coffee Shop Brew Reward 5" + CoffeeShopBrewReward6 = "Coffee Shop Brew Reward 6" + CoffeeShopBrewReward7 = "Coffee Shop Brew Reward 7" + CoffeeShopWoohooBlend = "Coffee Shop Woohoo Blend" + CoffeeShopHoohooBlend = "Coffee Shop Hoohoo Blend" + CoffeeShopChuckleBlend = "Coffee Shop Chuckle Blend" + CoffeeShopTeeheeBlend = "Coffee Shop Teehee Blend" + CoffeeShopHoolumbian = "Coffee Shop Hoolumbian" + CoffeeShopChuckoccino = "Coffee Shop Chuckoccino" + CoffeeShopTeeheespresso = "Coffee Shop Teeheespresso" + PantsShopStartingFlag1 = "Pants Shop Starting Flag 1" + PantsShopStartingFlag2 = "Pants Shop Starting Flag 2" + PantsShopStartingFlag3 = "Pants Shop Starting Flag 3" + PantsShopChuckolatorFlag1 = "Pants Shop Chuckolator Flag 1" + PantsShopChuckolatorFlag2 = "Pants Shop Chuckolator Flag 2" + PantsShopChuckolatorFlag3 = "Pants Shop Chuckolator Flag 3" + PantsShopMomPiranhaFlag1 = "Pants Shop Mom Piranha Flag 1" + PantsShopMomPiranhaFlag2 = "Pants Shop Mom Piranha Flag 2" + PantsShopMomPiranhaFlag3 = "Pants Shop Mom Piranha Flag 3" + PantsShopPeachKidnappedFlag1 = "Pants Shop Peach Kidnapped Flag 1" + PantsShopPeachKidnappedFlag2 = "Pants Shop Peach Kidnapped Flag 2" + PantsShopPeachKidnappedFlag3 = "Pants Shop Peach Kidnapped Flag 3" + PantsShopBeanstarCompleteFlag1 = "Pants Shop Beanstar Complete Flag 1" + PantsShopBeanstarCompleteFlag2 = "Pants Shop Beanstar Complete Flag 2" + PantsShopBeanstarCompleteFlag3 = "Pants Shop Beanstar Complete Flag 3" + PantsShopBirdoFlag1 = "Pants Shop Birdo Flag 1" + PantsShopBirdoFlag2 = "Pants Shop Birdo Flag 2" + PantsShopBirdoFlag3 = "Pants Shop Birdo Flag 3" + FungitownPantsShopStartingFlag1 = "Fungitown Pants Shop Starting Flag 1" + FungitownPantsShopStartingFlag2 = "Fungitown Pants Shop Starting Flag 2" + FungitownPantsShopStartingFlag3 = "Fungitown Pants Shop Starting Flag 3" + FungitownPantsShopBeanstarCompleteFlag1 = "Fungitown Pants Shop Beanstar Complete Flag 1" + FungitownPantsShopBeanstarCompleteFlag2 = "Fungitown Pants Shop Beanstar Complete Flag 2" + FungitownPantsShopBirdoFlag1 = "Fungitown Pants Shop Birdo Flag 1" + FungitownPantsShopBirdoFlag2 = "Fungitown Pants Shop Birdo Flag 2" + BeanbeanOutskirtsNESoloMarioMole2 = "Beanbean Outskirts NE Solo Mario Mole 2" + GwarharLagoonSpangleReward = "Gwarhar Lagoon Spangle Reward" + BowsersCastleEntranceBlock1 = "Bowser's Castle Entrance Block 1" + BowsersCastleEntranceBlock2 = "Bowser's Castle Entrance Block 2" + BowsersCastleEntranceDigspot = "Bowser's Castle Entrance Digspot" + BowsersCastleIggyMortonHallwayBlock1 = "Bowser's Castle Iggy & Morton Hallway Block 1" + BowsersCastleIggyMortonHallwayBlock2 = "Bowser's Castle Iggy & Morton Hallway Block 2" + BowsersCastleIggyMortonHallwayDigspot = "Bowser's Castle Iggy & Morton Hallway Digspot" + BowsersCastleAfterMortonBlock = "Bowser's Castle After Morton Block" + BowsersCastleLudwigRoyHallwayBlock1 = "Bowser's Castle Ludwig & Roy Hallway Block 1" + BowsersCastleLudwigRoyHallwayBlock2 = "Bowser's Castle Ludwig & Roy Hallway Block 2" + BowsersCastleRoyCorridorBlock1 = "Bowser's Castle Roy Corridor Block 1" + BowsersCastleRoyCorridorBlock2 = "Bowser's Castle Roy Corridor Block 2" + BowsersCastleWendyLarryHallwayDigspot = "Bowser's Castle Wendy & Larry Hallway Digspot" + BowsersCastleBeforeFawfulFightBlock1 = "Bowser's Castle Before Fawful Fight Block 1" + BowsersCastleBeforeFawfulFightBlock2 = "Bowser's Castle Before Fawful Fight Block 2" + BowsersCastleGreatDoorBlock1 = "Bowser's Castle Great Door Block 1" + BowsersCastleGreatDoorBlock2 = "Bowser's Castle Great Door Block 2" + BowsersCastleMortonRoom1Digspot = "Bowser's Castle Morton Room 1 Digspot" + BowsersCastleLemmyRoom1Block = "Bowser's Castle Lemmy Room 1 Block" + BowsersCastleLemmyRoom1Digspot = "Bowser's Castle Lemmy Room 1 Digspot" + BowsersCastleLudwigRoom1Block = "Bowser's Castle Ludwig Room 1 Block" + BowsersCastleMiniMarioSidescrollerBlock1 = "Bowser's Castle Mini Mario Sidescroller Block 1" + BowsersCastleMiniMarioSidescrollerBlock2 = "Bowser's Castle Mini Mario Sidescroller Block 2" + BowsersCastleMiniMarioMazeBlock1 = "Bowser's Castle Mini Mario Maze Block 1" + BowsersCastleMiniMarioMazeBlock2 = "Bowser's Castle Mini Mario Maze Block 2" + BowsersCastleBeforeWendyFightBlock1 = "Bowser's Castle Before Wendy Fight Block 1" + BowsersCastleBeforeWendyFightBlock2 = "Bowser's Castle Before Wendy Fight Block 2" + BowsersCastleLarryRoomBlock = "Bowser's Castle Larry Room Block" + BowsersCastleLemmyRoomMole = "Bowser's Castle Lemmy Room Mole" + SurfMinigame = "Surf Minigame" + BeanbeanOutskirtsThunderHandMole = "Beanbean Outskirts Thunder Hand Mole" + BadgeShopMomPiranhaFlag1 = "Badge Shop Mom Piranha Flag 1" + BadgeShopMomPiranhaFlag2 = "Badge Shop Mom Piranha Flag 2" + BadgeShopMomPiranhaFlag3 = "Badge Shop Mom Piranha Flag 3" + HarhallsPants = "Harhall's Pants" + HoohooMountainBaseBooStatueCaveCoinBlock1 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 1" diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py new file mode 100644 index 000000000000..ad388b903b8d --- /dev/null +++ b/worlds/mlss/Options.py @@ -0,0 +1,273 @@ +import typing +from Options import Choice, Option, Toggle, StartInventoryPool + + +class IntroSkip(Toggle): + """ + Skip the intro sequence. Spawns you in pipe 1 on game start. + This does not affect any items. + """ + display_name = "Intro Skip" + + +class BowsersCastleSkip(Toggle): + """ + Skip straight from the entrance hall to bowletta in Bowser's Castle. + All Bowser's Castle items will be removed from the location pool. + """ + display_name = "Bowser's Castle Skip" + + +class ExtraPipes(Toggle): + """ + Gives the player access to pipes 1, 3, 4, and 6 from the start. + """ + display_name = "Start With Extra Pipes" + + +class SkipMinecart(Toggle): + """ + Skip the minecart minigame that leads you through Hoohoo Mountain Base. + This will remove the 1 item in the minecart cave from the location pool. + """ + display_name = "Skip Minecart Minigame" + + +class DisableSurf(Toggle): + """ + Remove the surf minigame item from the location pool. + """ + display_name = "Disable Surf Minigame" + + +class MusicOptions(Choice): + """ + Choose if you want to randomize or disable music. + default: Music will be untouched. + randomize: Music will be randomized. + disable: All music will be disabled. No music will play throughout the entire game. + """ + display_name = "Music Options" + option_default = 0 + option_randomize = 1 + option_disable = 2 + default = 0 + + +class RandomSounds(Toggle): + """ + Randomizes every sound in the game, minus a few sounds that can softlock the game* (UNSTABLE OPTION) + """ + display_name = "Randomize Sounds" + + +class MarioColor(Choice): + """ + This changes the color of Mario's hat, as well as some key colors that are red including UI etc. + """ + display_name = "Mario's Color" + option_red = 0 + option_green = 1 + option_blue = 2 + option_cyan = 3 + option_yellow = 4 + option_orange = 5 + option_purple = 6 + option_pink = 7 + option_black = 8 + option_white = 9 + option_silhouette = 10 + option_chaos = 11 + option_truechaos = 12 + default = 0 + + +class LuigiColor(Choice): + """ + This changes the color of Luigi's hat, as well as some key colors that are green including UI etc. + """ + display_name = "Luigi's Color" + option_red = 0 + option_green = 1 + option_blue = 2 + option_cyan = 3 + option_yellow = 4 + option_orange = 5 + option_purple = 6 + option_pink = 7 + option_black = 8 + option_white = 9 + option_silhouette = 10 + option_chaos = 11 + option_truechaos = 12 + default = 1 + + +class MarioPants(Choice): + """ + This changes the color of Mario's trousers. + """ + display_name = "Mario's Pants Color" + option_vanilla = 0 + option_red = 1 + option_green = 2 + option_blue = 3 + option_cyan = 4 + option_yellow = 5 + option_orange = 6 + option_purple = 7 + option_pink = 8 + option_black = 9 + option_white = 10 + option_chaos = 11 + default = 0 + + +class LuigiPants(Choice): + """ + This changes the color of Luigi's trousers. + """ + display_name = "Luigi's Pants Color" + option_vanilla = 0 + option_red = 1 + option_green = 2 + option_blue = 3 + option_cyan = 4 + option_yellow = 5 + option_orange = 6 + option_purple = 7 + option_pink = 8 + option_black = 9 + option_white = 10 + option_chaos = 11 + default = 0 + + +class RandomizeEnemies(Toggle): + """ + Randomize all normal enemy encounters in the game. + If Bowser's castle skip is enabled then enemies from Bowser's Castle will not be included. + """ + display_name = "Randomize Enemies" + + +class RandomizeBosses(Choice): + """ + Randomize all boss encounters in the game. + If Bowser's castle skip is enabled then bosses from Bowser's Castle will not be included. + Some bosses are not randomized due to flags, and story (Such as the final boss) + Boss Only: Bosses will only be swapped with another boss. + Boss Normal: Bosses can be swapped with normal enemy encounters. + """ + display_name = "Randomize Bosses" + option_none = 0 + option_bossonly = 1 + option_bossnormal = 2 + default = 0 + + +class ScaleStats(Toggle): + """ + This scales enemy HP and XP according to the area of the game you are in scaling linearly. + """ + display_name = "Scale Enemy Stats" + + +class ScalePow(Toggle): + """ + This scales enemy POW according to the area of the game you are in scaling linearly. + """ + display_name = "Scale Enemy POW" + + +class TattleHp(Toggle): + """ + This will display the enemies current and max health while in battle. + """ + display_name = "Tattle HP" + + +class RandomizeBackgrounds(Toggle): + """ + This randomizes the background image in battles + """ + display_name = "Randomize Battle Backgrounds" + + +class HiddenVisible(Toggle): + """ + This makes any hidden blocks in the game into regular item blocks. + """ + 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. + """ + 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. + none: No chuckle bean digspots will be added into the item pool. + only_visible: Only chuckle bean digspots clearly marked with an X will be added into the item pool. + all: All chuckle bean digspots will be added into the item pool. + """ + display_name = "Chuckle Beans" + option_none = 0 + option_only_visible = 1 + option_all = 2 + default = 2 + + +mlss_options: typing.Dict[str, type(Option)] = { + "start_inventory_from_pool": StartInventoryPool, + "coins": Coins, + "difficult_logic": DifficultLogic, + "skip_intro": IntroSkip, + "castle_skip": BowsersCastleSkip, + "extra_pipes": ExtraPipes, + "skip_minecart": SkipMinecart, + "disable_surf": DisableSurf, + "harhalls_pants": HarhallsPants, + "hidden_visible": HiddenVisible, + "blocks_invisible": BlocksInvisible, + "chuckle_beans": ChuckleBeans, + "music_options": MusicOptions, + "randomize_sounds": RandomSounds, + "randomize_enemies": RandomizeEnemies, + "randomize_bosses": RandomizeBosses, + "randomize_backgrounds": RandomizeBackgrounds, + "scale_stats": ScaleStats, + "scale_pow": ScalePow, + "tattle_hp": TattleHp, + "mario_color": MarioColor, + "luigi_color": LuigiColor, + "mario_pants": MarioPants, + "luigi_pants": LuigiPants +} diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py new file mode 100644 index 000000000000..79c22b3c38e7 --- /dev/null +++ b/worlds/mlss/Regions.py @@ -0,0 +1,186 @@ +import typing + +from BaseClasses import MultiWorld, Region, Entrance, LocationProgressType +from worlds.generic.Rules import add_rule, set_rule +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, coins +from . import StateLogic +from .Names.LocationName import LocationName + + +def create_regions(world: MultiWorld, player: int, excluded: typing.List[str]): + menu_region = Region("Menu", player, world) + world.regions.append(menu_region) + + main_region = create_region(world, player, "Main Area", mainArea, excluded) + world.regions.append(main_region) + + chucklehuck_region = create_region(world, player, "Chucklehuck Woods", chucklehuck, excluded) + world.regions.append(chucklehuck_region) + + castleTown_region = create_region(world, player, "Beanbean Castle Town", castleTown, excluded) + world.regions.append(castleTown_region) + + startingFlag_region = create_region(world, player, "Shop Starting Flag", startingFlag, excluded) + world.regions.append(startingFlag_region) + + chuckolatorFlag_region = create_region(world, player, "Shop Chuckolator Flag", chuckolatorFlag, excluded) + world.regions.append(chuckolatorFlag_region) + + piranhaFlag_region = create_region(world, player, "Shop Piranha Flag", piranhaFlag, excluded) + world.regions.append(piranhaFlag_region) + + kidnappedFlag_region = create_region(world, player, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) + world.regions.append(kidnappedFlag_region) + + beanstarFlag_region = create_region(world, player, "Shop Beanstar Complete Flag", beanstarFlag, excluded) + world.regions.append(beanstarFlag_region) + + birdoFlag_region = create_region(world, player, "Shop Birdo Flag", birdoFlag, excluded) + world.regions.append(birdoFlag_region) + + surfable_region = create_region(world, player, "Surfable", surfable, excluded) + world.regions.append(surfable_region) + + hooniversity_region = create_region(world, player, "Hooniversity", hooniversity, excluded) + world.regions.append(hooniversity_region) + + gwarharEntrance_region = create_region(world, player, "GwarharEntrance", gwarharEntrance, excluded) + world.regions.append(gwarharEntrance_region) + + gwarharMain_region = create_region(world, player, "GwarharMain", gwarharMain, excluded) + world.regions.append(gwarharMain_region) + + teehee_valley_region = create_region(world, player, "TeeheeValley", teeheeValley, excluded) + world.regions.append(teehee_valley_region) + + winkle_region = create_region(world, player, "Winkle", winkle, excluded) + world.regions.append(winkle_region) + + sewers_region = create_region(world, player, "Sewers", sewers, excluded) + world.regions.append(sewers_region) + + airport_region = create_region(world, player, "Airport", airport, excluded) + world.regions.append(airport_region) + + jokesEntrance_region = create_region(world, player, "JokesEntrance", jokesEntrance, excluded) + world.regions.append(jokesEntrance_region) + + jokesMain_region = create_region(world, player, "JokesMain", jokesMain, excluded) + world.regions.append(jokesMain_region) + + postJokes_region = create_region(world, player, "PostJokes", postJokes, excluded) + world.regions.append(postJokes_region) + + theater_region = create_region(world, player, "Theater", theater, excluded) + world.regions.append(theater_region) + + fungitown_region = create_region(world, player, "Fungitown", fungitown, excluded) + world.regions.append(fungitown_region) + + fungitownBeanstar_region = create_region(world, player, "FungitownBeanstar", fungitownBeanstar, excluded) + world.regions.append(fungitownBeanstar_region) + + fungitownBirdo_region = create_region(world, player, "FungitownBirdo", fungitownBirdo, excluded) + world.regions.append(fungitownBirdo_region) + + booStatue_region = create_region(world, player, "BooStatue", booStatue, excluded) + world.regions.append(booStatue_region) + + oasis_region = create_region(world, player, "Oasis", oasis, excluded) + world.regions.append(oasis_region) + + event_region = create_region(world, player, "Event", event, excluded) + world.regions.append(event_region) + + if world.coins[player]: + print("CREATING REGION") + 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) + bowsersMini_region = create_region(world, player, "Bowser's Castle Mini", bowsersMini, excluded) + world.regions.append(bowsersMini_region) + + baseUltraRocks_region = create_region(world, player, "BaseUltraRocks", baseUltraRocks, excluded) + world.regions.append(baseUltraRocks_region) + + +def connect_regions(world: MultiWorld, player: int): + names: typing.Dict[str, 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)) + connect(world, player, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, player) and StateLogic.canMini(state, player)) + connect(world, player, names, "Hooniversity", "Oasis") + connect(world, player, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, player) or StateLogic.canDash(state, player)) + connect(world, player, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, player) and StateLogic.fire(state, player)) + connect(world, player, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, player) and StateLogic.fire(state, player)) + connect(world, player, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, player) and StateLogic.castleTown(state, player) and StateLogic.rose(state, player)) + connect(world, player, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, player) or state.can_reach("FungitownBirdo", "Region", player)) + connect(world, player, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, player)) + connect(world, player, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + connect(world, player, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, player) and StateLogic.fruits(state, player)) or state.can_reach("Shop Piranha Flag", "Region", player)) + connect(world, player, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", player)) + connect(world, player, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: (StateLogic.thunder(state, player) and StateLogic.fungitown(state, player)) or state.can_reach("Shop Beanstar Complete Flag", "Region", player)) + connect(world, player, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, player) and StateLogic.pieces(state, player) and StateLogic.rose(state, player)) or state.can_reach("Shop Birdo Flag", "Region", player)) + connect(world, player, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, player)) + connect(world, player, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, player)) + connect(world, player, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, player)) + connect(world, player, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, player)) + connect(world, player, names, "Main Area", "Surfable", lambda state: StateLogic.surfable(state, player)) + 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, "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) 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)) + 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): + ret = Region(name, player, world) + for location in locations: + loc = MLSSLocation(player, location.name, location.id, ret) + if location.name in excluded: + continue + ret.locations.append(loc) + return ret + + +def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, + rule: typing.Optional[typing.Callable] = None): + source_region = world.get_region(source, player) + target_region = world.get_region(target, player) + + if target not in used_names: + used_names[target] = 1 + name = target + else: + used_names[target] += 1 + name = target + (' ' * used_names[target]) + + connection = Entrance(player, name, source_region) + + if rule: + connection.access_rule = rule + + source_region.exits.append(connection) + connection.connect(target_region) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py new file mode 100644 index 000000000000..b0cf950b3746 --- /dev/null +++ b/worlds/mlss/Rom.py @@ -0,0 +1,629 @@ +import io +import os +import bsdiff4 +import pkgutil +import Utils +import settings + + +from worlds.Files import APDeltaPatch +from BaseClasses import MultiWorld, Item, Location +from .Items import item_table +from .Enemies import enemies, bosses, EnemyRandomize, Enemy, EnemyGroup +from .Locations import shop, badge, pants + + +class Color: + def __init__(self, location, byte1, byte2, bro): + self.location = location + self.byte1 = byte1 + self.byte2 = byte2 + self.bro = bro + + +colors = [ + "Red", + "Green", + "Blue", + "Cyan", + "Yellow", + "Orange", + "Purple", + "Pink", + "Black", + "White", + "Silhouette", + "Chaos", + "TrueChaos" +] + +cpants = [ + "Vanilla", + "Red", + "Green", + "Blue", + "Cyan", + "Yellow", + "Orange", + "Purple", + "Pink", + "Black", + "White", + "Chaos" +] + + +def get_base_rom_as_bytes() -> bytes: + with open(get_base_rom_path("Mario & Luigi - Superstar Saga (U).gba"), "rb") as infile: + base_rom_bytes = bytes(infile.read()) + + return base_rom_bytes + + +def get_base_rom_path(file_name: str = "") -> str: + options: settings.Settings = settings.get_settings() + if not file_name: + file_name = options["mlss_options"]["rom_file"] + if not os.path.exists(file_name): + file_name = Utils.user_path(file_name) + return file_name + + +class MLSSDeltaPatch(APDeltaPatch): + game = "Mario & Luigi: Superstar Saga" + hash = "4b1a5897d89d9e74ec7f630eefdfd435" + patch_file_ending = ".apmlss" + result_file_ending = ".gba" + + @classmethod + def get_source_data(cls) -> bytes: + return get_base_rom_as_bytes() + + +class Rom: + hash = "4b1a5897d89d9e74ec7f630eefdfd435" + + def __init__(self, world: MultiWorld, player: int): + with open("Mario & Luigi - Superstar Saga (U).gba", 'rb') as file: + content = file.read() + patched = self.apply_delta(content) + self.random = world.per_slot_randoms[player] + self.stream = io.BytesIO(patched) + self.world = world + self.player = player + + def swap_colors(self, color, bro): + temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") + temp_io = io.BytesIO(temp) + color_arr = [] + + for lines in temp_io.readlines(): + + arr = lines.decode('utf-8').strip().split(',') + if color != "Chaos" and color != "TrueChaos": + color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) + else: + color_arr.append( + Color(int(arr[0], 16), self.random.randint(0, 255), self.random.randint(0, 127), int(arr[1], 16))) + + colors_ = [c for c in color_arr if c.bro == bro] + + for c in colors_: + self.stream.seek(c.location, io.SEEK_SET) + self.stream.write(bytes([c.byte1, c.byte2])) + + def swap_pants(self, color, bro): + mario_color = self.world.mario_color[self.player] + luigi_color = self.world.luigi_color[self.player] + if bro == 0 and (colors[mario_color] == "TrueChaos" or colors[mario_color] == "Silhouette"): + return + if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): + return + if color == "Vanilla": + return + temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") + temp_io = io.BytesIO(temp) + color_arr = [] + + for lines in temp_io.readlines(): + arr = lines.decode('utf-8').strip().split(',') + if color != "Chaos" and color != "TrueChaos": + color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) + else: + color_arr.append( + Color(int(arr[0], 16), self.random.randint(0, 255), self.random.randint(0, 127), int(arr[1], 16))) + + colors_ = [c for c in color_arr if c.bro == bro] + + for c in colors_: + self.stream.seek(c.location, io.SEEK_SET) + self.stream.write(bytes([c.byte1, c.byte2])) + + def item_inject(self, location: int, item_type: int, item: Item): + if item.player == self.player: + code = item_table[item.name].itemID + else: + code = 0x3F + if item_type == 0: + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + 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) + 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 + if 0x20 <= code <= 0x26: + code -= 0x4 + insert = int(code) + insert2 = insert % 0x10 + insert2 *= 0x10 + insert //= 0x10 + insert += 0x20 + self.stream.seek(location, 0) + self.stream.write(bytes([insert, insert2])) + elif item_type == 2: + if code == 0x1D or code == 0x1E: + code += 0xE + if 0x20 <= code <= 0x26: + code -= 0x4 + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + elif item_type == 3: + if code == 0x1D or code == 0x1E: + code += 0xE + if code < 0x1D: + code -= 0xA + if 0x20 <= code <= 0x26: + code -= 0xE + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + else: + self.stream.seek(location, 0) + self.stream.write(bytes([0x18])) + + def patch_options(self): + name = self.world.player_name[self.player].encode("UTF-8") + self.stream.seek(0xB0, 0) + self.stream.write(name) + self.stream.seek(0xAF, 0) + self.stream.write(self.player.to_bytes(1, 'little')) + + if self.world.skip_intro[self.player]: + # Enable Skip Intro in ROM + self.stream.seek(0x244D08, 0) + self.stream.write(bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) + + if self.world.extra_pipes[self.player]: + # Spawn in extra pipes in ROM + self.stream.seek(0xD00001, 0) + self.stream.write(bytes([0x1])) + + if self.world.castle_skip[self.player]: + # Enable Bowser's castle skip in ROM + self.stream.seek(0x3AEAB0, 0) + self.stream.write(bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) + self.stream.seek(0x3AEC18, 0) + self.stream.write(bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) + + if self.world.skip_minecart[self.player]: + # Enable minecart skip in ROM + self.stream.seek(0x3AC728, 0) + self.stream.write(bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) + self.stream.seek(0x3AC56C, 0) + self.stream.write(bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) + + if self.world.randomize_sounds[self.player]: + self.randomize_sounds() + + if self.world.music_options[self.player] == 1: + self.randomize_music() + + if self.world.music_options[self.player] == 2: + self.disable_music() + + if self.world.randomize_backgrounds[self.player]: + self.randomize_backgrounds() + + if self.world.randomize_enemies[self.player] or self.world.randomize_bosses[self.player]: + self.enemy_randomize() + + if self.world.scale_stats[self.player]: + self.stream.seek(0x1E9418, 0) + self.stream.write(bytes([0x1])) + + if self.world.scale_pow[self.player]: + self.stream.seek(0x1E9419, 0) + self.stream.write(bytes([0x1])) + + if self.world.tattle_hp[self.player]: + self.stream.seek(0xD00000, 0) + self.stream.write(bytes([0x1])) + + 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, 0xC0, 0x2, 0xF])) + self.stream.seek(0x25FDB8, 0) + self.stream.write(bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) + self.stream.seek(0x25FDED, 0) + self.stream.write(bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) + self.stream.seek(0x25FE22, 0) + self.stream.write(bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) + self.stream.seek(0x25FE57, 0) + 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) + self.swap_pants(cpants[self.world.mario_pants[self.player]], 0) + self.swap_pants(cpants[self.world.luigi_pants[self.player]], 1) + + def enemy_randomize(self): + enemy_data = EnemyRandomize() + if self.world.randomize_enemies[self.player]: + enemy_data = self.populate_enemy_array(enemy_data) + enemy_data = self.generate_groups(enemy_data) + + if self.world.randomize_bosses[self.player]: + enemy_data = self.generate_boss_groups(enemy_data) + + self.insert_groups(enemy_data) + + def randomize_backgrounds(self): + all_enemies = enemies + bosses + for address in all_enemies: + self.stream.seek(address + 3, io.SEEK_SET) + self.stream.write(bytes([self.random.randint(0x0, 0x26)])) + + def randomize_sounds(self): + pointers = [] + sounds = [] + self.stream.seek(0x21CC44) + for i in range(353): + p_arr = bytearray(self.stream.read(4)) + pointers.append(p_arr[0] | p_arr[1] << 8 | p_arr[2] << 16) + pointers.sort(reverse=True) + + for i in range(len(pointers) - 1, -1, -1): + if i == 0: + continue + j = 1 + while True: + self.stream.seek(pointers[i - 1] - j) + read_byte = self.stream.read(1) + if read_byte != b'\xFF': + j += 1 + continue + else: + break + self.stream.seek(pointers[i - 1] - (j + 1)) + if self.stream.read(1) >= b'\xFE' and i != 0: + pointers.pop(i) + else: + temp = bytearray([ + pointers[i] & 0xFF, + (pointers[i] >> 8) & 0xFF, + (pointers[i] >> 16) & 0xFF, + 0x8 + ]) + sounds.append(temp) + + self.random.shuffle(sounds) + self.stream.seek(0x21CC44) + for i in range(len(pointers)): + current_pos = self.stream.tell() + p_arr = bytearray(self.stream.read(4)) + if (p_arr[0] | p_arr[1] << 8 | p_arr[2] << 16) not in pointers: + continue + self.stream.seek(current_pos) + self.stream.write(self.random.choice(sounds)) + + def disable_music(self): + self.stream.seek(0x19B118) + self.stream.write(bytes([0x0, 0x25])) + + def randomize_music(self): + songs = [] + self.stream.seek(0x21CB74) + while True: + if self.stream.tell() == 0x21CBD8: + self.stream.seek(4, io.SEEK_CUR) + continue + if self.stream.tell() == 0x21CC3C: + break + temp = self.stream.read(4) + songs.append(temp) + + self.random.shuffle(songs) + self.stream.seek(0x21CB74) + for i in range(len(songs) - 1, -1, -1): + if self.stream.tell() == 0x21CBD8: + self.stream.seek(4, io.SEEK_CUR) + continue + self.stream.write(songs[i]) + + def populate_enemy_array(self, enemy_data_) -> EnemyRandomize: + enemy_data = enemy_data_ + + for e in enemies: + i = 0 + count = 0 + while True: + if 0x50402C < e < 0x50434C and self.world.castle_skip[self.player]: + break + stream_seek_position = e + 10 + (i * 4) + self.stream.seek(stream_seek_position, os.SEEK_SET) + type_val = self.stream.read(1)[0] + if type_val == 0x0: + type_val = 0x4 + if type_val == 0x7: + break + self.stream.seek(-3, os.SEEK_CUR) + id_val = self.stream.read(1)[0] + if id_val in [int(hex_value) for hex_value in [0x18, 0x53, 0x4B]] or ( + 0x2D <= id_val <= 0x30) or id_val == 0x3C: + type_val = 0x4 + if id_val == 0xF and type_val == 0x3: + i += 1 + if i == 6: + break + continue + if id_val in [int(hex_value) for hex_value in [0x16, 0x1E, 0x20, 0x34, 0x35, 0x36, 0x37, 0x38, 0x46]]: + enemy_data.spikedEnemies.append(Enemy(id_val, type_val)) + else: + enemy_data.enemies.append(Enemy(id_val, type_val)) + count += 1 + + i += 1 + if i == 6: + break + + if count > 4: + count = 4 + if count != 0: + enemy_data.groupSizes.append(count) + + return enemy_data + + def generate_groups(self, enemy_data_) -> EnemyRandomize: + enemy_data = enemy_data_ + no_spike = False + enemies_copy = enemy_data.enemies + spiked_copy = enemy_data.spikedEnemies + self.random.shuffle(enemies_copy) + self.random.shuffle(spiked_copy) + total = 0 + for sizes in enemy_data.groupSizes: + total += min(sizes, 4) + + for size in enemy_data.groupSizes: + temp_size = min(size, 4) + if temp_size == 0: + continue + + id_list = [] + type_list = [] + pestnuts = [] + temp_enemies = [] + script = bytes([0xEE, 0x2C, 0x28, 0x08]) + nut = 0 + special = 0 + + for _ in range(temp_size): + enemy = enemies_copy.pop(0) + if enemy.id in [0x20, 0x34]: + nut += 1 + pestnuts.append(enemy) + else: + temp_enemies.append(enemy) + if enemy.id in [0x52, 0x2C, 0x4A]: + special = 1 + if enemy.id == 0x52: + script = bytes([0x67, 0xAB, 0x28, 0x08]) + + if len(pestnuts) == 3 and size == 4: + for enemy in pestnuts: + id_list.append(enemy.id) + type_list.append(enemy.type) + for _ in range(3): + id_list.append(0xF) + type_list.append(0x3) + else: + if size == 1 and pestnuts: + id_list.append(pestnuts[0].id) + type_list.append(pestnuts[0].type) + + for enemy in pestnuts: + id_list.append(enemy.id) + type_list.append(enemy.type) + for enemy in temp_enemies: + id_list.append(enemy.id) + type_list.append(enemy.type) + + if size == 4: + for _ in range(nut): + id_list.append(0xF) + type_list.append(0x3) + else: + if pestnuts: + for _ in range(4 - len(pestnuts + temp_enemies)): + id_list.append(0x0) + type_list.append(0x7) + for _ in range(nut): + id_list.append(0xF) + type_list.append(0x3) + + if len(enemy_data.stardustGroups) < 3: + enemy_data.stardustGroups.append(EnemyGroup(bytes(id_list), bytes(type_list), temp_size, script, special)) + else: + enemy_data.groups.append(EnemyGroup(bytes(id_list), bytes(type_list), temp_size, script, special)) + + if len(enemy_data.stardustGroups) == 3 and not no_spike: + enemies_copy.extend(spiked_copy) + self.random.shuffle(enemies_copy) + no_spike = True + + return enemy_data + + def generate_boss_groups(self, enemy_data_) -> EnemyRandomize: + enemy_data = enemy_data_ + for boss_val in bosses: + + if 0x50402C < boss_val < 0x50434C and self.world.castle_skip[self.player]: + continue + stream_seek_position = boss_val + 2 + self.stream.seek(stream_seek_position, os.SEEK_SET) + boss = self.stream.read(1)[0] + stream_seek_position = boss_val + 4 + self.stream.seek(stream_seek_position, os.SEEK_SET) + data = self.stream.read(4) + id = [] + types = [] + iterate = True + i = 0 + while iterate: + stream_seek_position = boss_val + 10 + (i * 4) + self.stream.seek(stream_seek_position, os.SEEK_SET) + type_val = self.stream.read(1)[0] + types.append(type_val) + self.stream.seek(-3, os.SEEK_CUR) + id_val = self.stream.read(1)[0] + id.append(id_val) + i += 1 + if i == 6: + break + stream_seek_position = boss_val + 1 + self.stream.seek(stream_seek_position, os.SEEK_SET) + enemy_data.bossGroups.append(EnemyGroup(bytes(id), bytes(types), self.stream.read(1)[0], data, boss)) + + return enemy_data + + def insert_groups(self, enemy_data): + do_boss = self.world.randomize_bosses[self.player] + + if do_boss != 1: + enemy_data.groups.extend(enemy_data.bossGroups) + self.random.shuffle(enemy_data.groups) + enemy_data.groups = enemy_data.stardustGroups + enemy_data.groups + locations = enemies + boss_locations = bosses + + if do_boss == 2: + locations += boss_locations + locations.sort() + count = 0 + + for location in locations: + if len(enemy_data.groups) > 0: + if self.world.castle_skip[self.player] and 0x50402C < location < 0x50434C: + continue + count += 1 + temp_group = enemy_data.groups[0] + enemy_data.groups = enemy_data.groups[1:] + self.stream.seek(location + 1, 0) + b = temp_group.position.to_bytes(1, byteorder='big') + self.stream.write(b) + for i in range(6): + if i < len(temp_group.id): + self.stream.seek(location + 8 + (i * 4)) + self.stream.write(bytes([temp_group.id[i]])) + self.stream.seek(1, os.SEEK_CUR) + self.stream.write(bytes([temp_group.type[i]])) + else: + self.stream.seek(location + 8 + (i * 4)) + self.stream.write(bytes([0])) + self.stream.seek(1, os.SEEK_CUR) + self.stream.write(bytes([7])) + self.stream.seek(location + 2) + self.stream.write(bytes([temp_group.boss])) + if len(temp_group.data) > 0: + self.stream.seek(location + 4) + self.stream.write(temp_group.data) + + if do_boss == 1: + for location in bosses: + if self.world.castle_skip[self.player] and 0x50402C < location < 0x50434C: + continue + self.random.shuffle(enemy_data.bossGroups) + count += 1 + temp_group = enemy_data.bossGroups[0] + enemy_data.bossGroups = enemy_data.bossGroups[1:] + self.stream.seek(location + 1, 0) + b = temp_group.position.to_bytes(1, byteorder='big') + self.stream.write(b) + for i in range(6): + if i < len(temp_group.id): + self.stream.seek(location + 8 + (i * 4)) + self.stream.write(bytes([temp_group.id[i]])) + self.stream.seek(1, os.SEEK_CUR) + self.stream.write(bytes([temp_group.type[i]])) + else: + self.stream.seek(location + 8 + (i * 4)) + self.stream.write(bytes([0])) + self.stream.seek(1, os.SEEK_CUR) + self.stream.write(bytes([7])) + self.stream.seek(location + 2) + self.stream.write(bytes([temp_group.boss])) + if len(temp_group.data) > 0: + self.stream.seek(location + 4) + self.stream.write(temp_group.data) + + def desc_inject(self, location: Location, item: Item): + index = -1 + for key, value in shop.items(): + if location.address in value: + match key: + case 0x3C05f0: + index = value.index(location.address) + case _: + index = value.index(location.address) + 14 + + for key, value in badge.items(): + if index != -1: + break + if location.address in value: + match key: + case 0x3C0618: + index = value.index(location.address) + 24 + case _: + index = value.index(location.address) + 41 + + for key, value in pants.items(): + if index != -1: + break + if location.address in value: + match key: + case 0x3C0618: + index = value.index(location.address) + 48 + case _: + index = value.index(location.address) + 66 + + dstring = f"{self.world.player_name[item.player]}: {item.name}" + self.stream.seek(0xD11000 + (index * 0x40), 0) + self.stream.write(dstring.encode("UTF8")) + + + def close(self, path): + output_path = os.path.join(path, f"AP_{self.world.seed_name}_P{self.player}_{self.world.player_name[self.player]}.gba") + with open(output_path, 'wb') as outfile: + outfile.write(self.stream.getvalue()) + patch = MLSSDeltaPatch(os.path.splitext(output_path)[0] + ".apmlss", player=self.player, + player_name=self.world.player_name[self.player], patched_path=output_path) + patch.write() + os.unlink(output_path) + self.stream.close() + + def apply_delta(self, b: bytes) -> bytes: + """ + Gets the patched ROM data generated from applying the ap-patch diff file to the provided ROM. + Which should contain all changed text banks and assembly code + """ + import pkgutil + patch_bytes = pkgutil.get_data(__name__, "data/basepatch.bsdiff") + patched_rom = bsdiff4.patch(b, patch_bytes) + return patched_rom diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py new file mode 100644 index 000000000000..f261d1488e0b --- /dev/null +++ b/worlds/mlss/Rules.py @@ -0,0 +1,278 @@ +from worlds.generic.Rules import add_rule, forbid_item +from BaseClasses import MultiWorld +from .Names.LocationName import LocationName +from .Locations import all_locations, hidden +from . import StateLogic + + +def set_rules(world: MultiWorld, player: int, excluded): + for location in all_locations: + if "Digspot" in location.name: + if (world.skip_minecart[player] and "Minecart" in location.name) or (world.castle_skip[player] and "Bowser" in location.name): + continue + if world.chuckle_beans[player] == 0 or world.chuckle_beans[player] == 1 and location.id in hidden: + continue + 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 "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: + if "Bowser" in location.name and world.castle_skip[player]: + continue + 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), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.JokesEndJojoraRoomDigspot, player), + lambda state: StateLogic.canDash(state, player)) + + if world.chuckle_beans[player] == 1 or world.chuckle_beans[player] == 2: + add_rule(world.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, player), + lambda state: StateLogic.canDash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsEDigspot2, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, player), + lambda state: StateLogic.ultra(state, player) and StateLogic.thunder(state, player)) + + forbid_item(world.get_location(LocationName.SSChuckolaMembershipCard, player), "Nuts", player) # Bandaid Fix + + add_rule(world.get_location(LocationName.HoohooVillageHammerHouseBlock, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, player), + lambda state: StateLogic.canMini(state, player) and StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, player), + lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsNWBlock, player), + lambda state: StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, player), + lambda state: StateLogic.super(state, player) and StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, player), + lambda state: StateLogic.super(state, player) and StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, player), + lambda state: StateLogic.teehee(state, player) and StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, player), + lambda state: StateLogic.ultra(state, player) and StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, player), + lambda state: StateLogic.thunder(state, player) and StateLogic.super(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, player), + lambda state: StateLogic.thunder(state, player) and StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.HoohooVillageMoleBehindTurtle, player), + lambda state: StateLogic.canDash(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.HoohooVillageMoleBehindTurtle, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, player), + lambda state: StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, player), + lambda state: StateLogic.thunder(state, player) and StateLogic.pieces(state, player) and StateLogic.castleTown(state, player) and StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, player), + lambda state: StateLogic.canDig(state, player) and StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, player), + lambda state: StateLogic.fruits(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom7Block1, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom7Block2, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block1, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block2, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block3, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastleFakeBeastar, player), + lambda state: StateLogic.pieces(state, player) and StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.BeanbeanCastlePeachsExtraDress, player), + lambda state: StateLogic.pieces(state, player) and StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.SewersRoom5Block1, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.SewersRoom5Block2, player), + lambda state: StateLogic.hammers(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, player), + lambda state: StateLogic.canDash(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, player), + lambda state: StateLogic.canDash(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, player), + lambda state: StateLogic.canDash(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonRedPearlBean, player), + lambda state: StateLogic.fire(state, player) and StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonGreenPearlBean, player), + lambda state: StateLogic.fire(state, player) and StateLogic.thunder(state, player)) + add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, player), + lambda state: StateLogic.ultra(state, player)) + add_rule(world.get_location(LocationName.OhoOasisFirebrand, player), + lambda state: StateLogic.canMini(state, player)) + add_rule(world.get_location(LocationName.OhoOasisThunderhand, player), + lambda state: StateLogic.canDig(state, player)) + add_rule(world.get_location(LocationName.BeanstarPieceYoshiTheater, player), + lambda state: StateLogic.neon(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterAzureYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterBlueYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterGreenYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterOrangeYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterPurpleYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterRedYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.YoshiTheaterYellowYoshi, player), + lambda state: StateLogic.beanFruit(state, player)) + add_rule(world.get_location(LocationName.WinkleAreaBeanstarRoomBlock, player), + lambda state: StateLogic.winkle(state, player)) + add_rule(world.get_location(LocationName.BeanstarPieceWinkleArea, player), + lambda state: StateLogic.winkle(state, player)) + add_rule(world.get_location(LocationName.GwarharLagoonSpangleReward, player), + lambda state: StateLogic.spangle(state, player)) + add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag1, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag2, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag3, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag1, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag2, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag3, player), + lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) + add_rule(world.get_location(LocationName.ChateauGreenGoblet, player), + 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(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, 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.super(state, player) or StateLogic.canDash(state, player)) + add_rule(world.get_location("S.S Chuckola Storage Room Coin Block 2", player), + lambda state: StateLogic.super(state, player) or StateLogic.canDash(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/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py new file mode 100644 index 000000000000..1e22a4f5ed69 --- /dev/null +++ b/worlds/mlss/StateLogic.py @@ -0,0 +1,100 @@ +def canDig(state, player): + return state.has("Green Goblet", player) and state.has("Hammers", player) + + +def canMini(state, player): + return state.has("Red Goblet", player) and state.has("Hammers", player) + + +def canDash(state, player): + return state.has("Red Pearl Bean", player) and state.has("Firebrand", player) + + +def canCrash(state, player): + return state.has("Green Pearl Bean", player) and state.has("Thunder Hand", player) + + +def hammers(state, player): + return state.has("Hammers", player) + + +def super(state, player): + return state.has("Hammers", player, 2) + + +def ultra(state, player): + return state.has("Hammers", player, 3) + + +def fruits(state, player): + return state.has("Red Chuckola Fruit", player) and state.has("Purple Chuckola Fruit", player) and state.has( + "White Chuckola Fruit", player) + + +def pieces(state, player): + return state.has("Beanstar Piece 1", player) and state.has("Beanstar Piece 2", player) and state.has( + "Beanstar Piece 3", player) and state.has("Beanstar Piece 4", player) + + +def neon(state, player): + return state.has("Blue Neon Egg", player) and state.has("Red Neon Egg", player) and state.has("Green Neon Egg", + player) and state.has( + "Yellow Neon Egg", player) and state.has("Purple Neon Egg", player) and state.has("Orange Neon Egg", + player) and state.has( + "Azure Neon Egg", player) + + +def spangle(state, player): + return state.has("Spangle", player) + + +def rose(state, player): + return state.has("Peasley's Rose", player) + + +def brooch(state, player): + return state.has("Beanbean Brooch", player) + + +def thunder(state, player): + return state.has("Thunder Hand", player) + + +def fire(state, player): + return state.has("Firebrand", player) + + +def dressBeanstar(state, player): + return state.has("Peach's Extra Dress", player) and state.has("Fake Beanstar", player) + + +def membership(state, player): + return state.has("Membership Card", player) + + +def winkle(state, player): + return state.has("Winkle Card", player) + + +def beanFruit(state, player): + return state.has("Beanfruit 1", player) and state.has("Beanfruit 2", player) and state.has("Beanfruit 3", player) and state.has("Beanfruit 4", player) and state.has("Beanfruit 5", player) and state.has("Beanfruit 6", player) and state.has("Beanfruit 7", player) + + +def surfable(state, player): + return ultra(state, player) and ((canDig(state, player) and canMini(state, player)) or (membership(state, player) and fire(state, player))) + + +def postJokes(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) and canDash(state, player) + + +def teehee(state, player): + return super(state, player) or canDash(state, player) + + +def castleTown(state, player): + return fruits(state, player) and brooch(state, player) + + +def fungitown(state, player): + return castleTown(state, player) and thunder(state, player) and rose(state, player) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py new file mode 100644 index 000000000000..23262a79b417 --- /dev/null +++ b/worlds/mlss/__init__.py @@ -0,0 +1,199 @@ +import typing +import settings +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, coins +from .Options import mlss_options +from .Regions import create_regions, connect_regions +from .Rules import set_rules +from .Items import MLSSItem, itemList, item_frequencies, item_table +from .Rom import Rom +from .Names.LocationName import LocationName +from .Client import MLSSClient + + +class MLSSWebWorld(WebWorld): + theme = 'partyTime' + bug_report_page = "https://github.com/jamesbrq/ArchipelagoMLSS/issues" + tutorials = [ + Tutorial( + tutorial_name='Setup Guide', + description='A guide to setting up Mario & Luigi: Superstar Saga for Archipelago.', + language='English', + file_name='setup_en.md', + link='setup/en', + authors=['jamesbrq'] + ) + ] + + +class MLSSSettings(settings.Group): + class RomFile(settings.UserFilePath): + """File name of the MLSS US rom""" + copy_to = "Mario & Luigi - Superstar Saga (U).gba" + description = "MLSS ROM File" + md5s = [Rom.hash] + + rom_file: RomFile = RomFile(RomFile.copy_to) + rom_start: bool = True + + +class MLSSWorld(World): + """ + Adventure with Mario and Luigi together in the Beanbean Kingdom + to stop the evil cackletta and retrieve the Beanstar. + """ + game = "Mario & Luigi Superstar Saga" + web = MLSSWebWorld() + data_version = 1 + option_definitions = mlss_options + settings = typing.ClassVar[MLSSSettings] + item_name_to_id = {name: data.code for name, data in item_table.items()} + location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} + required_client_version = (0, 4, 3) + + excluded_locations = [] + + 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]: + self.excluded_locations += [LocationName.HoohooMountainBaseMinecartCaveDigspot] + if self.multiworld.disable_surf[self.player]: + self.excluded_locations += [LocationName.SurfMinigame] + if self.multiworld.harhalls_pants[self.player]: + self.excluded_locations += [LocationName.HarhallsPants] + if not self.multiworld.coins[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) + connect_regions(self.multiworld, self.player) + + def fill_slot_data(self) -> dict: + return { + "CastleSkip": self.multiworld.castle_skip[self.player].value, + "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, + "DifficultLogic": self.multiworld.difficult_logic[self.player].value, + "Coins": self.multiworld.coins[self.player].value + } + + def generate_basic(self) -> None: + item = self.create_item("Mushroom") + self.multiworld.get_location(LocationName.ShopStartingFlag1, self.player).place_locked_item(item) + item = self.create_item("Syrup") + self.multiworld.get_location(LocationName.ShopStartingFlag2, self.player).place_locked_item(item) + item = self.create_item("1-UP Mushroom") + self.multiworld.get_location(LocationName.ShopStartingFlag3, self.player).place_locked_item(item) + item = self.create_item("Dragohoho Defeated") + self.multiworld.get_location("Dragohoho", self.player).place_locked_item(item) + item = self.create_item("Queen Bean Defeated") + self.multiworld.get_location("Queen Bean", self.player).place_locked_item(item) + item = self.create_item("Chuckolator Defeated") + self.multiworld.get_location("Chuckolator", self.player).place_locked_item(item) + item = self.create_item("Oasis Access") + self.multiworld.get_location("Oasis", self.player).place_locked_item(item) + item = self.create_item("Mom Piranha Defeated") + self.multiworld.get_location("Mom Piranha", self.player).place_locked_item(item) + item = self.create_item("Entered Fungitown") + self.multiworld.get_location("Fungitown", self.player).place_locked_item(item) + item = self.create_item("Beanstar Complete") + self.multiworld.get_location("Beanstar", self.player).place_locked_item(item) + item = self.create_item("Jojora Defeated") + self.multiworld.get_location("Jojora", self.player).place_locked_item(item) + item = self.create_item("Birdo Defeated") + self.multiworld.get_location("Birdo", self.player).place_locked_item(item) + + def create_items(self) -> None: + # First add in all progression and useful items + required_items = [] + precollected = [item for item in itemList if item in self.multiworld.precollected_items[self.player]] + for item in itemList: + if item.progression != ItemClassification.filler and item.progression != ItemClassification.skip_balancing and item not in precollected: + freq = item_frequencies.get(item.itemName, 1) + if freq is None: + freq = 1 + if self.multiworld.harhalls_pants[self.player] and "Harhall's" in item.itemName: + continue + required_items += [item.itemName for _ in range(freq)] + + for itemName in required_items: + self.multiworld.itempool.append(self.create_item(itemName)) + + # Then, get a random amount of fillers until we have as many items as we have locations + 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": + continue + if self.multiworld.chuckle_beans[self.player] == 1: + if item.itemName == "Chuckle Bean": + freq -= 59 + if freq is None: + freq = 1 + filler_items += [item.itemName for _ in range(freq)] + + remaining = len(all_locations) - len(required_items) - len(event) - 3 + if self.multiworld.castle_skip[self.player]: + remaining -= (len(bowsers) + len(bowsersMini)) + if self.multiworld.skip_minecart[self.player]: + remaining -= 1 + if self.multiworld.disable_surf[self.player]: + remaining -= 1 + if self.multiworld.harhalls_pants[self.player]: + remaining -= 1 + if self.multiworld.chuckle_beans[self.player] == 0: + remaining -= 186 + if self.multiworld.chuckle_beans[self.player] == 1: + remaining -= 59 + 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) + self.multiworld.itempool.append(item) + filler_items.remove(filler_item_name) + + def set_rules(self) -> None: + set_rules(self.multiworld, self.player, self.excluded_locations) + self.multiworld.completion_condition[self.player] = \ + lambda state: state.can_reach("PostJokes", "Region", self.player) + + def create_item(self, name: str) -> MLSSItem: + item = item_table[name] + return MLSSItem(item.itemName, item.progression, item.code, self.player) + + def generate_output(self, output_directory: str) -> None: + rom = Rom(self.multiworld, self.player) + + for location_name in location_table.keys(): + if (self.multiworld.skip_minecart[self.player] and "Minecart" in location_name and "After" not in location_name) or (self.multiworld.castle_skip[self.player] and "Bowser" in location_name) or (self.multiworld.disable_surf[self.player] and "Surf Minigame" in location_name) or (self.multiworld.harhalls_pants[self.player] and "Harhall's" in location_name): + 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 + item = location.item + address = [address for address in all_locations if address.name == location.name] + rom.item_inject(location.address, address[0].itemType, item) + if "Shop" in location_name and "Coffee" not in location_name and item.player != self.player: + rom.desc_inject(location, item) + rom.patch_options() + + rom.close(output_directory) diff --git a/worlds/mlss/colors/Black.txt b/worlds/mlss/colors/Black.txt new file mode 100644 index 000000000000..c25fb73b3021 --- /dev/null +++ b/worlds/mlss/colors/Black.txt @@ -0,0 +1,265 @@ +0x3CC884,0x84,0x10,0, +0x3CC886,0x63,0x0C,0, +0x3CC8C4,0x84,0x10,1, +0x3CC8C6,0x63,0x0C,1, +0x4F4CDC,0x84,0x10,0, +0x4F4CDE,0x63,0x0C,0, +0x4F4D1C,0x84,0x10,1, +0x4F4D1E,0x63,0x0C,1, +0x4F51D8,0x84,0x10,1, +0x4F51DC,0x84,0x10,0, +0x4F51E8,0x08,0x21,0, +0x4F51EA,0x08,0x21,1, +0x4F51DA,0x4A,0x29,1, +0x4F51DE,0x4A,0x29,0, +0x4FB686,0x84,0x10,0, +0x4FB6A6,0x84,0x10,1, +0x4FB684,0x21,0x04,0, +0x4FB6A4,0x21,0x04,1, +0x4FB688,0x4A,0x29,0, +0x4FB6A8,0x4A,0x29,1, +0x4FB786,0x84,0x10,0, +0x4FB788,0x4A,0x29,0, +0x4FB78A,0x73,0x4E,0, +0x4FB7A6,0x84,0x10,1, +0x4FB7A8,0x4A,0x29,1, +0x4FB7AA,0x73,0x4E,1, +0x51901C,0x84,0x10,0, +0x519018,0x42,0x08,0, +0x51901A,0x63,0x0C,0, +0x51903C,0x84,0x10,1, +0x519038,0x42,0x08,1, +0x51903A,0x63,0x0C,1, +0x5193EA,0x63,0x0C,0, +0x5193E8,0x84,0x10,0, +0x51940A,0x63,0x0C,1, +0x519408,0x84,0x10,1, +0x3A72AE,0x84,0x10,1, +0x3A7244,0xA5,0x14,0, +0x3A724C,0x08,0x21,1, +0x3A7290,0xC6,0x18,0, +0x3A72B2,0xA5,0x14,1, +0x3A7270,0x63,0x0C,1, +0x3A7288,0x63,0x0C,0, +0x3A7296,0x29,0x25,0, +0x3A7274,0xA5,0x14,1, +0x3A7294,0x08,0x21,0, +0x3A724A,0x6B,0x2D,0, +0x3A7278,0xE7,0x1C,1, +0x3A724E,0xCE,0x39,0, +0x3A727A,0x29,0x25,1, +0x3A7252,0x10,0x42,0, +0x3A727C,0xAD,0x35,1, +0x3A72BC,0xAD,0x35,1, +0x3A726C,0x21,0x04,1, +0x3A7286,0x21,0x04,0, +0x3A728C,0x84,0x10,0, +0x3A7272,0x84,0x10,1, +0x3A7254,0x31,0x46,1, +0x3A7256,0x52,0x4A,0, +0x3A7264,0x31,0x46,1, +0x9F9A58,0x84,0x10,0, +0x9F9A5E,0x84,0x10,1, +0x9F9A2A,0x84,0x10,0, +0x9F9A30,0x84,0x10,1, +0x9F9A36,0x84,0x10,0, +0x9F9A3C,0x84,0x10,1, +0x9F9A4A,0x84,0x10,0, +0x9F9A50,0x84,0x10,1, +0x9F9A56,0x63,0x0C,0, +0x9F9A5C,0x63,0x0C,1, +0x9F9A28,0x21,0x04,0, +0x9F9A2E,0x21,0x04,1, +0x9F9A48,0x21,0x04,0, +0x9F9A4E,0x21,0x04,1, +0x9F9A34,0x63,0x0C,0, +0x9F9A3A,0x63,0x0C,1, +0x9F9A2C,0x4A,0x29,0, +0x9F9A32,0x4A,0x29,1, +0x9F9A38,0x4A,0x29,0, +0x9F9A3E,0x4A,0x29,1, +0x9F9A4C,0x4A,0x29,0, +0x9F9A52,0x4A,0x29,1, +0xA5DD46,0x63,0x0C,0, +0xA5DD44,0x00,0x00,0, +0xA5DD4A,0x6B,0x2D,0, +0xA5DD3E,0x21,0x04,0, +0xA5DD40,0xEF,0x3D,0, +0xA5DD42,0x52,0x4A,0, +0xA5DD48,0xE7,0x1C,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x63,0x0C,1, +0xA5DD64,0x00,0x00,1, +0xA5DD6A,0x6B,0x2D,1, +0xA5DD5E,0x21,0x04,1, +0xA5DD60,0xEF,0x3D,1, +0xA5DD62,0x52,0x4A,1, +0xA5DD68,0xE7,0x1C,1, +0x3D0E0C,0x84,0x10,1, +0x3D0E18,0x84,0x10,0, +0x3D0E0A,0x63,0x0C,1, +0x3D0E1A,0x63,0x0C,0, +0x3D0E08,0x4A,0x29,1, +0x3D0E16,0x4A,0x29,0, +0x3CC9C4,0x84,0x10,0, +0x3CC9C6,0x63,0x0C,0, +0x3CDE7C,0x84,0x10,1, +0x3CDE7E,0x63,0x0C,1, +0x51AD2C,0x84,0x10,0, +0x51AD2E,0x63,0x0C,0, +0x51AD4C,0x84,0x10,1, +0x51AD4E,0x63,0x0C,1, +0x51A4AE,0x63,0x0C,0, +0x51A4AC,0x84,0x10,0, +0x51A4CC,0x84,0x10,1, +0x51A4CE,0x63,0x0C,1, +0x51A98C,0x84,0x10,0, +0x51A98E,0x63,0x0C,0, +0x51A96C,0x84,0x10,1, +0x51A96E,0x63,0x0C,1, +0x51AA00,0x63,0x0C,0, +0x51AA10,0x63,0x0C,1, +0x51AA02,0x42,0x08,0, +0x51AA12,0x63,0x0C,1, +0x51A9FE,0x84,0x10,0, +0x51AA0E,0x84,0x10,1, +0x51AA0A,0x31,0x46,0, +0x3CC984,0x84,0x10,0, +0x3CC986,0x63,0x0C,0, +0x3D4B52,0x84,0x10,0, +0x3D4B5C,0x00,0x00,0, +0x3D4B54,0x84,0x10,0, +0x3D4B56,0x63,0x0C,0, +0x3D4B50,0x4A,0x29,0, +0x3CCA44,0x84,0x10,1, +0x3CCA46,0x63,0x0C,1, +0x3CFB3C,0x84,0x10,0, +0x3CFB3E,0x63,0x0C,0, +0x3CFB7C,0x84,0x10,1, +0x3CFB7E,0x63,0x0C,1, +0x3D504C,0xE7,0x1C,0, +0x3D504A,0x6B,0x2D,0, +0x3D504E,0x63,0x0C,0, +0x3D508C,0xE7,0x1C,1, +0x3D508A,0x6B,0x2D,1, +0x3D508E,0x63,0x0C,1, +0xA5DDA2,0x63,0x0C,0, +0xA5DDC2,0x63,0x0C,1, +0xA5DDA6,0x6B,0x2D,0, +0xA5DDC6,0x6B,0x2D,1, +0xA5DDA4,0xE7,0x1C,0, +0xA5DDC4,0xE7,0x1C,1, +0xA5DDA8,0xEF,0x3D,0, +0xA5DDC8,0xEF,0x3D,1, +0x3D3E0C,0x84,0x10,1, +0x3D3E10,0x84,0x10,0, +0x3D3E0E,0x63,0x0C,1, +0x3D3E12,0x63,0x0C,0, +0x3CF1C0,0x84,0x10,0, +0x3CF200,0x84,0x10,1, +0x3CF1C2,0x63,0x0C,0, +0x3CF202,0x63,0x0C,1, +0x3D360E,0x08,0x21,1, +0x3D3614,0x08,0x21,0, +0x3D360C,0x4A,0x29,1, +0x3D3612,0x4A,0x29,0, +0x3D3604,0xE7,0x1C,0, +0x3D3606,0xE7,0x1C,1, +0x3D360A,0x4A,0x29,1, +0x3D3610,0x4A,0x29,0, +0x3D1A48,0x84,0x10,0, +0x3D1A46,0x4A,0x29,0, +0x3D1A44,0x4A,0x29,0, +0x3D1A4A,0xE7,0x1C,0, +0x3D1A88,0x84,0x10,1, +0x3D1A8A,0xEE,0xE4,1, +0x3D1A86,0x4A,0x29,1, +0x3D1A84,0x4A,0x29,1, +0x3CE282,0x63,0x0C,0, +0x3CE2C2,0x63,0x0C,1, +0x3CE280,0x4A,0x29,0, +0x3CE2C0,0x4A,0x29,1, +0x4FA29E,0x63,0x0C,0, +0x4FA2DE,0x63,0x0C,1, +0x4FA29C,0x4A,0x29,0, +0x4FA2DC,0x4A,0x29,1, +0x3D4786,0x31,0x46,1, +0x3D478C,0x31,0x46,0, +0x3D478E,0xC6,0x18,0, +0x3D4788,0xC6,0x18,1, +0x3D4790,0xC6,0x18,0, +0x3D478A,0xE7,0x1C,1, +0x3D4794,0xE7,0x1C,0, +0x3D4792,0xE7,0x1C,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0x73,0x4E,1, +0x3C9E40,0x73,0x4E,0, +0x3C9E38,0x73,0x4E,1, +0x3C9E3E,0x73,0x4E,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0x84,0x10,0, +0x4F4D5E,0x63,0x0C,0, +0x3C9320,0x84,0x10,0, +0x3C9322,0x63,0x0C,0, +0x9F9CF6,0x84,0x10,0, +0x9F9CF8,0x63,0x0C,0, +0x4F4E1C,0x84,0x10,1, +0x4F4E1E,0x63,0x0C,1, +0x3C9450,0x84,0x10,1, +0x3C9452,0x63,0x0C,1, +0x9F9D74,0x84,0x10,1, +0x9F9D76,0x63,0x0C,1, +0xA6202E,0x63,0x0C,0, +0xA62032,0x6B,0x2D,0, +0xA62030,0xE7,0x1C,0, +0xA62034,0xEF,0x3D,0, +0xA6204E,0x63,0x0C,1, +0xA62052,0x6B,0x2D,1, +0xA62050,0xE7,0x1C,1, +0xA62054,0xEF,0x3D,1, +0x3D4812,0x08,0x21,0, +0x3D480E,0x08,0x21,1, +0x3D4810,0x4A,0x29,0, +0x3D480C,0x4A,0x29,1, +0x3CC9FE,0x84,0x10,0, +0x3CCA0A,0x63,0x0C,0, +0x8CBE20,0x84,0x10,0, +0x8CBE22,0x63,0x0C,0, +0x8CBE1E,0x31,0x46,0, +0x8CBE40,0x84,0x10,1, +0x8CBE42,0x63,0x0C,1, +0x8CBE3E,0x31,0x46,1, +0x8CBEE0,0x84,0x10,0, +0x8CBEDE,0x52,0x4A,0, +0x8CBEE2,0x63,0x0C,0, +0x3B8F38,0x84,0x10,1, +0x3B8F3A,0x52,0x4A,1, +0x3B8F40,0x84,0x10,0, +0x3B8F42,0x52,0x4A,0, +0x3D1094,0xC6,0x18,0, +0x3D109A,0x00,0x00,0, +0x3D1098,0x42,0x08,0, +0x3D1096,0x63,0x0C,0, +0x3D1092,0x52,0x4A,0, +0x3D1090,0x4A,0x29,0, +0x3D10D4,0xC6,0x18,1, +0x3D10DA,0x00,0x00,1, +0x3D10D8,0x42,0x08,1, +0x3D10D6,0x63,0x0C,1, +0x3D10D2,0x52,0x4A,1, +0x3D10D0,0x4A,0x29,1, +0x3D14D0,0x84,0x10,0, +0x3D14D2,0x63,0x0C,0, +0x3D14CE,0x4A,0x29,0, +0x3D14CC,0x08,0x21,0, +0x3D1510,0x08,0x21,1, +0x3D1512,0x63,0x0C,1, +0x3D150E,0x4A,0x29,1, +0x3D150C,0x08,0x21,1, +0x3CE0F4,0x63,0x0C,1, +0x3CE0F2,0x63,0x0C,1, +0x3CE0F0,0x08,0x21,1, +0x3CE0D4,0x63,0x0C,0, +0x3CE0D2,0x63,0x0C,0, +0x3CE0D0,0x08,0x21,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Blue.txt b/worlds/mlss/colors/Blue.txt new file mode 100644 index 000000000000..927bbd865626 --- /dev/null +++ b/worlds/mlss/colors/Blue.txt @@ -0,0 +1,265 @@ +0x3CC884,0x00,0x7C,0, +0x3CC886,0x00,0x5C,0, +0x3CC8C4,0x00,0x7C,1, +0x3CC8C6,0x00,0x5C,1, +0x4F4CDC,0x00,0x7C,0, +0x4F4CDE,0x00,0x5C,0, +0x4F4D1C,0x00,0x7C,1, +0x4F4D1E,0x00,0x5C,1, +0x4F51D8,0x00,0x7C,1, +0x4F51DC,0x00,0x7C,0, +0x4F51E8,0x73,0x72,0, +0x4F51EA,0x73,0x72,1, +0x4F51DA,0xB5,0x7E,1, +0x4F51DE,0xB5,0x7E,0, +0x4FB686,0x00,0x7C,0, +0x4FB6A6,0x00,0x7C,1, +0x4FB684,0xA5,0x38,0, +0x4FB6A4,0xA5,0x38,1, +0x4FB688,0xB5,0x7E,0, +0x4FB6A8,0xB5,0x7E,1, +0x4FB786,0x00,0x7C,0, +0x4FB788,0xB5,0x7E,0, +0x4FB78A,0x9C,0x7F,0, +0x4FB7A6,0x00,0x7C,1, +0x4FB7A8,0xB5,0x7E,1, +0x4FB7AA,0x9C,0x7F,1, +0x51901C,0x00,0x7C,0, +0x519018,0x00,0x50,0, +0x51901A,0x00,0x5C,0, +0x51903C,0x00,0x7C,1, +0x519038,0x00,0x50,1, +0x51903A,0x00,0x5C,1, +0x5193EA,0x00,0x5C,0, +0x5193E8,0x00,0x7C,0, +0x51940A,0x00,0x5C,1, +0x519408,0x00,0x7C,1, +0x3A72AE,0xC5,0x4C,1, +0x3A7244,0xC5,0x4C,0, +0x3A724C,0x07,0x5D,1, +0x3A7290,0xE6,0x54,0, +0x3A72B2,0xE6,0x54,1, +0x3A7270,0x42,0x3C,1, +0x3A7288,0x42,0x3C,0, +0x3A7296,0x07,0x65,0, +0x3A7274,0x07,0x65,1, +0x3A7294,0x07,0x5D,0, +0x3A724A,0x28,0x71,0, +0x3A7278,0x28,0x71,1, +0x3A724E,0x49,0x7D,0, +0x3A727A,0x49,0x7D,1, +0x3A7252,0xAC,0x7D,0, +0x3A727C,0xAC,0x7D,1, +0x3A72BC,0xAC,0x7D,1, +0x3A726C,0x00,0x38,1, +0x3A7286,0x00,0x38,0, +0x3A728C,0x84,0x44,0, +0x3A7272,0x84,0x44,1, +0x3A7254,0x0F,0x7E,1, +0x3A7256,0x0F,0x7E,0, +0x3A7264,0x0F,0x7E,1, +0x9F9A58,0xAD,0x4D,0, +0x9F9A5E,0xAD,0x4D,1, +0x9F9A2A,0x00,0x7C,0, +0x9F9A30,0x00,0x7C,1, +0x9F9A36,0x00,0x7C,0, +0x9F9A3C,0x00,0x7C,1, +0x9F9A4A,0x00,0x7C,0, +0x9F9A50,0x00,0x7C,1, +0x9F9A56,0x00,0x54,0, +0x9F9A5C,0x00,0x54,1, +0x9F9A28,0xA5,0x38,0, +0x9F9A2E,0xA5,0x38,1, +0x9F9A48,0xA5,0x38,0, +0x9F9A4E,0xA5,0x38,1, +0x9F9A34,0x00,0x5C,0, +0x9F9A3A,0x00,0x5C,1, +0x9F9A2C,0xB5,0x7E,0, +0x9F9A32,0xB5,0x7E,1, +0x9F9A38,0xB5,0x7E,0, +0x9F9A3E,0xB5,0x7E,1, +0x9F9A4C,0xB5,0x7E,0, +0x9F9A52,0xB5,0x7E,1, +0xA5DD46,0x8C,0x5D,0, +0xA5DD44,0x4A,0x4D,0, +0xA5DD4A,0x31,0x7E,0, +0xA5DD3E,0xAD,0x4D,0, +0xA5DD40,0xD6,0x7E,0, +0xA5DD42,0x7B,0x7F,0, +0xA5DD48,0xEF,0x71,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x8C,0x5D,1, +0xA5DD64,0x4A,0x4D,1, +0xA5DD6A,0x31,0x7E,1, +0xA5DD5E,0xAD,0x4D,1, +0xA5DD60,0xD6,0x7E,1, +0xA5DD62,0x7B,0x7F,1, +0xA5DD68,0xEF,0x71,1, +0x3D0E0C,0x00,0x7C,1, +0x3D0E18,0x00,0x7C,0, +0x3D0E0A,0x00,0x5C,1, +0x3D0E1A,0x00,0x5C,0, +0x3D0E08,0xB5,0x7E,1, +0x3D0E16,0xB5,0x7E,0, +0x3CC9C4,0x00,0x7C,0, +0x3CC9C6,0x00,0x5C,0, +0x3CDE7C,0x00,0x7C,1, +0x3CDE7E,0x00,0x5C,1, +0x51AD2C,0x00,0x7C,0, +0x51AD2E,0x00,0x5C,0, +0x51AD4C,0x00,0x7C,1, +0x51AD4E,0x00,0x5C,1, +0x51A4AE,0x00,0x5C,0, +0x51A4AC,0x00,0x7C,0, +0x51A4CC,0x00,0x7C,1, +0x51A4CE,0x00,0x5C,1, +0x51A98C,0x00,0x7C,0, +0x51A98E,0x00,0x5C,0, +0x51A96C,0x00,0x7C,1, +0x51A96E,0x00,0x5C,1, +0x51AA00,0x00,0x70,0, +0x51AA10,0x00,0x70,1, +0x51AA02,0x00,0x5C,0, +0x51AA12,0x00,0x5C,1, +0x51A9FE,0x00,0x7C,0, +0x51AA0E,0x00,0x7C,1, +0x51AA0A,0x0F,0x7E,0, +0x3CC984,0x00,0x7C,0, +0x3CC986,0x00,0x5C,0, +0x3D4B52,0x00,0x70,0, +0x3D4B5C,0x00,0x50,0, +0x3D4B54,0x00,0x7C,0, +0x3D4B56,0x00,0x5C,0, +0x3D4B50,0xB5,0x7E,0, +0x3CCA44,0x00,0x7C,1, +0x3CCA46,0x00,0x5C,1, +0x3CFB3C,0x00,0x7C,0, +0x3CFB3E,0x00,0x5C,0, +0x3CFB7C,0x00,0x7C,1, +0x3CFB7E,0x00,0x5C,1, +0x3D504C,0x00,0x6C,0, +0x3D504A,0x00,0x7C,0, +0x3D504E,0x00,0x5C,0, +0x3D508C,0x00,0x6C,1, +0x3D508A,0x00,0x7C,1, +0x3D508E,0x00,0x5C,1, +0xA5DDA2,0x8C,0x5D,0, +0xA5DDC2,0x8C,0x5D,1, +0xA5DDA6,0x31,0x7E,0, +0xA5DDC6,0x31,0x7E,1, +0xA5DDA4,0xEF,0x71,0, +0xA5DDC4,0xEF,0x71,1, +0xA5DDA8,0xB5,0x7E,0, +0xA5DDC8,0xB5,0x7E,1, +0x3D3E0C,0x00,0x7C,1, +0x3D3E10,0x00,0x7C,0, +0x3D3E0E,0x00,0x5C,1, +0x3D3E12,0x00,0x5C,0, +0x3CF1C0,0x00,0x7C,0, +0x3CF200,0x00,0x7C,1, +0x3CF1C2,0x00,0x5C,0, +0x3CF202,0x00,0x5C,1, +0x3D360E,0x07,0x5D,1, +0x3D3614,0x07,0x5D,0, +0x3D360C,0xB5,0x7E,1, +0x3D3612,0xB5,0x7E,0, +0x3D3604,0xEF,0x71,0, +0x3D3606,0xEF,0x71,1, +0x3D360A,0xB5,0x7E,1, +0x3D3610,0xB5,0x7E,0, +0x3D1A48,0x84,0x44,0, +0x3D1A46,0xB5,0x7E,0, +0x3D1A44,0xB5,0x7E,0, +0x3D1A4A,0xEF,0x71,0, +0x3D1A88,0x84,0x44,1, +0x3D1A8A,0xCC,0xC4,1, +0x3D1A86,0xB5,0x7E,1, +0x3D1A84,0xB5,0x7E,1, +0x3CE282,0x00,0x5C,0, +0x3CE2C2,0x00,0x5C,1, +0x3CE280,0xB5,0x7E,0, +0x3CE2C0,0xB5,0x7E,1, +0x4FA29E,0x00,0x5C,0, +0x4FA2DE,0x00,0x5C,1, +0x4FA29C,0xB5,0x7E,0, +0x4FA2DC,0xB5,0x7E,1, +0x3D4786,0x0F,0x7E,1, +0x3D478C,0x0F,0x7E,0, +0x3D478E,0xE6,0x54,0, +0x3D4788,0xE6,0x54,1, +0x3D4790,0xE6,0x54,0, +0x3D478A,0x00,0x6C,1, +0x3D4794,0xEF,0x71,0, +0x3D4792,0x00,0x6C,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0x9C,0x7F,1, +0x3C9E40,0x9C,0x7F,0, +0x3C9E38,0x9C,0x7F,1, +0x3C9E3E,0x9C,0x7F,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0x00,0x7C,0, +0x4F4D5E,0x00,0x5C,0, +0x3C9320,0x00,0x7C,0, +0x3C9322,0x00,0x5C,0, +0x9F9CF6,0x00,0x7C,0, +0x9F9CF8,0x00,0x5C,0, +0x4F4E1C,0x00,0x7C,1, +0x4F4E1E,0x00,0x5C,1, +0x3C9450,0x00,0x7C,1, +0x3C9452,0x00,0x5C,1, +0x9F9D74,0x00,0x7C,1, +0x9F9D76,0x00,0x5C,1, +0xA6202E,0x8C,0x5D,0, +0xA62032,0x31,0x7E,0, +0xA62030,0xEF,0x71,0, +0xA62034,0xB5,0x7E,0, +0xA6204E,0x8C,0x5D,1, +0xA62052,0x31,0x7E,1, +0xA62050,0xEF,0x71,1, +0xA62054,0xB5,0x7E,1, +0x3D4812,0x07,0x5D,0, +0x3D480E,0x07,0x5D,1, +0x3D4810,0xB5,0x7E,0, +0x3D480C,0xB5,0x7E,1, +0x3CC9FE,0x00,0x7C,0, +0x3CCA0A,0x00,0x5C,0, +0x8CBE20,0x84,0x44,0, +0x8CBE22,0x00,0x5C,0, +0x8CBE1E,0x0F,0x7E,0, +0x8CBE40,0x84,0x44,1, +0x8CBE42,0x00,0x5C,1, +0x8CBE3E,0x0F,0x7E,1, +0x8CBEE0,0x00,0x7C,0, +0x8CBEDE,0x7B,0x7F,0, +0x8CBEE2,0x00,0x5C,0, +0x3B8F38,0x84,0x44,1, +0x3B8F3A,0x7B,0x7F,1, +0x3B8F40,0x84,0x44,0, +0x3B8F42,0x7B,0x7F,0, +0x3D1094,0xE6,0x54,0, +0x3D109A,0x4A,0x4D,0, +0x3D1098,0x00,0x50,0, +0x3D1096,0x00,0x5C,0, +0x3D1092,0x7B,0x7F,0, +0x3D1090,0xB5,0x7E,0, +0x3D10D4,0xE6,0x54,1, +0x3D10DA,0x4A,0x4D,1, +0x3D10D8,0x00,0x50,1, +0x3D10D6,0x00,0x5C,1, +0x3D10D2,0x7B,0x7F,1, +0x3D10D0,0xB5,0x7E,1, +0x3D14D0,0x00,0x7C,0, +0x3D14D2,0x00,0x5C,0, +0x3D14CE,0xB5,0x7E,0, +0x3D14CC,0x73,0x72,0, +0x3D1510,0x07,0x5D,1, +0x3D1512,0x00,0x5C,1, +0x3D150E,0xB5,0x7E,1, +0x3D150C,0x73,0x72,1, +0x3CE0F4,0x8C,0x5D,1, +0x3CE0F2,0x00,0x70,1, +0x3CE0F0,0x73,0x72,1, +0x3CE0D4,0x8C,0x5D,0, +0x3CE0D2,0x00,0x70,0, +0x3CE0D0,0x73,0x72,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Chaos.txt b/worlds/mlss/colors/Chaos.txt new file mode 100644 index 000000000000..d0b69570670e --- /dev/null +++ b/worlds/mlss/colors/Chaos.txt @@ -0,0 +1,156 @@ +0x3CC884,0, +0x3CC886,0, +0x3CC984,0, +0x3CC986,0, +0x3D0E16,0, +0x3D0E18,0, +0x3D0E1A,0, +0x3D4B50,0, +0x3D4B52,0, +0x3D4B54,0, +0x3D4B56,0, +0x4F4CDC,0, +0x4F4CDE,0, +0x4F51DC,0, +0x4F51DE,0, +0x4F51E8,0, +0x4fb684,0, +0x4fb686,0, +0x4fb688,0, +0x4FB786,0, +0x4fb788,0, +0x4fb78a,0, +0x519018,0, +0x51901a,0, +0x51901c,0, +0x5193E8,0, +0x5193EA,0, +0x51A4AC,0, +0x51A4AE,0, +0x51A98C,0, +0x51A98E,0, +0x51AD2C,0, +0x51AD2E,0, +0x9F9A28,0, +0x9F9A2A,0, +0x9F9A2C,0, +0x9F9A34,0, +0x9F9A36,0, +0x9F9A38,0, +0x9F9A48,0, +0x9F9A4A,0, +0x9F9A4C,0, +0x9F9A56,0, +0x9F9A58,0, +0xA5DD3E,0, +0xA5DD40,0, +0xA5DD42,0, +0xA5DD44,0, +0xA5DD46,0, +0xA5DD48,0, +0xA5DD4A,0, +0x3CC8C4,1, +0x3CC8C6,1, +0x3D0E08,1, +0x3D0E0A,1, +0x3D0E0C,1, +0x4F4D1C,1, +0x4F4D1E,1, +0x4F51D8,1, +0x4F51DA,1, +0x4F51EA,1, +0x4fb6a4,1, +0x4fb6a6,1, +0x4fb6a8,1, +0x4FB7A6,1, +0x4FB7A8,1, +0x4FB7AA,1, +0x519038,1, +0x51903A,1, +0x51903c,1, +0x519408,1, +0x51940a,1, +0x51A4CC,1, +0x51A4CE,1, +0x51A96C,1, +0x51A96E,1, +0x51AD4C,1, +0x51AD4E,1, +0x9F9A2E,1, +0x9F9A30,1, +0x9F9A32,1, +0x9F9A3A,1, +0x9F9A3C,1, +0x9F9A3E,1, +0x9F9A4E,1, +0x9F9A50,1, +0x9F9A52,1, +0x9F9A5C,1, +0x9F9A5E,1, +0xA5DD5E,1, +0xA5DD60,1, +0xA5DD62,1, +0xA5DD64,1, +0xA5DD66,1, +0xA5DD68,1, +0xA5DD6A,1, +0x3A7256,0, +0x3A7252,0, +0x3A724E,0, +0x3A724A,0, +0x3A7296,0, +0x3A7294,0, +0x3A7290,0, +0x3A7244,0, +0x3A728C,0, +0x3A7288,0, +0x3A7286,0, +0x3A7254,1, +0x3A7264,1, +0x3A727C,1, +0x3A72BC,1, +0x3A727A,1, +0x3A7278,1, +0x3A7274,1, +0x3A724C,1, +0x3A72B2,1, +0x3A72AE,1, +0x3A7272,1, +0x3A7270,1, +0x3A726C,1, +0xA5DDA2,0, +0xA5DDA4,0, +0xA5DDA6,0, +0xA5DDA8,0, +0x3D3E10,0, +0x3D3E12,0, +0x3D504A,0, +0x3D504C,0, +0x3D504E,0, +0x3D4B5C,0, +0xA5DDC2,1, +0xA5DDC4,1, +0xA5DDC6,1, +0xA5DDC8,1, +0x3D3E0C,1, +0x3D3E0E,1, +0x3D508A,1, +0x3D508C,1, +0x3D508E,1, +0x51A9FE,0, +0x51AA00,0, +0x51AA02,0, +0x51AA0A,0, +0x51AA0E,1, +0x51AA10,1, +0x51AA12,1, +0x3CFB3C,0, +0x3CFB3E,0, +0x3CC9C4,0, +0x3CC9C6,0, +0x3CFB7C,1, +0x3CFB7E,1, +0x3CCA44,1, +0x3CCA46,1, +0x3CDE7C,1, +0x3CDE7E,1, \ No newline at end of file diff --git a/worlds/mlss/colors/Cyan.txt b/worlds/mlss/colors/Cyan.txt new file mode 100644 index 000000000000..3c7fd1e5f44a --- /dev/null +++ b/worlds/mlss/colors/Cyan.txt @@ -0,0 +1,265 @@ +0x3CC884,0xED,0x7F,0, +0x3CC886,0x8B,0x73,0, +0x3CC8C4,0xED,0x7F,1, +0x3CC8C6,0x8B,0x73,1, +0x4F4CDC,0xED,0x7F,0, +0x4F4CDE,0x8B,0x73,0, +0x4F4D1C,0xED,0x7F,1, +0x4F4D1E,0x8B,0x73,1, +0x4F51D8,0xED,0x7F,1, +0x4F51DC,0xED,0x7F,0, +0x4F51E8,0xD6,0x7B,0, +0x4F51EA,0xD6,0x7B,1, +0x4F51DA,0xFA,0x7F,1, +0x4F51DE,0xFA,0x7F,0, +0x4FB686,0xED,0x7F,0, +0x4FB6A6,0xED,0x7F,1, +0x4FB684,0x8E,0x52,0, +0x4FB6A4,0x8E,0x52,1, +0x4FB688,0xFA,0x7F,0, +0x4FB6A8,0xFA,0x7F,1, +0x4FB786,0x8B,0x73,0, +0x4FB788,0xED,0x7F,0, +0x4FB78A,0xFA,0x7F,0, +0x4FB7A6,0x8B,0x73,1, +0x4FB7A8,0xED,0x7F,1, +0x4FB7AA,0xFA,0x7F,1, +0x51901C,0xED,0x7F,0, +0x519018,0xC9,0x5A,0, +0x51901A,0x8B,0x77,0, +0x51903C,0xED,0x7F,1, +0x519038,0xC9,0x5A,1, +0x51903A,0x8B,0x77,1, +0x5193EA,0x8B,0x73,0, +0x5193E8,0xED,0x7F,0, +0x51940A,0x8B,0x73,1, +0x519408,0xED,0x7F,1, +0x3A72AE,0x60,0x6F,1, +0x3A7244,0x20,0x67,0, +0x3A724C,0x60,0x6F,1, +0x3A7290,0x40,0x6B,0, +0x3A72B2,0xA0,0x77,1, +0x3A7270,0xC0,0x5A,1, +0x3A7288,0xC0,0x5A,0, +0x3A7296,0x80,0x73,0, +0x3A7274,0x80,0x73,1, +0x3A7294,0x60,0x6F,0, +0x3A724A,0xA0,0x77,0, +0x3A7278,0xA0,0x77,1, +0x3A724E,0xC0,0x7B,0, +0x3A727A,0xC0,0x7B,1, +0x3A7252,0xE0,0x7F,0, +0x3A727C,0xE0,0x7F,1, +0x3A72BC,0xE0,0x7F,1, +0x3A726C,0x80,0x52,1, +0x3A7286,0x80,0x52,0, +0x3A728C,0x00,0x63,0, +0x3A7272,0x00,0x63,1, +0x3A7254,0xF3,0x7F,1, +0x3A7256,0xF3,0x7F,0, +0x3A7264,0xF3,0x7F,1, +0x9F9A58,0x56,0x6B,0, +0x9F9A5E,0x56,0x6B,1, +0x9F9A2A,0xED,0x7F,0, +0x9F9A30,0xED,0x7F,1, +0x9F9A36,0xCC,0x7B,0, +0x9F9A3C,0xCC,0x7B,1, +0x9F9A4A,0xCC,0x7B,0, +0x9F9A50,0xCC,0x7B,1, +0x9F9A56,0x0A,0x63,0, +0x9F9A5C,0x0A,0x63,1, +0x9F9A28,0x8E,0x52,0, +0x9F9A2E,0x8E,0x52,1, +0x9F9A48,0x8E,0x52,0, +0x9F9A4E,0x8E,0x52,1, +0x9F9A34,0x8B,0x73,0, +0x9F9A3A,0x8B,0x73,1, +0x9F9A2C,0xFA,0x7F,0, +0x9F9A32,0xFA,0x7F,1, +0x9F9A38,0xFA,0x7F,0, +0x9F9A3E,0xFA,0x7F,1, +0x9F9A4C,0xFA,0x7F,0, +0x9F9A52,0xFA,0x7F,1, +0xA5DD46,0xAC,0x56,0, +0xA5DD44,0x2A,0x46,0, +0xA5DD4A,0x90,0x73,0, +0xA5DD3E,0x80,0x52,0, +0xA5DD40,0xF2,0x7F,0, +0xA5DD42,0xFC,0x7F,0, +0xA5DD48,0x2F,0x67,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0xAC,0x56,1, +0xA5DD64,0x2A,0x46,1, +0xA5DD6A,0x90,0x73,1, +0xA5DD5E,0x80,0x52,1, +0xA5DD60,0xF2,0x7F,1, +0xA5DD62,0xFC,0x7F,1, +0xA5DD68,0x2F,0x67,1, +0x3D0E0C,0xED,0x7F,1, +0x3D0E18,0xED,0x7F,0, +0x3D0E0A,0x8B,0x73,1, +0x3D0E1A,0x8B,0x73,0, +0x3D0E08,0xFA,0x7F,1, +0x3D0E16,0xFA,0x7F,0, +0x3CC9C4,0xED,0x7F,0, +0x3CC9C6,0x8B,0x73,0, +0x3CDE7C,0xED,0x7F,1, +0x3CDE7E,0x8B,0x73,1, +0x51AD2C,0xED,0x7F,0, +0x51AD2E,0x8B,0x73,0, +0x51AD4C,0xED,0x7F,1, +0x51AD4E,0x8B,0x73,1, +0x51A4AE,0x8B,0x73,0, +0x51A4AC,0xED,0x7F,0, +0x51A4CC,0xED,0x7F,1, +0x51A4CE,0x8B,0x73,1, +0x51A98C,0xED,0x7F,0, +0x51A98E,0x8B,0x73,0, +0x51A96C,0xED,0x7F,1, +0x51A96E,0x8B,0x73,1, +0x51AA00,0x8B,0x73,0, +0x51AA10,0x8B,0x73,1, +0x51AA02,0xA8,0x56,0, +0x51AA12,0xA8,0x56,1, +0x51A9FE,0xED,0x7F,0, +0x51AA0E,0xED,0x7F,1, +0x51AA0A,0xF3,0x7F,0, +0x3CC984,0xED,0x7F,0, +0x3CC986,0x8B,0x73,0, +0x3D4B52,0xAB,0x77,0, +0x3D4B5C,0x09,0x63,0, +0x3D4B54,0xED,0x7F,0, +0x3D4B56,0x8B,0x73,0, +0x3D4B50,0xFA,0x7F,0, +0x3CCA44,0xED,0x7F,1, +0x3CCA46,0x8B,0x73,1, +0x3CFB3C,0xED,0x7F,0, +0x3CFB3E,0x8B,0x73,0, +0x3CFB7C,0xED,0x7F,1, +0x3CFB7E,0x8B,0x73,1, +0x3D504C,0xAC,0x77,0, +0x3D504A,0xED,0x7F,0, +0x3D504E,0x8B,0x73,0, +0x3D508C,0xAC,0x77,1, +0x3D508A,0xED,0x7F,1, +0x3D508E,0x8B,0x73,1, +0xA5DDA2,0xAC,0x56,0, +0xA5DDC2,0xAC,0x56,1, +0xA5DDA6,0x90,0x73,0, +0xA5DDC6,0x90,0x73,1, +0xA5DDA4,0x2F,0x67,0, +0xA5DDC4,0x2F,0x67,1, +0xA5DDA8,0x97,0x73,0, +0xA5DDC8,0x97,0x73,1, +0x3D3E0C,0xED,0x7F,1, +0x3D3E10,0xED,0x7F,0, +0x3D3E0E,0x8B,0x73,1, +0x3D3E12,0x8B,0x73,0, +0x3CF1C0,0xED,0x7F,0, +0x3CF200,0xED,0x7F,1, +0x3CF1C2,0x8B,0x73,0, +0x3CF202,0x8B,0x73,1, +0x3D360E,0x60,0x6F,1, +0x3D3614,0x60,0x6F,0, +0x3D360C,0xFA,0x7F,1, +0x3D3612,0xFA,0x7F,0, +0x3D3604,0x2F,0x67,0, +0x3D3606,0x2F,0x67,1, +0x3D360A,0xFA,0x7F,1, +0x3D3610,0xFA,0x7F,0, +0x3D1A48,0x00,0x63,0, +0x3D1A46,0xFA,0x7F,0, +0x3D1A44,0xFA,0x7F,0, +0x3D1A4A,0x2F,0x67,0, +0x3D1A88,0x00,0x63,1, +0x3D1A8A,0xBB,0xB8,1, +0x3D1A86,0xFA,0x7F,1, +0x3D1A84,0xFA,0x7F,1, +0x3CE282,0x8B,0x73,0, +0x3CE2C2,0x8B,0x73,1, +0x3CE280,0xFA,0x7F,0, +0x3CE2C0,0xFA,0x7F,1, +0x4FA29E,0x8B,0x73,0, +0x4FA2DE,0x8B,0x73,1, +0x4FA29C,0xFA,0x7F,0, +0x4FA2DC,0xFA,0x7F,1, +0x3D4786,0xF3,0x7F,1, +0x3D478C,0xF3,0x7F,0, +0x3D478E,0x40,0x6B,0, +0x3D4788,0x40,0x6B,1, +0x3D4790,0x40,0x6B,0, +0x3D478A,0xAC,0x77,1, +0x3D4794,0x2F,0x67,0, +0x3D4792,0xAC,0x77,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0xFA,0x7F,1, +0x3C9E40,0xFA,0x7F,0, +0x3C9E38,0xFA,0x7F,1, +0x3C9E3E,0xFA,0x7F,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0xED,0x7F,0, +0x4F4D5E,0x8B,0x73,0, +0x3C9320,0xED,0x7F,0, +0x3C9322,0x8B,0x73,0, +0x9F9CF6,0xED,0x7F,0, +0x9F9CF8,0x8B,0x73,0, +0x4F4E1C,0xED,0x7F,1, +0x4F4E1E,0x8B,0x73,1, +0x3C9450,0xED,0x7F,1, +0x3C9452,0x8B,0x73,1, +0x9F9D74,0xED,0x7F,1, +0x9F9D76,0x8B,0x73,1, +0xA6202E,0xAC,0x56,0, +0xA62032,0x90,0x73,0, +0xA62030,0x2F,0x67,0, +0xA62034,0x97,0x73,0, +0xA6204E,0xAC,0x56,1, +0xA62052,0x90,0x73,1, +0xA62050,0x2F,0x67,1, +0xA62054,0x97,0x73,1, +0x3D4812,0x60,0x6F,0, +0x3D480E,0x60,0x6F,1, +0x3D4810,0xFA,0x7F,0, +0x3D480C,0xFA,0x7F,1, +0x3CC9FE,0xED,0x7F,0, +0x3CCA0A,0x8B,0x73,0, +0x8CBE20,0x00,0x63,0, +0x8CBE22,0x8B,0x73,0, +0x8CBE1E,0xF3,0x7F,0, +0x8CBE40,0x00,0x63,1, +0x8CBE42,0x8B,0x73,1, +0x8CBE3E,0xF3,0x7F,1, +0x8CBEE0,0xED,0x7F,0, +0x8CBEDE,0xFC,0x7F,0, +0x8CBEE2,0x8B,0x73,0, +0x3B8F38,0x00,0x63,1, +0x3B8F3A,0xFC,0x7F,1, +0x3B8F40,0x00,0x63,0, +0x3B8F42,0xFC,0x7F,0, +0x3D1094,0x40,0x6B,0, +0x3D109A,0x2A,0x46,0, +0x3D1098,0xC9,0x5A,0, +0x3D1096,0x8B,0x77,0, +0x3D1092,0xFC,0x7F,0, +0x3D1090,0xFA,0x7F,0, +0x3D10D4,0x40,0x6B,1, +0x3D10DA,0x2A,0x46,1, +0x3D10D8,0xC9,0x5A,1, +0x3D10D6,0x8B,0x77,1, +0x3D10D2,0xFC,0x7F,1, +0x3D10D0,0xFA,0x7F,1, +0x3D14D0,0xED,0x7F,0, +0x3D14D2,0x8B,0x73,0, +0x3D14CE,0xFA,0x7F,0, +0x3D14CC,0xD6,0x7B,0, +0x3D1510,0x60,0x6F,1, +0x3D1512,0x8B,0x73,1, +0x3D150E,0xFA,0x7F,1, +0x3D150C,0xD6,0x7B,1, +0x3CE0F4,0xAC,0x56,1, +0x3CE0F2,0x8B,0x73,1, +0x3CE0F0,0xD6,0x7B,1, +0x3CE0D4,0xAC,0x56,0, +0x3CE0D2,0x8B,0x73,0, +0x3CE0D0,0xD6,0x7B,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Green.txt b/worlds/mlss/colors/Green.txt new file mode 100644 index 000000000000..59a2a56cdd94 --- /dev/null +++ b/worlds/mlss/colors/Green.txt @@ -0,0 +1,265 @@ +0x3CC884,0xA3,0x03,0, +0x3CC886,0xE0,0x02,0, +0x3CC8C4,0xA3,0x03,1, +0x3CC8C6,0xE0,0x02,1, +0x4F4CDC,0xA3,0x03,0, +0x4F4CDE,0xE0,0x02,0, +0x4F4D1C,0xA3,0x03,1, +0x4F4D1E,0xE0,0x02,1, +0x4F51D8,0xA3,0x03,1, +0x4F51DC,0xA3,0x03,0, +0x4F51E8,0xB1,0x3B,0, +0x4F51EA,0xB1,0x3B,1, +0x4F51DA,0xF3,0x43,1, +0x4F51DE,0xF3,0x43,0, +0x4FB686,0xA3,0x03,0, +0x4FB6A6,0xA3,0x03,1, +0x4FB684,0xC2,0x01,0, +0x4FB6A4,0xC2,0x01,1, +0x4FB688,0xF6,0x5B,0, +0x4FB6A8,0xF6,0x5B,1, +0x4FB786,0xA3,0x03,0, +0x4FB788,0xF6,0x5B,0, +0x4FB78A,0xFB,0x6F,0, +0x4FB7A6,0xA3,0x03,1, +0x4FB7A8,0xF6,0x5B,1, +0x4FB7AA,0xFB,0x6F,1, +0x51901C,0xA3,0x03,0, +0x519018,0xE0,0x01,0, +0x51901A,0xE0,0x02,0, +0x51903C,0xA3,0x03,1, +0x519038,0xE0,0x01,1, +0x51903A,0xE0,0x02,1, +0x5193EA,0xA0,0x02,0, +0x5193E8,0xA3,0x03,0, +0x51940A,0xA0,0x02,1, +0x519408,0xA3,0x03,1, +0x3A72AE,0x26,0x43,1, +0x3A7244,0x26,0x43,0, +0x3A724C,0x34,0x2F,1, +0x3A7290,0x4C,0x3F,0, +0x3A72B2,0x4C,0x3F,1, +0x3A7270,0x4E,0x2E,1, +0x3A7288,0x4E,0x2E,0, +0x3A7296,0x6D,0x3F,0, +0x3A7274,0x6D,0x3F,1, +0x3A7294,0x70,0x3B,0, +0x3A724A,0x8F,0x3B,0, +0x3A7278,0x8F,0x3B,1, +0x3A724E,0xB4,0x33,0, +0x3A727A,0xB4,0x33,1, +0x3A7252,0xD7,0x2B,0, +0x3A727C,0xD7,0x2B,1, +0x3A72BC,0xD7,0x2B,1, +0x3A726C,0xEC,0x29,1, +0x3A7286,0xEC,0x29,0, +0x3A728C,0xF0,0x36,0, +0x3A7272,0xF0,0x36,1, +0x3A7254,0xF9,0x33,1, +0x3A7256,0xF9,0x33,0, +0x3A7264,0xF9,0x33,1, +0x9F9A58,0x0C,0x32,0, +0x9F9A5E,0x0C,0x32,1, +0x9F9A2A,0xA3,0x03,0, +0x9F9A30,0xA3,0x03,1, +0x9F9A36,0xA3,0x03,0, +0x9F9A3C,0xA3,0x03,1, +0x9F9A4A,0xA3,0x03,0, +0x9F9A50,0xA3,0x03,1, +0x9F9A56,0xC1,0x01,0, +0x9F9A5C,0xC1,0x01,1, +0x9F9A28,0xC2,0x01,0, +0x9F9A2E,0xC2,0x01,1, +0x9F9A48,0xC2,0x01,0, +0x9F9A4E,0xC2,0x01,1, +0x9F9A34,0xE2,0x02,0, +0x9F9A3A,0xE2,0x02,1, +0x9F9A2C,0xF6,0x5B,0, +0x9F9A32,0xF6,0x5B,1, +0x9F9A38,0xF6,0x5B,0, +0x9F9A3E,0xF6,0x5B,1, +0x9F9A4C,0xF6,0x5B,0, +0x9F9A52,0xF6,0x5B,1, +0xA5DD46,0x24,0x1E,0, +0xA5DD44,0x82,0x19,0, +0xA5DD4A,0x89,0x3F,0, +0xA5DD3E,0xA9,0x2D,0, +0xA5DD40,0xB0,0x57,0, +0xA5DD42,0xD5,0x5F,0, +0xA5DD48,0xE7,0x32,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x24,0x1E,1, +0xA5DD64,0x82,0x19,1, +0xA5DD6A,0x89,0x3F,1, +0xA5DD5E,0xA9,0x2D,1, +0xA5DD60,0xB0,0x57,1, +0xA5DD62,0xD5,0x5F,1, +0xA5DD68,0xE7,0x32,1, +0x3D0E0C,0xA3,0x03,1, +0x3D0E18,0xA3,0x03,0, +0x3D0E0A,0xE0,0x02,1, +0x3D0E1A,0xE0,0x02,0, +0x3D0E08,0xF6,0x5B,1, +0x3D0E16,0xF6,0x5B,0, +0x3CC9C4,0xA3,0x03,0, +0x3CC9C6,0xE0,0x02,0, +0x3CDE7C,0xA3,0x03,1, +0x3CDE7E,0xE0,0x02,1, +0x51AD2C,0xA3,0x03,0, +0x51AD2E,0xE0,0x02,0, +0x51AD4C,0xA3,0x03,1, +0x51AD4E,0xE0,0x02,1, +0x51A4AE,0xA0,0x02,0, +0x51A4AC,0xA3,0x03,0, +0x51A4CC,0xA3,0x03,1, +0x51A4CE,0xE0,0x02,1, +0x51A98C,0xA3,0x03,0, +0x51A98E,0xE0,0x02,0, +0x51A96C,0xA3,0x03,1, +0x51A96E,0xE0,0x02,1, +0x51AA00,0x60,0x02,0, +0x51AA10,0x60,0x02,1, +0x51AA02,0x61,0x01,0, +0x51AA12,0x61,0x01,1, +0x51A9FE,0xA3,0x03,0, +0x51AA0E,0xA3,0x03,1, +0x51AA0A,0xF0,0x3B,0, +0x3CC984,0xA3,0x03,0, +0x3CC986,0xE0,0x02,0, +0x3D4B52,0x43,0x03,0, +0x3D4B5C,0x60,0x02,0, +0x3D4B54,0xA3,0x03,0, +0x3D4B56,0xE0,0x02,0, +0x3D4B50,0xF6,0x5B,0, +0x3CCA44,0xA3,0x03,1, +0x3CCA46,0xE0,0x02,1, +0x3CFB3C,0xA3,0x03,0, +0x3CFB3E,0xE0,0x02,0, +0x3CFB7C,0xA3,0x03,1, +0x3CFB7E,0xE0,0x02,1, +0x3D504C,0x41,0x03,0, +0x3D504A,0xA3,0x03,0, +0x3D504E,0xE0,0x02,0, +0x3D508C,0x41,0x03,1, +0x3D508A,0xA3,0x03,1, +0x3D508E,0xE0,0x02,1, +0xA5DDA2,0x24,0x1E,0, +0xA5DDC2,0x24,0x1E,1, +0xA5DDA6,0x89,0x3F,0, +0xA5DDC6,0x89,0x3F,1, +0xA5DDA4,0xE7,0x32,0, +0xA5DDC4,0xE7,0x32,1, +0xA5DDA8,0xF6,0x63,0, +0xA5DDC8,0xF6,0x63,1, +0x3D3E0C,0xA3,0x03,1, +0x3D3E10,0xA3,0x03,0, +0x3D3E0E,0xE0,0x02,1, +0x3D3E12,0xE0,0x02,0, +0x3CF1C0,0xA3,0x03,0, +0x3CF200,0xA3,0x03,1, +0x3CF1C2,0xE0,0x02,0, +0x3CF202,0xE0,0x02,1, +0x3D360E,0x00,0x43,1, +0x3D3614,0x00,0x43,0, +0x3D360C,0x80,0x4F,1, +0x3D3612,0x80,0x4F,0, +0x3D3604,0xC1,0x01,0, +0x3D3606,0xC1,0x01,1, +0x3D360A,0xE3,0x63,1, +0x3D3610,0xE3,0x63,0, +0x3D1A48,0x28,0x1B,0, +0x3D1A46,0xF6,0x5B,0, +0x3D1A44,0xFC,0x5F,0, +0x3D1A4A,0xE7,0x32,0, +0x3D1A88,0x28,0x1B,1, +0x3D1A8A,0x81,0x02,1, +0x3D1A86,0xF6,0x5B,1, +0x3D1A84,0xFC,0x5F,1, +0x3CE282,0xA0,0x36,0, +0x3CE2C2,0xA0,0x36,1, +0x3CE280,0xE0,0x4F,0, +0x3CE2C0,0xE0,0x4F,1, +0x4FA29E,0xA0,0x36,0, +0x4FA2DE,0xA0,0x36,1, +0x4FA29C,0xE0,0x4F,0, +0x4FA2DC,0xE0,0x4F,1, +0x3D4786,0xA0,0x07,1, +0x3D478C,0xA0,0x07,0, +0x3D478E,0xC0,0x02,0, +0x3D4788,0xC0,0x02,1, +0x3D4790,0xC0,0x02,0, +0x3D478A,0xE0,0x01,1, +0x3D4794,0xE7,0x32,0, +0x3D4792,0xE7,0x32,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0xF2,0x73,1, +0x3C9E40,0xF2,0x73,0, +0x3C9E38,0xF6,0x77,1, +0x3C9E3E,0xF6,0x77,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0xA3,0x03,0, +0x4F4D5E,0xE0,0x02,0, +0x3C9320,0xA3,0x03,0, +0x3C9322,0xE0,0x02,0, +0x9F9CF6,0xA3,0x03,0, +0x9F9CF8,0xE0,0x02,0, +0x4F4E1C,0xA3,0x03,1, +0x4F4E1E,0xE0,0x02,1, +0x3C9450,0xA3,0x03,1, +0x3C9452,0xE0,0x02,1, +0x9F9D74,0xA3,0x03,1, +0x9F9D76,0xE0,0x02,1, +0xA6202E,0x24,0x1E,0, +0xA62032,0x89,0x3F,0, +0xA62030,0xE7,0x32,0, +0xA62034,0xF6,0x63,0, +0xA6204E,0x24,0x1E,1, +0xA62052,0x89,0x3F,1, +0xA62050,0xE7,0x32,1, +0xA62054,0xF6,0x63,1, +0x3D4812,0x64,0x3B,0, +0x3D480E,0x64,0x3B,1, +0x3D4810,0xEF,0x57,0, +0x3D480C,0xEF,0x57,1, +0x3CC9FE,0xA3,0x03,0, +0x3CCA0A,0xE0,0x02,0, +0x8CBE20,0x4D,0x33,0, +0x8CBE22,0xA7,0x2A,0, +0x8CBE1E,0xD3,0x3F,0, +0x8CBE40,0x4D,0x33,1, +0x8CBE42,0xA7,0x2A,1, +0x8CBE3E,0xD3,0x3F,1, +0x8CBEE0,0xA3,0x03,0, +0x8CBEDE,0xD5,0x5F,0, +0x8CBEE2,0xE0,0x02,0, +0x3B8F38,0x20,0x17,1, +0x3B8F3A,0xD3,0x63,1, +0x3B8F40,0x20,0x17,0, +0x3B8F42,0xD3,0x63,0, +0x3D1094,0x46,0x1B,0, +0x3D109A,0x80,0x01,0, +0x3D1098,0xE0,0x01,0, +0x3D1096,0xE0,0x02,0, +0x3D1092,0xED,0x33,0, +0x3D1090,0xFA,0x67,0, +0x3D10D4,0x46,0x1B,1, +0x3D10DA,0x80,0x01,1, +0x3D10D8,0xE0,0x01,1, +0x3D10D6,0xE0,0x02,1, +0x3D10D2,0xED,0x33,1, +0x3D10D0,0xFA,0x67,1, +0x3D14D0,0xA3,0x03,0, +0x3D14D2,0xE0,0x02,0, +0x3D14CE,0xF6,0x5B,0, +0x3D14CC,0xF2,0x4B,0, +0x3D1510,0x40,0x03,1, +0x3D1512,0xA0,0x02,1, +0x3D150E,0xF6,0x5B,1, +0x3D150C,0xF2,0x4B,1, +0x3CE0F4,0x40,0x2A,1, +0x3CE0F2,0x42,0x2B,1, +0x3CE0F0,0xF0,0x3F,1, +0x3CE0D4,0x40,0x2A,0, +0x3CE0D2,0x42,0x2B,0, +0x3CE0D0,0xF0,0x3F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Orange.txt b/worlds/mlss/colors/Orange.txt new file mode 100644 index 000000000000..f3ba15f59b46 --- /dev/null +++ b/worlds/mlss/colors/Orange.txt @@ -0,0 +1,265 @@ +0x3CC884,0x7F,0x02,0, +0x3CC886,0x3C,0x02,0, +0x3CC8C4,0x7F,0x02,1, +0x3CC8C6,0x3C,0x02,1, +0x4F4CDC,0x7F,0x02,0, +0x4F4CDE,0x3C,0x02,0, +0x4F4D1C,0x7F,0x02,1, +0x4F4D1E,0x3C,0x02,1, +0x4F51D8,0x7F,0x02,1, +0x4F51DC,0x7F,0x02,0, +0x4F51E8,0xFE,0x42,0, +0x4F51EA,0xFE,0x42,1, +0x4F51DA,0x3E,0x43,1, +0x4F51DE,0x3E,0x43,0, +0x4FB686,0x7F,0x02,0, +0x4FB6A6,0x7F,0x02,1, +0x4FB684,0x95,0x01,0, +0x4FB6A4,0x95,0x01,1, +0x4FB688,0x5E,0x53,0, +0x4FB6A8,0x5E,0x53,1, +0x4FB786,0x7F,0x02,0, +0x4FB788,0x5E,0x53,0, +0x4FB78A,0x9D,0x6B,0, +0x4FB7A6,0x7F,0x02,1, +0x4FB7A8,0x5E,0x53,1, +0x4FB7AA,0x9D,0x6B,1, +0x51901C,0x7F,0x02,0, +0x519018,0x3C,0x01,0, +0x51901A,0x3C,0x02,0, +0x51903C,0x7F,0x02,1, +0x519038,0x3C,0x01,1, +0x51903A,0x3C,0x02,1, +0x5193EA,0x3C,0x02,0, +0x5193E8,0x7F,0x02,0, +0x51940A,0x3C,0x02,1, +0x519408,0x7F,0x02,1, +0x3A72AE,0x56,0x02,1, +0x3A7244,0x56,0x02,0, +0x3A724C,0xBA,0x02,1, +0x3A7290,0x98,0x02,0, +0x3A72B2,0x98,0x02,1, +0x3A7270,0x14,0x02,1, +0x3A7288,0x14,0x02,0, +0x3A7296,0xB9,0x02,0, +0x3A7274,0xB9,0x02,1, +0x3A7294,0xBA,0x02,0, +0x3A724A,0xDA,0x02,0, +0x3A7278,0xDA,0x02,1, +0x3A724E,0xFC,0x02,0, +0x3A727A,0xFC,0x02,1, +0x3A7252,0x3E,0x03,0, +0x3A727C,0x3E,0x03,1, +0x3A72BC,0x3E,0x03,1, +0x3A726C,0xD1,0x01,1, +0x3A7286,0xD1,0x01,0, +0x3A728C,0x35,0x02,0, +0x3A7272,0x35,0x02,1, +0x3A7254,0x5F,0x03,1, +0x3A7256,0x5F,0x03,0, +0x3A7264,0x5F,0x03,1, +0x9F9A58,0x76,0x3E,0, +0x9F9A5E,0x76,0x3E,1, +0x9F9A2A,0x7F,0x02,0, +0x9F9A30,0x7F,0x02,1, +0x9F9A36,0x7F,0x02,0, +0x9F9A3C,0x7F,0x02,1, +0x9F9A4A,0x7F,0x02,0, +0x9F9A50,0x7F,0x02,1, +0x9F9A56,0xB6,0x01,0, +0x9F9A5C,0xB6,0x01,1, +0x9F9A28,0x95,0x01,0, +0x9F9A2E,0x95,0x01,1, +0x9F9A48,0x95,0x01,0, +0x9F9A4E,0x95,0x01,1, +0x9F9A34,0x3C,0x02,0, +0x9F9A3A,0x3C,0x02,1, +0x9F9A2C,0x5E,0x53,0, +0x9F9A32,0x5E,0x53,1, +0x9F9A38,0x5E,0x53,0, +0x9F9A3E,0x5E,0x53,1, +0x9F9A4C,0x5E,0x53,0, +0x9F9A52,0x5E,0x53,1, +0xA5DD46,0x36,0x26,0, +0xA5DD44,0x8F,0x19,0, +0xA5DD4A,0x1F,0x37,0, +0xA5DD3E,0x6D,0x1D,0, +0xA5DD40,0xBF,0x5B,0, +0xA5DD42,0xDF,0x67,0, +0xA5DD48,0xBB,0x2E,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x36,0x26,1, +0xA5DD64,0x8F,0x19,1, +0xA5DD6A,0x1F,0x37,1, +0xA5DD5E,0x6D,0x1D,1, +0xA5DD60,0xBF,0x5B,1, +0xA5DD62,0xDF,0x67,1, +0xA5DD68,0xBB,0x2E,1, +0x3D0E0C,0x7F,0x02,1, +0x3D0E18,0x7F,0x02,0, +0x3D0E0A,0x3C,0x02,1, +0x3D0E1A,0x3C,0x02,0, +0x3D0E08,0x5E,0x53,1, +0x3D0E16,0x5E,0x53,0, +0x3CC9C4,0x7F,0x02,0, +0x3CC9C6,0x3C,0x02,0, +0x3CDE7C,0x7F,0x02,1, +0x3CDE7E,0x3C,0x02,1, +0x51AD2C,0x7F,0x02,0, +0x51AD2E,0x3C,0x02,0, +0x51AD4C,0x7F,0x02,1, +0x51AD4E,0x3C,0x02,1, +0x51A4AE,0x3C,0x02,0, +0x51A4AC,0x7F,0x02,0, +0x51A4CC,0x7F,0x02,1, +0x51A4CE,0x3C,0x02,1, +0x51A98C,0x7F,0x02,0, +0x51A98E,0x3C,0x02,0, +0x51A96C,0x7F,0x02,1, +0x51A96E,0x3C,0x02,1, +0x51AA00,0x3D,0x02,0, +0x51AA10,0x3D,0x02,1, +0x51AA02,0xB5,0x01,0, +0x51AA12,0xB5,0x01,1, +0x51A9FE,0x7F,0x02,0, +0x51AA0E,0x7F,0x02,1, +0x51AA0A,0x5E,0x4F,0, +0x3CC984,0x7F,0x02,0, +0x3CC986,0x3C,0x02,0, +0x3D4B52,0x3D,0x02,0, +0x3D4B5C,0xFA,0x01,0, +0x3D4B54,0x7F,0x02,0, +0x3D4B56,0x3C,0x02,0, +0x3D4B50,0x5E,0x53,0, +0x3CCA44,0x7F,0x02,1, +0x3CCA46,0x3C,0x02,1, +0x3CFB3C,0x7F,0x02,0, +0x3CFB3E,0x3C,0x02,0, +0x3CFB7C,0x7F,0x02,1, +0x3CFB7E,0x3C,0x02,1, +0x3D504C,0x3D,0x02,0, +0x3D504A,0x7F,0x02,0, +0x3D504E,0x3C,0x02,0, +0x3D508C,0x3D,0x02,1, +0x3D508A,0x7F,0x02,1, +0x3D508E,0x3C,0x02,1, +0xA5DDA2,0x36,0x26,0, +0xA5DDC2,0x36,0x26,1, +0xA5DDA6,0x1F,0x37,0, +0xA5DDC6,0x1F,0x37,1, +0xA5DDA4,0xBB,0x2E,0, +0xA5DDC4,0xBB,0x2E,1, +0xA5DDA8,0x5E,0x53,0, +0xA5DDC8,0x5E,0x53,1, +0x3D3E0C,0x7F,0x02,1, +0x3D3E10,0x7F,0x02,0, +0x3D3E0E,0x3C,0x02,1, +0x3D3E12,0x3C,0x02,0, +0x3CF1C0,0x7F,0x02,0, +0x3CF200,0x7F,0x02,1, +0x3CF1C2,0x3C,0x02,0, +0x3CF202,0x3C,0x02,1, +0x3D360E,0xBA,0x02,1, +0x3D3614,0xBA,0x02,0, +0x3D360C,0x3E,0x43,1, +0x3D3612,0x3E,0x43,0, +0x3D3604,0xBB,0x2E,0, +0x3D3606,0xBB,0x2E,1, +0x3D360A,0x5E,0x53,1, +0x3D3610,0x5E,0x53,0, +0x3D1A48,0x35,0x02,0, +0x3D1A46,0x5E,0x53,0, +0x3D1A44,0x5E,0x53,0, +0x3D1A4A,0xBB,0x2E,0, +0x3D1A88,0x35,0x02,1, +0x3D1A8A,0xDD,0xD4,1, +0x3D1A86,0x5E,0x53,1, +0x3D1A84,0x5E,0x53,1, +0x3CE282,0x3C,0x02,0, +0x3CE2C2,0x3C,0x02,1, +0x3CE280,0x5E,0x53,0, +0x3CE2C0,0x5E,0x53,1, +0x4FA29E,0x3C,0x02,0, +0x4FA2DE,0x3C,0x02,1, +0x4FA29C,0x5E,0x53,0, +0x4FA2DC,0x5E,0x53,1, +0x3D4786,0x5F,0x03,1, +0x3D478C,0x5F,0x03,0, +0x3D478E,0x98,0x02,0, +0x3D4788,0x98,0x02,1, +0x3D4790,0x98,0x02,0, +0x3D478A,0x3D,0x02,1, +0x3D4794,0xBB,0x2E,0, +0x3D4792,0x3D,0x02,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0x9D,0x6B,1, +0x3C9E40,0x9D,0x6B,0, +0x3C9E38,0x9D,0x6B,1, +0x3C9E3E,0x9D,0x6B,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0x7F,0x02,0, +0x4F4D5E,0x3C,0x02,0, +0x3C9320,0x7F,0x02,0, +0x3C9322,0x3C,0x02,0, +0x9F9CF6,0x7F,0x02,0, +0x9F9CF8,0x3C,0x02,0, +0x4F4E1C,0x7F,0x02,1, +0x4F4E1E,0x3C,0x02,1, +0x3C9450,0x7F,0x02,1, +0x3C9452,0x3C,0x02,1, +0x9F9D74,0x7F,0x02,1, +0x9F9D76,0x3C,0x02,1, +0xA6202E,0x36,0x26,0, +0xA62032,0x1F,0x37,0, +0xA62030,0xBB,0x2E,0, +0xA62034,0x5E,0x53,0, +0xA6204E,0x36,0x26,1, +0xA62052,0x1F,0x37,1, +0xA62050,0xBB,0x2E,1, +0xA62054,0x5E,0x53,1, +0x3D4812,0xBA,0x02,0, +0x3D480E,0xBA,0x02,1, +0x3D4810,0x5E,0x53,0, +0x3D480C,0x5E,0x53,1, +0x3CC9FE,0x7F,0x02,0, +0x3CCA0A,0x3C,0x02,0, +0x8CBE20,0x35,0x02,0, +0x8CBE22,0x3C,0x02,0, +0x8CBE1E,0x5E,0x4F,0, +0x8CBE40,0x35,0x02,1, +0x8CBE42,0x3C,0x02,1, +0x8CBE3E,0x5E,0x4F,1, +0x8CBEE0,0x7F,0x02,0, +0x8CBEDE,0xDF,0x67,0, +0x8CBEE2,0x3C,0x02,0, +0x3B8F38,0x35,0x02,1, +0x3B8F3A,0xDF,0x67,1, +0x3B8F40,0x35,0x02,0, +0x3B8F42,0xDF,0x67,0, +0x3D1094,0x98,0x02,0, +0x3D109A,0x8F,0x19,0, +0x3D1098,0x3C,0x01,0, +0x3D1096,0x3C,0x02,0, +0x3D1092,0xDF,0x67,0, +0x3D1090,0x5E,0x53,0, +0x3D10D4,0x98,0x02,1, +0x3D10DA,0x8F,0x19,1, +0x3D10D8,0x3C,0x01,1, +0x3D10D6,0x3C,0x02,1, +0x3D10D2,0xDF,0x67,1, +0x3D10D0,0x5E,0x53,1, +0x3D14D0,0x7F,0x02,0, +0x3D14D2,0x3C,0x02,0, +0x3D14CE,0x5E,0x53,0, +0x3D14CC,0xFE,0x42,0, +0x3D1510,0xBA,0x02,1, +0x3D1512,0x3C,0x02,1, +0x3D150E,0x5E,0x53,1, +0x3D150C,0xFE,0x42,1, +0x3CE0F4,0x36,0x26,1, +0x3CE0F2,0x3D,0x02,1, +0x3CE0F0,0xFE,0x42,1, +0x3CE0D4,0x36,0x26,0, +0x3CE0D2,0x3D,0x02,0, +0x3CE0D0,0xFE,0x42,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Pink.txt b/worlds/mlss/colors/Pink.txt new file mode 100644 index 000000000000..b9901dea6f4a --- /dev/null +++ b/worlds/mlss/colors/Pink.txt @@ -0,0 +1,265 @@ +0x3CC884,0xDF,0x6E,0, +0x3CC886,0xFF,0x5D,0, +0x3CC8C4,0xDF,0x6E,1, +0x3CC8C6,0xFF,0x5D,1, +0x4F4CDC,0xDF,0x6E,0, +0x4F4CDE,0xFF,0x5D,0, +0x4F4D1C,0xDF,0x6E,1, +0x4F4D1E,0xFF,0x5D,1, +0x4F51D8,0xDF,0x6E,1, +0x4F51DC,0xDF,0x6E,0, +0x4F51E8,0x3C,0x6B,0, +0x4F51EA,0x3C,0x6B,1, +0x4F51DA,0x7F,0x77,1, +0x4F51DE,0x7F,0x77,0, +0x4FB686,0xDF,0x6E,0, +0x4FB6A6,0xDF,0x6E,1, +0x4FB684,0xD4,0x45,0, +0x4FB6A4,0xD4,0x45,1, +0x4FB688,0x7F,0x77,0, +0x4FB6A8,0x7F,0x77,1, +0x4FB786,0xDF,0x6E,0, +0x4FB788,0x7F,0x77,0, +0x4FB78A,0x9E,0x7F,0, +0x4FB7A6,0xDF,0x6E,1, +0x4FB7A8,0x7F,0x77,1, +0x4FB7AA,0x9E,0x7F,1, +0x51901C,0xDF,0x6E,0, +0x519018,0x3C,0x51,0, +0x51901A,0xDD,0x59,0, +0x51903C,0xDF,0x6E,1, +0x519038,0x3C,0x51,1, +0x51903A,0xDD,0x59,1, +0x5193EA,0xFF,0x5D,0, +0x5193E8,0xDF,0x6E,0, +0x51940A,0xFF,0x5D,1, +0x519408,0xDF,0x6E,1, +0x3A72AE,0x3C,0x5E,1, +0x3A7244,0x3C,0x5E,0, +0x3A724C,0x5E,0x66,1, +0x3A7290,0x3D,0x62,0, +0x3A72B2,0x3D,0x62,1, +0x3A7270,0xFA,0x55,1, +0x3A7288,0xFA,0x55,0, +0x3A7296,0x9E,0x6A,0, +0x3A7274,0x9E,0x6A,1, +0x3A7294,0x5E,0x66,0, +0x3A724A,0xDE,0x6A,0, +0x3A7278,0xDE,0x6A,1, +0x3A724E,0xFE,0x6E,0, +0x3A727A,0xFE,0x6E,1, +0x3A7252,0x3E,0x73,0, +0x3A727C,0x3E,0x73,1, +0x3A72BC,0x3E,0x73,1, +0x3A726C,0xD8,0x51,1, +0x3A7286,0xD8,0x51,0, +0x3A728C,0x1B,0x5A,0, +0x3A7272,0x1B,0x5A,1, +0x3A7254,0x9E,0x77,1, +0x3A7256,0x9E,0x77,0, +0x3A7264,0x9E,0x77,1, +0x9F9A58,0x75,0x52,0, +0x9F9A5E,0x75,0x52,1, +0x9F9A2A,0xDF,0x6E,0, +0x9F9A30,0xDF,0x6E,1, +0x9F9A36,0xDF,0x6E,0, +0x9F9A3C,0xDF,0x6E,1, +0x9F9A4A,0xDF,0x6E,0, +0x9F9A50,0xDF,0x6E,1, +0x9F9A56,0xD3,0x45,0, +0x9F9A5C,0xD3,0x45,1, +0x9F9A28,0xD4,0x45,0, +0x9F9A2E,0xD4,0x45,1, +0x9F9A48,0xD4,0x45,0, +0x9F9A4E,0xD4,0x45,1, +0x9F9A34,0xFF,0x5D,0, +0x9F9A3A,0xFF,0x5D,1, +0x9F9A2C,0x7F,0x77,0, +0x9F9A32,0x7F,0x77,1, +0x9F9A38,0x7F,0x77,0, +0x9F9A3E,0x7F,0x77,1, +0x9F9A4C,0x7F,0x77,0, +0x9F9A52,0x7F,0x77,1, +0xA5DD46,0xD5,0x49,0, +0xA5DD44,0x91,0x3D,0, +0xA5DD4A,0xBD,0x6A,0, +0xA5DD3E,0x31,0x39,0, +0xA5DD40,0x3D,0x73,0, +0xA5DD42,0x5F,0x77,0, +0xA5DD48,0x59,0x5A,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0xD5,0x49,1, +0xA5DD64,0x91,0x3D,1, +0xA5DD6A,0xBD,0x6A,1, +0xA5DD5E,0x31,0x39,1, +0xA5DD60,0x3D,0x73,1, +0xA5DD62,0x5F,0x77,1, +0xA5DD68,0x59,0x5A,1, +0x3D0E0C,0xDF,0x6E,1, +0x3D0E18,0xDF,0x6E,0, +0x3D0E0A,0xFF,0x5D,1, +0x3D0E1A,0xFF,0x5D,0, +0x3D0E08,0x7F,0x77,1, +0x3D0E16,0x7F,0x77,0, +0x3CC9C4,0xDF,0x6E,0, +0x3CC9C6,0xFF,0x5D,0, +0x3CDE7C,0xDF,0x6E,1, +0x3CDE7E,0xFF,0x5D,1, +0x51AD2C,0xDF,0x6E,0, +0x51AD2E,0xFF,0x5D,0, +0x51AD4C,0xDF,0x6E,1, +0x51AD4E,0xFF,0x5D,1, +0x51A4AE,0xFF,0x5D,0, +0x51A4AC,0xDF,0x6E,0, +0x51A4CC,0xDF,0x6E,1, +0x51A4CE,0xFF,0x5D,1, +0x51A98C,0xDF,0x6E,0, +0x51A98E,0xFF,0x5D,0, +0x51A96C,0xDF,0x6E,1, +0x51A96E,0xFF,0x5D,1, +0x51AA00,0xBD,0x6A,0, +0x51AA10,0xBD,0x6A,1, +0x51AA02,0xFF,0x5D,0, +0x51AA12,0xFF,0x5D,1, +0x51A9FE,0xDF,0x6E,0, +0x51AA0E,0xDF,0x6E,1, +0x51AA0A,0x5E,0x77,0, +0x3CC984,0xDF,0x6E,0, +0x3CC986,0xFF,0x5D,0, +0x3D4B52,0x7F,0x66,0, +0x3D4B5C,0xBC,0x55,0, +0x3D4B54,0xDF,0x6E,0, +0x3D4B56,0xFF,0x5D,0, +0x3D4B50,0x7F,0x77,0, +0x3CCA44,0xDF,0x6E,1, +0x3CCA46,0xFF,0x5D,1, +0x3CFB3C,0xDF,0x6E,0, +0x3CFB3E,0xFF,0x5D,0, +0x3CFB7C,0xDF,0x6E,1, +0x3CFB7E,0xFF,0x5D,1, +0x3D504C,0x9C,0x62,0, +0x3D504A,0xDF,0x6E,0, +0x3D504E,0xFF,0x5D,0, +0x3D508C,0x9C,0x62,1, +0x3D508A,0xDF,0x6E,1, +0x3D508E,0xFF,0x5D,1, +0xA5DDA2,0xD5,0x49,0, +0xA5DDC2,0xD5,0x49,1, +0xA5DDA6,0xBD,0x6A,0, +0xA5DDC6,0xBD,0x6A,1, +0xA5DDA4,0x59,0x5A,0, +0xA5DDC4,0x59,0x5A,1, +0xA5DDA8,0x3D,0x6F,0, +0xA5DDC8,0x3D,0x6F,1, +0x3D3E0C,0xDF,0x6E,1, +0x3D3E10,0xDF,0x6E,0, +0x3D3E0E,0xFF,0x5D,1, +0x3D3E12,0xFF,0x5D,0, +0x3CF1C0,0xDF,0x6E,0, +0x3CF200,0xDF,0x6E,1, +0x3CF1C2,0xFF,0x5D,0, +0x3CF202,0xFF,0x5D,1, +0x3D360E,0x5E,0x66,1, +0x3D3614,0x5E,0x66,0, +0x3D360C,0x7F,0x77,1, +0x3D3612,0x7F,0x77,0, +0x3D3604,0x59,0x5A,0, +0x3D3606,0x59,0x5A,1, +0x3D360A,0x7F,0x77,1, +0x3D3610,0x7F,0x77,0, +0x3D1A48,0x1B,0x5A,0, +0x3D1A46,0x7F,0x77,0, +0x3D1A44,0x7F,0x77,0, +0x3D1A4A,0x59,0x5A,0, +0x3D1A88,0x1B,0x5A,1, +0x3D1A8A,0xCC,0xC8,1, +0x3D1A86,0x7F,0x77,1, +0x3D1A84,0x7F,0x77,1, +0x3CE282,0xFF,0x5D,0, +0x3CE2C2,0xFF,0x5D,1, +0x3CE280,0x7F,0x77,0, +0x3CE2C0,0x7F,0x77,1, +0x4FA29E,0xFF,0x5D,0, +0x4FA2DE,0xFF,0x5D,1, +0x4FA29C,0x7F,0x77,0, +0x4FA2DC,0x7F,0x77,1, +0x3D4786,0x9E,0x77,1, +0x3D478C,0x9E,0x77,0, +0x3D478E,0x3D,0x62,0, +0x3D4788,0x3D,0x62,1, +0x3D4790,0x3D,0x62,0, +0x3D478A,0x9C,0x62,1, +0x3D4794,0x59,0x5A,0, +0x3D4792,0x9C,0x62,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0x9E,0x7F,1, +0x3C9E40,0x9E,0x7F,0, +0x3C9E38,0x9E,0x7F,1, +0x3C9E3E,0x9E,0x7F,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0xDF,0x6E,0, +0x4F4D5E,0xFF,0x5D,0, +0x3C9320,0xDF,0x6E,0, +0x3C9322,0xFF,0x5D,0, +0x9F9CF6,0xDF,0x6E,0, +0x9F9CF8,0xFF,0x5D,0, +0x4F4E1C,0xDF,0x6E,1, +0x4F4E1E,0xFF,0x5D,1, +0x3C9450,0xDF,0x6E,1, +0x3C9452,0xFF,0x5D,1, +0x9F9D74,0xDF,0x6E,1, +0x9F9D76,0xFF,0x5D,1, +0xA6202E,0xD5,0x49,0, +0xA62032,0xBD,0x6A,0, +0xA62030,0x59,0x5A,0, +0xA62034,0x3D,0x6F,0, +0xA6204E,0xD5,0x49,1, +0xA62052,0xBD,0x6A,1, +0xA62050,0x59,0x5A,1, +0xA62054,0x3D,0x6F,1, +0x3D4812,0x5E,0x66,0, +0x3D480E,0x5E,0x66,1, +0x3D4810,0x7F,0x77,0, +0x3D480C,0x7F,0x77,1, +0x3CC9FE,0xDF,0x6E,0, +0x3CCA0A,0xFF,0x5D,0, +0x8CBE20,0x1B,0x5A,0, +0x8CBE22,0xFF,0x5D,0, +0x8CBE1E,0x5E,0x77,0, +0x8CBE40,0x1B,0x5A,1, +0x8CBE42,0xFF,0x5D,1, +0x8CBE3E,0x5E,0x77,1, +0x8CBEE0,0xDF,0x6E,0, +0x8CBEDE,0x5F,0x77,0, +0x8CBEE2,0xFF,0x5D,0, +0x3B8F38,0x1B,0x5A,1, +0x3B8F3A,0x5F,0x77,1, +0x3B8F40,0x1B,0x5A,0, +0x3B8F42,0x5F,0x77,0, +0x3D1094,0x3D,0x62,0, +0x3D109A,0x91,0x3D,0, +0x3D1098,0x3C,0x51,0, +0x3D1096,0xDD,0x59,0, +0x3D1092,0x5F,0x77,0, +0x3D1090,0x7F,0x77,0, +0x3D10D4,0x3D,0x62,1, +0x3D10DA,0x91,0x3D,1, +0x3D10D8,0x3C,0x51,1, +0x3D10D6,0xDD,0x59,1, +0x3D10D2,0x5F,0x77,1, +0x3D10D0,0x7F,0x77,1, +0x3D14D0,0xDF,0x6E,0, +0x3D14D2,0xFF,0x5D,0, +0x3D14CE,0x7F,0x77,0, +0x3D14CC,0x3C,0x6B,0, +0x3D1510,0x5E,0x66,1, +0x3D1512,0xFF,0x5D,1, +0x3D150E,0x7F,0x77,1, +0x3D150C,0x3C,0x6B,1, +0x3CE0F4,0xD5,0x49,1, +0x3CE0F2,0xBD,0x6A,1, +0x3CE0F0,0x3C,0x6B,1, +0x3CE0D4,0xD5,0x49,0, +0x3CE0D2,0xBD,0x6A,0, +0x3CE0D0,0x3C,0x6B,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Purple.txt b/worlds/mlss/colors/Purple.txt new file mode 100644 index 000000000000..846290bc33f2 --- /dev/null +++ b/worlds/mlss/colors/Purple.txt @@ -0,0 +1,265 @@ +0x3CC884,0x10,0x7C,0, +0x3CC886,0x0B,0x5C,0, +0x3CC8C4,0x10,0x7C,1, +0x3CC8C6,0x0B,0x5C,1, +0x4F4CDC,0x10,0x7C,0, +0x4F4CDE,0x0B,0x5C,0, +0x4F4D1C,0x10,0x7C,1, +0x4F4D1E,0x0B,0x5C,1, +0x4F51D8,0x10,0x7C,1, +0x4F51DC,0x10,0x7C,0, +0x4F51E8,0x98,0x6E,0, +0x4F51EA,0x98,0x6E,1, +0x4F51DA,0xFB,0x7A,1, +0x4F51DE,0xFB,0x7A,0, +0x4FB686,0x10,0x7C,0, +0x4FB6A6,0x10,0x7C,1, +0x4FB684,0x05,0x28,0, +0x4FB6A4,0x05,0x28,1, +0x4FB688,0xFB,0x7A,0, +0x4FB6A8,0xFB,0x7A,1, +0x4FB786,0x10,0x7C,0, +0x4FB788,0xFB,0x7A,0, +0x4FB78A,0x9E,0x7F,0, +0x4FB7A6,0x10,0x7C,1, +0x4FB7A8,0xFB,0x7A,1, +0x4FB7AA,0x9E,0x7F,1, +0x51901C,0x10,0x7C,0, +0x519018,0x05,0x39,0, +0x51901A,0x0F,0x5C,0, +0x51903C,0x10,0x7C,1, +0x519038,0x05,0x39,1, +0x51903A,0x0F,0x5C,1, +0x5193EA,0x0B,0x5C,0, +0x5193E8,0x10,0x7C,0, +0x51940A,0x0B,0x5C,1, +0x519408,0x10,0x7C,1, +0x3A72AE,0xB4,0x51,1, +0x3A7244,0xB4,0x51,0, +0x3A724C,0xF6,0x59,1, +0x3A7290,0xF6,0x59,0, +0x3A72B2,0x36,0x5A,1, +0x3A7270,0xF4,0x50,1, +0x3A7288,0xF4,0x50,0, +0x3A7296,0x79,0x66,0, +0x3A7274,0x79,0x66,1, +0x3A7294,0x36,0x5A,0, +0x3A724A,0x99,0x66,0, +0x3A7278,0x99,0x66,1, +0x3A724E,0xB9,0x66,0, +0x3A727A,0xB9,0x66,1, +0x3A7252,0x19,0x67,0, +0x3A727C,0x19,0x67,1, +0x3A72BC,0x19,0x67,1, +0x3A726C,0x54,0x50,1, +0x3A7286,0x54,0x50,0, +0x3A728C,0x74,0x51,0, +0x3A7272,0x74,0x51,1, +0x3A7254,0x5C,0x73,1, +0x3A7256,0x5C,0x73,0, +0x3A7264,0x5C,0x73,1, +0x9F9A58,0xF2,0x51,0, +0x9F9A5E,0xF2,0x51,1, +0x9F9A2A,0x10,0x7C,0, +0x9F9A30,0x10,0x7C,1, +0x9F9A36,0x10,0x7C,0, +0x9F9A3C,0x10,0x7C,1, +0x9F9A4A,0x10,0x7C,0, +0x9F9A50,0x10,0x7C,1, +0x9F9A56,0x06,0x34,0, +0x9F9A5C,0x06,0x34,1, +0x9F9A28,0x05,0x28,0, +0x9F9A2E,0x05,0x28,1, +0x9F9A48,0x05,0x28,0, +0x9F9A4E,0x05,0x28,1, +0x9F9A34,0x0F,0x5C,0, +0x9F9A3A,0x0F,0x5C,1, +0x9F9A2C,0xFB,0x7A,0, +0x9F9A32,0xFB,0x7A,1, +0x9F9A38,0xFB,0x7A,0, +0x9F9A3E,0xFB,0x7A,1, +0x9F9A4C,0xFB,0x7A,0, +0x9F9A52,0xFB,0x7A,1, +0xA5DD46,0x8A,0x3C,0, +0xA5DD44,0x66,0x28,0, +0xA5DD4A,0x32,0x71,0, +0xA5DD3E,0x4C,0x39,0, +0xA5DD40,0x34,0x62,0, +0xA5DD42,0x77,0x72,0, +0xA5DD48,0xED,0x50,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x8A,0x3C,1, +0xA5DD64,0x66,0x28,1, +0xA5DD6A,0x32,0x71,1, +0xA5DD5E,0x4C,0x39,1, +0xA5DD60,0x34,0x62,1, +0xA5DD62,0x77,0x72,1, +0xA5DD68,0xED,0x50,1, +0x3D0E0C,0x10,0x7C,1, +0x3D0E18,0x10,0x7C,0, +0x3D0E0A,0x0B,0x5C,1, +0x3D0E1A,0x0B,0x5C,0, +0x3D0E08,0xFB,0x7A,1, +0x3D0E16,0xFB,0x7A,0, +0x3CC9C4,0x10,0x7C,0, +0x3CC9C6,0x0B,0x5C,0, +0x3CDE7C,0x10,0x7C,1, +0x3CDE7E,0x0B,0x5C,1, +0x51AD2C,0x10,0x7C,0, +0x51AD2E,0x0B,0x5C,0, +0x51AD4C,0x10,0x7C,1, +0x51AD4E,0x0B,0x5C,1, +0x51A4AE,0x0B,0x5C,0, +0x51A4AC,0x10,0x7C,0, +0x51A4CC,0x10,0x7C,1, +0x51A4CE,0x0B,0x5C,1, +0x51A98C,0x10,0x7C,0, +0x51A98E,0x0B,0x5C,0, +0x51A96C,0x10,0x7C,1, +0x51A96E,0x0B,0x5C,1, +0x51AA00,0x0B,0x64,0, +0x51AA10,0x0B,0x64,1, +0x51AA02,0x0B,0x5C,0, +0x51AA12,0x0B,0x5C,1, +0x51A9FE,0x10,0x7C,0, +0x51AA0E,0x10,0x7C,1, +0x51AA0A,0xF7,0x79,0, +0x3CC984,0x10,0x7C,0, +0x3CC986,0x0B,0x5C,0, +0x3D4B52,0x0E,0x70,0, +0x3D4B5C,0x09,0x50,0, +0x3D4B54,0x10,0x7C,0, +0x3D4B56,0x0B,0x5C,0, +0x3D4B50,0xFB,0x7A,0, +0x3CCA44,0x10,0x7C,1, +0x3CCA46,0x0B,0x5C,1, +0x3CFB3C,0x10,0x7C,0, +0x3CFB3E,0x0B,0x5C,0, +0x3CFB7C,0x10,0x7C,1, +0x3CFB7E,0x0B,0x5C,1, +0x3D504C,0x0C,0x64,0, +0x3D504A,0x10,0x7C,0, +0x3D504E,0x0B,0x5C,0, +0x3D508C,0x0C,0x64,1, +0x3D508A,0x10,0x7C,1, +0x3D508E,0x0B,0x5C,1, +0xA5DDA2,0x8A,0x3C,0, +0xA5DDC2,0x8A,0x3C,1, +0xA5DDA6,0x32,0x71,0, +0xA5DDC6,0x32,0x71,1, +0xA5DDA4,0xED,0x50,0, +0xA5DDC4,0xED,0x50,1, +0xA5DDA8,0xFB,0x7A,0, +0xA5DDC8,0xFB,0x7A,1, +0x3D3E0C,0x10,0x7C,1, +0x3D3E10,0x10,0x7C,0, +0x3D3E0E,0x0B,0x5C,1, +0x3D3E12,0x0B,0x5C,0, +0x3CF1C0,0x10,0x7C,0, +0x3CF200,0x10,0x7C,1, +0x3CF1C2,0x0B,0x5C,0, +0x3CF202,0x0B,0x5C,1, +0x3D360E,0xF6,0x59,1, +0x3D3614,0xF6,0x59,0, +0x3D360C,0xFB,0x7A,1, +0x3D3612,0xFB,0x7A,0, +0x3D3604,0xED,0x50,0, +0x3D3606,0xED,0x50,1, +0x3D360A,0xFB,0x7A,1, +0x3D3610,0xFB,0x7A,0, +0x3D1A48,0x74,0x51,0, +0x3D1A46,0xFB,0x7A,0, +0x3D1A44,0xFB,0x7A,0, +0x3D1A4A,0xED,0x50,0, +0x3D1A88,0x74,0x51,1, +0x3D1A8A,0xAA,0xA4,1, +0x3D1A86,0xFB,0x7A,1, +0x3D1A84,0xFB,0x7A,1, +0x3CE282,0x0B,0x5C,0, +0x3CE2C2,0x0B,0x5C,1, +0x3CE280,0xFB,0x7A,0, +0x3CE2C0,0xFB,0x7A,1, +0x4FA29E,0x0B,0x5C,0, +0x4FA2DE,0x0B,0x5C,1, +0x4FA29C,0xFB,0x7A,0, +0x4FA2DC,0xFB,0x7A,1, +0x3D4786,0x5C,0x73,1, +0x3D478C,0x5C,0x73,0, +0x3D478E,0xF6,0x59,0, +0x3D4788,0xF6,0x59,1, +0x3D4790,0xF6,0x59,0, +0x3D478A,0x0C,0x64,1, +0x3D4794,0xED,0x50,0, +0x3D4792,0x0C,0x64,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0x9E,0x7F,1, +0x3C9E40,0x9E,0x7F,0, +0x3C9E38,0x9E,0x7F,1, +0x3C9E3E,0x9E,0x7F,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0x10,0x7C,0, +0x4F4D5E,0x0B,0x5C,0, +0x3C9320,0x10,0x7C,0, +0x3C9322,0x0B,0x5C,0, +0x9F9CF6,0x10,0x7C,0, +0x9F9CF8,0x0B,0x5C,0, +0x4F4E1C,0x10,0x7C,1, +0x4F4E1E,0x0B,0x5C,1, +0x3C9450,0x10,0x7C,1, +0x3C9452,0x0B,0x5C,1, +0x9F9D74,0x10,0x7C,1, +0x9F9D76,0x0B,0x5C,1, +0xA6202E,0x8A,0x3C,0, +0xA62032,0x32,0x71,0, +0xA62030,0xED,0x50,0, +0xA62034,0xFB,0x7A,0, +0xA6204E,0x8A,0x3C,1, +0xA62052,0x32,0x71,1, +0xA62050,0xED,0x50,1, +0xA62054,0xFB,0x7A,1, +0x3D4812,0xF6,0x59,0, +0x3D480E,0xF6,0x59,1, +0x3D4810,0xFB,0x7A,0, +0x3D480C,0xFB,0x7A,1, +0x3CC9FE,0x10,0x7C,0, +0x3CCA0A,0x0B,0x5C,0, +0x8CBE20,0x74,0x51,0, +0x8CBE22,0x0B,0x5C,0, +0x8CBE1E,0xF7,0x79,0, +0x8CBE40,0x74,0x51,1, +0x8CBE42,0x0B,0x5C,1, +0x8CBE3E,0xF7,0x79,1, +0x8CBEE0,0x10,0x7C,0, +0x8CBEDE,0x77,0x72,0, +0x8CBEE2,0x0B,0x5C,0, +0x3B8F38,0x74,0x51,1, +0x3B8F3A,0x77,0x72,1, +0x3B8F40,0x74,0x51,0, +0x3B8F42,0x77,0x72,0, +0x3D1094,0xF6,0x59,0, +0x3D109A,0x66,0x28,0, +0x3D1098,0x05,0x39,0, +0x3D1096,0x0F,0x5C,0, +0x3D1092,0x77,0x72,0, +0x3D1090,0xFB,0x7A,0, +0x3D10D4,0xF6,0x59,1, +0x3D10DA,0x66,0x28,1, +0x3D10D8,0x05,0x39,1, +0x3D10D6,0x0F,0x5C,1, +0x3D10D2,0x77,0x72,1, +0x3D10D0,0xFB,0x7A,1, +0x3D14D0,0x10,0x7C,0, +0x3D14D2,0x0B,0x5C,0, +0x3D14CE,0xFB,0x7A,0, +0x3D14CC,0x98,0x6E,0, +0x3D1510,0xF6,0x59,1, +0x3D1512,0x0B,0x5C,1, +0x3D150E,0xFB,0x7A,1, +0x3D150C,0x98,0x6E,1, +0x3CE0F4,0x8A,0x3C,1, +0x3CE0F2,0x0B,0x64,1, +0x3CE0F0,0x98,0x6E,1, +0x3CE0D4,0x8A,0x3C,0, +0x3CE0D2,0x0B,0x64,0, +0x3CE0D0,0x98,0x6E,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Red.txt b/worlds/mlss/colors/Red.txt new file mode 100644 index 000000000000..c16fe150886c --- /dev/null +++ b/worlds/mlss/colors/Red.txt @@ -0,0 +1,265 @@ +0x3CC884,0x3F,0x04,0, +0x3CC886,0x17,0x00,0, +0x3CC8C4,0x3F,0x04,1, +0x3CC8C6,0x17,0x00,1, +0x4F4CDC,0x3F,0x04,0, +0x4F4CDE,0x17,0x00,0, +0x4F4D1C,0x3F,0x04,1, +0x4F4D1E,0x17,0x00,1, +0x4F51D8,0x3F,0x04,1, +0x4F51DC,0x3F,0x04,0, +0x4F51E8,0x1D,0x3A,0, +0x4F51EA,0x1D,0x3A,1, +0x4F51DA,0x5F,0x42,1, +0x4F51DE,0x5F,0x42,0, +0x4FB686,0x3F,0x04,0, +0x4FB6A6,0x3F,0x04,1, +0x4FB684,0x0F,0x00,0, +0x4FB6A4,0x0F,0x00,1, +0x4FB688,0x5F,0x42,0, +0x4FB6A8,0x5F,0x42,1, +0x4FB786,0x3F,0x04,0, +0x4FB788,0x5F,0x42,0, +0x4FB78A,0xDF,0x52,0, +0x4FB7A6,0x3F,0x04,1, +0x4FB7A8,0x5F,0x42,1, +0x4FB7AA,0xDF,0x52,1, +0x51901C,0x3F,0x04,0, +0x519018,0xD0,0x00,0, +0x51901A,0x19,0x00,0, +0x51903C,0x3F,0x04,1, +0x519038,0xD0,0x00,1, +0x51903A,0x19,0x00,1, +0x5193EA,0x17,0x00,0, +0x5193E8,0x3F,0x04,0, +0x51940A,0x17,0x00,1, +0x519408,0x3F,0x04,1, +0x3A72AE,0x7D,0x21,1, +0x3A7244,0x9A,0x29,0, +0x3A724C,0xDE,0x21,1, +0x3A7290,0x7D,0x21,0, +0x3A72B2,0xDE,0x21,1, +0x3A7270,0x16,0x1D,1, +0x3A7288,0x16,0x1D,0, +0x3A7296,0x3F,0x22,0, +0x3A7274,0xDE,0x21,1, +0x3A7294,0xDE,0x21,0, +0x3A724A,0x5F,0x22,0, +0x3A7278,0x5F,0x22,1, +0x3A724E,0xDF,0x22,0, +0x3A727A,0xDF,0x22,1, +0x3A7252,0x3F,0x1F,0, +0x3A727C,0x3F,0x1F,1, +0x3A72BC,0x3F,0x1F,1, +0x3A726C,0x10,0x1D,1, +0x3A7286,0x10,0x1D,0, +0x3A728C,0x3C,0x1D,0, +0x3A7272,0x9A,0x29,1, +0x3A7254,0x9F,0x23,1, +0x3A7256,0x9F,0x23,0, +0x3A7264,0x9F,0x23,1, +0x9F9A58,0x71,0x29,0, +0x9F9A5E,0x71,0x29,1, +0x9F9A2A,0x3F,0x04,0, +0x9F9A30,0x3F,0x04,1, +0x9F9A36,0x3F,0x04,0, +0x9F9A3C,0x3F,0x04,1, +0x9F9A4A,0x3F,0x04,0, +0x9F9A50,0x3F,0x04,1, +0x9F9A56,0x30,0x04,0, +0x9F9A5C,0x30,0x04,1, +0x9F9A28,0x0F,0x00,0, +0x9F9A2E,0x0F,0x00,1, +0x9F9A48,0x0F,0x00,0, +0x9F9A4E,0x0F,0x00,1, +0x9F9A34,0x17,0x00,0, +0x9F9A3A,0x17,0x00,1, +0x9F9A2C,0x5F,0x42,0, +0x9F9A32,0x5F,0x42,1, +0x9F9A38,0x5F,0x42,0, +0x9F9A3E,0x5F,0x42,1, +0x9F9A4C,0x5F,0x42,0, +0x9F9A52,0x5F,0x42,1, +0xA5DD46,0x13,0x00,0, +0xA5DD44,0x0F,0x00,0, +0xA5DD4A,0x7F,0x0C,0, +0xA5DD3E,0x30,0x21,0, +0xA5DD40,0xDF,0x35,0, +0xA5DD42,0x9F,0x4A,0, +0xA5DD48,0x59,0x08,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x13,0x00,1, +0xA5DD64,0x0F,0x00,1, +0xA5DD6A,0x7F,0x0C,1, +0xA5DD5E,0x30,0x21,1, +0xA5DD60,0xDF,0x35,1, +0xA5DD62,0x9F,0x4A,1, +0xA5DD68,0x59,0x08,1, +0x3D0E0C,0x3F,0x04,1, +0x3D0E18,0x3F,0x04,0, +0x3D0E0A,0x17,0x00,1, +0x3D0E1A,0x17,0x00,0, +0x3D0E08,0x5F,0x42,1, +0x3D0E16,0x5F,0x42,0, +0x3CC9C4,0x3F,0x04,0, +0x3CC9C6,0x17,0x00,0, +0x3CDE7C,0x3F,0x04,1, +0x3CDE7E,0x17,0x00,1, +0x51AD2C,0x3F,0x04,0, +0x51AD2E,0x17,0x00,0, +0x51AD4C,0x3F,0x04,1, +0x51AD4E,0x17,0x00,1, +0x51A4AE,0x17,0x00,0, +0x51A4AC,0x3F,0x04,0, +0x51A4CC,0x3F,0x04,1, +0x51A4CE,0x17,0x00,1, +0x51A98C,0x3F,0x04,0, +0x51A98E,0x17,0x00,0, +0x51A96C,0x3F,0x04,1, +0x51A96E,0x17,0x00,1, +0x51AA00,0x3A,0x04,0, +0x51AA10,0x3A,0x04,1, +0x51AA02,0x12,0x00,0, +0x51AA12,0x12,0x00,1, +0x51A9FE,0x1F,0x0D,0, +0x51AA0E,0x1F,0x0D,1, +0x51AA0A,0xFF,0x26,0, +0x3CC984,0x3F,0x04,0, +0x3CC986,0x17,0x00,0, +0x3D4B52,0x1D,0x00,0, +0x3D4B5C,0x13,0x00,0, +0x3D4B54,0x3F,0x04,0, +0x3D4B56,0x17,0x00,0, +0x3D4B50,0xBF,0x56,0, +0x3CCA44,0x3F,0x04,1, +0x3CCA46,0x17,0x00,1, +0x3CFB3C,0x3F,0x04,0, +0x3CFB3E,0x17,0x00,0, +0x3CFB7C,0x3F,0x04,1, +0x3CFB7E,0x17,0x00,1, +0x3D504C,0x1B,0x00,0, +0x3D504A,0x3F,0x04,0, +0x3D504E,0x17,0x00,0, +0x3D508C,0x1B,0x00,1, +0x3D508A,0x3F,0x04,1, +0x3D508E,0x17,0x00,1, +0xA5DDA2,0x13,0x00,0, +0xA5DDC2,0x13,0x00,1, +0xA5DDA6,0x7F,0x0C,0, +0xA5DDC6,0x7F,0x0C,1, +0xA5DDA4,0x59,0x08,0, +0xA5DDC4,0x59,0x08,1, +0xA5DDA8,0x3F,0x5B,0, +0xA5DDC8,0x3F,0x5B,1, +0x3D3E0C,0x3F,0x04,1, +0x3D3E10,0x3F,0x04,0, +0x3D3E0E,0x17,0x00,1, +0x3D3E12,0x17,0x00,0, +0x3CF1C0,0x3F,0x04,0, +0x3CF200,0x3F,0x04,1, +0x3CF1C2,0x17,0x00,0, +0x3CF202,0x17,0x00,1, +0x3D360E,0xDD,0x10,1, +0x3D3614,0xDD,0x10,0, +0x3D360C,0x3F,0x46,1, +0x3D3612,0x3F,0x46,0, +0x3D3604,0x76,0x00,0, +0x3D3606,0x76,0x00,1, +0x3D360A,0x5F,0x6B,1, +0x3D3610,0x5F,0x6B,0, +0x3D1A48,0x9D,0x31,0, +0x3D1A46,0xBF,0x56,0, +0x3D1A44,0x7F,0x6F,0, +0x3D1A4A,0xFA,0x1C,0, +0x3D1A88,0x9D,0x31,1, +0x3D1A8A,0xFA,0x1C,1, +0x3D1A86,0xBF,0x56,1, +0x3D1A84,0x7F,0x6F,1, +0x3CE282,0x18,0x00,0, +0x3CE2C2,0x18,0x00,1, +0x3CE280,0x1F,0x52,0, +0x3CE2C0,0x1F,0x52,1, +0x4FA29E,0x18,0x00,0, +0x4FA2DE,0x18,0x00,1, +0x4FA29C,0x1F,0x52,0, +0x4FA2DC,0x1F,0x52,1, +0x3D4786,0x1F,0x03,1, +0x3D478C,0x9F,0x0B,0, +0x3D478E,0x1F,0x03,0, +0x3D4788,0x3F,0x25,1, +0x3D4790,0x3F,0x25,0, +0x3D478A,0x1A,0x00,1, +0x3D4794,0x50,0x08,0, +0x3D4792,0x1A,0x00,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0xDF,0x5A,1, +0x3C9E40,0xDF,0x5A,0, +0x3C9E38,0x5F,0x6B,1, +0x3C9E3E,0x5F,0x6B,0, +0x3C9E36,0xDF,0x7B,1, +0x3C9E3C,0xDF,0x7B,0, +0x4F4D5C,0x3F,0x04,0, +0x4F4D5E,0x17,0x00,0, +0x3C9320,0x3F,0x04,0, +0x3C9322,0x17,0x00,0, +0x9F9CF6,0x3F,0x04,0, +0x9F9CF8,0x17,0x00,0, +0x4F4E1C,0x3F,0x04,1, +0x4F4E1E,0x17,0x00,1, +0x3C9450,0x3F,0x04,1, +0x3C9452,0x17,0x00,1, +0x9F9D74,0x3F,0x04,1, +0x9F9D76,0x17,0x00,1, +0xA6202E,0x13,0x00,0, +0xA62032,0x7F,0x0C,0, +0xA62030,0x59,0x08,0, +0xA62034,0x3F,0x5B,0, +0xA6204E,0x13,0x00,1, +0xA62052,0x7F,0x0C,1, +0xA62050,0x59,0x08,1, +0xA62054,0x3F,0x5B,1, +0x3D4812,0xBD,0x14,0, +0x3D480E,0xBD,0x14,1, +0x3D4810,0xBF,0x35,0, +0x3D480C,0xBF,0x35,1, +0x3CC9FE,0x3F,0x04,0, +0x3CCA0A,0xF0,0x00,0, +0x8CBE20,0x9C,0x35,0, +0x8CBE22,0xF9,0x28,0, +0x8CBE1E,0xFF,0x3D,0, +0x8CBE40,0x9C,0x35,1, +0x8CBE42,0xF9,0x28,1, +0x8CBE3E,0xFF,0x3D,1, +0x8CBEE0,0x3F,0x04,0, +0x8CBEDE,0x7F,0x4E,0, +0x8CBEE2,0x17,0x00,0, +0x3B8F38,0x1F,0x20,1, +0x3B8F3A,0x1F,0x5A,1, +0x3B8F40,0x1F,0x20,0, +0x3B8F42,0x1F,0x5A,0, +0x3D1094,0x7C,0x2D,0, +0x3D109A,0x2F,0x00,0, +0x3D1098,0x36,0x04,0, +0x3D1096,0x7A,0x0C,0, +0x3D1092,0x7F,0x4E,0, +0x3D1090,0x9F,0x6F,0, +0x3D10D4,0x7C,0x2D,1, +0x3D10DA,0x2F,0x00,1, +0x3D10D8,0x36,0x04,1, +0x3D10D6,0x7A,0x0C,1, +0x3D10D2,0x7F,0x4E,1, +0x3D10D0,0x9F,0x6F,1, +0x3D14D0,0x3F,0x04,0, +0x3D14D2,0x17,0x00,0, +0x3D14CE,0x1F,0x3E,0, +0x3D14CC,0x1F,0x57,0, +0x3D1510,0xDE,0x21,1, +0x3D1512,0x17,0x00,1, +0x3D150E,0x1F,0x3E,1, +0x3D150C,0x1F,0x57,1, +0x3CE0F4,0x34,0x04,1, +0x3CE0F2,0x3A,0x04,1, +0x3CE0F0,0x1B,0x3E,1, +0x3CE0D4,0x34,0x04,0, +0x3CE0D2,0x3A,0x04,0, +0x3CE0D0,0x1B,0x3E,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Silhouette.txt b/worlds/mlss/colors/Silhouette.txt new file mode 100644 index 000000000000..5216a7863f7d --- /dev/null +++ b/worlds/mlss/colors/Silhouette.txt @@ -0,0 +1,812 @@ +0x3CC878,0xFF,0x7F,0, +0x3CC87A,0xFF,0x7F,0, +0x3CC87C,0xFF,0x7F,0, +0x3CC87E,0xFF,0x7F,0, +0x3CC880,0xFF,0x7F,0, +0x3CC882,0xFF,0x7F,0, +0x3CC884,0xFF,0x7F,0, +0x3CC886,0xFF,0x7F,0, +0x3CC888,0xFF,0x7F,0, +0x3CC88A,0xFF,0x7F,0, +0x3CC88C,0xFF,0x7F,0, +0x3CC88E,0xFF,0x7F,0, +0x3CC890,0xFF,0x7F,0, +0x3CC892,0xFF,0x7F,0, +0x3CC8B8,0xFF,0x7F,1, +0x3CC8BA,0xFF,0x7F,1, +0x3CC8BC,0xFF,0x7F,1, +0x3CC8BE,0xFF,0x7F,1, +0x3CC8C0,0xFF,0x7F,1, +0x3CC8C2,0xFF,0x7F,1, +0x3CC8C4,0xFF,0x7F,1, +0x3CC8C6,0xFF,0x7F,1, +0x3CC8C8,0xFF,0x7F,1, +0x3CC8CA,0xFF,0x7F,1, +0x3CC8CC,0xFF,0x7F,1, +0x3CC8CE,0xFF,0x7F,1, +0x3CC8D0,0xFF,0x7F,1, +0x3CC8D2,0xFF,0x7F,1, +0x4F4CD0,0xFF,0x7F,0, +0x4F4CD2,0xFF,0x7F,0, +0x4F4CD4,0xFF,0x7F,0, +0x4F4CD6,0xFF,0x7F,0, +0x4F4CD8,0xFF,0x7F,0, +0x4F4CDA,0xFF,0x7F,0, +0x4F4CDC,0xFF,0x7F,0, +0x4F4CDE,0xFF,0x7F,0, +0x4F4CE0,0xFF,0x7F,0, +0x4F4CE2,0xFF,0x7F,0, +0x4F4CE4,0xFF,0x7F,0, +0x4F4CE6,0xFF,0x7F,0, +0x4F4CE8,0xFF,0x7F,0, +0x4F4CEA,0xFF,0x7F,0, +0x4F4D10,0xFF,0x7F,1, +0x4F4D12,0xFF,0x7F,1, +0x4F4D14,0xFF,0x7F,1, +0x4F4D16,0xFF,0x7F,1, +0x4F4D18,0xFF,0x7F,1, +0x4F4D1A,0xFF,0x7F,1, +0x4F4D1C,0xFF,0x7F,1, +0x4F4D1E,0xFF,0x7F,1, +0x4F4D20,0xFF,0x7F,1, +0x4F4D22,0xFF,0x7F,1, +0x4F4D24,0xFF,0x7F,1, +0x4F4D26,0xFF,0x7F,1, +0x4F4D28,0xFF,0x7F,1, +0x4F4D2A,0xFF,0x7F,1, +0x4F51D8,0xFF,0x7F,1, +0x4F51DA,0xFF,0x7F,1, +0x4F51DC,0xFF,0x7F,0, +0x4F51DE,0xFF,0x7F,0, +0x4F51E8,0xFF,0x7F,0, +0x4F51EA,0xFF,0x7F,1, +0x4FB684,0xFF,0x7F,0, +0x4FB686,0xFF,0x7F,0, +0x4FB688,0xFF,0x7F,0, +0x4FB6A4,0xFF,0x7F,1, +0x4FB6A6,0xFF,0x7F,1, +0x4FB6A8,0xFF,0x7F,1, +0x4FB692,0xFF,0x7F,0, +0x4FB6B2,0xFF,0x7F,1, +0x4FB786,0xFF,0x7F,0, +0x4FB788,0xFF,0x7F,0, +0x4FB78A,0xFF,0x7F,0, +0x4FB7A6,0xFF,0x7F,1, +0x4FB7A8,0xFF,0x7F,1, +0x4FB7AA,0xFF,0x7F,1, +0x519006,0xFF,0x7F,0, +0x519008,0xFF,0x7F,0, +0x51900C,0xFF,0x7F,0, +0x51900E,0xFF,0x7F,0, +0x519010,0xFF,0x7F,0, +0x519012,0xFF,0x7F,0, +0x519014,0xFF,0x7F,0, +0x519016,0xFF,0x7F,0, +0x519018,0xFF,0x7F,0, +0x51901A,0xFF,0x7F,0, +0x51901C,0xFF,0x7F,0, +0x51901E,0xFF,0x7F,0, +0x519020,0xFF,0x7F,0, +0x519022,0xFF,0x7F,0, +0x519026,0xFF,0x7F,1, +0x519028,0xFF,0x7F,1, +0x51902C,0xFF,0x7F,1, +0x51902E,0xFF,0x7F,1, +0x519030,0xFF,0x7F,1, +0x519032,0xFF,0x7F,1, +0x519034,0xFF,0x7F,1, +0x519036,0xFF,0x7F,1, +0x519038,0xFF,0x7F,1, +0x51903A,0xFF,0x7F,1, +0x51903C,0xFF,0x7F,1, +0x51903E,0xFF,0x7F,1, +0x519040,0xFF,0x7F,1, +0x519042,0xFF,0x7F,1, +0x5193D2,0xFF,0x7F,0, +0x5193D4,0xFF,0x7F,0, +0x5193D6,0xFF,0x7F,0, +0x5193D8,0xFF,0x7F,0, +0x5193DA,0xFF,0x7F,0, +0x5193DC,0xFF,0x7F,0, +0x5193DE,0xFF,0x7F,0, +0x5193E0,0xFF,0x7F,0, +0x5193E2,0xFF,0x7F,0, +0x5193E4,0xFF,0x7F,0, +0x5193E6,0xFF,0x7F,0, +0x5193E8,0xFF,0x7F,0, +0x5193EA,0xFF,0x7F,0, +0x5193EC,0xFF,0x7F,0, +0x5193F2,0xFF,0x7F,1, +0x5193F4,0xFF,0x7F,1, +0x5193F6,0xFF,0x7F,1, +0x5193F8,0xFF,0x7F,1, +0x5193FA,0xFF,0x7F,1, +0x5193FC,0xFF,0x7F,1, +0x5193FE,0xFF,0x7F,1, +0x519400,0xFF,0x7F,1, +0x519402,0xFF,0x7F,1, +0x519404,0xFF,0x7F,1, +0x519406,0xFF,0x7F,1, +0x519408,0xFF,0x7F,1, +0x51940A,0xFF,0x7F,1, +0x51940C,0xFF,0x7F,1, +0x3A7244,0xFF,0x7F,0, +0x3A724A,0xFF,0x7F,0, +0x3A724C,0xFF,0x7F,1, +0x3A724E,0xFF,0x7F,0, +0x3A7252,0xFF,0x7F,0, +0x3A7254,0xFF,0x7F,1, +0x3A7256,0xFF,0x7F,0, +0x3A7264,0xFF,0x7F,1, +0x3A726C,0xFF,0x7F,1, +0x3A7270,0xFF,0x7F,1, +0x3A7272,0xFF,0x7F,1, +0x3A7274,0xFF,0x7F,1, +0x3A7278,0xFF,0x7F,1, +0x3A727A,0xFF,0x7F,1, +0x3A727C,0xFF,0x7F,1, +0x3A7286,0xFF,0x7F,0, +0x3A7288,0xFF,0x7F,0, +0x3A728C,0xFF,0x7F,0, +0x3A7290,0xFF,0x7F,0, +0x3A7294,0xFF,0x7F,0, +0x3A7296,0xFF,0x7F,0, +0x3A72AE,0xFF,0x7F,1, +0x3A72B2,0xFF,0x7F,1, +0x3A72BC,0xFF,0x7F,1, +0x9F9A28,0xFF,0x7F,0, +0x9F9A2A,0xFF,0x7F,0, +0x9F9A2C,0xFF,0x7F,0, +0x9F9A2E,0xFF,0x7F,1, +0x9F9A30,0xFF,0x7F,1, +0x9F9A32,0xFF,0x7F,1, +0x9F9A34,0xFF,0x7F,0, +0x9F9A36,0xFF,0x7F,0, +0x9F9A38,0xFF,0x7F,0, +0x9F9A3A,0xFF,0x7F,1, +0x9F9A3C,0xFF,0x7F,1, +0x9F9A3E,0xFF,0x7F,1, +0x9F9A48,0xFF,0x7F,0, +0x9F9A4A,0xFF,0x7F,0, +0x9F9A4C,0xFF,0x7F,0, +0x9F9A4E,0xFF,0x7F,1, +0x9F9A50,0xFF,0x7F,1, +0x9F9A52,0xFF,0x7F,1, +0x9F9A56,0xFF,0x7F,0, +0x9F9A58,0xFF,0x7F,0, +0x9F9A5C,0xFF,0x7F,1, +0x9F9A5E,0xFF,0x7F,1, +0x9F9A26,0xFF,0x7F,0, +0x9F9A46,0xFF,0x7F,1, +0xA5DD32,0xFF,0x7F,0, +0xA5DD34,0xFF,0x7F,0, +0xA5DD38,0xFF,0x7F,0, +0xA5DD3A,0xFF,0x7F,0, +0xA5DD3C,0xFF,0x7F,0, +0xA5DD3E,0xFF,0x7F,0, +0xA5DD40,0xFF,0x7F,0, +0xA5DD42,0xFF,0x7F,0, +0xA5DD44,0xFF,0x7F,0, +0xA5DD46,0xFF,0x7F,0, +0xA5DD48,0xFF,0x7F,0, +0xA5DD4A,0xFF,0x7F,0, +0xA5DD4C,0xFF,0x7F,0, +0xA5DD4E,0x00,0x00,0, +0xA5DD52,0xFF,0x7F,1, +0xA5DD54,0xFF,0x7F,1, +0xA5DD58,0xFF,0x7F,1, +0xA5DD5A,0xFF,0x7F,1, +0xA5DD5C,0xFF,0x7F,1, +0xA5DD5E,0xFF,0x7F,1, +0xA5DD60,0xFF,0x7F,1, +0xA5DD62,0xFF,0x7F,1, +0xA5DD64,0xFF,0x7F,1, +0xA5DD66,0xFF,0x7F,1, +0xA5DD68,0xFF,0x7F,1, +0xA5DD6A,0xFF,0x7F,1, +0xA5DD6C,0xFF,0x7F,1, +0xA5DD6E,0x00,0x00,1, +0x3D0E08,0xFF,0x7F,1, +0x3D0E0A,0xFF,0x7F,1, +0x3D0E0C,0xFF,0x7F,1, +0x3D0E16,0xFF,0x7F,0, +0x3D0E18,0xFF,0x7F,0, +0x3D0E1A,0xFF,0x7F,0, +0x3CC9B8,0xFF,0x7F,0, +0x3CC9BA,0xFF,0x7F,0, +0x3CC9BC,0xFF,0x7F,0, +0x3CC9BE,0xFF,0x7F,0, +0x3CC9C0,0xFF,0x7F,0, +0x3CC9C2,0xFF,0x7F,0, +0x3CC9C4,0xFF,0x7F,0, +0x3CC9C6,0xFF,0x7F,0, +0x3CC9C8,0xFF,0x7F,0, +0x3CC9CA,0xFF,0x7F,0, +0x3CC9CC,0xFF,0x7F,0, +0x3CC9CE,0xFF,0x7F,0, +0x3CC9D0,0xFF,0x7F,0, +0x3CC9D2,0xFF,0x7F,0, +0x3CDE6E,0xFF,0x7F,1, +0x3CDE70,0xFF,0x7F,1, +0x3CDE72,0xFF,0x7F,1, +0x3CDE74,0xFF,0x7F,1, +0x3CDE76,0xDF,0x6E,2, +0x3CDE78,0xFF,0x5D,2, +0x3CDE7A,0x7F,0x3C,2, +0x3CDE7C,0xFF,0x7F,1, +0x3CDE7E,0xFF,0x7F,1, +0x3CDE80,0xFF,0x7F,1, +0x3CDE82,0xFF,0x7F,1, +0x3CDE84,0xFF,0x7F,1, +0x3CDE86,0xFF,0x7F,1, +0x3CDE88,0xFF,0x7F,1, +0x3CDE8A,0xFF,0x7F,1, +0x51AD1E,0xFF,0x7F,0, +0x51AD20,0xFF,0x7F,0, +0x51AD22,0xFF,0x7F,0, +0x51AD24,0xFF,0x7F,0, +0x51AD26,0xFF,0x7F,0, +0x51AD28,0xFF,0x7F,0, +0x51AD2A,0xFF,0x7F,0, +0x51AD2C,0xFF,0x7F,0, +0x51AD2E,0xFF,0x7F,0, +0x51AD30,0xFF,0x7F,0, +0x51AD32,0xFF,0x7F,0, +0x51AD34,0xFF,0x7F,0, +0x51AD36,0xFF,0x7F,0, +0x51AD38,0xFF,0x7F,0, +0x51AD3A,0xFF,0x7F,0, +0x51AD3E,0xFF,0x7F,1, +0x51AD40,0xFF,0x7F,1, +0x51AD42,0xFF,0x7F,1, +0x51AD44,0xFF,0x7F,1, +0x51AD46,0xFF,0x7F,1, +0x51AD48,0xFF,0x7F,1, +0x51AD4A,0xFF,0x7F,1, +0x51AD4C,0xFF,0x7F,1, +0x51AD4E,0xFF,0x7F,1, +0x51AD50,0xFF,0x7F,1, +0x51AD52,0xFF,0x7F,1, +0x51AD54,0xFF,0x7F,1, +0x51AD56,0xFF,0x7F,1, +0x51AD58,0xFF,0x7F,1, +0x51AD5A,0xFF,0x7F,1, +0x51A49E,0xFF,0x7F,0, +0x51A4A0,0xFF,0x7F,0, +0x51A4A2,0xFF,0x7F,0, +0x51A4A4,0xFF,0x7F,0, +0x51A4A6,0xFF,0x7F,0, +0x51A4A8,0xFF,0x7F,0, +0x51A4AA,0xFF,0x7F,0, +0x51A4AC,0xFF,0x7F,0, +0x51A4AE,0xFF,0x7F,0, +0x51A4B0,0xFF,0x7F,0, +0x51A4B2,0xFF,0x7F,0, +0x51A4B4,0xFF,0x7F,0, +0x51A4B6,0xFF,0x7F,0, +0x51A4B8,0xFF,0x7F,0, +0x51A4BA,0xFF,0x7F,0, +0x51A4BE,0xFF,0x7F,1, +0x51A4C0,0xFF,0x7F,1, +0x51A4C2,0xFF,0x7F,1, +0x51A4C4,0xFF,0x7F,1, +0x51A4C6,0xFF,0x7F,1, +0x51A4C8,0xFF,0x7F,1, +0x51A4CA,0xFF,0x7F,1, +0x51A4CC,0xFF,0x7F,1, +0x51A4CE,0xFF,0x7F,1, +0x51A4D0,0xFF,0x7F,1, +0x51A4D2,0xFF,0x7F,1, +0x51A4D4,0xFF,0x7F,1, +0x51A4D6,0xFF,0x7F,1, +0x51A4D8,0xFF,0x7F,1, +0x51A4DA,0xFF,0x7F,1, +0x51A97E,0xFF,0x7F,0, +0x51A980,0xFF,0x7F,0, +0x51A982,0xFF,0x7F,0, +0x51A984,0xFF,0x7F,0, +0x51A986,0xFF,0x7F,0, +0x51A988,0xFF,0x7F,0, +0x51A98A,0xFF,0x7F,0, +0x51A98C,0xFF,0x7F,0, +0x51A98E,0xFF,0x7F,0, +0x51A990,0xFF,0x7F,0, +0x51A992,0xFF,0x7F,0, +0x51A994,0xFF,0x7F,0, +0x51A996,0xFF,0x7F,0, +0x51A998,0xFF,0x7F,0, +0x51A99A,0xFF,0x7F,0, +0x51A95E,0xFF,0x7F,1, +0x51A960,0xFF,0x7F,1, +0x51A962,0xFF,0x7F,1, +0x51A964,0xFF,0x7F,1, +0x51A966,0xFF,0x7F,1, +0x51A968,0xFF,0x7F,1, +0x51A96A,0xFF,0x7F,1, +0x51A96C,0xFF,0x7F,1, +0x51A96E,0xFF,0x7F,1, +0x51A970,0xFF,0x7F,1, +0x51A972,0xFF,0x7F,1, +0x51A974,0xFF,0x7F,1, +0x51A976,0xFF,0x7F,1, +0x51A978,0xFF,0x7F,1, +0x51A97A,0xFF,0x7F,1, +0x51A9FE,0xFF,0x7F,0, +0x51AA00,0xFF,0x7F,0, +0x51AA02,0xFF,0x7F,0, +0x51AA0A,0xFF,0x7F,0, +0x51AA0E,0xFF,0x7F,1, +0x51AA10,0xFF,0x7F,1, +0x51AA12,0xFF,0x7F,1, +0x3CC976,0x7F,0x4F,0, +0x3CC978,0xFF,0x7F,0, +0x3CC97A,0xFF,0x7F,0, +0x3CC97C,0xFF,0x7F,0, +0x3CC97E,0xFF,0x7F,0, +0x3CC980,0xFF,0x7F,0, +0x3CC982,0xFF,0x7F,0, +0x3CC984,0xFF,0x7F,0, +0x3CC986,0xFF,0x7F,0, +0x3CC988,0xFF,0x7F,0, +0x3CC98A,0xFF,0x7F,0, +0x3CC98C,0xFF,0x7F,0, +0x3CC98E,0xFF,0x7F,0, +0x3CC990,0xFF,0x7F,0, +0x3CC992,0xFF,0x7F,0, +0x3D4B44,0xFF,0x7F,0, +0x3D4B46,0xFF,0x7F,0, +0x3D4B48,0xFF,0x7F,0, +0x3D4B4A,0xFF,0x7F,0, +0x3D4B4C,0xFF,0x7F,0, +0x3D4B4E,0xFF,0x7F,0, +0x3D4B50,0xFF,0x7F,0, +0x3D4B52,0xFF,0x7F,0, +0x3D4B54,0xFF,0x7F,0, +0x3D4B56,0xFF,0x7F,0, +0x3D4B58,0xFF,0x7F,0, +0x3D4B5A,0x00,0x00,0, +0x3D4B5C,0xFF,0x7F,0, +0x3D4B5E,0xFF,0x7F,0, +0x3D4B42,0xFF,0x7F,0, +0x3CCA38,0xFF,0x7F,1, +0x3CCA3A,0xFF,0x7F,1, +0x3CCA3C,0xFF,0x7F,1, +0x3CCA3E,0xFF,0x7F,1, +0x3CCA40,0xFF,0x7F,1, +0x3CCA42,0xFF,0x7F,1, +0x3CCA44,0xFF,0x7F,1, +0x3CCA46,0xFF,0x7F,1, +0x3CCA48,0xFF,0x7F,1, +0x3CCA4A,0xFF,0x7F,1, +0x3CCA4C,0xFF,0x7F,1, +0x3CCA4E,0xFF,0x7F,1, +0x3CCA50,0xFF,0x7F,1, +0x3CCA52,0xFF,0x7F,1, +0x3CCA36,0xFF,0x7F,1, +0x3CFB30,0xFF,0x7F,0, +0x3CFB32,0xFF,0x7F,0, +0x3CFB34,0xFF,0x7F,0, +0x3CFB36,0xFF,0x7F,0, +0x3CFB38,0xFF,0x7F,0, +0x3CFB3A,0xFF,0x7F,0, +0x3CFB3C,0xFF,0x7F,0, +0x3CFB3E,0xFF,0x7F,0, +0x3CFB40,0xFF,0x7F,0, +0x3CFB42,0xFF,0x7F,0, +0x3CFB44,0xFF,0x7F,0, +0x3CFB46,0xFF,0x7F,0, +0x3CFB48,0xFF,0x7F,0, +0x3CFB4A,0xFF,0x7F,0, +0x3CFB70,0xFF,0x7F,1, +0x3CFB72,0xFF,0x7F,1, +0x3CFB74,0xFF,0x7F,1, +0x3CFB76,0xFF,0x7F,1, +0x3CFB78,0xFF,0x7F,1, +0x3CFB7A,0xFF,0x7F,1, +0x3CFB7C,0xFF,0x7F,1, +0x3CFB7E,0xFF,0x7F,1, +0x3CFB80,0xFF,0x7F,1, +0x3CFB82,0xFF,0x7F,1, +0x3CFB84,0xFF,0x7F,1, +0x3CFB86,0xFF,0x7F,1, +0x3CFB88,0xFF,0x7F,1, +0x3CFB8A,0xFF,0x7F,1, +0x3D5044,0xFF,0x7F,0, +0x3D5046,0xFF,0x7F,0, +0x3D5048,0xFF,0x7F,0, +0x3D504A,0xFF,0x7F,0, +0x3D504C,0xFF,0x7F,0, +0x3D504E,0xFF,0x7F,0, +0x3D5050,0xFF,0x7F,0, +0x3D5052,0xFF,0x7F,0, +0x3D5054,0xFF,0x7F,0, +0x3D5056,0xFF,0x7F,0, +0x3D505C,0xFF,0x7F,0, +0x3D505E,0xFF,0x7F,0, +0x3D5084,0xFF,0x7F,1, +0x3D5086,0xFF,0x7F,1, +0x3D5088,0xFF,0x7F,1, +0x3D508A,0xFF,0x7F,1, +0x3D508C,0xFF,0x7F,1, +0x3D508E,0xFF,0x7F,1, +0x3D5090,0xFF,0x7F,1, +0x3D5092,0xFF,0x7F,1, +0x3D5094,0xFF,0x7F,1, +0x3D5096,0xFF,0x7F,1, +0x3D509C,0xFF,0x7F,1, +0x3D509E,0xFF,0x7F,1, +0xA5DDA2,0xFF,0x7F,0, +0xA5DDA4,0x00,0x00,0, +0xA5DDA6,0xFF,0x7F,0, +0xA5DDA8,0xFF,0x7F,0, +0xA5DDAE,0x00,0x00,0, +0xA5DDC2,0xFF,0x7F,1, +0xA5DDC4,0x00,0x00,1, +0xA5DDC6,0xFF,0x7F,1, +0xA5DDC8,0xFF,0x7F,1, +0xA5DDCE,0x00,0x00,1, +0x3D3E0C,0xFF,0x7F,1, +0x3D3E0E,0xFF,0x7F,1, +0x3D3E10,0xFF,0x7F,0, +0x3D3E12,0xFF,0x7F,0, +0x3CF1C0,0xFF,0x7F,0, +0x3CF1C2,0xFF,0x7F,0, +0x3CF200,0xFF,0x7F,1, +0x3CF202,0xFF,0x7F,1, +0x3D3604,0xFF,0x7F,0, +0x3D3606,0xFF,0x7F,1, +0x3D360A,0xFF,0x7F,1, +0x3D360C,0xFF,0x7F,1, +0x3D360E,0xFF,0x7F,1, +0x3D3610,0xFF,0x7F,0, +0x3D3612,0xFF,0x7F,0, +0x3D3614,0xFF,0x7F,0, +0x3D1A42,0xFF,0x7F,0, +0x3D1A44,0xFF,0x7F,0, +0x3D1A46,0xFF,0x7F,0, +0x3D1A48,0xFF,0x7F,0, +0x3D1A4A,0xFF,0x7F,0, +0x3D1A82,0xFF,0x7F,1, +0x3D1A84,0xFF,0x7F,1, +0x3D1A86,0xFF,0x7F,1, +0x3D1A88,0xFF,0x7F,1, +0x3D1A8A,0xFF,0x7F,1, +0x3CE280,0xFF,0x7F,0, +0x3CE282,0xFF,0x7F,0, +0x3CE2C0,0xFF,0x7F,1, +0x3CE2C2,0xFF,0x7F,1, +0x4FA29C,0xFF,0x7F,0, +0x4FA29E,0xFF,0x7F,0, +0x4FA2DC,0xFF,0x7F,1, +0x4FA2DE,0xFF,0x7F,1, +0x8D3C5E,0xFF,0x7F,0, +0x8D3C60,0xFF,0x7F,0, +0x8D3C62,0xFF,0x7F,0, +0x8D3C64,0xFF,0x7F,0, +0x8D3B9C,0xAE,0x7E,0, +0x8D3BA0,0x20,0x4E,0, +0x8D3B9E,0x6C,0x7E,0, +0x3D4C02,0xFF,0x7F,0, +0x3D4C0C,0xFF,0x7F,0, +0x3D4C0E,0xFF,0x7F,0, +0x3D4C10,0xFF,0x7F,0, +0x3D4C12,0xFF,0x7F,0, +0x3D4C14,0xFF,0x7F,0, +0x3D2D96,0xFF,0x7F,0, +0x3D2D98,0xFF,0x7F,0, +0x3D2D9A,0xFF,0x7F,0, +0x3D2D9C,0xFF,0x7F,0, +0x8CC272,0xFF,0x7F,1, +0x8CC274,0xFF,0x7F,1, +0x8CC276,0xFF,0x7F,1, +0x8CC278,0x00,0x00,1, +0x8CC27A,0x00,0x00,1, +0x8CC27C,0x00,0x00,1, +0x3D4784,0xFF,0x7F,0, +0x3D4786,0xFF,0x7F,1, +0x3D4788,0xFF,0x7F,1, +0x3D478A,0x00,0x00,1, +0x3D478C,0xFF,0x7F,0, +0x3D478E,0xFF,0x7F,0, +0x3D4790,0xFF,0x7F,0, +0x3D4792,0xFF,0x7F,0, +0x3D4794,0x00,0x00,0, +0x8CF4B2,0xFF,0x7F,1, +0x8CF4B4,0xFF,0x7F,1, +0x8CF4B6,0xFF,0x7F,1, +0x8CF4B8,0x00,0x00,1, +0x8CF4BA,0x00,0x00,1, +0x8CF4BC,0x00,0x00,1, +0x8CF7B2,0xFF,0x7F,1, +0x8CF7B4,0xFF,0x7F,1, +0x8CF7B6,0xFF,0x7F,1, +0x8CF7B8,0x00,0x00,1, +0x8CF7BA,0x00,0x00,1, +0x8CF7BC,0x00,0x00,1, +0x8D2D52,0xFF,0x7F,1, +0x8D2D54,0xFF,0x7F,1, +0x8D2D56,0xFF,0x7F,1, +0x8D2D58,0x00,0x00,1, +0x8D2D5A,0x00,0x00,1, +0x8D2D5C,0x00,0x00,1, +0x8D0096,0xFF,0x7F,1, +0x8D0A16,0xFF,0x7F,1, +0x8D006E,0xFF,0x7F,1, +0x8D0070,0xFF,0x7F,1, +0x8D09AE,0xFF,0x7F,1, +0x8D09B0,0xFF,0x7F,1, +0x3CE8F6,0xFF,0x7F,1, +0x3CE8F8,0xFF,0x7F,1, +0x3CE8FA,0xFF,0x7F,1, +0x8D0952,0xFF,0x7F,1, +0x8D0954,0xFF,0x7F,1, +0x8D0956,0x00,0x00,1, +0x8D0958,0xFF,0x7F,1, +0x8D095A,0x00,0x00,1, +0x8D095C,0x00,0x00,1, +0x3CE976,0xFF,0x7F,1, +0x3CE978,0xFF,0x7F,1, +0x3CE97A,0xFF,0x7F,1, +0x4F8912,0xFF,0x7F,1, +0x4F8914,0xFF,0x7F,1, +0x4F8916,0xFF,0x7F,1, +0x8D0456,0xFF,0x7F,0, +0x8D09F6,0xFF,0x7F,0, +0x8D042E,0xFF,0x7F,0, +0x8D0430,0xFF,0x7F,0, +0x8D09CE,0xFF,0x7F,0, +0x8D09D0,0xFF,0x7F,0, +0x3CE8B6,0xFF,0x7F,0, +0x3CE8B8,0xFF,0x7F,0, +0x3CE8BA,0xFF,0x7F,0, +0x8D0890,0xFF,0x7F,0, +0x8D0892,0xFF,0x7F,0, +0x8D0894,0xFF,0x7F,0, +0x8D0896,0xFF,0x7F,0, +0x3CE932,0xFF,0x7F,0, +0x3CE936,0xFF,0x7F,0, +0x3CE938,0xFF,0x7F,0, +0x3CE93A,0xFF,0x7F,0, +0x3CE940,0xFF,0x7F,0, +0x4F88CE,0xFF,0x7F,0, +0x4F88D2,0xFF,0x7F,0, +0x4F88D4,0xFF,0x7F,0, +0x4F88D6,0xFF,0x7F,0, +0x4F88DC,0xFF,0x7F,0, +0x8D095E,0xFF,0x7F,0, +0x8D0960,0xFF,0x7F,0, +0x8D0962,0xFF,0x7F,0, +0x8D0964,0xFF,0x7F,0, +0x3D2104,0xFF,0x7F,0, +0x3D210E,0xFF,0x7F,0, +0x3D2110,0xFF,0x7F,0, +0x3D2118,0xFF,0x7F,0, +0x3D211A,0xFF,0x7F,0, +0x8D0052,0xFF,0x7F,1, +0x8D0054,0xFF,0x7F,1, +0x8D0056,0xFF,0x7F,1, +0x8D0058,0x00,0x00,1, +0x8D005A,0x00,0x00,1, +0x8D005C,0x00,0x00,1, +0x8D005E,0xFF,0x7F,0, +0x8D0060,0xFF,0x7F,0, +0x8D0062,0xFF,0x7F,0, +0x8D0064,0xFF,0x7F,0, +0x3C9E36,0xFF,0x7F,1, +0x3C9E38,0xFF,0x7F,1, +0x3C9E3A,0xFF,0x7F,1, +0x3C9E3C,0xFF,0x7F,0, +0x3C9E3E,0xFF,0x7F,0, +0x3C9E40,0xFF,0x7F,0, +0x4F4D50,0xFF,0x7F,0, +0x4F4D52,0xFF,0x7F,0, +0x4F4D54,0xFF,0x7F,0, +0x4F4D56,0xFF,0x7F,0, +0x4F4D58,0xFF,0x7F,0, +0x4F4D5A,0xFF,0x7F,0, +0x4F4D5C,0xFF,0x7F,0, +0x4F4D5E,0xFF,0x7F,0, +0x4F4D60,0xFF,0x7F,0, +0x4F4D62,0xFF,0x7F,0, +0x4F4D64,0xFF,0x7F,0, +0x4F4D66,0xFF,0x7F,0, +0x4F4D68,0xFF,0x7F,0, +0x4F4D6A,0xFF,0x7F,0, +0x3C9314,0xFF,0x7F,0, +0x3C9316,0xBD,0x7B,0, +0x3C9318,0x39,0x6F,0, +0x3C931A,0xB5,0x62,0, +0x3C931C,0xB5,0x56,0, +0x3C931E,0x31,0x46,0, +0x3C9320,0xDE,0x7F,0, +0x3C9322,0x5A,0x6F,0, +0x3C9324,0x89,0x52,0, +0x3C9326,0x08,0x46,0, +0x3C9328,0x39,0x67,0, +0x3C932A,0x73,0x4E,0, +0x3C932C,0x10,0x42,0, +0x3C932E,0xAD,0x35,0, +0x9F9CEA,0xFF,0x7F,0, +0x9F9CEC,0xBD,0x7B,0, +0x9F9CEE,0x39,0x6F,0, +0x9F9CF0,0xB5,0x62,0, +0x9F9CF2,0xB5,0x56,0, +0x9F9CF4,0x31,0x46,0, +0x9F9CF6,0xDE,0x7F,0, +0x9F9CF8,0x5A,0x6F,0, +0x9F9CFA,0x89,0x52,0, +0x9F9CFC,0x08,0x46,0, +0x9F9CFE,0x39,0x67,0, +0x9F9D00,0x73,0x4E,0, +0x9F9D02,0x10,0x42,0, +0x9F9D04,0xAD,0x35,0, +0x4F4E10,0xFF,0x7F,1, +0x4F4E12,0xFF,0x7F,1, +0x4F4E14,0xFF,0x7F,1, +0x4F4E16,0xFF,0x7F,1, +0x4F4E18,0xFF,0x7F,1, +0x4F4E1A,0xFF,0x7F,1, +0x4F4E1C,0xFF,0x7F,1, +0x4F4E1E,0xFF,0x7F,1, +0x4F4E20,0xFF,0x7F,1, +0x4F4E22,0xFF,0x7F,1, +0x4F4E24,0xFF,0x7F,1, +0x4F4E26,0xFF,0x7F,1, +0x4F4E28,0xFF,0x7F,1, +0x4F4E2A,0xFF,0x7F,1, +0x3C9444,0xFF,0x7F,1, +0x3C9446,0xBD,0x7B,1, +0x3C9448,0x39,0x6F,1, +0x3C944A,0xB5,0x62,1, +0x3C944C,0xB5,0x56,1, +0x3C944E,0x31,0x46,1, +0x3C9450,0xDE,0x7F,1, +0x3C9452,0x5A,0x6F,1, +0x3C9454,0x89,0x52,1, +0x3C9456,0x08,0x46,1, +0x3C9458,0x39,0x67,1, +0x3C945A,0x73,0x4E,1, +0x3C945C,0x10,0x42,1, +0x3C945E,0xAD,0x35,1, +0x9F9D68,0xFF,0x7F,1, +0x9F9D6A,0xBD,0x7B,1, +0x9F9D6C,0x39,0x6F,1, +0x9F9D6E,0xB5,0x62,1, +0x9F9D70,0xB5,0x56,1, +0x9F9D72,0x31,0x46,1, +0x9F9D74,0xDE,0x7F,1, +0x9F9D76,0x5A,0x6F,1, +0x9F9D78,0x89,0x52,1, +0x9F9D7A,0x08,0x46,1, +0x9F9D7C,0x39,0x67,1, +0x9F9D7E,0x73,0x4E,1, +0x9F9D80,0x10,0x42,1, +0x9F9D82,0xAD,0x35,1, +0x518E12,0xFF,0x7F,0, +0x518E10,0xFF,0x7F,0, +0x518E1A,0xFF,0x7F,0, +0x518E18,0xFF,0x7F,0, +0xA6202E,0xFF,0x7F,0, +0xA62030,0xFF,0x7F,0, +0xA62032,0xFF,0x7F,0, +0xA62034,0xFF,0x7F,0, +0xA6203A,0x00,0x00,0, +0xA6204E,0xFF,0x7F,1, +0xA62050,0xFF,0x7F,1, +0xA62052,0xFF,0x7F,1, +0xA62054,0xFF,0x7F,1, +0xA6205A,0x00,0x00,1, +0x3D4804,0xFF,0x7F,0, +0x3D4806,0xFF,0x7F,0, +0x3D4808,0xFF,0x7F,0, +0x3D480A,0xFF,0x7F,0, +0x3D4810,0xFF,0x7F,0, +0x3D4812,0xFF,0x7F,0, +0x3D480C,0xFF,0x7F,1, +0x3D480E,0xFF,0x7F,1, +0x8D049E,0xFF,0x7F,0, +0x8D04A0,0xFF,0x7F,0, +0x8D04A2,0xFF,0x7F,0, +0x8D0592,0xFF,0x7F,1, +0x8D0594,0xFF,0x7F,1, +0x8D0596,0xFF,0x7F,1, +0x8D0598,0x00,0x00,1, +0x8D059A,0x00,0x00,1, +0x8D059C,0x00,0x00,1, +0x4F5010,0xFF,0x7F,0, +0x4F5012,0xFF,0x7F,0, +0x4F5014,0xFF,0x7F,0, +0x4F5016,0xFF,0x7F,0, +0x4F4ECE,0xFF,0x7F,0, +0x4F4ED0,0xFF,0x7F,0, +0x4F4ED2,0xFF,0x7F,0, +0x4F4ED4,0xFF,0x7F,0, +0x4F4ED6,0xFF,0x7F,0, +0x4F4ED8,0xFF,0x7F,0, +0x4F4EDA,0xFF,0x7F,1, +0x4F4EDC,0xFF,0x7F,1, +0x4F4EDE,0xFF,0x7F,1, +0x4F4EE0,0xFF,0x7F,1, +0x4F4EE2,0xFF,0x7F,1, +0x3CC9F8,0xFF,0x7F,0, +0x3CC9FA,0xFF,0x7F,0, +0x3CC9FC,0xFF,0x7F,0, +0x3CC9FE,0xFF,0x7F,0, +0x3CCA00,0xFF,0x7F,0, +0x3CCA02,0xFF,0x7F,0, +0x3CCA0A,0xFF,0x7F,0, +0x3CCA0C,0xFF,0x7F,0, +0x3CCA0E,0xFF,0x7F,0, +0x3CCA10,0xFF,0x7F,0, +0x3CCA12,0xFF,0x7F,0, +0x8CBE1E,0xFF,0x7F,0, +0x8CBE20,0xFF,0x7F,0, +0x8CBE22,0xFF,0x7F,0, +0x8CBE3E,0xFF,0x7F,1, +0x8CBE40,0xFF,0x7F,1, +0x8CBE42,0xFF,0x7F,1, +0x8CBEDE,0xFF,0x7F,0, +0x8CBEE0,0xFF,0x7F,0, +0x8CBED4,0xFF,0x7F,0, +0x8CBEE2,0xFF,0x7F,0, +0x8CBECA,0xFF,0x7F,0, +0x3B8F38,0xFF,0x7F,1, +0x3B8F3A,0xFF,0x7F,1, +0x3B8F40,0xFF,0x7F,0, +0x3B8F42,0xFF,0x7F,0, +0x3D1090,0xFF,0x7F,0, +0x3D1092,0xFF,0x7F,0, +0x3D1094,0xFF,0x7F,0, +0x3D1096,0xFF,0x7F,0, +0x3D1098,0xFF,0x7F,0, +0x3D109A,0x00,0x00,0, +0x3D109C,0xFF,0x7F,0, +0x3D109E,0xFF,0x7F,0, +0x3D1082,0xFF,0x7F,0, +0x3D1084,0xFF,0x7F,0, +0x3D1086,0xFF,0x7F,0, +0x3D10C2,0xFF,0x7F,1, +0x3D10C4,0xFF,0x7F,1, +0x3D10C6,0xFF,0x7F,1, +0x3D10D0,0xFF,0x7F,1, +0x3D10D2,0xFF,0x7F,1, +0x3D10D4,0xFF,0x7F,1, +0x3D10D6,0xFF,0x7F,1, +0x3D10D8,0xFF,0x7F,1, +0x3D10DA,0x00,0x00,1, +0x3D10DC,0xFF,0x7F,1, +0x3D10DE,0xFF,0x7F,1, +0x3D14C2,0xFF,0x7F,0, +0x3D14C4,0xFF,0x7F,0, +0x3D14C6,0xFF,0x7F,0, +0x3D14C8,0xFF,0x7F,0, +0x3D14CA,0xFF,0x7F,0, +0x3D14CC,0xFF,0x7F,0, +0x3D14CE,0xFF,0x7F,0, +0x3D14D0,0xFF,0x7F,0, +0x3D14D2,0xFF,0x7F,0, +0x3D14D4,0xFF,0x7F,0, +0x3D14D6,0xFF,0x7F,0, +0x3D1502,0xFF,0x7F,1, +0x3D1504,0xFF,0x7F,1, +0x3D1506,0xFF,0x7F,1, +0x3D1508,0xFF,0x7F,1, +0x3D150A,0xFF,0x7F,1, +0x3D150C,0xFF,0x7F,1, +0x3D150E,0xFF,0x7F,1, +0x3D1510,0xFF,0x7F,1, +0x3D1512,0xFF,0x7F,1, +0x3D1514,0xFF,0x7F,1, +0x3D1516,0xFF,0x7F,1, +0x3CE0F0,0xFF,0x7F,1, +0x3CE0F2,0xFF,0x7F,1, +0x3CE0F4,0xFF,0x7F,1, +0x3CE0D0,0xFF,0x7F,0, +0x3CE0D2,0xFF,0x7F,0, +0x3CE0D4,0xFF,0x7F,0, +0x8D3DAC,0xFF,0x7F,0, +0x8D3DBC,0xFF,0x7F,0, +0x8D3DB4,0xFF,0x7F,0, +0x8D3D86,0xFF,0x7F,0, +0x8D3DBA,0xFF,0x7F,0, +0x8D3DB8,0xFF,0x7F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/TrueChaos.txt b/worlds/mlss/colors/TrueChaos.txt new file mode 100644 index 000000000000..f75da0a16d57 --- /dev/null +++ b/worlds/mlss/colors/TrueChaos.txt @@ -0,0 +1,812 @@ +0x3CC878,0, +0x3CC87A,0, +0x3CC87C,0, +0x3CC87E,0, +0x3CC880,0, +0x3CC882,0, +0x3CC884,0, +0x3CC886,0, +0x3CC888,0, +0x3CC88A,0, +0x3CC88C,0, +0x3CC88E,0, +0x3CC890,0, +0x3CC892,0, +0x3CC8B8,1, +0x3CC8BA,1, +0x3CC8BC,1, +0x3CC8BE,1, +0x3CC8C0,1, +0x3CC8C2,1, +0x3CC8C4,1, +0x3CC8C6,1, +0x3CC8C8,1, +0x3CC8CA,1, +0x3CC8CC,1, +0x3CC8CE,1, +0x3CC8D0,1, +0x3CC8D2,1, +0x4F4CD0,0, +0x4F4CD2,0, +0x4F4CD4,0, +0x4F4CD6,0, +0x4F4CD8,0, +0x4F4CDA,0, +0x4F4CDC,0, +0x4F4CDE,0, +0x4F4CE0,0, +0x4F4CE2,0, +0x4F4CE4,0, +0x4F4CE6,0, +0x4F4CE8,0, +0x4F4CEA,0, +0x4F4D10,1, +0x4F4D12,1, +0x4F4D14,1, +0x4F4D16,1, +0x4F4D18,1, +0x4F4D1A,1, +0x4F4D1C,1, +0x4F4D1E,1, +0x4F4D20,1, +0x4F4D22,1, +0x4F4D24,1, +0x4F4D26,1, +0x4F4D28,1, +0x4F4D2A,1, +0x4F51D8,1, +0x4F51DA,1, +0x4F51DC,0, +0x4F51DE,0, +0x4F51E8,0, +0x4F51EA,1, +0x4FB684,0, +0x4FB686,0, +0x4FB688,0, +0x4FB6A4,1, +0x4FB6A6,1, +0x4FB6A8,1, +0x4FB692,0, +0x4FB6B2,1, +0x4FB786,0, +0x4FB788,0, +0x4FB78A,0, +0x4FB7A6,1, +0x4FB7A8,1, +0x4FB7AA,1, +0x519006,0, +0x519008,0, +0x51900C,0, +0x51900E,0, +0x519010,0, +0x519012,0, +0x519014,0, +0x519016,0, +0x519018,0, +0x51901A,0, +0x51901C,0, +0x51901E,0, +0x519020,0, +0x519022,0, +0x519026,1, +0x519028,1, +0x51902C,1, +0x51902E,1, +0x519030,1, +0x519032,1, +0x519034,1, +0x519036,1, +0x519038,1, +0x51903A,1, +0x51903C,1, +0x51903E,1, +0x519040,1, +0x519042,1, +0x5193D2,0, +0x5193D4,0, +0x5193D6,0, +0x5193D8,0, +0x5193DA,0, +0x5193DC,0, +0x5193DE,0, +0x5193E0,0, +0x5193E2,0, +0x5193E4,0, +0x5193E6,0, +0x5193E8,0, +0x5193EA,0, +0x5193EC,0, +0x5193F2,1, +0x5193F4,1, +0x5193F6,1, +0x5193F8,1, +0x5193FA,1, +0x5193FC,1, +0x5193FE,1, +0x519400,1, +0x519402,1, +0x519404,1, +0x519406,1, +0x519408,1, +0x51940A,1, +0x51940C,1, +0x3A7244,0, +0x3A724A,0, +0x3A724C,1, +0x3A724E,0, +0x3A7252,0, +0x3A7254,1, +0x3A7256,0, +0x3A7264,1, +0x3A726C,1, +0x3A7270,1, +0x3A7272,1, +0x3A7274,1, +0x3A7278,1, +0x3A727A,1, +0x3A727C,1, +0x3A7286,0, +0x3A7288,0, +0x3A728C,0, +0x3A7290,0, +0x3A7294,0, +0x3A7296,0, +0x3A72AE,1, +0x3A72B2,1, +0x3A72BC,1, +0x9F9A28,0, +0x9F9A2A,0, +0x9F9A2C,0, +0x9F9A2E,1, +0x9F9A30,1, +0x9F9A32,1, +0x9F9A34,0, +0x9F9A36,0, +0x9F9A38,0, +0x9F9A3A,1, +0x9F9A3C,1, +0x9F9A3E,1, +0x9F9A48,0, +0x9F9A4A,0, +0x9F9A4C,0, +0x9F9A4E,1, +0x9F9A50,1, +0x9F9A52,1, +0x9F9A56,0, +0x9F9A58,0, +0x9F9A5C,1, +0x9F9A5E,1, +0x9F9A26,0, +0x9F9A46,1, +0xA5DD32,0, +0xA5DD34,0, +0xA5DD38,0, +0xA5DD3A,0, +0xA5DD3C,0, +0xA5DD3E,0, +0xA5DD40,0, +0xA5DD42,0, +0xA5DD44,0, +0xA5DD46,0, +0xA5DD48,0, +0xA5DD4A,0, +0xA5DD4C,0, +0xA5DD4E,0, +0xA5DD52,1, +0xA5DD54,1, +0xA5DD58,1, +0xA5DD5A,1, +0xA5DD5C,1, +0xA5DD5E,1, +0xA5DD60,1, +0xA5DD62,1, +0xA5DD64,1, +0xA5DD66,1, +0xA5DD68,1, +0xA5DD6A,1, +0xA5DD6C,1, +0xA5DD6E,1, +0x3D0E08,1, +0x3D0E0A,1, +0x3D0E0C,1, +0x3D0E16,0, +0x3D0E18,0, +0x3D0E1A,0, +0x3CC9B8,0, +0x3CC9BA,0, +0x3CC9BC,0, +0x3CC9BE,0, +0x3CC9C0,0, +0x3CC9C2,0, +0x3CC9C4,0, +0x3CC9C6,0, +0x3CC9C8,0, +0x3CC9CA,0, +0x3CC9CC,0, +0x3CC9CE,0, +0x3CC9D0,0, +0x3CC9D2,0, +0x3CDE6E,1, +0x3CDE70,1, +0x3CDE72,1, +0x3CDE74,1, +0x3CDE76,2, +0x3CDE78,2, +0x3CDE7A,2, +0x3CDE7C,1, +0x3CDE7E,1, +0x3CDE80,1, +0x3CDE82,1, +0x3CDE84,1, +0x3CDE86,1, +0x3CDE88,1, +0x3CDE8A,1, +0x51AD1E,0, +0x51AD20,0, +0x51AD22,0, +0x51AD24,0, +0x51AD26,0, +0x51AD28,0, +0x51AD2A,0, +0x51AD2C,0, +0x51AD2E,0, +0x51AD30,0, +0x51AD32,0, +0x51AD34,0, +0x51AD36,0, +0x51AD38,0, +0x51AD3A,0, +0x51AD3E,1, +0x51AD40,1, +0x51AD42,1, +0x51AD44,1, +0x51AD46,1, +0x51AD48,1, +0x51AD4A,1, +0x51AD4C,1, +0x51AD4E,1, +0x51AD50,1, +0x51AD52,1, +0x51AD54,1, +0x51AD56,1, +0x51AD58,1, +0x51AD5A,1, +0x51A49E,0, +0x51A4A0,0, +0x51A4A2,0, +0x51A4A4,0, +0x51A4A6,0, +0x51A4A8,0, +0x51A4AA,0, +0x51A4AC,0, +0x51A4AE,0, +0x51A4B0,0, +0x51A4B2,0, +0x51A4B4,0, +0x51A4B6,0, +0x51A4B8,0, +0x51A4BA,0, +0x51A4BE,1, +0x51A4C0,1, +0x51A4C2,1, +0x51A4C4,1, +0x51A4C6,1, +0x51A4C8,1, +0x51A4CA,1, +0x51A4CC,1, +0x51A4CE,1, +0x51A4D0,1, +0x51A4D2,1, +0x51A4D4,1, +0x51A4D6,1, +0x51A4D8,1, +0x51A4DA,1, +0x51A97E,0, +0x51A980,0, +0x51A982,0, +0x51A984,0, +0x51A986,0, +0x51A988,0, +0x51A98A,0, +0x51A98C,0, +0x51A98E,0, +0x51A990,0, +0x51A992,0, +0x51A994,0, +0x51A996,0, +0x51A998,0, +0x51A99A,0, +0x51A95E,1, +0x51A960,1, +0x51A962,1, +0x51A964,1, +0x51A966,1, +0x51A968,1, +0x51A96A,1, +0x51A96C,1, +0x51A96E,1, +0x51A970,1, +0x51A972,1, +0x51A974,1, +0x51A976,1, +0x51A978,1, +0x51A97A,1, +0x51A9FE,0, +0x51AA00,0, +0x51AA02,0, +0x51AA0A,0, +0x51AA0E,1, +0x51AA10,1, +0x51AA12,1, +0x3CC976,0, +0x3CC978,0, +0x3CC97A,0, +0x3CC97C,0, +0x3CC97E,0, +0x3CC980,0, +0x3CC982,0, +0x3CC984,0, +0x3CC986,0, +0x3CC988,0, +0x3CC98A,0, +0x3CC98C,0, +0x3CC98E,0, +0x3CC990,0, +0x3CC992,0, +0x3D4B44,0, +0x3D4B46,0, +0x3D4B48,0, +0x3D4B4A,0, +0x3D4B4C,0, +0x3D4B4E,0, +0x3D4B50,0, +0x3D4B52,0, +0x3D4B54,0, +0x3D4B56,0, +0x3D4B58,0, +0x3D4B5A,0, +0x3D4B5C,0, +0x3D4B5E,0, +0x3D4B42,0, +0x3CCA38,1, +0x3CCA3A,1, +0x3CCA3C,1, +0x3CCA3E,1, +0x3CCA40,1, +0x3CCA42,1, +0x3CCA44,1, +0x3CCA46,1, +0x3CCA48,1, +0x3CCA4A,1, +0x3CCA4C,1, +0x3CCA4E,1, +0x3CCA50,1, +0x3CCA52,1, +0x3CCA36,1, +0x3CFB30,0, +0x3CFB32,0, +0x3CFB34,0, +0x3CFB36,0, +0x3CFB38,0, +0x3CFB3A,0, +0x3CFB3C,0, +0x3CFB3E,0, +0x3CFB40,0, +0x3CFB42,0, +0x3CFB44,0, +0x3CFB46,0, +0x3CFB48,0, +0x3CFB4A,0, +0x3CFB70,1, +0x3CFB72,1, +0x3CFB74,1, +0x3CFB76,1, +0x3CFB78,1, +0x3CFB7A,1, +0x3CFB7C,1, +0x3CFB7E,1, +0x3CFB80,1, +0x3CFB82,1, +0x3CFB84,1, +0x3CFB86,1, +0x3CFB88,1, +0x3CFB8A,1, +0x3D5044,0, +0x3D5046,0, +0x3D5048,0, +0x3D504A,0, +0x3D504C,0, +0x3D504E,0, +0x3D5050,0, +0x3D5052,0, +0x3D5054,0, +0x3D5056,0, +0x3D505C,0, +0x3D505E,0, +0x3D5084,1, +0x3D5086,1, +0x3D5088,1, +0x3D508A,1, +0x3D508C,1, +0x3D508E,1, +0x3D5090,1, +0x3D5092,1, +0x3D5094,1, +0x3D5096,1, +0x3D509C,1, +0x3D509E,1, +0xA5DDA2,0, +0xA5DDA4,0, +0xA5DDA6,0, +0xA5DDA8,0, +0xA5DDAE,0, +0xA5DDC2,1, +0xA5DDC4,1, +0xA5DDC6,1, +0xA5DDC8,1, +0xA5DDCE,1, +0x3D3E0C,1, +0x3D3E0E,1, +0x3D3E10,0, +0x3D3E12,0, +0x3CF1C0,0, +0x3CF1C2,0, +0x3CF200,1, +0x3CF202,1, +0x3D3604,0, +0x3D3606,1, +0x3D360A,1, +0x3D360C,1, +0x3D360E,1, +0x3D3610,0, +0x3D3612,0, +0x3D3614,0, +0x3D1A42,0, +0x3D1A44,0, +0x3D1A46,0, +0x3D1A48,0, +0x3D1A4A,0, +0x3D1A82,1, +0x3D1A84,1, +0x3D1A86,1, +0x3D1A88,1, +0x3D1A8A,1, +0x3CE280,0, +0x3CE282,0, +0x3CE2C0,1, +0x3CE2C2,1, +0x4FA29C,0, +0x4FA29E,0, +0x4FA2DC,1, +0x4FA2DE,1, +0x8D3C5E,0, +0x8D3C60,0, +0x8D3C62,0, +0x8D3C64,0, +0x8D3B9C,0, +0x8D3BA0,0, +0x8D3B9E,0, +0x3D4C02,0, +0x3D4C0C,0, +0x3D4C0E,0, +0x3D4C10,0, +0x3D4C12,0, +0x3D4C14,0, +0x3D2D96,0, +0x3D2D98,0, +0x3D2D9A,0, +0x3D2D9C,0, +0x8CC272,1, +0x8CC274,1, +0x8CC276,1, +0x8CC278,1, +0x8CC27A,1, +0x8CC27C,1, +0x3D4784,0, +0x3D4786,1, +0x3D4788,1, +0x3D478A,1, +0x3D478C,0, +0x3D478E,0, +0x3D4790,0, +0x3D4792,0, +0x3D4794,0, +0x8CF4B2,1, +0x8CF4B4,1, +0x8CF4B6,1, +0x8CF4B8,1, +0x8CF4BA,1, +0x8CF4BC,1, +0x8CF7B2,1, +0x8CF7B4,1, +0x8CF7B6,1, +0x8CF7B8,1, +0x8CF7BA,1, +0x8CF7BC,1, +0x8D2D52,1, +0x8D2D54,1, +0x8D2D56,1, +0x8D2D58,1, +0x8D2D5A,1, +0x8D2D5C,1, +0x8D0096,1, +0x8D0A16,1, +0x8D006E,1, +0x8D0070,1, +0x8D09AE,1, +0x8D09B0,1, +0x3CE8F6,1, +0x3CE8F8,1, +0x3CE8FA,1, +0x8D0952,1, +0x8D0954,1, +0x8D0956,1, +0x8D0958,1, +0x8D095A,1, +0x8D095C,1, +0x3CE976,1, +0x3CE978,1, +0x3CE97A,1, +0x4F8912,1, +0x4F8914,1, +0x4F8916,1, +0x8D0456,0, +0x8D09F6,0, +0x8D042E,0, +0x8D0430,0, +0x8D09CE,0, +0x8D09D0,0, +0x3CE8B6,0, +0x3CE8B8,0, +0x3CE8BA,0, +0x8D0890,0, +0x8D0892,0, +0x8D0894,0, +0x8D0896,0, +0x3CE932,0, +0x3CE936,0, +0x3CE938,0, +0x3CE93A,0, +0x3CE940,0, +0x4F88CE,0, +0x4F88D2,0, +0x4F88D4,0, +0x4F88D6,0, +0x4F88DC,0, +0x8D095E,0, +0x8D0960,0, +0x8D0962,0, +0x8D0964,0, +0x3D2104,0, +0x3D210E,0, +0x3D2110,0, +0x3D2118,0, +0x3D211A,0, +0x8D0052,1, +0x8D0054,1, +0x8D0056,1, +0x8D0058,1, +0x8D005A,1, +0x8D005C,1, +0x8D005E,0, +0x8D0060,0, +0x8D0062,0, +0x8D0064,0, +0x3C9E36,1, +0x3C9E38,1, +0x3C9E3A,1, +0x3C9E3C,0, +0x3C9E3E,0, +0x3C9E40,0, +0x4F4D50,0, +0x4F4D52,0, +0x4F4D54,0, +0x4F4D56,0, +0x4F4D58,0, +0x4F4D5A,0, +0x4F4D5C,0, +0x4F4D5E,0, +0x4F4D60,0, +0x4F4D62,0, +0x4F4D64,0, +0x4F4D66,0, +0x4F4D68,0, +0x4F4D6A,0, +0x3C9314,0, +0x3C9316,0, +0x3C9318,0, +0x3C931A,0, +0x3C931C,0, +0x3C931E,0, +0x3C9320,0, +0x3C9322,0, +0x3C9324,0, +0x3C9326,0, +0x3C9328,0, +0x3C932A,0, +0x3C932C,0, +0x3C932E,0, +0x9F9CEA,0, +0x9F9CEC,0, +0x9F9CEE,0, +0x9F9CF0,0, +0x9F9CF2,0, +0x9F9CF4,0, +0x9F9CF6,0, +0x9F9CF8,0, +0x9F9CFA,0, +0x9F9CFC,0, +0x9F9CFE,0, +0x9F9D00,0, +0x9F9D02,0, +0x9F9D04,0, +0x4F4E10,1, +0x4F4E12,1, +0x4F4E14,1, +0x4F4E16,1, +0x4F4E18,1, +0x4F4E1A,1, +0x4F4E1C,1, +0x4F4E1E,1, +0x4F4E20,1, +0x4F4E22,1, +0x4F4E24,1, +0x4F4E26,1, +0x4F4E28,1, +0x4F4E2A,1, +0x3C9444,1, +0x3C9446,1, +0x3C9448,1, +0x3C944A,1, +0x3C944C,1, +0x3C944E,1, +0x3C9450,1, +0x3C9452,1, +0x3C9454,1, +0x3C9456,1, +0x3C9458,1, +0x3C945A,1, +0x3C945C,1, +0x3C945E,1, +0x9F9D68,1, +0x9F9D6A,1, +0x9F9D6C,1, +0x9F9D6E,1, +0x9F9D70,1, +0x9F9D72,1, +0x9F9D74,1, +0x9F9D76,1, +0x9F9D78,1, +0x9F9D7A,1, +0x9F9D7C,1, +0x9F9D7E,1, +0x9F9D80,1, +0x9F9D82,1, +0x518E12,0, +0x518E10,0, +0x518E1A,0, +0x518E18,0, +0xA6202E,0, +0xA62030,0, +0xA62032,0, +0xA62034,0, +0xA6203A,0, +0xA6204E,1, +0xA62050,1, +0xA62052,1, +0xA62054,1, +0xA6205A,1, +0x3D4804,0, +0x3D4806,0, +0x3D4808,0, +0x3D480A,0, +0x3D4810,0, +0x3D4812,0, +0x3D480C,1, +0x3D480E,1, +0x8D049E,0, +0x8D04A0,0, +0x8D04A2,0, +0x8D0592,1, +0x8D0594,1, +0x8D0596,1, +0x8D0598,1, +0x8D059A,1, +0x8D059C,1, +0x4F5010,0, +0x4F5012,0, +0x4F5014,0, +0x4F5016,0, +0x4F4ECE,0, +0x4F4ED0,0, +0x4F4ED2,0, +0x4F4ED4,0, +0x4F4ED6,0, +0x4F4ED8,0, +0x4F4EDA,1, +0x4F4EDC,1, +0x4F4EDE,1, +0x4F4EE0,1, +0x4F4EE2,1, +0x3CC9F8,0, +0x3CC9FA,0, +0x3CC9FC,0, +0x3CC9FE,0, +0x3CCA00,0, +0x3CCA02,0, +0x3CCA0A,0, +0x3CCA0C,0, +0x3CCA0E,0, +0x3CCA10,0, +0x3CCA12,0, +0x8CBE1E,0, +0x8CBE20,0, +0x8CBE22,0, +0x8CBE3E,1, +0x8CBE40,1, +0x8CBE42,1, +0x8CBEDE,0, +0x8CBEE0,0, +0x8CBED4,0, +0x8CBEE2,0, +0x8CBECA,0, +0x3B8F38,1, +0x3B8F3A,1, +0x3B8F40,0, +0x3B8F42,0, +0x3D1090,0, +0x3D1092,0, +0x3D1094,0, +0x3D1096,0, +0x3D1098,0, +0x3D109A,0, +0x3D109C,0, +0x3D109E,0, +0x3D1082,0, +0x3D1084,0, +0x3D1086,0, +0x3D10C2,1, +0x3D10C4,1, +0x3D10C6,1, +0x3D10D0,1, +0x3D10D2,1, +0x3D10D4,1, +0x3D10D6,1, +0x3D10D8,1, +0x3D10DA,1, +0x3D10DC,1, +0x3D10DE,1, +0x3D14C2,0, +0x3D14C4,0, +0x3D14C6,0, +0x3D14C8,0, +0x3D14CA,0, +0x3D14CC,0, +0x3D14CE,0, +0x3D14D0,0, +0x3D14D2,0, +0x3D14D4,0, +0x3D14D6,0, +0x3D1502,1, +0x3D1504,1, +0x3D1506,1, +0x3D1508,1, +0x3D150A,1, +0x3D150C,1, +0x3D150E,1, +0x3D1510,1, +0x3D1512,1, +0x3D1514,1, +0x3D1516,1, +0x3CE0F0,1, +0x3CE0F2,1, +0x3CE0F4,1, +0x3CE0D0,0, +0x3CE0D2,0, +0x3CE0D4,0, +0x8D3DAC,0, +0x8D3DBC,0, +0x8D3DB4,0, +0x8D3D86,0, +0x8D3DBA,0, +0x8D3DB8,0, \ No newline at end of file diff --git a/worlds/mlss/colors/White.txt b/worlds/mlss/colors/White.txt new file mode 100644 index 000000000000..08597e64b9e3 --- /dev/null +++ b/worlds/mlss/colors/White.txt @@ -0,0 +1,265 @@ +0x3CC884,0xFF,0x7F,0, +0x3CC886,0x7B,0x6F,0, +0x3CC8C4,0xFF,0x7F,1, +0x3CC8C6,0x7B,0x6F,1, +0x4F4CDC,0xFF,0x7F,0, +0x4F4CDE,0x7B,0x6F,0, +0x4F4D1C,0xFF,0x7F,1, +0x4F4D1E,0x7B,0x6F,1, +0x4F51D8,0xFF,0x7F,1, +0x4F51DC,0xFF,0x7F,0, +0x4F51E8,0x7B,0x6F,0, +0x4F51EA,0x7B,0x6F,1, +0x4F51DA,0x9C,0x73,1, +0x4F51DE,0x9C,0x73,0, +0x4FB686,0xFF,0x7F,0, +0x4FB6A6,0xFF,0x7F,1, +0x4FB684,0x73,0x4E,0, +0x4FB6A4,0x73,0x4E,1, +0x4FB688,0x7B,0x6F,0, +0x4FB6A8,0x7B,0x6F,1, +0x4FB786,0x73,0x4E,0, +0x4FB788,0xFF,0x7F,0, +0x4FB78A,0xFF,0x7F,0, +0x4FB7A6,0x73,0x4E,1, +0x4FB7A8,0xFF,0x7F,1, +0x4FB7AA,0xFF,0x7F,1, +0x51901C,0xFF,0x7F,0, +0x519018,0x73,0x4E,0, +0x51901A,0x7B,0x6F,0, +0x51903C,0xFF,0x7F,1, +0x519038,0x73,0x4E,1, +0x51903A,0x7B,0x6F,1, +0x5193EA,0x7B,0x6F,0, +0x5193E8,0xFF,0x7F,0, +0x51940A,0x7B,0x6F,1, +0x519408,0xFF,0x7F,1, +0x3A72AE,0xF7,0x5E,1, +0x3A7244,0xF7,0x5E,0, +0x3A724C,0x39,0x67,1, +0x3A7290,0x18,0x63,0, +0x3A72B2,0x18,0x63,1, +0x3A7270,0xB5,0x56,1, +0x3A7288,0xB5,0x56,0, +0x3A7296,0x5A,0x6B,0, +0x3A7274,0x5A,0x6B,1, +0x3A7294,0x39,0x67,0, +0x3A724A,0x7B,0x6F,0, +0x3A7278,0x7B,0x6F,1, +0x3A724E,0x9C,0x73,0, +0x3A727A,0x9C,0x73,1, +0x3A7252,0xBD,0x77,0, +0x3A727C,0xBD,0x77,1, +0x3A72BC,0xBD,0x77,1, +0x3A726C,0x94,0x52,1, +0x3A7286,0x94,0x52,0, +0x3A728C,0xD6,0x5A,0, +0x3A7272,0xD6,0x5A,1, +0x3A7254,0xFF,0x7F,1, +0x3A7256,0xFF,0x7F,0, +0x3A7264,0xFF,0x7F,1, +0x9F9A58,0x7B,0x6F,0, +0x9F9A5E,0x7B,0x6F,1, +0x9F9A2A,0x9C,0x73,0, +0x9F9A30,0x9C,0x73,1, +0x9F9A36,0x9C,0x73,0, +0x9F9A3C,0x9C,0x73,1, +0x9F9A4A,0x9C,0x73,0, +0x9F9A50,0x9C,0x73,1, +0x9F9A56,0xF7,0x5E,0, +0x9F9A5C,0xF7,0x5E,1, +0x9F9A28,0x73,0x4E,0, +0x9F9A2E,0x73,0x4E,1, +0x9F9A48,0x73,0x4E,0, +0x9F9A4E,0x73,0x4E,1, +0x9F9A34,0x73,0x4E,0, +0x9F9A3A,0x9C,0x73,1, +0x9F9A2C,0xFF,0x7F,0, +0x9F9A32,0xFF,0x7F,1, +0x9F9A38,0xFF,0x7F,0, +0x9F9A3E,0xFF,0x7F,1, +0x9F9A4C,0xFF,0x7F,0, +0x9F9A52,0xFF,0x7F,1, +0xA5DD46,0xF7,0x5E,0, +0xA5DD44,0x94,0x52,0, +0xA5DD4A,0x9C,0x73,0, +0xA5DD3E,0x31,0x46,0, +0xA5DD40,0xDE,0x7B,0, +0xA5DD42,0xFF,0x7F,0, +0xA5DD48,0x5A,0x6B,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0xF7,0x5E,1, +0xA5DD64,0x94,0x52,1, +0xA5DD6A,0x9C,0x73,1, +0xA5DD5E,0x31,0x46,1, +0xA5DD60,0xDE,0x7B,1, +0xA5DD62,0xFF,0x7F,1, +0xA5DD68,0x5A,0x6B,1, +0x3D0E0C,0xFF,0x7F,1, +0x3D0E18,0xFF,0x7F,0, +0x3D0E0A,0x7B,0x6F,1, +0x3D0E1A,0x7B,0x6F,0, +0x3D0E08,0xFF,0x7F,1, +0x3D0E16,0xFF,0x7F,0, +0x3CC9C4,0xFF,0x7F,0, +0x3CC9C6,0x7B,0x6F,0, +0x3CDE7C,0xFF,0x7F,1, +0x3CDE7E,0x7B,0x6F,1, +0x51AD2C,0xFF,0x7F,0, +0x51AD2E,0x7B,0x6F,0, +0x51AD4C,0xFF,0x7F,1, +0x51AD4E,0x7B,0x6F,1, +0x51A4AE,0x7B,0x6F,0, +0x51A4AC,0xFF,0x7F,0, +0x51A4CC,0xFF,0x7F,1, +0x51A4CE,0x7B,0x6F,1, +0x51A98C,0xFF,0x7F,0, +0x51A98E,0x7B,0x6F,0, +0x51A96C,0xFF,0x7F,1, +0x51A96E,0x7B,0x6F,1, +0x51AA00,0x9C,0x73,0, +0x51AA10,0x9C,0x73,1, +0x51AA02,0xD6,0x5A,0, +0x51AA12,0xD6,0x5A,1, +0x51A9FE,0xFF,0x7F,0, +0x51AA0E,0xFF,0x7F,1, +0x51AA0A,0xFF,0x7F,0, +0x3CC984,0xFF,0x7F,0, +0x3CC986,0x7B,0x6F,0, +0x3D4B52,0xFF,0x7F,0, +0x3D4B5C,0xD6,0x5A,0, +0x3D4B54,0xFF,0x7F,0, +0x3D4B56,0x7B,0x6F,0, +0x3D4B50,0xFF,0x7F,0, +0x3CCA44,0xFF,0x7F,1, +0x3CCA46,0x7B,0x6F,1, +0x3CFB3C,0xFF,0x7F,0, +0x3CFB3E,0x7B,0x6F,0, +0x3CFB7C,0xFF,0x7F,1, +0x3CFB7E,0x7B,0x6F,1, +0x3D504C,0xBD,0x77,0, +0x3D504A,0xFF,0x7F,0, +0x3D504E,0x7B,0x6F,0, +0x3D508C,0xBD,0x77,1, +0x3D508A,0xFF,0x7F,1, +0x3D508E,0x7B,0x6F,1, +0xA5DDA2,0xF7,0x5E,0, +0xA5DDC2,0xF7,0x5E,1, +0xA5DDA6,0x9C,0x73,0, +0xA5DDC6,0x9C,0x73,1, +0xA5DDA4,0x5A,0x6B,0, +0xA5DDC4,0x5A,0x6B,1, +0xA5DDA8,0xFF,0x7F,0, +0xA5DDC8,0xFF,0x7F,1, +0x3D3E0C,0xFF,0x7F,1, +0x3D3E10,0xFF,0x7F,0, +0x3D3E0E,0x7B,0x6F,1, +0x3D3E12,0x7B,0x6F,0, +0x3CF1C0,0xFF,0x7F,0, +0x3CF200,0xFF,0x7F,1, +0x3CF1C2,0x7B,0x6F,0, +0x3CF202,0x7B,0x6F,1, +0x3D360E,0x39,0x67,1, +0x3D3614,0x39,0x67,0, +0x3D360C,0x9C,0x73,1, +0x3D3612,0x9C,0x73,0, +0x3D3604,0x5A,0x6B,0, +0x3D3606,0x5A,0x6B,1, +0x3D360A,0xFF,0x7F,1, +0x3D3610,0xFF,0x7F,0, +0x3D1A48,0xD6,0x5A,0, +0x3D1A46,0xFF,0x7F,0, +0x3D1A44,0xFF,0x7F,0, +0x3D1A4A,0x5A,0x6B,0, +0x3D1A88,0xD6,0x5A,1, +0x3D1A8A,0xFF,0xF4,1, +0x3D1A86,0xFF,0x7F,1, +0x3D1A84,0xFF,0x7F,1, +0x3CE282,0x7B,0x6F,0, +0x3CE2C2,0x7B,0x6F,1, +0x3CE280,0xFF,0x7F,0, +0x3CE2C0,0xFF,0x7F,1, +0x4FA29E,0x7B,0x6F,0, +0x4FA2DE,0x7B,0x6F,1, +0x4FA29C,0xFF,0x7F,0, +0x4FA2DC,0xFF,0x7F,1, +0x3D4786,0xFF,0x7F,1, +0x3D478C,0xFF,0x7F,0, +0x3D478E,0x18,0x63,0, +0x3D4788,0x18,0x63,1, +0x3D4790,0x18,0x63,0, +0x3D478A,0xBD,0x77,1, +0x3D4794,0x5A,0x6B,0, +0x3D4792,0xBD,0x77,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0xFF,0x7F,1, +0x3C9E40,0xFF,0x7F,0, +0x3C9E38,0xFF,0x7F,1, +0x3C9E3E,0xFF,0x7F,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0xFF,0x7F,0, +0x4F4D5E,0x7B,0x6F,0, +0x3C9320,0xFF,0x7F,0, +0x3C9322,0x7B,0x6F,0, +0x9F9CF6,0xFF,0x7F,0, +0x9F9CF8,0x7B,0x6F,0, +0x4F4E1C,0xFF,0x7F,1, +0x4F4E1E,0x7B,0x6F,1, +0x3C9450,0xFF,0x7F,1, +0x3C9452,0x7B,0x6F,1, +0x9F9D74,0xFF,0x7F,1, +0x9F9D76,0x7B,0x6F,1, +0xA6202E,0xF7,0x5E,0, +0xA62032,0x9C,0x73,0, +0xA62030,0x5A,0x6B,0, +0xA62034,0xFF,0x7F,0, +0xA6204E,0xF7,0x5E,1, +0xA62052,0x9C,0x73,1, +0xA62050,0x5A,0x6B,1, +0xA62054,0xFF,0x7F,1, +0x3D4812,0x39,0x67,0, +0x3D480E,0x39,0x67,1, +0x3D4810,0xFF,0x7F,0, +0x3D480C,0xFF,0x7F,1, +0x3CC9FE,0xFF,0x7F,0, +0x3CCA0A,0x7B,0x6F,0, +0x8CBE20,0xD6,0x5A,0, +0x8CBE22,0x7B,0x6F,0, +0x8CBE1E,0xFF,0x7F,0, +0x8CBE40,0xD6,0x5A,1, +0x8CBE42,0x7B,0x6F,1, +0x8CBE3E,0xFF,0x7F,1, +0x8CBEE0,0xFF,0x7F,0, +0x8CBEDE,0xFF,0x7F,0, +0x8CBEE2,0x7B,0x6F,0, +0x3B8F38,0xD6,0x5A,1, +0x3B8F3A,0xFF,0x7F,1, +0x3B8F40,0xD6,0x5A,0, +0x3B8F42,0xFF,0x7F,0, +0x3D1094,0x18,0x63,0, +0x3D109A,0x94,0x52,0, +0x3D1098,0x73,0x4E,0, +0x3D1096,0x7B,0x6F,0, +0x3D1092,0xFF,0x7F,0, +0x3D1090,0xFF,0x7F,0, +0x3D10D4,0x18,0x63,1, +0x3D10DA,0x94,0x52,1, +0x3D10D8,0x73,0x4E,1, +0x3D10D6,0x7B,0x6F,1, +0x3D10D2,0xFF,0x7F,1, +0x3D10D0,0xFF,0x7F,1, +0x3D14D0,0xFF,0x7F,0, +0x3D14D2,0x7B,0x6F,0, +0x3D14CE,0xFF,0x7F,0, +0x3D14CC,0x7B,0x6F,0, +0x3D1510,0x39,0x67,1, +0x3D1512,0x7B,0x6F,1, +0x3D150E,0xFF,0x7F,1, +0x3D150C,0x7B,0x6F,1, +0x3CE0F4,0xF7,0x5E,1, +0x3CE0F2,0x9C,0x73,1, +0x3CE0F0,0x7B,0x6F,1, +0x3CE0D4,0xF7,0x5E,0, +0x3CE0D2,0x9C,0x73,0, +0x3CE0D0,0x7B,0x6F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Yellow.txt b/worlds/mlss/colors/Yellow.txt new file mode 100644 index 000000000000..753a0ef97a22 --- /dev/null +++ b/worlds/mlss/colors/Yellow.txt @@ -0,0 +1,265 @@ +0x3CC884,0xFF,0x07,0, +0x3CC886,0xF7,0x02,0, +0x3CC8C4,0xFF,0x07,1, +0x3CC8C6,0xF7,0x02,1, +0x4F4CDC,0xFF,0x07,0, +0x4F4CDE,0xF7,0x02,0, +0x4F4D1C,0xFF,0x07,1, +0x4F4D1E,0xF7,0x02,1, +0x4F51D8,0xFF,0x07,1, +0x4F51DC,0xFF,0x07,0, +0x4F51E8,0xDE,0x27,0, +0x4F51EA,0xDE,0x27,1, +0x4F51DA,0xFF,0x4F,1, +0x4F51DE,0xFF,0x4F,0, +0x4FB686,0xFF,0x07,0, +0x4FB6A6,0xFF,0x07,1, +0x4FB684,0xCE,0x01,0, +0x4FB6A4,0xCE,0x01,1, +0x4FB688,0xFF,0x4F,0, +0x4FB6A8,0xFF,0x4F,1, +0x4FB786,0x39,0x03,0, +0x4FB788,0xFF,0x07,0, +0x4FB78A,0xFF,0x63,0, +0x4FB7A6,0x39,0x03,1, +0x4FB7A8,0xFF,0x07,1, +0x4FB7AA,0xFF,0x63,1, +0x51901C,0xFF,0x07,0, +0x519018,0xF7,0x01,0, +0x51901A,0xF7,0x02,0, +0x51903C,0xFF,0x07,1, +0x519038,0xF7,0x01,1, +0x51903A,0xF7,0x02,1, +0x5193EA,0xF7,0x02,0, +0x5193E8,0xFF,0x07,0, +0x51940A,0xF7,0x02,1, +0x519408,0xFF,0x07,1, +0x3A72AE,0x39,0x13,1, +0x3A7244,0x39,0x13,0, +0x3A724C,0x5A,0x17,1, +0x3A7290,0x5A,0x17,0, +0x3A72B2,0x7B,0x13,1, +0x3A7270,0x73,0x0E,1, +0x3A7288,0x73,0x0E,0, +0x3A7296,0x9C,0x17,0, +0x3A7274,0x9C,0x17,1, +0x3A7294,0x7B,0x13,0, +0x3A724A,0xBD,0x17,0, +0x3A7278,0xBD,0x17,1, +0x3A724E,0xDE,0x17,0, +0x3A727A,0xDE,0x17,1, +0x3A7252,0xFF,0x1B,0, +0x3A727C,0xFF,0x1B,1, +0x3A72BC,0xFF,0x1B,1, +0x3A726C,0x31,0x02,1, +0x3A7286,0x31,0x02,0, +0x3A728C,0x18,0x13,0, +0x3A7272,0xB5,0x12,1, +0x3A7254,0xFF,0x3B,1, +0x3A7256,0xFF,0x3B,0, +0x3A7264,0xFF,0x3B,1, +0x9F9A58,0xD6,0x3A,0, +0x9F9A5E,0xD6,0x3A,1, +0x9F9A2A,0xFF,0x07,0, +0x9F9A30,0xFF,0x07,1, +0x9F9A36,0xFF,0x07,0, +0x9F9A3C,0xFF,0x07,1, +0x9F9A4A,0xFF,0x07,0, +0x9F9A50,0xFF,0x07,1, +0x9F9A56,0x94,0x02,0, +0x9F9A5C,0x94,0x02,1, +0x9F9A28,0xCE,0x01,0, +0x9F9A2E,0xCE,0x01,1, +0x9F9A48,0xCE,0x01,0, +0x9F9A4E,0xCE,0x01,1, +0x9F9A34,0x70,0x07,0, +0x9F9A3A,0x70,0x07,1, +0x9F9A2C,0xFF,0x4F,0, +0x9F9A32,0xFF,0x4F,1, +0x9F9A38,0xFF,0x4F,0, +0x9F9A3E,0xFF,0x4F,1, +0x9F9A4C,0xFF,0x4F,0, +0x9F9A52,0xFF,0x4F,1, +0xA5DD46,0x94,0x12,0, +0xA5DD44,0xEF,0x0D,0, +0xA5DD4A,0xBD,0x1B,0, +0xA5DD3E,0xF7,0x32,0, +0xA5DD40,0xBD,0x3F,0, +0xA5DD42,0xFF,0x57,0, +0xA5DD48,0x39,0x1B,0, +0xA5DD4E,0xFF,0x7F,0, +0xA5DD66,0x94,0x12,1, +0xA5DD64,0xEF,0x0D,1, +0xA5DD6A,0xBD,0x1B,1, +0xA5DD5E,0xF7,0x32,1, +0xA5DD60,0xFF,0x43,1, +0xA5DD62,0xFF,0x57,1, +0xA5DD68,0x39,0x1B,1, +0x3D0E0C,0xFF,0x07,1, +0x3D0E18,0xFF,0x07,0, +0x3D0E0A,0xF7,0x02,1, +0x3D0E1A,0xF7,0x02,0, +0x3D0E08,0xFF,0x4F,1, +0x3D0E16,0xFF,0x4F,0, +0x3CC9C4,0xFF,0x07,0, +0x3CC9C6,0xF7,0x02,0, +0x3CDE7C,0xFF,0x07,1, +0x3CDE7E,0xF7,0x02,1, +0x51AD2C,0xFF,0x07,0, +0x51AD2E,0xF7,0x02,0, +0x51AD4C,0xFF,0x07,1, +0x51AD4E,0xF7,0x02,1, +0x51A4AE,0xF7,0x02,0, +0x51A4AC,0xFF,0x07,0, +0x51A4CC,0xFF,0x07,1, +0x51A4CE,0xF7,0x02,1, +0x51A98C,0xFF,0x07,0, +0x51A98E,0xF7,0x02,0, +0x51A96C,0xFF,0x07,1, +0x51A96E,0xF7,0x02,1, +0x51AA00,0x9C,0x07,0, +0x51AA10,0x9C,0x07,1, +0x51AA02,0xF7,0x02,0, +0x51AA12,0xF7,0x02,1, +0x51A9FE,0xFF,0x07,0, +0x51AA0E,0xFF,0x07,1, +0x51AA0A,0xFF,0x3B,0, +0x3CC984,0xFF,0x07,0, +0x3CC986,0xF7,0x02,0, +0x3D4B52,0x7B,0x07,0, +0x3D4B5C,0x94,0x02,0, +0x3D4B54,0xFF,0x07,0, +0x3D4B56,0xF7,0x02,0, +0x3D4B50,0xFF,0x4F,0, +0x3CCA44,0xFF,0x07,1, +0x3CCA46,0xF7,0x02,1, +0x3CFB3C,0xFF,0x07,0, +0x3CFB3E,0xF7,0x02,0, +0x3CFB7C,0xFF,0x07,1, +0x3CFB7E,0xF7,0x02,1, +0x3D504C,0x7B,0x07,0, +0x3D504A,0xFF,0x07,0, +0x3D504E,0xF7,0x02,0, +0x3D508C,0x7B,0x07,1, +0x3D508A,0xFF,0x07,1, +0x3D508E,0xF7,0x02,1, +0xA5DDA2,0x94,0x12,0, +0xA5DDC2,0x94,0x12,1, +0xA5DDA6,0xBD,0x1B,0, +0xA5DDC6,0xBD,0x1B,1, +0xA5DDA4,0x39,0x1B,0, +0xA5DDC4,0x39,0x1B,1, +0xA5DDA8,0xFF,0x4F,0, +0xA5DDC8,0xFF,0x4F,1, +0x3D3E0C,0xFF,0x07,1, +0x3D3E10,0xFF,0x07,0, +0x3D3E0E,0xF7,0x02,1, +0x3D3E12,0xF7,0x02,0, +0x3CF1C0,0xFF,0x07,0, +0x3CF200,0xFF,0x07,1, +0x3CF1C2,0xF7,0x02,0, +0x3CF202,0xF7,0x02,1, +0x3D360E,0x5A,0x17,1, +0x3D3614,0x5A,0x17,0, +0x3D360C,0xFF,0x4F,1, +0x3D3612,0xFF,0x4F,0, +0x3D3604,0x39,0x1B,0, +0x3D3606,0x39,0x1B,1, +0x3D360A,0xFF,0x4F,1, +0x3D3610,0xFF,0x4F,0, +0x3D1A48,0xB5,0x12,0, +0x3D1A46,0xFF,0x4F,0, +0x3D1A44,0xFF,0x4F,0, +0x3D1A4A,0x39,0x1B,0, +0x3D1A88,0xB5,0x12,1, +0x3D1A8A,0xBB,0xB4,1, +0x3D1A86,0xFF,0x4F,1, +0x3D1A84,0xFF,0x4F,1, +0x3CE282,0xF7,0x02,0, +0x3CE2C2,0xF7,0x02,1, +0x3CE280,0xFF,0x4F,0, +0x3CE2C0,0xFF,0x4F,1, +0x4FA29E,0xF7,0x02,0, +0x4FA2DE,0xF7,0x02,1, +0x4FA29C,0xFF,0x4F,0, +0x4FA2DC,0xFF,0x4F,1, +0x3D4786,0xFF,0x3B,1, +0x3D478C,0xFF,0x3B,0, +0x3D478E,0x5A,0x17,0, +0x3D4788,0x5A,0x17,1, +0x3D4790,0x5A,0x17,0, +0x3D478A,0x7B,0x07,1, +0x3D4794,0x39,0x1B,0, +0x3D4792,0x7B,0x07,0, +0x3D4784,0xFE,0x33,0, +0x3C9E3A,0xFF,0x63,1, +0x3C9E40,0xFF,0x63,0, +0x3C9E38,0xFF,0x63,1, +0x3C9E3E,0xFF,0x63,0, +0x3C9E36,0xFC,0x7F,1, +0x3C9E3C,0xFC,0x7F,0, +0x4F4D5C,0xFF,0x07,0, +0x4F4D5E,0xF7,0x02,0, +0x3C9320,0xFF,0x07,0, +0x3C9322,0xF7,0x02,0, +0x9F9CF6,0xFF,0x07,0, +0x9F9CF8,0xF7,0x02,0, +0x4F4E1C,0xFF,0x07,1, +0x4F4E1E,0xF7,0x02,1, +0x3C9450,0xFF,0x07,1, +0x3C9452,0xF7,0x02,1, +0x9F9D74,0xFF,0x07,1, +0x9F9D76,0xF7,0x02,1, +0xA6202E,0x94,0x12,0, +0xA62032,0xBD,0x1B,0, +0xA62030,0x39,0x1B,0, +0xA62034,0xFF,0x4F,0, +0xA6204E,0x94,0x12,1, +0xA62052,0xBD,0x1B,1, +0xA62050,0x39,0x1B,1, +0xA62054,0xFF,0x4F,1, +0x3D4812,0x5A,0x17,0, +0x3D480E,0x5A,0x17,1, +0x3D4810,0xFF,0x4F,0, +0x3D480C,0xFF,0x4F,1, +0x3CC9FE,0xFF,0x07,0, +0x3CCA0A,0xF7,0x02,0, +0x8CBE20,0xB5,0x12,0, +0x8CBE22,0xF7,0x02,0, +0x8CBE1E,0xFF,0x3B,0, +0x8CBE40,0xB5,0x12,1, +0x8CBE42,0xF7,0x02,1, +0x8CBE3E,0xFF,0x3B,1, +0x8CBEE0,0xFF,0x07,0, +0x8CBEDE,0xFF,0x57,0, +0x8CBEE2,0xF7,0x02,0, +0x3B8F38,0xB5,0x12,1, +0x3B8F3A,0xFF,0x57,1, +0x3B8F40,0xB5,0x12,0, +0x3B8F42,0xFF,0x57,0, +0x3D1094,0x5A,0x17,0, +0x3D109A,0xEF,0x0D,0, +0x3D1098,0xF7,0x01,0, +0x3D1096,0xF7,0x02,0, +0x3D1092,0xFF,0x57,0, +0x3D1090,0xFF,0x4F,0, +0x3D10D4,0x5A,0x17,1, +0x3D10DA,0xEF,0x0D,1, +0x3D10D8,0xF7,0x01,1, +0x3D10D6,0xF7,0x02,1, +0x3D10D2,0xFF,0x57,1, +0x3D10D0,0xFF,0x4F,1, +0x3D14D0,0xFF,0x07,0, +0x3D14D2,0xF7,0x02,0, +0x3D14CE,0xFF,0x4F,0, +0x3D14CC,0xDE,0x27,0, +0x3D1510,0x5A,0x17,1, +0x3D1512,0xF7,0x02,1, +0x3D150E,0xFF,0x4F,1, +0x3D150C,0xDE,0x27,1, +0x3CE0F4,0x94,0x12,1, +0x3CE0F2,0x9C,0x07,1, +0x3CE0F0,0xDE,0x27,1, +0x3CE0D4,0x94,0x12,0, +0x3CE0D2,0x9C,0x07,0, +0x3CE0D0,0xDE,0x27,0, \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Black.txt b/worlds/mlss/colors/pants/Black.txt new file mode 100644 index 000000000000..b1437b3954d0 --- /dev/null +++ b/worlds/mlss/colors/pants/Black.txt @@ -0,0 +1,68 @@ +0x3CC882,0x63,0x0C,0, +0x3CC880,0x84,0x10,0, +0x3CC8C2,0x63,0x0C,1, +0x3CC8C0,0x84,0x10,1, +0x4F4CDA,0x63,0x0C,0, +0x4F4CD8,0x84,0x10,0, +0x4F4D1A,0x63,0x0C,1, +0x4F4D18,0x84,0x10,1, +0x519014,0x63,0x0C,0, +0x519016,0x84,0x10,0, +0x519034,0x63,0x0C,1, +0x519036,0x84,0x10,1, +0x5193E6,0x63,0x0C,0, +0x5193E4,0x84,0x10,0, +0x519406,0x63,0x0C,1, +0x519404,0x84,0x10,1, +0x3CC9C2,0x63,0x0C,0, +0x3CC9C0,0x84,0x10,0, +0x3CDE84,0x63,0x0C,1, +0x3CDE74,0x63,0x0C,1, +0x51AD2A,0x63,0x0C,0, +0x51AD26,0x4A,0x29,0, +0x51AD28,0x84,0x10,0, +0x51AD4A,0x63,0x0C,1, +0x51AD48,0x84,0x10,1, +0x51AD46,0x4A,0x29,1, +0x51A4AA,0x63,0x0C,0, +0x51A4A6,0x4A,0x29,0, +0x51A4A8,0x84,0x10,0, +0x51A4CA,0x63,0x0C,1, +0x51A4C8,0x84,0x10,1, +0x51A4C6,0x4A,0x29,1, +0x51A98A,0x63,0x0C,0, +0x51A986,0x4A,0x29,0, +0x51A988,0x84,0x10,0, +0x51A96A,0x63,0x0C,1, +0x51A968,0x84,0x10,1, +0x51A966,0x4A,0x29,1, +0x3CC982,0x63,0x0C,0, +0x3CC980,0x84,0x10,0, +0x3D4B4E,0x08,0x21,0, +0x3D4B4C,0x4A,0x29,0, +0x3CCA42,0x63,0x0C,1, +0x3CCA40,0x84,0x10,1, +0x3CFB3A,0x63,0x0C,0, +0x3CFB38,0x84,0x10,0, +0x3CFB7A,0x63,0x0C,1, +0x3CFB78,0x84,0x10,1, +0x4F4D5A,0x63,0x0C,0, +0x4F4D58,0x84,0x10,0, +0x3C931E,0x63,0x0C,0, +0x3C931C,0x84,0x10,0, +0x9F9CF4,0x63,0x0C,0, +0x9F9CF2,0x84,0x10,0, +0x4F4E1A,0x63,0x0C,1, +0x4F4E18,0x84,0x10,1, +0x3C944E,0x63,0x0C,1, +0x3C944C,0x84,0x10,1, +0x9F9D72,0x63,0x0C,1, +0x9F9D70,0x84,0x10,1, +0x518E10,0x63,0x0C,0, +0x518E12,0x4A,0x29,0, +0x3D4806,0x63,0x0C,0, +0x3D4804,0x84,0x10,0, +0x3CCA02,0x63,0x0C,0, +0x3CCA00,0x84,0x10,0, +0x3D14C6,0x84,0x10,0, +0x3D1506,0x84,0x10,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Blue.txt b/worlds/mlss/colors/pants/Blue.txt new file mode 100644 index 000000000000..f97f60391b19 --- /dev/null +++ b/worlds/mlss/colors/pants/Blue.txt @@ -0,0 +1,68 @@ +0x3CC882,0x00,0x5C,0, +0x3CC880,0x00,0x7C,0, +0x3CC8C2,0x00,0x5C,1, +0x3CC8C0,0x00,0x7C,1, +0x4F4CDA,0x00,0x5C,0, +0x4F4CD8,0x00,0x7C,0, +0x4F4D1A,0x00,0x5C,1, +0x4F4D18,0x00,0x7C,1, +0x519014,0x00,0x5C,0, +0x519016,0x00,0x7C,0, +0x519034,0x00,0x5C,1, +0x519036,0x00,0x7C,1, +0x5193E6,0x00,0x5C,0, +0x5193E4,0x00,0x7C,0, +0x519406,0x00,0x5C,1, +0x519404,0x00,0x7C,1, +0x3CC9C2,0x00,0x5C,0, +0x3CC9C0,0x00,0x7C,0, +0x3CDE84,0x00,0x5C,1, +0x3CDE74,0x00,0x5C,1, +0x51AD2A,0x00,0x5C,0, +0x51AD26,0xB5,0x7E,0, +0x51AD28,0x00,0x7C,0, +0x51AD4A,0x00,0x5C,1, +0x51AD48,0x00,0x7C,1, +0x51AD46,0xB5,0x7E,1, +0x51A4AA,0x00,0x5C,0, +0x51A4A6,0xB5,0x7E,0, +0x51A4A8,0x00,0x7C,0, +0x51A4CA,0x00,0x5C,1, +0x51A4C8,0x00,0x7C,1, +0x51A4C6,0xB5,0x7E,1, +0x51A98A,0x00,0x5C,0, +0x51A986,0xB5,0x7E,0, +0x51A988,0x00,0x7C,0, +0x51A96A,0x00,0x5C,1, +0x51A968,0x00,0x7C,1, +0x51A966,0xB5,0x7E,1, +0x3CC982,0x00,0x5C,0, +0x3CC980,0x00,0x7C,0, +0x3D4B4E,0x73,0x72,0, +0x3D4B4C,0xB5,0x7E,0, +0x3CCA42,0x00,0x5C,1, +0x3CCA40,0x00,0x7C,1, +0x3CFB3A,0x00,0x5C,0, +0x3CFB38,0x00,0x7C,0, +0x3CFB7A,0x00,0x5C,1, +0x3CFB78,0x00,0x7C,1, +0x4F4D5A,0x00,0x5C,0, +0x4F4D58,0x00,0x7C,0, +0x3C931E,0x00,0x5C,0, +0x3C931C,0x00,0x7C,0, +0x9F9CF4,0x00,0x5C,0, +0x9F9CF2,0x00,0x7C,0, +0x4F4E1A,0x00,0x5C,1, +0x4F4E18,0x00,0x7C,1, +0x3C944E,0x00,0x5C,1, +0x3C944C,0x00,0x7C,1, +0x9F9D72,0x00,0x5C,1, +0x9F9D70,0x00,0x7C,1, +0x518E10,0x00,0x5C,0, +0x518E12,0xB5,0x7E,0, +0x3D4806,0x00,0x5C,0, +0x3D4804,0x00,0x7C,0, +0x3CCA02,0x00,0x5C,0, +0x3CCA00,0x00,0x7C,0, +0x3D14C6,0x00,0x7C,0, +0x3D1506,0x00,0x7C,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Chaos.txt b/worlds/mlss/colors/pants/Chaos.txt new file mode 100644 index 000000000000..f40a4020bab7 --- /dev/null +++ b/worlds/mlss/colors/pants/Chaos.txt @@ -0,0 +1,37 @@ +0x3CC880,0, +0x3CC882,0, +0x3CC8C0,1, +0x3CC8C2,1, +0x3CC980,0, +0x3CC982,0, +0x4f4cd8,0, +0x4F4CDA,0, +0x4F4D18,1, +0x4F4D1A,1, +0x519014,0, +0x519016,0, +0x519034,1, +0x519036,1, +0x5193E4,0, +0x5193E6,0, +0x519404,1, +0x519406,1, +0x51A988,0, +0x51A98A,0, +0x51A968,1, +0x51A96A,1, +0x51ad28,0, +0x51AD2A,0, +0x51AD48,1, +0x51AD4A,1, +0x3CFB38,0, +0x3CFB3A,0, +0x3CFB78,1, +0x3CFB7A,1, +0x3CC9C0,0, +0x3CC9C2,0, +0x3CCA40,1, +0x3CCA42,1, +0x3CDE74,1, +0x3D4B4C,0, +0x3D4B4E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Custom.txt b/worlds/mlss/colors/pants/Custom.txt new file mode 100644 index 000000000000..3d0ce054c56e --- /dev/null +++ b/worlds/mlss/colors/pants/Custom.txt @@ -0,0 +1,37 @@ +0x3CC880,0,0, +0x3CC882,1,0, +0x3CC8C0,0,1, +0x3CC8C2,1,1, +0x3CC980,0,0, +0x3CC982,1,0, +0x4f4cd8,0,0, +0x4F4CDA,1,0, +0x4F4D18,0,1, +0x4F4D1A,1,1, +0x519014,0,0, +0x519016,1,0, +0x519034,0,1, +0x519036,1,1, +0x5193E4,0,0, +0x5193E6,1,0, +0x519404,0,1, +0x519406,1,1, +0x51A988,0,0, +0x51A98A,0,0, +0x51A968,0,1, +0x51A96A,1,1, +0x51ad28,0,0, +0x51AD2A,1,0, +0x51AD48,0,1, +0x51AD4A,1,1, +0x3CFB38,0,0, +0x3CFB3A,1,0, +0x3CFB78,0,1, +0x3CFB7A,1,1, +0x3CC9C0,0,0, +0x3CC9C2,1,0, +0x3CCA40,0,1, +0x3CCA42,1,1, +0x3CDE74,1,1, +0x3D4B4C,2,0, +0x3D4B4E,0,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Cyan.txt b/worlds/mlss/colors/pants/Cyan.txt new file mode 100644 index 000000000000..898255c5fc4b --- /dev/null +++ b/worlds/mlss/colors/pants/Cyan.txt @@ -0,0 +1,68 @@ +0x3CC882,0x8B,0x73,0, +0x3CC880,0xED,0x7F,0, +0x3CC8C2,0x8B,0x73,1, +0x3CC8C0,0xED,0x7F,1, +0x4F4CDA,0x8B,0x73,0, +0x4F4CD8,0xED,0x7F,0, +0x4F4D1A,0x8B,0x73,1, +0x4F4D18,0xED,0x7F,1, +0x519014,0x8B,0x73,0, +0x519016,0xED,0x7F,0, +0x519034,0x8B,0x73,1, +0x519036,0xED,0x7F,1, +0x5193E6,0x8B,0x73,0, +0x5193E4,0xED,0x7F,0, +0x519406,0x8B,0x73,1, +0x519404,0xED,0x7F,1, +0x3CC9C2,0x8B,0x73,0, +0x3CC9C0,0xED,0x7F,0, +0x3CDE84,0x8B,0x73,1, +0x3CDE74,0x8B,0x73,1, +0x51AD2A,0x8B,0x73,0, +0x51AD26,0xFA,0x7F,0, +0x51AD28,0xED,0x7F,0, +0x51AD4A,0x8B,0x73,1, +0x51AD48,0xED,0x7F,1, +0x51AD46,0xFA,0x7F,1, +0x51A4AA,0x8B,0x73,0, +0x51A4A6,0xFA,0x7F,0, +0x51A4A8,0xED,0x7F,0, +0x51A4CA,0x8B,0x73,1, +0x51A4C8,0xED,0x7F,1, +0x51A4C6,0xFA,0x7F,1, +0x51A98A,0x8B,0x73,0, +0x51A986,0xFA,0x7F,0, +0x51A988,0xED,0x7F,0, +0x51A96A,0x8B,0x73,1, +0x51A968,0xED,0x7F,1, +0x51A966,0xFA,0x7F,1, +0x3CC982,0x8B,0x73,0, +0x3CC980,0xED,0x7F,0, +0x3D4B4E,0xD6,0x7B,0, +0x3D4B4C,0xFA,0x7F,0, +0x3CCA42,0x8B,0x73,1, +0x3CCA40,0xED,0x7F,1, +0x3CFB3A,0x8B,0x73,0, +0x3CFB38,0xED,0x7F,0, +0x3CFB7A,0x8B,0x73,1, +0x3CFB78,0xED,0x7F,1, +0x4F4D5A,0x8B,0x73,0, +0x4F4D58,0xED,0x7F,0, +0x3C931E,0x8B,0x73,0, +0x3C931C,0xED,0x7F,0, +0x9F9CF4,0x8B,0x73,0, +0x9F9CF2,0xED,0x7F,0, +0x4F4E1A,0x8B,0x73,1, +0x4F4E18,0xED,0x7F,1, +0x3C944E,0x8B,0x73,1, +0x3C944C,0xED,0x7F,1, +0x9F9D72,0x8B,0x73,1, +0x9F9D70,0xED,0x7F,1, +0x518E10,0x8B,0x73,0, +0x518E12,0xFA,0x7F,0, +0x3D4806,0x8B,0x73,0, +0x3D4804,0xED,0x7F,0, +0x3CCA02,0x8B,0x73,0, +0x3CCA00,0xED,0x7F,0, +0x3D14C6,0xED,0x7F,0, +0x3D1506,0xED,0x7F,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Green.txt b/worlds/mlss/colors/pants/Green.txt new file mode 100644 index 000000000000..7034cb3a490c --- /dev/null +++ b/worlds/mlss/colors/pants/Green.txt @@ -0,0 +1,68 @@ +0x3CC882,0xE0,0x02,0, +0x3CC880,0xA3,0x03,0, +0x3CC8C2,0xE0,0x02,1, +0x3CC8C0,0xA3,0x03,1, +0x4F4CDA,0xE0,0x02,0, +0x4F4CD8,0xA3,0x03,0, +0x4F4D1A,0xE0,0x02,1, +0x4F4D18,0xA3,0x03,1, +0x519014,0xE0,0x02,0, +0x519016,0xA3,0x03,0, +0x519034,0xE0,0x02,1, +0x519036,0xA3,0x03,1, +0x5193E6,0xE0,0x02,0, +0x5193E4,0xA3,0x03,0, +0x519406,0xE0,0x02,1, +0x519404,0xA3,0x03,1, +0x3CC9C2,0xE0,0x02,0, +0x3CC9C0,0xA3,0x03,0, +0x3CDE84,0xE0,0x02,1, +0x3CDE74,0xE0,0x02,1, +0x51AD2A,0xE0,0x02,0, +0x51AD26,0xF6,0x5B,0, +0x51AD28,0xA3,0x03,0, +0x51AD4A,0xE0,0x02,1, +0x51AD48,0xA3,0x03,1, +0x51AD46,0xF6,0x5B,1, +0x51A4AA,0xE0,0x02,0, +0x51A4A6,0xF6,0x5B,0, +0x51A4A8,0xA3,0x03,0, +0x51A4CA,0xE0,0x02,1, +0x51A4C8,0xA3,0x03,1, +0x51A4C6,0xF6,0x5B,1, +0x51A98A,0xE0,0x02,0, +0x51A986,0xF6,0x5B,0, +0x51A988,0xA3,0x03,0, +0x51A96A,0xE0,0x02,1, +0x51A968,0xA3,0x03,1, +0x51A966,0xF6,0x5B,1, +0x3CC982,0xE0,0x02,0, +0x3CC980,0xA3,0x03,0, +0x3D4B4E,0xB1,0x3B,0, +0x3D4B4C,0xF6,0x5B,0, +0x3CCA42,0xE0,0x02,1, +0x3CCA40,0xA3,0x03,1, +0x3CFB3A,0xE0,0x02,0, +0x3CFB38,0xA3,0x03,0, +0x3CFB7A,0xE0,0x02,1, +0x3CFB78,0xA3,0x03,1, +0x4F4D5A,0xE0,0x02,0, +0x4F4D58,0xA3,0x03,0, +0x3C931E,0xE0,0x02,0, +0x3C931C,0xA3,0x03,0, +0x9F9CF4,0xE0,0x02,0, +0x9F9CF2,0xA3,0x03,0, +0x4F4E1A,0xE0,0x02,1, +0x4F4E18,0xA3,0x03,1, +0x3C944E,0xE0,0x02,1, +0x3C944C,0xA3,0x03,1, +0x9F9D72,0xE0,0x02,1, +0x9F9D70,0xA3,0x03,1, +0x518E10,0xE0,0x02,0, +0x518E12,0xF6,0x5B,0, +0x3D4806,0xE0,0x02,0, +0x3D4804,0xA3,0x03,0, +0x3CCA02,0xE0,0x02,0, +0x3CCA00,0xA3,0x03,0, +0x3D14C6,0xA3,0x03,0, +0x3D1506,0xA3,0x03,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Orange.txt b/worlds/mlss/colors/pants/Orange.txt new file mode 100644 index 000000000000..e60e5bbc8851 --- /dev/null +++ b/worlds/mlss/colors/pants/Orange.txt @@ -0,0 +1,68 @@ +0x3CC882,0x3C,0x02,0, +0x3CC880,0x7F,0x02,0, +0x3CC8C2,0x3C,0x02,1, +0x3CC8C0,0x7F,0x02,1, +0x4F4CDA,0x3C,0x02,0, +0x4F4CD8,0x7F,0x02,0, +0x4F4D1A,0x3C,0x02,1, +0x4F4D18,0x7F,0x02,1, +0x519014,0x3C,0x02,0, +0x519016,0x7F,0x02,0, +0x519034,0x3C,0x02,1, +0x519036,0x7F,0x02,1, +0x5193E6,0x3C,0x02,0, +0x5193E4,0x7F,0x02,0, +0x519406,0x3C,0x02,1, +0x519404,0x7F,0x02,1, +0x3CC9C2,0x3C,0x02,0, +0x3CC9C0,0x7F,0x02,0, +0x3CDE84,0x3C,0x02,1, +0x3CDE74,0x3C,0x02,1, +0x51AD2A,0x3C,0x02,0, +0x51AD26,0x5E,0x53,0, +0x51AD28,0x7F,0x02,0, +0x51AD4A,0x3C,0x02,1, +0x51AD48,0x7F,0x02,1, +0x51AD46,0x5E,0x53,1, +0x51A4AA,0x3C,0x02,0, +0x51A4A6,0x5E,0x53,0, +0x51A4A8,0x7F,0x02,0, +0x51A4CA,0x3C,0x02,1, +0x51A4C8,0x7F,0x02,1, +0x51A4C6,0x5E,0x53,1, +0x51A98A,0x3C,0x02,0, +0x51A986,0x5E,0x53,0, +0x51A988,0x7F,0x02,0, +0x51A96A,0x3C,0x02,1, +0x51A968,0x7F,0x02,1, +0x51A966,0x5E,0x53,1, +0x3CC982,0x3C,0x02,0, +0x3CC980,0x7F,0x02,0, +0x3D4B4E,0xFE,0x42,0, +0x3D4B4C,0x5E,0x53,0, +0x3CCA42,0x3C,0x02,1, +0x3CCA40,0x7F,0x02,1, +0x3CFB3A,0x3C,0x02,0, +0x3CFB38,0x7F,0x02,0, +0x3CFB7A,0x3C,0x02,1, +0x3CFB78,0x7F,0x02,1, +0x4F4D5A,0x3C,0x02,0, +0x4F4D58,0x7F,0x02,0, +0x3C931E,0x3C,0x02,0, +0x3C931C,0x7F,0x02,0, +0x9F9CF4,0x3C,0x02,0, +0x9F9CF2,0x7F,0x02,0, +0x4F4E1A,0x3C,0x02,1, +0x4F4E18,0x7F,0x02,1, +0x3C944E,0x3C,0x02,1, +0x3C944C,0x7F,0x02,1, +0x9F9D72,0x3C,0x02,1, +0x9F9D70,0x7F,0x02,1, +0x518E10,0x3C,0x02,0, +0x518E12,0x5E,0x53,0, +0x3D4806,0x3C,0x02,0, +0x3D4804,0x7F,0x02,0, +0x3CCA02,0x3C,0x02,0, +0x3CCA00,0x7F,0x02,0, +0x3D14C6,0x7F,0x02,0, +0x3D1506,0x7F,0x02,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Pink.txt b/worlds/mlss/colors/pants/Pink.txt new file mode 100644 index 000000000000..95fe4a6016ed --- /dev/null +++ b/worlds/mlss/colors/pants/Pink.txt @@ -0,0 +1,68 @@ +0x3CC882,0xFF,0x5D,0, +0x3CC880,0xDF,0x6E,0, +0x3CC8C2,0xFF,0x5D,1, +0x3CC8C0,0xDF,0x6E,1, +0x4F4CDA,0xFF,0x5D,0, +0x4F4CD8,0xDF,0x6E,0, +0x4F4D1A,0xFF,0x5D,1, +0x4F4D18,0xDF,0x6E,1, +0x519014,0xFF,0x5D,0, +0x519016,0xDF,0x6E,0, +0x519034,0xFF,0x5D,1, +0x519036,0xDF,0x6E,1, +0x5193E6,0xFF,0x5D,0, +0x5193E4,0xDF,0x6E,0, +0x519406,0xFF,0x5D,1, +0x519404,0xDF,0x6E,1, +0x3CC9C2,0xFF,0x5D,0, +0x3CC9C0,0xDF,0x6E,0, +0x3CDE84,0xFF,0x5D,1, +0x3CDE74,0xFF,0x5D,1, +0x51AD2A,0xFF,0x5D,0, +0x51AD26,0x7F,0x77,0, +0x51AD28,0xDF,0x6E,0, +0x51AD4A,0xFF,0x5D,1, +0x51AD48,0xDF,0x6E,1, +0x51AD46,0x7F,0x77,1, +0x51A4AA,0xFF,0x5D,0, +0x51A4A6,0x7F,0x77,0, +0x51A4A8,0xDF,0x6E,0, +0x51A4CA,0xFF,0x5D,1, +0x51A4C8,0xDF,0x6E,1, +0x51A4C6,0x7F,0x77,1, +0x51A98A,0xFF,0x5D,0, +0x51A986,0x7F,0x77,0, +0x51A988,0xDF,0x6E,0, +0x51A96A,0xFF,0x5D,1, +0x51A968,0xDF,0x6E,1, +0x51A966,0x7F,0x77,1, +0x3CC982,0xFF,0x5D,0, +0x3CC980,0xDF,0x6E,0, +0x3D4B4E,0x3C,0x6B,0, +0x3D4B4C,0x7F,0x77,0, +0x3CCA42,0xFF,0x5D,1, +0x3CCA40,0xDF,0x6E,1, +0x3CFB3A,0xFF,0x5D,0, +0x3CFB38,0xDF,0x6E,0, +0x3CFB7A,0xFF,0x5D,1, +0x3CFB78,0xDF,0x6E,1, +0x4F4D5A,0xFF,0x5D,0, +0x4F4D58,0xDF,0x6E,0, +0x3C931E,0xFF,0x5D,0, +0x3C931C,0xDF,0x6E,0, +0x9F9CF4,0xFF,0x5D,0, +0x9F9CF2,0xDF,0x6E,0, +0x4F4E1A,0xFF,0x5D,1, +0x4F4E18,0xDF,0x6E,1, +0x3C944E,0xFF,0x5D,1, +0x3C944C,0xDF,0x6E,1, +0x9F9D72,0xFF,0x5D,1, +0x9F9D70,0xDF,0x6E,1, +0x518E10,0xFF,0x5D,0, +0x518E12,0x7F,0x77,0, +0x3D4806,0xFF,0x5D,0, +0x3D4804,0xDF,0x6E,0, +0x3CCA02,0xFF,0x5D,0, +0x3CCA00,0xDF,0x6E,0, +0x3D14C6,0xDF,0x6E,0, +0x3D1506,0xDF,0x6E,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Purple.txt b/worlds/mlss/colors/pants/Purple.txt new file mode 100644 index 000000000000..da46a613e405 --- /dev/null +++ b/worlds/mlss/colors/pants/Purple.txt @@ -0,0 +1,68 @@ +0x3CC882,0x0B,0x5C,0, +0x3CC880,0x10,0x7C,0, +0x3CC8C2,0x0B,0x5C,1, +0x3CC8C0,0x10,0x7C,1, +0x4F4CDA,0x0B,0x5C,0, +0x4F4CD8,0x10,0x7C,0, +0x4F4D1A,0x0B,0x5C,1, +0x4F4D18,0x10,0x7C,1, +0x519014,0x0B,0x5C,0, +0x519016,0x10,0x7C,0, +0x519034,0x0B,0x5C,1, +0x519036,0x10,0x7C,1, +0x5193E6,0x0B,0x5C,0, +0x5193E4,0x10,0x7C,0, +0x519406,0x0B,0x5C,1, +0x519404,0x10,0x7C,1, +0x3CC9C2,0x0B,0x5C,0, +0x3CC9C0,0x10,0x7C,0, +0x3CDE84,0x0B,0x5C,1, +0x3CDE74,0x0B,0x5C,1, +0x51AD2A,0x0B,0x5C,0, +0x51AD26,0xFB,0x7A,0, +0x51AD28,0x10,0x7C,0, +0x51AD4A,0x0B,0x5C,1, +0x51AD48,0x10,0x7C,1, +0x51AD46,0xFB,0x7A,1, +0x51A4AA,0x0B,0x5C,0, +0x51A4A6,0xFB,0x7A,0, +0x51A4A8,0x10,0x7C,0, +0x51A4CA,0x0B,0x5C,1, +0x51A4C8,0x10,0x7C,1, +0x51A4C6,0xFB,0x7A,1, +0x51A98A,0x0B,0x5C,0, +0x51A986,0xFB,0x7A,0, +0x51A988,0x10,0x7C,0, +0x51A96A,0x0B,0x5C,1, +0x51A968,0x10,0x7C,1, +0x51A966,0xFB,0x7A,1, +0x3CC982,0x0B,0x5C,0, +0x3CC980,0x10,0x7C,0, +0x3D4B4E,0x98,0x6E,0, +0x3D4B4C,0xFB,0x7A,0, +0x3CCA42,0x0B,0x5C,1, +0x3CCA40,0x10,0x7C,1, +0x3CFB3A,0x0B,0x5C,0, +0x3CFB38,0x10,0x7C,0, +0x3CFB7A,0x0B,0x5C,1, +0x3CFB78,0x10,0x7C,1, +0x4F4D5A,0x0B,0x5C,0, +0x4F4D58,0x10,0x7C,0, +0x3C931E,0x0B,0x5C,0, +0x3C931C,0x10,0x7C,0, +0x9F9CF4,0x0B,0x5C,0, +0x9F9CF2,0x10,0x7C,0, +0x4F4E1A,0x0B,0x5C,1, +0x4F4E18,0x10,0x7C,1, +0x3C944E,0x0B,0x5C,1, +0x3C944C,0x10,0x7C,1, +0x9F9D72,0x0B,0x5C,1, +0x9F9D70,0x10,0x7C,1, +0x518E10,0x0B,0x5C,0, +0x518E12,0xFB,0x7A,0, +0x3D4806,0x0B,0x5C,0, +0x3D4804,0x10,0x7C,0, +0x3CCA02,0x0B,0x5C,0, +0x3CCA00,0x10,0x7C,0, +0x3D14C6,0x10,0x7C,0, +0x3D1506,0x10,0x7C,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Red.txt b/worlds/mlss/colors/pants/Red.txt new file mode 100644 index 000000000000..0cc46ee322f2 --- /dev/null +++ b/worlds/mlss/colors/pants/Red.txt @@ -0,0 +1,68 @@ +0x3CC882,0x17,0x00,0, +0x3CC880,0x3F,0x04,0, +0x3CC8C2,0x17,0x00,1, +0x3CC8C0,0x3F,0x04,1, +0x4F4CDA,0x17,0x00,0, +0x4F4CD8,0x3F,0x04,0, +0x4F4D1A,0x17,0x00,1, +0x4F4D18,0x3F,0x04,1, +0x519014,0x17,0x00,0, +0x519016,0x3F,0x04,0, +0x519034,0x17,0x00,1, +0x519036,0x3F,0x04,1, +0x5193E6,0x17,0x00,0, +0x5193E4,0x3F,0x04,0, +0x519406,0x17,0x00,1, +0x519404,0x3F,0x04,1, +0x3CC9C2,0x17,0x00,0, +0x3CC9C0,0x3F,0x04,0, +0x3CDE84,0x17,0x00,1, +0x3CDE74,0x3F,0x04,1, +0x51AD2A,0x17,0x00,0, +0x51AD26,0xBF,0x56,0, +0x51AD28,0x3F,0x04,0, +0x51AD4A,0x17,0x00,1, +0x51AD48,0x3F,0x04,1, +0x51AD46,0xBF,0x56,1, +0x51A4AA,0x17,0x00,0, +0x51A4A6,0xBF,0x56,0, +0x51A4A8,0x3F,0x04,0, +0x51A4CA,0x17,0x00,1, +0x51A4C8,0x3F,0x04,1, +0x51A4C6,0xBF,0x56,1, +0x51A98A,0x17,0x00,0, +0x51A986,0xBF,0x56,0, +0x51A988,0x3F,0x04,0, +0x51A96A,0x17,0x00,1, +0x51A968,0x3F,0x04,1, +0x51A966,0xBF,0x56,1, +0x3CC982,0x17,0x00,0, +0x3CC980,0x3F,0x04,0, +0x3D4B4E,0x1D,0x3A,0, +0x3D4B4C,0xBF,0x56,0, +0x3CCA42,0x17,0x00,1, +0x3CCA40,0x3F,0x04,1, +0x3CFB3A,0x17,0x00,0, +0x3CFB38,0x3F,0x04,0, +0x3CFB7A,0x17,0x00,1, +0x3CFB78,0x3F,0x04,1, +0x4F4D5A,0x17,0x00,0, +0x4F4D58,0x3F,0x04,0, +0x3C931E,0x17,0x00,0, +0x3C931C,0x3F,0x04,0, +0x9F9CF4,0x17,0x00,0, +0x9F9CF2,0x3F,0x04,0, +0x4F4E1A,0x17,0x00,1, +0x4F4E18,0x3F,0x04,1, +0x3C944E,0x17,0x00,1, +0x3C944C,0x3F,0x04,1, +0x9F9D72,0x17,0x00,1, +0x9F9D70,0x3F,0x04,1, +0x518E10,0x17,0x00,0, +0x518E12,0xBF,0x56,0, +0x3D4806,0x17,0x00,0, +0x3D4804,0x3F,0x04,0, +0x3CCA02,0x17,0x00,0, +0x3CCA00,0x3F,0x04,0, +0x3D14C6,0x3F,0x04,0, +0x3D1506,0x3F,0x04,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/TrueChaos.txt b/worlds/mlss/colors/pants/TrueChaos.txt new file mode 100644 index 000000000000..f40a4020bab7 --- /dev/null +++ b/worlds/mlss/colors/pants/TrueChaos.txt @@ -0,0 +1,37 @@ +0x3CC880,0, +0x3CC882,0, +0x3CC8C0,1, +0x3CC8C2,1, +0x3CC980,0, +0x3CC982,0, +0x4f4cd8,0, +0x4F4CDA,0, +0x4F4D18,1, +0x4F4D1A,1, +0x519014,0, +0x519016,0, +0x519034,1, +0x519036,1, +0x5193E4,0, +0x5193E6,0, +0x519404,1, +0x519406,1, +0x51A988,0, +0x51A98A,0, +0x51A968,1, +0x51A96A,1, +0x51ad28,0, +0x51AD2A,0, +0x51AD48,1, +0x51AD4A,1, +0x3CFB38,0, +0x3CFB3A,0, +0x3CFB78,1, +0x3CFB7A,1, +0x3CC9C0,0, +0x3CC9C2,0, +0x3CCA40,1, +0x3CCA42,1, +0x3CDE74,1, +0x3D4B4C,0, +0x3D4B4E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Vanilla.txt b/worlds/mlss/colors/pants/Vanilla.txt new file mode 100644 index 000000000000..8cb514a5d7bf --- /dev/null +++ b/worlds/mlss/colors/pants/Vanilla.txt @@ -0,0 +1,37 @@ +0x3CC880,0xC6,0x7D,0, +0x3CC882,0x80,0x68,0, +0x3CC8C0,0xC6,0x7D,1, +0x3CC8C2,0x60,0x60,1, +0x3CC980,0xC6,0x7D,0, +0x3CC982,0x80,0x68,0, +0x4f4cd8,0xC6,0x7D,0, +0x4F4CDA,0x80,0x68,0, +0x4F4D18,0x83,0x7D,1, +0x4F4D1A,0x60,0x58,1, +0x519014,0x01,0x4D,0, +0x519016,0xC6,0x7D,0, +0x519034,0x01,0x4D,1, +0x519036,0xC6,0x7D,1, +0x5193E4,0xC6,0x7D,0, +0x5193E6,0x80,0x68,0, +0x519404,0x83,0x7D,1, +0x519406,0x60,0x58,1, +0x51A988,0xC6,0x7D,0, +0x51A98A,0x80,0x68,0, +0x51A968,0x83,0x7D,1, +0x51A96A,0x60,0x58,1, +0x51ad28,0xC6,0x7D,0, +0x51AD2A,0x80,0x68,0, +0x51AD48,0x83,0x7D,1, +0x51AD4A,0x60,0x58,1, +0x3CFB38,0xC6,0x7D,0, +0x3CFB3A,0x80,0x68,0, +0x3CFB78,0xC6,0x7D,1, +0x3CFB7A,0x60,0x60,1, +0x3CC9C0,0xC6,0x7D,0, +0x3CC9C2,0x80,0x68,0, +0x3CCA40,0x83,0x7D,1, +0x3CCA42,0x60,0x58,1, +0x3CDE74,0x83,0x7D,1, +0x3D4B4C,0x8F,0x7E,0, +0x3D4B4E,0x26,0x7E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/White.txt b/worlds/mlss/colors/pants/White.txt new file mode 100644 index 000000000000..9d6f5720dc7b --- /dev/null +++ b/worlds/mlss/colors/pants/White.txt @@ -0,0 +1,68 @@ +0x3CC882,0x7B,0x6F,0, +0x3CC880,0xFF,0x7F,0, +0x3CC8C2,0x7B,0x6F,1, +0x3CC8C0,0xFF,0x7F,1, +0x4F4CDA,0x7B,0x6F,0, +0x4F4CD8,0xFF,0x7F,0, +0x4F4D1A,0x7B,0x6F,1, +0x4F4D18,0xFF,0x7F,1, +0x519014,0x7B,0x6F,0, +0x519016,0xFF,0x7F,0, +0x519034,0x7B,0x6F,1, +0x519036,0xFF,0x7F,1, +0x5193E6,0x7B,0x6F,0, +0x5193E4,0xFF,0x7F,0, +0x519406,0x7B,0x6F,1, +0x519404,0xFF,0x7F,1, +0x3CC9C2,0x7B,0x6F,0, +0x3CC9C0,0xFF,0x7F,0, +0x3CDE84,0x7B,0x6F,1, +0x3CDE74,0x7B,0x6F,1, +0x51AD2A,0x7B,0x6F,0, +0x51AD26,0xFF,0x7F,0, +0x51AD28,0xFF,0x7F,0, +0x51AD4A,0x7B,0x6F,1, +0x51AD48,0xFF,0x7F,1, +0x51AD46,0xFF,0x7F,1, +0x51A4AA,0x7B,0x6F,0, +0x51A4A6,0xFF,0x7F,0, +0x51A4A8,0xFF,0x7F,0, +0x51A4CA,0x7B,0x6F,1, +0x51A4C8,0xFF,0x7F,1, +0x51A4C6,0xFF,0x7F,1, +0x51A98A,0x7B,0x6F,0, +0x51A986,0xFF,0x7F,0, +0x51A988,0xFF,0x7F,0, +0x51A96A,0x7B,0x6F,1, +0x51A968,0xFF,0x7F,1, +0x51A966,0xFF,0x7F,1, +0x3CC982,0x7B,0x6F,0, +0x3CC980,0xFF,0x7F,0, +0x3D4B4E,0x7B,0x6F,0, +0x3D4B4C,0xFF,0x7F,0, +0x3CCA42,0x7B,0x6F,1, +0x3CCA40,0xFF,0x7F,1, +0x3CFB3A,0x7B,0x6F,0, +0x3CFB38,0xFF,0x7F,0, +0x3CFB7A,0x7B,0x6F,1, +0x3CFB78,0xFF,0x7F,1, +0x4F4D5A,0x7B,0x6F,0, +0x4F4D58,0xFF,0x7F,0, +0x3C931E,0x7B,0x6F,0, +0x3C931C,0xFF,0x7F,0, +0x9F9CF4,0x7B,0x6F,0, +0x9F9CF2,0xFF,0x7F,0, +0x4F4E1A,0x7B,0x6F,1, +0x4F4E18,0xFF,0x7F,1, +0x3C944E,0x7B,0x6F,1, +0x3C944C,0xFF,0x7F,1, +0x9F9D72,0x7B,0x6F,1, +0x9F9D70,0xFF,0x7F,1, +0x518E10,0x7B,0x6F,0, +0x518E12,0xFF,0x7F,0, +0x3D4806,0x7B,0x6F,0, +0x3D4804,0xFF,0x7F,0, +0x3CCA02,0x7B,0x6F,0, +0x3CCA00,0xFF,0x7F,0, +0x3D14C6,0xFF,0x7F,0, +0x3D1506,0xFF,0x7F,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Yellow.txt b/worlds/mlss/colors/pants/Yellow.txt new file mode 100644 index 000000000000..7896b1a51fdc --- /dev/null +++ b/worlds/mlss/colors/pants/Yellow.txt @@ -0,0 +1,68 @@ +0x3CC882,0xF7,0x02,0, +0x3CC880,0xFF,0x07,0, +0x3CC8C2,0xF7,0x02,1, +0x3CC8C0,0xFF,0x07,1, +0x4F4CDA,0xF7,0x02,0, +0x4F4CD8,0xFF,0x07,0, +0x4F4D1A,0xF7,0x02,1, +0x4F4D18,0xFF,0x07,1, +0x519014,0xF7,0x02,0, +0x519016,0xFF,0x07,0, +0x519034,0xF7,0x02,1, +0x519036,0xFF,0x07,1, +0x5193E6,0xF7,0x02,0, +0x5193E4,0xFF,0x07,0, +0x519406,0xF7,0x02,1, +0x519404,0xFF,0x07,1, +0x3CC9C2,0xF7,0x02,0, +0x3CC9C0,0xFF,0x07,0, +0x3CDE84,0xF7,0x02,1, +0x3CDE74,0xF7,0x02,1, +0x51AD2A,0xF7,0x02,0, +0x51AD26,0xFF,0x4F,0, +0x51AD28,0xFF,0x07,0, +0x51AD4A,0xF7,0x02,1, +0x51AD48,0xFF,0x07,1, +0x51AD46,0xFF,0x4F,1, +0x51A4AA,0xF7,0x02,0, +0x51A4A6,0xFF,0x4F,0, +0x51A4A8,0xFF,0x07,0, +0x51A4CA,0xF7,0x02,1, +0x51A4C8,0xFF,0x07,1, +0x51A4C6,0xFF,0x4F,1, +0x51A98A,0xF7,0x02,0, +0x51A986,0xFF,0x4F,0, +0x51A988,0xFF,0x07,0, +0x51A96A,0xF7,0x02,1, +0x51A968,0xFF,0x07,1, +0x51A966,0xFF,0x4F,1, +0x3CC982,0xF7,0x02,0, +0x3CC980,0xFF,0x07,0, +0x3D4B4E,0xDE,0x27,0, +0x3D4B4C,0xFF,0x4F,0, +0x3CCA42,0xF7,0x02,1, +0x3CCA40,0xFF,0x07,1, +0x3CFB3A,0xF7,0x02,0, +0x3CFB38,0xFF,0x07,0, +0x3CFB7A,0xF7,0x02,1, +0x3CFB78,0xFF,0x07,1, +0x4F4D5A,0xF7,0x02,0, +0x4F4D58,0xFF,0x07,0, +0x3C931E,0xF7,0x02,0, +0x3C931C,0xFF,0x07,0, +0x9F9CF4,0xF7,0x02,0, +0x9F9CF2,0xFF,0x07,0, +0x4F4E1A,0xF7,0x02,1, +0x4F4E18,0xFF,0x07,1, +0x3C944E,0xF7,0x02,1, +0x3C944C,0xFF,0x07,1, +0x9F9D72,0xF7,0x02,1, +0x9F9D70,0xFF,0x07,1, +0x518E10,0xF7,0x02,0, +0x518E12,0xFF,0x4F,0, +0x3D4806,0xF7,0x02,0, +0x3D4804,0xFF,0x07,0, +0x3CCA02,0xF7,0x02,0, +0x3CCA00,0xFF,0x07,0, +0x3D14C6,0xFF,0x07,0, +0x3D1506,0xFF,0x07,1 \ No newline at end of file diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff new file mode 100644 index 0000000000000000000000000000000000000000..c6e36e067882d342ab3fac6f26f41ab1869dab72 GIT binary patch literal 16021 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:` on the textfield on top and press enter (if the +server uses password, type in the bottom textfield `/connect
: [password]`) \ No newline at end of file From d0e7d6518c93bd433f4139852e1624d4580fb331 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 15:27:22 -0500 Subject: [PATCH 02/79] Commit for PR --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index e61e91007a2d..92c94ca2b01b 100644 --- a/README.md +++ b/README.md @@ -58,11 +58,8 @@ Currently, the following games are supported: * Heretic * Landstalker: The Treasures of King Nole * Final Fantasy Mystic Quest -<<<<<<< Updated upstream * TUNIC -======= * Mario & Luigi: Superstar Saga ->>>>>>> Stashed changes For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled From b38968c9cdf6f288b7ccdb4bc0287facf13f1d11 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 16:27:33 -0500 Subject: [PATCH 03/79] Update worlds/mlss/Client.py Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> --- worlds/mlss/Client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 9f476a031474..116e2cf42a39 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -266,7 +266,6 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: def find_key(dictionary, target): - from CommonClient import logger leftover = target for key, value in dictionary.items(): From 4234e81482a5028effc54082db2dfe64be5b585b Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 16:29:13 -0500 Subject: [PATCH 04/79] Update worlds/mlss/__init__.py Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> --- worlds/mlss/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 23262a79b417..ce90000a9d2e 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -2,7 +2,7 @@ import settings from typing import Dict, Any from BaseClasses import Tutorial, ItemClassification -from ..AutoWorld import WebWorld, World +from worlds.AutoWorld import WebWorld, World 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 e40f24b98ee0cf10d3bc0fe163884245f0744005 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 16:29:29 -0500 Subject: [PATCH 05/79] Update worlds/mlss/__init__.py Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> --- worlds/mlss/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index ce90000a9d2e..2637bc91d534 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -51,7 +51,7 @@ class MLSSWorld(World): settings = typing.ClassVar[MLSSSettings] item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} - required_client_version = (0, 4, 3) + required_client_version = (0, 4, 4) excluded_locations = [] From a8792e1fc74ced2e92469cd85eb70db8c924149d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 16:31:14 -0500 Subject: [PATCH 06/79] Update worlds/mlss/docs/setup_en.md Co-authored-by: Silvris <58583688+Silvris@users.noreply.github.com> --- worlds/mlss/docs/setup_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/setup_en.md b/worlds/mlss/docs/setup_en.md index 39c2d812372e..3bf20c48ca48 100644 --- a/worlds/mlss/docs/setup_en.md +++ b/worlds/mlss/docs/setup_en.md @@ -16,7 +16,7 @@ As we are using Bizhawk, this guide is only applicable to Windows and Linux syst ## Optional Software - [Poptracker](https://github.com/black-sliver/PopTracker/releases) - -[MLSS Autotracker](https://github.com/seto10987/MLSS-PopTracker/releases) + - [MLSS Autotracker](https://github.com/seto10987/MLSS-PopTracker/releases) ## Configuring your YAML file From 0bbdae285261cdfa382a05903f017089589efca7 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Jan 2024 17:27:01 -0500 Subject: [PATCH 07/79] Remove deprecated import. Updated settings and romfile syntax --- worlds/mlss/Client.py | 18 ------------------ worlds/mlss/Rom.py | 2 +- worlds/mlss/__init__.py | 2 +- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 116e2cf42a39..ae08c4760f88 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -11,24 +11,6 @@ import math import asyncio -# This imports the bizhawk apworld if it's not already imported. This code block should be removed for a PR. -if "worlds._bizhawk" not in sys.modules: - import importlib - import os - import zipimport - - bh_apworld_path = os.path.join(os.path.dirname(sys.modules["worlds"].__file__), "_bizhawk.apworld") - if os.path.isfile(bh_apworld_path): - importer = zipimport.zipimporter(bh_apworld_path) - spec = importer.find_spec(os.path.basename(bh_apworld_path).rsplit(".", 1)[0]) - mod = importlib.util.module_from_spec(spec) - mod.__package__ = f"worlds.{mod.__package__}" - mod.__name__ = f"worlds.{mod.__name__}" - sys.modules[mod.__name__] = mod - importer.exec_module(mod) - elif not os.path.isdir(os.path.splitext(bh_apworld_path)[0]): - raise Exception("Did not find _bizhawk.apworld required to play Mario & Luigi Superstar Saga.") - import worlds._bizhawk as bizhawk from worlds._bizhawk.client import BizHawkClient diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index b0cf950b3746..14b087b6ec2d 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -54,7 +54,7 @@ def __init__(self, location, byte1, byte2, bro): def get_base_rom_as_bytes() -> bytes: - with open(get_base_rom_path("Mario & Luigi - Superstar Saga (U).gba"), "rb") as infile: + with open(get_settings().mlss_options.rom_file, "rb") as infile: base_rom_bytes = bytes(infile.read()) return base_rom_bytes diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 2637bc91d534..07fde8e53fab 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -48,7 +48,7 @@ class MLSSWorld(World): web = MLSSWebWorld() data_version = 1 option_definitions = mlss_options - settings = typing.ClassVar[MLSSSettings] + settings: typing.ClassVar[MLSSSettings] item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} required_client_version = (0, 4, 4) From b86d7ef37359a817b0a1e8edda8209ec75fb16da Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 23 Jan 2024 03:16:17 -0500 Subject: [PATCH 08/79] Updated Options to new system. Changed all references from MultiWorld to World --- worlds/mlss/Enemies.py | 2 +- worlds/mlss/Options.py | 56 ++--- worlds/mlss/Regions.py | 232 +++++++++--------- worlds/mlss/Rom.py | 83 +++---- worlds/mlss/Rules.py | 516 ++++++++++++++++++++-------------------- worlds/mlss/__init__.py | 81 +++---- 6 files changed, 486 insertions(+), 484 deletions(-) diff --git a/worlds/mlss/Enemies.py b/worlds/mlss/Enemies.py index 48fee4f96c93..2f092b513f82 100644 --- a/worlds/mlss/Enemies.py +++ b/worlds/mlss/Enemies.py @@ -201,7 +201,7 @@ def __init__(self): 0x5042CC, 0x5042EC, 0x50430C, - # 0x50438C, Popple 3 + 0x50438C, 0x5045CC, 0x5045EC, 0x50460C diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index ad388b903b8d..7ed4a52ce646 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -1,5 +1,5 @@ -import typing -from Options import Choice, Option, Toggle, StartInventoryPool +from Options import Choice, Option, Toggle, StartInventoryPool, PerGameCommonOptions +from dataclasses import dataclass class IntroSkip(Toggle): @@ -245,29 +245,29 @@ class ChuckleBeans(Choice): default = 2 -mlss_options: typing.Dict[str, type(Option)] = { - "start_inventory_from_pool": StartInventoryPool, - "coins": Coins, - "difficult_logic": DifficultLogic, - "skip_intro": IntroSkip, - "castle_skip": BowsersCastleSkip, - "extra_pipes": ExtraPipes, - "skip_minecart": SkipMinecart, - "disable_surf": DisableSurf, - "harhalls_pants": HarhallsPants, - "hidden_visible": HiddenVisible, - "blocks_invisible": BlocksInvisible, - "chuckle_beans": ChuckleBeans, - "music_options": MusicOptions, - "randomize_sounds": RandomSounds, - "randomize_enemies": RandomizeEnemies, - "randomize_bosses": RandomizeBosses, - "randomize_backgrounds": RandomizeBackgrounds, - "scale_stats": ScaleStats, - "scale_pow": ScalePow, - "tattle_hp": TattleHp, - "mario_color": MarioColor, - "luigi_color": LuigiColor, - "mario_pants": MarioPants, - "luigi_pants": LuigiPants -} +@dataclass +class MLSSOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool + coins: Coins + difficult_logic: DifficultLogic + skip_intro: IntroSkip + castle_skip: BowsersCastleSkip + extra_pipes: ExtraPipes + skip_minecart: SkipMinecart + disable_surf: DisableSurf + harhalls_pants: HarhallsPants + hidden_visible: HiddenVisible + blocks_invisible: BlocksInvisible + chuckle_beans: ChuckleBeans + music_options: MusicOptions + randomize_sounds: RandomSounds + randomize_enemies: RandomizeEnemies + randomize_bosses: RandomizeBosses + randomize_backgrounds: RandomizeBackgrounds + scale_stats: ScaleStats + scale_pow: ScalePow + tattle_hp: TattleHp + mario_color: MarioColor + luigi_color: LuigiColor + mario_pants: MarioPants + luigi_pants: LuigiPants diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 79c22b3c38e7..7d1ee60e736e 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -1,6 +1,7 @@ import typing -from BaseClasses import MultiWorld, Region, Entrance, LocationProgressType +from worlds.AutoWorld import World +from BaseClasses import Region, Entrance, LocationProgressType from worlds.generic.Rules import add_rule, set_rule from .Locations import MLSSLocation, mainArea, chucklehuck, castleTown, startingFlag, chuckolatorFlag, piranhaFlag, \ kidnappedFlag, beanstarFlag, birdoFlag, surfable, hooniversity, gwarharEntrance, gwarharMain, \ @@ -10,165 +11,164 @@ from .Names.LocationName import LocationName -def create_regions(world: MultiWorld, player: int, excluded: typing.List[str]): - menu_region = Region("Menu", player, world) - world.regions.append(menu_region) +def create_regions(world: World, excluded: typing.List[str]): + menu_region = Region("Menu", world.player, world.multiworld) + world.multiworld.regions.append(menu_region) - main_region = create_region(world, player, "Main Area", mainArea, excluded) - world.regions.append(main_region) + main_region = create_region(world, "Main Area", mainArea, excluded) + world.multiworld.regions.append(main_region) - chucklehuck_region = create_region(world, player, "Chucklehuck Woods", chucklehuck, excluded) - world.regions.append(chucklehuck_region) + chucklehuck_region = create_region(world, "Chucklehuck Woods", chucklehuck, excluded) + world.multiworld.regions.append(chucklehuck_region) - castleTown_region = create_region(world, player, "Beanbean Castle Town", castleTown, excluded) - world.regions.append(castleTown_region) + castleTown_region = create_region(world, "Beanbean Castle Town", castleTown, excluded) + world.multiworld.regions.append(castleTown_region) - startingFlag_region = create_region(world, player, "Shop Starting Flag", startingFlag, excluded) - world.regions.append(startingFlag_region) + startingFlag_region = create_region(world, "Shop Starting Flag", startingFlag, excluded) + world.multiworld.regions.append(startingFlag_region) - chuckolatorFlag_region = create_region(world, player, "Shop Chuckolator Flag", chuckolatorFlag, excluded) - world.regions.append(chuckolatorFlag_region) + chuckolatorFlag_region = create_region(world, "Shop Chuckolator Flag", chuckolatorFlag, excluded) + world.multiworld.regions.append(chuckolatorFlag_region) - piranhaFlag_region = create_region(world, player, "Shop Piranha Flag", piranhaFlag, excluded) - world.regions.append(piranhaFlag_region) + piranhaFlag_region = create_region(world, "Shop Piranha Flag", piranhaFlag, excluded) + world.multiworld.regions.append(piranhaFlag_region) - kidnappedFlag_region = create_region(world, player, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) - world.regions.append(kidnappedFlag_region) + kidnappedFlag_region = create_region(world, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) + world.multiworld.regions.append(kidnappedFlag_region) - beanstarFlag_region = create_region(world, player, "Shop Beanstar Complete Flag", beanstarFlag, excluded) - world.regions.append(beanstarFlag_region) + beanstarFlag_region = create_region(world, "Shop Beanstar Complete Flag", beanstarFlag, excluded) + world.multiworld.regions.append(beanstarFlag_region) - birdoFlag_region = create_region(world, player, "Shop Birdo Flag", birdoFlag, excluded) - world.regions.append(birdoFlag_region) + birdoFlag_region = create_region(world, "Shop Birdo Flag", birdoFlag, excluded) + world.multiworld.regions.append(birdoFlag_region) - surfable_region = create_region(world, player, "Surfable", surfable, excluded) - world.regions.append(surfable_region) + surfable_region = create_region(world, "Surfable", surfable, excluded) + world.multiworld.regions.append(surfable_region) - hooniversity_region = create_region(world, player, "Hooniversity", hooniversity, excluded) - world.regions.append(hooniversity_region) + hooniversity_region = create_region(world, "Hooniversity", hooniversity, excluded) + world.multiworld.regions.append(hooniversity_region) - gwarharEntrance_region = create_region(world, player, "GwarharEntrance", gwarharEntrance, excluded) - world.regions.append(gwarharEntrance_region) + gwarharEntrance_region = create_region(world, "GwarharEntrance", gwarharEntrance, excluded) + world.multiworld.regions.append(gwarharEntrance_region) - gwarharMain_region = create_region(world, player, "GwarharMain", gwarharMain, excluded) - world.regions.append(gwarharMain_region) + gwarharMain_region = create_region(world, "GwarharMain", gwarharMain, excluded) + world.multiworld.regions.append(gwarharMain_region) - teehee_valley_region = create_region(world, player, "TeeheeValley", teeheeValley, excluded) - world.regions.append(teehee_valley_region) + teehee_valley_region = create_region(world, "TeeheeValley", teeheeValley, excluded) + world.multiworld.regions.append(teehee_valley_region) - winkle_region = create_region(world, player, "Winkle", winkle, excluded) - world.regions.append(winkle_region) + winkle_region = create_region(world, "Winkle", winkle, excluded) + world.multiworld.regions.append(winkle_region) - sewers_region = create_region(world, player, "Sewers", sewers, excluded) - world.regions.append(sewers_region) + sewers_region = create_region(world, "Sewers", sewers, excluded) + world.multiworld.regions.append(sewers_region) - airport_region = create_region(world, player, "Airport", airport, excluded) - world.regions.append(airport_region) + airport_region = create_region(world, "Airport", airport, excluded) + world.multiworld.regions.append(airport_region) - jokesEntrance_region = create_region(world, player, "JokesEntrance", jokesEntrance, excluded) - world.regions.append(jokesEntrance_region) + jokesEntrance_region = create_region(world, "JokesEntrance", jokesEntrance, excluded) + world.multiworld.regions.append(jokesEntrance_region) - jokesMain_region = create_region(world, player, "JokesMain", jokesMain, excluded) - world.regions.append(jokesMain_region) + jokesMain_region = create_region(world, "JokesMain", jokesMain, excluded) + world.multiworld.regions.append(jokesMain_region) - postJokes_region = create_region(world, player, "PostJokes", postJokes, excluded) - world.regions.append(postJokes_region) + postJokes_region = create_region(world, "PostJokes", postJokes, excluded) + world.multiworld.regions.append(postJokes_region) - theater_region = create_region(world, player, "Theater", theater, excluded) - world.regions.append(theater_region) + theater_region = create_region(world, "Theater", theater, excluded) + world.multiworld.regions.append(theater_region) - fungitown_region = create_region(world, player, "Fungitown", fungitown, excluded) - world.regions.append(fungitown_region) + fungitown_region = create_region(world, "Fungitown", fungitown, excluded) + world.multiworld.regions.append(fungitown_region) - fungitownBeanstar_region = create_region(world, player, "FungitownBeanstar", fungitownBeanstar, excluded) - world.regions.append(fungitownBeanstar_region) + fungitownBeanstar_region = create_region(world, "FungitownBeanstar", fungitownBeanstar, excluded) + world.multiworld.regions.append(fungitownBeanstar_region) - fungitownBirdo_region = create_region(world, player, "FungitownBirdo", fungitownBirdo, excluded) - world.regions.append(fungitownBirdo_region) + fungitownBirdo_region = create_region(world, "FungitownBirdo", fungitownBirdo, excluded) + world.multiworld.regions.append(fungitownBirdo_region) - booStatue_region = create_region(world, player, "BooStatue", booStatue, excluded) - world.regions.append(booStatue_region) + booStatue_region = create_region(world, "BooStatue", booStatue, excluded) + world.multiworld.regions.append(booStatue_region) - oasis_region = create_region(world, player, "Oasis", oasis, excluded) - world.regions.append(oasis_region) + oasis_region = create_region(world, "Oasis", oasis, excluded) + world.multiworld.regions.append(oasis_region) - event_region = create_region(world, player, "Event", event, excluded) - world.regions.append(event_region) + event_region = create_region(world, "Event", event, excluded) + world.multiworld.regions.append(event_region) - if world.coins[player]: - print("CREATING REGION") - coins_region = create_region(world, player, "Coins", coins, excluded) - world.regions.append(coins_region) + if world.options.coins: + coins_region = create_region(world, "Coins", coins, excluded) + world.multiworld.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) - bowsersMini_region = create_region(world, player, "Bowser's Castle Mini", bowsersMini, excluded) - world.regions.append(bowsersMini_region) + if not world.options.castle_skip: + bowsers_region = create_region(world, "Bowser's Castle", bowsers, excluded) + world.multiworld.regions.append(bowsers_region) + bowsersMini_region = create_region(world, "Bowser's Castle Mini", bowsersMini, excluded) + world.multiworld.regions.append(bowsersMini_region) - baseUltraRocks_region = create_region(world, player, "BaseUltraRocks", baseUltraRocks, excluded) - world.regions.append(baseUltraRocks_region) + baseUltraRocks_region = create_region(world, "BaseUltraRocks", baseUltraRocks, excluded) + world.multiworld.regions.append(baseUltraRocks_region) -def connect_regions(world: MultiWorld, player: int): +def connect_regions(world: World): names: typing.Dict[str, 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)) - connect(world, player, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, player) and StateLogic.canMini(state, player)) - connect(world, player, names, "Hooniversity", "Oasis") - connect(world, player, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, player) or StateLogic.canDash(state, player)) - connect(world, player, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, player) and StateLogic.fire(state, player)) - connect(world, player, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, player) and StateLogic.fire(state, player)) - connect(world, player, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, player) and StateLogic.castleTown(state, player) and StateLogic.rose(state, player)) - connect(world, player, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, player) or state.can_reach("FungitownBirdo", "Region", player)) - connect(world, player, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, player)) - connect(world, player, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - connect(world, player, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, player) and StateLogic.fruits(state, player)) or state.can_reach("Shop Piranha Flag", "Region", player)) - connect(world, player, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", player)) - connect(world, player, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: (StateLogic.thunder(state, player) and StateLogic.fungitown(state, player)) or state.can_reach("Shop Beanstar Complete Flag", "Region", player)) - connect(world, player, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, player) and StateLogic.pieces(state, player) and StateLogic.rose(state, player)) or state.can_reach("Shop Birdo Flag", "Region", player)) - connect(world, player, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, player)) - connect(world, player, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, player)) - connect(world, player, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, player)) - connect(world, player, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, player)) - connect(world, player, names, "Main Area", "Surfable", lambda state: StateLogic.surfable(state, player)) - 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, "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) 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)) - 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)) + connect(world, names, "Menu", "Main Area") + connect(world, names, "Main Area", "Event") + if world.options.coins: + connect(world, names, "Main Area", "Coins") + connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) + connect(world, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, world.player)) + connect(world, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, world.player)) + connect(world, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + connect(world, names, "Hooniversity", "Oasis") + connect(world, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + connect(world, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) + connect(world, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) + connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) + connect(world, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, world.player) or state.can_reach("FungitownBirdo", "Region", world.player)) + connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) or state.can_reach("Shop Piranha Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: (StateLogic.thunder(state, world.player) and StateLogic.fungitown(state, world.player)) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) + connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) + connect(world, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "Main Area", "Surfable", lambda state: StateLogic.surfable(state, world.player)) + connect(world, names, "Surfable", "GwarharEntrance") + connect(world, names, "Surfable", "Oasis") + connect(world, names, "Surfable", "JokesEntrance", lambda state: StateLogic.fire(state, world.player)) + connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player)) + if not world.options.castle_skip: + connect(world, names, "PostJokes", "Bowser's Castle") + connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player)) + connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player)) + if world.options.difficult_logic: + connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.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)) + connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player)) + connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) -def create_region(world, player, name, locations, excluded): - ret = Region(name, player, world) +def create_region(world: World, name, locations, excluded): + ret = Region(name, world.player, world.multiworld) for location in locations: - loc = MLSSLocation(player, location.name, location.id, ret) + loc = MLSSLocation(world.player, location.name, location.id, ret) if location.name in excluded: continue ret.locations.append(loc) return ret -def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, +def connect(world: World, used_names: typing.Dict[str, int], source: str, target: str, rule: typing.Optional[typing.Callable] = None): - source_region = world.get_region(source, player) - target_region = world.get_region(target, player) + source_region = world.multiworld.get_region(source, world.player) + target_region = world.multiworld.get_region(target, world.player) if target not in used_names: used_names[target] = 1 @@ -177,7 +177,7 @@ def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], s used_names[target] += 1 name = target + (' ' * used_names[target]) - connection = Entrance(player, name, source_region) + connection = Entrance(world.player, name, source_region) if rule: connection.access_rule = rule diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 14b087b6ec2d..eed069f4a31d 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,15 +1,17 @@ import io import os -import bsdiff4 import pkgutil -import Utils -import settings +import bsdiff4 +import Utils +import settings +from BaseClasses import Item, Location +from worlds.AutoWorld import World +from settings import get_settings from worlds.Files import APDeltaPatch -from BaseClasses import MultiWorld, Item, Location -from .Items import item_table from .Enemies import enemies, bosses, EnemyRandomize, Enemy, EnemyGroup +from .Items import item_table from .Locations import shop, badge, pants @@ -83,14 +85,13 @@ def get_source_data(cls) -> bytes: class Rom: hash = "4b1a5897d89d9e74ec7f630eefdfd435" - def __init__(self, world: MultiWorld, player: int): - with open("Mario & Luigi - Superstar Saga (U).gba", 'rb') as file: - content = file.read() + def __init__(self, world: World): + content = get_base_rom_as_bytes() patched = self.apply_delta(content) - self.random = world.per_slot_randoms[player] + self.random = world.multiworld.per_slot_randoms[world.player] self.stream = io.BytesIO(patched) self.world = world - self.player = player + self.player = world.player def swap_colors(self, color, bro): temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") @@ -113,8 +114,8 @@ def swap_colors(self, color, bro): self.stream.write(bytes([c.byte1, c.byte2])) def swap_pants(self, color, bro): - mario_color = self.world.mario_color[self.player] - luigi_color = self.world.luigi_color[self.player] + mario_color = self.world.options.mario_color + luigi_color = self.world.options.luigi_color if bro == 0 and (colors[mario_color] == "TrueChaos" or colors[mario_color] == "Silhouette"): return if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): @@ -149,10 +150,10 @@ def item_inject(self, location: int, item_type: int, item: Item): self.stream.write(bytes([code])) self.stream.seek(location - 6, 0) b = self.stream.read(1) - if b[0] == 0x10 and self.world.hidden_visible[self.player]: + if b[0] == 0x10 and self.world.options.hidden_visible: self.stream.seek(location - 6, 0) self.stream.write(bytes([0x0])) - if b[0] == 0x0 and self.world.blocks_invisible[self.player]: + if b[0] == 0x0 and self.world.options.blocks_invisible: self.stream.seek(location - 6, 0) self.stream.write(bytes([0x10])) elif item_type == 1: @@ -188,60 +189,60 @@ def item_inject(self, location: int, item_type: int, item: Item): self.stream.write(bytes([0x18])) def patch_options(self): - name = self.world.player_name[self.player].encode("UTF-8") + name = self.world.multiworld.player_name[self.player].encode("UTF-8") self.stream.seek(0xB0, 0) self.stream.write(name) self.stream.seek(0xAF, 0) self.stream.write(self.player.to_bytes(1, 'little')) - if self.world.skip_intro[self.player]: + if self.world.options.skip_intro: # Enable Skip Intro in ROM self.stream.seek(0x244D08, 0) self.stream.write(bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) - if self.world.extra_pipes[self.player]: + if self.world.options.extra_pipes: # Spawn in extra pipes in ROM self.stream.seek(0xD00001, 0) self.stream.write(bytes([0x1])) - if self.world.castle_skip[self.player]: + if self.world.options.castle_skip: # Enable Bowser's castle skip in ROM self.stream.seek(0x3AEAB0, 0) self.stream.write(bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) self.stream.seek(0x3AEC18, 0) self.stream.write(bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) - if self.world.skip_minecart[self.player]: + if self.world.options.skip_minecart: # Enable minecart skip in ROM self.stream.seek(0x3AC728, 0) self.stream.write(bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) self.stream.seek(0x3AC56C, 0) self.stream.write(bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) - if self.world.randomize_sounds[self.player]: + if self.world.options.randomize_sounds: self.randomize_sounds() - if self.world.music_options[self.player] == 1: + if self.world.options.music_options == 1: self.randomize_music() - if self.world.music_options[self.player] == 2: + if self.world.options.music_options == 2: self.disable_music() - if self.world.randomize_backgrounds[self.player]: + if self.world.options.randomize_backgrounds: self.randomize_backgrounds() - if self.world.randomize_enemies[self.player] or self.world.randomize_bosses[self.player]: + if self.world.options.randomize_enemies or self.world.options.randomize_bosses: self.enemy_randomize() - if self.world.scale_stats[self.player]: + if self.world.options.scale_stats: self.stream.seek(0x1E9418, 0) self.stream.write(bytes([0x1])) - if self.world.scale_pow[self.player]: + if self.world.options.scale_pow: self.stream.seek(0x1E9419, 0) self.stream.write(bytes([0x1])) - if self.world.tattle_hp[self.player]: + if self.world.options.tattle_hp: self.stream.seek(0xD00000, 0) self.stream.write(bytes([0x1])) @@ -258,18 +259,18 @@ def patch_options(self): self.stream.seek(0x25FE57, 0) 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) - self.swap_pants(cpants[self.world.mario_pants[self.player]], 0) - self.swap_pants(cpants[self.world.luigi_pants[self.player]], 1) + self.swap_colors(colors[self.world.options.mario_color], 0) + self.swap_colors(colors[self.world.options.luigi_color], 1) + self.swap_pants(cpants[self.world.options.mario_pants], 0) + self.swap_pants(cpants[self.world.options.luigi_pants], 1) def enemy_randomize(self): enemy_data = EnemyRandomize() - if self.world.randomize_enemies[self.player]: + if self.world.options.randomize_enemies: enemy_data = self.populate_enemy_array(enemy_data) enemy_data = self.generate_groups(enemy_data) - if self.world.randomize_bosses[self.player]: + if self.world.options.randomize_bosses: enemy_data = self.generate_boss_groups(enemy_data) self.insert_groups(enemy_data) @@ -354,7 +355,7 @@ def populate_enemy_array(self, enemy_data_) -> EnemyRandomize: i = 0 count = 0 while True: - if 0x50402C < e < 0x50434C and self.world.castle_skip[self.player]: + if 0x50402C < e < 0x50434C and self.world.options.castle_skip: break stream_seek_position = e + 10 + (i * 4) self.stream.seek(stream_seek_position, os.SEEK_SET) @@ -474,7 +475,7 @@ def generate_boss_groups(self, enemy_data_) -> EnemyRandomize: enemy_data = enemy_data_ for boss_val in bosses: - if 0x50402C < boss_val < 0x50434C and self.world.castle_skip[self.player]: + if 0x50402C < boss_val < 0x50434C and self.world.options.castle_skip: continue stream_seek_position = boss_val + 2 self.stream.seek(stream_seek_position, os.SEEK_SET) @@ -504,7 +505,7 @@ def generate_boss_groups(self, enemy_data_) -> EnemyRandomize: return enemy_data def insert_groups(self, enemy_data): - do_boss = self.world.randomize_bosses[self.player] + do_boss = self.world.options.randomize_bosses if do_boss != 1: enemy_data.groups.extend(enemy_data.bossGroups) @@ -520,7 +521,7 @@ def insert_groups(self, enemy_data): for location in locations: if len(enemy_data.groups) > 0: - if self.world.castle_skip[self.player] and 0x50402C < location < 0x50434C: + if self.world.options.castle_skip and 0x50402C < location < 0x50434C: continue count += 1 temp_group = enemy_data.groups[0] @@ -547,7 +548,7 @@ def insert_groups(self, enemy_data): if do_boss == 1: for location in bosses: - if self.world.castle_skip[self.player] and 0x50402C < location < 0x50434C: + if self.world.options.castle_skip and 0x50402C < location < 0x50434C: continue self.random.shuffle(enemy_data.bossGroups) count += 1 @@ -603,17 +604,17 @@ def desc_inject(self, location: Location, item: Item): case _: index = value.index(location.address) + 66 - dstring = f"{self.world.player_name[item.player]}: {item.name}" + dstring = f"{self.world.multiworld.player_name[item.player]}: {item.name}" self.stream.seek(0xD11000 + (index * 0x40), 0) self.stream.write(dstring.encode("UTF8")) def close(self, path): - output_path = os.path.join(path, f"AP_{self.world.seed_name}_P{self.player}_{self.world.player_name[self.player]}.gba") + output_path = os.path.join(path, f"AP_{self.world.multiworld.seed_name}_P{self.player}_{self.world.multiworld.player_name[self.player]}.gba") with open(output_path, 'wb') as outfile: outfile.write(self.stream.getvalue()) patch = MLSSDeltaPatch(os.path.splitext(output_path)[0] + ".apmlss", player=self.player, - player_name=self.world.player_name[self.player], patched_path=output_path) + player_name=self.world.multiworld.player_name[self.player], patched_path=output_path) patch.write() os.unlink(output_path) self.stream.close() diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index f261d1488e0b..2408b2b1889a 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -1,278 +1,278 @@ from worlds.generic.Rules import add_rule, forbid_item -from BaseClasses import MultiWorld +from worlds.AutoWorld import World from .Names.LocationName import LocationName from .Locations import all_locations, hidden from . import StateLogic -def set_rules(world: MultiWorld, player: int, excluded): +def set_rules(world: World, excluded): for location in all_locations: if "Digspot" in location.name: - if (world.skip_minecart[player] and "Minecart" in location.name) or (world.castle_skip[player] and "Bowser" in location.name): + if (world.options.skip_minecart and "Minecart" in location.name) or (world.options.castle_skip and "Bowser" in location.name): continue - if world.chuckle_beans[player] == 0 or world.chuckle_beans[player] == 1 and location.id in hidden: + if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue - add_rule(world.get_location(location.name, player), lambda state: StateLogic.canDig(state, player)) + add_rule(world.multiworld.get_location(location.name, world.player), lambda state: StateLogic.canDig(state, world.player)) if "Beanstone" in location.name: - add_rule(world.get_location(location.name, player), lambda state: StateLogic.canDig(state, player)) + add_rule(world.multiworld.get_location(location.name, world.player), lambda state: StateLogic.canDig(state, world.player)) 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) + forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) if location.itemType != 0 and location.name not in excluded: - if "Bowser" in location.name and world.castle_skip[player]: + if "Bowser" in location.name and world.options.castle_skip: continue - forbid_item(world.get_location(location.name, player), "5 Coins", player) + forbid_item(world.multiworld.get_location(location.name, world.player), "5 Coins", world.player) - if world.chuckle_beans[player] == 2: - add_rule(world.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, player), - lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.JokesEndJojoraRoomDigspot, player), - lambda state: StateLogic.canDash(state, player)) + if world.options.chuckle_beans == 2: + add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), + lambda state: StateLogic.canDash(state, world.player)) - if world.chuckle_beans[player] == 1 or world.chuckle_beans[player] == 2: - add_rule(world.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, player), - lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, player), - lambda state: StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, player), - lambda state: StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, player), - lambda state: StateLogic.canDash(state, player) or StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsEDigspot2, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, player), - lambda state: StateLogic.ultra(state, player) and StateLogic.thunder(state, player)) + if world.options.chuckle_beans == 1 or world.options.chuckle_beans == 2: + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), + lambda state: StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) - forbid_item(world.get_location(LocationName.SSChuckolaMembershipCard, player), "Nuts", player) # Bandaid Fix + forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player) # Bandaid Fix - add_rule(world.get_location(LocationName.HoohooVillageHammerHouseBlock, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, player), - lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, player), - lambda state: StateLogic.canMini(state, player) and StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, player), - lambda state: StateLogic.canCrash(state, player) or StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsNWBlock, player), - lambda state: StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, player), - lambda state: StateLogic.super(state, player) and StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, player), - lambda state: StateLogic.super(state, player) and StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, player), - lambda state: StateLogic.teehee(state, player) and StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, player), - lambda state: StateLogic.ultra(state, player) and StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, player), - lambda state: StateLogic.thunder(state, player) and StateLogic.super(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, player), - lambda state: StateLogic.thunder(state, player) and StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.HoohooVillageMoleBehindTurtle, player), - lambda state: StateLogic.canDash(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.HoohooVillageMoleBehindTurtle, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, player), - lambda state: StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, player), - lambda state: StateLogic.thunder(state, player) and StateLogic.pieces(state, player) and StateLogic.castleTown(state, player) and StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, player), - lambda state: StateLogic.canDig(state, player) and StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, player), - lambda state: StateLogic.fruits(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom7Block1, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom7Block2, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block1, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block2, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsRoom4Block3, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastleFakeBeastar, player), - lambda state: StateLogic.pieces(state, player) and StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.BeanbeanCastlePeachsExtraDress, player), - lambda state: StateLogic.pieces(state, player) and StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.SewersRoom5Block1, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.SewersRoom5Block2, player), - lambda state: StateLogic.hammers(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, player), - lambda state: StateLogic.canDash(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, player), - lambda state: StateLogic.canDash(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, player), - lambda state: StateLogic.canDash(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonRedPearlBean, player), - lambda state: StateLogic.fire(state, player) and StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonGreenPearlBean, player), - lambda state: StateLogic.fire(state, player) and StateLogic.thunder(state, player)) - add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, player), - lambda state: StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, player), - lambda state: StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, player), - lambda state: StateLogic.ultra(state, player)) - add_rule(world.get_location(LocationName.OhoOasisFirebrand, player), - lambda state: StateLogic.canMini(state, player)) - add_rule(world.get_location(LocationName.OhoOasisThunderhand, player), - lambda state: StateLogic.canDig(state, player)) - add_rule(world.get_location(LocationName.BeanstarPieceYoshiTheater, player), - lambda state: StateLogic.neon(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterAzureYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterBlueYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterGreenYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterOrangeYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterPurpleYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterRedYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.YoshiTheaterYellowYoshi, player), - lambda state: StateLogic.beanFruit(state, player)) - add_rule(world.get_location(LocationName.WinkleAreaBeanstarRoomBlock, player), - lambda state: StateLogic.winkle(state, player)) - add_rule(world.get_location(LocationName.BeanstarPieceWinkleArea, player), - lambda state: StateLogic.winkle(state, player)) - add_rule(world.get_location(LocationName.GwarharLagoonSpangleReward, player), - lambda state: StateLogic.spangle(state, player)) - add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag1, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag2, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.PantsShopMomPiranhaFlag3, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag1, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag2, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.BadgeShopMomPiranhaFlag3, player), - lambda state: StateLogic.brooch(state, player) or StateLogic.rose(state, player)) - add_rule(world.get_location(LocationName.ChateauGreenGoblet, player), - 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)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), + lambda state: StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), + lambda state: StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), + lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), + lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), + lambda state: StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), + lambda state: StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), + lambda state: StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), + lambda state: StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), + lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), + lambda state: StateLogic.thunder(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), + lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), + lambda state: StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), + lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), + lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), + lambda state: StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), + lambda state: StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), + lambda state: StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), + lambda state: StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), + lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), + lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), + lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), + lambda state: StateLogic.neon(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), + lambda state: StateLogic.winkle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), + lambda state: StateLogic.winkle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + lambda state: StateLogic.spangle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) + if world.options.difficult_logic: + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + lambda state: StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), + lambda state: StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), + lambda state: StateLogic.canCrash(state, world.player)) - if world.coins[player]: - add_rule(world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, 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.super(state, player) or StateLogic.canDash(state, player)) - add_rule(world.get_location("S.S Chuckola Storage Room Coin Block 2", player), - lambda state: StateLogic.super(state, player) or StateLogic.canDash(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)))) + if world.options.coins: + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), + lambda state: StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), + lambda state: StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), + lambda state: StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 1", world.player), + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 2", world.player), + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Jokes End Second Floor West Room Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and (StateLogic.membership(state, world.player) or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 07fde8e53fab..c04789856784 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -4,11 +4,8 @@ from BaseClasses import Tutorial, ItemClassification from worlds.AutoWorld import WebWorld, World 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 +from .Options import MLSSOptions from .Items import MLSSItem, itemList, item_frequencies, item_table -from .Rom import Rom from .Names.LocationName import LocationName from .Client import MLSSClient @@ -33,7 +30,7 @@ class RomFile(settings.UserFilePath): """File name of the MLSS US rom""" copy_to = "Mario & Luigi - Superstar Saga (U).gba" description = "MLSS ROM File" - md5s = [Rom.hash] + md5s = ["4b1a5897d89d9e74ec7f630eefdfd435"] rom_file: RomFile = RomFile(RomFile.copy_to) rom_start: bool = True @@ -47,7 +44,8 @@ class MLSSWorld(World): game = "Mario & Luigi Superstar Saga" web = MLSSWebWorld() data_version = 1 - option_definitions = mlss_options + options_dataclass = MLSSOptions + options: MLSSOptions settings: typing.ClassVar[MLSSSettings] item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} @@ -57,34 +55,35 @@ class MLSSWorld(World): def generate_early(self) -> None: self.excluded_locations = [] - if self.multiworld.chuckle_beans[self.player] == 0: + if self.options.chuckle_beans == 0: self.excluded_locations += [location.name for location in all_locations if "Digspot" in location.name] - if self.multiworld.castle_skip[self.player]: + if self.options.castle_skip: self.excluded_locations += [location.name for location in all_locations if "Bowser" in location.name] - if self.multiworld.chuckle_beans[self.player] == 1: + if self.options.chuckle_beans == 1: self.excluded_locations = [location.name for location in all_locations if location.id in hidden] - if self.multiworld.skip_minecart[self.player]: + if self.options.skip_minecart: self.excluded_locations += [LocationName.HoohooMountainBaseMinecartCaveDigspot] - if self.multiworld.disable_surf[self.player]: + if self.options.disable_surf: self.excluded_locations += [LocationName.SurfMinigame] - if self.multiworld.harhalls_pants[self.player]: + if self.options.harhalls_pants: self.excluded_locations += [LocationName.HarhallsPants] - if not self.multiworld.coins[self.player]: + if not self.options.coins: 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) - connect_regions(self.multiworld, self.player) + from .Regions import create_regions, connect_regions + create_regions(self, self.excluded_locations) + connect_regions(self) def fill_slot_data(self) -> dict: return { - "CastleSkip": self.multiworld.castle_skip[self.player].value, - "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, - "DifficultLogic": self.multiworld.difficult_logic[self.player].value, - "Coins": self.multiworld.coins[self.player].value + "CastleSkip": self.options.castle_skip.value, + "SkipMinecart": self.options.skip_minecart.value, + "DisableSurf": self.options.disable_surf.value, + "HarhallsPants": self.options.harhalls_pants.value, + "ChuckleBeans": self.options.chuckle_beans.value, + "DifficultLogic": self.options.difficult_logic.value, + "Coins": self.options.coins.value } def generate_basic(self) -> None: @@ -116,13 +115,13 @@ def generate_basic(self) -> None: def create_items(self) -> None: # First add in all progression and useful items required_items = [] - precollected = [item for item in itemList if item in self.multiworld.precollected_items[self.player]] + precollected = [item for item in itemList if item in self.multiworld.precollected_items] for item in itemList: if item.progression != ItemClassification.filler and item.progression != ItemClassification.skip_balancing and item not in precollected: freq = item_frequencies.get(item.itemName, 1) if freq is None: freq = 1 - if self.multiworld.harhalls_pants[self.player] and "Harhall's" in item.itemName: + if self.options.harhalls_pants and "Harhall's" in item.itemName: continue required_items += [item.itemName for _ in range(freq)] @@ -133,13 +132,13 @@ 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]: + if item.itemName == "5 Coins" and not self.options.coins: continue freq = item_frequencies.get(item.itemName) - if self.multiworld.chuckle_beans[self.player] == 0: + if self.options.chuckle_beans == 0: if item.itemName == "Chuckle Bean": continue - if self.multiworld.chuckle_beans[self.player] == 1: + if self.options.chuckle_beans == 1: if item.itemName == "Chuckle Bean": freq -= 59 if freq is None: @@ -147,19 +146,19 @@ def create_items(self) -> None: filler_items += [item.itemName for _ in range(freq)] remaining = len(all_locations) - len(required_items) - len(event) - 3 - if self.multiworld.castle_skip[self.player]: + if self.options.castle_skip: remaining -= (len(bowsers) + len(bowsersMini)) - if self.multiworld.skip_minecart[self.player]: + if self.options.skip_minecart: remaining -= 1 - if self.multiworld.disable_surf[self.player]: + if self.options.disable_surf: remaining -= 1 - if self.multiworld.harhalls_pants[self.player]: + if self.options.harhalls_pants: remaining -= 1 - if self.multiworld.chuckle_beans[self.player] == 0: + if self.options.chuckle_beans == 0: remaining -= 186 - if self.multiworld.chuckle_beans[self.player] == 1: - remaining -= 59 - if not self.multiworld.coins[self.player]: + if self.options.chuckle_beans == 1: + remaining -= 58 + if not self.options.coins: remaining -= len(coins) for i in range(remaining): filler_item_name = self.multiworld.random.choice(filler_items) @@ -168,7 +167,8 @@ def create_items(self) -> None: filler_items.remove(filler_item_name) def set_rules(self) -> None: - set_rules(self.multiworld, self.player, self.excluded_locations) + from .Rules import set_rules + set_rules(self, self.excluded_locations) self.multiworld.completion_condition[self.player] = \ lambda state: state.can_reach("PostJokes", "Region", self.player) @@ -177,14 +177,15 @@ def create_item(self, name: str) -> MLSSItem: return MLSSItem(item.itemName, item.progression, item.code, self.player) def generate_output(self, output_directory: str) -> None: - rom = Rom(self.multiworld, self.player) + from .Rom import Rom + rom = Rom(self) for location_name in location_table.keys(): - if (self.multiworld.skip_minecart[self.player] and "Minecart" in location_name and "After" not in location_name) or (self.multiworld.castle_skip[self.player] and "Bowser" in location_name) or (self.multiworld.disable_surf[self.player] and "Surf Minigame" in location_name) or (self.multiworld.harhalls_pants[self.player] and "Harhall's" in location_name): + if (self.options.skip_minecart and "Minecart" in location_name and "After" not in location_name) or (self.options.castle_skip and "Bowser" in location_name) or (self.options.disable_surf and "Surf Minigame" in location_name) or (self.options.harhalls_pants and "Harhall's" in location_name): 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): + if (self.options.chuckle_beans == 0 and "Digspot" in location_name) or (self.options.chuckle_beans == 1 and location_table[location_name] in hidden): continue - if not self.multiworld.coins[self.player] and "Coin" in location_name: + if not self.options.coins 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: From 94dcb26dea419971907cdde89b06a02ed0ab3632 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 23 Jan 2024 03:44:28 -0500 Subject: [PATCH 09/79] Changed switch statements to if else --- worlds/mlss/Rom.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index eed069f4a31d..a84fcd789a93 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -578,31 +578,28 @@ def desc_inject(self, location: Location, item: Item): index = -1 for key, value in shop.items(): if location.address in value: - match key: - case 0x3C05f0: - index = value.index(location.address) - case _: - index = value.index(location.address) + 14 + if key == 0x3C05f0: + index = value.index(location.address) + else: + index = value.index(location.address) + 14 for key, value in badge.items(): if index != -1: break if location.address in value: - match key: - case 0x3C0618: - index = value.index(location.address) + 24 - case _: - index = value.index(location.address) + 41 + if key == 0x3C0618: + index = value.index(location.address) + 24 + else: + index = value.index(location.address) + 41 for key, value in pants.items(): if index != -1: break if location.address in value: - match key: - case 0x3C0618: - index = value.index(location.address) + 48 - case _: - index = value.index(location.address) + 66 + if key ==0x3C0618: + index = value.index(location.address) + 48 + else: + index = value.index(location.address) + 66 dstring = f"{self.world.multiworld.player_name[item.player]}: {item.name}" self.stream.seek(0xD11000 + (index * 0x40), 0) From 908c609613405eae11df798262ef08978472cfe4 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 23 Jan 2024 13:40:30 -0500 Subject: [PATCH 10/79] Update en_Mario & Luigi Superstar Saga.md --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 5d285ec5240f..1858baa48fe6 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -15,7 +15,7 @@ The game has been changed to an open-world style as opposed to the linear style Other Features such as Turbo through textboxes (Hold L/R+A) and Pipe Warping from any room (Hold L+R+SELECT) have been added for convenience. -Enemies and Bosses can be randomized, and there stats can scaled to feel more the vanilla games stats. +Enemies and Bosses can be randomized, and their stats can be scaled to feel more like the vanilla game's stats. Other aspects of the game can be randomized as well such as music, sounds, battle backgrounds, Mario and Luigis Colors, and more. From d9942acd81121f5683853504f939a83e855e114a Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 23 Jan 2024 18:16:12 -0500 Subject: [PATCH 11/79] Updated client.py --- worlds/mlss/Client.py | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index ae08c4760f88..d5a39dd5a217 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -16,30 +16,21 @@ if TYPE_CHECKING: from worlds._bizhawk.context import BizHawkClientContext -else: - BizHawkClientContext = object ROOM_ARRAY_POINTER = 0x51fa00 -# Add .apmlss suffix to bizhawk client -from worlds.LauncherComponents import SuffixIdentifier, components -for component in components: - if component.script_name == "BizHawkClient": - component.file_identifier = SuffixIdentifier(*(*component.file_identifier.suffixes, ".apmlss")) - break - - class MLSSClient(BizHawkClient): game = "Mario & Luigi Superstar Saga" system = "GBA" + patch_suffix = ".apmlss" local_checked_locations: Set[int] goal_flag: int rom_slot_name: Optional[str] - player: int eCount: int eUsed: [int] player_name: Optional[str] checked_flags: dict[int, list] = {} + ctx: BizHawkClientContext def __init__(self) -> None: super().__init__() @@ -47,7 +38,6 @@ def __init__(self) -> None: self.local_set_events = {} self.local_found_key_items = {} self.rom_slot_name = None - self.lock = asyncio.Lock self.eCount = 0 self.eUsed = [] @@ -80,8 +70,6 @@ async def validate_rom(self, ctx: BizHawkClientContext) -> bool: ctx.watcher_timeout = 0.125 self.rom_slot_name = rom_name name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xB0, 16, "ROM")]))[0]) - player = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xAF, 1, "ROM")]))[0][0]) - self.player = player + 1 name = bytes([byte for byte in name_bytes if byte != 0]).decode("UTF-8") self.player_name = name logger.info(name) @@ -98,7 +86,9 @@ 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"), (0x304A, 1, "EWRAM"), (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x4800, 6, "EWRAM"), (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), (0x2339, 1, "IWRAM")]) + (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] @@ -128,28 +118,20 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: location = pants[shop_address][shop_scroll] if location in ctx.server_locations: locs_to_send.add(location) - + # Loop for recieving items. Item is written as an ID into 0x3057. + # ASM read the ID in a loop and give the player the item before resetting the RAM address to 0x0. + # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items 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) + b = await bizhawk.read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")]) 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 ''' - + # Early return and location send if you are currently in a shop, + # since other flags aren't going to change if shopping & 0x3 == 0x3: if locs_to_send != self.local_checked_locations: self.local_checked_locations = locs_to_send From aed0896294594c09e02ae159ae29d3b16a142913 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 24 Jan 2024 02:48:06 -0500 Subject: [PATCH 12/79] Update Client.py --- worlds/mlss/Client.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index d5a39dd5a217..ac2d0e78e8cb 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -30,7 +30,6 @@ class MLSSClient(BizHawkClient): eUsed: [int] player_name: Optional[str] checked_flags: dict[int, list] = {} - ctx: BizHawkClientContext def __init__(self) -> None: super().__init__() @@ -41,7 +40,7 @@ def __init__(self) -> None: self.eCount = 0 self.eUsed = [] - async def validate_rom(self, ctx: BizHawkClientContext) -> bool: + async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: from CommonClient import logger try: @@ -75,7 +74,7 @@ async def validate_rom(self, ctx: BizHawkClientContext) -> bool: logger.info(name) for i in range(59): - self.checked_flags[i] = [9, 10] + self.checked_flags[i] = [] return True From 2ea54cea34caaf6a6499f45adb0693aefc35e7db Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 31 Jan 2024 04:37:46 -0500 Subject: [PATCH 13/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 1858baa48fe6..68916d21da25 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -1,8 +1,8 @@ # Mario & Luigi: Superstar Saga -## Where is the settings page? +## Where is the options page? -The [player settings page for this game](../player-settings) contains all the options you need to configure and +The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. ## What does randomization do to this game? From 5f2a75b1c60c80ddc35cf9e64757ccee02ae5ef7 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Fri, 9 Feb 2024 10:14:08 -0500 Subject: [PATCH 14/79] Updated logic, Updated patch implementation, Removed unused imports, Cleaned up Code --- worlds/mlss/Client.py | 20 ++---- worlds/mlss/Options.py | 2 +- worlds/mlss/Regions.py | 134 +++++++++++--------------------------- worlds/mlss/Rom.py | 17 +---- worlds/mlss/Rules.py | 53 ++++++++++----- worlds/mlss/StateLogic.py | 2 +- worlds/mlss/__init__.py | 9 ++- 7 files changed, 89 insertions(+), 148 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index ac2d0e78e8cb..535afdb1e3ea 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -1,14 +1,9 @@ -import time -from typing import TYPE_CHECKING, Optional, Dict, Set, List +from typing import TYPE_CHECKING, Optional, Set import struct -from BaseClasses import MultiWorld from NetUtils import ClientStatus from .Locations import roomCount, nonBlock, beanstones, roomException, shop, badge, pants, eReward -from .Items import items_by_id, ItemData -from collections import defaultdict -import sys -import logging -import math +from .Items import items_by_id + import asyncio import worlds._bizhawk as bizhawk @@ -78,11 +73,10 @@ async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: return True - async def set_auth(self, ctx: BizHawkClientContext) -> None: + async def set_auth(self, ctx: "BizHawkClientContext") -> None: ctx.auth = self.player_name - async def game_watcher(self, ctx: BizHawkClientContext) -> None: - from CommonClient import logger + async def game_watcher(self, ctx: "BizHawkClientContext") -> None: try: read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x304A, 1, "EWRAM"), @@ -103,7 +97,6 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: return locs_to_send = set() - location = 0 # Checking shop purchases if is_buy: @@ -117,15 +110,16 @@ async def game_watcher(self, ctx: BizHawkClientContext) -> None: location = pants[shop_address][shop_scroll] if location in ctx.server_locations: locs_to_send.add(location) + # Loop for recieving items. Item is written as an ID into 0x3057. # ASM read the ID in a loop and give the player the item before resetting the RAM address to 0x0. # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items for i in range(len(ctx.items_received) - received_index): item_data = items_by_id[ctx.items_received[received_index + i].item] - await asyncio.sleep(.05) b = await bizhawk.read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")]) 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")]) + await asyncio.sleep(.05) else: break diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 7ed4a52ce646..c155bffd16bd 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -1,4 +1,4 @@ -from Options import Choice, Option, Toggle, StartInventoryPool, PerGameCommonOptions +from Options import Choice, Toggle, StartInventoryPool, PerGameCommonOptions from dataclasses import dataclass diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 7d1ee60e736e..6b4cffb2196c 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -1,116 +1,56 @@ import typing from worlds.AutoWorld import World -from BaseClasses import Region, Entrance, LocationProgressType -from worlds.generic.Rules import add_rule, set_rule +from BaseClasses import Region, Entrance 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, coins from . import StateLogic -from .Names.LocationName import LocationName -def create_regions(world: World, excluded: typing.List[str]): +def create_regions(world: "World", excluded: typing.List[str]): menu_region = Region("Menu", world.player, world.multiworld) world.multiworld.regions.append(menu_region) - main_region = create_region(world, "Main Area", mainArea, excluded) - world.multiworld.regions.append(main_region) - - chucklehuck_region = create_region(world, "Chucklehuck Woods", chucklehuck, excluded) - world.multiworld.regions.append(chucklehuck_region) - - castleTown_region = create_region(world, "Beanbean Castle Town", castleTown, excluded) - world.multiworld.regions.append(castleTown_region) - - startingFlag_region = create_region(world, "Shop Starting Flag", startingFlag, excluded) - world.multiworld.regions.append(startingFlag_region) - - chuckolatorFlag_region = create_region(world, "Shop Chuckolator Flag", chuckolatorFlag, excluded) - world.multiworld.regions.append(chuckolatorFlag_region) - - piranhaFlag_region = create_region(world, "Shop Piranha Flag", piranhaFlag, excluded) - world.multiworld.regions.append(piranhaFlag_region) - - kidnappedFlag_region = create_region(world, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) - world.multiworld.regions.append(kidnappedFlag_region) - - beanstarFlag_region = create_region(world, "Shop Beanstar Complete Flag", beanstarFlag, excluded) - world.multiworld.regions.append(beanstarFlag_region) - - birdoFlag_region = create_region(world, "Shop Birdo Flag", birdoFlag, excluded) - world.multiworld.regions.append(birdoFlag_region) - - surfable_region = create_region(world, "Surfable", surfable, excluded) - world.multiworld.regions.append(surfable_region) - - hooniversity_region = create_region(world, "Hooniversity", hooniversity, excluded) - world.multiworld.regions.append(hooniversity_region) - - gwarharEntrance_region = create_region(world, "GwarharEntrance", gwarharEntrance, excluded) - world.multiworld.regions.append(gwarharEntrance_region) - - gwarharMain_region = create_region(world, "GwarharMain", gwarharMain, excluded) - world.multiworld.regions.append(gwarharMain_region) - - teehee_valley_region = create_region(world, "TeeheeValley", teeheeValley, excluded) - world.multiworld.regions.append(teehee_valley_region) - - winkle_region = create_region(world, "Winkle", winkle, excluded) - world.multiworld.regions.append(winkle_region) - - sewers_region = create_region(world, "Sewers", sewers, excluded) - world.multiworld.regions.append(sewers_region) - - airport_region = create_region(world, "Airport", airport, excluded) - world.multiworld.regions.append(airport_region) - - jokesEntrance_region = create_region(world, "JokesEntrance", jokesEntrance, excluded) - world.multiworld.regions.append(jokesEntrance_region) - - jokesMain_region = create_region(world, "JokesMain", jokesMain, excluded) - world.multiworld.regions.append(jokesMain_region) - - postJokes_region = create_region(world, "PostJokes", postJokes, excluded) - world.multiworld.regions.append(postJokes_region) - - theater_region = create_region(world, "Theater", theater, excluded) - world.multiworld.regions.append(theater_region) - - fungitown_region = create_region(world, "Fungitown", fungitown, excluded) - world.multiworld.regions.append(fungitown_region) - - fungitownBeanstar_region = create_region(world, "FungitownBeanstar", fungitownBeanstar, excluded) - world.multiworld.regions.append(fungitownBeanstar_region) - - fungitownBirdo_region = create_region(world, "FungitownBirdo", fungitownBirdo, excluded) - world.multiworld.regions.append(fungitownBirdo_region) - - booStatue_region = create_region(world, "BooStatue", booStatue, excluded) - world.multiworld.regions.append(booStatue_region) - - oasis_region = create_region(world, "Oasis", oasis, excluded) - world.multiworld.regions.append(oasis_region) - - event_region = create_region(world, "Event", event, excluded) - world.multiworld.regions.append(event_region) + create_region(world, "Main Area", mainArea, excluded) + create_region(world, "Chucklehuck Woods", chucklehuck, excluded) + create_region(world, "Beanbean Castle Town", castleTown, excluded) + create_region(world, "Shop Starting Flag", startingFlag, excluded) + create_region(world, "Shop Chuckolator Flag", chuckolatorFlag, excluded) + create_region(world, "Shop Piranha Flag", piranhaFlag, excluded) + create_region(world, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) + create_region(world, "Shop Beanstar Complete Flag", beanstarFlag, excluded) + create_region(world, "Shop Birdo Flag", birdoFlag, excluded) + create_region(world, "Surfable", surfable, excluded) + create_region(world, "Hooniversity", hooniversity, excluded) + create_region(world, "GwarharEntrance", gwarharEntrance, excluded) + create_region(world, "GwarharMain", gwarharMain, excluded) + create_region(world, "TeeheeValley", teeheeValley, excluded) + create_region(world, "Winkle", winkle, excluded) + create_region(world, "Sewers", sewers, excluded) + create_region(world, "Airport", airport, excluded) + create_region(world, "JokesEntrance", jokesEntrance, excluded) + create_region(world, "JokesMain", jokesMain, excluded) + create_region(world, "PostJokes", postJokes, excluded) + create_region(world, "Theater", theater, excluded) + create_region(world, "Fungitown", fungitown, excluded) + create_region(world, "FungitownBeanstar", fungitownBeanstar, excluded) + create_region(world, "FungitownBirdo", fungitownBirdo, excluded) + create_region(world, "BooStatue", booStatue, excluded) + create_region(world, "Oasis", oasis, excluded) + create_region(world, "Event", event, excluded) + create_region(world, "BaseUltraRocks", baseUltraRocks, excluded) if world.options.coins: - coins_region = create_region(world, "Coins", coins, excluded) - world.multiworld.regions.append(coins_region) + create_region(world, "Coins", coins, excluded) if not world.options.castle_skip: - bowsers_region = create_region(world, "Bowser's Castle", bowsers, excluded) - world.multiworld.regions.append(bowsers_region) - bowsersMini_region = create_region(world, "Bowser's Castle Mini", bowsersMini, excluded) - world.multiworld.regions.append(bowsersMini_region) - - baseUltraRocks_region = create_region(world, "BaseUltraRocks", baseUltraRocks, excluded) - world.multiworld.regions.append(baseUltraRocks_region) + create_region(world, "Bowser's Castle", bowsers, excluded) + create_region(world, "Bowser's Castle Mini", bowsersMini, excluded) -def connect_regions(world: World): +def connect_regions(world: "World"): names: typing.Dict[str, int] = {} connect(world, names, "Menu", "Main Area") @@ -131,7 +71,7 @@ def connect_regions(world: World): connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) or state.can_reach("Shop Piranha Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: (StateLogic.thunder(state, world.player) and StateLogic.fungitown(state, world.player)) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) @@ -162,10 +102,10 @@ def create_region(world: World, name, locations, excluded): if location.name in excluded: continue ret.locations.append(loc) - return ret + world.multiworld.regions.append(ret) -def connect(world: World, used_names: typing.Dict[str, int], source: str, target: str, +def connect(world: "World", used_names: typing.Dict[str, int], source: str, target: str, rule: typing.Optional[typing.Callable] = None): source_region = world.multiworld.get_region(source, world.player) target_region = world.multiworld.get_region(target, world.player) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index a84fcd789a93..29277c82ecd6 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,11 +1,8 @@ import io import os import pkgutil - import bsdiff4 -import Utils -import settings from BaseClasses import Item, Location from worlds.AutoWorld import World from settings import get_settings @@ -58,21 +55,11 @@ def __init__(self, location, byte1, byte2, bro): def get_base_rom_as_bytes() -> bytes: with open(get_settings().mlss_options.rom_file, "rb") as infile: base_rom_bytes = bytes(infile.read()) - return base_rom_bytes -def get_base_rom_path(file_name: str = "") -> str: - options: settings.Settings = settings.get_settings() - if not file_name: - file_name = options["mlss_options"]["rom_file"] - if not os.path.exists(file_name): - file_name = Utils.user_path(file_name) - return file_name - - class MLSSDeltaPatch(APDeltaPatch): - game = "Mario & Luigi: Superstar Saga" + game = "Mario & Luigi Superstar Saga" hash = "4b1a5897d89d9e74ec7f630eefdfd435" patch_file_ending = ".apmlss" result_file_ending = ".gba" @@ -85,7 +72,7 @@ def get_source_data(cls) -> bytes: class Rom: hash = "4b1a5897d89d9e74ec7f630eefdfd435" - def __init__(self, world: World): + def __init__(self, world: "World"): content = get_base_rom_as_bytes() patched = self.apply_delta(content) self.random = world.multiworld.per_slot_randoms[world.player] diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 2408b2b1889a..e0ac095df5a4 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -5,16 +5,19 @@ from . import StateLogic -def set_rules(world: World, excluded): +def set_rules(world: "World", excluded): for location in all_locations: if "Digspot" in location.name: - if (world.options.skip_minecart and "Minecart" in location.name) or (world.options.castle_skip and "Bowser" in location.name): + if (world.options.skip_minecart and "Minecart" in location.name) or ( + world.options.castle_skip and "Bowser" in location.name): continue if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue - add_rule(world.multiworld.get_location(location.name, world.player), lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(location.name, world.player), + lambda state: StateLogic.canDig(state, world.player)) if "Beanstone" in location.name: - add_rule(world.multiworld.get_location(location.name, world.player), lambda state: StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(location.name, world.player), + lambda state: StateLogic.canDig(state, world.player)) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) if location.itemType != 0 and location.name not in excluded: @@ -54,7 +57,8 @@ def set_rules(world: World, excluded): add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) - forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player) # Bandaid Fix + forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", + world.player) # Bandaid Fix add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), lambda state: StateLogic.hammers(state, world.player)) @@ -90,14 +94,18 @@ def set_rules(world: World, excluded): lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), lambda state: StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), - lambda state: StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), - lambda state: StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), - lambda state: StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), - lambda state: StateLogic.canMini(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), + lambda state: StateLogic.canMini(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), + lambda state: StateLogic.canMini(state, world.player)) add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), lambda state: StateLogic.canMini(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), @@ -115,7 +123,9 @@ def set_rules(world: World, excluded): add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), lambda state: StateLogic.thunder(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), - lambda state: StateLogic.thunder(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) + lambda state: StateLogic.thunder(state, world.player) and StateLogic.pieces(state, + world.player) and StateLogic.castleTown( + state, world.player) and StateLogic.rose(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), lambda state: StateLogic.canDig(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), @@ -271,8 +281,19 @@ def set_rules(world: World, excluded): lambda state: StateLogic.ultra(state, world.player)) add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 1", world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), + lambda state: StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 2", world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) add_rule(world.multiworld.get_location("Jokes End Second Floor West Room Coin Block", world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and (StateLogic.membership(state, world.player) or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) - + lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) + and (StateLogic.membership(state, world.player) + or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) + add_rule(world.multiworld.get_location("Jokes End North of Bridge Room Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) + and StateLogic.canDig(state, world.player) + and (StateLogic.membership(state, world.player) + or StateLogic.canMini(state, world.player))) + if not world.options.difficult_logic: + add_rule(world.multiworld.get_location("Jokes End North of Bridge Room Coin Block", world.player), + lambda state: StateLogic.canCrash(state, world.player)) diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 1e22a4f5ed69..493b9dd5f239 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -97,4 +97,4 @@ def castleTown(state, player): def fungitown(state, player): - return castleTown(state, player) and thunder(state, player) and rose(state, player) + return castleTown(state, player) and thunder(state, player) and rose(state, player) and (super(state, player) or canDash(state, player)) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index c04789856784..224c25ae5cbd 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -1,6 +1,5 @@ import typing import settings -from typing import Dict, Any from BaseClasses import Tutorial, ItemClassification from worlds.AutoWorld import WebWorld, World from .Locations import all_locations, location_table, bowsers, bowsersMini, event, hidden, coins @@ -8,6 +7,9 @@ from .Items import MLSSItem, itemList, item_frequencies, item_table from .Names.LocationName import LocationName from .Client import MLSSClient +from .Regions import create_regions, connect_regions +from .Rom import MLSSDeltaPatch, Rom +from .Rules import set_rules class MLSSWebWorld(WebWorld): @@ -71,7 +73,6 @@ def generate_early(self) -> None: self.excluded_locations += [location.name for location in all_locations if location in coins] def create_regions(self) -> None: - from .Regions import create_regions, connect_regions create_regions(self, self.excluded_locations) connect_regions(self) @@ -157,7 +158,7 @@ def create_items(self) -> None: if self.options.chuckle_beans == 0: remaining -= 186 if self.options.chuckle_beans == 1: - remaining -= 58 + remaining -= 59 if not self.options.coins: remaining -= len(coins) for i in range(remaining): @@ -167,7 +168,6 @@ def create_items(self) -> None: filler_items.remove(filler_item_name) def set_rules(self) -> None: - from .Rules import set_rules set_rules(self, self.excluded_locations) self.multiworld.completion_condition[self.player] = \ lambda state: state.can_reach("PostJokes", "Region", self.player) @@ -177,7 +177,6 @@ def create_item(self, name: str) -> MLSSItem: return MLSSItem(item.itemName, item.progression, item.code, self.player) def generate_output(self, output_directory: str) -> None: - from .Rom import Rom rom = Rom(self) for location_name in location_table.keys(): From 009cf45aef7dee2e07add16e17d169ef7cca676f Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 12 Feb 2024 14:12:18 -0500 Subject: [PATCH 15/79] Update __init__.py --- worlds/mlss/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 224c25ae5cbd..6420588eebbe 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -149,7 +149,7 @@ def create_items(self) -> None: remaining = len(all_locations) - len(required_items) - len(event) - 3 if self.options.castle_skip: remaining -= (len(bowsers) + len(bowsersMini)) - if self.options.skip_minecart: + if self.options.skip_minecart and self.options.chuckle_beans == 2: remaining -= 1 if self.options.disable_surf: remaining -= 1 From 2614960c893700b42500ea7851de82a17603fdec Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sun, 18 Feb 2024 18:36:27 -0500 Subject: [PATCH 16/79] Changed reference from world to mlssworld --- worlds/mlss/Client.py | 9 +++++---- worlds/mlss/Regions.py | 12 +++++++----- worlds/mlss/Rom.py | 6 +++++- worlds/mlss/Rules.py | 7 ++++++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 535afdb1e3ea..3ebab58bb9ca 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING, Optional, Set import struct + from NetUtils import ClientStatus from .Locations import roomCount, nonBlock, beanstones, roomException, shop, badge, pants, eReward from .Items import items_by_id @@ -83,7 +84,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: (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] + current_room = int.from_bytes(read_state[1], 'little') shop_init = read_state[2][0] shop_scroll = read_state[3][0] & 0x1F is_buy = (read_state[4][0] != 0) @@ -148,8 +149,8 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: return if flag_byte & mask != 0: if location in roomException: - if roomException[location] != room: - if (location == 0xDA0001 or location == 0x2578e7) and room == 0x79: + if roomException[location] != current_room: + if (location == 0xDA0001 or location == 0x2578e7) and current_room == 0x79: exception = False else: exception = True @@ -204,7 +205,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: "key": f"mlss_room_{ctx.team}_{ctx.slot}", "default": 0, "want_reply": False, - "operations": [{"operation": "replace", "value": room}] + "operations": [{"operation": "replace", "value": current_room}] }]) # Send locations if there are any to send. diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 6b4cffb2196c..8f6f6145c246 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -1,6 +1,5 @@ import typing -from worlds.AutoWorld import World from BaseClasses import Region, Entrance from .Locations import MLSSLocation, mainArea, chucklehuck, castleTown, startingFlag, chuckolatorFlag, piranhaFlag, \ kidnappedFlag, beanstarFlag, birdoFlag, surfable, hooniversity, gwarharEntrance, gwarharMain, \ @@ -8,8 +7,11 @@ bowsers, bowsersMini, jokesEntrance, jokesMain, theater, booStatue, oasis, postJokes, baseUltraRocks, event, coins from . import StateLogic +if typing.TYPE_CHECKING: + from . import MLSSWorld -def create_regions(world: "World", excluded: typing.List[str]): + +def create_regions(world: "MLSSWorld", excluded: typing.List[str]): menu_region = Region("Menu", world.player, world.multiworld) world.multiworld.regions.append(menu_region) @@ -50,7 +52,7 @@ def create_regions(world: "World", excluded: typing.List[str]): create_region(world, "Bowser's Castle Mini", bowsersMini, excluded) -def connect_regions(world: "World"): +def connect_regions(world: "MLSSWorld"): names: typing.Dict[str, int] = {} connect(world, names, "Menu", "Main Area") @@ -95,7 +97,7 @@ def connect_regions(world: "World"): connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) -def create_region(world: World, name, locations, excluded): +def create_region(world: "MLSSWorld", name, locations, excluded): ret = Region(name, world.player, world.multiworld) for location in locations: loc = MLSSLocation(world.player, location.name, location.id, ret) @@ -105,7 +107,7 @@ def create_region(world: World, name, locations, excluded): world.multiworld.regions.append(ret) -def connect(world: "World", used_names: typing.Dict[str, int], source: str, target: str, +def connect(world: "MLSSWorld", used_names: typing.Dict[str, int], source: str, target: str, rule: typing.Optional[typing.Callable] = None): source_region = world.multiworld.get_region(source, world.player) target_region = world.multiworld.get_region(target, world.player) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 29277c82ecd6..37bf4ac7d4e7 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,6 +1,7 @@ import io import os import pkgutil +import typing import bsdiff4 from BaseClasses import Item, Location @@ -11,6 +12,9 @@ from .Items import item_table from .Locations import shop, badge, pants +if typing.TYPE_CHECKING: + from . import MLSSWorld + class Color: def __init__(self, location, byte1, byte2, bro): @@ -72,7 +76,7 @@ def get_source_data(cls) -> bytes: class Rom: hash = "4b1a5897d89d9e74ec7f630eefdfd435" - def __init__(self, world: "World"): + def __init__(self, world: "MLSSWorld"): content = get_base_rom_as_bytes() patched = self.apply_delta(content) self.random = world.multiworld.per_slot_randoms[world.player] diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index e0ac095df5a4..73a0d2525d7d 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -1,11 +1,16 @@ +import typing + from worlds.generic.Rules import add_rule, forbid_item from worlds.AutoWorld import World from .Names.LocationName import LocationName from .Locations import all_locations, hidden from . import StateLogic +if typing.TYPE_CHECKING: + from . import MLSSWorld + -def set_rules(world: "World", excluded): +def set_rules(world: "MLSSWorld", excluded): for location in all_locations: if "Digspot" in location.name: if (world.options.skip_minecart and "Minecart" in location.name) or ( From fddad3b91bf36209510b64947f5802b66cf23094 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sat, 24 Feb 2024 02:28:08 -0500 Subject: [PATCH 17/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 68916d21da25..3f6ce10e827a 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -46,7 +46,7 @@ Items that are shuffled: Any shuffled item can be in other players' worlds. -## What does another world's item look like in Mega Man Battle Network 3? +## What does another world's item look like in Mario & Luigi: Superstar Saga? Item will show up as a Golden Mushroom from boxes and digspots. All items from another world will show up as AP Item in all textboxes. Items in a shop from another player's world will display the player name and item name in addition to being displayed as an AP Item. From 420fbc80f3a2ae9d4f51a057a9f4807a9f1f821c Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 13:45:09 -0500 Subject: [PATCH 18/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- .../docs/en_Mario & Luigi Superstar Saga.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 3f6ce10e827a..4b23200e2879 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -21,7 +21,22 @@ Other aspects of the game can be randomized as well such as music, sounds, battl ## What is the goal of Mario & Luigi: Superstar Saga when randomized? -Defeat Cackletta's Soul in Bowser's Castle. This requires you to collect all 4 beanstar pieces and restore the beanstar, as well as Peach's Extra Dress and the Fake beanstar, and bring them to Fawful at the end of Jokes End. This also requires Ultra Hammers, Thunder Hand and Green Pearl Bean, Fire Hand and Red Pearl Bean, Green Goblet, The Beanbean Brooch, All 3 Chuckola Fruits, Peasley's Rose, and either the Membership card or Red Goblet. +Defeat Cackletta's Soul in Bowser's Castle. This requires you to collect all 4 Beanstar Pieces, restore the Beanstar, and bring Peach's Extra Dress and the Fake Beanstar to Fawful at the end of Jokes End. + +In total, this requires: +- 4 Beanstar Pieces +- Peach's Extra Dress +- Fake Beanstar +- Ultra Hammers +- Fire Hand +- Thunder Hand +- Red Pearl Bean +- Green Pearl Bean +- Green Goblet +- Peasley's Rose +- Beanbean Brooch +- All 3 Chuckola Fruits +- Membership Card OR Red Goblet ## What items and locations get shuffled? From e9a661d34adba91a347f9f36a7e9cdf69facba33 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 13:45:18 -0500 Subject: [PATCH 19/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 4b23200e2879..58d625fa6c32 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -49,7 +49,7 @@ Locations in which items can be found: - All Minigame Rewards - All Event based items -Items that are shuffled: +Items that can be shuffled: - All consumable items (Mushrooms, Nuts, Syrups etc.) - All Hoo Beans and Chuckle Beans - All Badges and Pants From 4b762ce9b3ad368c098146ce680bf09a0435c773 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 13:45:22 -0500 Subject: [PATCH 20/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 58d625fa6c32..af626be31722 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -38,7 +38,7 @@ In total, this requires: - All 3 Chuckola Fruits - Membership Card OR Red Goblet -## What items and locations get shuffled? +## What items and locations can get shuffled? Locations in which items can be found: - All Item Blocks and Coin Blocks From cedc00f20720882a91fcad3c9dbaeaeb6b3fe6cd Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 13:45:32 -0500 Subject: [PATCH 21/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index af626be31722..755ec4bc29a6 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -63,7 +63,7 @@ Any shuffled item can be in other players' worlds. ## What does another world's item look like in Mario & Luigi: Superstar Saga? -Item will show up as a Golden Mushroom from boxes and digspots. All items from another world will show up as AP Item in all textboxes. +Items will show up as a Golden Mushroom from boxes and digspots and "AP Item" in all textboxes. Items in a shop from another player's world will display the player name and item name in addition to being displayed as an AP Item. ## When the player receives an item, what happens? From 5db0825d078a3adccbf4dbe83f8a85096200c57d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 13:45:39 -0500 Subject: [PATCH 22/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 755ec4bc29a6..a5e25715ee0d 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -56,11 +56,6 @@ Items that can be shuffled: - All key items (Beanfruits, Beanbean Brooch, Hammers etc.) - All Extra Gears (Great Force, Gameboy Horror SP etc.) -## Which items can be in another player's world? - -Any shuffled item can be in other players' worlds. - - ## What does another world's item look like in Mario & Luigi: Superstar Saga? Items will show up as a Golden Mushroom from boxes and digspots and "AP Item" in all textboxes. From b8dee7a988b28e30256eda3e01ccb89da04ee1a6 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 5 Mar 2024 17:08:41 -0500 Subject: [PATCH 23/79] Fix merge conflict + update prep --- README.md | 1 + worlds/mlss/Client.py | 2 +- worlds/mlss/Items.py | 4 +++- worlds/mlss/Regions.py | 6 ++++-- worlds/mlss/Rules.py | 5 +++-- worlds/mlss/__init__.py | 12 +++++++++--- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 92c94ca2b01b..746c411adfc1 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ Currently, the following games are supported: * Landstalker: The Treasures of King Nole * Final Fantasy Mystic Quest * TUNIC +* Kirby's Dream Land 3 * Mario & Luigi: Superstar Saga For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 3ebab58bb9ca..a19cfb1efdd1 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -235,7 +235,7 @@ def find_key(dictionary, target): def id_to_RAM(id_: int): code = id_ - if code == 0x1D or code == 0x1E: + if 0x1C <= code <= 0x1F: code += 0xE if 0x20 <= code <= 0x26: code -= 0x4 diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index b32664806d72..ce2a42acf944 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -166,7 +166,9 @@ class MLSSItem(Item): ItemData(77771148, "Entered Fungitown", ItemClassification.skip_balancing, 0x0), ItemData(77771149, "Beanstar Complete", ItemClassification.skip_balancing, 0x0), ItemData(77771150, "Jojora Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771151, "Birdo Defeated", ItemClassification.skip_balancing, 0x0) + ItemData(77771151, "Birdo Defeated", ItemClassification.skip_balancing, 0x0), + ItemData(77771152, "Woo Bean", ItemClassification.skip_balancing, 0x1C), + ItemData(77771153, "Hee Bean", ItemClassification.skip_balancing, 0x1F), ] item_frequencies: typing.Dict[str, int] = { diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 8f6f6145c246..6fa3e3f46102 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -69,13 +69,11 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) connect(world, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, world.player) or state.can_reach("FungitownBirdo", "Region", world.player)) - connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, world.player)) connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) or state.can_reach("Shop Piranha Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) connect(world, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, world.player)) @@ -92,9 +90,13 @@ def connect_regions(world: "MLSSWorld"): if world.options.difficult_logic: connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, world.player)) else: connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player)) connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) + connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) def create_region(world: "MLSSWorld", name, locations, excluded): diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 73a0d2525d7d..ed23a6aad8fc 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -244,8 +244,9 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canCrash(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), lambda state: StateLogic.canCrash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), - lambda state: StateLogic.canCrash(state, world.player)) + if world.options.chuckle_beans != 0: + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), + lambda state: StateLogic.canCrash(state, world.player)) if world.options.coins: add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 6420588eebbe..779589586783 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -94,6 +94,10 @@ def generate_basic(self) -> None: self.multiworld.get_location(LocationName.ShopStartingFlag2, self.player).place_locked_item(item) item = self.create_item("1-UP Mushroom") self.multiworld.get_location(LocationName.ShopStartingFlag3, self.player).place_locked_item(item) + item = self.create_item("Hoo Bean") + self.multiworld.get_location(LocationName.PantsShopStartingFlag1, self.player).place_locked_item(item) + item = self.create_item("Chuckle Bean") + self.multiworld.get_location(LocationName.PantsShopStartingFlag2, self.player).place_locked_item(item) item = self.create_item("Dragohoho Defeated") self.multiworld.get_location("Dragohoho", self.player).place_locked_item(item) item = self.create_item("Queen Bean Defeated") @@ -132,6 +136,8 @@ def create_items(self) -> None: # Then, get a random amount of fillers until we have as many items as we have locations filler_items = [] for item in itemList: + if item.progression == ItemClassification.skip_balancing: + continue if item.progression == ItemClassification.filler: if item.itemName == "5 Coins" and not self.options.coins: continue @@ -146,9 +152,9 @@ def create_items(self) -> None: freq = 1 filler_items += [item.itemName for _ in range(freq)] - remaining = len(all_locations) - len(required_items) - len(event) - 3 + remaining = len(all_locations) - len(required_items) - len(event) - 5 if self.options.castle_skip: - remaining -= (len(bowsers) + len(bowsersMini)) + remaining -= (len(bowsers) + len(bowsersMini) - (5 if self.options.chuckle_beans == 0 else 0)) if self.options.skip_minecart and self.options.chuckle_beans == 2: remaining -= 1 if self.options.disable_surf: @@ -156,7 +162,7 @@ def create_items(self) -> None: if self.options.harhalls_pants: remaining -= 1 if self.options.chuckle_beans == 0: - remaining -= 186 + remaining -= 192 if self.options.chuckle_beans == 1: remaining -= 59 if not self.options.coins: From 972b275fa547f2fc278369ee25801bca40a48b56 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 6 Mar 2024 01:56:35 -0500 Subject: [PATCH 24/79] v1.2 --- worlds/mlss/Client.py | 49 +++-- worlds/mlss/Locations.py | 39 ++-- worlds/mlss/Rom.py | 67 +++---- worlds/mlss/Rules.py | 20 ++ worlds/mlss/data/basepatch.bsdiff | Bin 16021 -> 16027 bytes worlds/mlss/data/sounds.txt | 302 ++++++++++++++++++++++++++++++ 6 files changed, 396 insertions(+), 81 deletions(-) create mode 100644 worlds/mlss/data/sounds.txt diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index a19cfb1efdd1..aba6741e5e00 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -33,16 +33,16 @@ def __init__(self) -> None: self.local_set_events = {} self.local_found_key_items = {} self.rom_slot_name = None + self.seed_verify = False self.eCount = 0 self.eUsed = [] async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: from CommonClient import logger - try: # Check ROM name/patch version - rom_name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")]))[0]) - rom_name = bytes([byte for byte in rom_name_bytes if byte != 0]).decode("UTF-8") + rom_name_bytes = (await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")])) + rom_name = bytes([byte for byte in rom_name_bytes[0] if byte != 0]).decode("UTF-8") if not rom_name.startswith("MARIO&LUIGIU"): return False if rom_name == "MARIO&LUIGIUA8": @@ -64,10 +64,10 @@ async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: ctx.want_slot_data = True ctx.watcher_timeout = 0.125 self.rom_slot_name = rom_name - name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xB0, 16, "ROM")]))[0]) + self.seed_verify = False + name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xDF0000, 16, "ROM")]))[0]) name = bytes([byte for byte in name_bytes if byte != 0]).decode("UTF-8") self.player_name = name - logger.info(name) for i in range(59): self.checked_flags[i] = [] @@ -77,11 +77,28 @@ async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: async def set_auth(self, ctx: "BizHawkClientContext") -> None: ctx.auth = self.player_name + def on_package(self, ctx, cmd, args) -> None: + if cmd == 'RoomInfo': + ctx.seed_name = args['seed_name'] + async def game_watcher(self, ctx: "BizHawkClientContext") -> None: + from CommonClient import logger try: + if ctx.seed_name is None: + return + if not self.seed_verify: + seed = await bizhawk.read(ctx.bizhawk_ctx, [(0xDF00A0, len(ctx.seed_name), "ROM")]) + seed = seed[0].decode("UTF-8") + if seed != ctx.seed_name: + logger.info("ERROR: The ROM you loaded is for a different game of AP. " + "Please make sure the host has sent you the correct patch file," + "and that you have opened the correct ROM.") + raise bizhawk.ConnectorError("Loaded ROM is for Incorrect lobby.") + self.seed_verify = True + read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x304A, 1, "EWRAM"), - (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x4800, 6, "EWRAM"), + (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x3060, 6, "EWRAM"), (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), (0x2339, 1, "IWRAM")]) flags = read_state[0] current_room = int.from_bytes(read_state[1], 'little') @@ -117,12 +134,11 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items 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")]) - 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")]) - await asyncio.sleep(.05) - else: + b = await bizhawk.guarded_read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")], [(0x3057, [0x0], "EWRAM")]) + if b is None: break + 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")]) + await asyncio.sleep(.05) # Early return and location send if you are currently in a shop, # since other flags aren't going to change @@ -142,18 +158,15 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: 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_bytes = await bizhawk.read(ctx.bizhawk_ctx, [(address, 1, "EWRAM"), (0x3060, 6, "EWRAM")]) flag_byte = flag_bytes[0][0] backup_logo = bytes([byte for byte in flag_bytes[1] if byte < 0x70]).decode("UTF-8") if backup_logo != "MLSSAP": return if flag_byte & mask != 0: if location in roomException: - if roomException[location] != current_room: - if (location == 0xDA0001 or location == 0x2578e7) and current_room == 0x79: - exception = False - else: - exception = True + if current_room not in roomException[location]: + exception = True else: exception = False else: @@ -221,6 +234,8 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: except bizhawk.RequestFailedError: # Exit handler and return to main loop to reconnect. pass + except bizhawk.ConnectorError: + pass def find_key(dictionary, target): diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index be1b169d2102..4bb645b6c29e 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -834,7 +834,7 @@ class MLSSLocation(Location): (0x430B, 0x10, 0x1e9433), # Extra Dress (0x430B, 0x10, 0x1e9432), # Fake Beanstar (0x430F, 0x1, 0x1e9440), # Popple Beanstar Piece - (0x430C, 0x80, 0x261658), # Winkle Card + (0x467E, 0xFF, 0x261658), # Winkle Card (0x4300, 0x40, 0x2578e7), # Brooch (0x4375, 0x2, 0x2753ea), # Surf Minigame (0x4373, 0x1, 0x277956), # North Whirlpool Mole @@ -868,16 +868,15 @@ class MLSSLocation(Location): (0x433D, 0x10, 0xDA0008) # Birdo ] -roomException: dict[int, int] = { - 0x1e9437: 0xFF, - 0x24ed74: 0x95, - 0x250621: 0x95, - 0x24ff18: 0x95, - 0x261658: 0x9E, - 0x260637: 0x135, - 0x1E9403: 0x4D, - 0xDA0001: 0x192, - 0x2578e7: 0x192 +roomException: dict[int, list[int]] = { + 0x1e9437: [0xFE, 0xFF, 0x100], + 0x24ed74: [0x94, 0x95, 0x96, 0x99], + 0x250621: [0x94, 0x95, 0x96, 0x99], + 0x24ff18: [0x94, 0x95, 0x96, 0x99], + 0x260637: [0x135], + 0x1E9403: [0x4D], + 0xDA0001: [0x79, 0x192, 0x193], + 0x2578e7: [0x79, 0x192, 0x193] } beanstones: dict[int, int] = { @@ -887,16 +886,16 @@ class MLSSLocation(Location): 0x22913A: 0x39dc10, 0x22890E: 0x39dba4, 0x228775: 0x39db7f, - 0x25117D: 0x39d73e, # Beanstone 1 - 10 - 0x2511D6: 0x39d746, + 0x251288: 0x39d73e, # Beanstone 1 - 10 + 0x2512E1: 0x39d746, 0x25122F: 0x39d74e, - 0x251288: 0x39d756, - 0x2512E1: 0x39d75e, - 0x25170B: 0x39d76b, - 0x251767: 0x39d773, - 0x2517C3: 0x39d77b, - 0x25181F: 0x39d783, - 0x25187B: 0x39d78b + 0x25117D: 0x39d756, + 0x2511D6: 0x39d75e, + 0x25187B: 0x39d76b, + 0x25170B: 0x39d773, + 0x251767: 0x39d77b, + 0x2517C3: 0x39d783, + 0x25181F: 0x39d78b } roomCount: dict[int, int] = { diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 37bf4ac7d4e7..c7e1ec234ded 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -181,10 +181,10 @@ def item_inject(self, location: int, item_type: int, item: Item): def patch_options(self): name = self.world.multiworld.player_name[self.player].encode("UTF-8") - self.stream.seek(0xB0, 0) + self.stream.seek(0xDF0000, 0) self.stream.write(name) - self.stream.seek(0xAF, 0) - self.stream.write(self.player.to_bytes(1, 'little')) + self.stream.seek(0xDF00A0, 0) + self.stream.write(self.world.multiworld.seed_name.encode("UTF-8")) if self.world.options.skip_intro: # Enable Skip Intro in ROM @@ -273,47 +273,26 @@ def randomize_backgrounds(self): self.stream.write(bytes([self.random.randint(0x0, 0x26)])) def randomize_sounds(self): - pointers = [] - sounds = [] - self.stream.seek(0x21CC44) - for i in range(353): - p_arr = bytearray(self.stream.read(4)) - pointers.append(p_arr[0] | p_arr[1] << 8 | p_arr[2] << 16) - pointers.sort(reverse=True) - - for i in range(len(pointers) - 1, -1, -1): - if i == 0: - continue - j = 1 - while True: - self.stream.seek(pointers[i - 1] - j) - read_byte = self.stream.read(1) - if read_byte != b'\xFF': - j += 1 - continue - else: - break - self.stream.seek(pointers[i - 1] - (j + 1)) - if self.stream.read(1) >= b'\xFE' and i != 0: - pointers.pop(i) - else: - temp = bytearray([ - pointers[i] & 0xFF, - (pointers[i] >> 8) & 0xFF, - (pointers[i] >> 16) & 0xFF, - 0x8 - ]) - sounds.append(temp) - - self.random.shuffle(sounds) - self.stream.seek(0x21CC44) - for i in range(len(pointers)): - current_pos = self.stream.tell() - p_arr = bytearray(self.stream.read(4)) - if (p_arr[0] | p_arr[1] << 8 | p_arr[2] << 16) not in pointers: - continue - self.stream.seek(current_pos) - self.stream.write(self.random.choice(sounds)) + temp = pkgutil.get_data(__name__, "data/sounds.txt") + temp_io = io.BytesIO(temp) + fresh_pointers = [] + + for line in temp_io.readlines(): + fresh_pointers += [int(line.decode('utf-8').strip(), 16)] + pointers = list(fresh_pointers) + + self.world.random.shuffle(pointers) + self.stream.seek(0x21cc44, 0) + for i in range(354): + current_position = self.stream.tell() + print(format(current_position, 'x')) + value = int.from_bytes(self.stream.read(3), 'little') + if value in fresh_pointers: + print(format(value, 'x')) + self.stream.seek(current_position) + self.stream.write(pointers.pop().to_bytes(3, 'little')) + self.stream.seek(1, 1) + def disable_music(self): self.stream.seek(0x19B118) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index ed23a6aad8fc..79325b83a539 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -11,6 +11,16 @@ def set_rules(world: "MLSSWorld", excluded): + add_rule(world.multiworld.get_location("Queen Bean", world.player), lambda state: StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location("Chuckolator", world.player), lambda state: StateLogic.castleTown(state, world.player)) + add_rule(world.multiworld.get_location("Oasis", world.player), + lambda state: (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + or (StateLogic.fire(state, world.player) and StateLogic.membership(state, world.player)) and (StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player))) + add_rule(world.multiworld.get_location("Mom Piranha", world.player), lambda state: StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location("Fungitown", world.player), lambda state: StateLogic.fungitown(state, world.player)) + add_rule(world.multiworld.get_location("Beanstar", world.player), + lambda state: StateLogic.castleTown(state, world.player) and StateLogic.rose(state,world.player) and StateLogic.pieces(state,world.player)) + for location in all_locations: if "Digspot" in location.name: if (world.options.skip_minecart and "Minecart" in location.name) or ( @@ -240,6 +250,10 @@ def set_rules(world: "MLSSWorld", excluded): add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) if world.options.difficult_logic: + add_rule(world.multiworld.get_location("Birdo", world.player), + lambda state: StateLogic.postJokes(state, world.player)) + add_rule(world.multiworld.get_location("Jojora", world.player), lambda state: StateLogic.surfable(state, world.player) + and StateLogic.canDash(state, world.player) and StateLogic.canDig(state, world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: StateLogic.canCrash(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), @@ -247,6 +261,12 @@ def set_rules(world: "MLSSWorld", excluded): if world.options.chuckle_beans != 0: add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), lambda state: StateLogic.canCrash(state, world.player)) + else: + add_rule(world.multiworld.get_location("Birdo", world.player), + lambda state: StateLogic.postJokes(state, world.player) and StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location("Jojora", world.player), lambda state: StateLogic.surfable(state, world.player) + and StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player) + and StateLogic.canDig(state, world.player)) if world.options.coins: add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index c6e36e067882d342ab3fac6f26f41ab1869dab72..5b3a4fe5a2b4beb0fe54cca12e4ba99856a42890 100644 GIT binary patch literal 16027 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 Date: Wed, 6 Mar 2024 02:17:18 -0500 Subject: [PATCH 25/79] Leftover print commands --- worlds/mlss/Rom.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index c7e1ec234ded..ddc5c4055d13 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -285,10 +285,8 @@ def randomize_sounds(self): self.stream.seek(0x21cc44, 0) for i in range(354): current_position = self.stream.tell() - print(format(current_position, 'x')) value = int.from_bytes(self.stream.read(3), 'little') if value in fresh_pointers: - print(format(value, 'x')) self.stream.seek(current_position) self.stream.write(pointers.pop().to_bytes(3, 'little')) self.stream.seek(1, 1) From 2a8d7dad38f261a444effb4a6e541be4151b7de1 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 7 Mar 2024 21:45:58 -0500 Subject: [PATCH 26/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 16027 -> 16038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 5b3a4fe5a2b4beb0fe54cca12e4ba99856a42890..2a53a60c344d58a6bcc5acd28c9c69b330237f44 100644 GIT binary patch literal 16038 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 Date: Sat, 9 Mar 2024 23:12:00 -0500 Subject: [PATCH 27/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 16038 -> 16020 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 2a53a60c344d58a6bcc5acd28c9c69b330237f44..0bced2b5061dc3170525ab523669d67c2ba5dfb4 100644 GIT binary patch delta 4267 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 NXf-iGS+i0bR3oqvvzGt> delta 4279 zcmV;o5J>NoeWra8LQ_OZMn*I+iV6S#00000p|KI83I`9g3ZwuUACtQZCV%gtDwL{> zA$?ozPoW-y-42@!+;?>YS(qE<4NVY)^rwYAGEDVPLTY+wU=nAgHbyDxdIp}6l08ix zgGre*o|Dws8b*&(%6UvQG|0*_JxtWdX{Mg1qHL$A(?--XJc;Qu5E0^OHlrq+NYH7u zHlWcE6x7;bFpV%NvP`Gp5`ShICKFT9>SZ$$X_}gNrXYDnjj8CHO(q&mF*0Pq01XC% zKmd9mWB>qY(WZbjJw`@=XbnvXpaw#isp*k|dPX5VsiJyJ(Wa9onrOt(dYL^y^)zV7 zpxR9afB~irkMu0Q}AOO$F$|fbP|>3ap`$vCLq&B022ZwB$}f} znrZ5KnWX(F(WZuvP=6kyO+7}QiRlkeJwO9M00003KmY&$4^iqg0000qXc_nT8@g@(rQ9< zAk5OIbuoTwW3ih}<MHJV{2 z$t0aKStpDnF@FgAAoLLnXqK>W(aff42jPO(mJ7mzNIyjL;q}01;PjC8Cf3zKX@B(x zeGsQa&cP_Cs441k^ac51WnyEXmM4hfo>qg5h-fiPq*wEZxPSN}X0QMs@+(LnSkmYq0+0w3h9MMNtx73UxYQ3o*v3kcn48##Yw}=3}oIzSRs+|-N z3Vc-hqJOBanh2t`$ctu*f`;}AuJTnP0Eu6M0c8OJOSlR*5dlLZ5J7B3L&u8jV1OcT zA_}K#01)dS0*Y54h$xRw5CltlZh-f36loZZx&o!L0D=GjU1h0~ zLPUgsI2Z#+p-7+-3ebyv0VxiC2~h#906Pc@nP>%4yh9ZVL2Kcu)IdN$01L@$0Cn`g z>u;(lRTGnsS6YEQ6U6fqM9{GEEuww!l^Jy=aSBOQuy_(hDW21ap<5~4+3iQ?>tKdv z&VME~M3V)I0k}~G6q6(ZNi!?wGYS!!O=_V|UJ(tV9oeda9W!QFOZ!X?Lg$}`-nLnq zTlJ-m7ZWwD0nlgjuh$CcGZ`crc(ep^RXBJ$84$-uFU`?hlo~{PB!&!tUSw$WF;`M% zPmG~~AYR$gF?l*SaWL)73IiZ_kT{!4C4byqvOmSu19O4FMKTcMY+2RKcyy37+!mQu zwk0A-7Kbwoe7?T1jVlR9aO*0s0>~r5!0z*nUlv1J)-bj1tg=N&gwJU9^3}yfU5`XU z3{?bHV3@oyRT`?;s5=7#0000DG4_0-2A)CGXE^`7TlPB+RSkw+4(aC)ETp)Ifq!Lb z84#5~V%GiTfwPTYClRK#Z1}-$6!3@V=-ERS39m*LNFadt69P8;8RG@N zQM2ROtJHHnr$`9d z-Bfg#OJAPpsx0~*GE^2)Ehw~T6h!RFjNQ!9yo%GoUW$xaWZc392+TVtID~~Er{u-J zVcz5`aV_5se0HQpY)w27N{c>QBmq)l1^}BTu^S=tXN=w)>LtE|On-I=jM!(4qJtE))XybmoPgFVV+Pw~Gi4_;3gB#Gt{mwe z^NJ`}y~;E0dMZ~`uY|!o`GRm@o|qWbLIu&0cNI%K!m?U^-s@SdWJU|OKDyUc=r*3C zTr%S}5(T-qJL4YfY7RC<%EDe)HWd`=iBvEu)YM|uWlF1p!V!few0~WDxBuq*J*~z{ zzJSDT`>~A_y&1Hk))-`l9K1+Q0s(=5!(IqJ`))rfDuqe)c2*S|X~BXqcr5XSnmSA| zFs?~aDNrFmg6$u1IU>biGN@)hyUbr$r`c4Yg_%v0ZSPkJoGK0}Zen{{`|XEqP9mW5 z&s`hsxqMZXn2cy#SASoU;VG5zUtaV&`9pN;krm;Wb01iC-n!Q&VP$_n3k2(~)nQsS z5JQAu4k5=Ksd=L2FnR@CTP7iBB+dE|d$VLhH&QpIv*5(DzuEKCJcD(1r#5t1^WzqT z?>kD=Mo~pyVVP*dI7ToQMkqCW-+Ib<|u77&wZ(D7wb@DhksRW5x z7I0!fYQeDAAy30j!Q(WRj#Iq@F77oO*~5+Jo7$k|2SbV^VgYKr3OE}%RTR9B7n;i{ zg?LgronbvJ>*l7c_wD!b=d5}~(?=a4dTw7T#54h9^`<^=Lney@dg*|mhhsJ|3^X&_oib2(_LL0h zIKCDd_7&6~{pT*Y?8He`#=CAHTD55wQ#XTl81oBB(~@0Q*gl5h9>I|aP>fRG%K8B! z*lhwvDMJ^O>B{jLOat`S3#J6<3;Df zMb8N=1w||6^ur|K+9+~#@a)AR!Z{+oX>77H#*zx>(j(EM1jXX@CdCl8kLBVr7kYq! zHijAn5e21GzreDDC=T zj}3?ioPVw~WEd*>rlG8$fK>IB6;qTfbl>px?tE2n^OgR`${&--Ss?y=8IOR-Nj;H( z)YU>OPQRCcb8GcpB?K*i*47J~8^*Znt3cCnwA^MqIdXKJrx0)QfWnA!nV+L($9?o> zs=Ct>NTL^Y2u!3jbI4O$9G_{a(N)Os)ET0*)_+KKk}ymWsw;2+`ZX~Dv}d3RwmiUw zG!e{zkPd)^;)xB9D^2lE&fT?hT?HyRbT%YuyQ^g@P@N8v9ECi5XLGX98zYV@;K|c> z{Bgt;S9UW<{Eg(=HEjeSRQ)Q|nd|eDO`_O1H1UcM)-*N9nBgcq451Oxhtz2(2uMKO z6@R<|1rFRc7ATEs0Er?=?K^HTBH9Z|=U`#3MmS-&fm1#i`In!xn?684k?5s!4uwf@ zaN5UQl%H13EzKlwqjmX=6jTej-_5F^LKNsAlOkF0umyS);AtGuG6RB-6l&DgWHRH6 zowQnU13@J!89P){NmqS7xnBG}xMsGd{C{5H+M2y~MV%!jyGK_K(f(3w3E+gf4s7&{ z5)wYW93Iiu$PG2}T;d%_gMk2z58L*(z;X?y+`gWDlks+j%G3U0+HL(^WZ%ET zw&@tz)3c!)V}ixG^<}0}do)^VJA1`vu%4ONEEQAFeTOGYDJItRHqnqqTLJDgjDI!E zi=8-;oiJ?TcA4lz6J_y4E9Fw7_JvO|%FYg%h;AFje#Nf1HP|;?HCj8{a5-0D(dtn9 z;OBmx=lE%?E7pITQarCmXKjnPkV2HZ9%P9D0AWh21NbltGB2^T3M3xix2$9DUlQGx^Or$e=eu#}bZI$5uFdb{P5hkEmy;mu>80QdciaJWbbpeBFYjO}WpMSq!#0eJ;( z@$0%Tk6A!M&%MD&*FSon+CWcjPa7;H7MTCI%5nU)M$y2&_au-w3Cp40Z14G6=N>Dm zUMwqn8>T!iY#(>Ggr=9*>Lb2Gv;jcf8(B8=o4M-x5Zeh&6Q?XEy@!Y@Sgq@ngtq=k zp74}4+l`Q65}%0O9e)zv7Sqyxj$hfR zjhobpH(AJ6m;%$wA7xm5?Fq%E%41*9*l9S6;yevxAIz8pQmv5xYq?LeyxVLZFS};f zmb#s~mD|ou zg6<2r(^!4`MqFbZFn{)XGwU|BG~GR9vzE23YnhB=CSw@JF>73L#~g9UwXJK8IOAg0 zwXJJf*0r&fbLM=WrVT`N*U_g5l$O;VBq(XfwtI~J<*o3g*?fi+p}J7sOp^{=Q{DYS zdzn9esV?R1k-D{&>SC%7x5oyqqc{kA4mqLvJW!0gU5pDuT7T=#@;zg-$nua|SkQp^ z2h^F1{M_WLZI{XQ#Kejl$z8hX;C+-sGE{XVH7L#cd|L}qzs=pZ{T)E!uk=(&W;zGF zUGRhfO(RmoRdSTxcQ5f7-5Su_XlISlT{5^qwOl;%HXU7deLvJ#b>!GZTk=#YS^5D5 z01S~nS}I^;ZGXrBa7F<_KpDe|q*diuCs_jHbA7f_e+8T~6vCxOTRl6xrG(G#*rsu1 z35;^dY_!`O$8!lTwZ~q~F$+R2lb!W8lv1K`>{G8>MlM-p$T%B}Wq$g&Jhy`*)>64I zT;P1e&QL0a^jj+g%eCS^Q;@*mVd1sZ@0b9HK{5b=5`T3OKmqjNC?W4fQ51GCQ4vA7 zz!XtMF}xiEM+_%B;rx_(YmevZ?EU^$uc`g?8h-a4R4VpQ;(I8Z=I-jt3%fhWK&G<5 zkp%mpVLi{?W0H!47*%;Eg_Hbn`^2jNw_mINyll>ei4#W045$QQ+En)NwR}p-E|RHY Z=V)mq{|oVVBvXY60Q*3yK(jd;TO)0sv- Date: Wed, 27 Mar 2024 02:59:55 -0400 Subject: [PATCH 28/79] v1.3 --- worlds/mlss/Enemies.py | 71 ++++---- worlds/mlss/Items.py | 4 +- worlds/mlss/Options.py | 23 ++- worlds/mlss/Regions.py | 2 +- worlds/mlss/Rom.py | 343 ++++++++++++-------------------------- worlds/mlss/StateLogic.py | 4 +- worlds/mlss/__init__.py | 2 - 7 files changed, 153 insertions(+), 296 deletions(-) diff --git a/worlds/mlss/Enemies.py b/worlds/mlss/Enemies.py index 2f092b513f82..4b4143a2e9a7 100644 --- a/worlds/mlss/Enemies.py +++ b/worlds/mlss/Enemies.py @@ -1,40 +1,13 @@ -class EnemyGroup: - def __init__(self, id: bytes, type: bytes, position: int, data: bytes, boss, group_type=0x64): - self.id = id - self.type = type - self.position = position - self.data = data - self.boss = boss - self.group_type = group_type - - @property - def size(self): - return len(self.id) - - -class Enemy: - def __init__(self, id, type): - self.id = id - self.type = type - - -class StatCount: - def __init__(self, id): - self.id = id - self.count = 1 - self.total = 0 - - -class EnemyRandomize: - def __init__(self): - self.groups = [] - self.stardustGroups = [] - self.groupSizes = [] - self.enemies = [] - self.spikedEnemies = [] - self.bossGroups = [] - self.enemyCount = [] +flying = [ + 0x14, + 0x1D, + 0x4C +] +pestnut = [ + 0x20, + 0x34 +] enemies = [ 0x5030EC, @@ -206,3 +179,29 @@ def __init__(self): 0x5045EC, 0x50460C ] + +bowsers = [ + 0x50404C, + 0x50406C, + 0x50408C, + 0x5040AC, + 0x5040CC, + 0x5040EC, + 0x50410C, + 0x50412C, + 0x50414C, + 0x50416C, + 0x50418C, + 0x5041AC, + 0x5041CC, + 0x5041EC, + 0x50420C, + 0x50422C, + 0x50424C, + 0x50426C, + 0x50428C, + 0x5042AC, + 0x5042CC, + 0x5042EC, + 0x50430C, +] diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index ce2a42acf944..b4408662fa6b 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -52,7 +52,7 @@ class MLSSItem(Item): ItemData(77771034, "Purple Chuckola Fruit", ItemClassification.progression, 0x37), ItemData(77771035, "Hammers", ItemClassification.progression, 0x38), ItemData(77771036, "Firebrand", ItemClassification.progression, 0x39), - ItemData(77771037, "Thunder Hand", ItemClassification.progression, 0x3A), + ItemData(77771037, "Thunderhand", ItemClassification.progression, 0x3A), ItemData(77771038, "Membership Card", ItemClassification.progression, 0x40), ItemData(77771039, "Winkle Card", ItemClassification.progression, 0x41), ItemData(77771040, "Peach's Extra Dress", ItemClassification.progression, 0x42), @@ -157,7 +157,7 @@ class MLSSItem(Item): ItemData(77771139, "Great Force", ItemClassification.useful, 0xFB), ItemData(77771140, "Power Grip", ItemClassification.useful, 0xFC), ItemData(77771141, "Cobalt Necktie", ItemClassification.useful, 0xFD), - ItemData(77771142, "Gameboy Horror SP", ItemClassification.useful, 0xFE), + ItemData(77771142, "Game Boy Horror SP", ItemClassification.useful, 0xFE), ItemData(77771143, "Dragohoho Defeated", ItemClassification.skip_balancing, 0x0), ItemData(77771144, "Queen Bean Defeated", ItemClassification.skip_balancing, 0x0), ItemData(77771145, "Chuckolator Defeated", ItemClassification.skip_balancing, 0x0), diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index c155bffd16bd..c7b18e698cf3 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -2,14 +2,6 @@ from dataclasses import dataclass -class IntroSkip(Toggle): - """ - Skip the intro sequence. Spawns you in pipe 1 on game start. - This does not affect any items. - """ - display_name = "Intro Skip" - - class BowsersCastleSkip(Toggle): """ Skip straight from the entrance hall to bowletta in Bowser's Castle. @@ -143,12 +135,20 @@ class LuigiPants(Choice): default = 0 -class RandomizeEnemies(Toggle): +class RandomizeEnemies(Choice): """ Randomize all normal enemy encounters in the game. If Bowser's castle skip is enabled then enemies from Bowser's Castle will not be included. + disabled: Enemies will not be randomized + vanilla_groups: Vanilla enemy groups will be shuffled with each other. Custom enemy groups will not be made. + custom_groups: Custom enemy groups will be made and shuffled. Some enemy groups will only be semi-random. + (Groups including flying enemies or pestnuts) """ display_name = "Randomize Enemies" + option_disabled = 0 + option_vanilla_groups = 1 + option_custom_groups = 2 + default = 0 class RandomizeBosses(Choice): @@ -168,14 +168,14 @@ class RandomizeBosses(Choice): class ScaleStats(Toggle): """ - This scales enemy HP and XP according to the area of the game you are in scaling linearly. + This scales enemy HP and XP according to the area of the game you are in. """ display_name = "Scale Enemy Stats" class ScalePow(Toggle): """ - This scales enemy POW according to the area of the game you are in scaling linearly. + This scales enemy POW according to the area of the game you are in. """ display_name = "Scale Enemy POW" @@ -250,7 +250,6 @@ class MLSSOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool coins: Coins difficult_logic: DifficultLogic - skip_intro: IntroSkip castle_skip: BowsersCastleSkip extra_pipes: ExtraPipes skip_minecart: SkipMinecart diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 6fa3e3f46102..63a317cb5e8b 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -86,7 +86,7 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "PostJokes", "Bowser's Castle") connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player)) connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) - connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player)) + connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player) and (StateLogic.hammers(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.thunder(state, world.player))) if world.options.difficult_logic: connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.player)) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index ddc5c4055d13..03fc02d6ce71 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -4,11 +4,10 @@ import typing import bsdiff4 +from . import Enemies from BaseClasses import Item, Location -from worlds.AutoWorld import World from settings import get_settings from worlds.Files import APDeltaPatch -from .Enemies import enemies, bosses, EnemyRandomize, Enemy, EnemyGroup from .Items import item_table from .Locations import shop, badge, pants @@ -186,10 +185,9 @@ def patch_options(self): self.stream.seek(0xDF00A0, 0) self.stream.write(self.world.multiworld.seed_name.encode("UTF-8")) - if self.world.options.skip_intro: - # Enable Skip Intro in ROM - self.stream.seek(0x244D08, 0) - self.stream.write(bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) + # Enable Skip Intro in ROM + self.stream.seek(0x244D08, 0) + self.stream.write(bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) if self.world.options.extra_pipes: # Spawn in extra pipes in ROM @@ -222,7 +220,7 @@ def patch_options(self): if self.world.options.randomize_backgrounds: self.randomize_backgrounds() - if self.world.options.randomize_enemies or self.world.options.randomize_bosses: + if self.world.options.randomize_enemies != 0 or self.world.options.randomize_bosses != 0: self.enemy_randomize() if self.world.options.scale_stats: @@ -256,18 +254,107 @@ def patch_options(self): self.swap_pants(cpants[self.world.options.luigi_pants], 1) def enemy_randomize(self): - enemy_data = EnemyRandomize() - if self.world.options.randomize_enemies: - enemy_data = self.populate_enemy_array(enemy_data) - enemy_data = self.generate_groups(enemy_data) + enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.enemies + bosses = [pos for pos in Enemies.bosses if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.bosses + + if self.world.options.randomize_bosses == 1: + raw = [] + for pos in bosses: + self.stream.seek(pos + 1) + raw += [self.stream.read(0x1F)] + self.random.shuffle(raw) + for pos in bosses: + self.stream.seek(pos + 1) + self.stream.write(raw.pop()) + + if self.world.options.randomize_enemies == 1: + raw = [] + for pos in enemies: + self.stream.seek(pos + 1) + raw += [self.stream.read(0x1F)] + if self.world.options.randomize_bosses == 2: + for pos in bosses: + self.stream.seek(pos + 1) + raw += [self.stream.read(0x1F)] + self.random.shuffle(raw) + for pos in enemies: + self.stream.seek(pos + 1) + self.stream.write(raw.pop()) + if self.world.options.randomize_bosses == 2: + for pos in bosses: + self.stream.seek(pos + 1) + self.stream.write(raw.pop()) + return + + enemies_raw = [] + groups = [] + + if self.world.options.randomize_bosses == 2: + for pos in bosses: + self.stream.seek(pos + 1) + groups += [self.stream.read(0x1F)] + + for pos in enemies: + self.stream.seek(pos + 8) + for _ in range(6): + enemy = int.from_bytes(self.stream.read(1)) + if enemy > 0: + self.stream.seek(1, 1) + flag = int.from_bytes(self.stream.read(1)) + if flag == 0x7: + break + if flag in [0x0, 0x4]: + if enemy not in Enemies.pestnut and enemy not in Enemies.flying: + print(f"adding: 0x{format(enemy, 'x')}") + enemies_raw += [enemy] + self.stream.seek(1, 1) + else: + self.stream.seek(3, 1) + + self.random.shuffle(enemies_raw) + chomp = False + for pos in enemies: + self.stream.seek(pos + 8) + + for _ in range(6): + enemy = int.from_bytes(self.stream.read(1)) + if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: + if enemy == 0x52: + chomp = True + self.stream.seek(1, 1) + flag = int.from_bytes(self.stream.read(1)) + if flag not in [0x0, 0x4]: + self.stream.seek(1, 1) + continue + self.stream.seek(-3, 1) + self.stream.write(bytes([enemies_raw.pop()])) + self.stream.seek(1, 1) + self.stream.write(bytes([0x4])) + self.stream.seek(1, 1) + else: + self.stream.seek(3, 1) + + self.stream.seek(pos + 1) + raw = self.stream.read(0x1F) + if chomp: + raw = raw[0:3] + bytes([0x67, 0xAB, 0x28, 0x08]) + raw[7:] + else: + raw = raw[0:3] + bytes([0xEE, 0x2C, 0x28, 0x08]) + raw[7:] + groups += [raw] + + self.random.shuffle(groups) + arr = Enemies.enemies + if self.world.options.randomize_bosses == 2: + arr += Enemies.bosses + + for pos in arr: + self.stream.seek(pos + 1) + self.stream.write(groups.pop()) - if self.world.options.randomize_bosses: - enemy_data = self.generate_boss_groups(enemy_data) - self.insert_groups(enemy_data) def randomize_backgrounds(self): - all_enemies = enemies + bosses + all_enemies = Enemies.enemies + Enemies.bosses for address in all_enemies: self.stream.seek(address + 3, io.SEEK_SET) self.stream.write(bytes([self.random.randint(0x0, 0x26)])) @@ -316,232 +403,6 @@ def randomize_music(self): continue self.stream.write(songs[i]) - def populate_enemy_array(self, enemy_data_) -> EnemyRandomize: - enemy_data = enemy_data_ - - for e in enemies: - i = 0 - count = 0 - while True: - if 0x50402C < e < 0x50434C and self.world.options.castle_skip: - break - stream_seek_position = e + 10 + (i * 4) - self.stream.seek(stream_seek_position, os.SEEK_SET) - type_val = self.stream.read(1)[0] - if type_val == 0x0: - type_val = 0x4 - if type_val == 0x7: - break - self.stream.seek(-3, os.SEEK_CUR) - id_val = self.stream.read(1)[0] - if id_val in [int(hex_value) for hex_value in [0x18, 0x53, 0x4B]] or ( - 0x2D <= id_val <= 0x30) or id_val == 0x3C: - type_val = 0x4 - if id_val == 0xF and type_val == 0x3: - i += 1 - if i == 6: - break - continue - if id_val in [int(hex_value) for hex_value in [0x16, 0x1E, 0x20, 0x34, 0x35, 0x36, 0x37, 0x38, 0x46]]: - enemy_data.spikedEnemies.append(Enemy(id_val, type_val)) - else: - enemy_data.enemies.append(Enemy(id_val, type_val)) - count += 1 - - i += 1 - if i == 6: - break - - if count > 4: - count = 4 - if count != 0: - enemy_data.groupSizes.append(count) - - return enemy_data - - def generate_groups(self, enemy_data_) -> EnemyRandomize: - enemy_data = enemy_data_ - no_spike = False - enemies_copy = enemy_data.enemies - spiked_copy = enemy_data.spikedEnemies - self.random.shuffle(enemies_copy) - self.random.shuffle(spiked_copy) - total = 0 - for sizes in enemy_data.groupSizes: - total += min(sizes, 4) - - for size in enemy_data.groupSizes: - temp_size = min(size, 4) - if temp_size == 0: - continue - - id_list = [] - type_list = [] - pestnuts = [] - temp_enemies = [] - script = bytes([0xEE, 0x2C, 0x28, 0x08]) - nut = 0 - special = 0 - - for _ in range(temp_size): - enemy = enemies_copy.pop(0) - if enemy.id in [0x20, 0x34]: - nut += 1 - pestnuts.append(enemy) - else: - temp_enemies.append(enemy) - if enemy.id in [0x52, 0x2C, 0x4A]: - special = 1 - if enemy.id == 0x52: - script = bytes([0x67, 0xAB, 0x28, 0x08]) - - if len(pestnuts) == 3 and size == 4: - for enemy in pestnuts: - id_list.append(enemy.id) - type_list.append(enemy.type) - for _ in range(3): - id_list.append(0xF) - type_list.append(0x3) - else: - if size == 1 and pestnuts: - id_list.append(pestnuts[0].id) - type_list.append(pestnuts[0].type) - - for enemy in pestnuts: - id_list.append(enemy.id) - type_list.append(enemy.type) - for enemy in temp_enemies: - id_list.append(enemy.id) - type_list.append(enemy.type) - - if size == 4: - for _ in range(nut): - id_list.append(0xF) - type_list.append(0x3) - else: - if pestnuts: - for _ in range(4 - len(pestnuts + temp_enemies)): - id_list.append(0x0) - type_list.append(0x7) - for _ in range(nut): - id_list.append(0xF) - type_list.append(0x3) - - if len(enemy_data.stardustGroups) < 3: - enemy_data.stardustGroups.append(EnemyGroup(bytes(id_list), bytes(type_list), temp_size, script, special)) - else: - enemy_data.groups.append(EnemyGroup(bytes(id_list), bytes(type_list), temp_size, script, special)) - - if len(enemy_data.stardustGroups) == 3 and not no_spike: - enemies_copy.extend(spiked_copy) - self.random.shuffle(enemies_copy) - no_spike = True - - return enemy_data - - def generate_boss_groups(self, enemy_data_) -> EnemyRandomize: - enemy_data = enemy_data_ - for boss_val in bosses: - - if 0x50402C < boss_val < 0x50434C and self.world.options.castle_skip: - continue - stream_seek_position = boss_val + 2 - self.stream.seek(stream_seek_position, os.SEEK_SET) - boss = self.stream.read(1)[0] - stream_seek_position = boss_val + 4 - self.stream.seek(stream_seek_position, os.SEEK_SET) - data = self.stream.read(4) - id = [] - types = [] - iterate = True - i = 0 - while iterate: - stream_seek_position = boss_val + 10 + (i * 4) - self.stream.seek(stream_seek_position, os.SEEK_SET) - type_val = self.stream.read(1)[0] - types.append(type_val) - self.stream.seek(-3, os.SEEK_CUR) - id_val = self.stream.read(1)[0] - id.append(id_val) - i += 1 - if i == 6: - break - stream_seek_position = boss_val + 1 - self.stream.seek(stream_seek_position, os.SEEK_SET) - enemy_data.bossGroups.append(EnemyGroup(bytes(id), bytes(types), self.stream.read(1)[0], data, boss)) - - return enemy_data - - def insert_groups(self, enemy_data): - do_boss = self.world.options.randomize_bosses - - if do_boss != 1: - enemy_data.groups.extend(enemy_data.bossGroups) - self.random.shuffle(enemy_data.groups) - enemy_data.groups = enemy_data.stardustGroups + enemy_data.groups - locations = enemies - boss_locations = bosses - - if do_boss == 2: - locations += boss_locations - locations.sort() - count = 0 - - for location in locations: - if len(enemy_data.groups) > 0: - if self.world.options.castle_skip and 0x50402C < location < 0x50434C: - continue - count += 1 - temp_group = enemy_data.groups[0] - enemy_data.groups = enemy_data.groups[1:] - self.stream.seek(location + 1, 0) - b = temp_group.position.to_bytes(1, byteorder='big') - self.stream.write(b) - for i in range(6): - if i < len(temp_group.id): - self.stream.seek(location + 8 + (i * 4)) - self.stream.write(bytes([temp_group.id[i]])) - self.stream.seek(1, os.SEEK_CUR) - self.stream.write(bytes([temp_group.type[i]])) - else: - self.stream.seek(location + 8 + (i * 4)) - self.stream.write(bytes([0])) - self.stream.seek(1, os.SEEK_CUR) - self.stream.write(bytes([7])) - self.stream.seek(location + 2) - self.stream.write(bytes([temp_group.boss])) - if len(temp_group.data) > 0: - self.stream.seek(location + 4) - self.stream.write(temp_group.data) - - if do_boss == 1: - for location in bosses: - if self.world.options.castle_skip and 0x50402C < location < 0x50434C: - continue - self.random.shuffle(enemy_data.bossGroups) - count += 1 - temp_group = enemy_data.bossGroups[0] - enemy_data.bossGroups = enemy_data.bossGroups[1:] - self.stream.seek(location + 1, 0) - b = temp_group.position.to_bytes(1, byteorder='big') - self.stream.write(b) - for i in range(6): - if i < len(temp_group.id): - self.stream.seek(location + 8 + (i * 4)) - self.stream.write(bytes([temp_group.id[i]])) - self.stream.seek(1, os.SEEK_CUR) - self.stream.write(bytes([temp_group.type[i]])) - else: - self.stream.seek(location + 8 + (i * 4)) - self.stream.write(bytes([0])) - self.stream.seek(1, os.SEEK_CUR) - self.stream.write(bytes([7])) - self.stream.seek(location + 2) - self.stream.write(bytes([temp_group.boss])) - if len(temp_group.data) > 0: - self.stream.seek(location + 4) - self.stream.write(temp_group.data) - def desc_inject(self, location: Location, item: Item): index = -1 for key, value in shop.items(): diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 493b9dd5f239..4a7441971b46 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -11,7 +11,7 @@ def canDash(state, player): def canCrash(state, player): - return state.has("Green Pearl Bean", player) and state.has("Thunder Hand", player) + return state.has("Green Pearl Bean", player) and state.has("Thunderhand", player) def hammers(state, player): @@ -57,7 +57,7 @@ def brooch(state, player): def thunder(state, player): - return state.has("Thunder Hand", player) + return state.has("Thunderhand", player) def fire(state, player): diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 779589586783..fc4b9b3d3b28 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -136,8 +136,6 @@ def create_items(self) -> None: # Then, get a random amount of fillers until we have as many items as we have locations filler_items = [] for item in itemList: - if item.progression == ItemClassification.skip_balancing: - continue if item.progression == ItemClassification.filler: if item.itemName == "5 Coins" and not self.options.coins: continue From b0d31f94b8d3c3f96049b014915086b57c636522 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 27 Mar 2024 03:12:39 -0400 Subject: [PATCH 29/79] Update Rom.py --- worlds/mlss/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 03fc02d6ce71..2a5416bdb5f1 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -303,7 +303,7 @@ def enemy_randomize(self): flag = int.from_bytes(self.stream.read(1)) if flag == 0x7: break - if flag in [0x0, 0x4]: + if flag in [0x0, 0x2, 0x4]: if enemy not in Enemies.pestnut and enemy not in Enemies.flying: print(f"adding: 0x{format(enemy, 'x')}") enemies_raw += [enemy] @@ -323,7 +323,7 @@ def enemy_randomize(self): chomp = True self.stream.seek(1, 1) flag = int.from_bytes(self.stream.read(1)) - if flag not in [0x0, 0x4]: + if flag not in [0x0, 0x2, 0x4]: self.stream.seek(1, 1) continue self.stream.seek(-3, 1) From 3f4f3164be22fe546fd8f5c1296b4846b217ce65 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 15 Apr 2024 11:04:34 -0400 Subject: [PATCH 30/79] Change tracker locations to serverside, no longer locations. Various code cleanup and logic changes. --- worlds/mlss/Client.py | 15 ++++++++++++--- worlds/mlss/Items.py | 13 ++----------- worlds/mlss/Locations.py | 32 ++++++++++--------------------- worlds/mlss/Names/LocationName.py | 20 +++++++++---------- worlds/mlss/Options.py | 2 +- worlds/mlss/Regions.py | 5 ++--- worlds/mlss/Rom.py | 9 ++++++--- worlds/mlss/Rules.py | 5 +++++ worlds/mlss/__init__.py | 18 ----------------- 9 files changed, 48 insertions(+), 71 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index aba6741e5e00..a66d44ddff6d 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -107,7 +107,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: is_buy = (read_state[4][0] != 0) shop_address = (struct.unpack(' None: locs_to_send.add(location) # Loop for recieving items. Item is written as an ID into 0x3057. - # ASM read the ID in a loop and give the player the item before resetting the RAM address to 0x0. + # ASM reads the ID in a loop and give the player the item before resetting the RAM address to 0x0. # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items for i in range(len(ctx.items_received) - received_index): item_data = items_by_id[ctx.items_received[received_index + i].item] @@ -138,7 +138,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if b is None: break 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")]) - await asyncio.sleep(.05) + await asyncio.sleep(.1) # Early return and location send if you are currently in a shop, # since other flags aren't going to change @@ -164,6 +164,15 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if backup_logo != "MLSSAP": return if flag_byte & mask != 0: + if location >= 0xDA0000: + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"mlss_flag{location - 0xD9FFFF}_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "replace", "value": 1}] + }]) + continue if location in roomException: if current_room not in roomException[location]: exception = True diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index b4408662fa6b..833724f8be56 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -158,17 +158,8 @@ class MLSSItem(Item): ItemData(77771140, "Power Grip", ItemClassification.useful, 0xFC), ItemData(77771141, "Cobalt Necktie", ItemClassification.useful, 0xFD), ItemData(77771142, "Game Boy Horror SP", ItemClassification.useful, 0xFE), - ItemData(77771143, "Dragohoho Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771144, "Queen Bean Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771145, "Chuckolator Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771146, "Oasis Access", ItemClassification.skip_balancing, 0x0), - ItemData(77771147, "Mom Piranha Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771148, "Entered Fungitown", ItemClassification.skip_balancing, 0x0), - ItemData(77771149, "Beanstar Complete", ItemClassification.skip_balancing, 0x0), - ItemData(77771150, "Jojora Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771151, "Birdo Defeated", ItemClassification.skip_balancing, 0x0), - ItemData(77771152, "Woo Bean", ItemClassification.skip_balancing, 0x1C), - ItemData(77771153, "Hee Bean", ItemClassification.skip_balancing, 0x1F), + ItemData(77771143, "Woo Bean", ItemClassification.skip_balancing, 0x1C), + ItemData(77771144, "Hee Bean", ItemClassification.skip_balancing, 0x1F), ] item_frequencies: typing.Dict[str, int] = { diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 4bb645b6c29e..910a4850e95c 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -566,16 +566,16 @@ class MLSSLocation(Location): 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) + LocationData("Airport Center Digspot 1", 0x39e323, 0), + LocationData("Airport Center Digspot 2", 0x39e32b, 0), + LocationData("Airport Center Digspot 3", 0x39e333, 0), + LocationData("Airport Center Digspot 4", 0x39e33b, 0), + LocationData("Airport Center Digspot 5", 0x39e343, 0), + LocationData("Airport Rightside Digspot 1", 0x39e350, 0), + LocationData("Airport Rightside Digspot 2", 0x39e358, 0), + LocationData("Airport Rightside Digspot 3", 0x39e360, 0), + LocationData("Airport Rightside Digspot 4", 0x39e368, 0), + LocationData("Airport Rightside Digspot 5", 0x39e370, 0) ] gwarharEntrance: typing.List[LocationData] = [ @@ -774,18 +774,6 @@ class MLSSLocation(Location): LocationData("Oho Oasis Thunderhand", 0x1e9409, 2) ] -event: typing.List[LocationData] = [ - LocationData("Dragohoho", 0xDA0000, 0), - LocationData("Queen Bean", 0xDA0001, 0), - LocationData("Chuckolator", 0xDA0002, 0), - LocationData("Oasis", 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)] = [ (0x434B, 0x1, 0x243844), # Farm Mole 1 (0x434B, 0x1, 0x24387d), # Farm Mole 2 diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index 5ff39f91275e..c50d86d6265c 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -237,16 +237,16 @@ class LocationName(): AirportLeftsideDigspot3 = "Airport Leftside Digspot 3" AirportLeftsideDigspot4 = "Airport Leftside Digspot 4" AirportLeftsideDigspot5 = "Airport Leftside Digspot 5" - AirportMiddleDigspot1 = "Airport Middle Digspot 1" - AirportMiddleDigspot2 = "Airport Middle Digspot 2" - AirportMiddleDigspot3 = "Airport Middle Digspot 3" - AirportMiddleDigspot4 = "Airport Middle Digspot 4" - AirportMiddleDigspot5 = "Airport Middle Digspot 5" - AirportRightDigspot1 = "Airport Right Digspot 1" - AirportRightDigspot2 = "Airport Right Digspot 2" - AirportRightDigspot3 = "Airport Right Digspot 3" - AirportRightDigspot4 = "Airport Right Digspot 4" - AirportRightDigspot5 = "Airport Right Digspot 5" + AirportCenterDigspot1 = "Airport Center Digspot 1" + AirportCenterDigspot2 = "Airport Center Digspot 2" + AirportCenterDigspot3 = "Airport Center Digspot 3" + AirportCenterDigspot4 = "Airport Center Digspot 4" + AirportCenterDigspot5 = "Airport Center Digspot 5" + AirportRightsideDigspot1 = "Airport Rightside Digspot 1" + AirportRightsideDigspot2 = "Airport Rightside Digspot 2" + AirportRightsideDigspot3 = "Airport Rightside Digspot 3" + AirportRightsideDigspot4 = "Airport Rightside Digspot 4" + AirportRightsideDigspot5 = "Airport Rightside Digspot 5" GwarharLagoonPipeRoomDigspot = "Gwarhar Lagoon Pipe Room Digspot" GwarharLagoonMassageParlorEntranceDigspot = "Gwarhar Lagoon Massage Parlor Entrance Digspot" GwarharLagoonPastHermieDigspot = "Gwarhar Lagoon Past Hermie Digspot" diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index c7b18e698cf3..67d9ce3a21a9 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -160,7 +160,7 @@ class RandomizeBosses(Choice): Boss Normal: Bosses can be swapped with normal enemy encounters. """ display_name = "Randomize Bosses" - option_none = 0 + option_disabled = 0 option_bossonly = 1 option_bossnormal = 2 default = 0 diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 63a317cb5e8b..34a62f8406c8 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -4,7 +4,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, coins + bowsers, bowsersMini, jokesEntrance, jokesMain, theater, booStatue, oasis, postJokes, baseUltraRocks, coins from . import StateLogic if typing.TYPE_CHECKING: @@ -41,7 +41,6 @@ def create_regions(world: "MLSSWorld", excluded: typing.List[str]): create_region(world, "FungitownBirdo", fungitownBirdo, excluded) create_region(world, "BooStatue", booStatue, excluded) create_region(world, "Oasis", oasis, excluded) - create_region(world, "Event", event, excluded) create_region(world, "BaseUltraRocks", baseUltraRocks, excluded) if world.options.coins: @@ -70,7 +69,7 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) connect(world, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, world.player) or state.can_reach("FungitownBirdo", "Region", world.player)) connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) or state.can_reach("Shop Piranha Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) and (StateLogic.thunder(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.hammers(state, world.player))) or state.can_reach("Shop Piranha Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 2a5416bdb5f1..20730ba350ac 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -257,7 +257,7 @@ def enemy_randomize(self): enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.enemies bosses = [pos for pos in Enemies.bosses if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.bosses - if self.world.options.randomize_bosses == 1: + if self.world.options.randomize_bosses == 1 or (self.world.options.randomize_bosses == 2 and self.world.options.randomize_enemies == 0): raw = [] for pos in bosses: self.stream.seek(pos + 1) @@ -289,6 +289,9 @@ def enemy_randomize(self): enemies_raw = [] groups = [] + if self.world.options.randomize_enemies == 0: + return + if self.world.options.randomize_bosses == 2: for pos in bosses: self.stream.seek(pos + 1) @@ -343,9 +346,9 @@ def enemy_randomize(self): groups += [raw] self.random.shuffle(groups) - arr = Enemies.enemies + arr = enemies if self.world.options.randomize_bosses == 2: - arr += Enemies.bosses + arr += bosses for pos in arr: self.stream.seek(pos + 1) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 79325b83a539..3833cf217b3e 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -249,6 +249,11 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player)) add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) + + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), + lambda state: StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), + lambda state: StateLogic.ultra(state, world.player)) if world.options.difficult_logic: add_rule(world.multiworld.get_location("Birdo", world.player), lambda state: StateLogic.postJokes(state, world.player)) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index fc4b9b3d3b28..27c067a7473f 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -98,24 +98,6 @@ def generate_basic(self) -> None: self.multiworld.get_location(LocationName.PantsShopStartingFlag1, self.player).place_locked_item(item) item = self.create_item("Chuckle Bean") self.multiworld.get_location(LocationName.PantsShopStartingFlag2, self.player).place_locked_item(item) - item = self.create_item("Dragohoho Defeated") - self.multiworld.get_location("Dragohoho", self.player).place_locked_item(item) - item = self.create_item("Queen Bean Defeated") - self.multiworld.get_location("Queen Bean", self.player).place_locked_item(item) - item = self.create_item("Chuckolator Defeated") - self.multiworld.get_location("Chuckolator", self.player).place_locked_item(item) - item = self.create_item("Oasis Access") - self.multiworld.get_location("Oasis", self.player).place_locked_item(item) - item = self.create_item("Mom Piranha Defeated") - self.multiworld.get_location("Mom Piranha", self.player).place_locked_item(item) - item = self.create_item("Entered Fungitown") - self.multiworld.get_location("Fungitown", self.player).place_locked_item(item) - item = self.create_item("Beanstar Complete") - self.multiworld.get_location("Beanstar", self.player).place_locked_item(item) - item = self.create_item("Jojora Defeated") - self.multiworld.get_location("Jojora", self.player).place_locked_item(item) - item = self.create_item("Birdo Defeated") - self.multiworld.get_location("Birdo", self.player).place_locked_item(item) def create_items(self) -> None: # First add in all progression and useful items From 2c52c08273e7b7f9fbe4426d7e03edfad623ad06 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 15 Apr 2024 11:57:42 -0400 Subject: [PATCH 31/79] Event removal continuation. --- worlds/mlss/Client.py | 4 +++- worlds/mlss/Locations.py | 2 +- worlds/mlss/Regions.py | 1 - worlds/mlss/Rules.py | 21 --------------------- worlds/mlss/__init__.py | 6 ++---- 5 files changed, 6 insertions(+), 28 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index a66d44ddff6d..0ec91b1fe639 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -107,7 +107,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: is_buy = (read_state[4][0] != 0) shop_address = (struct.unpack(' None: # ASM reads the ID in a loop and give the player the item before resetting the RAM address to 0x0. # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items for i in range(len(ctx.items_received) - received_index): + logger.info(f"Receiving items: {len(ctx.items_received) - received_index}") item_data = items_by_id[ctx.items_received[received_index + i].item] b = await bizhawk.guarded_read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")], [(0x3057, [0x0], "EWRAM")]) if b is None: @@ -143,6 +144,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: # Early return and location send if you are currently in a shop, # since other flags aren't going to change if shopping & 0x3 == 0x3: + logger.info("Shopping") if locs_to_send != self.local_checked_locations: self.local_checked_locations = locs_to_send diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 910a4850e95c..87c0731fc250 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -1110,6 +1110,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 + coins + jokesEntrance + jokesMain + postJokes + theater + oasis + gwarharMain + bowsersMini + baseUltraRocks + coins location_table: typing.Dict[str, int] = {locData.name: locData.id for locData in all_locations} diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 34a62f8406c8..8ca003f63670 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -55,7 +55,6 @@ def connect_regions(world: "MLSSWorld"): names: typing.Dict[str, int] = {} connect(world, names, "Menu", "Main Area") - connect(world, names, "Main Area", "Event") if world.options.coins: connect(world, names, "Main Area", "Coins") connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 3833cf217b3e..131ae8bad48f 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -1,7 +1,6 @@ import typing from worlds.generic.Rules import add_rule, forbid_item -from worlds.AutoWorld import World from .Names.LocationName import LocationName from .Locations import all_locations, hidden from . import StateLogic @@ -11,16 +10,6 @@ def set_rules(world: "MLSSWorld", excluded): - add_rule(world.multiworld.get_location("Queen Bean", world.player), lambda state: StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location("Chuckolator", world.player), lambda state: StateLogic.castleTown(state, world.player)) - add_rule(world.multiworld.get_location("Oasis", world.player), - lambda state: (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) - or (StateLogic.fire(state, world.player) and StateLogic.membership(state, world.player)) and (StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player))) - add_rule(world.multiworld.get_location("Mom Piranha", world.player), lambda state: StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location("Fungitown", world.player), lambda state: StateLogic.fungitown(state, world.player)) - add_rule(world.multiworld.get_location("Beanstar", world.player), - lambda state: StateLogic.castleTown(state, world.player) and StateLogic.rose(state,world.player) and StateLogic.pieces(state,world.player)) - for location in all_locations: if "Digspot" in location.name: if (world.options.skip_minecart and "Minecart" in location.name) or ( @@ -255,10 +244,6 @@ def set_rules(world: "MLSSWorld", excluded): add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), lambda state: StateLogic.ultra(state, world.player)) if world.options.difficult_logic: - add_rule(world.multiworld.get_location("Birdo", world.player), - lambda state: StateLogic.postJokes(state, world.player)) - add_rule(world.multiworld.get_location("Jojora", world.player), lambda state: StateLogic.surfable(state, world.player) - and StateLogic.canDash(state, world.player) and StateLogic.canDig(state, world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: StateLogic.canCrash(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), @@ -266,12 +251,6 @@ def set_rules(world: "MLSSWorld", excluded): if world.options.chuckle_beans != 0: add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), lambda state: StateLogic.canCrash(state, world.player)) - else: - add_rule(world.multiworld.get_location("Birdo", world.player), - lambda state: StateLogic.postJokes(state, world.player) and StateLogic.canCrash(state, world.player)) - add_rule(world.multiworld.get_location("Jojora", world.player), lambda state: StateLogic.surfable(state, world.player) - and StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player) - and StateLogic.canDig(state, world.player)) if world.options.coins: add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 27c067a7473f..17692a691885 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -2,7 +2,7 @@ import settings from BaseClasses import Tutorial, ItemClassification from worlds.AutoWorld import WebWorld, World -from .Locations import all_locations, location_table, bowsers, bowsersMini, event, hidden, coins +from .Locations import all_locations, location_table, bowsers, bowsersMini, hidden, coins from .Options import MLSSOptions from .Items import MLSSItem, itemList, item_frequencies, item_table from .Names.LocationName import LocationName @@ -132,7 +132,7 @@ def create_items(self) -> None: freq = 1 filler_items += [item.itemName for _ in range(freq)] - remaining = len(all_locations) - len(required_items) - len(event) - 5 + remaining = len(all_locations) - len(required_items) - 5 if self.options.castle_skip: remaining -= (len(bowsers) + len(bowsersMini) - (5 if self.options.chuckle_beans == 0 else 0)) if self.options.skip_minecart and self.options.chuckle_beans == 2: @@ -173,8 +173,6 @@ def generate_output(self, output_directory: str) -> None: if not self.options.coins 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 item = location.item address = [address for address in all_locations if address.name == location.name] rom.item_inject(location.address, address[0].itemType, item) From 2fad6ab7c6fe6cd65842c8e312732f66fda12829 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 15 Apr 2024 16:50:30 -0400 Subject: [PATCH 32/79] Partial Implementation of APPP (Incomplete)) --- worlds/mlss/Rom.py | 661 +++++++++++++++++++++++++-------------------- 1 file changed, 364 insertions(+), 297 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 20730ba350ac..f481bad0aeb1 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,13 +1,14 @@ import io import os import pkgutil +import struct import typing import bsdiff4 from . import Enemies from BaseClasses import Item, Location from settings import get_settings -from worlds.Files import APDeltaPatch +from worlds.Files import APDeltaPatch, APProcedurePatch, APTokenMixin, APTokenTypes from .Items import item_table from .Locations import shop, badge, pants @@ -61,325 +62,391 @@ def get_base_rom_as_bytes() -> bytes: return base_rom_bytes -class MLSSDeltaPatch(APDeltaPatch): +class MLSSProcedurePatch(APProcedurePatch, APTokenMixin): game = "Mario & Luigi Superstar Saga" hash = "4b1a5897d89d9e74ec7f630eefdfd435" patch_file_ending = ".apmlss" result_file_ending = ".gba" + procedure = [ + ("apply_bsdiff4", ["basepatch.bsdiff"]), + ("apply_tokens", ["token_data.bin"]) + ] + @classmethod def get_source_data(cls) -> bytes: return get_base_rom_as_bytes() - -class Rom: - hash = "4b1a5897d89d9e74ec7f630eefdfd435" - - def __init__(self, world: "MLSSWorld"): - content = get_base_rom_as_bytes() - patched = self.apply_delta(content) - self.random = world.multiworld.per_slot_randoms[world.player] - self.stream = io.BytesIO(patched) - self.world = world - self.player = world.player - - def swap_colors(self, color, bro): - temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") - temp_io = io.BytesIO(temp) - color_arr = [] - - for lines in temp_io.readlines(): - - arr = lines.decode('utf-8').strip().split(',') - if color != "Chaos" and color != "TrueChaos": - color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) - else: - color_arr.append( - Color(int(arr[0], 16), self.random.randint(0, 255), self.random.randint(0, 127), int(arr[1], 16))) - - colors_ = [c for c in color_arr if c.bro == bro] - - for c in colors_: - self.stream.seek(c.location, io.SEEK_SET) - self.stream.write(bytes([c.byte1, c.byte2])) - - def swap_pants(self, color, bro): - mario_color = self.world.options.mario_color - luigi_color = self.world.options.luigi_color - if bro == 0 and (colors[mario_color] == "TrueChaos" or colors[mario_color] == "Silhouette"): - return - if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): - return - if color == "Vanilla": - return - temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") - temp_io = io.BytesIO(temp) - color_arr = [] - - for lines in temp_io.readlines(): - arr = lines.decode('utf-8').strip().split(',') - if color != "Chaos" and color != "TrueChaos": - color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) - else: - color_arr.append( - Color(int(arr[0], 16), self.random.randint(0, 255), self.random.randint(0, 127), int(arr[1], 16))) - - colors_ = [c for c in color_arr if c.bro == bro] - - for c in colors_: - self.stream.seek(c.location, io.SEEK_SET) - self.stream.write(bytes([c.byte1, c.byte2])) - - def item_inject(self, location: int, item_type: int, item: Item): - if item.player == self.player: - code = item_table[item.name].itemID +def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: + # Bake player name into ROM + patch.write_token( + APTokenTypes.WRITE, + 0xDF0000, + struct.pack("s", world.multiworld.player_name[world.player].encode("UTF-8")) + ) + + # Bake seed name into ROM + patch.write_token( + APTokenTypes.WRITE, + 0xDF00A0, + struct.pack("s", world.multiworld.seed_name.encode("UTF-8")) + ) + + # Intro Skip + patch.write_token( + APTokenTypes.WRITE, + 0x244D08, + struct.pack("s", bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) + ) + + # Patch S.S Chuckola Loading Zones + patch.write_token( + APTokenTypes.WRITE, + 0x25FD4E, + struct.pack("s", bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + ) + + patch.write_token( + APTokenTypes.WRITE, + 0x25FD83, + struct.pack("s", bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF])) + ) + + patch.write_token( + APTokenTypes.WRITE, + 0x25FDB8, + struct.pack("s", bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) + ) + + patch.write_token( + APTokenTypes.WRITE, + 0x25FDED, + struct.pack("s", bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) + ) + + patch.write_token( + APTokenTypes.WRITE, + 0x25FE22, + struct.pack("s", bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) + ) + + patch.write_token( + APTokenTypes.WRITE, + 0x25FE57, + struct.pack("s", bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF])) + ) + + if world.options.extra_pipes: + patch.write_token( + APTokenTypes.WRITE, + 0xD00001, + struct.pack("B", 1) + ) + + if world.options.castle_skip: + patch.write_token( + APTokenTypes.WRITE, + 0x3AEAB0, + struct.pack("s", bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) + ) + patch.write_token( + APTokenTypes.WRITE, + 0x3AEC18, + struct.pack("s", bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) + ) + + if world.options.skip_minecart: + patch.write_token( + APTokenTypes.WRITE, + 0x3AC728, + struct.pack("s", bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) + ) + patch.write_token( + APTokenTypes.WRITE, + 0x3AC56C, + struct.pack("s", bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) + ) + + if world.options.scale_stats: + patch.write_token( + APTokenTypes.WRITE, + 0x1E9418, + struct.pack("B", 1) + ) + + if world.options.scale_pow: + patch.write_token( + APTokenTypes.WRITE, + 0x1E9419, + struct.pack("B", 1) + ) + + if world.options.tattle_hp: + patch.write_token( + APTokenTypes.WRITE, + 0xD00000, + struct.pack("B", 1) + ) + + if world.options.randomize_sounds: + self.randomize_sounds() + + if world.options.music_options == 1: + self.randomize_music() + + if world.options.music_options == 2: + patch.write_token( + APTokenTypes.WRITE, + 0x19B118, + struct.pack("s", bytes([0x0, 0x25])) + ) + + if world.options.randomize_backgrounds: + all_enemies = Enemies.enemies + Enemies.bosses + for address in all_enemies: + patch.write_token( + APTokenTypes.WRITE, + address + 3, + struct.pack("B", world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26)) + ) + + if world.options.randomize_enemies != 0 or world.options.randomize_bosses != 0: + self.enemy_randomize() + + swap_colors(world, patch, colors[world.options.mario_color], 0) + swap_colors(world, patch, colors[world.options.luigi_color], 1) + swap_pants(world, patch, colors[world.options.mario_pants], 0) + swap_pants(world, patch, colors[world.options.luigi_pants], 1) + +def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): + temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") + temp_io = io.BytesIO(temp) + color_arr = [] + random = world.multiworld.per_slot_randoms[world.player] + + for lines in temp_io.readlines(): + arr = lines.decode('utf-8').strip().split(',') + if color != "Chaos" and color != "TrueChaos": + color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) else: - code = 0x3F - if item_type == 0: - self.stream.seek(location, 0) - self.stream.write(bytes([code])) - self.stream.seek(location - 6, 0) - b = self.stream.read(1) - if b[0] == 0x10 and self.world.options.hidden_visible: - self.stream.seek(location - 6, 0) - self.stream.write(bytes([0x0])) - if b[0] == 0x0 and self.world.options.blocks_invisible: - self.stream.seek(location - 6, 0) - self.stream.write(bytes([0x10])) - elif item_type == 1: - if code == 0x1D or code == 0x1E: - code += 0xE - if 0x20 <= code <= 0x26: - code -= 0x4 - insert = int(code) - insert2 = insert % 0x10 - insert2 *= 0x10 - insert //= 0x10 - insert += 0x20 - self.stream.seek(location, 0) - self.stream.write(bytes([insert, insert2])) - elif item_type == 2: - if code == 0x1D or code == 0x1E: - code += 0xE - if 0x20 <= code <= 0x26: - code -= 0x4 - self.stream.seek(location, 0) - self.stream.write(bytes([code])) - elif item_type == 3: - if code == 0x1D or code == 0x1E: - code += 0xE - if code < 0x1D: - code -= 0xA - if 0x20 <= code <= 0x26: - code -= 0xE - self.stream.seek(location, 0) - self.stream.write(bytes([code])) + color_arr.append( + Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) + + colors_ = [c for c in color_arr if c.bro == bro] + + for c in colors_: + patch.write_token( + APTokenTypes.WRITE, + c.location, + struct.pack("s", bytes([c.byte1, c.byte2])) + ) + +def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): + mario_color = world.options.mario_color + luigi_color = world.options.luigi_color + random = world.multiworld.per_slot_randoms[world.player] + if bro == 0 and (colors[mario_color] == "TrueChaos" or colors[mario_color] == "Silhouette"): + return + if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): + return + if color == "Vanilla": + return + temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") + temp_io = io.BytesIO(temp) + color_arr = [] + + for lines in temp_io.readlines(): + arr = lines.decode('utf-8').strip().split(',') + if color != "Chaos" and color != "TrueChaos": + color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) else: - self.stream.seek(location, 0) - self.stream.write(bytes([0x18])) - - def patch_options(self): - name = self.world.multiworld.player_name[self.player].encode("UTF-8") - self.stream.seek(0xDF0000, 0) - self.stream.write(name) - self.stream.seek(0xDF00A0, 0) - self.stream.write(self.world.multiworld.seed_name.encode("UTF-8")) - - # Enable Skip Intro in ROM - self.stream.seek(0x244D08, 0) - self.stream.write(bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) - - if self.world.options.extra_pipes: - # Spawn in extra pipes in ROM - self.stream.seek(0xD00001, 0) - self.stream.write(bytes([0x1])) - - if self.world.options.castle_skip: - # Enable Bowser's castle skip in ROM - self.stream.seek(0x3AEAB0, 0) - self.stream.write(bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) - self.stream.seek(0x3AEC18, 0) - self.stream.write(bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) - - if self.world.options.skip_minecart: - # Enable minecart skip in ROM - self.stream.seek(0x3AC728, 0) - self.stream.write(bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) - self.stream.seek(0x3AC56C, 0) - self.stream.write(bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) - - if self.world.options.randomize_sounds: - self.randomize_sounds() - - if self.world.options.music_options == 1: - self.randomize_music() - - if self.world.options.music_options == 2: - self.disable_music() - - if self.world.options.randomize_backgrounds: - self.randomize_backgrounds() - - if self.world.options.randomize_enemies != 0 or self.world.options.randomize_bosses != 0: - self.enemy_randomize() - - if self.world.options.scale_stats: - self.stream.seek(0x1E9418, 0) - self.stream.write(bytes([0x1])) - - if self.world.options.scale_pow: - self.stream.seek(0x1E9419, 0) - self.stream.write(bytes([0x1])) - - if self.world.options.tattle_hp: - self.stream.seek(0xD00000, 0) - self.stream.write(bytes([0x1])) - - 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, 0xC0, 0x2, 0xF])) - self.stream.seek(0x25FDB8, 0) - self.stream.write(bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) - self.stream.seek(0x25FDED, 0) - self.stream.write(bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) - self.stream.seek(0x25FE22, 0) - self.stream.write(bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) - self.stream.seek(0x25FE57, 0) - self.stream.write(bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF])) - - self.swap_colors(colors[self.world.options.mario_color], 0) - self.swap_colors(colors[self.world.options.luigi_color], 1) - self.swap_pants(cpants[self.world.options.mario_pants], 0) - self.swap_pants(cpants[self.world.options.luigi_pants], 1) - - def enemy_randomize(self): - enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.enemies - bosses = [pos for pos in Enemies.bosses if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.bosses - - if self.world.options.randomize_bosses == 1 or (self.world.options.randomize_bosses == 2 and self.world.options.randomize_enemies == 0): - raw = [] - for pos in bosses: - self.stream.seek(pos + 1) - raw += [self.stream.read(0x1F)] - self.random.shuffle(raw) - for pos in bosses: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) + color_arr.append( + Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) + + colors_ = [c for c in color_arr if c.bro == bro] + + for c in colors_: + patch.write_token( + APTokenTypes.WRITE, + c.location, + struct.pack("s", bytes([c.byte1, c.byte2])) + ) + +def item_inject(self, location: int, item_type: int, item: Item): + if item.player == self.player: + code = item_table[item.name].itemID + else: + code = 0x3F + if item_type == 0: + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + self.stream.seek(location - 6, 0) + b = self.stream.read(1) + if b[0] == 0x10 and self.world.options.hidden_visible: + self.stream.seek(location - 6, 0) + self.stream.write(bytes([0x0])) + if b[0] == 0x0 and self.world.options.blocks_invisible: + self.stream.seek(location - 6, 0) + self.stream.write(bytes([0x10])) + elif item_type == 1: + if code == 0x1D or code == 0x1E: + code += 0xE + if 0x20 <= code <= 0x26: + code -= 0x4 + insert = int(code) + insert2 = insert % 0x10 + insert2 *= 0x10 + insert //= 0x10 + insert += 0x20 + self.stream.seek(location, 0) + self.stream.write(bytes([insert, insert2])) + elif item_type == 2: + if code == 0x1D or code == 0x1E: + code += 0xE + if 0x20 <= code <= 0x26: + code -= 0x4 + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + elif item_type == 3: + if code == 0x1D or code == 0x1E: + code += 0xE + if code < 0x1D: + code -= 0xA + if 0x20 <= code <= 0x26: + code -= 0xE + self.stream.seek(location, 0) + self.stream.write(bytes([code])) + else: + self.stream.seek(location, 0) + self.stream.write(bytes([0x18])) + +def enemy_randomize(world: "MLSSWorld", patch: MLSSProcedurePatch): + enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.enemies + bosses = [pos for pos in Enemies.bosses if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.bosses + + if self.world.options.randomize_bosses == 1 or (self.world.options.randomize_bosses == 2 and self.world.options.randomize_enemies == 0): + raw = [] + for pos in bosses: + self.stream.seek(pos + 1) + raw += [self.stream.read(0x1F)] + self.random.shuffle(raw) + for pos in bosses: + self.stream.seek(pos + 1) + self.stream.write(raw.pop()) - if self.world.options.randomize_enemies == 1: - raw = [] - for pos in enemies: + if self.world.options.randomize_enemies == 1: + raw = [] + for pos in enemies: + self.stream.seek(pos + 1) + raw += [self.stream.read(0x1F)] + if self.world.options.randomize_bosses == 2: + for pos in bosses: self.stream.seek(pos + 1) raw += [self.stream.read(0x1F)] - if self.world.options.randomize_bosses == 2: - for pos in bosses: - self.stream.seek(pos + 1) - raw += [self.stream.read(0x1F)] - self.random.shuffle(raw) - for pos in enemies: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) - if self.world.options.randomize_bosses == 2: - for pos in bosses: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) - return - - enemies_raw = [] - groups = [] - - if self.world.options.randomize_enemies == 0: - return - + self.random.shuffle(raw) + for pos in enemies: + self.stream.seek(pos + 1) + self.stream.write(raw.pop()) if self.world.options.randomize_bosses == 2: for pos in bosses: self.stream.seek(pos + 1) - groups += [self.stream.read(0x1F)] + self.stream.write(raw.pop()) + return - for pos in enemies: - self.stream.seek(pos + 8) - for _ in range(6): - enemy = int.from_bytes(self.stream.read(1)) - if enemy > 0: - self.stream.seek(1, 1) - flag = int.from_bytes(self.stream.read(1)) - if flag == 0x7: - break - if flag in [0x0, 0x2, 0x4]: - if enemy not in Enemies.pestnut and enemy not in Enemies.flying: - print(f"adding: 0x{format(enemy, 'x')}") - enemies_raw += [enemy] - self.stream.seek(1, 1) - else: - self.stream.seek(3, 1) + enemies_raw = [] + groups = [] - self.random.shuffle(enemies_raw) - chomp = False - for pos in enemies: - self.stream.seek(pos + 8) - - for _ in range(6): - enemy = int.from_bytes(self.stream.read(1)) - if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: - if enemy == 0x52: - chomp = True - self.stream.seek(1, 1) - flag = int.from_bytes(self.stream.read(1)) - if flag not in [0x0, 0x2, 0x4]: - self.stream.seek(1, 1) - continue - self.stream.seek(-3, 1) - self.stream.write(bytes([enemies_raw.pop()])) - self.stream.seek(1, 1) - self.stream.write(bytes([0x4])) - self.stream.seek(1, 1) - else: - self.stream.seek(3, 1) + if self.world.options.randomize_enemies == 0: + return + if self.world.options.randomize_bosses == 2: + for pos in bosses: self.stream.seek(pos + 1) - raw = self.stream.read(0x1F) - if chomp: - raw = raw[0:3] + bytes([0x67, 0xAB, 0x28, 0x08]) + raw[7:] + groups += [self.stream.read(0x1F)] + + for pos in enemies: + self.stream.seek(pos + 8) + for _ in range(6): + enemy = int.from_bytes(self.stream.read(1)) + if enemy > 0: + self.stream.seek(1, 1) + flag = int.from_bytes(self.stream.read(1)) + if flag == 0x7: + break + if flag in [0x0, 0x2, 0x4]: + if enemy not in Enemies.pestnut and enemy not in Enemies.flying: + print(f"adding: 0x{format(enemy, 'x')}") + enemies_raw += [enemy] + self.stream.seek(1, 1) else: - raw = raw[0:3] + bytes([0xEE, 0x2C, 0x28, 0x08]) + raw[7:] - groups += [raw] - - self.random.shuffle(groups) - arr = enemies - if self.world.options.randomize_bosses == 2: - arr += bosses - - for pos in arr: - self.stream.seek(pos + 1) - self.stream.write(groups.pop()) - - + self.stream.seek(3, 1) + + self.random.shuffle(enemies_raw) + chomp = False + for pos in enemies: + self.stream.seek(pos + 8) + + for _ in range(6): + enemy = int.from_bytes(self.stream.read(1)) + if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: + if enemy == 0x52: + chomp = True + self.stream.seek(1, 1) + flag = int.from_bytes(self.stream.read(1)) + if flag not in [0x0, 0x2, 0x4]: + self.stream.seek(1, 1) + continue + self.stream.seek(-3, 1) + self.stream.write(bytes([enemies_raw.pop()])) + self.stream.seek(1, 1) + self.stream.write(bytes([0x4])) + self.stream.seek(1, 1) + else: + self.stream.seek(3, 1) - def randomize_backgrounds(self): - all_enemies = Enemies.enemies + Enemies.bosses - for address in all_enemies: - self.stream.seek(address + 3, io.SEEK_SET) - self.stream.write(bytes([self.random.randint(0x0, 0x26)])) - - def randomize_sounds(self): - temp = pkgutil.get_data(__name__, "data/sounds.txt") - temp_io = io.BytesIO(temp) - fresh_pointers = [] - - for line in temp_io.readlines(): - fresh_pointers += [int(line.decode('utf-8').strip(), 16)] - pointers = list(fresh_pointers) - - self.world.random.shuffle(pointers) - self.stream.seek(0x21cc44, 0) - for i in range(354): - current_position = self.stream.tell() - value = int.from_bytes(self.stream.read(3), 'little') - if value in fresh_pointers: - self.stream.seek(current_position) - self.stream.write(pointers.pop().to_bytes(3, 'little')) - self.stream.seek(1, 1) + self.stream.seek(pos + 1) + raw = self.stream.read(0x1F) + if chomp: + raw = raw[0:3] + bytes([0x67, 0xAB, 0x28, 0x08]) + raw[7:] + else: + raw = raw[0:3] + bytes([0xEE, 0x2C, 0x28, 0x08]) + raw[7:] + groups += [raw] + + self.random.shuffle(groups) + arr = enemies + if self.world.options.randomize_bosses == 2: + arr += bosses + + for pos in arr: + self.stream.seek(pos + 1) + self.stream.write(groups.pop()) + + + +def randomize_backgrounds(self): + all_enemies = Enemies.enemies + Enemies.bosses + for address in all_enemies: + self.stream.seek(address + 3, io.SEEK_SET) + self.stream.write(bytes([self.random.randint(0x0, 0x26)])) + +def randomize_sounds(self): + temp = pkgutil.get_data(__name__, "data/sounds.txt") + temp_io = io.BytesIO(temp) + fresh_pointers = [] + + for line in temp_io.readlines(): + fresh_pointers += [int(line.decode('utf-8').strip(), 16)] + pointers = list(fresh_pointers) + + self.world.random.shuffle(pointers) + self.stream.seek(0x21cc44, 0) + for i in range(354): + current_position = self.stream.tell() + value = int.from_bytes(self.stream.read(3), 'little') + if value in fresh_pointers: + self.stream.seek(current_position) + self.stream.write(pointers.pop().to_bytes(3, 'little')) + self.stream.seek(1, 1) def disable_music(self): From 2947f581930c35329b9263b7cfa452b42abbbde5 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 15 Apr 2024 23:44:25 -0400 Subject: [PATCH 33/79] v1.4 Implemented APPP --- worlds/mlss/Client.py | 2 - worlds/mlss/Rom.py | 571 ++++++++++++++++++++++------------------ worlds/mlss/__init__.py | 30 +-- 3 files changed, 323 insertions(+), 280 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 0ec91b1fe639..a1f853d2eae1 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -133,7 +133,6 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: # ASM reads the ID in a loop and give the player the item before resetting the RAM address to 0x0. # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items for i in range(len(ctx.items_received) - received_index): - logger.info(f"Receiving items: {len(ctx.items_received) - received_index}") item_data = items_by_id[ctx.items_received[received_index + i].item] b = await bizhawk.guarded_read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")], [(0x3057, [0x0], "EWRAM")]) if b is None: @@ -144,7 +143,6 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: # Early return and location send if you are currently in a shop, # since other flags aren't going to change if shopping & 0x3 == 0x3: - logger.info("Shopping") if locs_to_send != self.local_checked_locations: self.local_checked_locations = locs_to_send diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index f481bad0aeb1..9d001e0a0751 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,16 +1,15 @@ import io -import os +import json import pkgutil -import struct +import random import typing -import bsdiff4 from . import Enemies from BaseClasses import Item, Location from settings import get_settings -from worlds.Files import APDeltaPatch, APProcedurePatch, APTokenMixin, APTokenTypes +from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes, APPatchExtension from .Items import item_table -from .Locations import shop, badge, pants +from .Locations import shop, badge, pants, location_table, hidden, all_locations if typing.TYPE_CHECKING: from . import MLSSWorld @@ -62,6 +61,196 @@ def get_base_rom_as_bytes() -> bytes: return base_rom_bytes +class MLSSPatchExtension(APPatchExtension): + game = "Mario & Luigi Superstar Saga" + + @staticmethod + def randomize_music(caller: APProcedurePatch, rom: bytes): + options = json.loads(caller.get_file("options.json").decode("UTF-8")) + if options["music_options"] != 1: + return rom + stream = io.BytesIO(rom) + random.seed(options["seed"] + options["player"]) + + songs = [] + stream.seek(0x21CB74) + while True: + if stream.tell() == 0x21CBD8: + stream.seek(4, 1) + continue + if stream.tell() == 0x21CC3C: + break + temp = stream.read(4) + songs.append(temp) + + random.shuffle(songs) + stream.seek(0x21CB74) + for i in range(len(songs) - 1, -1, -1): + if stream.tell() == 0x21CBD8: + stream.seek(4, 1) + continue + stream.write(songs[i]) + + return stream.getvalue() + + @staticmethod + def hidden_visible(caller: APProcedurePatch, rom: bytes): + options = json.loads(caller.get_file("options.json").decode("UTF-8")) + if options["hidden_visible"] == 0 and options["blocks_invisible"] == 0: + return rom + stream = io.BytesIO(rom) + + for location in all_locations: + stream.seek(location.id - 6) + b = stream.read(1) + if b[0] == 0x10 and options["hidden_visible"]: + stream.seek(location.id - 6) + stream.write(bytes([0x0])) + if b[0] == 0x0 and options["blocks_invisible"]: + stream.seek(location.id - 6) + stream.write(bytes([0x10])) + + return stream.getvalue() + + @staticmethod + def randomize_sounds(caller: APProcedurePatch, rom: bytes): + options = json.loads(caller.get_file("options.json").decode("UTF-8")) + if options["randomize_sounds"] != 1: + return rom + stream = io.BytesIO(rom) + random.seed(options["seed"] + options["player"]) + + temp = pkgutil.get_data(__name__, "data/sounds.txt") + temp_io = io.BytesIO(temp) + fresh_pointers = [] + + for line in temp_io.readlines(): + fresh_pointers += [int(line.decode('utf-8').strip(), 16)] + pointers = list(fresh_pointers) + + random.shuffle(pointers) + stream.seek(0x21cc44, 0) + for i in range(354): + current_position = stream.tell() + value = int.from_bytes(stream.read(3), 'little') + if value in fresh_pointers: + stream.seek(current_position) + stream.write(pointers.pop().to_bytes(3, 'little')) + stream.seek(1, 1) + + return stream.getvalue() + + @staticmethod + def enemy_randomize(caller: APProcedurePatch, rom: bytes): + options = json.loads(caller.get_file("options.json").decode("UTF-8")) + enemies = [pos for pos in Enemies.enemies if + pos not in Enemies.bowsers] if options["castle_skip"] else Enemies.enemies + bosses = [pos for pos in Enemies.bosses if + pos not in Enemies.bowsers] if options["castle_skip"] else Enemies.bosses + stream = io.BytesIO(rom) + random.seed(options["seed"] + options["player"]) + + if options["randomize_bosses"] == 1 or (options["randomize_bosses"] == 2 and options["randomize_enemies"] == 0): + raw = [] + for pos in bosses: + stream.seek(pos + 1) + raw += [stream.read(0x1F)] + random.shuffle(raw) + for pos in bosses: + stream.seek(pos + 1) + stream.write(raw.pop()) + + if options["randomize_enemies"] == 1: + raw = [] + for pos in enemies: + stream.seek(pos + 1) + raw += [stream.read(0x1F)] + if options["randomize_bosses"] == 2: + for pos in bosses: + stream.seek(pos + 1) + raw += [stream.read(0x1F)] + random.shuffle(raw) + for pos in enemies: + stream.seek(pos + 1) + stream.write(raw.pop()) + if options["randomize_bosses"] == 2: + for pos in bosses: + stream.seek(pos + 1) + stream.write(raw.pop()) + return + + enemies_raw = [] + groups = [] + + if options["randomize_enemies"] == 0: + return + + if options["randomize_bosses"] == 2: + for pos in bosses: + stream.seek(pos + 1) + groups += [stream.read(0x1F)] + + for pos in enemies: + stream.seek(pos + 8) + for _ in range(6): + enemy = int.from_bytes(stream.read(1)) + if enemy > 0: + stream.seek(1, 1) + flag = int.from_bytes(stream.read(1)) + if flag == 0x7: + break + if flag in [0x0, 0x2, 0x4]: + if enemy not in Enemies.pestnut and enemy not in Enemies.flying: + print(f"adding: 0x{format(enemy, 'x')}") + enemies_raw += [enemy] + stream.seek(1, 1) + else: + stream.seek(3, 1) + + random.shuffle(enemies_raw) + chomp = False + for pos in enemies: + stream.seek(pos + 8) + + for _ in range(6): + enemy = int.from_bytes(stream.read(1)) + if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: + if enemy == 0x52: + chomp = True + stream.seek(1, 1) + flag = int.from_bytes(stream.read(1)) + if flag not in [0x0, 0x2, 0x4]: + stream.seek(1, 1) + continue + stream.seek(-3, 1) + stream.write(bytes([enemies_raw.pop()])) + stream.seek(1, 1) + stream.write(bytes([0x4])) + stream.seek(1, 1) + else: + stream.seek(3, 1) + + stream.seek(pos + 1) + raw = stream.read(0x1F) + if chomp: + raw = raw[0:3] + bytes([0x67, 0xAB, 0x28, 0x08]) + raw[7:] + else: + raw = raw[0:3] + bytes([0xEE, 0x2C, 0x28, 0x08]) + raw[7:] + groups += [raw] + chomp = False + + random.shuffle(groups) + arr = enemies + if options["randomize_bosses"] == 2: + arr += bosses + + for pos in arr: + stream.seek(pos + 1) + stream.write(groups.pop()) + + return stream.getvalue() + + class MLSSProcedurePatch(APProcedurePatch, APTokenMixin): game = "Mario & Luigi Superstar Saga" hash = "4b1a5897d89d9e74ec7f630eefdfd435" @@ -69,136 +258,148 @@ class MLSSProcedurePatch(APProcedurePatch, APTokenMixin): result_file_ending = ".gba" procedure = [ - ("apply_bsdiff4", ["basepatch.bsdiff"]), - ("apply_tokens", ["token_data.bin"]) + ("apply_bsdiff4", ["base_patch.bsdiff4"]), + ("apply_tokens", ["token_data.bin"]), + ("enemy_randomize", []), + ("hidden_visible", []), + ("randomize_sounds", []), + ("randomize_music", []), ] @classmethod def get_source_data(cls) -> bytes: return get_base_rom_as_bytes() + def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: + options_dict = { + "randomize_enemies": world.options.randomize_enemies.value, + "randomize_bosses": world.options.randomize_bosses.value, + "castle_skip": world.options.castle_skip.value, + "randomize_sounds": world.options.randomize_sounds.value, + "music_options": world.options.music_options.value, + "hidden_visible": world.options.hidden_visible.value, + "blocks_invisible": world.options.blocks_invisible.value, + "seed": world.multiworld.seed, + "player": world.player + } + patch.write_file("options.json", json.dumps(options_dict).encode("UTF-8")) + # Bake player name into ROM patch.write_token( APTokenTypes.WRITE, 0xDF0000, - struct.pack("s", world.multiworld.player_name[world.player].encode("UTF-8")) + world.multiworld.player_name[world.player].encode("UTF-8") ) # Bake seed name into ROM patch.write_token( APTokenTypes.WRITE, 0xDF00A0, - struct.pack("s", world.multiworld.seed_name.encode("UTF-8")) + world.multiworld.seed_name.encode("UTF-8") ) # Intro Skip patch.write_token( APTokenTypes.WRITE, 0x244D08, - struct.pack("s", bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8])) + bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8]) ) # Patch S.S Chuckola Loading Zones patch.write_token( APTokenTypes.WRITE, 0x25FD4E, - struct.pack("s", bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) + bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF]) ) patch.write_token( APTokenTypes.WRITE, 0x25FD83, - struct.pack("s", bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF])) + bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF]) ) patch.write_token( APTokenTypes.WRITE, 0x25FDB8, - struct.pack("s", bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) + bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF]) ) patch.write_token( APTokenTypes.WRITE, 0x25FDED, - struct.pack("s", bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) + bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF]) ) patch.write_token( APTokenTypes.WRITE, 0x25FE22, - struct.pack("s", bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) + bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF]) ) patch.write_token( APTokenTypes.WRITE, 0x25FE57, - struct.pack("s", bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF])) + bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF]) ) if world.options.extra_pipes: patch.write_token( APTokenTypes.WRITE, 0xD00001, - struct.pack("B", 1) + bytes([0x1]) ) if world.options.castle_skip: patch.write_token( APTokenTypes.WRITE, 0x3AEAB0, - struct.pack("s", bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) + bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3]) ) patch.write_token( APTokenTypes.WRITE, 0x3AEC18, - struct.pack("s", bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) + bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1]) ) if world.options.skip_minecart: patch.write_token( APTokenTypes.WRITE, 0x3AC728, - struct.pack("s", bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) + bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1]) ) patch.write_token( APTokenTypes.WRITE, 0x3AC56C, - struct.pack("s", bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) + bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1]) ) if world.options.scale_stats: patch.write_token( APTokenTypes.WRITE, 0x1E9418, - struct.pack("B", 1) + bytes([0x1]) ) if world.options.scale_pow: patch.write_token( APTokenTypes.WRITE, 0x1E9419, - struct.pack("B", 1) + bytes([0x1]) ) if world.options.tattle_hp: patch.write_token( APTokenTypes.WRITE, 0xD00000, - struct.pack("B", 1) + bytes([0x1]) ) - if world.options.randomize_sounds: - self.randomize_sounds() - - if world.options.music_options == 1: - self.randomize_music() - if world.options.music_options == 2: patch.write_token( APTokenTypes.WRITE, 0x19B118, - struct.pack("s", bytes([0x0, 0x25])) + bytes([0x0, 0x25]) ) if world.options.randomize_backgrounds: @@ -207,17 +408,35 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: patch.write_token( APTokenTypes.WRITE, address + 3, - struct.pack("B", world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26)) + world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26) ) - if world.options.randomize_enemies != 0 or world.options.randomize_bosses != 0: - self.enemy_randomize() + for location_name in location_table.keys(): + if (world.options.skip_minecart and "Minecart" in location_name and "After" not in location_name) or ( + world.options.castle_skip and "Bowser" in location_name) or ( + world.options.disable_surf and "Surf Minigame" in location_name) or ( + world.options.harhalls_pants and "Harhall's" in location_name): + continue + if (world.options.chuckle_beans == 0 and "Digspot" in location_name) or ( + world.options.chuckle_beans == 1 and location_table[location_name] in hidden): + continue + if not world.options.coins and "Coin" in location_name: + continue + location = world.multiworld.get_location(location_name, world.player) + item = location.item + address = [address for address in all_locations if address.name == location.name] + item_inject(world, patch, location.address, address[0].itemType, item) + if "Shop" in location_name and "Coffee" not in location_name and item.player != world.player: + desc_inject(world, patch, location, item) swap_colors(world, patch, colors[world.options.mario_color], 0) swap_colors(world, patch, colors[world.options.luigi_color], 1) swap_pants(world, patch, colors[world.options.mario_pants], 0) swap_pants(world, patch, colors[world.options.luigi_pants], 1) + patch.write_file("token_data.bin", patch.get_token_binary()) + + def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") temp_io = io.BytesIO(temp) @@ -238,7 +457,7 @@ def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: patch.write_token( APTokenTypes.WRITE, c.location, - struct.pack("s", bytes([c.byte1, c.byte2])) + bytes([c.byte1, c.byte2]) ) def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): @@ -249,7 +468,7 @@ def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: i return if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): return - if color == "Vanilla": + if color == "Vanilla" or color == "Silhouette": return temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") temp_io = io.BytesIO(temp) @@ -269,25 +488,20 @@ def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: i patch.write_token( APTokenTypes.WRITE, c.location, - struct.pack("s", bytes([c.byte1, c.byte2])) + bytes([c.byte1, c.byte2]) ) -def item_inject(self, location: int, item_type: int, item: Item): - if item.player == self.player: +def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, item_type: int, item: Item): + if item.player == world.player: code = item_table[item.name].itemID else: code = 0x3F if item_type == 0: - self.stream.seek(location, 0) - self.stream.write(bytes([code])) - self.stream.seek(location - 6, 0) - b = self.stream.read(1) - if b[0] == 0x10 and self.world.options.hidden_visible: - self.stream.seek(location - 6, 0) - self.stream.write(bytes([0x0])) - if b[0] == 0x0 and self.world.options.blocks_invisible: - self.stream.seek(location - 6, 0) - self.stream.write(bytes([0x10])) + patch.write_token( + APTokenTypes.WRITE, + location, + bytes([code]) + ) elif item_type == 1: if code == 0x1D or code == 0x1E: code += 0xE @@ -298,15 +512,21 @@ def item_inject(self, location: int, item_type: int, item: Item): insert2 *= 0x10 insert //= 0x10 insert += 0x20 - self.stream.seek(location, 0) - self.stream.write(bytes([insert, insert2])) + patch.write_token( + APTokenTypes.WRITE, + location, + bytes([insert, insert2]) + ) elif item_type == 2: if code == 0x1D or code == 0x1E: code += 0xE if 0x20 <= code <= 0x26: code -= 0x4 - self.stream.seek(location, 0) - self.stream.write(bytes([code])) + patch.write_token( + APTokenTypes.WRITE, + location, + bytes([code]) + ) elif item_type == 3: if code == 0x1D or code == 0x1E: code += 0xE @@ -314,213 +534,48 @@ def item_inject(self, location: int, item_type: int, item: Item): code -= 0xA if 0x20 <= code <= 0x26: code -= 0xE - self.stream.seek(location, 0) - self.stream.write(bytes([code])) + patch.write_token( + APTokenTypes.WRITE, + location, + bytes([code]) + ) else: - self.stream.seek(location, 0) - self.stream.write(bytes([0x18])) - -def enemy_randomize(world: "MLSSWorld", patch: MLSSProcedurePatch): - enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.enemies - bosses = [pos for pos in Enemies.bosses if pos not in Enemies.bowsers] if self.world.options.castle_skip else Enemies.bosses - - if self.world.options.randomize_bosses == 1 or (self.world.options.randomize_bosses == 2 and self.world.options.randomize_enemies == 0): - raw = [] - for pos in bosses: - self.stream.seek(pos + 1) - raw += [self.stream.read(0x1F)] - self.random.shuffle(raw) - for pos in bosses: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) - - if self.world.options.randomize_enemies == 1: - raw = [] - for pos in enemies: - self.stream.seek(pos + 1) - raw += [self.stream.read(0x1F)] - if self.world.options.randomize_bosses == 2: - for pos in bosses: - self.stream.seek(pos + 1) - raw += [self.stream.read(0x1F)] - self.random.shuffle(raw) - for pos in enemies: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) - if self.world.options.randomize_bosses == 2: - for pos in bosses: - self.stream.seek(pos + 1) - self.stream.write(raw.pop()) - return - - enemies_raw = [] - groups = [] - - if self.world.options.randomize_enemies == 0: - return + patch.write_token( + APTokenTypes.WRITE, + location, + bytes([0x18]) + ) - if self.world.options.randomize_bosses == 2: - for pos in bosses: - self.stream.seek(pos + 1) - groups += [self.stream.read(0x1F)] - - for pos in enemies: - self.stream.seek(pos + 8) - for _ in range(6): - enemy = int.from_bytes(self.stream.read(1)) - if enemy > 0: - self.stream.seek(1, 1) - flag = int.from_bytes(self.stream.read(1)) - if flag == 0x7: - break - if flag in [0x0, 0x2, 0x4]: - if enemy not in Enemies.pestnut and enemy not in Enemies.flying: - print(f"adding: 0x{format(enemy, 'x')}") - enemies_raw += [enemy] - self.stream.seek(1, 1) +def desc_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: Location, item: Item): + index = -1 + for key, value in shop.items(): + if location.address in value: + if key == 0x3C05f0: + index = value.index(location.address) else: - self.stream.seek(3, 1) - - self.random.shuffle(enemies_raw) - chomp = False - for pos in enemies: - self.stream.seek(pos + 8) - - for _ in range(6): - enemy = int.from_bytes(self.stream.read(1)) - if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: - if enemy == 0x52: - chomp = True - self.stream.seek(1, 1) - flag = int.from_bytes(self.stream.read(1)) - if flag not in [0x0, 0x2, 0x4]: - self.stream.seek(1, 1) - continue - self.stream.seek(-3, 1) - self.stream.write(bytes([enemies_raw.pop()])) - self.stream.seek(1, 1) - self.stream.write(bytes([0x4])) - self.stream.seek(1, 1) + index = value.index(location.address) + 14 + + for key, value in badge.items(): + if index != -1: + break + if location.address in value: + if key == 0x3C0618: + index = value.index(location.address) + 24 else: - self.stream.seek(3, 1) - - self.stream.seek(pos + 1) - raw = self.stream.read(0x1F) - if chomp: - raw = raw[0:3] + bytes([0x67, 0xAB, 0x28, 0x08]) + raw[7:] - else: - raw = raw[0:3] + bytes([0xEE, 0x2C, 0x28, 0x08]) + raw[7:] - groups += [raw] - - self.random.shuffle(groups) - arr = enemies - if self.world.options.randomize_bosses == 2: - arr += bosses - - for pos in arr: - self.stream.seek(pos + 1) - self.stream.write(groups.pop()) - - - -def randomize_backgrounds(self): - all_enemies = Enemies.enemies + Enemies.bosses - for address in all_enemies: - self.stream.seek(address + 3, io.SEEK_SET) - self.stream.write(bytes([self.random.randint(0x0, 0x26)])) - -def randomize_sounds(self): - temp = pkgutil.get_data(__name__, "data/sounds.txt") - temp_io = io.BytesIO(temp) - fresh_pointers = [] - - for line in temp_io.readlines(): - fresh_pointers += [int(line.decode('utf-8').strip(), 16)] - pointers = list(fresh_pointers) - - self.world.random.shuffle(pointers) - self.stream.seek(0x21cc44, 0) - for i in range(354): - current_position = self.stream.tell() - value = int.from_bytes(self.stream.read(3), 'little') - if value in fresh_pointers: - self.stream.seek(current_position) - self.stream.write(pointers.pop().to_bytes(3, 'little')) - self.stream.seek(1, 1) - - - def disable_music(self): - self.stream.seek(0x19B118) - self.stream.write(bytes([0x0, 0x25])) - - def randomize_music(self): - songs = [] - self.stream.seek(0x21CB74) - while True: - if self.stream.tell() == 0x21CBD8: - self.stream.seek(4, io.SEEK_CUR) - continue - if self.stream.tell() == 0x21CC3C: - break - temp = self.stream.read(4) - songs.append(temp) - - self.random.shuffle(songs) - self.stream.seek(0x21CB74) - for i in range(len(songs) - 1, -1, -1): - if self.stream.tell() == 0x21CBD8: - self.stream.seek(4, io.SEEK_CUR) - continue - self.stream.write(songs[i]) - - def desc_inject(self, location: Location, item: Item): - index = -1 - for key, value in shop.items(): - if location.address in value: - if key == 0x3C05f0: - index = value.index(location.address) - else: - index = value.index(location.address) + 14 - - for key, value in badge.items(): - if index != -1: - break - if location.address in value: - if key == 0x3C0618: - index = value.index(location.address) + 24 - else: - index = value.index(location.address) + 41 + index = value.index(location.address) + 41 + + for key, value in pants.items(): + if index != -1: + break + if location.address in value: + if key == 0x3C0618: + index = value.index(location.address) + 48 + else: + index = value.index(location.address) + 66 - for key, value in pants.items(): - if index != -1: - break - if location.address in value: - if key ==0x3C0618: - index = value.index(location.address) + 48 - else: - index = value.index(location.address) + 66 - - dstring = f"{self.world.multiworld.player_name[item.player]}: {item.name}" - self.stream.seek(0xD11000 + (index * 0x40), 0) - self.stream.write(dstring.encode("UTF8")) - - - def close(self, path): - output_path = os.path.join(path, f"AP_{self.world.multiworld.seed_name}_P{self.player}_{self.world.multiworld.player_name[self.player]}.gba") - with open(output_path, 'wb') as outfile: - outfile.write(self.stream.getvalue()) - patch = MLSSDeltaPatch(os.path.splitext(output_path)[0] + ".apmlss", player=self.player, - player_name=self.world.multiworld.player_name[self.player], patched_path=output_path) - patch.write() - os.unlink(output_path) - self.stream.close() - - def apply_delta(self, b: bytes) -> bytes: - """ - Gets the patched ROM data generated from applying the ap-patch diff file to the provided ROM. - Which should contain all changed text banks and assembly code - """ - import pkgutil - patch_bytes = pkgutil.get_data(__name__, "data/basepatch.bsdiff") - patched_rom = bsdiff4.patch(b, patch_bytes) - return patched_rom + dstring = f"{world.multiworld.player_name[item.player]}: {item.name}" + patch.write_token( + APTokenTypes.WRITE, + 0xD11000 + (index * 0x40), + dstring.encode("UTF8") + ) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 17692a691885..e4bda965fabc 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -1,3 +1,5 @@ +import os +import pkgutil import typing import settings from BaseClasses import Tutorial, ItemClassification @@ -8,7 +10,7 @@ from .Names.LocationName import LocationName from .Client import MLSSClient from .Regions import create_regions, connect_regions -from .Rom import MLSSDeltaPatch, Rom +from .Rom import MLSSProcedurePatch, write_tokens from .Rules import set_rules @@ -51,7 +53,7 @@ class MLSSWorld(World): settings: typing.ClassVar[MLSSSettings] item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} - required_client_version = (0, 4, 4) + required_client_version = (0, 4, 5) excluded_locations = [] @@ -163,21 +165,9 @@ def create_item(self, name: str) -> MLSSItem: return MLSSItem(item.itemName, item.progression, item.code, self.player) def generate_output(self, output_directory: str) -> None: - rom = Rom(self) - - for location_name in location_table.keys(): - if (self.options.skip_minecart and "Minecart" in location_name and "After" not in location_name) or (self.options.castle_skip and "Bowser" in location_name) or (self.options.disable_surf and "Surf Minigame" in location_name) or (self.options.harhalls_pants and "Harhall's" in location_name): - continue - if (self.options.chuckle_beans == 0 and "Digspot" in location_name) or (self.options.chuckle_beans == 1 and location_table[location_name] in hidden): - continue - if not self.options.coins and "Coin" in location_name: - continue - location = self.multiworld.get_location(location_name, self.player) - item = location.item - address = [address for address in all_locations if address.name == location.name] - rom.item_inject(location.address, address[0].itemType, item) - if "Shop" in location_name and "Coffee" not in location_name and item.player != self.player: - rom.desc_inject(location, item) - rom.patch_options() - - rom.close(output_directory) + patch = MLSSProcedurePatch() + patch.write_file("base_patch.bsdiff4", pkgutil.get_data(__name__, "data/basepatch.bsdiff")) + write_tokens(self, patch) + rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}" + f"{patch.patch_file_ending}") + patch.write(rom_path) From f9df53ac8bf69d6c69408b1e0b7573cfff12cd61 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 16 Apr 2024 10:12:20 -0400 Subject: [PATCH 34/79] Docs Updated --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 4 ++-- worlds/mlss/docs/setup_en.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index a5e25715ee0d..a70a863fd36b 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -42,7 +42,7 @@ In total, this requires: Locations in which items can be found: - All Item Blocks and Coin Blocks -- All Chuckle Bean digspots +- All Chuckle Bean Digspots - All Shop items - All Pants and Badge shop items - All Espresso brews and rewards @@ -58,7 +58,7 @@ Items that can be shuffled: ## What does another world's item look like in Mario & Luigi: Superstar Saga? -Items will show up as a Golden Mushroom from boxes and digspots and "AP Item" in all textboxes. +Items will show up as a Golden Mushroom from boxes and Digspots and "AP Item" in all textboxes. Items in a shop from another player's world will display the player name and item name in addition to being displayed as an AP Item. ## When the player receives an item, what happens? diff --git a/worlds/mlss/docs/setup_en.md b/worlds/mlss/docs/setup_en.md index 3bf20c48ca48..f5023337dd00 100644 --- a/worlds/mlss/docs/setup_en.md +++ b/worlds/mlss/docs/setup_en.md @@ -9,9 +9,9 @@ As we are using Bizhawk, this guide is only applicable to Windows and Linux syst - Bizhawk: [Bizhawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - Version 2.9.1 is recommended. - Detailed installation instructions for Bizhawk can be found at the above link. - - Windows users must run the prereq installer first, which can also be found at the above link. + - Windows users must run the prerequisite installer first, which can also be found at the above link. - The built-in Bizhawk client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) -- A US Mario & Luigi: Superstar Saga ROM +- A US copy Mario & Luigi: Superstar Saga ## Optional Software From 0ed7abe6b9c887c4c88454317f49f2533e0434c6 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Tue, 16 Apr 2024 23:10:28 -0400 Subject: [PATCH 35/79] Update Rom.py --- worlds/mlss/Rom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 9d001e0a0751..a6c160f3f119 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -408,7 +408,7 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: patch.write_token( APTokenTypes.WRITE, address + 3, - world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26) + bytes([world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26)]) ) for location_name in location_table.keys(): From fc32c08067261508657fd2247c7b641fc6d3a53a Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 17 Apr 2024 08:32:25 -0400 Subject: [PATCH 36/79] Update setup_en.md --- worlds/mlss/docs/setup_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/docs/setup_en.md b/worlds/mlss/docs/setup_en.md index f5023337dd00..e74c942a0e74 100644 --- a/worlds/mlss/docs/setup_en.md +++ b/worlds/mlss/docs/setup_en.md @@ -11,7 +11,7 @@ As we are using Bizhawk, this guide is only applicable to Windows and Linux syst - Detailed installation instructions for Bizhawk can be found at the above link. - Windows users must run the prerequisite installer first, which can also be found at the above link. - The built-in Bizhawk client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) -- A US copy Mario & Luigi: Superstar Saga +- A US copy of Mario & Luigi: Superstar Saga ## Optional Software @@ -50,4 +50,4 @@ menu and select "Lua Console". Click the folder button or press Ctrl+O to open a Navigate to your Archipelago install folder and open `data/lua/connector_bizhawk_generic.lua`. To connect the client to the multiserver simply put `
:` on the textfield on top and press enter (if the -server uses password, type in the bottom textfield `/connect
: [password]`) \ No newline at end of file +server uses password, type in the bottom textfield `/connect
: [password]`) From 46aa71d0aa18ff29ce2307192b807f693e8136dc Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 18 Apr 2024 16:14:20 -0400 Subject: [PATCH 37/79] Update Rom.py --- worlds/mlss/Rom.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index a6c160f3f119..c88e754b53e0 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -143,6 +143,9 @@ def randomize_sounds(caller: APProcedurePatch, rom: bytes): @staticmethod def enemy_randomize(caller: APProcedurePatch, rom: bytes): options = json.loads(caller.get_file("options.json").decode("UTF-8")) + if options["randomize_bosses"] == 0 and options["randomize_enemies"] == 0: + return rom + enemies = [pos for pos in Enemies.enemies if pos not in Enemies.bowsers] if options["castle_skip"] else Enemies.enemies bosses = [pos for pos in Enemies.bosses if @@ -150,7 +153,7 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): stream = io.BytesIO(rom) random.seed(options["seed"] + options["player"]) - if options["randomize_bosses"] == 1 or (options["randomize_bosses"] == 2 and options["randomize_enemies"] == 0): + if (options["randomize_bosses"] == 1 or (options["randomize_bosses"] == 2) and options["randomize_enemies"] == 0): raw = [] for pos in bosses: stream.seek(pos + 1) @@ -201,7 +204,6 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): break if flag in [0x0, 0x2, 0x4]: if enemy not in Enemies.pestnut and enemy not in Enemies.flying: - print(f"adding: 0x{format(enemy, 'x')}") enemies_raw += [enemy] stream.seek(1, 1) else: From 6f5b015dd98ac32055466ec19b4ed730d03c793c Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 18 Apr 2024 17:56:38 -0400 Subject: [PATCH 38/79] Update Rules.py --- worlds/mlss/Rules.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 131ae8bad48f..b5ae8314f13e 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -122,8 +122,6 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canMini(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), lambda state: StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), - lambda state: StateLogic.thunder(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), lambda state: StateLogic.thunder(state, world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), From f0b1dedf0666f71ed3080b3d883699e40c6f4d2c Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 18 Apr 2024 20:05:36 -0400 Subject: [PATCH 39/79] Fix for APPP being broken on webhost --- worlds/mlss/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index e4bda965fabc..d714414c5841 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -165,7 +165,7 @@ def create_item(self, name: str) -> MLSSItem: return MLSSItem(item.itemName, item.progression, item.code, self.player) def generate_output(self, output_directory: str) -> None: - patch = MLSSProcedurePatch() + patch = MLSSProcedurePatch(player=self.player, player_name=self.multiworld.player_name[self.player]) patch.write_file("base_patch.bsdiff4", pkgutil.get_data(__name__, "data/basepatch.bsdiff")) write_tokens(self, patch) rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}" From 7e9ed1bcf84bbfae7fd992d9736fb453da43e90a Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Fri, 19 Apr 2024 16:31:09 -0400 Subject: [PATCH 40/79] Update Rom.py --- worlds/mlss/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index c88e754b53e0..ab4a0b9a1ddd 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -78,7 +78,7 @@ def randomize_music(caller: APProcedurePatch, rom: bytes): if stream.tell() == 0x21CBD8: stream.seek(4, 1) continue - if stream.tell() == 0x21CC3C: + if stream.tell() >= 0x21CC3C: break temp = stream.read(4) songs.append(temp) @@ -153,7 +153,7 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): stream = io.BytesIO(rom) random.seed(options["seed"] + options["player"]) - if (options["randomize_bosses"] == 1 or (options["randomize_bosses"] == 2) and options["randomize_enemies"] == 0): + if options["randomize_bosses"] == 1 or (options["randomize_bosses"] == 2) and options["randomize_enemies"] == 0: raw = [] for pos in bosses: stream.seek(pos + 1) From dc218f97796e55d4e9ec127283c0a50d498f75f7 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sat, 20 Apr 2024 12:31:47 -0400 Subject: [PATCH 41/79] Update Rom.py --- worlds/mlss/Rom.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index ab4a0b9a1ddd..739570abcb45 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -74,22 +74,20 @@ def randomize_music(caller: APProcedurePatch, rom: bytes): songs = [] stream.seek(0x21CB74) - while True: + for _ in range(50): if stream.tell() == 0x21CBD8: stream.seek(4, 1) continue - if stream.tell() >= 0x21CC3C: - break temp = stream.read(4) songs.append(temp) random.shuffle(songs) stream.seek(0x21CB74) - for i in range(len(songs) - 1, -1, -1): + for _ in range(50): if stream.tell() == 0x21CBD8: stream.seek(4, 1) continue - stream.write(songs[i]) + stream.write(songs.pop()) return stream.getvalue() @@ -180,13 +178,13 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): for pos in bosses: stream.seek(pos + 1) stream.write(raw.pop()) - return + return stream.getvalue() enemies_raw = [] groups = [] if options["randomize_enemies"] == 0: - return + return stream.getvalue() if options["randomize_bosses"] == 2: for pos in bosses: From 91fa7f156b2cf5482b79243a32dad3b2d6853df9 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sat, 20 Apr 2024 16:19:09 -0400 Subject: [PATCH 42/79] Location name fixes + pants color fixes --- worlds/mlss/Locations.py | 96 +++++++++++++++--------------- worlds/mlss/Names/LocationName.py | 86 +++++++++++++------------- worlds/mlss/Rom.py | 8 +-- worlds/mlss/data/basepatch.bsdiff | Bin 16020 -> 16084 bytes 4 files changed, 95 insertions(+), 95 deletions(-) diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 87c0731fc250..d70d0c1b0b5a 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -273,10 +273,10 @@ class MLSSLocation(Location): LocationData("Sewers Prison Room Coin Block", 0x39e01e, 0), LocationData("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", 0x39e455, 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("Jokes End North of Bridge Room Coin Block", 0x39e836, 0), + LocationData("S.S. Chuckola Storage Room Coin Block 1", 0x39e618, 0), + LocationData("S.S. Chuckola Storage Room Coin Block 2", 0x39e620, 0), + LocationData("Joke's End Second Floor West Room Coin Block", 0x39e771, 0), + LocationData("Joke's End North of Bridge Room Coin Block", 0x39e836, 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), @@ -313,7 +313,7 @@ class MLSSLocation(Location): 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 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), @@ -549,8 +549,8 @@ class MLSSLocation(Location): 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("Joke's End Pipe Digspot", 0x39e6c2, 0), + LocationData("Joke's 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), @@ -627,9 +627,9 @@ class MLSSLocation(Location): 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) + 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] = [ @@ -703,47 +703,47 @@ class MLSSLocation(Location): ] jokesEntrance: typing.List[LocationData] = [ - 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) + LocationData("Joke's End West of First Boiler Room Block 1", 0x39e6e5, 0), + LocationData("Joke's End West of First Boiler Room Block 2", 0x39e6ed, 0), + LocationData("Joke's End First Boiler Room Digspot 1", 0x39e6fa, 0), + LocationData("Joke's End First Boiler Room Digspot 2", 0x39e702, 0), + LocationData("Joke's End Second Floor West Room Block 1", 0x39e761, 0), + LocationData("Joke's End Second Floor West Room Block 2", 0x39e769, 0), + LocationData("Joke's End Second Floor West Room Block 3", 0x39e779, 0), + LocationData("Joke's End Second Floor West Room Block 4", 0x39e781, 0), + LocationData("Joke's End Mole Reward 1", 0x27788e, 1), + LocationData("Joke's End Mole Reward 2", 0x2778d2, 1) ] jokesMain: typing.List[LocationData] = [ - 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) + LocationData("Joke's End Furnace Room 1 Block 1", 0x39e70f, 0), + LocationData("Joke's End Furnace Room 1 Block 2", 0x39e717, 0), + LocationData("Joke's End Furnace Room 1 Block 3", 0x39e71f, 0), + LocationData("Joke's End Northeast of Boiler Room 1 Block", 0x39e732, 0), + LocationData("Joke's End Northeast of Boiler Room 3 Digspot", 0x39e73f, 0), + LocationData("Joke's End Northeast of Boiler Room 2 Block", 0x39e74c, 0), + LocationData("Joke's End Northeast of Boiler Room 2 Digspot", 0x39e754, 0), + LocationData("Joke's End Second Floor East Room Digspot", 0x39e794, 0), + LocationData("Joke's End Final Split up Room Digspot", 0x39e7a7, 0), + LocationData("Joke's End South of Bridge Room Block", 0x39e7b4, 0), + LocationData("Joke's End Solo Luigi Room 1 Block", 0x39e7c4, 0), + LocationData("Joke's End Solo Luigi Room 1 Digspot", 0x39e7cc, 0), + LocationData("Joke's End Solo Mario Final Room Block 1", 0x39e7d9, 0), + LocationData("Joke's End Solo Mario Final Room Block 2", 0x39e7e1, 0), + LocationData("Joke's End Solo Mario Final Room Block 3", 0x39e7e9, 0), + LocationData("Joke's End Solo Luigi Room 2 Digspot", 0x39e7fc, 0), + LocationData("Joke's End Solo Mario Room 1 Digspot", 0x39e809, 0), + LocationData("Joke's End Solo Mario Room 2 Block 1", 0x39e819, 0), + LocationData("Joke's End Solo Mario Room 2 Block 2", 0x39e821, 0), + LocationData("Joke's End Solo Mario Room 2 Block 3", 0x39e829, 0), + LocationData("Joke's End Second Boiler Room Digspot 1", 0x39e84f, 0), + LocationData("Joke's End Second Boiler Room Digspot 2", 0x39e857, 0), + LocationData("Joke's End North of Second Boiler Room Block 1", 0x39e864, 0), + LocationData("Joke's End North of Second Boiler Room Block 2", 0x39e86c, 0), + LocationData("Joke's End Before Jojora Room Block 1", 0x39e927, 0), + LocationData("Joke's End Before Jojora Room Block 2", 0x39e92f, 0), + LocationData("Joke's End Before Jojora Room Digspot", 0x39e937, 0), + LocationData("Joke's End Jojora Room Digspot", 0x39e944, 0) ] postJokes: typing.List[LocationData] = [ diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index c50d86d6265c..b68c86fcf5bb 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -301,54 +301,54 @@ class LocationName(): TeeheeValleySoloLuigiMazeRoom1Block = "Teehee Valley Solo Luigi Maze Room 1 Block" TeeheeValleyBeforeTrunkleDigspot = "Teehee Valley Before Trunkle Digspot" TeeheeValleyTrunkleRoomDigspot = "Teehee Valley Trunkle Room Digspot" - SSChuckolaStorageRoomBlock1 = "S.S Chuckola Storage Room Block 1" - SSChuckolaStorageRoomBlock2 = "S.S Chuckola Storage Room Block 2" + SSChuckolaStorageRoomBlock1 = "S.S. Chuckola Storage Room Block 1" + SSChuckolaStorageRoomBlock2 = "S.S. Chuckola Storage Room Block 2" LittleFungitownEmbassyRoomBlock = "Little Fungitown Embassy Room Block" LittleFungitownEntranceRoomBlock = "Little Fungitown Entrance Room Block" - JokesEndPipeDigspot = "Jokes End Pipe Digspot" - JokesEndStaircaseDigspot = "Jokes End Staircase Digspot" - JokesEndWestOfFirstBoilerRoomBlock1 = "Jokes End West Of First Boiler Room Block 1" - JokesEndWestOfFirstBoilerRoomBlock2 = "Jokes End West Of First Boiler Room Block 2" - JokesEndFirstBoilerRoomDigspot1 = "Jokes End First Boiler Room Digspot 1" - JokesEndFirstBoilerRoomDigspot2 = "Jokes End First Boiler Room Digspot 2" - JokesEndFurnaceRoom1Block1 = "Jokes End Furnace Room 1 Block 1" - JokesEndFurnaceRoom1Block2 = "Jokes End Furnace Room 1 Block 2" - JokesEndFurnaceRoom1Block3 = "Jokes End Furnace Room 1 Block 3" - JokesEndNortheastOfBoilerRoom1Block = "Jokes End Northeast Of Boiler Room 1 Block" - JokesEndNortheastOfBoilerRoom3Digspot = "Jokes End Northeast Of Boiler Room 3 Digspot" - JokesEndNortheastOfBoilerRoom2Block1 = "Jokes End Northeast Of Boiler Room 2 Block" - JokesEndNortheastOfBoilerRoom2Block2 = "Jokes End Northeast Of Boiler Room 2 Digspot" - JokesEndSecondFloorWestRoomBlock1 = "Jokes End Second Floor West Room Block 1" - JokesEndSecondFloorWestRoomBlock2 = "Jokes End Second Floor West Room Block 2" - JokesEndSecondFloorWestRoomBlock3 = "Jokes End Second Floor West Room Block 3" - JokesEndSecondFloorWestRoomBlock4 = "Jokes End Second Floor West Room Block 4" - JokesEndSecondFloorEastRoomDigspot = "Jokes End Second Floor East Room Digspot" - JokesEndFinalSplitUpRoomDigspot = "Jokes End Final Split Up Room Digspot" - JokesEndSouthOfBridgeRoomBlock = "Jokes End South Of Bridge Room Block" - JokesEndSoloLuigiRoom1Block = "Jokes End Solo Luigi Room 1 Block" - JokesEndSoloLuigiRoom1Digspot = "Jokes End Solo Luigi Room 1 Digspot" - JokesEndSoloMarioFinalRoomBlock1 = "Jokes End Solo Mario Final Room Block 1" - JokesEndSoloMarioFinalRoomBlock2 = "Jokes End Solo Mario Final Room Block 2" - JokesEndSoloMarioFinalRoomBlock3 = "Jokes End Solo Mario Final Room Block 3" - JokesEndSoloLuigiRoom2Digspot = "Jokes End Solo Luigi Room 2 Digspot" - JokesEndSoloMarioRoom1Digspot = "Jokes End Solo Mario Room 1 Digspot" - JokesEndSoloMarioRoom2Block1 = "Jokes End Solo Mario Room 2 Block 1" - JokesEndSoloMarioRoom2Block2 = "Jokes End Solo Mario Room 2 Block 2" - JokesEndSoloMarioRoom2Block3 = "Jokes End Solo Mario Room 2 Block 3" - JokesEndSecondBoilerRoomDigspot1 = "Jokes End Second Boiler Room Digspot 1" - JokesEndSecondBoilerRoomDigspot2 = "Jokes End Second Boiler Room Digspot 2" - JokesEndNorthOfSecondBoilerRoomBlock1 = "Jokes End North Of Second Boiler Room Block 1" - JokesEndNorthOfSecondBoilerRoomBlock2 = "Jokes End North Of Second Boiler Room Block 2" + JokesEndPipeDigspot = "Joke's End Pipe Digspot" + JokesEndStaircaseDigspot = "Joke's End Staircase Digspot" + JokesEndWestOfFirstBoilerRoomBlock1 = "Joke's End West Of First Boiler Room Block 1" + JokesEndWestOfFirstBoilerRoomBlock2 = "Joke's End West Of First Boiler Room Block 2" + JokesEndFirstBoilerRoomDigspot1 = "Joke's End First Boiler Room Digspot 1" + JokesEndFirstBoilerRoomDigspot2 = "Joke's End First Boiler Room Digspot 2" + JokesEndFurnaceRoom1Block1 = "Joke's End Furnace Room 1 Block 1" + JokesEndFurnaceRoom1Block2 = "Joke's End Furnace Room 1 Block 2" + JokesEndFurnaceRoom1Block3 = "Joke's End Furnace Room 1 Block 3" + JokesEndNortheastOfBoilerRoom1Block = "Joke's End Northeast Of Boiler Room 1 Block" + JokesEndNortheastOfBoilerRoom3Digspot = "Joke's End Northeast Of Boiler Room 3 Digspot" + JokesEndNortheastOfBoilerRoom2Block1 = "Joke's End Northeast Of Boiler Room 2 Block" + JokesEndNortheastOfBoilerRoom2Block2 = "Joke's End Northeast Of Boiler Room 2 Digspot" + JokesEndSecondFloorWestRoomBlock1 = "Joke's End Second Floor West Room Block 1" + JokesEndSecondFloorWestRoomBlock2 = "Joke's End Second Floor West Room Block 2" + JokesEndSecondFloorWestRoomBlock3 = "Joke's End Second Floor West Room Block 3" + JokesEndSecondFloorWestRoomBlock4 = "Joke's End Second Floor West Room Block 4" + JokesEndSecondFloorEastRoomDigspot = "Joke's End Second Floor East Room Digspot" + JokesEndFinalSplitUpRoomDigspot = "Joke's End Final Split Up Room Digspot" + JokesEndSouthOfBridgeRoomBlock = "Joke's End South Of Bridge Room Block" + JokesEndSoloLuigiRoom1Block = "Joke's End Solo Luigi Room 1 Block" + JokesEndSoloLuigiRoom1Digspot = "Joke's End Solo Luigi Room 1 Digspot" + JokesEndSoloMarioFinalRoomBlock1 = "Joke's End Solo Mario Final Room Block 1" + JokesEndSoloMarioFinalRoomBlock2 = "Joke's End Solo Mario Final Room Block 2" + JokesEndSoloMarioFinalRoomBlock3 = "Joke's End Solo Mario Final Room Block 3" + JokesEndSoloLuigiRoom2Digspot = "Joke's End Solo Luigi Room 2 Digspot" + JokesEndSoloMarioRoom1Digspot = "Joke's End Solo Mario Room 1 Digspot" + JokesEndSoloMarioRoom2Block1 = "Joke's End Solo Mario Room 2 Block 1" + JokesEndSoloMarioRoom2Block2 = "Joke's End Solo Mario Room 2 Block 2" + JokesEndSoloMarioRoom2Block3 = "Joke's End Solo Mario Room 2 Block 3" + JokesEndSecondBoilerRoomDigspot1 = "Joke's End Second Boiler Room Digspot 1" + JokesEndSecondBoilerRoomDigspot2 = "Joke's End Second Boiler Room Digspot 2" + JokesEndNorthOfSecondBoilerRoomBlock1 = "Joke's End North Of Second Boiler Room Block 1" + JokesEndNorthOfSecondBoilerRoomBlock2 = "Joke's End North Of Second Boiler Room Block 2" WinkleAreaColloseumDigspot = "Winkle Area Colloseum Digspot" HoohooMountainFountainRoom2Block = "Hoohoo Mountain Fountain Room 2 Block" HoohooMountainFountainRoom2Digspot = "Hoohoo Mountain Fountain Room 2 Digspot" HoohooMountainPastHoohoorosConnectorRoomDigspot1 = "Hoohoo Mountain Past Hoohooros Connector Room Digspot 1" HoohooMountainPastHoohoorosConnectorRoomBlock = "Hoohoo Mountain Past Hoohooros Connector Room Block" HoohooMountainPastHoohoorosConnectorRoomDigspot2 = "Hoohoo Mountain Past Hoohooros Connector Room Digspot 2" - JokesEndBeforeJojoraRoomBlock1 = "Jokes End Before Jojora Room Block 1" - JokesEndBeforeJojoraRoomBlock2 = "Jokes End Before Jojora Room Block 2" - JokesEndBeforeJojoraRoomDigspot = "Jokes End Before Jojora Room Digspot" - JokesEndJojoraRoomDigspot = "Jokes End Jojora Room Digspot" + JokesEndBeforeJojoraRoomBlock1 = "Joke's End Before Jojora Room Block 1" + JokesEndBeforeJojoraRoomBlock2 = "Joke's End Before Jojora Room Block 2" + JokesEndBeforeJojoraRoomDigspot = "Joke's End Before Jojora Room Digspot" + JokesEndJojoraRoomDigspot = "Joke's End Jojora Room Digspot" BeanbeanOutskirtsBeforeHarhallDigspot1 = "Beanbean Outskirts Before Harhall Digspot 1" BeanbeanOutskirtsBeforeHarhallDigspot2 = "Beanbean Outskirts Before Harhall Digspot 2" BeanbeanOutskirtsBroochGuardsRoomDigspot1 = "Beanbean Outskirts Brooch Guards Room Digspot 1" @@ -372,8 +372,8 @@ class LocationName(): BeanbeanOutskirtsSoloLuigiCaveMole = "Beanbean Outskirts Solo Luigi Cave Mole" BeanbeanOutskirtsFarmRoomMoleReward1 = "Beanbean Outskirts Farm Room Mole Reward 1" BeanbeanOutskirtsFarmRoomMoleReward2 = "Beanbean Outskirts Farm Room Mole Reward 2" - JokesEndMoleReward1 = "Jokes End Mole Reward 1" - JokesEndMoleReward2 = "Jokes End Mole Reward 2" + JokesEndMoleReward1 = "Joke's End Mole Reward 1" + JokesEndMoleReward2 = "Joke's End Mole Reward 2" NorthOceanWhirlpoolMole = "North Ocean Whirlpool Mole" BeanbeanOutskirtsNESoloMarioMole1 = "Beanbean Outskirts NE Solo Mario Mole 1" HoohooVillageHammers = "Hoohoo Village Hammers" @@ -384,7 +384,7 @@ class LocationName(): ChucklehuckWoodsRedChuckolaFruit = "Chucklehuck Woods Red Chuckola Fruit" ChucklehuckWoodsWhiteChuckolaFruit = "Chucklehuck Woods White Chuckola Fruit" ChucklehuckWoodsPurpleChuckolaFruit = "Chucklehuck Woods Purple Chuckola Fruit" - SSChuckolaMembershipCard = "S.S Chuckola Membership Card" + SSChuckolaMembershipCard = "S.S. Chuckola Membership Card" WinkleAreaWinkleCard = "Winkle Area Winkle Card" BeanbeanCastlePeachsExtraDress = "Beanbean Castle Peach's Extra Dress" BeanbeanCastleFakeBeastar = "Beanbean Castle Fake Beanstar" diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 739570abcb45..39f8ea66666d 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -431,8 +431,8 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: swap_colors(world, patch, colors[world.options.mario_color], 0) swap_colors(world, patch, colors[world.options.luigi_color], 1) - swap_pants(world, patch, colors[world.options.mario_pants], 0) - swap_pants(world, patch, colors[world.options.luigi_pants], 1) + swap_pants(world, patch, cpants[world.options.mario_pants], 0) + swap_pants(world, patch, cpants[world.options.luigi_pants], 1) patch.write_file("token_data.bin", patch.get_token_binary()) @@ -468,7 +468,7 @@ def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: i return if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): return - if color == "Vanilla" or color == "Silhouette": + if color == "Vanilla": return temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") temp_io = io.BytesIO(temp) @@ -476,7 +476,7 @@ def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: i for lines in temp_io.readlines(): arr = lines.decode('utf-8').strip().split(',') - if color != "Chaos" and color != "TrueChaos": + if color != "Chaos": color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) else: color_arr.append( diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 0bced2b5061dc3170525ab523669d67c2ba5dfb4..1b8bdedd6b1e048c8f6bbef4be87eadacdf2ef3d 100644 GIT binary patch literal 16084 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 literal 16020 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 Date: Sat, 20 Apr 2024 16:28:35 -0400 Subject: [PATCH 43/79] Update Rules.py --- worlds/mlss/Rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index b5ae8314f13e..cefd568f6149 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -287,11 +287,11 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.rose(state, world.player)) add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), lambda state: StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 1", world.player), + add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), lambda state: StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) - add_rule(world.multiworld.get_location("S.S Chuckola Storage Room Coin Block 2", world.player), + add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) add_rule(world.multiworld.get_location("Jokes End Second Floor West Room Coin Block", world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) From f0d109e60359bd64fd0aa54d99f4c8f9f33489a7 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sat, 20 Apr 2024 21:36:35 -0400 Subject: [PATCH 44/79] Fix for ultra hammer cutscene --- worlds/mlss/Rules.py | 6 +++--- worlds/mlss/data/basepatch.bsdiff | Bin 16084 -> 16083 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index cefd568f6149..d219f4b6e3fc 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -293,15 +293,15 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location("Jokes End Second Floor West Room Coin Block", world.player), + add_rule(world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and (StateLogic.membership(state, world.player) or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) - add_rule(world.multiworld.get_location("Jokes End North of Bridge Room Coin Block", world.player), + add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and StateLogic.canDig(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.canMini(state, world.player))) if not world.options.difficult_logic: - add_rule(world.multiworld.get_location("Jokes End North of Bridge Room Coin Block", world.player), + add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: StateLogic.canCrash(state, world.player)) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 1b8bdedd6b1e048c8f6bbef4be87eadacdf2ef3d..955972512117eb00e6dc3e9bbc95dbd24774caec 100644 GIT binary patch delta 9088 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 From 7176e53d6b0f1dd7bb9a53a42c6c872d14cdab1c Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sat, 20 Apr 2024 23:40:57 -0400 Subject: [PATCH 45/79] Fixed compat. issues with python ver. 3.8 --- worlds/mlss/Client.py | 5 +++-- worlds/mlss/Locations.py | 16 ++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index a1f853d2eae1..a24737869aab 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -1,3 +1,4 @@ +import typing from typing import TYPE_CHECKING, Optional, Set import struct @@ -23,9 +24,9 @@ class MLSSClient(BizHawkClient): goal_flag: int rom_slot_name: Optional[str] eCount: int - eUsed: [int] + eUsed: [] player_name: Optional[str] - checked_flags: dict[int, list] = {} + checked_flags: typing.Dict[int, list] = {} def __init__(self) -> None: super().__init__() diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index d70d0c1b0b5a..1a1cef5cb6a1 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -17,7 +17,7 @@ class MLSSLocation(Location): game: str = "Mario & Luigi Superstar Saga" -hidden: typing.List[int] = [ +hidden = [ 0x39D8C5, 0x39D90F, 0x39D9E9, @@ -774,7 +774,7 @@ class MLSSLocation(Location): LocationData("Oho Oasis Thunderhand", 0x1e9409, 2) ] -nonBlock: list[(int, int, int)] = [ +nonBlock = [ (0x434B, 0x1, 0x243844), # Farm Mole 1 (0x434B, 0x1, 0x24387d), # Farm Mole 2 (0x4373, 0x8, 0x2779C8), # Simulblock Mole @@ -856,7 +856,7 @@ class MLSSLocation(Location): (0x433D, 0x10, 0xDA0008) # Birdo ] -roomException: dict[int, list[int]] = { +roomException = { 0x1e9437: [0xFE, 0xFF, 0x100], 0x24ed74: [0x94, 0x95, 0x96, 0x99], 0x250621: [0x94, 0x95, 0x96, 0x99], @@ -867,7 +867,7 @@ class MLSSLocation(Location): 0x2578e7: [0x79, 0x192, 0x193] } -beanstones: dict[int, int] = { +beanstones = { 0x229345: 0x39dc72, # Bean fruit 1 - 6 0x22954D: 0x39dcb4, 0x228A17: 0x39dbd1, @@ -886,7 +886,7 @@ class MLSSLocation(Location): 0x25181F: 0x39d78b } -roomCount: dict[int, int] = { +roomCount = { 0x15: 2, 0x18: 4, 0x19: 3, @@ -1091,17 +1091,17 @@ class MLSSLocation(Location): 0x1F7: 1, } -shop: dict[int, []] = { +shop = { 0x3c05f0: [0x3c05f0, 0x3c05f2, 0x3c05f4, 0x3c05f8, 0x3c05fc, 0x3c05fe, 0x3c0600, 0x3c0602, 0x3c0606, 0x3c0608, 0x3c060c, 0x3c060e, 0x3c0610, 0x3c0614], 0x3c066a: [0x3c066a, 0x3c066c, 0x3c066e, 0x3c0670, 0x3c0672, 0x3c0674, 0x3c0676, 0x3c0678, 0x3c067c, 0x3c0680] } -badge: dict[int, []] = { +badge = { 0x3c0618: [0x3c0618, 0x3c061a, 0x3c0624, 0x3c0626, 0x3c0628, 0x3c0632, 0x3c0634, 0x3c0636, 0x3c0640, 0x3c0642, 0x3c0644, 0x3c064e, 0x3c0650, 0x3c0652, 0x3c065c, 0x3c065e, 0x3c0660], 0x3c0684: [0x3c0684, 0x3c0686, 0x3c0688, 0x3c0692, 0x3c0694, 0x3c069c, 0x3c069e] } -pants: dict[int, []] = { +pants = { 0x3c0618: [0x3c061C, 0x3c061E, 0x3c0620, 0x3c062a, 0x3c062c, 0x3c062e, 0x3c0638, 0x3c063a, 0x3c063c, 0x3c0646, 0x3c0648, 0x3c064a, 0x3c0654, 0x3c0656, 0x3c0658, 0x3c0662, 0x3c0664, 0x3c0666], 0x3c0684: [0x3c068a, 0x3c068c, 0x3c068e, 0x3c0696, 0x3c0698, 0x3c06a0, 0x3c06a2] } From 72ad9ea5c5959a3725ac7a8fee36e43776f74fed Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sun, 21 Apr 2024 23:02:16 -0400 Subject: [PATCH 46/79] Updated hidden block yaml option --- worlds/mlss/Options.py | 18 +++++++----------- worlds/mlss/Rom.py | 9 ++++----- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 67d9ce3a21a9..db75fcf53964 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -194,18 +194,15 @@ class RandomizeBackgrounds(Toggle): display_name = "Randomize Battle Backgrounds" -class HiddenVisible(Toggle): +class HiddenVisible(Choice): """ This makes any hidden blocks in the game into regular item blocks. """ - display_name = "Hidden Blocks Visible" - - -class BlocksInvisible(Toggle): - """ - Turns any item blocks in the game into hidden blocks. - """ - display_name = "Item Blocks Invisible" + display_name = "Item Block Visibility" + option_disabled = 0 + option_hidden_visible = 1 + option_blocks_invisible = 2 + default = 0 class Coins(Toggle): @@ -255,8 +252,7 @@ class MLSSOptions(PerGameCommonOptions): skip_minecart: SkipMinecart disable_surf: DisableSurf harhalls_pants: HarhallsPants - hidden_visible: HiddenVisible - blocks_invisible: BlocksInvisible + block_visibility: HiddenVisible chuckle_beans: ChuckleBeans music_options: MusicOptions randomize_sounds: RandomSounds diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 39f8ea66666d..0ec9de349d8d 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -94,17 +94,17 @@ def randomize_music(caller: APProcedurePatch, rom: bytes): @staticmethod def hidden_visible(caller: APProcedurePatch, rom: bytes): options = json.loads(caller.get_file("options.json").decode("UTF-8")) - if options["hidden_visible"] == 0 and options["blocks_invisible"] == 0: + if options["block_visibility"] == 0: return rom stream = io.BytesIO(rom) for location in all_locations: stream.seek(location.id - 6) b = stream.read(1) - if b[0] == 0x10 and options["hidden_visible"]: + if b[0] == 0x10 and options["block_visibility"] == 1: stream.seek(location.id - 6) stream.write(bytes([0x0])) - if b[0] == 0x0 and options["blocks_invisible"]: + if b[0] == 0x0 and options["block_visibility"] == 2: stream.seek(location.id - 6) stream.write(bytes([0x10])) @@ -278,8 +278,7 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: "castle_skip": world.options.castle_skip.value, "randomize_sounds": world.options.randomize_sounds.value, "music_options": world.options.music_options.value, - "hidden_visible": world.options.hidden_visible.value, - "blocks_invisible": world.options.blocks_invisible.value, + "block_visibility": world.options.block_visibility.value, "seed": world.multiworld.seed, "player": world.player } From 7d84c7f2dec57543ddb9aa9d2a943d063a79be74 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Apr 2024 16:17:10 -0400 Subject: [PATCH 47/79] pre-v1.5 --- worlds/mlss/Client.py | 2 +- worlds/mlss/Locations.py | 31 +++++++++++++++---------------- worlds/mlss/Names/LocationName.py | 10 +++++----- worlds/mlss/Options.py | 19 ++++++++++++------- worlds/mlss/Regions.py | 6 +++--- worlds/mlss/Rom.py | 6 +++--- 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index a24737869aab..32823755a8ac 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -171,7 +171,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: "key": f"mlss_flag{location - 0xD9FFFF}_{ctx.team}_{ctx.slot}", "default": 0, "want_reply": False, - "operations": [{"operation": "replace", "value": 1}] + "operations": [{"operation": "or", "value": 1 << (location - 0xDA0000)}] }]) continue if location in roomException: diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 1a1cef5cb6a1..2a86bd970069 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -452,14 +452,14 @@ class MLSSLocation(Location): ] kidnappedFlag: typing.List[LocationData] = [ - 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) + LocationData("Badge Shop Enter Fungitown Flag 1", 0x3c0640, 2), + LocationData("Badge Shop Enter Fungitown Flag 2", 0x3c0642, 2), + LocationData("Badge Shop Enter Fungitown Flag 3", 0x3c0644, 2), + LocationData("Pants Shop Enter Fungitown Flag 1", 0x3c0646, 2), + LocationData("Pants Shop Enter Fungitown Flag 2", 0x3c0648, 2), + LocationData("Pants Shop Enter Fungitown Flag 3", 0x3c064a, 2), + LocationData("Shop Enter Fungitown Flag 1", 0x3c0606, 3), + LocationData("Shop Enter Fungitown Flag 2", 0x3c0608, 3) ] beanstarFlag: typing.List[LocationData] = [ @@ -846,14 +846,13 @@ class MLSSLocation(Location): (0x4345, 0x4, 0x1e9409), # Thunder Hand (0x42FF, 0x80, 0x251071), # Beanstone Reward (0x42F9, 0x2, 0xDA0000), # Dragohoho - (0x4300, 0x40, 0xDA0001), # Queen Bean - (0x433D, 0x1, 0xDA0002), # Chuckolator - (0x43FC, 0x80, 0xDA0003), # Popple 2 - (0x433D, 0x2, 0xDA0004), # Mom Piranha - (0x4342, 0x10, 0xDA0005), # Fungitowm - (0x433D, 0x8, 0xDA0006), # Beanstar - (0x430F, 0x40, 0xDA0007), # Jojora - (0x433D, 0x10, 0xDA0008) # Birdo + (0x433D, 0x1, 0xDA0001), # Chuckolator + (0x43FC, 0x80, 0xDA0002), # Popple 2 + (0x433D, 0x2, 0xDA0003), # Mom Piranha + (0x4342, 0x10, 0xDA0004), # Fungitowm + (0x433D, 0x8, 0xDA0005), # Beanstar + (0x430F, 0x40, 0xDA0006), # Jojora + (0x433D, 0x10, 0xDA0007) # Birdo ] roomException = { diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index b68c86fcf5bb..faef8f162b2a 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -438,8 +438,8 @@ class LocationName(): ShopMomPiranhaFlag2 = "Shop Mom Piranha Flag 2" ShopMomPiranhaFlag3 = "Shop Mom Piranha Flag 3" ShopMomPiranhaFlag4 = "Shop Mom Piranha Flag 4" - ShopPeachKidnappedFlag1 = "Shop Peach Kidnapped Flag 1" - ShopPeachKidnappedFlag2 = "Shop Peach Kidnapped Flag 2" + ShopPeachKidnappedFlag1 = "Shop Enter Fungitown Flag 1" + ShopPeachKidnappedFlag2 = "Shop Enter Fungitown Flag 2" FungitownShopStartingFlag1 = "Fungitown Shop Starting Flag 1" FungitownShopStartingFlag2 = "Fungitown Shop Starting Flag 2" FungitownShopStartingFlag3 = "Fungitown Shop Starting Flag 3" @@ -477,9 +477,9 @@ class LocationName(): PantsShopMomPiranhaFlag1 = "Pants Shop Mom Piranha Flag 1" PantsShopMomPiranhaFlag2 = "Pants Shop Mom Piranha Flag 2" PantsShopMomPiranhaFlag3 = "Pants Shop Mom Piranha Flag 3" - PantsShopPeachKidnappedFlag1 = "Pants Shop Peach Kidnapped Flag 1" - PantsShopPeachKidnappedFlag2 = "Pants Shop Peach Kidnapped Flag 2" - PantsShopPeachKidnappedFlag3 = "Pants Shop Peach Kidnapped Flag 3" + PantsShopPeachKidnappedFlag1 = "Pants Shop Enter Fungitown Flag 1" + PantsShopPeachKidnappedFlag2 = "Pants Shop Enter Fungitown Flag 2" + PantsShopPeachKidnappedFlag3 = "Pants Shop Enter Fungitown Flag 3" PantsShopBeanstarCompleteFlag1 = "Pants Shop Beanstar Complete Flag 1" PantsShopBeanstarCompleteFlag2 = "Pants Shop Beanstar Complete Flag 2" PantsShopBeanstarCompleteFlag3 = "Pants Shop Beanstar Complete Flag 3" diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index db75fcf53964..11af5e5e3f7d 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -1,4 +1,4 @@ -from Options import Choice, Toggle, StartInventoryPool, PerGameCommonOptions +from Options import Choice, Toggle, StartInventoryPool, PerGameCommonOptions, Range from dataclasses import dataclass @@ -168,16 +168,21 @@ class RandomizeBosses(Choice): class ScaleStats(Toggle): """ - This scales enemy HP and XP according to the area of the game you are in. + This scales enemy HP, POW, DEF, and XP to vanilla values. + This setting is intended for use with the Enemy Randomizer and is Recommended to turn on. + If you are not using the Enemy Randomizer the effects will be minimal. """ display_name = "Scale Enemy Stats" - -class ScalePow(Toggle): +class XPMultiplier(Range): """ - This scales enemy POW according to the area of the game you are in. + This will multiply any XP you receive in battle by the chosen multiplier. + """ - display_name = "Scale Enemy POW" + display_name = "XP Multiplier" + range_start = 1 + range_end = 4 + default = 1 class TattleHp(Toggle): @@ -260,7 +265,7 @@ class MLSSOptions(PerGameCommonOptions): randomize_bosses: RandomizeBosses randomize_backgrounds: RandomizeBackgrounds scale_stats: ScaleStats - scale_pow: ScalePow + xp_multiplier: XPMultiplier tattle_hp: TattleHp mario_color: MarioColor luigi_color: LuigiColor diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 8ca003f63670..badbac4f3c78 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -21,7 +21,7 @@ def create_regions(world: "MLSSWorld", excluded: typing.List[str]): create_region(world, "Shop Starting Flag", startingFlag, excluded) create_region(world, "Shop Chuckolator Flag", chuckolatorFlag, excluded) create_region(world, "Shop Piranha Flag", piranhaFlag, excluded) - create_region(world, "Shop Peach Kidnapped Flag", kidnappedFlag, excluded) + create_region(world, "Shop Enter Fungitown Flag", kidnappedFlag, excluded) create_region(world, "Shop Beanstar Complete Flag", beanstarFlag, excluded) create_region(world, "Shop Birdo Flag", birdoFlag, excluded) create_region(world, "Surfable", surfable, excluded) @@ -69,8 +69,8 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, world.player) or state.can_reach("FungitownBirdo", "Region", world.player)) connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) and (StateLogic.thunder(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.hammers(state, world.player))) or state.can_reach("Shop Piranha Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Peach Kidnapped Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Peach Kidnapped Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Enter Fungitown Flag", "Region", world.player)) + connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 0ec9de349d8d..b2918716deca 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -376,14 +376,14 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: if world.options.scale_stats: patch.write_token( APTokenTypes.WRITE, - 0x1E9418, + 0xD00002, bytes([0x1]) ) - if world.options.scale_pow: + if world.options.xp_multiplier: patch.write_token( APTokenTypes.WRITE, - 0x1E9419, + 0xD00003, bytes([0x1]) ) From 84179f17fb63c992015ef2f46dd03c15afa46e2b Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Apr 2024 16:18:41 -0400 Subject: [PATCH 48/79] Update Client.py --- worlds/mlss/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 32823755a8ac..426d56395e6e 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -168,7 +168,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if location >= 0xDA0000: await ctx.send_msgs([{ "cmd": "Set", - "key": f"mlss_flag{location - 0xD9FFFF}_{ctx.team}_{ctx.slot}", + "key": f"mlss_flag_{ctx.team}_{ctx.slot}", "default": 0, "want_reply": False, "operations": [{"operation": "or", "value": 1 << (location - 0xDA0000)}] From 07476c42a7c170d84e09a95beb029c27004233f9 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Apr 2024 20:29:16 -0400 Subject: [PATCH 49/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 16083 -> 17163 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 955972512117eb00e6dc3e9bbc95dbd24774caec..0bfb0f7d2400ebb31751df9873a577ab3fb37144 100644 GIT binary patch literal 17163 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

2Nm2aWu{$@>56Nbr9K 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 G!kb8Iy{z2; literal 16083 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 From 248ec56b37702a11f2a6618790cd0f021bdf036e Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Apr 2024 20:59:48 -0400 Subject: [PATCH 50/79] v1.5 --- worlds/mlss/Rom.py | 2 +- worlds/mlss/data/basepatch.bsdiff | Bin 17163 -> 17230 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index b2918716deca..138a36720e69 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -384,7 +384,7 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: patch.write_token( APTokenTypes.WRITE, 0xD00003, - bytes([0x1]) + bytes([world.options.xp_multiplier.value]) ) if world.options.tattle_hp: diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 0bfb0f7d2400ebb31751df9873a577ab3fb37144..7c73259ba1163aafb70d144f462ee5376c6b160d 100644 GIT binary patch literal 17230 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 )K5bt* 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

2Nm2aWu{$@>56Nbr9K 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 G!kb8Iy{z2; From 7f812d6d4e888e3d4d852792f7c95be938dc5631 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 22 Apr 2024 23:14:45 -0400 Subject: [PATCH 51/79] Update XP multiplier to have a minimum of 0 --- worlds/mlss/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 11af5e5e3f7d..50a51f1a7a72 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -180,7 +180,7 @@ class XPMultiplier(Range): """ display_name = "XP Multiplier" - range_start = 1 + range_start = 0 range_end = 4 default = 1 From d688ffa23b6ed30cf7d8b3e2c5fe86046acadb2f Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 25 Apr 2024 22:12:33 -0400 Subject: [PATCH 52/79] Update 'Beanfruit' to 'Bean Fruit' --- worlds/mlss/Items.py | 14 +++++++------- worlds/mlss/StateLogic.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index 833724f8be56..0baae479d3db 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -59,13 +59,13 @@ class MLSSItem(Item): ItemData(77771041, "Fake Beanstar", ItemClassification.progression, 0x43), ItemData(77771042, "Red Pearl Bean", ItemClassification.progression, 0x45), ItemData(77771043, "Green Pearl Bean", ItemClassification.progression, 0x46), - ItemData(77771044, "Beanfruit 1", ItemClassification.progression_skip_balancing, 0x47), - ItemData(77771045, "Beanfruit 2", ItemClassification.progression_skip_balancing, 0x50), - ItemData(77771046, "Beanfruit 3", ItemClassification.progression_skip_balancing, 0x51), - ItemData(77771047, "Beanfruit 4", ItemClassification.progression_skip_balancing, 0x52), - ItemData(77771048, "Beanfruit 5", ItemClassification.progression_skip_balancing, 0x53), - ItemData(77771049, "Beanfruit 6", ItemClassification.progression_skip_balancing, 0x54), - ItemData(77771050, "Beanfruit 7", ItemClassification.progression_skip_balancing, 0x55), + ItemData(77771044, "Bean Fruit 1", ItemClassification.progression_skip_balancing, 0x47), + ItemData(77771045, "Bean Fruit 2", ItemClassification.progression_skip_balancing, 0x50), + ItemData(77771046, "Bean Fruit 3", ItemClassification.progression_skip_balancing, 0x51), + ItemData(77771047, "Bean Fruit 4", ItemClassification.progression_skip_balancing, 0x52), + ItemData(77771048, "Bean Fruit 5", ItemClassification.progression_skip_balancing, 0x53), + ItemData(77771049, "Bean Fruit 6", ItemClassification.progression_skip_balancing, 0x54), + ItemData(77771050, "Bean Fruit 7", ItemClassification.progression_skip_balancing, 0x55), ItemData(77771051, "Blue Neon Egg", ItemClassification.progression, 0x56), ItemData(77771052, "Red Neon Egg", ItemClassification.progression, 0x57), ItemData(77771053, "Green Neon Egg", ItemClassification.progression, 0x60), diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 4a7441971b46..9366d125254c 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -77,7 +77,7 @@ def winkle(state, player): def beanFruit(state, player): - return state.has("Beanfruit 1", player) and state.has("Beanfruit 2", player) and state.has("Beanfruit 3", player) and state.has("Beanfruit 4", player) and state.has("Beanfruit 5", player) and state.has("Beanfruit 6", player) and state.has("Beanfruit 7", player) + return state.has("Bean Fruit 1", player) and state.has("Bean Fruit 2", player) and state.has("Bean Fruit 3", player) and state.has("Bean Fruit 4", player) and state.has("Bean Fruit 5", player) and state.has("Bean Fruit 6", player) and state.has("Bean Fruit 7", player) def surfable(state, player): From b5ad56fa46252d839e051b07a2923671dbf36e7d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 29 Apr 2024 00:46:47 -0400 Subject: [PATCH 53/79] v1.6 --- worlds/mlss/Client.py | 2 +- worlds/mlss/Locations.py | 40 +++++++++++++++--------------- worlds/mlss/Names/LocationName.py | 38 ++++++++++++++-------------- worlds/mlss/Rom.py | 2 +- worlds/mlss/data/basepatch.bsdiff | Bin 17230 -> 17580 bytes worlds/mlss/data/sounds.txt | 1 - 6 files changed, 41 insertions(+), 42 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 426d56395e6e..e32a6629e2c4 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -217,7 +217,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: self.checked_flags[byte_i] += [j] locs_to_send.add(pointer) - if not ctx.finished_game and cackletta != 0: + if not ctx.finished_game and cackletta != 0 and current_room == 0x1C7: await ctx.send_msgs([{ "cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 2a86bd970069..2bd57eeed25b 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -213,7 +213,7 @@ class MLSSLocation(Location): 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("Beanbean Outskirts Thunderhand 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), @@ -286,7 +286,7 @@ class MLSSLocation(Location): 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 Boostatue Room Digspot 3 (Rightside)", 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), @@ -535,20 +535,20 @@ class MLSSLocation(Location): ] surfable: typing.List[LocationData] = [ - 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 North Whirlpool Block 1", 0x39e0a5, 0), + LocationData("Oho Ocean North Whirlpool Block 2", 0x39e0ad, 0), + LocationData("Oho Ocean North Whirlpool Block 3", 0x39e0b5, 0), + LocationData("Oho Ocean North Whirlpool Block 4", 0x39e0bd, 0), + LocationData("Oho Ocean North Whirlpool Digspot 1", 0x39e0c5, 0), + LocationData("Oho 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("Oho Ocean South Whirlpool Digspot 1", 0x39e0da, 0), + LocationData("Oho Ocean South Whirlpool Digspot 2", 0x39e0e2, 0), + LocationData("Oho Ocean South Whirlpool Digspot 3", 0x39e0ea, 0), + LocationData("Oho Ocean South Whirlpool Digspot 4", 0x39e0f2, 0), + LocationData("Oho Ocean South Whirlpool Digspot 5", 0x39e0fa, 0), + LocationData("Oho Ocean South Whirlpool Digspot 6", 0x39e102, 0), + LocationData("Oho Ocean South Whirlpool Room 2 Digspot", 0x39e10f, 0), LocationData("Joke's End Pipe Digspot", 0x39e6c2, 0), LocationData("Joke's End Staircase Digspot", 0x39e6cf, 0), LocationData("Surf Minigame", 0x2753ea, 1), @@ -621,10 +621,10 @@ class MLSSLocation(Location): 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 Past Ultra Hammer Rock Block 1", 0x39e580, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock Block 2", 0x39e590, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 1", 0x39e598, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock 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), @@ -747,7 +747,7 @@ class MLSSLocation(Location): ] postJokes: typing.List[LocationData] = [ - LocationData("Teehee Valley Past Ultra Hammers Digspot 2", 0x39e5a0, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 2 (Post-Birdo)", 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), diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index faef8f162b2a..c5d275d74db8 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -178,19 +178,19 @@ class LocationName(): OhoOceanSouthRoom2Digspot = "Oho Ocean South Room 2 Digspot" OhoOceanSpikeRoomDigspot1 = "Oho Ocean Spike Room Digspot 1" OhoOceanSpikeRoomDigspot2 = "Oho Ocean Spike Room Digspot 2" - OceanNorthWhirlpoolBlock1 = "Ocean North Whirlpool Block 1" - OceanNorthWhirlpoolBlock2 = "Ocean North Whirlpool Block 2" - OceanNorthWhirlpoolBlock3 = "Ocean North Whirlpool Block 3" - OceanNorthWhirlpoolBlock4 = "Ocean North Whirlpool Block 4" - OceanNorthWhirlpoolDigspot1 = "Ocean North Whirlpool Digspot 1" - OceanNorthWhirlpoolDigspot2 = "Ocean North Whirlpool Digspot 2" - OceanSouthWhirlpoolDigspot1 = "Ocean South Whirlpool Digspot 1" - OceanSouthWhirlpoolDigspot2 = "Ocean South Whirlpool Digspot 2" - OceanSouthWhirlpoolDigspot3 = "Ocean South Whirlpool Digspot 3" - OceanSouthWhirlpoolDigspot4 = "Ocean South Whirlpool Digspot 4" - OceanSouthWhirlpoolDigspot5 = "Ocean South Whirlpool Digspot 5" - OceanSouthWhirlpoolDigspot6 = "Ocean South Whirlpool Digspot 6" - OceanSouthWhirlpoolRoom2Digspot = "Ocean South Whirlpool Room 2 Digspot" + OceanNorthWhirlpoolBlock1 = "Oho Ocean North Whirlpool Block 1" + OceanNorthWhirlpoolBlock2 = "Oho Ocean North Whirlpool Block 2" + OceanNorthWhirlpoolBlock3 = "Oho Ocean North Whirlpool Block 3" + OceanNorthWhirlpoolBlock4 = "Oho Ocean North Whirlpool Block 4" + OceanNorthWhirlpoolDigspot1 = "Oho Ocean North Whirlpool Digspot 1" + OceanNorthWhirlpoolDigspot2 = "Oho Ocean North Whirlpool Digspot 2" + OceanSouthWhirlpoolDigspot1 = "Oho Ocean South Whirlpool Digspot 1" + OceanSouthWhirlpoolDigspot2 = "Oho Ocean South Whirlpool Digspot 2" + OceanSouthWhirlpoolDigspot3 = "Oho Ocean South Whirlpool Digspot 3" + OceanSouthWhirlpoolDigspot4 = "Oho Ocean South Whirlpool Digspot 4" + OceanSouthWhirlpoolDigspot5 = "Oho Ocean South Whirlpool Digspot 5" + OceanSouthWhirlpoolDigspot6 = "Oho Ocean South Whirlpool Digspot 6" + OceanSouthWhirlpoolRoom2Digspot = "Oho Ocean South Whirlpool Room 2 Digspot" WoohooHooniversityStarRoomBlock1 = "Woohoo Hooniversity Star Room Block 1" WoohooHooniversityStarRoomBlock2 = "Woohoo Hooniversity Star Room Block 2" WoohooHooniversityStarRoomBlock3 = "Woohoo Hooniversity Star Room Block 3" @@ -290,11 +290,11 @@ class LocationName(): TeeheeValleySoloMarioRoomDigspot2 = "Teehee Valley Solo Mario Room Digspot 2" TeeheeValleySoloMarioRoomDigspot3 = "Teehee Valley Solo Mario Room Digspot 3" TeeheeValleySoloMarioRoomDigspot4 = "Teehee Valley Solo Mario Room Digspot 4" - TeeheeValleyPastUltraHammersBlock1 = "Teehee Valley Past Ultra Hammers Block 1" - TeeheeValleyPastUltraHammersBlock2 = "Teehee Valley Past Ultra Hammers Block 2" - TeeheeValleyPastUltraHammersDigspot1 = "Teehee Valley Past Ultra Hammers Digspot 1" - TeeheeValleyPastUltraHammersDigspot2 = "Teehee Valley Past Ultra Hammers Digspot 2" - TeeheeValleyPastUltraHammersDigspot3 = "Teehee Valley Past Ultra Hammers Digspot 3" + TeeheeValleyPastUltraHammersBlock1 = "Teehee Valley Past Ultra Hammer Rock Block 1" + TeeheeValleyPastUltraHammersBlock2 = "Teehee Valley Past Ultra Hammer Rock Block 2" + TeeheeValleyPastUltraHammersDigspot1 = "Teehee Valley Past Ultra Hammer Rock Digspot 1" + TeeheeValleyPastUltraHammersDigspot2 = "Teehee Valley Past Ultra Hammer Rock Digspot 2 (Post-Birdo)" + TeeheeValleyPastUltraHammersDigspot3 = "Teehee Valley Past Ultra Hammer Rock Digspot 3" TeeheeValleyEntranceToHoohooMountainDigspot = "Teehee Valley Entrance To Hoohoo Mountain Digspot" TeeheeValleySoloLuigiMazeRoom2Digspot1 = "Teehee Valley Solo Luigi Maze Room 2 Digspot 1" TeeheeValleySoloLuigiMazeRoom2Digspot2 = "Teehee Valley Solo Luigi Maze Room 2 Digspot 2" @@ -524,7 +524,7 @@ class LocationName(): BowsersCastleLarryRoomBlock = "Bowser's Castle Larry Room Block" BowsersCastleLemmyRoomMole = "Bowser's Castle Lemmy Room Mole" SurfMinigame = "Surf Minigame" - BeanbeanOutskirtsThunderHandMole = "Beanbean Outskirts Thunder Hand Mole" + BeanbeanOutskirtsThunderHandMole = "Beanbean Outskirts Thunderhand Mole" BadgeShopMomPiranhaFlag1 = "Badge Shop Mom Piranha Flag 1" BadgeShopMomPiranhaFlag2 = "Badge Shop Mom Piranha Flag 2" BadgeShopMomPiranhaFlag3 = "Badge Shop Mom Piranha Flag 3" diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 138a36720e69..40dc55e7d193 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -225,7 +225,7 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): stream.seek(-3, 1) stream.write(bytes([enemies_raw.pop()])) stream.seek(1, 1) - stream.write(bytes([0x4])) + stream.write(bytes([0x6])) stream.seek(1, 1) else: stream.seek(3, 1) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 7c73259ba1163aafb70d144f462ee5376c6b160d..887c6aa4a65f98a9da1013fb62a5534f27c0c9a9 100644 GIT binary patch literal 17580 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 Mk}1N3hW=xVkUs*%kN^Mx literal 17230 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 )K5bt* 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 kH2$3_wD;nT441xDTlLqsr|y& Date: Tue, 30 Apr 2024 09:43:31 -0400 Subject: [PATCH 54/79] Update Rom.py --- worlds/mlss/Rom.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 40dc55e7d193..5abc2d9f3eb0 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -298,6 +298,13 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: world.multiworld.seed_name.encode("UTF-8") ) + # Bake patch into header + patch.write_token( + APTokenTypes.WRITE, + 0xAD, + "P".encode("UTF-8") + ) + # Intro Skip patch.write_token( APTokenTypes.WRITE, From fc9c782a5879e29eab0da37af09547810f7d7d43 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 01:16:25 -0400 Subject: [PATCH 55/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 17580 -> 17621 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 887c6aa4a65f98a9da1013fb62a5534f27c0c9a9..ba90b89f32e7a5aef23abeca7e963e71eb55bd2f 100644 GIT binary patch literal 17621 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 u!M7LLzO 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 Mk}1N3hW=xVkUs*%kN^Mx From 950a5a7200e95462f06e310ea2bc8f07ac2e3e29 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 16:02:36 -0400 Subject: [PATCH 56/79] Initial review refactor --- worlds/mlss/Client.py | 15 ++- worlds/mlss/Options.py | 2 +- worlds/mlss/Regions.py | 79 ++++++----- worlds/mlss/Rom.py | 2 +- worlds/mlss/Rules.py | 270 +++++++++++++++++++------------------- worlds/mlss/StateLogic.py | 153 +++++++++++++-------- worlds/mlss/__init__.py | 92 ++++++------- 7 files changed, 334 insertions(+), 279 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index e32a6629e2c4..3dff7c6ffd5f 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -1,5 +1,4 @@ -import typing -from typing import TYPE_CHECKING, Optional, Set +from typing import TYPE_CHECKING, Optional, Set, List, Dict import struct from NetUtils import ClientStatus @@ -24,9 +23,9 @@ class MLSSClient(BizHawkClient): goal_flag: int rom_slot_name: Optional[str] eCount: int - eUsed: [] + eUsed: List[int] player_name: Optional[str] - checked_flags: typing.Dict[int, list] = {} + checked_flags: Dict[int, list] = {} def __init__(self) -> None: super().__init__() @@ -98,9 +97,11 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: self.seed_verify = True read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), - (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x304A, 1, "EWRAM"), - (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x3060, 6, "EWRAM"), - (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), (0x2339, 1, "IWRAM")]) + (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), + (0x304A, 1, "EWRAM"), (0x304B, 1, "EWRAM"), + (0x304C, 4, "EWRAM"), (0x3060, 6, "EWRAM"), + (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), + (0x2339, 1, "IWRAM")]) flags = read_state[0] current_room = int.from_bytes(read_state[1], 'little') shop_init = read_state[2][0] diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 50a51f1a7a72..8d09a5138b55 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -48,7 +48,7 @@ class MusicOptions(Choice): class RandomSounds(Toggle): """ - Randomizes every sound in the game, minus a few sounds that can softlock the game* (UNSTABLE OPTION) + Randomizes every sound in the game, minus a select few that can softlock the game """ display_name = "Randomize Sounds" diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index badbac4f3c78..0e91875eb1e5 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -20,7 +20,7 @@ def create_regions(world: "MLSSWorld", excluded: typing.List[str]): create_region(world, "Beanbean Castle Town", castleTown, excluded) create_region(world, "Shop Starting Flag", startingFlag, excluded) create_region(world, "Shop Chuckolator Flag", chuckolatorFlag, excluded) - create_region(world, "Shop Piranha Flag", piranhaFlag, excluded) + create_region(world, "Shop Mom Piranha Flag", piranhaFlag, excluded) create_region(world, "Shop Enter Fungitown Flag", kidnappedFlag, excluded) create_region(world, "Shop Beanstar Complete Flag", beanstarFlag, excluded) create_region(world, "Shop Birdo Flag", birdoFlag, excluded) @@ -37,8 +37,8 @@ def create_regions(world: "MLSSWorld", excluded: typing.List[str]): create_region(world, "PostJokes", postJokes, excluded) create_region(world, "Theater", theater, excluded) create_region(world, "Fungitown", fungitown, excluded) - create_region(world, "FungitownBeanstar", fungitownBeanstar, excluded) - create_region(world, "FungitownBirdo", fungitownBirdo, excluded) + create_region(world, "Fungitown Shop Beanstar Complete Flag", fungitownBeanstar, excluded) + create_region(world, "Fungitown Shop Birdo Flag", fungitownBirdo, excluded) create_region(world, "BooStatue", booStatue, excluded) create_region(world, "Oasis", oasis, excluded) create_region(world, "BaseUltraRocks", baseUltraRocks, excluded) @@ -57,44 +57,49 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Menu", "Main Area") if world.options.coins: connect(world, names, "Main Area", "Coins") - connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) - connect(world, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, world.player)) - connect(world, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, world.player)) - connect(world, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + connect(world, names, "Main Area", "BaseUltraRocks", StateLogic.ultra(world.player)) + connect(world, names, "Main Area", "Chucklehuck Woods", StateLogic.brooch(world.player)) + connect(world, names, "Main Area", "BooStatue", StateLogic.canCrash(world.player)) + connect(world, names, "Main Area", "Hooniversity", StateLogic.canDig(world.player) and StateLogic.canMini(world.player)) connect(world, names, "Hooniversity", "Oasis") - connect(world, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) - connect(world, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) - connect(world, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) - connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) - connect(world, names, "Fungitown", "FungitownBeanstar", lambda state: StateLogic.pieces(state, world.player) or state.can_reach("FungitownBirdo", "Region", world.player)) - connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) and (StateLogic.thunder(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.hammers(state, world.player))) or state.can_reach("Shop Piranha Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or state.can_reach("Shop Enter Fungitown Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", lambda state: StateLogic.fungitown(state, world.player) or state.can_reach("Shop Beanstar Complete Flag", "Region", world.player)) - connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or state.can_reach("Shop Birdo Flag", "Region", world.player)) - connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) - connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) - connect(world, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, world.player)) - connect(world, names, "Main Area", "Surfable", lambda state: StateLogic.surfable(state, world.player)) + connect(world, names, "Main Area", "TeeheeValley", StateLogic.super(world.player) or StateLogic.canDash(world.player)) + connect(world, names, "TeeheeValley", "GwarharEntrance", StateLogic.membership(world.player) and StateLogic.fire(world.player)) + connect(world, names, "TeeheeValley", "Oasis", StateLogic.membership(world.player) and StateLogic.fire(world.player)) + connect(world, names, "TeeheeValley", "Fungitown", StateLogic.thunder(world.player) and StateLogic.castleTown(world.player) and StateLogic.rose(world.player)) + connection = connect(world, names, "Fungitown", "Fungitown Shop Beanstar Complete Flag", StateLogic.pieces(world.player) or StateLogic.fungitown_birdo_shop(world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Fungitown Shop Birdo Flag"), connection) + connect(world, names, "Main Area", "Shop Starting Flag", StateLogic.brooch(world.player) or StateLogic.rose(world.player)) + connection = connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", (StateLogic.brooch(world.player) and StateLogic.fruits(world.player) and (StateLogic.thunder(world.player) or StateLogic.fire(world.player) or StateLogic.hammers(world.player))) or StateLogic.piranha_shop(world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Shop Mom Piranha Flag"), connection) + connection = connect(world, names, "Shop Starting Flag", "Shop Mom Piranha Flag", StateLogic.thunder(world.player) or StateLogic.fungitown_shop(world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Shop Enter Fungitown Flag"), connection) + connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", StateLogic.fungitown(world.player) or StateLogic.star_shop(world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Shop Beanstar Complete Flag"), connection) + connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", (StateLogic.castleTown(world.player) and StateLogic.pieces(world.player) and StateLogic.rose(world.player)) or StateLogic.birdo_shop(world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) + connect(world, names, "Main Area", "Sewers", StateLogic.rose(world.player)) + connect(world, names, "Main Area", "Airport", StateLogic.thunder(world.player)) + connect(world, names, "Main Area", "Theater", StateLogic.canDash(world.player)) + connect(world, names, "Main Area", "Surfable", StateLogic.surfable(world.player)) connect(world, names, "Surfable", "GwarharEntrance") connect(world, names, "Surfable", "Oasis") - connect(world, names, "Surfable", "JokesEntrance", lambda state: StateLogic.fire(state, world.player)) - connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "Surfable", "JokesEntrance", StateLogic.fire(world.player)) + connect(world, names, "JokesMain", "PostJokes", StateLogic.postJokes(world.player)) if not world.options.castle_skip: connect(world, names, "PostJokes", "Bowser's Castle") - connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player)) - connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) - connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player) and (StateLogic.hammers(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.thunder(state, world.player))) + connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", StateLogic.canMini(world.player) and StateLogic.thunder(world.player)) + connect(world, names, "Chucklehuck Woods", "Winkle", StateLogic.canDash(world.player)) + connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", StateLogic.fruits(world.player) and (StateLogic.hammers(world.player) or StateLogic.fire(world.player) or StateLogic.thunder(world.player))) if world.options.difficult_logic: - connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) - connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) - connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "GwarharEntrance", "GwarharMain", StateLogic.canDash(world.player)) + connect(world, names, "JokesEntrance", "JokesMain", StateLogic.canDig(world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", StateLogic.postJokes(world.player)) + connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", StateLogic.postJokes(world.player)) else: - connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player)) - connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) - connect(world, names, "Fungitown", "FungitownBirdo", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) + connect(world, names, "GwarharEntrance", "GwarharMain", StateLogic.canDash(world.player) and StateLogic.canCrash(world.player)) + connect(world, names, "JokesEntrance", "JokesMain", StateLogic.canCrash(world.player) and StateLogic.canDig(world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", StateLogic.canCrash(world.player) and StateLogic.postJokes(world.player)) + connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", StateLogic.canCrash(world.player) and StateLogic.postJokes(world.player)) def create_region(world: "MLSSWorld", name, locations, excluded): @@ -108,7 +113,7 @@ def create_region(world: "MLSSWorld", name, locations, excluded): def connect(world: "MLSSWorld", used_names: typing.Dict[str, int], source: str, target: str, - rule: typing.Optional[typing.Callable] = None): + rule: typing.Optional[typing.Callable] = None, reach: typing.Optional[bool] = False) -> Entrance | None: source_region = world.multiworld.get_region(source, world.player) target_region = world.multiworld.get_region(target, world.player) @@ -126,3 +131,7 @@ def connect(world: "MLSSWorld", used_names: typing.Dict[str, int], source: str, source_region.exits.append(connection) connection.connect(target_region) + if reach: + return connection + else: + return None diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 5abc2d9f3eb0..ac49548920f1 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -414,7 +414,7 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: patch.write_token( APTokenTypes.WRITE, address + 3, - bytes([world.multiworld.per_slot_randoms[world.player].randint(0x0, 0x26)]) + bytes([world.random.randint(0x0, 0x26)]) ) for location_name in location_table.keys(): diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index d219f4b6e3fc..ab56f7d54e0c 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -18,10 +18,10 @@ def set_rules(world: "MLSSWorld", excluded): if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue add_rule(world.multiworld.get_location(location.name, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) if "Beanstone" in location.name: add_rule(world.multiworld.get_location(location.name, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) if location.itemType != 0 and location.name not in excluded: @@ -31,277 +31,277 @@ def set_rules(world: "MLSSWorld", excluded): if world.options.chuckle_beans == 2: add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), - lambda state: StateLogic.canDash(state, world.player)) + StateLogic.canDash(world.player)) if world.options.chuckle_beans == 1 or world.options.chuckle_beans == 2: add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), - lambda state: StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canDash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player) # Bandaid Fix add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), - lambda state: StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player)) + StateLogic.canMini(world.player) and StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), - lambda state: StateLogic.super(state, world.player)) + StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), - lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + StateLogic.super(world.player) and StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), - lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + StateLogic.super(world.player) and StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), - lambda state: StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player)) + StateLogic.teehee(world.player) and StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule( world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule( world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule( world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule( world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), - lambda state: StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player)) + StateLogic.thunder(world.player) and StateLogic.super(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), - lambda state: StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player)) + StateLogic.thunder(world.player) and StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), - lambda state: StateLogic.canDash(state, world.player)) + StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), - lambda state: StateLogic.thunder(state, world.player)) + StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), - lambda state: StateLogic.thunder(state, world.player) and StateLogic.pieces(state, - world.player) and StateLogic.castleTown( - state, world.player) and StateLogic.rose(state, world.player)) + StateLogic.thunder(world.player) and StateLogic.pieces(world.player) and StateLogic.castleTown(world.player) and StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), - lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + StateLogic.canDig(world.player) and StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), - lambda state: StateLogic.fruits(state, world.player)) + StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), - lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + StateLogic.pieces(world.player) and StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), - lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + StateLogic.pieces(world.player) and StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), - lambda state: StateLogic.hammers(state, world.player)) + StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), - lambda state: StateLogic.canDash(state, world.player)) + StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), - lambda state: StateLogic.canDash(state, world.player)) + StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), - lambda state: StateLogic.canDash(state, world.player)) + StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), - lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + StateLogic.fire(world.player) and StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), - lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + StateLogic.fire(world.player) and StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), - lambda state: StateLogic.canMini(state, world.player)) + StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), - lambda state: StateLogic.canDig(state, world.player)) + StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), - lambda state: StateLogic.neon(state, world.player)) + StateLogic.neon(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), - lambda state: StateLogic.beanFruit(state, world.player)) + StateLogic.beanFruit(world.player)) add_rule(world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), - lambda state: StateLogic.winkle(state, world.player)) + StateLogic.winkle(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), - lambda state: StateLogic.winkle(state, world.player)) + StateLogic.winkle(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), - lambda state: StateLogic.spangle(state, world.player)) + StateLogic.spangle(world.player)) add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + StateLogic.brooch(world.player) or StateLogic.rose(world.player)) add_rule(world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.canDig(world.player)) add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.canMini(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) if world.options.difficult_logic: add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), - lambda state: StateLogic.canCrash(state, world.player)) + StateLogic.canCrash(world.player)) add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), - lambda state: StateLogic.canCrash(state, world.player)) + StateLogic.canCrash(world.player)) if world.options.chuckle_beans != 0: add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), - lambda state: StateLogic.canCrash(state, world.player)) + StateLogic.canCrash(world.player)) if world.options.coins: add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), - lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + StateLogic.canCrash(world.player) or StateLogic.super(world.player)) add_rule(world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), - lambda state: StateLogic.super(state, world.player)) + StateLogic.super(world.player)) add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), - lambda state: StateLogic.canCrash(state, world.player)) + StateLogic.canCrash(world.player)) add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.hammers(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.fruits(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player)) + StateLogic.brooch(world.player)) add_rule(world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), - lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player)) + StateLogic.brooch(world.player) and StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), - lambda state: StateLogic.rose(state, world.player)) + StateLogic.rose(world.player)) add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), - lambda state: StateLogic.ultra(state, world.player)) + StateLogic.ultra(world.player)) add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), - lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + StateLogic.super(world.player) or StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), - lambda state: StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) + StateLogic.canDash(world.player) and (StateLogic.membership(world.player) or StateLogic.surfable(world.player))) add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), - lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + StateLogic.super(world.player) or StateLogic.canDash(world.player)) add_rule(world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) - and (StateLogic.membership(state, world.player) - or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) + StateLogic.ultra(world.player) and StateLogic.fire(world.player) + and (StateLogic.membership(world.player) + or (StateLogic.canDig(world.player) and StateLogic.canMini(world.player)))) add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), - lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) - and StateLogic.canDig(state, world.player) - and (StateLogic.membership(state, world.player) - or StateLogic.canMini(state, world.player))) + StateLogic.ultra(world.player) and StateLogic.fire(world.player) + and StateLogic.canDig(world.player) + and ( + StateLogic.membership(world.player) + or StateLogic.canMini(world.player) + )) if not world.options.difficult_logic: add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), - lambda state: StateLogic.canCrash(state, world.player)) + StateLogic.canCrash(world.player)) diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 9366d125254c..8205e1fb9ed2 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -1,100 +1,145 @@ -def canDig(state, player): - return state.has("Green Goblet", player) and state.has("Hammers", player) +def canDig(player): + return lambda state: state.has("Green Goblet", player) and state.has("Hammers", player) -def canMini(state, player): - return state.has("Red Goblet", player) and state.has("Hammers", player) +def canMini(player): + return lambda state: state.has("Red Goblet", player) and state.has("Hammers", player) -def canDash(state, player): - return state.has("Red Pearl Bean", player) and state.has("Firebrand", player) +def canDash(player): + return lambda state: state.has("Red Pearl Bean", player) and state.has("Firebrand", player) -def canCrash(state, player): - return state.has("Green Pearl Bean", player) and state.has("Thunderhand", player) +def canCrash(player): + return lambda state: state.has("Green Pearl Bean", player) and state.has("Thunderhand", player) -def hammers(state, player): - return state.has("Hammers", player) +def hammers(player): + return lambda state: state.has("Hammers", player) -def super(state, player): - return state.has("Hammers", player, 2) +def super(player): + return lambda state: state.has("Hammers", player, 2) -def ultra(state, player): - return state.has("Hammers", player, 3) +def ultra(player): + return lambda state: state.has("Hammers", player, 3) -def fruits(state, player): - return state.has("Red Chuckola Fruit", player) and state.has("Purple Chuckola Fruit", player) and state.has( - "White Chuckola Fruit", player) +def fruits(player): + return lambda state: (state.has("Red Chuckola Fruit", player) + and state.has("Purple Chuckola Fruit", player) + and state.has("White Chuckola Fruit", player)) -def pieces(state, player): - return state.has("Beanstar Piece 1", player) and state.has("Beanstar Piece 2", player) and state.has( - "Beanstar Piece 3", player) and state.has("Beanstar Piece 4", player) +def pieces(player): + return lambda state: ( + state.has("Beanstar Piece 1", player) + and state.has("Beanstar Piece 2", player) + and state.has("Beanstar Piece 3", player) + and state.has("Beanstar Piece 4", player) + ) -def neon(state, player): - return state.has("Blue Neon Egg", player) and state.has("Red Neon Egg", player) and state.has("Green Neon Egg", - player) and state.has( - "Yellow Neon Egg", player) and state.has("Purple Neon Egg", player) and state.has("Orange Neon Egg", - player) and state.has( - "Azure Neon Egg", player) +def neon(player): + return lambda state: ( + state.has("Blue Neon Egg", player) + and state.has("Red Neon Egg", player) + and state.has("Green Neon Egg", player) + and state.has("Yellow Neon Egg", player) + and state.has("Purple Neon Egg", player) + and state.has("Orange Neon Egg", player) + and state.has("Azure Neon Egg", player) + ) -def spangle(state, player): - return state.has("Spangle", player) +def spangle(player): + return lambda state: state.has("Spangle", player) -def rose(state, player): - return state.has("Peasley's Rose", player) +def rose(player): + return lambda state: state.has("Peasley's Rose", player) -def brooch(state, player): - return state.has("Beanbean Brooch", player) +def brooch(player): + return lambda state: state.has("Beanbean Brooch", player) -def thunder(state, player): - return state.has("Thunderhand", player) +def thunder(player): + return lambda state: state.has("Thunderhand", player) -def fire(state, player): - return state.has("Firebrand", player) +def fire(player): + return lambda state: state.has("Firebrand", player) -def dressBeanstar(state, player): - return state.has("Peach's Extra Dress", player) and state.has("Fake Beanstar", player) +def dressBeanstar(player): + return lambda state: state.has("Peach's Extra Dress", player) and state.has("Fake Beanstar", player) -def membership(state, player): - return state.has("Membership Card", player) +def membership(player): + return lambda state: state.has("Membership Card", player) -def winkle(state, player): - return state.has("Winkle Card", player) +def winkle(player): + return lambda state: state.has("Winkle Card", player) -def beanFruit(state, player): - return state.has("Bean Fruit 1", player) and state.has("Bean Fruit 2", player) and state.has("Bean Fruit 3", player) and state.has("Bean Fruit 4", player) and state.has("Bean Fruit 5", player) and state.has("Bean Fruit 6", player) and state.has("Bean Fruit 7", player) +def beanFruit(player): + return lambda state: ( + state.has("Bean Fruit 1", player) + and state.has("Bean Fruit 2", player) + and state.has("Bean Fruit 3", player) + and state.has("Bean Fruit 4", player) + and state.has("Bean Fruit 5", player) + and state.has("Bean Fruit 6", player) + and state.has("Bean Fruit 7", player) + ) -def surfable(state, player): - return ultra(state, player) and ((canDig(state, player) and canMini(state, player)) or (membership(state, player) and fire(state, player))) +def surfable(player): + return lambda state: ( + ultra(player) + and ((canDig(player) and canMini(player)) + or (membership(player) and fire(player))) + ) -def postJokes(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) and canDash(state, player) +def postJokes(player): + return lambda state: ( + surfable(player) + and canDig(player) + and dressBeanstar(player) + and pieces(player) + and fruits(player) + and brooch(player) + and rose(player) + and canDash(player) + ) -def teehee(state, player): - return super(state, player) or canDash(state, player) +def teehee(player): + return lambda state: super(player) or canDash(player) -def castleTown(state, player): - return fruits(state, player) and brooch(state, player) +def castleTown(player): + return lambda state: fruits(player) and brooch(player) -def fungitown(state, player): - return castleTown(state, player) and thunder(state, player) and rose(state, player) and (super(state, player) or canDash(state, player)) +def fungitown(player): + return lambda state: castleTown(player) and thunder(player) and rose(player) and (super(player) or canDash(player)) + +def piranha_shop(player): + return lambda state: state.can_reach("Shop Mom Piranha Flag", "Region", player) + +def fungitown_shop(player): + return lambda state: state.can_reach("Shop Enter Fungitown Flag", "Region", player) + +def star_shop(player): + return lambda state: state.can_reach("Shop Beanstar Complete Flag", "Region", player) + +def birdo_shop(player): + return lambda state: state.can_reach("Shop Birdo Flag", "Region", player) + +def fungitown_birdo_shop(player): + return lambda state: state.can_reach("Fungitown Shop Birdo Flag", "Region", player) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index d714414c5841..2cf1b0cde56b 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -4,6 +4,7 @@ import settings from BaseClasses import Tutorial, ItemClassification from worlds.AutoWorld import WebWorld, World +from typing import List, Dict, Any from .Locations import all_locations, location_table, bowsers, bowsersMini, hidden, coins from .Options import MLSSOptions from .Items import MLSSItem, itemList, item_frequencies, item_table @@ -47,7 +48,6 @@ class MLSSWorld(World): """ game = "Mario & Luigi Superstar Saga" web = MLSSWebWorld() - data_version = 1 options_dataclass = MLSSOptions options: MLSSOptions settings: typing.ClassVar[MLSSSettings] @@ -55,30 +55,40 @@ class MLSSWorld(World): location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} required_client_version = (0, 4, 5) - excluded_locations = [] + disabled_locations: List[str] = [] def generate_early(self) -> None: - self.excluded_locations = [] if self.options.chuckle_beans == 0: - self.excluded_locations += [location.name for location in all_locations if "Digspot" in location.name] + self.disabled_locations += [location.name for location in all_locations if "Digspot" in location.name] if self.options.castle_skip: - self.excluded_locations += [location.name for location in all_locations if "Bowser" in location.name] + self.disabled_locations += [location.name for location in all_locations if "Bowser" in location.name] if self.options.chuckle_beans == 1: - self.excluded_locations = [location.name for location in all_locations if location.id in hidden] + self.disabled_locations = [location.name for location in all_locations if location.id in hidden] if self.options.skip_minecart: - self.excluded_locations += [LocationName.HoohooMountainBaseMinecartCaveDigspot] + self.disabled_locations += [LocationName.HoohooMountainBaseMinecartCaveDigspot] if self.options.disable_surf: - self.excluded_locations += [LocationName.SurfMinigame] + self.disabled_locations += [LocationName.SurfMinigame] if self.options.harhalls_pants: - self.excluded_locations += [LocationName.HarhallsPants] + self.disabled_locations += [LocationName.HarhallsPants] if not self.options.coins: - self.excluded_locations += [location.name for location in all_locations if location in coins] + self.disabled_locations += [location.name for location in all_locations if location in coins] def create_regions(self) -> None: - create_regions(self, self.excluded_locations) + create_regions(self, self.disabled_locations) connect_regions(self) - def fill_slot_data(self) -> dict: + item = self.create_item("Mushroom") + self.get_location(LocationName.ShopStartingFlag1).place_locked_item(item) + item = self.create_item("Syrup") + self.get_location(LocationName.ShopStartingFlag2).place_locked_item(item) + item = self.create_item("1-UP Mushroom") + self.get_location(LocationName.ShopStartingFlag3).place_locked_item(item) + item = self.create_item("Hoo Bean") + self.get_location(LocationName.PantsShopStartingFlag1).place_locked_item(item) + item = self.create_item("Chuckle Bean") + self.get_location(LocationName.PantsShopStartingFlag2).place_locked_item(item) + + def fill_slot_data(self) -> Dict[str, Any]: return { "CastleSkip": self.options.castle_skip.value, "SkipMinecart": self.options.skip_minecart.value, @@ -89,27 +99,15 @@ def fill_slot_data(self) -> dict: "Coins": self.options.coins.value } - def generate_basic(self) -> None: - item = self.create_item("Mushroom") - self.multiworld.get_location(LocationName.ShopStartingFlag1, self.player).place_locked_item(item) - item = self.create_item("Syrup") - self.multiworld.get_location(LocationName.ShopStartingFlag2, self.player).place_locked_item(item) - item = self.create_item("1-UP Mushroom") - self.multiworld.get_location(LocationName.ShopStartingFlag3, self.player).place_locked_item(item) - item = self.create_item("Hoo Bean") - self.multiworld.get_location(LocationName.PantsShopStartingFlag1, self.player).place_locked_item(item) - item = self.create_item("Chuckle Bean") - self.multiworld.get_location(LocationName.PantsShopStartingFlag2, self.player).place_locked_item(item) - def create_items(self) -> None: # First add in all progression and useful items required_items = [] precollected = [item for item in itemList if item in self.multiworld.precollected_items] for item in itemList: - if item.progression != ItemClassification.filler and item.progression != ItemClassification.skip_balancing and item not in precollected: + if item.progression != ItemClassification.filler and item.progression != ItemClassification.skip_balancing: freq = item_frequencies.get(item.itemName, 1) - if freq is None: - freq = 1 + if item in precollected: + freq = max(freq - precollected.count(item), 0) if self.options.harhalls_pants and "Harhall's" in item.itemName: continue required_items += [item.itemName for _ in range(freq)] @@ -117,23 +115,23 @@ def create_items(self) -> None: for itemName in required_items: self.multiworld.itempool.append(self.create_item(itemName)) - # Then, get a random amount of fillers until we have as many items as we have locations + # Then, create our list of filler items filler_items = [] for item in itemList: - if item.progression == ItemClassification.filler: - if item.itemName == "5 Coins" and not self.options.coins: + if item.progression != ItemClassification.filler: + continue + if item.itemName == "5 Coins" and not self.options.coins: + continue + freq = item_frequencies.get(item.itemName, 1) + if self.options.chuckle_beans == 0: + if item.itemName == "Chuckle Bean": continue - freq = item_frequencies.get(item.itemName) - if self.options.chuckle_beans == 0: - if item.itemName == "Chuckle Bean": - continue - if self.options.chuckle_beans == 1: - if item.itemName == "Chuckle Bean": - freq -= 59 - if freq is None: - freq = 1 - filler_items += [item.itemName for _ in range(freq)] + if self.options.chuckle_beans == 1: + if item.itemName == "Chuckle Bean": + freq -= 59 + filler_items += [item.itemName for _ in range(freq)] + # And finally take as many fillers as we need to have the same amount of items and locations. remaining = len(all_locations) - len(required_items) - 5 if self.options.castle_skip: remaining -= (len(bowsers) + len(bowsersMini) - (5 if self.options.chuckle_beans == 0 else 0)) @@ -149,14 +147,13 @@ def create_items(self) -> None: remaining -= 59 if not self.options.coins: remaining -= len(coins) - for i in range(remaining): - filler_item_name = self.multiworld.random.choice(filler_items) - item = self.create_item(filler_item_name) - self.multiworld.itempool.append(item) - filler_items.remove(filler_item_name) + + self.multiworld.itempool += [ + self.create_item(filler_item_name) for filler_item_name in self.random.sample(filler_items, remaining) + ] def set_rules(self) -> None: - set_rules(self, self.excluded_locations) + set_rules(self, self.disabled_locations) self.multiworld.completion_condition[self.player] = \ lambda state: state.can_reach("PostJokes", "Region", self.player) @@ -164,6 +161,9 @@ def create_item(self, name: str) -> MLSSItem: item = item_table[name] return MLSSItem(item.itemName, item.progression, item.code, self.player) + def get_filler_item_name(self) -> str: + return self.random.choice(list(filter(lambda item: item.progression == ItemClassification.filler, itemList))) + def generate_output(self, output_directory: str) -> None: patch = MLSSProcedurePatch(player=self.player, player_name=self.multiworld.player_name[self.player]) patch.write_file("base_patch.bsdiff4", pkgutil.get_data(__name__, "data/basepatch.bsdiff")) From 939bc9974650dcfa3fb704dddd76111c8b7cb8a0 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 16:50:37 -0400 Subject: [PATCH 57/79] Revert state logic changes. Continuation of refactor. --- worlds/mlss/Data.py | 511 +++++++++++++++++++++++++++++++++++ worlds/mlss/Enemies.py | 207 -------------- worlds/mlss/Regions.py | 62 ++--- worlds/mlss/Rom.py | 26 +- worlds/mlss/Rules.py | 522 ++++++++++++++++++------------------ worlds/mlss/StateLogic.py | 138 +++++----- worlds/mlss/__init__.py | 8 +- worlds/mlss/data/sounds.txt | 301 --------------------- 8 files changed, 888 insertions(+), 887 deletions(-) create mode 100644 worlds/mlss/Data.py delete mode 100644 worlds/mlss/Enemies.py delete mode 100644 worlds/mlss/data/sounds.txt diff --git a/worlds/mlss/Data.py b/worlds/mlss/Data.py new file mode 100644 index 000000000000..6dc39dec310a --- /dev/null +++ b/worlds/mlss/Data.py @@ -0,0 +1,511 @@ +flying = [ + 0x14, + 0x1D, + 0x4C +] + +pestnut = [ + 0x20, + 0x34 +] + +enemies = [ + 0x5030EC, + 0x50310C, + 0x50312C, + 0x50314C, + 0x50316C, + 0x50318C, + 0x5031AC, + 0x5031CC, + 0x5031EC, + 0x50328C, + 0x5032AC, + 0x5032CC, + 0x5032EC, + 0x50330C, + 0x50332C, + 0x50334C, + 0x50336C, + 0x50338C, + 0x5033AC, + 0x5033CC, + 0x50340C, + 0x50342C, + 0x50344C, + 0x50346C, + 0x50348C, + 0x5034AC, + 0x5034CC, + 0x5034EC, + 0x50350C, + 0x50356C, + 0x50358C, + 0x5035AC, + 0x5035CC, + 0x5035EC, + 0x50366C, + 0x50368C, + 0x5036AC, + 0x5036CC, + 0x5036EC, + 0x50370C, + 0x50372C, + 0x50374C, + 0x50376C, + 0x50378C, + 0x5037EC, + 0x50380C, + 0x50382C, + 0x50384C, + 0x50386C, + 0x50388C, + 0x5038AC, + 0x5038CC, + 0x5038EC, + 0x50390C, + 0x50392C, + 0x50394C, + 0x50398C, + 0x5039AC, + 0x5039CC, + 0x5039EC, + 0x503A0C, + 0x503A2C, + 0x503A4C, + 0x503A6C, + 0x503AAC, + 0x503ACC, + 0x503AEC, + 0x503B0C, + 0x503B2C, + 0x503B4C, + 0x503B6C, + 0x503B8C, + 0x503BAC, + 0x503BCC, + 0x503BEC, + 0x503C0C, + 0x503C2C, + 0x503C4C, + 0x503C6C, + 0x503C8C, + 0x503CAC, + 0x503CCC, + 0x503CEC, + 0x503D0C, + 0x503D2C, + 0x503D4C, + 0x503D8C, + 0x503DAC, + 0x503DCC, + 0x503DEC, + 0x503E0C, + 0x503E2C, + 0x503E4C, + 0x503E6C, + 0x503E8C, + 0x503EAC, + 0x503ECC, + 0x503EEC, + 0x503F2C, + 0x503F4C, + 0x503F6C, + 0x503F8C, + 0x503FAC, + 0x503FCC, + 0x503FEC, + 0x50400C, + 0x50404C, + 0x50406C, + 0x50408C, + 0x5040AC, + 0x5040CC, + 0x5040EC, + 0x50410C, + 0x50412C, + 0x50414C, + 0x50416C, + 0x50418C, + 0x5041AC, + 0x5041CC, + 0x5041EC, + 0x50420C, + 0x50422C, + 0x50436C, + 0x5043AC, + 0x5043CC, + 0x5043EC, + 0x50440C, + 0x50442C, + 0x50444C, + 0x50446C, + 0x50448C, + 0x5044AC, + 0x5044CC, + 0x5044EC, + 0x50450C, + 0x50452C, + 0x50454C, + 0x50456C, + 0x50458C, + 0x5045AC, + 0x50468C, + 0x5046CC, + 0x5046EC, + 0x50470C +] + +bosses = [ + 0x5030CC, + 0x50320C, + 0x50322C, + 0x50352C, + 0x50360C, + 0x5037AC, + 0x5037CC, + 0x503A8C, + 0x503D6C, + 0x503F0C, + 0x50424C, + 0x50426C, + 0x50428C, + 0x5042AC, + 0x5042CC, + 0x5042EC, + 0x50430C, + 0x50438C, + 0x5045CC, + 0x5045EC, + 0x50460C +] + +bowsers = [ + 0x50404C, + 0x50406C, + 0x50408C, + 0x5040AC, + 0x5040CC, + 0x5040EC, + 0x50410C, + 0x50412C, + 0x50414C, + 0x50416C, + 0x50418C, + 0x5041AC, + 0x5041CC, + 0x5041EC, + 0x50420C, + 0x50422C, + 0x50424C, + 0x50426C, + 0x50428C, + 0x5042AC, + 0x5042CC, + 0x5042EC, + 0x50430C, +] + +sounds = [ + 0x1da51c, + 0x1da478, + 0x1da430, + 0x1da420, + 0x1da404, + 0x1da3e8, + 0x1da330, + 0x1da1e0, + 0x1da1b4, + 0x1da13c, + 0x1da0c8, + 0x1d9fec, + 0x1d9f10, + 0x1d9e78, + 0x1d9cec, + 0x1d9cdc, + 0x1d9cd0, + 0x1d9cc4, + 0x1d9cb8, + 0x1d9cac, + 0x1d9ca0, + 0x1d9c94, + 0x1d9c88, + 0x1d9c1c, + 0x1d93a4, + 0x1d926c, + 0x1d91d4, + 0x1d9134, + 0x1d9108, + 0x1d9094, + 0x1d9020, + 0x1d8f48, + 0x1d8f3c, + 0x1d8f30, + 0x1d8f14, + 0x1d8f08, + 0x1d8efc, + 0x1d8ef0, + 0x1bc330, + 0x1bc324, + 0x1bc318, + 0x1bc30c, + 0x1bc300, + 0x1bc2f4, + 0x1bc2a4, + 0x1bc210, + 0x1bc18c, + 0x1bc124, + 0x1bc088, + 0x1bc06c, + 0x1bbffc, + 0x1bbf8c, + 0x1bbeb8, + 0x1bbde4, + 0x1bbd34, + 0x1bbd14, + 0x1bbc14, + 0x1bbbd8, + 0x1bbb60, + 0x1bbb0c, + 0x1bba5c, + 0x1bb9b8, + 0x1bb9a0, + 0x1bb8e4, + 0x1bb89c, + 0x1bb880, + 0x1bb704, + 0x1bb6e8, + 0x1bb6dc, + 0x1bb6d0, + 0x1bb6c4, + 0x1bb6b8, + 0x1bb6ac, + 0x1bb6a0, + 0x1bb694, + 0x1bb688, + 0x1bb67c, + 0x1bb66c, + 0x1bb660, + 0x1bb654, + 0x1bb648, + 0x1bb63c, + 0x1bb630, + 0x1bb624, + 0x1bb618, + 0x1bb60c, + 0x1bb600, + 0x1bb5f4, + 0x1bb5e8, + 0x1bb5dc, + 0x1bb5d0, + 0x1bb5c4, + 0x1bb5b8, + 0x1bb5ac, + 0x1bb580, + 0x1bb574, + 0x1bb558, + 0x1bb54c, + 0x1bb540, + 0x1bb534, + 0x1bb528, + 0x1bb51c, + 0x1bb510, + 0x1bb504, + 0x1bb4f8, + 0x1bb4ec, + 0x1bb4e0, + 0x1bb4d4, + 0x1bb4c8, + 0x1bb4bc, + 0x1bb4b0, + 0x1bb4a4, + 0x1bb408, + 0x1bb398, + 0x1bb2e0, + 0x1bb270, + 0x1bb14c, + 0x1bb140, + 0x1bb134, + 0x1bb128, + 0x1bb11c, + 0x1bb110, + 0x1baf84, + 0x1bac0c, + 0x1bab3c, + 0x1bab24, + 0x1bab18, + 0x1bab0c, + 0x1bab00, + 0x1baaf4, + 0x1baad8, + 0x1ba988, + 0x1ba97c, + 0x1ba970, + 0x1ba964, + 0x1ba958, + 0x1ba94c, + 0x1ba940, + 0x1ba918, + 0x1ba580, + 0x1ba4c0, + 0x1ba498, + 0x1ae0c8, + 0x1ae060, + 0x1ae048, + 0x1abcec, + 0x1abc48, + 0x1abb8c, + 0x1abb30, + 0x1ababc, + 0x1ab644, + 0x1ab5a8, + 0x1ab58c, + 0x1ab50c, + 0x1ab488, + 0x1ab3f0, + 0x1ab38c, + 0x1ab348, + 0x1ab31c, + 0x1ab300, + 0x1ab290, + 0x1ab220, + 0x1ab084, + 0x1ab04c, + 0x1aafc8, + 0x1aaf64, + 0x1a8d14, + 0x1a8c30, + 0x1a8290, + 0x1a8284, + 0x1a8168, + 0x1a8014, + 0x1a7f10, + 0x1a7eb8, + 0x1a7dc8, + 0x1a7d5c, + 0x1a7bf0, + 0x1a7b70, + 0x1a7b3c, + 0x1a7b0c, + 0x1a7a1c, + 0x1a7980, + 0x1a7910, + 0x1a783c, + 0x1a77a0, + 0x1a7718, + 0x1a769c, + 0x1a7620, + 0x1a75dc, + 0x1a75bc, + 0x1a7518, + 0x1a7500, + 0x1a74c0, + 0x1a7440, + 0x1a7434, + 0x1a7428, + 0x1a311c, + 0x1a3010, + 0x1a2ff8, + 0x1a2fa0, + 0x1a2f4c, + 0x1a2f18, + 0x1a2eec, + 0x1a2edc, + 0x1a2e98, + 0x1a2df8, + 0x1a2d00, + 0x1a2b80, + 0x1a2b58, + 0x1a2b30, + 0x1a2b04, + 0x1a2a80, + 0x1a2a20, + 0x1a29e0, + 0x1a29c0, + 0x1a2990, + 0x1a296c, + 0x1a1d70, + 0x1a1d48, + 0x1a1d38, + 0x1a1d18, + 0x1a1c9c, + 0x1a1c50, + 0x1a1c10, + 0x1a1be8, + 0x1a1bbc, + 0x1a1b74, + 0x1a1af8, + 0x1a1a58, + 0x1a1968, + 0x1a18d8, + 0x1a186c, + 0x1a1850, + 0x1a1804, + 0x1a17dc, + 0x1a1768, + 0x1a173c, + 0x1a1714, + 0x1a16d0, + 0x1a16a4, + 0x1a1680, + 0x1a1620, + 0x1a15b8, + 0x1a156c, + 0x1a1524, + 0x1a1494, + 0x1a1464, + 0x1a1440, + 0x1a1430, + 0x1a1414, + 0x1a1350, + 0x1a12c4, + 0x1a126c, + 0x1a1250, + 0x1a11f8, + 0x1a11b4, + 0x1a11a4, + 0x1a110c, + 0x1a10f8, + 0x1a1078, + 0x1a1018, + 0x1a0fd4, + 0x1a0fb0, + 0x1a0fa4, + 0x1a0f98, + 0x1a0f74, + 0x1a0f68, + 0x1a0f5c, + 0x1a0f50, + 0x1a0f44, + 0x1a0f38, + 0x1a0f2c, + 0x1a0f20, + 0x1a0f14, + 0x1a0f08, + 0x1a0efc, + 0x1a0ef0, + 0x1a0ee4, + 0x1a0ed8, + 0x1a0ec8, + 0x1a0eb8, + 0x1a0ea8, + 0x1a0e9c, + 0x1a0e90, + 0x1a0e84, + 0x1a0e78, + 0x1a0e6c, + 0x1a0e60, + 0x1a0e54, + 0x1a0e48, + 0x1a0e3c, + 0x1a0e30, + 0x1a0e24, + 0x1a0e18, + 0x1a0e0c, + 0x1a0e00, + 0x1a0df4, + 0x1a0de8, + 0x1a0ddc, + 0x1a0dd0, + 0x1a0da4, +] \ No newline at end of file diff --git a/worlds/mlss/Enemies.py b/worlds/mlss/Enemies.py deleted file mode 100644 index 4b4143a2e9a7..000000000000 --- a/worlds/mlss/Enemies.py +++ /dev/null @@ -1,207 +0,0 @@ -flying = [ - 0x14, - 0x1D, - 0x4C -] - -pestnut = [ - 0x20, - 0x34 -] - -enemies = [ - 0x5030EC, - 0x50310C, - 0x50312C, - 0x50314C, - 0x50316C, - 0x50318C, - 0x5031AC, - 0x5031CC, - 0x5031EC, - 0x50328C, - 0x5032AC, - 0x5032CC, - 0x5032EC, - 0x50330C, - 0x50332C, - 0x50334C, - 0x50336C, - 0x50338C, - 0x5033AC, - 0x5033CC, - 0x50340C, - 0x50342C, - 0x50344C, - 0x50346C, - 0x50348C, - 0x5034AC, - 0x5034CC, - 0x5034EC, - 0x50350C, - 0x50356C, - 0x50358C, - 0x5035AC, - 0x5035CC, - 0x5035EC, - 0x50366C, - 0x50368C, - 0x5036AC, - 0x5036CC, - 0x5036EC, - 0x50370C, - 0x50372C, - 0x50374C, - 0x50376C, - 0x50378C, - 0x5037EC, - 0x50380C, - 0x50382C, - 0x50384C, - 0x50386C, - 0x50388C, - 0x5038AC, - 0x5038CC, - 0x5038EC, - 0x50390C, - 0x50392C, - 0x50394C, - 0x50398C, - 0x5039AC, - 0x5039CC, - 0x5039EC, - 0x503A0C, - 0x503A2C, - 0x503A4C, - 0x503A6C, - 0x503AAC, - 0x503ACC, - 0x503AEC, - 0x503B0C, - 0x503B2C, - 0x503B4C, - 0x503B6C, - 0x503B8C, - 0x503BAC, - 0x503BCC, - 0x503BEC, - 0x503C0C, - 0x503C2C, - 0x503C4C, - 0x503C6C, - 0x503C8C, - 0x503CAC, - 0x503CCC, - 0x503CEC, - 0x503D0C, - 0x503D2C, - 0x503D4C, - 0x503D8C, - 0x503DAC, - 0x503DCC, - 0x503DEC, - 0x503E0C, - 0x503E2C, - 0x503E4C, - 0x503E6C, - 0x503E8C, - 0x503EAC, - 0x503ECC, - 0x503EEC, - 0x503F2C, - 0x503F4C, - 0x503F6C, - 0x503F8C, - 0x503FAC, - 0x503FCC, - 0x503FEC, - 0x50400C, - 0x50404C, - 0x50406C, - 0x50408C, - 0x5040AC, - 0x5040CC, - 0x5040EC, - 0x50410C, - 0x50412C, - 0x50414C, - 0x50416C, - 0x50418C, - 0x5041AC, - 0x5041CC, - 0x5041EC, - 0x50420C, - 0x50422C, - 0x50436C, - 0x5043AC, - 0x5043CC, - 0x5043EC, - 0x50440C, - 0x50442C, - 0x50444C, - 0x50446C, - 0x50448C, - 0x5044AC, - 0x5044CC, - 0x5044EC, - 0x50450C, - 0x50452C, - 0x50454C, - 0x50456C, - 0x50458C, - 0x5045AC, - 0x50468C, - 0x5046CC, - 0x5046EC, - 0x50470C -] - -bosses = [ - 0x5030CC, - 0x50320C, - 0x50322C, - 0x50352C, - 0x50360C, - 0x5037AC, - 0x5037CC, - 0x503A8C, - 0x503D6C, - 0x503F0C, - 0x50424C, - 0x50426C, - 0x50428C, - 0x5042AC, - 0x5042CC, - 0x5042EC, - 0x50430C, - 0x50438C, - 0x5045CC, - 0x5045EC, - 0x50460C -] - -bowsers = [ - 0x50404C, - 0x50406C, - 0x50408C, - 0x5040AC, - 0x5040CC, - 0x5040EC, - 0x50410C, - 0x50412C, - 0x50414C, - 0x50416C, - 0x50418C, - 0x5041AC, - 0x5041CC, - 0x5041EC, - 0x50420C, - 0x50422C, - 0x50424C, - 0x50426C, - 0x50428C, - 0x5042AC, - 0x5042CC, - 0x5042EC, - 0x50430C, -] diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 0e91875eb1e5..bc6a1b1d53a8 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -57,49 +57,49 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Menu", "Main Area") if world.options.coins: connect(world, names, "Main Area", "Coins") - connect(world, names, "Main Area", "BaseUltraRocks", StateLogic.ultra(world.player)) - connect(world, names, "Main Area", "Chucklehuck Woods", StateLogic.brooch(world.player)) - connect(world, names, "Main Area", "BooStatue", StateLogic.canCrash(world.player)) - connect(world, names, "Main Area", "Hooniversity", StateLogic.canDig(world.player) and StateLogic.canMini(world.player)) + connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) + connect(world, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, world.player)) + connect(world, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, world.player)) + connect(world, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) connect(world, names, "Hooniversity", "Oasis") - connect(world, names, "Main Area", "TeeheeValley", StateLogic.super(world.player) or StateLogic.canDash(world.player)) - connect(world, names, "TeeheeValley", "GwarharEntrance", StateLogic.membership(world.player) and StateLogic.fire(world.player)) - connect(world, names, "TeeheeValley", "Oasis", StateLogic.membership(world.player) and StateLogic.fire(world.player)) - connect(world, names, "TeeheeValley", "Fungitown", StateLogic.thunder(world.player) and StateLogic.castleTown(world.player) and StateLogic.rose(world.player)) - connection = connect(world, names, "Fungitown", "Fungitown Shop Beanstar Complete Flag", StateLogic.pieces(world.player) or StateLogic.fungitown_birdo_shop(world.player), True) + connect(world, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + connect(world, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) + connect(world, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) + connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) + connection = connect(world, names, "Fungitown", "Fungitown Shop Beanstar Complete Flag", lambda state: StateLogic.pieces(state, world.player) or StateLogic.fungitown_birdo_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Fungitown Shop Birdo Flag"), connection) - connect(world, names, "Main Area", "Shop Starting Flag", StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - connection = connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", (StateLogic.brooch(world.player) and StateLogic.fruits(world.player) and (StateLogic.thunder(world.player) or StateLogic.fire(world.player) or StateLogic.hammers(world.player))) or StateLogic.piranha_shop(world.player), True) + connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + connection = connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) and (StateLogic.thunder(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.hammers(state, world.player))) or StateLogic.piranha_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Mom Piranha Flag"), connection) - connection = connect(world, names, "Shop Starting Flag", "Shop Mom Piranha Flag", StateLogic.thunder(world.player) or StateLogic.fungitown_shop(world.player), True) + connection = connect(world, names, "Shop Starting Flag", "Shop Mom Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or StateLogic.fungitown_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Enter Fungitown Flag"), connection) - connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", StateLogic.fungitown(world.player) or StateLogic.star_shop(world.player), True) + connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", lambda state: StateLogic.fungitown(state, world.player) or StateLogic.star_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Beanstar Complete Flag"), connection) - connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", (StateLogic.castleTown(world.player) and StateLogic.pieces(world.player) and StateLogic.rose(world.player)) or StateLogic.birdo_shop(world.player), True) + connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or StateLogic.birdo_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) - connect(world, names, "Main Area", "Sewers", StateLogic.rose(world.player)) - connect(world, names, "Main Area", "Airport", StateLogic.thunder(world.player)) - connect(world, names, "Main Area", "Theater", StateLogic.canDash(world.player)) - connect(world, names, "Main Area", "Surfable", StateLogic.surfable(world.player)) + connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) + connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) + connect(world, names, "Main Area", "Theater", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "Main Area", "Surfable", lambda state: StateLogic.surfable(state, world.player)) connect(world, names, "Surfable", "GwarharEntrance") connect(world, names, "Surfable", "Oasis") - connect(world, names, "Surfable", "JokesEntrance", StateLogic.fire(world.player)) - connect(world, names, "JokesMain", "PostJokes", StateLogic.postJokes(world.player)) + connect(world, names, "Surfable", "JokesEntrance", lambda state: StateLogic.fire(state, world.player)) + connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player)) if not world.options.castle_skip: connect(world, names, "PostJokes", "Bowser's Castle") - connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", StateLogic.canMini(world.player) and StateLogic.thunder(world.player)) - connect(world, names, "Chucklehuck Woods", "Winkle", StateLogic.canDash(world.player)) - connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", StateLogic.fruits(world.player) and (StateLogic.hammers(world.player) or StateLogic.fire(world.player) or StateLogic.thunder(world.player))) + connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player)) + connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player) and (StateLogic.hammers(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.thunder(state, world.player))) if world.options.difficult_logic: - connect(world, names, "GwarharEntrance", "GwarharMain", StateLogic.canDash(world.player)) - connect(world, names, "JokesEntrance", "JokesMain", StateLogic.canDig(world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", StateLogic.postJokes(world.player)) - connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", StateLogic.postJokes(world.player)) + connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) + connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) + connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) else: - connect(world, names, "GwarharEntrance", "GwarharMain", StateLogic.canDash(world.player) and StateLogic.canCrash(world.player)) - connect(world, names, "JokesEntrance", "JokesMain", StateLogic.canCrash(world.player) and StateLogic.canDig(world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", StateLogic.canCrash(world.player) and StateLogic.postJokes(world.player)) - connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", StateLogic.canCrash(world.player) and StateLogic.postJokes(world.player)) + connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player)) + connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) + connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) + connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) def create_region(world: "MLSSWorld", name, locations, excluded): diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index ac49548920f1..8124c18a4f4d 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -4,7 +4,7 @@ import random import typing -from . import Enemies +from . import Data from BaseClasses import Item, Location from settings import get_settings from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes, APPatchExtension @@ -117,14 +117,8 @@ def randomize_sounds(caller: APProcedurePatch, rom: bytes): return rom stream = io.BytesIO(rom) random.seed(options["seed"] + options["player"]) - - temp = pkgutil.get_data(__name__, "data/sounds.txt") - temp_io = io.BytesIO(temp) - fresh_pointers = [] - - for line in temp_io.readlines(): - fresh_pointers += [int(line.decode('utf-8').strip(), 16)] - pointers = list(fresh_pointers) + fresh_pointers = Data.sounds + pointers = Data.sounds random.shuffle(pointers) stream.seek(0x21cc44, 0) @@ -144,10 +138,10 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): if options["randomize_bosses"] == 0 and options["randomize_enemies"] == 0: return rom - enemies = [pos for pos in Enemies.enemies if - pos not in Enemies.bowsers] if options["castle_skip"] else Enemies.enemies - bosses = [pos for pos in Enemies.bosses if - pos not in Enemies.bowsers] if options["castle_skip"] else Enemies.bosses + enemies = [pos for pos in Data.enemies if + pos not in Data.bowsers] if options["castle_skip"] else Data.enemies + bosses = [pos for pos in Data.bosses if + pos not in Data.bowsers] if options["castle_skip"] else Data.bosses stream = io.BytesIO(rom) random.seed(options["seed"] + options["player"]) @@ -201,7 +195,7 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): if flag == 0x7: break if flag in [0x0, 0x2, 0x4]: - if enemy not in Enemies.pestnut and enemy not in Enemies.flying: + if enemy not in Data.pestnut and enemy not in Data.flying: enemies_raw += [enemy] stream.seek(1, 1) else: @@ -214,7 +208,7 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): for _ in range(6): enemy = int.from_bytes(stream.read(1)) - if enemy > 0 and enemy not in Enemies.flying and enemy not in Enemies.pestnut: + if enemy > 0 and enemy not in Data.flying and enemy not in Data.pestnut: if enemy == 0x52: chomp = True stream.seek(1, 1) @@ -409,7 +403,7 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: ) if world.options.randomize_backgrounds: - all_enemies = Enemies.enemies + Enemies.bosses + all_enemies = Data.enemies + Data.bosses for address in all_enemies: patch.write_token( APTokenTypes.WRITE, diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index ab56f7d54e0c..573e0e723394 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -17,11 +17,11 @@ def set_rules(world: "MLSSWorld", excluded): continue if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue - add_rule(world.multiworld.get_location(location.name, world.player), - StateLogic.canDig(world.player)) + add_rule(world.multiworld.get_location(location.name, world.player), lambda state: + StateLogic.canDig(state, world.player)) if "Beanstone" in location.name: - add_rule(world.multiworld.get_location(location.name, world.player), - StateLogic.canDig(world.player)) + add_rule(world.multiworld.get_location(location.name, world.player), lambda state: + StateLogic.canDig(state, world.player)) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) if location.itemType != 0 and location.name not in excluded: @@ -30,278 +30,278 @@ def set_rules(world: "MLSSWorld", excluded): forbid_item(world.multiworld.get_location(location.name, world.player), "5 Coins", world.player) if world.options.chuckle_beans == 2: - add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), - StateLogic.canDash(world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), lambda state: + StateLogic.canDash(state, world.player)) if world.options.chuckle_beans == 1 or world.options.chuckle_beans == 2: - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), - StateLogic.canDash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), - StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), lambda state: + StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), lambda state: + StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player) # Bandaid Fix - add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), - StateLogic.canMini(world.player) and StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), - StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), - StateLogic.super(world.player) and StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), - StateLogic.super(world.player) and StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), - StateLogic.teehee(world.player) and StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), - StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), - StateLogic.canDig(world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), lambda state: + StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), lambda state: + StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), lambda state: + StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), lambda state: + StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), lambda state: + StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), lambda state: + StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), lambda state: + StateLogic.canDig(state, world.player)) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), - StateLogic.canMini(world.player)) + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), lambda state: + StateLogic.canMini(state, world.player)) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), - StateLogic.canMini(world.player)) + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), lambda state: + StateLogic.canMini(state, world.player)) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), - StateLogic.canMini(world.player)) + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), lambda state: + StateLogic.canMini(state, world.player)) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), - StateLogic.thunder(world.player) and StateLogic.super(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), - StateLogic.thunder(world.player) and StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), - StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), - StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), - StateLogic.thunder(world.player) and StateLogic.pieces(world.player) and StateLogic.castleTown(world.player) and StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), - StateLogic.canDig(world.player) and StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), - StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), - StateLogic.pieces(world.player) and StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), - StateLogic.pieces(world.player) and StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), - StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), - StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), - StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), - StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), - StateLogic.fire(world.player) and StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), - StateLogic.fire(world.player) and StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), - StateLogic.canMini(world.player)) - add_rule(world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), - StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), - StateLogic.neon(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), - StateLogic.beanFruit(world.player)) - add_rule(world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), - StateLogic.winkle(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), - StateLogic.winkle(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), - StateLogic.spangle(world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), - StateLogic.brooch(world.player) or StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), - StateLogic.brooch(world.player) and StateLogic.canDig(world.player)) - add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), - StateLogic.brooch(world.player) and StateLogic.canMini(world.player)) + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), lambda state: + StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), lambda state: + StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), lambda state: + StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), lambda state: + StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), lambda state: + StateLogic.thunder(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), lambda state: + StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), lambda state: + StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), lambda state: + StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), lambda state: + StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), lambda state: + StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), lambda state: + StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), lambda state: + StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), lambda state: + StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), lambda state: + StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), lambda state: + StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), lambda state: + StateLogic.canMini(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), lambda state: + StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), lambda state: + StateLogic.neon(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), lambda state: + StateLogic.beanFruit(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), lambda state: + StateLogic.winkle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), lambda state: + StateLogic.winkle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: + StateLogic.spangle(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), lambda state: + StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), - StateLogic.ultra(world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), lambda state: + StateLogic.ultra(state, world.player)) if world.options.difficult_logic: - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), - StateLogic.canCrash(world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), - StateLogic.canCrash(world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: + StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), lambda state: + StateLogic.canCrash(state, world.player)) if world.options.chuckle_beans != 0: - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), - StateLogic.canCrash(world.player)) + add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), lambda state: + StateLogic.canCrash(state, world.player)) if world.options.coins: - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), - StateLogic.canCrash(world.player) or StateLogic.super(world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), - StateLogic.super(world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), - StateLogic.ultra(world.player) and StateLogic.thunder(world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), - StateLogic.canCrash(world.player)) - add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), - StateLogic.brooch(world.player) and StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), - StateLogic.brooch(world.player) and StateLogic.hammers(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), - StateLogic.brooch(world.player) and StateLogic.fruits(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), - StateLogic.brooch(world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), - StateLogic.brooch(world.player) and StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), - StateLogic.rose(world.player)) - add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), - StateLogic.ultra(world.player)) - add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), - StateLogic.super(world.player) or StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), - StateLogic.canDash(world.player) and (StateLogic.membership(world.player) or StateLogic.surfable(world.player))) - add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), - StateLogic.super(world.player) or StateLogic.canDash(world.player)) - add_rule(world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), - StateLogic.ultra(world.player) and StateLogic.fire(world.player) - and (StateLogic.membership(world.player) - or (StateLogic.canDig(world.player) and StateLogic.canMini(world.player)))) - add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), - StateLogic.ultra(world.player) and StateLogic.fire(world.player) - and StateLogic.canDig(world.player) + add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), lambda state: + StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), lambda state: + StateLogic.super(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), lambda state: + StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), lambda state: + StateLogic.canCrash(state, world.player)) + add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player)) + add_rule(world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), lambda state: + StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), lambda state: + StateLogic.rose(state, world.player)) + add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), lambda state: + StateLogic.ultra(state, world.player)) + add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), lambda state: + StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), lambda state: + StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) + add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), lambda state: + StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) + add_rule(world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), lambda state: + StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) + and (StateLogic.membership(state, world.player) + or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) + add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: + StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) + and StateLogic.canDig(state, world.player) and ( - StateLogic.membership(world.player) - or StateLogic.canMini(world.player) + StateLogic.membership(state, world.player) + or StateLogic.canMini(state, world.player) )) if not world.options.difficult_logic: - add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), - StateLogic.canCrash(world.player)) + add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: + StateLogic.canCrash(state, world.player)) diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 8205e1fb9ed2..9530fde7acbb 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -1,39 +1,39 @@ -def canDig(player): - return lambda state: state.has("Green Goblet", player) and state.has("Hammers", player) +def canDig(state, player): + return state.has("Green Goblet", player) and state.has("Hammers", player) -def canMini(player): - return lambda state: state.has("Red Goblet", player) and state.has("Hammers", player) +def canMini(state, player): + return state.has("Red Goblet", player) and state.has("Hammers", player) -def canDash(player): - return lambda state: state.has("Red Pearl Bean", player) and state.has("Firebrand", player) +def canDash(state, player): + return state.has("Red Pearl Bean", player) and state.has("Firebrand", player) -def canCrash(player): - return lambda state: state.has("Green Pearl Bean", player) and state.has("Thunderhand", player) +def canCrash(state, player): + return state.has("Green Pearl Bean", player) and state.has("Thunderhand", player) -def hammers(player): - return lambda state: state.has("Hammers", player) +def hammers(state, player): + return state.has("Hammers", player) -def super(player): - return lambda state: state.has("Hammers", player, 2) +def super(state, player): + return state.has("Hammers", player, 2) -def ultra(player): - return lambda state: state.has("Hammers", player, 3) +def ultra(state, player): + return state.has("Hammers", player, 3) -def fruits(player): - return lambda state: (state.has("Red Chuckola Fruit", player) +def fruits(state, player): + return (state.has("Red Chuckola Fruit", player) and state.has("Purple Chuckola Fruit", player) and state.has("White Chuckola Fruit", player)) -def pieces(player): - return lambda state: ( +def pieces(state, player): + return ( state.has("Beanstar Piece 1", player) and state.has("Beanstar Piece 2", player) and state.has("Beanstar Piece 3", player) @@ -41,8 +41,8 @@ def pieces(player): ) -def neon(player): - return lambda state: ( +def neon(state, player): + return ( state.has("Blue Neon Egg", player) and state.has("Red Neon Egg", player) and state.has("Green Neon Egg", player) @@ -53,40 +53,40 @@ def neon(player): ) -def spangle(player): - return lambda state: state.has("Spangle", player) +def spangle(state, player): + return state.has("Spangle", player) -def rose(player): - return lambda state: state.has("Peasley's Rose", player) +def rose(state, player): + return state.has("Peasley's Rose", player) -def brooch(player): - return lambda state: state.has("Beanbean Brooch", player) +def brooch(state, player): + return state.has("Beanbean Brooch", player) -def thunder(player): - return lambda state: state.has("Thunderhand", player) +def thunder(state, player): + return state.has("Thunderhand", player) -def fire(player): - return lambda state: state.has("Firebrand", player) +def fire(state, player): + return state.has("Firebrand", player) -def dressBeanstar(player): - return lambda state: state.has("Peach's Extra Dress", player) and state.has("Fake Beanstar", player) +def dressBeanstar(state, player): + return state.has("Peach's Extra Dress", player) and state.has("Fake Beanstar", player) -def membership(player): - return lambda state: state.has("Membership Card", player) +def membership(state, player): + return state.has("Membership Card", player) -def winkle(player): - return lambda state: state.has("Winkle Card", player) +def winkle(state, player): + return state.has("Winkle Card", player) -def beanFruit(player): - return lambda state: ( +def beanFruit(state, player): + return ( state.has("Bean Fruit 1", player) and state.has("Bean Fruit 2", player) and state.has("Bean Fruit 3", player) @@ -97,49 +97,49 @@ def beanFruit(player): ) -def surfable(player): - return lambda state: ( - ultra(player) - and ((canDig(player) and canMini(player)) - or (membership(player) and fire(player))) +def surfable(state, player): + return ( + ultra(state, player) + and ((canDig(state, player) and canMini(state, player)) + or (membership(state, player) and fire(state, player))) ) -def postJokes(player): - return lambda state: ( - surfable(player) - and canDig(player) - and dressBeanstar(player) - and pieces(player) - and fruits(player) - and brooch(player) - and rose(player) - and canDash(player) +def postJokes(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) + and canDash(state, player) ) -def teehee(player): - return lambda state: super(player) or canDash(player) +def teehee(state, player): + return super(state, player) or canDash(state, player) -def castleTown(player): - return lambda state: fruits(player) and brooch(player) +def castleTown(state, player): + return fruits(state, player) and brooch(state, player) -def fungitown(player): - return lambda state: castleTown(player) and thunder(player) and rose(player) and (super(player) or canDash(player)) +def fungitown(state, player): + return castleTown(state, player) and thunder(state, player) and rose(state, player) and (super(state, player) or canDash(state, player)) -def piranha_shop(player): - return lambda state: state.can_reach("Shop Mom Piranha Flag", "Region", player) +def piranha_shop(state, player): + return state.can_reach("Shop Mom Piranha Flag", "Region", player) -def fungitown_shop(player): - return lambda state: state.can_reach("Shop Enter Fungitown Flag", "Region", player) +def fungitown_shop(state, player): + return state.can_reach("Shop Enter Fungitown Flag", "Region", player) -def star_shop(player): - return lambda state: state.can_reach("Shop Beanstar Complete Flag", "Region", player) +def star_shop(state, player): + return state.can_reach("Shop Beanstar Complete Flag", "Region", player) -def birdo_shop(player): - return lambda state: state.can_reach("Shop Birdo Flag", "Region", player) +def birdo_shop(state, player): + return state.can_reach("Shop Birdo Flag", "Region", player) -def fungitown_birdo_shop(player): - return lambda state: state.can_reach("Fungitown Shop Birdo Flag", "Region", player) +def fungitown_birdo_shop(state, player): + return state.can_reach("Fungitown Shop Birdo Flag", "Region", player) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 2cf1b0cde56b..ab098e58639d 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -154,8 +154,12 @@ def create_items(self) -> None: def set_rules(self) -> None: set_rules(self, self.disabled_locations) - self.multiworld.completion_condition[self.player] = \ - lambda state: state.can_reach("PostJokes", "Region", self.player) + if self.options.castle_skip: + self.multiworld.completion_condition[self.player] = \ + lambda state: state.can_reach("PostJokes", "Region", self.player) + else: + self.multiworld.completion_condition[self.player] = \ + lambda state: state.can_reach("Bowser's Castle Mini", "Region", self.player) def create_item(self, name: str) -> MLSSItem: item = item_table[name] diff --git a/worlds/mlss/data/sounds.txt b/worlds/mlss/data/sounds.txt deleted file mode 100644 index e67cfe6c90d7..000000000000 --- a/worlds/mlss/data/sounds.txt +++ /dev/null @@ -1,301 +0,0 @@ -1da51c -1da478 -1da430 -1da420 -1da404 -1da3e8 -1da330 -1da1e0 -1da1b4 -1da13c -1da0c8 -1d9fec -1d9f10 -1d9e78 -1d9cec -1d9cdc -1d9cd0 -1d9cc4 -1d9cb8 -1d9cac -1d9ca0 -1d9c94 -1d9c88 -1d9c1c -1d93a4 -1d926c -1d91d4 -1d9134 -1d9108 -1d9094 -1d9020 -1d8f48 -1d8f3c -1d8f30 -1d8f14 -1d8f08 -1d8efc -1d8ef0 -1bc330 -1bc324 -1bc318 -1bc30c -1bc300 -1bc2f4 -1bc2a4 -1bc210 -1bc18c -1bc124 -1bc088 -1bc06c -1bbffc -1bbf8c -1bbeb8 -1bbde4 -1bbd34 -1bbd14 -1bbc14 -1bbbd8 -1bbb60 -1bbb0c -1bba5c -1bb9b8 -1bb9a0 -1bb8e4 -1bb89c -1bb880 -1bb704 -1bb6e8 -1bb6dc -1bb6d0 -1bb6c4 -1bb6b8 -1bb6ac -1bb6a0 -1bb694 -1bb688 -1bb67c -1bb66c -1bb660 -1bb654 -1bb648 -1bb63c -1bb630 -1bb624 -1bb618 -1bb60c -1bb600 -1bb5f4 -1bb5e8 -1bb5dc -1bb5d0 -1bb5c4 -1bb5b8 -1bb5ac -1bb580 -1bb574 -1bb558 -1bb54c -1bb540 -1bb534 -1bb528 -1bb51c -1bb510 -1bb504 -1bb4f8 -1bb4ec -1bb4e0 -1bb4d4 -1bb4c8 -1bb4bc -1bb4b0 -1bb4a4 -1bb408 -1bb398 -1bb2e0 -1bb270 -1bb14c -1bb140 -1bb134 -1bb128 -1bb11c -1bb110 -1baf84 -1bac0c -1bab3c -1bab24 -1bab18 -1bab0c -1bab00 -1baaf4 -1baad8 -1ba988 -1ba97c -1ba970 -1ba964 -1ba958 -1ba94c -1ba940 -1ba918 -1ba580 -1ba4c0 -1ba498 -1ae0c8 -1ae060 -1ae048 -1abcec -1abc48 -1abb8c -1abb30 -1ababc -1ab644 -1ab5a8 -1ab58c -1ab50c -1ab488 -1ab3f0 -1ab38c -1ab348 -1ab31c -1ab300 -1ab290 -1ab220 -1ab084 -1ab04c -1aafc8 -1aaf64 -1a8d14 -1a8c30 -1a8290 -1a8284 -1a8168 -1a8014 -1a7f10 -1a7eb8 -1a7dc8 -1a7d5c -1a7bf0 -1a7b70 -1a7b3c -1a7b0c -1a7a1c -1a7980 -1a7910 -1a783c -1a77a0 -1a7718 -1a769c -1a7620 -1a75dc -1a75bc -1a7518 -1a7500 -1a74c0 -1a7440 -1a7434 -1a7428 -1a311c -1a3010 -1a2ff8 -1a2fa0 -1a2f4c -1a2f18 -1a2eec -1a2edc -1a2e98 -1a2df8 -1a2d00 -1a2b80 -1a2b58 -1a2b30 -1a2b04 -1a2a80 -1a2a20 -1a29e0 -1a29c0 -1a2990 -1a296c -1a1d70 -1a1d48 -1a1d38 -1a1d18 -1a1c9c -1a1c50 -1a1c10 -1a1be8 -1a1bbc -1a1b74 -1a1af8 -1a1a58 -1a1968 -1a18d8 -1a186c -1a1850 -1a1804 -1a17dc -1a1768 -1a173c -1a1714 -1a16d0 -1a16a4 -1a1680 -1a1620 -1a15b8 -1a156c -1a1524 -1a1494 -1a1464 -1a1440 -1a1430 -1a1414 -1a1350 -1a12c4 -1a126c -1a1250 -1a11f8 -1a11b4 -1a11a4 -1a110c -1a10f8 -1a1078 -1a1018 -1a0fd4 -1a0fb0 -1a0fa4 -1a0f98 -1a0f74 -1a0f68 -1a0f5c -1a0f50 -1a0f44 -1a0f38 -1a0f2c -1a0f20 -1a0f14 -1a0f08 -1a0efc -1a0ef0 -1a0ee4 -1a0ed8 -1a0ec8 -1a0eb8 -1a0ea8 -1a0e9c -1a0e90 -1a0e84 -1a0e78 -1a0e6c -1a0e60 -1a0e54 -1a0e48 -1a0e3c -1a0e30 -1a0e24 -1a0e18 -1a0e0c -1a0e00 -1a0df4 -1a0de8 -1a0ddc -1a0dd0 -1a0da4 \ No newline at end of file From c2de51e743379291abf8ba68e96e6afe4e065342 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 20:19:56 -0400 Subject: [PATCH 58/79] Fixed failed generations. Finished refactor. --- worlds/mlss/Client.py | 138 +-- worlds/mlss/Data.py | 619 +++++++------ worlds/mlss/Items.py | 2 +- worlds/mlss/Locations.py | 1387 +++++++++++++++-------------- worlds/mlss/Names/LocationName.py | 10 +- worlds/mlss/Options.py | 22 + worlds/mlss/Regions.py | 238 ++++- worlds/mlss/Rom.py | 223 ++--- worlds/mlss/Rules.py | 804 +++++++++++------ worlds/mlss/StateLogic.py | 88 +- worlds/mlss/__init__.py | 35 +- 11 files changed, 2013 insertions(+), 1553 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 3dff7c6ffd5f..7b963cc3262f 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -13,7 +13,8 @@ if TYPE_CHECKING: from worlds._bizhawk.context import BizHawkClientContext -ROOM_ARRAY_POINTER = 0x51fa00 +ROOM_ARRAY_POINTER = 0x51FA00 + class MLSSClient(BizHawkClient): game = "Mario & Luigi Superstar Saga" @@ -39,20 +40,25 @@ def __init__(self) -> None: async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: from CommonClient import logger + try: # Check ROM name/patch version - rom_name_bytes = (await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")])) + rom_name_bytes = await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")]) rom_name = bytes([byte for byte in rom_name_bytes[0] if byte != 0]).decode("UTF-8") if not rom_name.startswith("MARIO&LUIGIU"): return False if rom_name == "MARIO&LUIGIUA8": - logger.info("ERROR: You appear to be running an unpatched version of Mario & Luigi Superstar Saga. " - "You need to generate a patch file and use it to create a patched ROM.") + logger.info( + "ERROR: You appear to be running an unpatched version of Mario & Luigi Superstar Saga. " + "You need to generate a patch file and use it to create a patched ROM." + ) return False if rom_name != "MARIO&LUIGIUAP": - logger.info("ERROR: The patch file used to create this ROM is not compatible with " - "this client. Double check your client version against the version being " - "used by the generator.") + logger.info( + "ERROR: The patch file used to create this ROM is not compatible with " + "this client. Double check your client version against the version being " + "used by the generator." + ) return False except UnicodeDecodeError: return False @@ -65,7 +71,7 @@ async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: ctx.watcher_timeout = 0.125 self.rom_slot_name = rom_name self.seed_verify = False - name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xDF0000, 16, "ROM")]))[0]) + name_bytes = (await bizhawk.read(ctx.bizhawk_ctx, [(0xDF0000, 16, "ROM")]))[0] name = bytes([byte for byte in name_bytes if byte != 0]).decode("UTF-8") self.player_name = name @@ -78,11 +84,12 @@ async def set_auth(self, ctx: "BizHawkClientContext") -> None: ctx.auth = self.player_name def on_package(self, ctx, cmd, args) -> None: - if cmd == 'RoomInfo': - ctx.seed_name = args['seed_name'] + if cmd == "RoomInfo": + ctx.seed_name = args["seed_name"] async def game_watcher(self, ctx: "BizHawkClientContext") -> None: from CommonClient import logger + try: if ctx.seed_name is None: return @@ -90,28 +97,39 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: seed = await bizhawk.read(ctx.bizhawk_ctx, [(0xDF00A0, len(ctx.seed_name), "ROM")]) seed = seed[0].decode("UTF-8") if seed != ctx.seed_name: - logger.info("ERROR: The ROM you loaded is for a different game of AP. " - "Please make sure the host has sent you the correct patch file," - "and that you have opened the correct ROM.") + logger.info( + "ERROR: The ROM you loaded is for a different game of AP. " + "Please make sure the host has sent you the correct patch file," + "and that you have opened the correct ROM." + ) raise bizhawk.ConnectorError("Loaded ROM is for Incorrect lobby.") self.seed_verify = True - read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), - (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), - (0x304A, 1, "EWRAM"), (0x304B, 1, "EWRAM"), - (0x304C, 4, "EWRAM"), (0x3060, 6, "EWRAM"), - (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), - (0x2339, 1, "IWRAM")]) + read_state = await bizhawk.read( + ctx.bizhawk_ctx, + [ + (0x4564, 59, "EWRAM"), + (0x2330, 2, "IWRAM"), + (0x3FE0, 1, "IWRAM"), + (0x304A, 1, "EWRAM"), + (0x304B, 1, "EWRAM"), + (0x304C, 4, "EWRAM"), + (0x3060, 6, "EWRAM"), + (0x4808, 2, "EWRAM"), + (0x4407, 1, "EWRAM"), + (0x2339, 1, "IWRAM"), + ], + ) flags = read_state[0] - current_room = int.from_bytes(read_state[1], 'little') + current_room = int.from_bytes(read_state[1], "little") shop_init = read_state[2][0] shop_scroll = read_state[3][0] & 0x1F - is_buy = (read_state[4][0] != 0) - shop_address = (struct.unpack(' None: # Checking shop purchases if is_buy: await bizhawk.write(ctx.bizhawk_ctx, [(0x304A, [0x0, 0x0], "EWRAM")]) - if shop_address != 0x3c0618 and shop_address != 0x3c0684: + if shop_address != 0x3C0618 and shop_address != 0x3C0684: location = shop[shop_address][shop_scroll] else: if shop_init & 0x1 != 0: @@ -139,8 +157,14 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: b = await bizhawk.guarded_read(ctx.bizhawk_ctx, [(0x3057, 1, "EWRAM")], [(0x3057, [0x0], "EWRAM")]) if b is None: break - 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")]) - await asyncio.sleep(.1) + 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"), + ], + ) + await asyncio.sleep(0.1) # Early return and location send if you are currently in a shop, # since other flags aren't going to change @@ -149,10 +173,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: 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) - }]) + await ctx.send_msgs([{"cmd": "LocationChecks", "locations": list(locs_to_send)}]) return # Checking flags that aren't digspots or blocks @@ -167,13 +188,17 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: return if flag_byte & mask != 0: if location >= 0xDA0000: - await ctx.send_msgs([{ - "cmd": "Set", - "key": f"mlss_flag_{ctx.team}_{ctx.slot}", - "default": 0, - "want_reply": False, - "operations": [{"operation": "or", "value": 1 << (location - 0xDA0000)}] - }]) + await ctx.send_msgs( + [ + { + "cmd": "Set", + "key": f"mlss_flag_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "or", "value": 1 << (location - 0xDA0000)}], + } + ] + ) continue if location in roomException: if current_room not in roomException[location]: @@ -201,9 +226,10 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if byte & and_value != 0: flag_id = byte_i * 8 + (j + 1) room, item = find_key(roomCount, flag_id) - pointer_arr = await bizhawk.read(ctx.bizhawk_ctx, - [(ROOM_ARRAY_POINTER + ((room - 1) * 4), 4, "ROM")]) - pointer = (struct.unpack(' None: locs_to_send.add(pointer) if not ctx.finished_game and cackletta != 0 and current_room == 0x1C7: - await ctx.send_msgs([{ - "cmd": "StatusUpdate", - "status": ClientStatus.CLIENT_GOAL - }]) - - await ctx.send_msgs([{ - "cmd": "Set", - "key": f"mlss_room_{ctx.team}_{ctx.slot}", - "default": 0, - "want_reply": False, - "operations": [{"operation": "replace", "value": current_room}] - }]) + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + + await ctx.send_msgs( + [ + { + "cmd": "Set", + "key": f"mlss_room_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "replace", "value": current_room}], + } + ] + ) # Send locations if there are any to send. 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) - }]) + await ctx.send_msgs([{"cmd": "LocationChecks", "locations": list(locs_to_send)}]) except bizhawk.RequestFailedError: # Exit handler and return to main loop to reconnect. diff --git a/worlds/mlss/Data.py b/worlds/mlss/Data.py index 6dc39dec310a..840589e6efa8 100644 --- a/worlds/mlss/Data.py +++ b/worlds/mlss/Data.py @@ -1,13 +1,6 @@ -flying = [ - 0x14, - 0x1D, - 0x4C -] +flying = [0x14, 0x1D, 0x4C] -pestnut = [ - 0x20, - 0x34 -] +pestnut = [0x20, 0x34] enemies = [ 0x5030EC, @@ -153,7 +146,7 @@ 0x50468C, 0x5046CC, 0x5046EC, - 0x50470C + 0x50470C, ] bosses = [ @@ -177,7 +170,7 @@ 0x50438C, 0x5045CC, 0x5045EC, - 0x50460C + 0x50460C, ] bowsers = [ @@ -207,305 +200,305 @@ ] sounds = [ - 0x1da51c, - 0x1da478, - 0x1da430, - 0x1da420, - 0x1da404, - 0x1da3e8, - 0x1da330, - 0x1da1e0, - 0x1da1b4, - 0x1da13c, - 0x1da0c8, - 0x1d9fec, - 0x1d9f10, - 0x1d9e78, - 0x1d9cec, - 0x1d9cdc, - 0x1d9cd0, - 0x1d9cc4, - 0x1d9cb8, - 0x1d9cac, - 0x1d9ca0, - 0x1d9c94, - 0x1d9c88, - 0x1d9c1c, - 0x1d93a4, - 0x1d926c, - 0x1d91d4, - 0x1d9134, - 0x1d9108, - 0x1d9094, - 0x1d9020, - 0x1d8f48, - 0x1d8f3c, - 0x1d8f30, - 0x1d8f14, - 0x1d8f08, - 0x1d8efc, - 0x1d8ef0, - 0x1bc330, - 0x1bc324, - 0x1bc318, - 0x1bc30c, - 0x1bc300, - 0x1bc2f4, - 0x1bc2a4, - 0x1bc210, - 0x1bc18c, - 0x1bc124, - 0x1bc088, - 0x1bc06c, - 0x1bbffc, - 0x1bbf8c, - 0x1bbeb8, - 0x1bbde4, - 0x1bbd34, - 0x1bbd14, - 0x1bbc14, - 0x1bbbd8, - 0x1bbb60, - 0x1bbb0c, - 0x1bba5c, - 0x1bb9b8, - 0x1bb9a0, - 0x1bb8e4, - 0x1bb89c, - 0x1bb880, - 0x1bb704, - 0x1bb6e8, - 0x1bb6dc, - 0x1bb6d0, - 0x1bb6c4, - 0x1bb6b8, - 0x1bb6ac, - 0x1bb6a0, - 0x1bb694, - 0x1bb688, - 0x1bb67c, - 0x1bb66c, - 0x1bb660, - 0x1bb654, - 0x1bb648, - 0x1bb63c, - 0x1bb630, - 0x1bb624, - 0x1bb618, - 0x1bb60c, - 0x1bb600, - 0x1bb5f4, - 0x1bb5e8, - 0x1bb5dc, - 0x1bb5d0, - 0x1bb5c4, - 0x1bb5b8, - 0x1bb5ac, - 0x1bb580, - 0x1bb574, - 0x1bb558, - 0x1bb54c, - 0x1bb540, - 0x1bb534, - 0x1bb528, - 0x1bb51c, - 0x1bb510, - 0x1bb504, - 0x1bb4f8, - 0x1bb4ec, - 0x1bb4e0, - 0x1bb4d4, - 0x1bb4c8, - 0x1bb4bc, - 0x1bb4b0, - 0x1bb4a4, - 0x1bb408, - 0x1bb398, - 0x1bb2e0, - 0x1bb270, - 0x1bb14c, - 0x1bb140, - 0x1bb134, - 0x1bb128, - 0x1bb11c, - 0x1bb110, - 0x1baf84, - 0x1bac0c, - 0x1bab3c, - 0x1bab24, - 0x1bab18, - 0x1bab0c, - 0x1bab00, - 0x1baaf4, - 0x1baad8, - 0x1ba988, - 0x1ba97c, - 0x1ba970, - 0x1ba964, - 0x1ba958, - 0x1ba94c, - 0x1ba940, - 0x1ba918, - 0x1ba580, - 0x1ba4c0, - 0x1ba498, - 0x1ae0c8, - 0x1ae060, - 0x1ae048, - 0x1abcec, - 0x1abc48, - 0x1abb8c, - 0x1abb30, - 0x1ababc, - 0x1ab644, - 0x1ab5a8, - 0x1ab58c, - 0x1ab50c, - 0x1ab488, - 0x1ab3f0, - 0x1ab38c, - 0x1ab348, - 0x1ab31c, - 0x1ab300, - 0x1ab290, - 0x1ab220, - 0x1ab084, - 0x1ab04c, - 0x1aafc8, - 0x1aaf64, - 0x1a8d14, - 0x1a8c30, - 0x1a8290, - 0x1a8284, - 0x1a8168, - 0x1a8014, - 0x1a7f10, - 0x1a7eb8, - 0x1a7dc8, - 0x1a7d5c, - 0x1a7bf0, - 0x1a7b70, - 0x1a7b3c, - 0x1a7b0c, - 0x1a7a1c, - 0x1a7980, - 0x1a7910, - 0x1a783c, - 0x1a77a0, - 0x1a7718, - 0x1a769c, - 0x1a7620, - 0x1a75dc, - 0x1a75bc, - 0x1a7518, - 0x1a7500, - 0x1a74c0, - 0x1a7440, - 0x1a7434, - 0x1a7428, - 0x1a311c, - 0x1a3010, - 0x1a2ff8, - 0x1a2fa0, - 0x1a2f4c, - 0x1a2f18, - 0x1a2eec, - 0x1a2edc, - 0x1a2e98, - 0x1a2df8, - 0x1a2d00, - 0x1a2b80, - 0x1a2b58, - 0x1a2b30, - 0x1a2b04, - 0x1a2a80, - 0x1a2a20, - 0x1a29e0, - 0x1a29c0, - 0x1a2990, - 0x1a296c, - 0x1a1d70, - 0x1a1d48, - 0x1a1d38, - 0x1a1d18, - 0x1a1c9c, - 0x1a1c50, - 0x1a1c10, - 0x1a1be8, - 0x1a1bbc, - 0x1a1b74, - 0x1a1af8, - 0x1a1a58, - 0x1a1968, - 0x1a18d8, - 0x1a186c, - 0x1a1850, - 0x1a1804, - 0x1a17dc, - 0x1a1768, - 0x1a173c, - 0x1a1714, - 0x1a16d0, - 0x1a16a4, - 0x1a1680, - 0x1a1620, - 0x1a15b8, - 0x1a156c, - 0x1a1524, - 0x1a1494, - 0x1a1464, - 0x1a1440, - 0x1a1430, - 0x1a1414, - 0x1a1350, - 0x1a12c4, - 0x1a126c, - 0x1a1250, - 0x1a11f8, - 0x1a11b4, - 0x1a11a4, - 0x1a110c, - 0x1a10f8, - 0x1a1078, - 0x1a1018, - 0x1a0fd4, - 0x1a0fb0, - 0x1a0fa4, - 0x1a0f98, - 0x1a0f74, - 0x1a0f68, - 0x1a0f5c, - 0x1a0f50, - 0x1a0f44, - 0x1a0f38, - 0x1a0f2c, - 0x1a0f20, - 0x1a0f14, - 0x1a0f08, - 0x1a0efc, - 0x1a0ef0, - 0x1a0ee4, - 0x1a0ed8, - 0x1a0ec8, - 0x1a0eb8, - 0x1a0ea8, - 0x1a0e9c, - 0x1a0e90, - 0x1a0e84, - 0x1a0e78, - 0x1a0e6c, - 0x1a0e60, - 0x1a0e54, - 0x1a0e48, - 0x1a0e3c, - 0x1a0e30, - 0x1a0e24, - 0x1a0e18, - 0x1a0e0c, - 0x1a0e00, - 0x1a0df4, - 0x1a0de8, - 0x1a0ddc, - 0x1a0dd0, - 0x1a0da4, -] \ No newline at end of file + 0x1DA51C, + 0x1DA478, + 0x1DA430, + 0x1DA420, + 0x1DA404, + 0x1DA3E8, + 0x1DA330, + 0x1DA1E0, + 0x1DA1B4, + 0x1DA13C, + 0x1DA0C8, + 0x1D9FEC, + 0x1D9F10, + 0x1D9E78, + 0x1D9CEC, + 0x1D9CDC, + 0x1D9CD0, + 0x1D9CC4, + 0x1D9CB8, + 0x1D9CAC, + 0x1D9CA0, + 0x1D9C94, + 0x1D9C88, + 0x1D9C1C, + 0x1D93A4, + 0x1D926C, + 0x1D91D4, + 0x1D9134, + 0x1D9108, + 0x1D9094, + 0x1D9020, + 0x1D8F48, + 0x1D8F3C, + 0x1D8F30, + 0x1D8F14, + 0x1D8F08, + 0x1D8EFC, + 0x1D8EF0, + 0x1BC330, + 0x1BC324, + 0x1BC318, + 0x1BC30C, + 0x1BC300, + 0x1BC2F4, + 0x1BC2A4, + 0x1BC210, + 0x1BC18C, + 0x1BC124, + 0x1BC088, + 0x1BC06C, + 0x1BBFFC, + 0x1BBF8C, + 0x1BBEB8, + 0x1BBDE4, + 0x1BBD34, + 0x1BBD14, + 0x1BBC14, + 0x1BBBD8, + 0x1BBB60, + 0x1BBB0C, + 0x1BBA5C, + 0x1BB9B8, + 0x1BB9A0, + 0x1BB8E4, + 0x1BB89C, + 0x1BB880, + 0x1BB704, + 0x1BB6E8, + 0x1BB6DC, + 0x1BB6D0, + 0x1BB6C4, + 0x1BB6B8, + 0x1BB6AC, + 0x1BB6A0, + 0x1BB694, + 0x1BB688, + 0x1BB67C, + 0x1BB66C, + 0x1BB660, + 0x1BB654, + 0x1BB648, + 0x1BB63C, + 0x1BB630, + 0x1BB624, + 0x1BB618, + 0x1BB60C, + 0x1BB600, + 0x1BB5F4, + 0x1BB5E8, + 0x1BB5DC, + 0x1BB5D0, + 0x1BB5C4, + 0x1BB5B8, + 0x1BB5AC, + 0x1BB580, + 0x1BB574, + 0x1BB558, + 0x1BB54C, + 0x1BB540, + 0x1BB534, + 0x1BB528, + 0x1BB51C, + 0x1BB510, + 0x1BB504, + 0x1BB4F8, + 0x1BB4EC, + 0x1BB4E0, + 0x1BB4D4, + 0x1BB4C8, + 0x1BB4BC, + 0x1BB4B0, + 0x1BB4A4, + 0x1BB408, + 0x1BB398, + 0x1BB2E0, + 0x1BB270, + 0x1BB14C, + 0x1BB140, + 0x1BB134, + 0x1BB128, + 0x1BB11C, + 0x1BB110, + 0x1BAF84, + 0x1BAC0C, + 0x1BAB3C, + 0x1BAB24, + 0x1BAB18, + 0x1BAB0C, + 0x1BAB00, + 0x1BAAF4, + 0x1BAAD8, + 0x1BA988, + 0x1BA97C, + 0x1BA970, + 0x1BA964, + 0x1BA958, + 0x1BA94C, + 0x1BA940, + 0x1BA918, + 0x1BA580, + 0x1BA4C0, + 0x1BA498, + 0x1AE0C8, + 0x1AE060, + 0x1AE048, + 0x1ABCEC, + 0x1ABC48, + 0x1ABB8C, + 0x1ABB30, + 0x1ABABC, + 0x1AB644, + 0x1AB5A8, + 0x1AB58C, + 0x1AB50C, + 0x1AB488, + 0x1AB3F0, + 0x1AB38C, + 0x1AB348, + 0x1AB31C, + 0x1AB300, + 0x1AB290, + 0x1AB220, + 0x1AB084, + 0x1AB04C, + 0x1AAFC8, + 0x1AAF64, + 0x1A8D14, + 0x1A8C30, + 0x1A8290, + 0x1A8284, + 0x1A8168, + 0x1A8014, + 0x1A7F10, + 0x1A7EB8, + 0x1A7DC8, + 0x1A7D5C, + 0x1A7BF0, + 0x1A7B70, + 0x1A7B3C, + 0x1A7B0C, + 0x1A7A1C, + 0x1A7980, + 0x1A7910, + 0x1A783C, + 0x1A77A0, + 0x1A7718, + 0x1A769C, + 0x1A7620, + 0x1A75DC, + 0x1A75BC, + 0x1A7518, + 0x1A7500, + 0x1A74C0, + 0x1A7440, + 0x1A7434, + 0x1A7428, + 0x1A311C, + 0x1A3010, + 0x1A2FF8, + 0x1A2FA0, + 0x1A2F4C, + 0x1A2F18, + 0x1A2EEC, + 0x1A2EDC, + 0x1A2E98, + 0x1A2DF8, + 0x1A2D00, + 0x1A2B80, + 0x1A2B58, + 0x1A2B30, + 0x1A2B04, + 0x1A2A80, + 0x1A2A20, + 0x1A29E0, + 0x1A29C0, + 0x1A2990, + 0x1A296C, + 0x1A1D70, + 0x1A1D48, + 0x1A1D38, + 0x1A1D18, + 0x1A1C9C, + 0x1A1C50, + 0x1A1C10, + 0x1A1BE8, + 0x1A1BBC, + 0x1A1B74, + 0x1A1AF8, + 0x1A1A58, + 0x1A1968, + 0x1A18D8, + 0x1A186C, + 0x1A1850, + 0x1A1804, + 0x1A17DC, + 0x1A1768, + 0x1A173C, + 0x1A1714, + 0x1A16D0, + 0x1A16A4, + 0x1A1680, + 0x1A1620, + 0x1A15B8, + 0x1A156C, + 0x1A1524, + 0x1A1494, + 0x1A1464, + 0x1A1440, + 0x1A1430, + 0x1A1414, + 0x1A1350, + 0x1A12C4, + 0x1A126C, + 0x1A1250, + 0x1A11F8, + 0x1A11B4, + 0x1A11A4, + 0x1A110C, + 0x1A10F8, + 0x1A1078, + 0x1A1018, + 0x1A0FD4, + 0x1A0FB0, + 0x1A0FA4, + 0x1A0F98, + 0x1A0F74, + 0x1A0F68, + 0x1A0F5C, + 0x1A0F50, + 0x1A0F44, + 0x1A0F38, + 0x1A0F2C, + 0x1A0F20, + 0x1A0F14, + 0x1A0F08, + 0x1A0EFC, + 0x1A0EF0, + 0x1A0EE4, + 0x1A0ED8, + 0x1A0EC8, + 0x1A0EB8, + 0x1A0EA8, + 0x1A0E9C, + 0x1A0E90, + 0x1A0E84, + 0x1A0E78, + 0x1A0E6C, + 0x1A0E60, + 0x1A0E54, + 0x1A0E48, + 0x1A0E3C, + 0x1A0E30, + 0x1A0E24, + 0x1A0E18, + 0x1A0E0C, + 0x1A0E00, + 0x1A0DF4, + 0x1A0DE8, + 0x1A0DDC, + 0x1A0DD0, + 0x1A0DA4, +] diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index 0baae479d3db..0d115eff0e54 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -183,7 +183,7 @@ class MLSSItem(Item): "Green Pepper": 2, "Hoo Bean": 100, "Chuckle Bean": 200, - "Hammers": 3 + "Hammers": 3, } item_table: typing.Dict[str, ItemData] = {item.itemName: item for item in itemList} diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 2bd57eeed25b..1301d2117acf 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -76,707 +76,699 @@ class MLSSLocation(Location): 0x39E983, 0x39E9A0, 0x39EC40, - 0x39EC4D + 0x39EC4D, ] mainArea: typing.List[LocationData] = [ - 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("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 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 Bean Fruit 7", 0x1E9431, 2), + LocationData("Hoohoo Village Mole Behind Turtle", 0x277AB2, 1), LocationData("Beanbean Outskirts Thunderhand 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 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) + 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("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", 0x39e455, 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("Joke's End Second Floor West Room Coin Block", 0x39e771, 0), - LocationData("Joke's End North of Bridge Room Coin Block", 0x39e836, 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), + 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("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", 0x39E455, 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("Joke's End Second Floor West Room Coin Block", 0x39E771, 0), + LocationData("Joke's End North of Bridge Room Coin Block", 0x39E836, 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), - 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 (Rightside)", 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) + 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 (Rightside)", 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), - 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) + 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), - 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("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) + 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), - 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 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 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 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 6", 0x25170B, 1), LocationData("Beanbean Castle Town Beanstone 7", 0x251767, 1), - LocationData("Beanbean Castle Town Beanstone 8", 0x2517c3, 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 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("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) + LocationData("Beanbean Castle Town Beanlet Reward", 0x2515EB, 1), ] -eReward: typing.List[int] = [ - 0x253515, - 0x253776, - 0x253c70, - 0x254324, - 0x254718, - 0x254a34, - 0x254e24 -] +eReward: typing.List[int] = [0x253515, 0x253776, 0x253C70, 0x254324, 0x254718, 0x254A34, 0x254E24] startingFlag: typing.List[LocationData] = [ - 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) + 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), - 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) + 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), - 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) + 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 Enter Fungitown Flag 1", 0x3c0640, 2), - LocationData("Badge Shop Enter Fungitown Flag 2", 0x3c0642, 2), - LocationData("Badge Shop Enter Fungitown Flag 3", 0x3c0644, 2), - LocationData("Pants Shop Enter Fungitown Flag 1", 0x3c0646, 2), - LocationData("Pants Shop Enter Fungitown Flag 2", 0x3c0648, 2), - LocationData("Pants Shop Enter Fungitown Flag 3", 0x3c064a, 2), - LocationData("Shop Enter Fungitown Flag 1", 0x3c0606, 3), - LocationData("Shop Enter Fungitown Flag 2", 0x3c0608, 3) + LocationData("Badge Shop Enter Fungitown Flag 1", 0x3C0640, 2), + LocationData("Badge Shop Enter Fungitown Flag 2", 0x3C0642, 2), + LocationData("Badge Shop Enter Fungitown Flag 3", 0x3C0644, 2), + LocationData("Pants Shop Enter Fungitown Flag 1", 0x3C0646, 2), + LocationData("Pants Shop Enter Fungitown Flag 2", 0x3C0648, 2), + LocationData("Pants Shop Enter Fungitown Flag 3", 0x3C064A, 2), + LocationData("Shop Enter Fungitown Flag 1", 0x3C0606, 3), + LocationData("Shop Enter Fungitown Flag 2", 0x3C0608, 3), ] beanstarFlag: typing.List[LocationData] = [ - 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) + 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), - 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) + 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), - 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) + 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), - 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) + 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), - 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) + 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("Oho Ocean North Whirlpool Block 1", 0x39e0a5, 0), - LocationData("Oho Ocean North Whirlpool Block 2", 0x39e0ad, 0), - LocationData("Oho Ocean North Whirlpool Block 3", 0x39e0b5, 0), - LocationData("Oho Ocean North Whirlpool Block 4", 0x39e0bd, 0), - LocationData("Oho Ocean North Whirlpool Digspot 1", 0x39e0c5, 0), - LocationData("Oho Ocean North Whirlpool Digspot 2", 0x39e0cd, 0), - LocationData("Oho Ocean Fire Puzzle Room Digspot", 0x39e057, 0), - LocationData("Oho Ocean South Whirlpool Digspot 1", 0x39e0da, 0), - LocationData("Oho Ocean South Whirlpool Digspot 2", 0x39e0e2, 0), - LocationData("Oho Ocean South Whirlpool Digspot 3", 0x39e0ea, 0), - LocationData("Oho Ocean South Whirlpool Digspot 4", 0x39e0f2, 0), - LocationData("Oho Ocean South Whirlpool Digspot 5", 0x39e0fa, 0), - LocationData("Oho Ocean South Whirlpool Digspot 6", 0x39e102, 0), - LocationData("Oho Ocean South Whirlpool Room 2 Digspot", 0x39e10f, 0), - LocationData("Joke's End Pipe Digspot", 0x39e6c2, 0), - LocationData("Joke's End Staircase Digspot", 0x39e6cf, 0), - LocationData("Surf Minigame", 0x2753ea, 1), + LocationData("Oho Ocean North Whirlpool Block 1", 0x39E0A5, 0), + LocationData("Oho Ocean North Whirlpool Block 2", 0x39E0AD, 0), + LocationData("Oho Ocean North Whirlpool Block 3", 0x39E0B5, 0), + LocationData("Oho Ocean North Whirlpool Block 4", 0x39E0BD, 0), + LocationData("Oho Ocean North Whirlpool Digspot 1", 0x39E0C5, 0), + LocationData("Oho Ocean North Whirlpool Digspot 2", 0x39E0CD, 0), + LocationData("Oho Ocean Fire Puzzle Room Digspot", 0x39E057, 0), + LocationData("Oho Ocean South Whirlpool Digspot 1", 0x39E0DA, 0), + LocationData("Oho Ocean South Whirlpool Digspot 2", 0x39E0E2, 0), + LocationData("Oho Ocean South Whirlpool Digspot 3", 0x39E0EA, 0), + LocationData("Oho Ocean South Whirlpool Digspot 4", 0x39E0F2, 0), + LocationData("Oho Ocean South Whirlpool Digspot 5", 0x39E0FA, 0), + LocationData("Oho Ocean South Whirlpool Digspot 6", 0x39E102, 0), + LocationData("Oho Ocean South Whirlpool Room 2 Digspot", 0x39E10F, 0), + LocationData("Joke's End Pipe Digspot", 0x39E6C2, 0), + LocationData("Joke's 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) + 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), - 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 Center Digspot 1", 0x39e323, 0), - LocationData("Airport Center Digspot 2", 0x39e32b, 0), - LocationData("Airport Center Digspot 3", 0x39e333, 0), - LocationData("Airport Center Digspot 4", 0x39e33b, 0), - LocationData("Airport Center Digspot 5", 0x39e343, 0), - LocationData("Airport Rightside Digspot 1", 0x39e350, 0), - LocationData("Airport Rightside Digspot 2", 0x39e358, 0), - LocationData("Airport Rightside Digspot 3", 0x39e360, 0), - LocationData("Airport Rightside Digspot 4", 0x39e368, 0), - LocationData("Airport Rightside Digspot 5", 0x39e370, 0) + 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 Center Digspot 1", 0x39E323, 0), + LocationData("Airport Center Digspot 2", 0x39E32B, 0), + LocationData("Airport Center Digspot 3", 0x39E333, 0), + LocationData("Airport Center Digspot 4", 0x39E33B, 0), + LocationData("Airport Center Digspot 5", 0x39E343, 0), + LocationData("Airport Rightside Digspot 1", 0x39E350, 0), + LocationData("Airport Rightside Digspot 2", 0x39E358, 0), + LocationData("Airport Rightside Digspot 3", 0x39E360, 0), + LocationData("Airport Rightside Digspot 4", 0x39E368, 0), + LocationData("Airport Rightside Digspot 5", 0x39E370, 0), ] gwarharEntrance: typing.List[LocationData] = [ - 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) + 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), - 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) + 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), - 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 Hammer Rock Block 1", 0x39e580, 0), - LocationData("Teehee Valley Past Ultra Hammer Rock Block 2", 0x39e590, 0), - LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 1", 0x39e598, 0), - LocationData("Teehee Valley Past Ultra Hammer Rock 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) + 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 Hammer Rock Block 1", 0x39E580, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock Block 2", 0x39E590, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 1", 0x39E598, 0), + LocationData("Teehee Valley Past Ultra Hammer Rock 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), - 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) + 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), - 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) + 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), - 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) + 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), - 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) + 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), - 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) + 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("Joke's End West of First Boiler Room Block 1", 0x39e6e5, 0), - LocationData("Joke's End West of First Boiler Room Block 2", 0x39e6ed, 0), - LocationData("Joke's End First Boiler Room Digspot 1", 0x39e6fa, 0), - LocationData("Joke's End First Boiler Room Digspot 2", 0x39e702, 0), - LocationData("Joke's End Second Floor West Room Block 1", 0x39e761, 0), - LocationData("Joke's End Second Floor West Room Block 2", 0x39e769, 0), - LocationData("Joke's End Second Floor West Room Block 3", 0x39e779, 0), - LocationData("Joke's End Second Floor West Room Block 4", 0x39e781, 0), - LocationData("Joke's End Mole Reward 1", 0x27788e, 1), - LocationData("Joke's End Mole Reward 2", 0x2778d2, 1) + LocationData("Joke's End West of First Boiler Room Block 1", 0x39E6E5, 0), + LocationData("Joke's End West of First Boiler Room Block 2", 0x39E6ED, 0), + LocationData("Joke's End First Boiler Room Digspot 1", 0x39E6FA, 0), + LocationData("Joke's End First Boiler Room Digspot 2", 0x39E702, 0), + LocationData("Joke's End Second Floor West Room Block 1", 0x39E761, 0), + LocationData("Joke's End Second Floor West Room Block 2", 0x39E769, 0), + LocationData("Joke's End Second Floor West Room Block 3", 0x39E779, 0), + LocationData("Joke's End Second Floor West Room Block 4", 0x39E781, 0), + LocationData("Joke's End Mole Reward 1", 0x27788E, 1), + LocationData("Joke's End Mole Reward 2", 0x2778D2, 1), ] jokesMain: typing.List[LocationData] = [ - LocationData("Joke's End Furnace Room 1 Block 1", 0x39e70f, 0), - LocationData("Joke's End Furnace Room 1 Block 2", 0x39e717, 0), - LocationData("Joke's End Furnace Room 1 Block 3", 0x39e71f, 0), - LocationData("Joke's End Northeast of Boiler Room 1 Block", 0x39e732, 0), - LocationData("Joke's End Northeast of Boiler Room 3 Digspot", 0x39e73f, 0), - LocationData("Joke's End Northeast of Boiler Room 2 Block", 0x39e74c, 0), - LocationData("Joke's End Northeast of Boiler Room 2 Digspot", 0x39e754, 0), - LocationData("Joke's End Second Floor East Room Digspot", 0x39e794, 0), - LocationData("Joke's End Final Split up Room Digspot", 0x39e7a7, 0), - LocationData("Joke's End South of Bridge Room Block", 0x39e7b4, 0), - LocationData("Joke's End Solo Luigi Room 1 Block", 0x39e7c4, 0), - LocationData("Joke's End Solo Luigi Room 1 Digspot", 0x39e7cc, 0), - LocationData("Joke's End Solo Mario Final Room Block 1", 0x39e7d9, 0), - LocationData("Joke's End Solo Mario Final Room Block 2", 0x39e7e1, 0), - LocationData("Joke's End Solo Mario Final Room Block 3", 0x39e7e9, 0), - LocationData("Joke's End Solo Luigi Room 2 Digspot", 0x39e7fc, 0), - LocationData("Joke's End Solo Mario Room 1 Digspot", 0x39e809, 0), - LocationData("Joke's End Solo Mario Room 2 Block 1", 0x39e819, 0), - LocationData("Joke's End Solo Mario Room 2 Block 2", 0x39e821, 0), - LocationData("Joke's End Solo Mario Room 2 Block 3", 0x39e829, 0), - LocationData("Joke's End Second Boiler Room Digspot 1", 0x39e84f, 0), - LocationData("Joke's End Second Boiler Room Digspot 2", 0x39e857, 0), - LocationData("Joke's End North of Second Boiler Room Block 1", 0x39e864, 0), - LocationData("Joke's End North of Second Boiler Room Block 2", 0x39e86c, 0), - LocationData("Joke's End Before Jojora Room Block 1", 0x39e927, 0), - LocationData("Joke's End Before Jojora Room Block 2", 0x39e92f, 0), - LocationData("Joke's End Before Jojora Room Digspot", 0x39e937, 0), - LocationData("Joke's End Jojora Room Digspot", 0x39e944, 0) + LocationData("Joke's End Furnace Room 1 Block 1", 0x39E70F, 0), + LocationData("Joke's End Furnace Room 1 Block 2", 0x39E717, 0), + LocationData("Joke's End Furnace Room 1 Block 3", 0x39E71F, 0), + LocationData("Joke's End Northeast of Boiler Room 1 Block", 0x39E732, 0), + LocationData("Joke's End Northeast of Boiler Room 3 Digspot", 0x39E73F, 0), + LocationData("Joke's End Northeast of Boiler Room 2 Block", 0x39E74C, 0), + LocationData("Joke's End Northeast of Boiler Room 2 Digspot", 0x39E754, 0), + LocationData("Joke's End Second Floor East Room Digspot", 0x39E794, 0), + LocationData("Joke's End Final Split up Room Digspot", 0x39E7A7, 0), + LocationData("Joke's End South of Bridge Room Block", 0x39E7B4, 0), + LocationData("Joke's End Solo Luigi Room 1 Block", 0x39E7C4, 0), + LocationData("Joke's End Solo Luigi Room 1 Digspot", 0x39E7CC, 0), + LocationData("Joke's End Solo Mario Final Room Block 1", 0x39E7D9, 0), + LocationData("Joke's End Solo Mario Final Room Block 2", 0x39E7E1, 0), + LocationData("Joke's End Solo Mario Final Room Block 3", 0x39E7E9, 0), + LocationData("Joke's End Solo Luigi Room 2 Digspot", 0x39E7FC, 0), + LocationData("Joke's End Solo Mario Room 1 Digspot", 0x39E809, 0), + LocationData("Joke's End Solo Mario Room 2 Block 1", 0x39E819, 0), + LocationData("Joke's End Solo Mario Room 2 Block 2", 0x39E821, 0), + LocationData("Joke's End Solo Mario Room 2 Block 3", 0x39E829, 0), + LocationData("Joke's End Second Boiler Room Digspot 1", 0x39E84F, 0), + LocationData("Joke's End Second Boiler Room Digspot 2", 0x39E857, 0), + LocationData("Joke's End North of Second Boiler Room Block 1", 0x39E864, 0), + LocationData("Joke's End North of Second Boiler Room Block 2", 0x39E86C, 0), + LocationData("Joke's End Before Jojora Room Block 1", 0x39E927, 0), + LocationData("Joke's End Before Jojora Room Block 2", 0x39E92F, 0), + LocationData("Joke's End Before Jojora Room Digspot", 0x39E937, 0), + LocationData("Joke's End Jojora Room Digspot", 0x39E944, 0), ] postJokes: typing.List[LocationData] = [ - LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 2 (Post-Birdo)", 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) + LocationData("Teehee Valley Past Ultra Hammer Rock Digspot 2 (Post-Birdo)", 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), - LocationData("Yoshi Theater Red Yoshi", 0x240ebe, 1), - LocationData("Yoshi Theater Green Yoshi", 0x241afa, 1), - LocationData("Yoshi Theater Yellow Yoshi", 0x241c3c, 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) + 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), - 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) + 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), ] nonBlock = [ (0x434B, 0x1, 0x243844), # Farm Mole 1 - (0x434B, 0x1, 0x24387d), # Farm Mole 2 + (0x434B, 0x1, 0x24387D), # Farm Mole 2 (0x4373, 0x8, 0x2779C8), # Simulblock Mole (0x42F9, 0x4, 0x1E9403), # Hammers (0x434B, 0x10, 0x1E9435), # Solo Mario Mole 1 @@ -785,65 +777,65 @@ class MLSSLocation(Location): (0x4359, 0x40, 0x1E9405), # Ultra Hammers (0x42F9, 0x2, 0x1E9430), # Rose (0x434B, 0x4, 0x242888), # Solo Luigi Cave Mole - (0x4373, 0x20, 0x277ab2), # Hoohoo Village Turtle Mole - (0x432D, 0x20, 0x1e9431), # Piranha Bean - (0x434E, 0x2, 0x1e9411), # Secret Scroll 1 - (0x434E, 0x4, 0x1e9412), # Secret Scroll 2 + (0x4373, 0x20, 0x277AB2), # Hoohoo Village Turtle Mole + (0x432D, 0x20, 0x1E9431), # Piranha Bean + (0x434E, 0x2, 0x1E9411), # Secret Scroll 1 + (0x434E, 0x4, 0x1E9412), # Secret Scroll 2 (0x4375, 0x8, 0x260637), # Membership Card - (0x4373, 0x10, 0x277a45), # Teehee Valley Mole + (0x4373, 0x10, 0x277A45), # Teehee Valley Mole (0x434D, 0x8, 0x1E9444), # Harhall's Pants - (0x432E, 0x10, 0x1e9441), # Harhall Beanstar Piece - (0x434B, 0x8, 0x1e9434), # Outskirts Boo Statue Mole - (0x42FE, 0x2, 0x1e943E), # Red Goblet - (0x42FE, 0x4, 0x24e628), # Green Goblet + (0x432E, 0x10, 0x1E9441), # Harhall Beanstar Piece + (0x434B, 0x8, 0x1E9434), # Outskirts Boo Statue Mole + (0x42FE, 0x2, 0x1E943E), # Red Goblet + (0x42FE, 0x4, 0x24E628), # Green Goblet (0x4301, 0x10, 0x250621), # Red Chuckola Fruit - (0x42FE, 0x80, 0x24ed74), # Purple Chuckola Fruit - (0x4302, 0x4, 0x24ff18), # White Chuckola Fruit + (0x42FE, 0x80, 0x24ED74), # Purple Chuckola Fruit + (0x4302, 0x4, 0x24FF18), # White Chuckola Fruit (0x42FF, 0x8, 0x251347), # Beanlet 1 - (0x42FF, 0x20, 0x2513fb), # Beanlet 2 - (0x42FF, 0x10, 0x2513a1), # Beanlet 3 + (0x42FF, 0x20, 0x2513FB), # Beanlet 2 + (0x42FF, 0x10, 0x2513A1), # Beanlet 3 (0x42FF, 0x4, 0x251988), # Beanlet 4 - (0x42FF, 0x2, 0x25192e), # Beanlet 5 - (0x42FF, 0x1, 0x2515eb), # Beanlet Reward + (0x42FF, 0x2, 0x25192E), # Beanlet 5 + (0x42FF, 0x1, 0x2515EB), # Beanlet Reward (0x4371, 0x40, 0x253515), # Espresso 1 (0x4371, 0x80, 0x253776), # Espresso 2 - (0x4372, 0x1, 0x253c70), # Espresso 3 + (0x4372, 0x1, 0x253C70), # Espresso 3 (0x4372, 0x2, 0x254324), # Espresso 4 (0x4372, 0x4, 0x254718), # Espresso 5 - (0x4372, 0x8, 0x254a34), # Espresso 6 - (0x4372, 0x10, 0x254e24), # Espresso 7 - (0x472F, 0x1, 0x252d07), # Woohoo Blend - (0x472F, 0x2, 0x252d28), # Hoohoo Blend - (0x472F, 0x4, 0x252d49), # Chuckle Blend - (0x472F, 0x8, 0x252d6a), # Teehee Blend - (0x472F, 0x10, 0x252d8b), # Hoolumbian - (0x472F, 0x20, 0x252dac), # Chuckoccino - (0x472F, 0x40, 0x252dcd), # Teeheespresso - (0x430B, 0x10, 0x1e9433), # Extra Dress - (0x430B, 0x10, 0x1e9432), # Fake Beanstar - (0x430F, 0x1, 0x1e9440), # Popple Beanstar Piece + (0x4372, 0x8, 0x254A34), # Espresso 6 + (0x4372, 0x10, 0x254E24), # Espresso 7 + (0x472F, 0x1, 0x252D07), # Woohoo Blend + (0x472F, 0x2, 0x252D28), # Hoohoo Blend + (0x472F, 0x4, 0x252D49), # Chuckle Blend + (0x472F, 0x8, 0x252D6A), # Teehee Blend + (0x472F, 0x10, 0x252D8B), # Hoolumbian + (0x472F, 0x20, 0x252DAC), # Chuckoccino + (0x472F, 0x40, 0x252DCD), # Teeheespresso + (0x430B, 0x10, 0x1E9433), # Extra Dress + (0x430B, 0x10, 0x1E9432), # Fake Beanstar + (0x430F, 0x1, 0x1E9440), # Popple Beanstar Piece (0x467E, 0xFF, 0x261658), # Winkle Card - (0x4300, 0x40, 0x2578e7), # Brooch - (0x4375, 0x2, 0x2753ea), # Surf Minigame + (0x4300, 0x40, 0x2578E7), # Brooch + (0x4375, 0x2, 0x2753EA), # Surf Minigame (0x4373, 0x1, 0x277956), # North Whirlpool Mole - (0x4346, 0x40, 0x235a5b), # Green Pearl Bean - (0x4346, 0x80, 0x235c1c), # Red Pearl Bean - (0x4340, 0x20, 0x1e9443), # Hermie Beanstar Piece - (0x434A, 0x40, 0x1e9437), # Spangle - (0x434A, 0x80, 0x236e73), # Spangle Reward - (0x4373, 0x40, 0x277b1f), # Bowser's Castle Mole - (0x4372, 0x80, 0x27788e), # Jokes end Mole 1 - (0x4372, 0x80, 0x2778d2), # Jokes end Mole 2 + (0x4346, 0x40, 0x235A5B), # Green Pearl Bean + (0x4346, 0x80, 0x235C1C), # Red Pearl Bean + (0x4340, 0x20, 0x1E9443), # Hermie Beanstar Piece + (0x434A, 0x40, 0x1E9437), # Spangle + (0x434A, 0x80, 0x236E73), # Spangle Reward + (0x4373, 0x40, 0x277B1F), # Bowser's Castle Mole + (0x4372, 0x80, 0x27788E), # Jokes end Mole 1 + (0x4372, 0x80, 0x2778D2), # Jokes end Mole 2 (0x434C, 0x80, 0x241000), # Orange Neon Egg - (0x434D, 0x1, 0x240ebe), # Red Neon Egg + (0x434D, 0x1, 0x240EBE), # Red Neon Egg (0x434C, 0x40, 0x241155), # Blue Neon Egg (0x434D, 0x2, 0x241297), # Purple Neon Egg - (0x434C, 0x8, 0x241afa), # Green Neon Egg - (0x434C, 0x10, 0x241d7e), # Azure Neon Egg - (0x434C, 0x20, 0x241c3c), # Yellow Neon Egg - (0x4406, 0x8, 0x1e9442), # Theater Beanstar Piece - (0x4345, 0x8, 0x1e9408), # Firebrand - (0x4345, 0x4, 0x1e9409), # Thunder Hand + (0x434C, 0x8, 0x241AFA), # Green Neon Egg + (0x434C, 0x10, 0x241D7E), # Azure Neon Egg + (0x434C, 0x20, 0x241C3C), # Yellow Neon Egg + (0x4406, 0x8, 0x1E9442), # Theater Beanstar Piece + (0x4345, 0x8, 0x1E9408), # Firebrand + (0x4345, 0x4, 0x1E9409), # Thunder Hand (0x42FF, 0x80, 0x251071), # Beanstone Reward (0x42F9, 0x2, 0xDA0000), # Dragohoho (0x433D, 0x1, 0xDA0001), # Chuckolator @@ -852,37 +844,37 @@ class MLSSLocation(Location): (0x4342, 0x10, 0xDA0004), # Fungitowm (0x433D, 0x8, 0xDA0005), # Beanstar (0x430F, 0x40, 0xDA0006), # Jojora - (0x433D, 0x10, 0xDA0007) # Birdo + (0x433D, 0x10, 0xDA0007), # Birdo ] roomException = { - 0x1e9437: [0xFE, 0xFF, 0x100], - 0x24ed74: [0x94, 0x95, 0x96, 0x99], + 0x1E9437: [0xFE, 0xFF, 0x100], + 0x24ED74: [0x94, 0x95, 0x96, 0x99], 0x250621: [0x94, 0x95, 0x96, 0x99], - 0x24ff18: [0x94, 0x95, 0x96, 0x99], + 0x24FF18: [0x94, 0x95, 0x96, 0x99], 0x260637: [0x135], 0x1E9403: [0x4D], 0xDA0001: [0x79, 0x192, 0x193], - 0x2578e7: [0x79, 0x192, 0x193] + 0x2578E7: [0x79, 0x192, 0x193], } beanstones = { - 0x229345: 0x39dc72, # Bean fruit 1 - 6 - 0x22954D: 0x39dcb4, - 0x228A17: 0x39dbd1, - 0x22913A: 0x39dc10, - 0x22890E: 0x39dba4, - 0x228775: 0x39db7f, - 0x251288: 0x39d73e, # Beanstone 1 - 10 - 0x2512E1: 0x39d746, - 0x25122F: 0x39d74e, - 0x25117D: 0x39d756, - 0x2511D6: 0x39d75e, - 0x25187B: 0x39d76b, - 0x25170B: 0x39d773, - 0x251767: 0x39d77b, - 0x2517C3: 0x39d783, - 0x25181F: 0x39d78b + 0x229345: 0x39DC72, # Bean fruit 1 - 6 + 0x22954D: 0x39DCB4, + 0x228A17: 0x39DBD1, + 0x22913A: 0x39DC10, + 0x22890E: 0x39DBA4, + 0x228775: 0x39DB7F, + 0x251288: 0x39D73E, # Beanstone 1 - 10 + 0x2512E1: 0x39D746, + 0x25122F: 0x39D74E, + 0x25117D: 0x39D756, + 0x2511D6: 0x39D75E, + 0x25187B: 0x39D76B, + 0x25170B: 0x39D773, + 0x251767: 0x39D77B, + 0x2517C3: 0x39D783, + 0x25181F: 0x39D78B, } roomCount = { @@ -1091,24 +1083,103 @@ class MLSSLocation(Location): } shop = { - 0x3c05f0: [0x3c05f0, 0x3c05f2, 0x3c05f4, 0x3c05f8, 0x3c05fc, 0x3c05fe, 0x3c0600, 0x3c0602, 0x3c0606, 0x3c0608, 0x3c060c, 0x3c060e, 0x3c0610, 0x3c0614], - 0x3c066a: [0x3c066a, 0x3c066c, 0x3c066e, 0x3c0670, 0x3c0672, 0x3c0674, 0x3c0676, 0x3c0678, 0x3c067c, 0x3c0680] + 0x3C05F0: [ + 0x3C05F0, + 0x3C05F2, + 0x3C05F4, + 0x3C05F8, + 0x3C05FC, + 0x3C05FE, + 0x3C0600, + 0x3C0602, + 0x3C0606, + 0x3C0608, + 0x3C060C, + 0x3C060E, + 0x3C0610, + 0x3C0614, + ], + 0x3C066A: [0x3C066A, 0x3C066C, 0x3C066E, 0x3C0670, 0x3C0672, 0x3C0674, 0x3C0676, 0x3C0678, 0x3C067C, 0x3C0680], } badge = { - 0x3c0618: [0x3c0618, 0x3c061a, 0x3c0624, 0x3c0626, 0x3c0628, 0x3c0632, 0x3c0634, 0x3c0636, 0x3c0640, 0x3c0642, 0x3c0644, 0x3c064e, 0x3c0650, 0x3c0652, 0x3c065c, 0x3c065e, 0x3c0660], - 0x3c0684: [0x3c0684, 0x3c0686, 0x3c0688, 0x3c0692, 0x3c0694, 0x3c069c, 0x3c069e] + 0x3C0618: [ + 0x3C0618, + 0x3C061A, + 0x3C0624, + 0x3C0626, + 0x3C0628, + 0x3C0632, + 0x3C0634, + 0x3C0636, + 0x3C0640, + 0x3C0642, + 0x3C0644, + 0x3C064E, + 0x3C0650, + 0x3C0652, + 0x3C065C, + 0x3C065E, + 0x3C0660, + ], + 0x3C0684: [0x3C0684, 0x3C0686, 0x3C0688, 0x3C0692, 0x3C0694, 0x3C069C, 0x3C069E], } pants = { - 0x3c0618: [0x3c061C, 0x3c061E, 0x3c0620, 0x3c062a, 0x3c062c, 0x3c062e, 0x3c0638, 0x3c063a, 0x3c063c, 0x3c0646, 0x3c0648, 0x3c064a, 0x3c0654, 0x3c0656, 0x3c0658, 0x3c0662, 0x3c0664, 0x3c0666], - 0x3c0684: [0x3c068a, 0x3c068c, 0x3c068e, 0x3c0696, 0x3c0698, 0x3c06a0, 0x3c06a2] + 0x3C0618: [ + 0x3C061C, + 0x3C061E, + 0x3C0620, + 0x3C062A, + 0x3C062C, + 0x3C062E, + 0x3C0638, + 0x3C063A, + 0x3C063C, + 0x3C0646, + 0x3C0648, + 0x3C064A, + 0x3C0654, + 0x3C0656, + 0x3C0658, + 0x3C0662, + 0x3C0664, + 0x3C0666, + ], + 0x3C0684: [0x3C068A, 0x3C068C, 0x3C068E, 0x3C0696, 0x3C0698, 0x3C06A0, 0x3C06A2], } -all_locations: typing.List[LocationData] = mainArea + booStatue + chucklehuck + castleTown + startingFlag + \ - chuckolatorFlag + piranhaFlag + kidnappedFlag + beanstarFlag + birdoFlag + \ - winkle + sewers + hooniversity + surfable + airport + gwarharEntrance + \ - teeheeValley + fungitown + fungitownBeanstar + fungitownBirdo + bowsers + \ - jokesEntrance + jokesMain + postJokes + theater + oasis + gwarharMain + bowsersMini + baseUltraRocks + coins +all_locations: typing.List[LocationData] = ( + mainArea + + booStatue + + chucklehuck + + castleTown + + startingFlag + + chuckolatorFlag + + piranhaFlag + + kidnappedFlag + + beanstarFlag + + birdoFlag + + winkle + + sewers + + hooniversity + + surfable + + airport + + gwarharEntrance + + teeheeValley + + fungitown + + fungitownBeanstar + + fungitownBirdo + + bowsers + + jokesEntrance + + jokesMain + + postJokes + + theater + + oasis + + gwarharMain + + bowsersMini + + baseUltraRocks + + coins +) location_table: typing.Dict[str, int] = {locData.name: locData.id for locData in all_locations} diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index c5d275d74db8..84098f89308e 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -1,4 +1,4 @@ -class LocationName(): +class LocationName: StardustFields1Block1 = "Stardust Fields Room 1 Block 1" StardustFields1Block2 = "Stardust Fields Room 1 Block 2" StardustFields2Block = "Stardust Fields Room 2 Block" @@ -359,8 +359,12 @@ class LocationName(): BeanbeanOutskirtsSouthOfHooniversityGuardsDigspot2 = "Beanbean Outskirts South of Hooniversity Guards Digspot 2" BeanbeanOutskirtsSouthOfHooniversityGuardsDigspot3 = "Beanbean Outskirts South of Hooniversity Guards Digspot 3" OutsideWoohooHooniversityBlock = "Outside Woohoo Hooniversity Block" - BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot1 = "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 1" - BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot2 = "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 2" + BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot1 = ( + "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 1" + ) + BeanbeanOutskirtsEntranceToHoohooMountainBaseDigspot2 = ( + "Beanbean Outskirts Entrance to Hoohoo Mountain Base Digspot 2" + ) WoohooHooniversitySoloMarioBarrelAreaBlock1 = "Woohoo Hooniversity Solo Mario Barrel Area Block 1" WoohooHooniversitySoloMarioBarrelAreaBlock2 = "Woohoo Hooniversity Solo Mario Barrel Area Block 2" WoohooHooniversitySoloMarioBarrelAreaBlock3 = "Woohoo Hooniversity Solo Mario Barrel Area Block 3" diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 8d09a5138b55..df0f6ae18746 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -7,6 +7,7 @@ class BowsersCastleSkip(Toggle): Skip straight from the entrance hall to bowletta in Bowser's Castle. All Bowser's Castle items will be removed from the location pool. """ + display_name = "Bowser's Castle Skip" @@ -14,6 +15,7 @@ class ExtraPipes(Toggle): """ Gives the player access to pipes 1, 3, 4, and 6 from the start. """ + display_name = "Start With Extra Pipes" @@ -22,6 +24,7 @@ class SkipMinecart(Toggle): Skip the minecart minigame that leads you through Hoohoo Mountain Base. This will remove the 1 item in the minecart cave from the location pool. """ + display_name = "Skip Minecart Minigame" @@ -29,6 +32,7 @@ class DisableSurf(Toggle): """ Remove the surf minigame item from the location pool. """ + display_name = "Disable Surf Minigame" @@ -39,6 +43,7 @@ class MusicOptions(Choice): randomize: Music will be randomized. disable: All music will be disabled. No music will play throughout the entire game. """ + display_name = "Music Options" option_default = 0 option_randomize = 1 @@ -50,6 +55,7 @@ class RandomSounds(Toggle): """ Randomizes every sound in the game, minus a select few that can softlock the game """ + display_name = "Randomize Sounds" @@ -57,6 +63,7 @@ class MarioColor(Choice): """ This changes the color of Mario's hat, as well as some key colors that are red including UI etc. """ + display_name = "Mario's Color" option_red = 0 option_green = 1 @@ -78,6 +85,7 @@ class LuigiColor(Choice): """ This changes the color of Luigi's hat, as well as some key colors that are green including UI etc. """ + display_name = "Luigi's Color" option_red = 0 option_green = 1 @@ -99,6 +107,7 @@ class MarioPants(Choice): """ This changes the color of Mario's trousers. """ + display_name = "Mario's Pants Color" option_vanilla = 0 option_red = 1 @@ -119,6 +128,7 @@ class LuigiPants(Choice): """ This changes the color of Luigi's trousers. """ + display_name = "Luigi's Pants Color" option_vanilla = 0 option_red = 1 @@ -144,6 +154,7 @@ class RandomizeEnemies(Choice): custom_groups: Custom enemy groups will be made and shuffled. Some enemy groups will only be semi-random. (Groups including flying enemies or pestnuts) """ + display_name = "Randomize Enemies" option_disabled = 0 option_vanilla_groups = 1 @@ -159,6 +170,7 @@ class RandomizeBosses(Choice): Boss Only: Bosses will only be swapped with another boss. Boss Normal: Bosses can be swapped with normal enemy encounters. """ + display_name = "Randomize Bosses" option_disabled = 0 option_bossonly = 1 @@ -172,13 +184,16 @@ class ScaleStats(Toggle): This setting is intended for use with the Enemy Randomizer and is Recommended to turn on. If you are not using the Enemy Randomizer the effects will be minimal. """ + display_name = "Scale Enemy Stats" + class XPMultiplier(Range): """ This will multiply any XP you receive in battle by the chosen multiplier. """ + display_name = "XP Multiplier" range_start = 0 range_end = 4 @@ -189,6 +204,7 @@ class TattleHp(Toggle): """ This will display the enemies current and max health while in battle. """ + display_name = "Tattle HP" @@ -196,6 +212,7 @@ class RandomizeBackgrounds(Toggle): """ This randomizes the background image in battles """ + display_name = "Randomize Battle Backgrounds" @@ -203,6 +220,7 @@ class HiddenVisible(Choice): """ This makes any hidden blocks in the game into regular item blocks. """ + display_name = "Item Block Visibility" option_disabled = 0 option_hidden_visible = 1 @@ -214,6 +232,7 @@ class Coins(Toggle): """ Add all coin blocks in the game to the location pool. """ + display_name = "Coin Blocks" @@ -221,6 +240,7 @@ class HarhallsPants(Toggle): """ This will remove the Harhall's Pants check from the pool. """ + display_name = "Remove Harhall's Pants" @@ -230,6 +250,7 @@ class DifficultLogic(Toggle): 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" @@ -240,6 +261,7 @@ class ChuckleBeans(Choice): only_visible: Only chuckle bean digspots clearly marked with an X will be added into the item pool. all: All chuckle bean digspots will be added into the item pool. """ + display_name = "Chuckle Beans" option_none = 0 option_only_visible = 1 diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index bc6a1b1d53a8..be1c5d1063ae 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -1,10 +1,39 @@ import typing from BaseClasses import Region, Entrance -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, coins +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, + coins, +) from . import StateLogic if typing.TYPE_CHECKING: @@ -60,22 +89,120 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) connect(world, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, world.player)) connect(world, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, world.player)) - connect(world, names, "Main Area", "Hooniversity", lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + connect( + world, + names, + "Main Area", + "Hooniversity", + lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player), + ) connect(world, names, "Hooniversity", "Oasis") - connect(world, names, "Main Area", "TeeheeValley", lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) - connect(world, names, "TeeheeValley", "GwarharEntrance", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) - connect(world, names, "TeeheeValley", "Oasis", lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player)) - connect(world, names, "TeeheeValley", "Fungitown", lambda state: StateLogic.thunder(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) - connection = connect(world, names, "Fungitown", "Fungitown Shop Beanstar Complete Flag", lambda state: StateLogic.pieces(state, world.player) or StateLogic.fungitown_birdo_shop(state, world.player), True) + connect( + world, + names, + "Main Area", + "TeeheeValley", + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), + ) + connect( + world, + names, + "TeeheeValley", + "GwarharEntrance", + lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player), + ) + connect( + world, + names, + "TeeheeValley", + "Oasis", + lambda state: StateLogic.membership(state, world.player) and StateLogic.fire(state, world.player), + ) + connect( + world, + names, + "TeeheeValley", + "Fungitown", + lambda state: StateLogic.thunder(state, world.player) + and StateLogic.castleTown(state, world.player) + and StateLogic.rose(state, world.player), + ) + connection = connect( + world, + names, + "Fungitown", + "Fungitown Shop Beanstar Complete Flag", + lambda state: StateLogic.pieces(state, world.player) or StateLogic.fungitown_birdo_shop(state, world.player), + True, + ) world.multiworld.register_indirect_condition(world.get_region("Fungitown Shop Birdo Flag"), connection) - connect(world, names, "Main Area", "Shop Starting Flag", lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - connection = connect(world, names, "Shop Starting Flag", "Shop Chuckolator Flag", lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) and (StateLogic.thunder(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.hammers(state, world.player))) or StateLogic.piranha_shop(state, world.player), True) + connect(world, names, "Main Area", "Shop Starting Flag") + connection = connect( + world, + names, + "Shop Starting Flag", + "Shop Chuckolator Flag", + lambda state: ( + StateLogic.brooch(state, world.player) + and StateLogic.fruits(state, world.player) + and ( + StateLogic.thunder(state, world.player) + or StateLogic.fire(state, world.player) + or StateLogic.hammers(state, world.player) + ) + ) + or ( + StateLogic.piranha_shop(state, world.player) + or StateLogic.fungitown_shop(state, world.player) + or StateLogic.star_shop(state, world.player) + or StateLogic.birdo_shop(state, world.player) + ), + True, + ) world.multiworld.register_indirect_condition(world.get_region("Shop Mom Piranha Flag"), connection) - connection = connect(world, names, "Shop Starting Flag", "Shop Mom Piranha Flag", lambda state: StateLogic.thunder(state, world.player) or StateLogic.fungitown_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Enter Fungitown Flag"), connection) - connect(world, names, "Shop Starting Flag", "Shop Enter Fungitown Flag", lambda state: StateLogic.fungitown(state, world.player) or StateLogic.star_shop(state, world.player), True) world.multiworld.register_indirect_condition(world.get_region("Shop Beanstar Complete Flag"), connection) - connect(world, names, "Shop Starting Flag", "Shop Beanstar Complete Flag", lambda state: (StateLogic.castleTown(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) or StateLogic.birdo_shop(state, world.player), True) + world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) + connection = connect( + world, + names, + "Shop Starting Flag", + "Shop Mom Piranha Flag", + lambda state: StateLogic.thunder(state, world.player) + or ( + StateLogic.fungitown_shop(state, world.player) + or StateLogic.star_shop(state, world.player) + or StateLogic.birdo_shop(state, world.player) + ), + True, + ) + world.multiworld.register_indirect_condition(world.get_region("Shop Enter Fungitown Flag"), connection) + world.multiworld.register_indirect_condition(world.get_region("Shop Beanstar Complete Flag"), connection) + world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) + connection = connect( + world, + names, + "Shop Starting Flag", + "Shop Enter Fungitown Flag", + lambda state: StateLogic.fungitown(state, world.player) + or (StateLogic.star_shop(state, world.player) or StateLogic.birdo_shop(state, world.player)), + True, + ) + world.multiworld.register_indirect_condition(world.get_region("Shop Beanstar Complete Flag"), connection) + world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) + connection = connect( + world, + names, + "Shop Starting Flag", + "Shop Beanstar Complete Flag", + lambda state: ( + StateLogic.castleTown(state, world.player) + and StateLogic.pieces(state, world.player) + and StateLogic.rose(state, world.player) + ) + or StateLogic.birdo_shop(state, world.player), + True, + ) world.multiworld.register_indirect_condition(world.get_region("Shop Birdo Flag"), connection) connect(world, names, "Main Area", "Sewers", lambda state: StateLogic.rose(state, world.player)) connect(world, names, "Main Area", "Airport", lambda state: StateLogic.thunder(state, world.player)) @@ -87,19 +214,72 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player)) if not world.options.castle_skip: connect(world, names, "PostJokes", "Bowser's Castle") - connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player)) + connect( + world, + names, + "Bowser's Castle", + "Bowser's Castle Mini", + lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player), + ) connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) - connect(world, names, "Chucklehuck Woods", "Beanbean Castle Town", lambda state: StateLogic.fruits(state, world.player) and (StateLogic.hammers(state, world.player) or StateLogic.fire(state, world.player) or StateLogic.thunder(state, world.player))) + connect( + world, + names, + "Chucklehuck Woods", + "Beanbean Castle Town", + lambda state: StateLogic.fruits(state, world.player) + and ( + StateLogic.hammers(state, world.player) + or StateLogic.fire(state, world.player) + or StateLogic.thunder(state, world.player) + ), + ) if world.options.difficult_logic: connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player)) connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canDig(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) - connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", lambda state: StateLogic.postJokes(state, world.player)) + connect( + world, + names, + "Shop Starting Flag", + "Shop Birdo Flag", + lambda state: StateLogic.postJokes(state, world.player), + ) + connect( + world, + names, + "Fungitown", + "Fungitown Shop Birdo Flag", + lambda state: StateLogic.postJokes(state, world.player), + ) else: - connect(world, names, "GwarharEntrance", "GwarharMain", lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player)) - connect(world, names, "JokesEntrance", "JokesMain", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player)) - connect(world, names, "Shop Starting Flag", "Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) - connect(world, names, "Fungitown", "Fungitown Shop Birdo Flag", lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player)) + connect( + world, + names, + "GwarharEntrance", + "GwarharMain", + lambda state: StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player), + ) + connect( + world, + names, + "JokesEntrance", + "JokesMain", + lambda state: StateLogic.canCrash(state, world.player) and StateLogic.canDig(state, world.player), + ) + connect( + world, + names, + "Shop Starting Flag", + "Shop Birdo Flag", + lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player), + ) + connect( + world, + names, + "Fungitown", + "Fungitown Shop Birdo Flag", + lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player), + ) def create_region(world: "MLSSWorld", name, locations, excluded): @@ -112,8 +292,14 @@ def create_region(world: "MLSSWorld", name, locations, excluded): world.multiworld.regions.append(ret) -def connect(world: "MLSSWorld", used_names: typing.Dict[str, int], source: str, target: str, - rule: typing.Optional[typing.Callable] = None, reach: typing.Optional[bool] = False) -> Entrance | None: +def connect( + world: "MLSSWorld", + used_names: typing.Dict[str, int], + source: str, + target: str, + rule: typing.Optional[typing.Callable] = None, + reach: typing.Optional[bool] = False, +) -> Entrance | None: source_region = world.multiworld.get_region(source, world.player) target_region = world.multiworld.get_region(target, world.player) @@ -122,7 +308,7 @@ def connect(world: "MLSSWorld", used_names: typing.Dict[str, int], source: str, name = target else: used_names[target] += 1 - name = target + (' ' * used_names[target]) + name = target + (" " * used_names[target]) connection = Entrance(world.player, name, source_region) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 8124c18a4f4d..4d3a324d7ef2 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -36,23 +36,10 @@ def __init__(self, location, byte1, byte2, bro): "White", "Silhouette", "Chaos", - "TrueChaos" + "TrueChaos", ] -cpants = [ - "Vanilla", - "Red", - "Green", - "Blue", - "Cyan", - "Yellow", - "Orange", - "Purple", - "Pink", - "Black", - "White", - "Chaos" -] +cpants = ["Vanilla", "Red", "Green", "Blue", "Cyan", "Yellow", "Orange", "Purple", "Pink", "Black", "White", "Chaos"] def get_base_rom_as_bytes() -> bytes: @@ -121,13 +108,13 @@ def randomize_sounds(caller: APProcedurePatch, rom: bytes): pointers = Data.sounds random.shuffle(pointers) - stream.seek(0x21cc44, 0) + stream.seek(0x21CC44, 0) for i in range(354): current_position = stream.tell() - value = int.from_bytes(stream.read(3), 'little') + value = int.from_bytes(stream.read(3), "little") if value in fresh_pointers: stream.seek(current_position) - stream.write(pointers.pop().to_bytes(3, 'little')) + stream.write(pointers.pop().to_bytes(3, "little")) stream.seek(1, 1) return stream.getvalue() @@ -138,10 +125,8 @@ def enemy_randomize(caller: APProcedurePatch, rom: bytes): if options["randomize_bosses"] == 0 and options["randomize_enemies"] == 0: return rom - enemies = [pos for pos in Data.enemies if - pos not in Data.bowsers] if options["castle_skip"] else Data.enemies - bosses = [pos for pos in Data.bosses if - pos not in Data.bowsers] if options["castle_skip"] else Data.bosses + enemies = [pos for pos in Data.enemies if pos not in Data.bowsers] if options["castle_skip"] else Data.enemies + bosses = [pos for pos in Data.bosses if pos not in Data.bowsers] if options["castle_skip"] else Data.bosses stream = io.BytesIO(rom) random.seed(options["seed"] + options["player"]) @@ -274,151 +259,78 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: "music_options": world.options.music_options.value, "block_visibility": world.options.block_visibility.value, "seed": world.multiworld.seed, - "player": world.player + "player": world.player, } patch.write_file("options.json", json.dumps(options_dict).encode("UTF-8")) # Bake player name into ROM - patch.write_token( - APTokenTypes.WRITE, - 0xDF0000, - world.multiworld.player_name[world.player].encode("UTF-8") - ) + patch.write_token(APTokenTypes.WRITE, 0xDF0000, world.multiworld.player_name[world.player].encode("UTF-8")) # Bake seed name into ROM - patch.write_token( - APTokenTypes.WRITE, - 0xDF00A0, - world.multiworld.seed_name.encode("UTF-8") - ) + patch.write_token(APTokenTypes.WRITE, 0xDF00A0, world.multiworld.seed_name.encode("UTF-8")) # Bake patch into header - patch.write_token( - APTokenTypes.WRITE, - 0xAD, - "P".encode("UTF-8") - ) + patch.write_token(APTokenTypes.WRITE, 0xAD, "P".encode("UTF-8")) # Intro Skip patch.write_token( APTokenTypes.WRITE, 0x244D08, - bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8]) + bytes([0x88, 0x0, 0x19, 0x91, 0x1, 0x20, 0x58, 0x1, 0xF, 0xA0, 0x3, 0x15, 0x27, 0x8]), ) # Patch S.S Chuckola Loading Zones - patch.write_token( - APTokenTypes.WRITE, - 0x25FD4E, - bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FD4E, bytes([0x48, 0x30, 0x80, 0x60, 0x50, 0x2, 0xF])) - patch.write_token( - APTokenTypes.WRITE, - 0x25FD83, - bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FD83, bytes([0x48, 0x30, 0x80, 0x60, 0xC0, 0x2, 0xF])) - patch.write_token( - APTokenTypes.WRITE, - 0x25FDB8, - bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FDB8, bytes([0x48, 0x30, 0x05, 0x80, 0xE4, 0x0, 0xF])) - patch.write_token( - APTokenTypes.WRITE, - 0x25FDED, - bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FDED, bytes([0x48, 0x30, 0x06, 0x80, 0xE4, 0x0, 0xF])) - patch.write_token( - APTokenTypes.WRITE, - 0x25FE22, - bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FE22, bytes([0x48, 0x30, 0x07, 0x80, 0xE4, 0x0, 0xF])) - patch.write_token( - APTokenTypes.WRITE, - 0x25FE57, - bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF]) - ) + patch.write_token(APTokenTypes.WRITE, 0x25FE57, bytes([0x48, 0x30, 0x08, 0x80, 0xE4, 0x0, 0xF])) if world.options.extra_pipes: - patch.write_token( - APTokenTypes.WRITE, - 0xD00001, - bytes([0x1]) - ) + patch.write_token(APTokenTypes.WRITE, 0xD00001, bytes([0x1])) if world.options.castle_skip: - patch.write_token( - APTokenTypes.WRITE, - 0x3AEAB0, - bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3]) - ) - patch.write_token( - APTokenTypes.WRITE, - 0x3AEC18, - bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1]) - ) + patch.write_token(APTokenTypes.WRITE, 0x3AEAB0, bytes([0xC1, 0x67, 0x0, 0x6, 0x1C, 0x08, 0x3])) + patch.write_token(APTokenTypes.WRITE, 0x3AEC18, bytes([0x89, 0x65, 0x0, 0xE, 0xA, 0x08, 0x1])) if world.options.skip_minecart: - patch.write_token( - APTokenTypes.WRITE, - 0x3AC728, - bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1]) - ) - patch.write_token( - APTokenTypes.WRITE, - 0x3AC56C, - bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1]) - ) + patch.write_token(APTokenTypes.WRITE, 0x3AC728, bytes([0x89, 0x13, 0x0, 0x10, 0xF, 0x08, 0x1])) + patch.write_token(APTokenTypes.WRITE, 0x3AC56C, bytes([0x49, 0x16, 0x0, 0x8, 0x8, 0x08, 0x1])) if world.options.scale_stats: - patch.write_token( - APTokenTypes.WRITE, - 0xD00002, - bytes([0x1]) - ) + patch.write_token(APTokenTypes.WRITE, 0xD00002, bytes([0x1])) if world.options.xp_multiplier: - patch.write_token( - APTokenTypes.WRITE, - 0xD00003, - bytes([world.options.xp_multiplier.value]) - ) + patch.write_token(APTokenTypes.WRITE, 0xD00003, bytes([world.options.xp_multiplier.value])) if world.options.tattle_hp: - patch.write_token( - APTokenTypes.WRITE, - 0xD00000, - bytes([0x1]) - ) + patch.write_token(APTokenTypes.WRITE, 0xD00000, bytes([0x1])) if world.options.music_options == 2: - patch.write_token( - APTokenTypes.WRITE, - 0x19B118, - bytes([0x0, 0x25]) - ) + patch.write_token(APTokenTypes.WRITE, 0x19B118, bytes([0x0, 0x25])) if world.options.randomize_backgrounds: all_enemies = Data.enemies + Data.bosses for address in all_enemies: - patch.write_token( - APTokenTypes.WRITE, - address + 3, - bytes([world.random.randint(0x0, 0x26)]) - ) + patch.write_token(APTokenTypes.WRITE, address + 3, bytes([world.random.randint(0x0, 0x26)])) for location_name in location_table.keys(): - if (world.options.skip_minecart and "Minecart" in location_name and "After" not in location_name) or ( - world.options.castle_skip and "Bowser" in location_name) or ( - world.options.disable_surf and "Surf Minigame" in location_name) or ( - world.options.harhalls_pants and "Harhall's" in location_name): + if ( + (world.options.skip_minecart and "Minecart" in location_name and "After" not in location_name) + or (world.options.castle_skip and "Bowser" in location_name) + or (world.options.disable_surf and "Surf Minigame" in location_name) + or (world.options.harhalls_pants and "Harhall's" in location_name) + ): continue if (world.options.chuckle_beans == 0 and "Digspot" in location_name) or ( - world.options.chuckle_beans == 1 and location_table[location_name] in hidden): + world.options.chuckle_beans == 1 and location_table[location_name] in hidden + ): continue if not world.options.coins and "Coin" in location_name: continue @@ -444,21 +356,17 @@ def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: random = world.multiworld.per_slot_randoms[world.player] for lines in temp_io.readlines(): - arr = lines.decode('utf-8').strip().split(',') + arr = lines.decode("utf-8").strip().split(",") if color != "Chaos" and color != "TrueChaos": color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) else: - color_arr.append( - Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) + color_arr.append(Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) colors_ = [c for c in color_arr if c.bro == bro] for c in colors_: - patch.write_token( - APTokenTypes.WRITE, - c.location, - bytes([c.byte1, c.byte2]) - ) + patch.write_token(APTokenTypes.WRITE, c.location, bytes([c.byte1, c.byte2])) + def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): mario_color = world.options.mario_color @@ -475,21 +383,17 @@ def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: i color_arr = [] for lines in temp_io.readlines(): - arr = lines.decode('utf-8').strip().split(',') + arr = lines.decode("utf-8").strip().split(",") if color != "Chaos": color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) else: - color_arr.append( - Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) + color_arr.append(Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) colors_ = [c for c in color_arr if c.bro == bro] for c in colors_: - patch.write_token( - APTokenTypes.WRITE, - c.location, - bytes([c.byte1, c.byte2]) - ) + patch.write_token(APTokenTypes.WRITE, c.location, bytes([c.byte1, c.byte2])) + def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, item_type: int, item: Item): if item.player == world.player: @@ -497,11 +401,7 @@ def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, it else: code = 0x3F if item_type == 0: - patch.write_token( - APTokenTypes.WRITE, - location, - bytes([code]) - ) + patch.write_token(APTokenTypes.WRITE, location, bytes([code])) elif item_type == 1: if code == 0x1D or code == 0x1E: code += 0xE @@ -512,21 +412,13 @@ def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, it insert2 *= 0x10 insert //= 0x10 insert += 0x20 - patch.write_token( - APTokenTypes.WRITE, - location, - bytes([insert, insert2]) - ) + patch.write_token(APTokenTypes.WRITE, location, bytes([insert, insert2])) elif item_type == 2: if code == 0x1D or code == 0x1E: code += 0xE if 0x20 <= code <= 0x26: code -= 0x4 - patch.write_token( - APTokenTypes.WRITE, - location, - bytes([code]) - ) + patch.write_token(APTokenTypes.WRITE, location, bytes([code])) elif item_type == 3: if code == 0x1D or code == 0x1E: code += 0xE @@ -534,23 +426,16 @@ def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, it code -= 0xA if 0x20 <= code <= 0x26: code -= 0xE - patch.write_token( - APTokenTypes.WRITE, - location, - bytes([code]) - ) + patch.write_token(APTokenTypes.WRITE, location, bytes([code])) else: - patch.write_token( - APTokenTypes.WRITE, - location, - bytes([0x18]) - ) + patch.write_token(APTokenTypes.WRITE, location, bytes([0x18])) + def desc_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: Location, item: Item): index = -1 for key, value in shop.items(): if location.address in value: - if key == 0x3C05f0: + if key == 0x3C05F0: index = value.index(location.address) else: index = value.index(location.address) + 14 @@ -574,8 +459,4 @@ def desc_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: Locatio index = value.index(location.address) + 66 dstring = f"{world.multiworld.player_name[item.player]}: {item.name}" - patch.write_token( - APTokenTypes.WRITE, - 0xD11000 + (index * 0x40), - dstring.encode("UTF8") - ) + patch.write_token(APTokenTypes.WRITE, 0xD11000 + (index * 0x40), dstring.encode("UTF8")) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 573e0e723394..02bb566abd24 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -13,295 +13,559 @@ def set_rules(world: "MLSSWorld", excluded): for location in all_locations: if "Digspot" in location.name: if (world.options.skip_minecart and "Minecart" in location.name) or ( - world.options.castle_skip and "Bowser" in location.name): + world.options.castle_skip and "Bowser" in location.name + ): continue if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue - add_rule(world.multiworld.get_location(location.name, world.player), lambda state: - StateLogic.canDig(state, world.player)) + add_rule( + world.multiworld.get_location(location.name, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) if "Beanstone" in location.name: - add_rule(world.multiworld.get_location(location.name, world.player), lambda state: - StateLogic.canDig(state, world.player)) + add_rule( + world.multiworld.get_location(location.name, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) + if "Badge" in location.name or "Pants" in location.name: + add_rule( + world.multiworld.get_location(location.name, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) if location.itemType != 0 and location.name not in excluded: if "Bowser" in location.name and world.options.castle_skip: continue forbid_item(world.multiworld.get_location(location.name, world.player), "5 Coins", world.player) if world.options.chuckle_beans == 2: - add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), lambda state: - StateLogic.canDash(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), + lambda state: StateLogic.canDash(state, world.player), + ) if world.options.chuckle_beans == 1 or world.options.chuckle_beans == 2: - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), lambda state: - StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), lambda state: - StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), + lambda state: StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), + ) - forbid_item(world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", - world.player) # Bandaid Fix + forbid_item( + world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player + ) # Bandaid Fix - add_rule(world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), lambda state: - StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), lambda state: - StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), lambda state: - StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), lambda state: - StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), lambda state: - StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), lambda state: - StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), lambda state: - StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), lambda state: - StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), lambda state: - StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), lambda state: - StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), lambda state: - StateLogic.thunder(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), lambda state: - StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), lambda state: - StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), lambda state: - StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), lambda state: - StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), lambda state: - StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), lambda state: - StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), lambda state: - StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), lambda state: - StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), lambda state: - StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), lambda state: - StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), lambda state: - StateLogic.canMini(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), lambda state: - StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), lambda state: - StateLogic.neon(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), lambda state: - StateLogic.beanFruit(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), lambda state: - StateLogic.winkle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), lambda state: - StateLogic.winkle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: - StateLogic.spangle(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), lambda state: - StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), + lambda state: StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), + lambda state: StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), + lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), + lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), + lambda state: StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), + lambda state: StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), + lambda state: StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), + lambda state: StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), + lambda state: StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), + lambda state: StateLogic.thunder(state, world.player) + and StateLogic.pieces(state, world.player) + and StateLogic.castleTown(state, world.player) + and StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), + lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), + lambda state: StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), + lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), + lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), + lambda state: StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), + lambda state: StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), + lambda state: StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), + lambda state: StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), + lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), + lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), + lambda state: StateLogic.canMini(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), + lambda state: StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), + lambda state: StateLogic.neon(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), + lambda state: StateLogic.beanFruit(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), + lambda state: StateLogic.winkle(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), + lambda state: StateLogic.winkle(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + lambda state: StateLogic.spangle(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), + lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player), + ) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), lambda state: - StateLogic.ultra(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), + lambda state: StateLogic.ultra(state, world.player), + ) if world.options.difficult_logic: - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), lambda state: - StateLogic.canCrash(state, world.player)) - add_rule(world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), lambda state: - StateLogic.canCrash(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + lambda state: StateLogic.canCrash(state, world.player), + ) + add_rule( + world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), + lambda state: StateLogic.canCrash(state, world.player), + ) if world.options.chuckle_beans != 0: - add_rule(world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), lambda state: - StateLogic.canCrash(state, world.player)) + add_rule( + world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), + lambda state: StateLogic.canCrash(state, world.player), + ) if world.options.coins: - add_rule(world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), lambda state: - StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), lambda state: - StateLogic.super(state, world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), lambda state: - StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player)) - add_rule(world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), lambda state: - StateLogic.canCrash(state, world.player)) - add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player)) - add_rule(world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), lambda state: - StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), lambda state: - StateLogic.rose(state, world.player)) - add_rule(world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), lambda state: - StateLogic.ultra(state, world.player)) - add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), lambda state: - StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), lambda state: - StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player))) - add_rule(world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), lambda state: - StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player)) - add_rule(world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), lambda state: - StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) - and (StateLogic.membership(state, world.player) - or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)))) - add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: - StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) - and StateLogic.canDig(state, world.player) - and ( - StateLogic.membership(state, world.player) - or StateLogic.canMini(state, world.player) - )) + add_rule( + world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), + lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), + lambda state: StateLogic.super(state, world.player), + ) + add_rule( + world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), + ) + add_rule( + world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), + lambda state: StateLogic.canCrash(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player), + ) + add_rule( + world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), + lambda state: StateLogic.rose(state, world.player), + ) + add_rule( + world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player), + ) + add_rule( + world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), + lambda state: StateLogic.canDash(state, world.player) + and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), + ) + add_rule( + world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), + ) + add_rule( + world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and ( + StateLogic.membership(state, world.player) + or (StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player)) + ), + ) + add_rule( + world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), + lambda state: StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canDig(state, world.player) + and (StateLogic.membership(state, world.player) or StateLogic.canMini(state, world.player)), + ) if not world.options.difficult_logic: - add_rule(world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), lambda state: - StateLogic.canCrash(state, world.player)) + add_rule( + world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), + lambda state: StateLogic.canCrash(state, world.player), + ) diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 9530fde7acbb..39f08e169ef5 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -27,30 +27,32 @@ def ultra(state, player): def fruits(state, player): - return (state.has("Red Chuckola Fruit", player) - and state.has("Purple Chuckola Fruit", player) - and state.has("White Chuckola Fruit", player)) + return ( + state.has("Red Chuckola Fruit", player) + and state.has("Purple Chuckola Fruit", player) + and state.has("White Chuckola Fruit", player) + ) def pieces(state, player): return ( - state.has("Beanstar Piece 1", player) - and state.has("Beanstar Piece 2", player) - and state.has("Beanstar Piece 3", player) - and state.has("Beanstar Piece 4", player) - ) + state.has("Beanstar Piece 1", player) + and state.has("Beanstar Piece 2", player) + and state.has("Beanstar Piece 3", player) + and state.has("Beanstar Piece 4", player) + ) def neon(state, player): return ( - state.has("Blue Neon Egg", player) - and state.has("Red Neon Egg", player) - and state.has("Green Neon Egg", player) - and state.has("Yellow Neon Egg", player) - and state.has("Purple Neon Egg", player) - and state.has("Orange Neon Egg", player) - and state.has("Azure Neon Egg", player) - ) + state.has("Blue Neon Egg", player) + and state.has("Red Neon Egg", player) + and state.has("Green Neon Egg", player) + and state.has("Yellow Neon Egg", player) + and state.has("Purple Neon Egg", player) + and state.has("Orange Neon Egg", player) + and state.has("Azure Neon Egg", player) + ) def spangle(state, player): @@ -87,35 +89,33 @@ def winkle(state, player): def beanFruit(state, player): return ( - state.has("Bean Fruit 1", player) - and state.has("Bean Fruit 2", player) - and state.has("Bean Fruit 3", player) - and state.has("Bean Fruit 4", player) - and state.has("Bean Fruit 5", player) - and state.has("Bean Fruit 6", player) - and state.has("Bean Fruit 7", player) - ) + state.has("Bean Fruit 1", player) + and state.has("Bean Fruit 2", player) + and state.has("Bean Fruit 3", player) + and state.has("Bean Fruit 4", player) + and state.has("Bean Fruit 5", player) + and state.has("Bean Fruit 6", player) + and state.has("Bean Fruit 7", player) + ) def surfable(state, player): - return ( - ultra(state, player) - and ((canDig(state, player) and canMini(state, player)) - or (membership(state, player) and fire(state, player))) - ) + return ultra(state, player) and ( + (canDig(state, player) and canMini(state, player)) or (membership(state, player) and fire(state, player)) + ) def postJokes(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) - and canDash(state, player) - ) + 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) + and canDash(state, player) + ) def teehee(state, player): @@ -127,19 +127,29 @@ def castleTown(state, player): def fungitown(state, player): - return castleTown(state, player) and thunder(state, player) and rose(state, player) and (super(state, player) or canDash(state, player)) + return ( + castleTown(state, player) + and thunder(state, player) + and rose(state, player) + and (super(state, player) or canDash(state, player)) + ) + def piranha_shop(state, player): return state.can_reach("Shop Mom Piranha Flag", "Region", player) + def fungitown_shop(state, player): return state.can_reach("Shop Enter Fungitown Flag", "Region", player) + def star_shop(state, player): return state.can_reach("Shop Beanstar Complete Flag", "Region", player) + def birdo_shop(state, player): return state.can_reach("Shop Birdo Flag", "Region", player) + def fungitown_birdo_shop(state, player): return state.can_reach("Fungitown Shop Birdo Flag", "Region", player) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index ab098e58639d..2e15eb7f8258 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -16,16 +16,16 @@ class MLSSWebWorld(WebWorld): - theme = 'partyTime' + theme = "partyTime" bug_report_page = "https://github.com/jamesbrq/ArchipelagoMLSS/issues" tutorials = [ Tutorial( - tutorial_name='Setup Guide', - description='A guide to setting up Mario & Luigi: Superstar Saga for Archipelago.', - language='English', - file_name='setup_en.md', - link='setup/en', - authors=['jamesbrq'] + tutorial_name="Setup Guide", + description="A guide to setting up Mario & Luigi: Superstar Saga for Archipelago.", + language="English", + file_name="setup_en.md", + link="setup/en", + authors=["jamesbrq"], ) ] @@ -33,6 +33,7 @@ class MLSSWebWorld(WebWorld): class MLSSSettings(settings.Group): class RomFile(settings.UserFilePath): """File name of the MLSS US rom""" + copy_to = "Mario & Luigi - Superstar Saga (U).gba" description = "MLSS ROM File" md5s = ["4b1a5897d89d9e74ec7f630eefdfd435"] @@ -46,6 +47,7 @@ class MLSSWorld(World): Adventure with Mario and Luigi together in the Beanbean Kingdom to stop the evil cackletta and retrieve the Beanstar. """ + game = "Mario & Luigi Superstar Saga" web = MLSSWebWorld() options_dataclass = MLSSOptions @@ -96,7 +98,7 @@ def fill_slot_data(self) -> Dict[str, Any]: "HarhallsPants": self.options.harhalls_pants.value, "ChuckleBeans": self.options.chuckle_beans.value, "DifficultLogic": self.options.difficult_logic.value, - "Coins": self.options.coins.value + "Coins": self.options.coins.value, } def create_items(self) -> None: @@ -134,7 +136,7 @@ def create_items(self) -> None: # And finally take as many fillers as we need to have the same amount of items and locations. remaining = len(all_locations) - len(required_items) - 5 if self.options.castle_skip: - remaining -= (len(bowsers) + len(bowsersMini) - (5 if self.options.chuckle_beans == 0 else 0)) + remaining -= len(bowsers) + len(bowsersMini) - (5 if self.options.chuckle_beans == 0 else 0) if self.options.skip_minecart and self.options.chuckle_beans == 2: remaining -= 1 if self.options.disable_surf: @@ -155,11 +157,13 @@ def create_items(self) -> None: def set_rules(self) -> None: set_rules(self, self.disabled_locations) if self.options.castle_skip: - self.multiworld.completion_condition[self.player] = \ - lambda state: state.can_reach("PostJokes", "Region", self.player) + self.multiworld.completion_condition[self.player] = lambda state: state.can_reach( + "PostJokes", "Region", self.player + ) else: - self.multiworld.completion_condition[self.player] = \ - lambda state: state.can_reach("Bowser's Castle Mini", "Region", self.player) + self.multiworld.completion_condition[self.player] = lambda state: state.can_reach( + "Bowser's Castle Mini", "Region", self.player + ) def create_item(self, name: str) -> MLSSItem: item = item_table[name] @@ -172,6 +176,7 @@ def generate_output(self, output_directory: str) -> None: patch = MLSSProcedurePatch(player=self.player, player_name=self.multiworld.player_name[self.player]) patch.write_file("base_patch.bsdiff4", pkgutil.get_data(__name__, "data/basepatch.bsdiff")) write_tokens(self, patch) - rom_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}" - f"{patch.patch_file_ending}") + rom_path = os.path.join( + output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}" f"{patch.patch_file_ending}" + ) patch.write(rom_path) From 20d47e7cf7bc2e85ab22d1a9e2948ce34265ef6d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 21:54:06 -0400 Subject: [PATCH 59/79] Reworked colors. Removed all .txt files --- worlds/mlss/Data.py | 5811 ++++++++++++++++++++++++++++++++++++++++--- worlds/mlss/Rom.py | 119 +- 2 files changed, 5553 insertions(+), 377 deletions(-) diff --git a/worlds/mlss/Data.py b/worlds/mlss/Data.py index 840589e6efa8..55d0cedc681f 100644 --- a/worlds/mlss/Data.py +++ b/worlds/mlss/Data.py @@ -1,6 +1,13 @@ -flying = [0x14, 0x1D, 0x4C] +flying = [ + 0x14, + 0x1D, + 0x4C +] -pestnut = [0x20, 0x34] +pestnut = [ + 0x20, + 0x34 +] enemies = [ 0x5030EC, @@ -146,7 +153,7 @@ 0x50468C, 0x5046CC, 0x5046EC, - 0x50470C, + 0x50470C ] bosses = [ @@ -170,7 +177,7 @@ 0x50438C, 0x5045CC, 0x5045EC, - 0x50460C, + 0x50460C ] bowsers = [ @@ -200,305 +207,5499 @@ ] sounds = [ - 0x1DA51C, - 0x1DA478, - 0x1DA430, - 0x1DA420, - 0x1DA404, - 0x1DA3E8, - 0x1DA330, - 0x1DA1E0, - 0x1DA1B4, - 0x1DA13C, - 0x1DA0C8, - 0x1D9FEC, - 0x1D9F10, - 0x1D9E78, - 0x1D9CEC, - 0x1D9CDC, - 0x1D9CD0, - 0x1D9CC4, - 0x1D9CB8, - 0x1D9CAC, - 0x1D9CA0, - 0x1D9C94, - 0x1D9C88, - 0x1D9C1C, - 0x1D93A4, - 0x1D926C, - 0x1D91D4, - 0x1D9134, - 0x1D9108, - 0x1D9094, - 0x1D9020, - 0x1D8F48, - 0x1D8F3C, - 0x1D8F30, - 0x1D8F14, - 0x1D8F08, - 0x1D8EFC, - 0x1D8EF0, - 0x1BC330, - 0x1BC324, - 0x1BC318, - 0x1BC30C, - 0x1BC300, - 0x1BC2F4, - 0x1BC2A4, - 0x1BC210, - 0x1BC18C, - 0x1BC124, - 0x1BC088, - 0x1BC06C, - 0x1BBFFC, - 0x1BBF8C, - 0x1BBEB8, - 0x1BBDE4, - 0x1BBD34, - 0x1BBD14, - 0x1BBC14, - 0x1BBBD8, - 0x1BBB60, - 0x1BBB0C, - 0x1BBA5C, - 0x1BB9B8, - 0x1BB9A0, - 0x1BB8E4, - 0x1BB89C, - 0x1BB880, - 0x1BB704, - 0x1BB6E8, - 0x1BB6DC, - 0x1BB6D0, - 0x1BB6C4, - 0x1BB6B8, - 0x1BB6AC, - 0x1BB6A0, - 0x1BB694, - 0x1BB688, - 0x1BB67C, - 0x1BB66C, - 0x1BB660, - 0x1BB654, - 0x1BB648, - 0x1BB63C, - 0x1BB630, - 0x1BB624, - 0x1BB618, - 0x1BB60C, - 0x1BB600, - 0x1BB5F4, - 0x1BB5E8, - 0x1BB5DC, - 0x1BB5D0, - 0x1BB5C4, - 0x1BB5B8, - 0x1BB5AC, - 0x1BB580, - 0x1BB574, - 0x1BB558, - 0x1BB54C, - 0x1BB540, - 0x1BB534, - 0x1BB528, - 0x1BB51C, - 0x1BB510, - 0x1BB504, - 0x1BB4F8, - 0x1BB4EC, - 0x1BB4E0, - 0x1BB4D4, - 0x1BB4C8, - 0x1BB4BC, - 0x1BB4B0, - 0x1BB4A4, - 0x1BB408, - 0x1BB398, - 0x1BB2E0, - 0x1BB270, - 0x1BB14C, - 0x1BB140, - 0x1BB134, - 0x1BB128, - 0x1BB11C, - 0x1BB110, - 0x1BAF84, - 0x1BAC0C, - 0x1BAB3C, - 0x1BAB24, - 0x1BAB18, - 0x1BAB0C, - 0x1BAB00, - 0x1BAAF4, - 0x1BAAD8, - 0x1BA988, - 0x1BA97C, - 0x1BA970, - 0x1BA964, - 0x1BA958, - 0x1BA94C, - 0x1BA940, - 0x1BA918, - 0x1BA580, - 0x1BA4C0, - 0x1BA498, - 0x1AE0C8, - 0x1AE060, - 0x1AE048, - 0x1ABCEC, - 0x1ABC48, - 0x1ABB8C, - 0x1ABB30, - 0x1ABABC, - 0x1AB644, - 0x1AB5A8, - 0x1AB58C, - 0x1AB50C, - 0x1AB488, - 0x1AB3F0, - 0x1AB38C, - 0x1AB348, - 0x1AB31C, - 0x1AB300, - 0x1AB290, - 0x1AB220, - 0x1AB084, - 0x1AB04C, - 0x1AAFC8, - 0x1AAF64, - 0x1A8D14, - 0x1A8C30, - 0x1A8290, - 0x1A8284, - 0x1A8168, - 0x1A8014, - 0x1A7F10, - 0x1A7EB8, - 0x1A7DC8, - 0x1A7D5C, - 0x1A7BF0, - 0x1A7B70, - 0x1A7B3C, - 0x1A7B0C, - 0x1A7A1C, - 0x1A7980, - 0x1A7910, - 0x1A783C, - 0x1A77A0, - 0x1A7718, - 0x1A769C, - 0x1A7620, - 0x1A75DC, - 0x1A75BC, - 0x1A7518, - 0x1A7500, - 0x1A74C0, - 0x1A7440, - 0x1A7434, - 0x1A7428, - 0x1A311C, - 0x1A3010, - 0x1A2FF8, - 0x1A2FA0, - 0x1A2F4C, - 0x1A2F18, - 0x1A2EEC, - 0x1A2EDC, - 0x1A2E98, - 0x1A2DF8, - 0x1A2D00, - 0x1A2B80, - 0x1A2B58, - 0x1A2B30, - 0x1A2B04, - 0x1A2A80, - 0x1A2A20, - 0x1A29E0, - 0x1A29C0, - 0x1A2990, - 0x1A296C, - 0x1A1D70, - 0x1A1D48, - 0x1A1D38, - 0x1A1D18, - 0x1A1C9C, - 0x1A1C50, - 0x1A1C10, - 0x1A1BE8, - 0x1A1BBC, - 0x1A1B74, - 0x1A1AF8, - 0x1A1A58, - 0x1A1968, - 0x1A18D8, - 0x1A186C, - 0x1A1850, - 0x1A1804, - 0x1A17DC, - 0x1A1768, - 0x1A173C, - 0x1A1714, - 0x1A16D0, - 0x1A16A4, - 0x1A1680, - 0x1A1620, - 0x1A15B8, - 0x1A156C, - 0x1A1524, - 0x1A1494, - 0x1A1464, - 0x1A1440, - 0x1A1430, - 0x1A1414, - 0x1A1350, - 0x1A12C4, - 0x1A126C, - 0x1A1250, - 0x1A11F8, - 0x1A11B4, - 0x1A11A4, - 0x1A110C, - 0x1A10F8, - 0x1A1078, - 0x1A1018, - 0x1A0FD4, - 0x1A0FB0, - 0x1A0FA4, - 0x1A0F98, - 0x1A0F74, - 0x1A0F68, - 0x1A0F5C, - 0x1A0F50, - 0x1A0F44, - 0x1A0F38, - 0x1A0F2C, - 0x1A0F20, - 0x1A0F14, - 0x1A0F08, - 0x1A0EFC, - 0x1A0EF0, - 0x1A0EE4, - 0x1A0ED8, - 0x1A0EC8, - 0x1A0EB8, - 0x1A0EA8, - 0x1A0E9C, - 0x1A0E90, - 0x1A0E84, - 0x1A0E78, - 0x1A0E6C, - 0x1A0E60, - 0x1A0E54, - 0x1A0E48, - 0x1A0E3C, - 0x1A0E30, - 0x1A0E24, - 0x1A0E18, - 0x1A0E0C, - 0x1A0E00, - 0x1A0DF4, - 0x1A0DE8, - 0x1A0DDC, - 0x1A0DD0, - 0x1A0DA4, + 0x1da51c, + 0x1da478, + 0x1da430, + 0x1da420, + 0x1da404, + 0x1da3e8, + 0x1da330, + 0x1da1e0, + 0x1da1b4, + 0x1da13c, + 0x1da0c8, + 0x1d9fec, + 0x1d9f10, + 0x1d9e78, + 0x1d9cec, + 0x1d9cdc, + 0x1d9cd0, + 0x1d9cc4, + 0x1d9cb8, + 0x1d9cac, + 0x1d9ca0, + 0x1d9c94, + 0x1d9c88, + 0x1d9c1c, + 0x1d93a4, + 0x1d926c, + 0x1d91d4, + 0x1d9134, + 0x1d9108, + 0x1d9094, + 0x1d9020, + 0x1d8f48, + 0x1d8f3c, + 0x1d8f30, + 0x1d8f14, + 0x1d8f08, + 0x1d8efc, + 0x1d8ef0, + 0x1bc330, + 0x1bc324, + 0x1bc318, + 0x1bc30c, + 0x1bc300, + 0x1bc2f4, + 0x1bc2a4, + 0x1bc210, + 0x1bc18c, + 0x1bc124, + 0x1bc088, + 0x1bc06c, + 0x1bbffc, + 0x1bbf8c, + 0x1bbeb8, + 0x1bbde4, + 0x1bbd34, + 0x1bbd14, + 0x1bbc14, + 0x1bbbd8, + 0x1bbb60, + 0x1bbb0c, + 0x1bba5c, + 0x1bb9b8, + 0x1bb9a0, + 0x1bb8e4, + 0x1bb89c, + 0x1bb880, + 0x1bb704, + 0x1bb6e8, + 0x1bb6dc, + 0x1bb6d0, + 0x1bb6c4, + 0x1bb6b8, + 0x1bb6ac, + 0x1bb6a0, + 0x1bb694, + 0x1bb688, + 0x1bb67c, + 0x1bb66c, + 0x1bb660, + 0x1bb654, + 0x1bb648, + 0x1bb63c, + 0x1bb630, + 0x1bb624, + 0x1bb618, + 0x1bb60c, + 0x1bb600, + 0x1bb5f4, + 0x1bb5e8, + 0x1bb5dc, + 0x1bb5d0, + 0x1bb5c4, + 0x1bb5b8, + 0x1bb5ac, + 0x1bb580, + 0x1bb574, + 0x1bb558, + 0x1bb54c, + 0x1bb540, + 0x1bb534, + 0x1bb528, + 0x1bb51c, + 0x1bb510, + 0x1bb504, + 0x1bb4f8, + 0x1bb4ec, + 0x1bb4e0, + 0x1bb4d4, + 0x1bb4c8, + 0x1bb4bc, + 0x1bb4b0, + 0x1bb4a4, + 0x1bb408, + 0x1bb398, + 0x1bb2e0, + 0x1bb270, + 0x1bb14c, + 0x1bb140, + 0x1bb134, + 0x1bb128, + 0x1bb11c, + 0x1bb110, + 0x1baf84, + 0x1bac0c, + 0x1bab3c, + 0x1bab24, + 0x1bab18, + 0x1bab0c, + 0x1bab00, + 0x1baaf4, + 0x1baad8, + 0x1ba988, + 0x1ba97c, + 0x1ba970, + 0x1ba964, + 0x1ba958, + 0x1ba94c, + 0x1ba940, + 0x1ba918, + 0x1ba580, + 0x1ba4c0, + 0x1ba498, + 0x1ae0c8, + 0x1ae060, + 0x1ae048, + 0x1abcec, + 0x1abc48, + 0x1abb8c, + 0x1abb30, + 0x1ababc, + 0x1ab644, + 0x1ab5a8, + 0x1ab58c, + 0x1ab50c, + 0x1ab488, + 0x1ab3f0, + 0x1ab38c, + 0x1ab348, + 0x1ab31c, + 0x1ab300, + 0x1ab290, + 0x1ab220, + 0x1ab084, + 0x1ab04c, + 0x1aafc8, + 0x1aaf64, + 0x1a8d14, + 0x1a8c30, + 0x1a8290, + 0x1a8284, + 0x1a8168, + 0x1a8014, + 0x1a7f10, + 0x1a7eb8, + 0x1a7dc8, + 0x1a7d5c, + 0x1a7bf0, + 0x1a7b70, + 0x1a7b3c, + 0x1a7b0c, + 0x1a7a1c, + 0x1a7980, + 0x1a7910, + 0x1a783c, + 0x1a77a0, + 0x1a7718, + 0x1a769c, + 0x1a7620, + 0x1a75dc, + 0x1a75bc, + 0x1a7518, + 0x1a7500, + 0x1a74c0, + 0x1a7440, + 0x1a7434, + 0x1a7428, + 0x1a311c, + 0x1a3010, + 0x1a2ff8, + 0x1a2fa0, + 0x1a2f4c, + 0x1a2f18, + 0x1a2eec, + 0x1a2edc, + 0x1a2e98, + 0x1a2df8, + 0x1a2d00, + 0x1a2b80, + 0x1a2b58, + 0x1a2b30, + 0x1a2b04, + 0x1a2a80, + 0x1a2a20, + 0x1a29e0, + 0x1a29c0, + 0x1a2990, + 0x1a296c, + 0x1a1d70, + 0x1a1d48, + 0x1a1d38, + 0x1a1d18, + 0x1a1c9c, + 0x1a1c50, + 0x1a1c10, + 0x1a1be8, + 0x1a1bbc, + 0x1a1b74, + 0x1a1af8, + 0x1a1a58, + 0x1a1968, + 0x1a18d8, + 0x1a186c, + 0x1a1850, + 0x1a1804, + 0x1a17dc, + 0x1a1768, + 0x1a173c, + 0x1a1714, + 0x1a16d0, + 0x1a16a4, + 0x1a1680, + 0x1a1620, + 0x1a15b8, + 0x1a156c, + 0x1a1524, + 0x1a1494, + 0x1a1464, + 0x1a1440, + 0x1a1430, + 0x1a1414, + 0x1a1350, + 0x1a12c4, + 0x1a126c, + 0x1a1250, + 0x1a11f8, + 0x1a11b4, + 0x1a11a4, + 0x1a110c, + 0x1a10f8, + 0x1a1078, + 0x1a1018, + 0x1a0fd4, + 0x1a0fb0, + 0x1a0fa4, + 0x1a0f98, + 0x1a0f74, + 0x1a0f68, + 0x1a0f5c, + 0x1a0f50, + 0x1a0f44, + 0x1a0f38, + 0x1a0f2c, + 0x1a0f20, + 0x1a0f14, + 0x1a0f08, + 0x1a0efc, + 0x1a0ef0, + 0x1a0ee4, + 0x1a0ed8, + 0x1a0ec8, + 0x1a0eb8, + 0x1a0ea8, + 0x1a0e9c, + 0x1a0e90, + 0x1a0e84, + 0x1a0e78, + 0x1a0e6c, + 0x1a0e60, + 0x1a0e54, + 0x1a0e48, + 0x1a0e3c, + 0x1a0e30, + 0x1a0e24, + 0x1a0e18, + 0x1a0e0c, + 0x1a0e00, + 0x1a0df4, + 0x1a0de8, + 0x1a0ddc, + 0x1a0dd0, + 0x1a0da4, ] + +vanilla = [] + +azureHat = [ +[0x3CC884, 0xED, 0x7F, 0], +[0x3CC886, 0x8B, 0x73, 0], +[0x3CC8C4, 0xED, 0x7F, 1], +[0x3CC8C6, 0x8B, 0x73, 1], +[0x4F4CDC, 0xED, 0x7F, 0], +[0x4F4CDE, 0x8B, 0x73, 0], +[0x4F4D1C, 0xED, 0x7F, 1], +[0x4F4D1E, 0x8B, 0x73, 1], +[0x4F51D8, 0xED, 0x7F, 1], +[0x4F51DC, 0xED, 0x7F, 0], +[0x4F51E8, 0xD6, 0x7B, 0], +[0x4F51EA, 0xD6, 0x7B, 1], +[0x4F51DA, 0xFA, 0x7F, 1], +[0x4F51DE, 0xFA, 0x7F, 0], +[0x4FB686, 0xED, 0x7F, 0], +[0x4FB6A6, 0xED, 0x7F, 1], +[0x4FB684, 0x8E, 0x52, 0], +[0x4FB6A4, 0x8E, 0x52, 1], +[0x4FB688, 0xFA, 0x7F, 0], +[0x4FB6A8, 0xFA, 0x7F, 1], +[0x4FB786, 0x8B, 0x73, 0], +[0x4FB788, 0xED, 0x7F, 0], +[0x4FB78A, 0xFA, 0x7F, 0], +[0x4FB7A6, 0x8B, 0x73, 1], +[0x4FB7A8, 0xED, 0x7F, 1], +[0x4FB7AA, 0xFA, 0x7F, 1], +[0x51901C, 0xED, 0x7F, 0], +[0x519018, 0xC9, 0x5A, 0], +[0x51901A, 0x8B, 0x77, 0], +[0x51903C, 0xED, 0x7F, 1], +[0x519038, 0xC9, 0x5A, 1], +[0x51903A, 0x8B, 0x77, 1], +[0x5193EA, 0x8B, 0x73, 0], +[0x5193E8, 0xED, 0x7F, 0], +[0x51940A, 0x8B, 0x73, 1], +[0x519408, 0xED, 0x7F, 1], +[0x3A72AE, 0x60, 0x6F, 1], +[0x3A7244, 0x20, 0x67, 0], +[0x3A724C, 0x60, 0x6F, 1], +[0x3A7290, 0x40, 0x6B, 0], +[0x3A72B2, 0xA0, 0x77, 1], +[0x3A7270, 0xC0, 0x5A, 1], +[0x3A7288, 0xC0, 0x5A, 0], +[0x3A7296, 0x80, 0x73, 0], +[0x3A7274, 0x80, 0x73, 1], +[0x3A7294, 0x60, 0x6F, 0], +[0x3A724A, 0xA0, 0x77, 0], +[0x3A7278, 0xA0, 0x77, 1], +[0x3A724E, 0xC0, 0x7B, 0], +[0x3A727A, 0xC0, 0x7B, 1], +[0x3A7252, 0xE0, 0x7F, 0], +[0x3A727C, 0xE0, 0x7F, 1], +[0x3A72BC, 0xE0, 0x7F, 1], +[0x3A726C, 0x80, 0x52, 1], +[0x3A7286, 0x80, 0x52, 0], +[0x3A728C, 0x00, 0x63, 0], +[0x3A7272, 0x00, 0x63, 1], +[0x3A7254, 0xF3, 0x7F, 1], +[0x3A7256, 0xF3, 0x7F, 0], +[0x3A7264, 0xF3, 0x7F, 1], +[0x9F9A58, 0x56, 0x6B, 0], +[0x9F9A5E, 0x56, 0x6B, 1], +[0x9F9A2A, 0xED, 0x7F, 0], +[0x9F9A30, 0xED, 0x7F, 1], +[0x9F9A36, 0xCC, 0x7B, 0], +[0x9F9A3C, 0xCC, 0x7B, 1], +[0x9F9A4A, 0xCC, 0x7B, 0], +[0x9F9A50, 0xCC, 0x7B, 1], +[0x9F9A56, 0x0A, 0x63, 0], +[0x9F9A5C, 0x0A, 0x63, 1], +[0x9F9A28, 0x8E, 0x52, 0], +[0x9F9A2E, 0x8E, 0x52, 1], +[0x9F9A48, 0x8E, 0x52, 0], +[0x9F9A4E, 0x8E, 0x52, 1], +[0x9F9A34, 0x8B, 0x73, 0], +[0x9F9A3A, 0x8B, 0x73, 1], +[0x9F9A2C, 0xFA, 0x7F, 0], +[0x9F9A32, 0xFA, 0x7F, 1], +[0x9F9A38, 0xFA, 0x7F, 0], +[0x9F9A3E, 0xFA, 0x7F, 1], +[0x9F9A4C, 0xFA, 0x7F, 0], +[0x9F9A52, 0xFA, 0x7F, 1], +[0xA5DD46, 0xAC, 0x56, 0], +[0xA5DD44, 0x2A, 0x46, 0], +[0xA5DD4A, 0x90, 0x73, 0], +[0xA5DD3E, 0x80, 0x52, 0], +[0xA5DD40, 0xF2, 0x7F, 0], +[0xA5DD42, 0xFC, 0x7F, 0], +[0xA5DD48, 0x2F, 0x67, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0xAC, 0x56, 1], +[0xA5DD64, 0x2A, 0x46, 1], +[0xA5DD6A, 0x90, 0x73, 1], +[0xA5DD5E, 0x80, 0x52, 1], +[0xA5DD60, 0xF2, 0x7F, 1], +[0xA5DD62, 0xFC, 0x7F, 1], +[0xA5DD68, 0x2F, 0x67, 1], +[0x3D0E0C, 0xED, 0x7F, 1], +[0x3D0E18, 0xED, 0x7F, 0], +[0x3D0E0A, 0x8B, 0x73, 1], +[0x3D0E1A, 0x8B, 0x73, 0], +[0x3D0E08, 0xFA, 0x7F, 1], +[0x3D0E16, 0xFA, 0x7F, 0], +[0x3CC9C4, 0xED, 0x7F, 0], +[0x3CC9C6, 0x8B, 0x73, 0], +[0x3CDE7C, 0xED, 0x7F, 1], +[0x3CDE7E, 0x8B, 0x73, 1], +[0x51AD2C, 0xED, 0x7F, 0], +[0x51AD2E, 0x8B, 0x73, 0], +[0x51AD4C, 0xED, 0x7F, 1], +[0x51AD4E, 0x8B, 0x73, 1], +[0x51A4AE, 0x8B, 0x73, 0], +[0x51A4AC, 0xED, 0x7F, 0], +[0x51A4CC, 0xED, 0x7F, 1], +[0x51A4CE, 0x8B, 0x73, 1], +[0x51A98C, 0xED, 0x7F, 0], +[0x51A98E, 0x8B, 0x73, 0], +[0x51A96C, 0xED, 0x7F, 1], +[0x51A96E, 0x8B, 0x73, 1], +[0x51AA00, 0x8B, 0x73, 0], +[0x51AA10, 0x8B, 0x73, 1], +[0x51AA02, 0xA8, 0x56, 0], +[0x51AA12, 0xA8, 0x56, 1], +[0x51A9FE, 0xED, 0x7F, 0], +[0x51AA0E, 0xED, 0x7F, 1], +[0x51AA0A, 0xF3, 0x7F, 0], +[0x3CC984, 0xED, 0x7F, 0], +[0x3CC986, 0x8B, 0x73, 0], +[0x3D4B52, 0xAB, 0x77, 0], +[0x3D4B5C, 0x09, 0x63, 0], +[0x3D4B54, 0xED, 0x7F, 0], +[0x3D4B56, 0x8B, 0x73, 0], +[0x3D4B50, 0xFA, 0x7F, 0], +[0x3CCA44, 0xED, 0x7F, 1], +[0x3CCA46, 0x8B, 0x73, 1], +[0x3CFB3C, 0xED, 0x7F, 0], +[0x3CFB3E, 0x8B, 0x73, 0], +[0x3CFB7C, 0xED, 0x7F, 1], +[0x3CFB7E, 0x8B, 0x73, 1], +[0x3D504C, 0xAC, 0x77, 0], +[0x3D504A, 0xED, 0x7F, 0], +[0x3D504E, 0x8B, 0x73, 0], +[0x3D508C, 0xAC, 0x77, 1], +[0x3D508A, 0xED, 0x7F, 1], +[0x3D508E, 0x8B, 0x73, 1], +[0xA5DDA2, 0xAC, 0x56, 0], +[0xA5DDC2, 0xAC, 0x56, 1], +[0xA5DDA6, 0x90, 0x73, 0], +[0xA5DDC6, 0x90, 0x73, 1], +[0xA5DDA4, 0x2F, 0x67, 0], +[0xA5DDC4, 0x2F, 0x67, 1], +[0xA5DDA8, 0x97, 0x73, 0], +[0xA5DDC8, 0x97, 0x73, 1], +[0x3D3E0C, 0xED, 0x7F, 1], +[0x3D3E10, 0xED, 0x7F, 0], +[0x3D3E0E, 0x8B, 0x73, 1], +[0x3D3E12, 0x8B, 0x73, 0], +[0x3CF1C0, 0xED, 0x7F, 0], +[0x3CF200, 0xED, 0x7F, 1], +[0x3CF1C2, 0x8B, 0x73, 0], +[0x3CF202, 0x8B, 0x73, 1], +[0x3D360E, 0x60, 0x6F, 1], +[0x3D3614, 0x60, 0x6F, 0], +[0x3D360C, 0xFA, 0x7F, 1], +[0x3D3612, 0xFA, 0x7F, 0], +[0x3D3604, 0x2F, 0x67, 0], +[0x3D3606, 0x2F, 0x67, 1], +[0x3D360A, 0xFA, 0x7F, 1], +[0x3D3610, 0xFA, 0x7F, 0], +[0x3D1A48, 0x00, 0x63, 0], +[0x3D1A46, 0xFA, 0x7F, 0], +[0x3D1A44, 0xFA, 0x7F, 0], +[0x3D1A4A, 0x2F, 0x67, 0], +[0x3D1A88, 0x00, 0x63, 1], +[0x3D1A8A, 0xBB, 0xB8, 1], +[0x3D1A86, 0xFA, 0x7F, 1], +[0x3D1A84, 0xFA, 0x7F, 1], +[0x3CE282, 0x8B, 0x73, 0], +[0x3CE2C2, 0x8B, 0x73, 1], +[0x3CE280, 0xFA, 0x7F, 0], +[0x3CE2C0, 0xFA, 0x7F, 1], +[0x4FA29E, 0x8B, 0x73, 0], +[0x4FA2DE, 0x8B, 0x73, 1], +[0x4FA29C, 0xFA, 0x7F, 0], +[0x4FA2DC, 0xFA, 0x7F, 1], +[0x3D4786, 0xF3, 0x7F, 1], +[0x3D478C, 0xF3, 0x7F, 0], +[0x3D478E, 0x40, 0x6B, 0], +[0x3D4788, 0x40, 0x6B, 1], +[0x3D4790, 0x40, 0x6B, 0], +[0x3D478A, 0xAC, 0x77, 1], +[0x3D4794, 0x2F, 0x67, 0], +[0x3D4792, 0xAC, 0x77, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0xFA, 0x7F, 1], +[0x3C9E40, 0xFA, 0x7F, 0], +[0x3C9E38, 0xFA, 0x7F, 1], +[0x3C9E3E, 0xFA, 0x7F, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0xED, 0x7F, 0], +[0x4F4D5E, 0x8B, 0x73, 0], +[0x3C9320, 0xED, 0x7F, 0], +[0x3C9322, 0x8B, 0x73, 0], +[0x9F9CF6, 0xED, 0x7F, 0], +[0x9F9CF8, 0x8B, 0x73, 0], +[0x4F4E1C, 0xED, 0x7F, 1], +[0x4F4E1E, 0x8B, 0x73, 1], +[0x3C9450, 0xED, 0x7F, 1], +[0x3C9452, 0x8B, 0x73, 1], +[0x9F9D74, 0xED, 0x7F, 1], +[0x9F9D76, 0x8B, 0x73, 1], +[0xA6202E, 0xAC, 0x56, 0], +[0xA62032, 0x90, 0x73, 0], +[0xA62030, 0x2F, 0x67, 0], +[0xA62034, 0x97, 0x73, 0], +[0xA6204E, 0xAC, 0x56, 1], +[0xA62052, 0x90, 0x73, 1], +[0xA62050, 0x2F, 0x67, 1], +[0xA62054, 0x97, 0x73, 1], +[0x3D4812, 0x60, 0x6F, 0], +[0x3D480E, 0x60, 0x6F, 1], +[0x3D4810, 0xFA, 0x7F, 0], +[0x3D480C, 0xFA, 0x7F, 1], +[0x3CC9FE, 0xED, 0x7F, 0], +[0x3CCA0A, 0x8B, 0x73, 0], +[0x8CBE20, 0x00, 0x63, 0], +[0x8CBE22, 0x8B, 0x73, 0], +[0x8CBE1E, 0xF3, 0x7F, 0], +[0x8CBE40, 0x00, 0x63, 1], +[0x8CBE42, 0x8B, 0x73, 1], +[0x8CBE3E, 0xF3, 0x7F, 1], +[0x8CBEE0, 0xED, 0x7F, 0], +[0x8CBEDE, 0xFC, 0x7F, 0], +[0x8CBEE2, 0x8B, 0x73, 0], +[0x3B8F38, 0x00, 0x63, 1], +[0x3B8F3A, 0xFC, 0x7F, 1], +[0x3B8F40, 0x00, 0x63, 0], +[0x3B8F42, 0xFC, 0x7F, 0], +[0x3D1094, 0x40, 0x6B, 0], +[0x3D109A, 0x2A, 0x46, 0], +[0x3D1098, 0xC9, 0x5A, 0], +[0x3D1096, 0x8B, 0x77, 0], +[0x3D1092, 0xFC, 0x7F, 0], +[0x3D1090, 0xFA, 0x7F, 0], +[0x3D10D4, 0x40, 0x6B, 1], +[0x3D10DA, 0x2A, 0x46, 1], +[0x3D10D8, 0xC9, 0x5A, 1], +[0x3D10D6, 0x8B, 0x77, 1], +[0x3D10D2, 0xFC, 0x7F, 1], +[0x3D10D0, 0xFA, 0x7F, 1], +[0x3D14D0, 0xED, 0x7F, 0], +[0x3D14D2, 0x8B, 0x73, 0], +[0x3D14CE, 0xFA, 0x7F, 0], +[0x3D14CC, 0xD6, 0x7B, 0], +[0x3D1510, 0x60, 0x6F, 1], +[0x3D1512, 0x8B, 0x73, 1], +[0x3D150E, 0xFA, 0x7F, 1], +[0x3D150C, 0xD6, 0x7B, 1], +[0x3CE0F4, 0xAC, 0x56, 1], +[0x3CE0F2, 0x8B, 0x73, 1], +[0x3CE0F0, 0xD6, 0x7B, 1], +[0x3CE0D4, 0xAC, 0x56, 0], +[0x3CE0D2, 0x8B, 0x73, 0], +[0x3CE0D0, 0xD6, 0x7B, 0]] + +blackHat = [ +[0x3CC884, 0x84, 0x10, 0], +[0x3CC886, 0x63, 0x0C, 0], +[0x3CC8C4, 0x84, 0x10, 1], +[0x3CC8C6, 0x63, 0x0C, 1], +[0x4F4CDC, 0x84, 0x10, 0], +[0x4F4CDE, 0x63, 0x0C, 0], +[0x4F4D1C, 0x84, 0x10, 1], +[0x4F4D1E, 0x63, 0x0C, 1], +[0x4F51D8, 0x84, 0x10, 1], +[0x4F51DC, 0x84, 0x10, 0], +[0x4F51E8, 0x08, 0x21, 0], +[0x4F51EA, 0x08, 0x21, 1], +[0x4F51DA, 0x4A, 0x29, 1], +[0x4F51DE, 0x4A, 0x29, 0], +[0x4FB686, 0x84, 0x10, 0], +[0x4FB6A6, 0x84, 0x10, 1], +[0x4FB684, 0x21, 0x04, 0], +[0x4FB6A4, 0x21, 0x04, 1], +[0x4FB688, 0x4A, 0x29, 0], +[0x4FB6A8, 0x4A, 0x29, 1], +[0x4FB786, 0x84, 0x10, 0], +[0x4FB788, 0x4A, 0x29, 0], +[0x4FB78A, 0x73, 0x4E, 0], +[0x4FB7A6, 0x84, 0x10, 1], +[0x4FB7A8, 0x4A, 0x29, 1], +[0x4FB7AA, 0x73, 0x4E, 1], +[0x51901C, 0x84, 0x10, 0], +[0x519018, 0x42, 0x08, 0], +[0x51901A, 0x63, 0x0C, 0], +[0x51903C, 0x84, 0x10, 1], +[0x519038, 0x42, 0x08, 1], +[0x51903A, 0x63, 0x0C, 1], +[0x5193EA, 0x63, 0x0C, 0], +[0x5193E8, 0x84, 0x10, 0], +[0x51940A, 0x63, 0x0C, 1], +[0x519408, 0x84, 0x10, 1], +[0x3A72AE, 0x84, 0x10, 1], +[0x3A7244, 0xA5, 0x14, 0], +[0x3A724C, 0x08, 0x21, 1], +[0x3A7290, 0xC6, 0x18, 0], +[0x3A72B2, 0xA5, 0x14, 1], +[0x3A7270, 0x63, 0x0C, 1], +[0x3A7288, 0x63, 0x0C, 0], +[0x3A7296, 0x29, 0x25, 0], +[0x3A7274, 0xA5, 0x14, 1], +[0x3A7294, 0x08, 0x21, 0], +[0x3A724A, 0x6B, 0x2D, 0], +[0x3A7278, 0xE7, 0x1C, 1], +[0x3A724E, 0xCE, 0x39, 0], +[0x3A727A, 0x29, 0x25, 1], +[0x3A7252, 0x10, 0x42, 0], +[0x3A727C, 0xAD, 0x35, 1], +[0x3A72BC, 0xAD, 0x35, 1], +[0x3A726C, 0x21, 0x04, 1], +[0x3A7286, 0x21, 0x04, 0], +[0x3A728C, 0x84, 0x10, 0], +[0x3A7272, 0x84, 0x10, 1], +[0x3A7254, 0x31, 0x46, 1], +[0x3A7256, 0x52, 0x4A, 0], +[0x3A7264, 0x31, 0x46, 1], +[0x9F9A58, 0x84, 0x10, 0], +[0x9F9A5E, 0x84, 0x10, 1], +[0x9F9A2A, 0x84, 0x10, 0], +[0x9F9A30, 0x84, 0x10, 1], +[0x9F9A36, 0x84, 0x10, 0], +[0x9F9A3C, 0x84, 0x10, 1], +[0x9F9A4A, 0x84, 0x10, 0], +[0x9F9A50, 0x84, 0x10, 1], +[0x9F9A56, 0x63, 0x0C, 0], +[0x9F9A5C, 0x63, 0x0C, 1], +[0x9F9A28, 0x21, 0x04, 0], +[0x9F9A2E, 0x21, 0x04, 1], +[0x9F9A48, 0x21, 0x04, 0], +[0x9F9A4E, 0x21, 0x04, 1], +[0x9F9A34, 0x63, 0x0C, 0], +[0x9F9A3A, 0x63, 0x0C, 1], +[0x9F9A2C, 0x4A, 0x29, 0], +[0x9F9A32, 0x4A, 0x29, 1], +[0x9F9A38, 0x4A, 0x29, 0], +[0x9F9A3E, 0x4A, 0x29, 1], +[0x9F9A4C, 0x4A, 0x29, 0], +[0x9F9A52, 0x4A, 0x29, 1], +[0xA5DD46, 0x63, 0x0C, 0], +[0xA5DD44, 0x00, 0x00, 0], +[0xA5DD4A, 0x6B, 0x2D, 0], +[0xA5DD3E, 0x21, 0x04, 0], +[0xA5DD40, 0xEF, 0x3D, 0], +[0xA5DD42, 0x52, 0x4A, 0], +[0xA5DD48, 0xE7, 0x1C, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x63, 0x0C, 1], +[0xA5DD64, 0x00, 0x00, 1], +[0xA5DD6A, 0x6B, 0x2D, 1], +[0xA5DD5E, 0x21, 0x04, 1], +[0xA5DD60, 0xEF, 0x3D, 1], +[0xA5DD62, 0x52, 0x4A, 1], +[0xA5DD68, 0xE7, 0x1C, 1], +[0x3D0E0C, 0x84, 0x10, 1], +[0x3D0E18, 0x84, 0x10, 0], +[0x3D0E0A, 0x63, 0x0C, 1], +[0x3D0E1A, 0x63, 0x0C, 0], +[0x3D0E08, 0x4A, 0x29, 1], +[0x3D0E16, 0x4A, 0x29, 0], +[0x3CC9C4, 0x84, 0x10, 0], +[0x3CC9C6, 0x63, 0x0C, 0], +[0x3CDE7C, 0x84, 0x10, 1], +[0x3CDE7E, 0x63, 0x0C, 1], +[0x51AD2C, 0x84, 0x10, 0], +[0x51AD2E, 0x63, 0x0C, 0], +[0x51AD4C, 0x84, 0x10, 1], +[0x51AD4E, 0x63, 0x0C, 1], +[0x51A4AE, 0x63, 0x0C, 0], +[0x51A4AC, 0x84, 0x10, 0], +[0x51A4CC, 0x84, 0x10, 1], +[0x51A4CE, 0x63, 0x0C, 1], +[0x51A98C, 0x84, 0x10, 0], +[0x51A98E, 0x63, 0x0C, 0], +[0x51A96C, 0x84, 0x10, 1], +[0x51A96E, 0x63, 0x0C, 1], +[0x51AA00, 0x63, 0x0C, 0], +[0x51AA10, 0x63, 0x0C, 1], +[0x51AA02, 0x42, 0x08, 0], +[0x51AA12, 0x63, 0x0C, 1], +[0x51A9FE, 0x84, 0x10, 0], +[0x51AA0E, 0x84, 0x10, 1], +[0x51AA0A, 0x31, 0x46, 0], +[0x3CC984, 0x84, 0x10, 0], +[0x3CC986, 0x63, 0x0C, 0], +[0x3D4B52, 0x84, 0x10, 0], +[0x3D4B5C, 0x00, 0x00, 0], +[0x3D4B54, 0x84, 0x10, 0], +[0x3D4B56, 0x63, 0x0C, 0], +[0x3D4B50, 0x4A, 0x29, 0], +[0x3CCA44, 0x84, 0x10, 1], +[0x3CCA46, 0x63, 0x0C, 1], +[0x3CFB3C, 0x84, 0x10, 0], +[0x3CFB3E, 0x63, 0x0C, 0], +[0x3CFB7C, 0x84, 0x10, 1], +[0x3CFB7E, 0x63, 0x0C, 1], +[0x3D504C, 0xE7, 0x1C, 0], +[0x3D504A, 0x6B, 0x2D, 0], +[0x3D504E, 0x63, 0x0C, 0], +[0x3D508C, 0xE7, 0x1C, 1], +[0x3D508A, 0x6B, 0x2D, 1], +[0x3D508E, 0x63, 0x0C, 1], +[0xA5DDA2, 0x63, 0x0C, 0], +[0xA5DDC2, 0x63, 0x0C, 1], +[0xA5DDA6, 0x6B, 0x2D, 0], +[0xA5DDC6, 0x6B, 0x2D, 1], +[0xA5DDA4, 0xE7, 0x1C, 0], +[0xA5DDC4, 0xE7, 0x1C, 1], +[0xA5DDA8, 0xEF, 0x3D, 0], +[0xA5DDC8, 0xEF, 0x3D, 1], +[0x3D3E0C, 0x84, 0x10, 1], +[0x3D3E10, 0x84, 0x10, 0], +[0x3D3E0E, 0x63, 0x0C, 1], +[0x3D3E12, 0x63, 0x0C, 0], +[0x3CF1C0, 0x84, 0x10, 0], +[0x3CF200, 0x84, 0x10, 1], +[0x3CF1C2, 0x63, 0x0C, 0], +[0x3CF202, 0x63, 0x0C, 1], +[0x3D360E, 0x08, 0x21, 1], +[0x3D3614, 0x08, 0x21, 0], +[0x3D360C, 0x4A, 0x29, 1], +[0x3D3612, 0x4A, 0x29, 0], +[0x3D3604, 0xE7, 0x1C, 0], +[0x3D3606, 0xE7, 0x1C, 1], +[0x3D360A, 0x4A, 0x29, 1], +[0x3D3610, 0x4A, 0x29, 0], +[0x3D1A48, 0x84, 0x10, 0], +[0x3D1A46, 0x4A, 0x29, 0], +[0x3D1A44, 0x4A, 0x29, 0], +[0x3D1A4A, 0xE7, 0x1C, 0], +[0x3D1A88, 0x84, 0x10, 1], +[0x3D1A8A, 0xEE, 0xE4, 1], +[0x3D1A86, 0x4A, 0x29, 1], +[0x3D1A84, 0x4A, 0x29, 1], +[0x3CE282, 0x63, 0x0C, 0], +[0x3CE2C2, 0x63, 0x0C, 1], +[0x3CE280, 0x4A, 0x29, 0], +[0x3CE2C0, 0x4A, 0x29, 1], +[0x4FA29E, 0x63, 0x0C, 0], +[0x4FA2DE, 0x63, 0x0C, 1], +[0x4FA29C, 0x4A, 0x29, 0], +[0x4FA2DC, 0x4A, 0x29, 1], +[0x3D4786, 0x31, 0x46, 1], +[0x3D478C, 0x31, 0x46, 0], +[0x3D478E, 0xC6, 0x18, 0], +[0x3D4788, 0xC6, 0x18, 1], +[0x3D4790, 0xC6, 0x18, 0], +[0x3D478A, 0xE7, 0x1C, 1], +[0x3D4794, 0xE7, 0x1C, 0], +[0x3D4792, 0xE7, 0x1C, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0x73, 0x4E, 1], +[0x3C9E40, 0x73, 0x4E, 0], +[0x3C9E38, 0x73, 0x4E, 1], +[0x3C9E3E, 0x73, 0x4E, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0x84, 0x10, 0], +[0x4F4D5E, 0x63, 0x0C, 0], +[0x3C9320, 0x84, 0x10, 0], +[0x3C9322, 0x63, 0x0C, 0], +[0x9F9CF6, 0x84, 0x10, 0], +[0x9F9CF8, 0x63, 0x0C, 0], +[0x4F4E1C, 0x84, 0x10, 1], +[0x4F4E1E, 0x63, 0x0C, 1], +[0x3C9450, 0x84, 0x10, 1], +[0x3C9452, 0x63, 0x0C, 1], +[0x9F9D74, 0x84, 0x10, 1], +[0x9F9D76, 0x63, 0x0C, 1], +[0xA6202E, 0x63, 0x0C, 0], +[0xA62032, 0x6B, 0x2D, 0], +[0xA62030, 0xE7, 0x1C, 0], +[0xA62034, 0xEF, 0x3D, 0], +[0xA6204E, 0x63, 0x0C, 1], +[0xA62052, 0x6B, 0x2D, 1], +[0xA62050, 0xE7, 0x1C, 1], +[0xA62054, 0xEF, 0x3D, 1], +[0x3D4812, 0x08, 0x21, 0], +[0x3D480E, 0x08, 0x21, 1], +[0x3D4810, 0x4A, 0x29, 0], +[0x3D480C, 0x4A, 0x29, 1], +[0x3CC9FE, 0x84, 0x10, 0], +[0x3CCA0A, 0x63, 0x0C, 0], +[0x8CBE20, 0x84, 0x10, 0], +[0x8CBE22, 0x63, 0x0C, 0], +[0x8CBE1E, 0x31, 0x46, 0], +[0x8CBE40, 0x84, 0x10, 1], +[0x8CBE42, 0x63, 0x0C, 1], +[0x8CBE3E, 0x31, 0x46, 1], +[0x8CBEE0, 0x84, 0x10, 0], +[0x8CBEDE, 0x52, 0x4A, 0], +[0x8CBEE2, 0x63, 0x0C, 0], +[0x3B8F38, 0x84, 0x10, 1], +[0x3B8F3A, 0x52, 0x4A, 1], +[0x3B8F40, 0x84, 0x10, 0], +[0x3B8F42, 0x52, 0x4A, 0], +[0x3D1094, 0xC6, 0x18, 0], +[0x3D109A, 0x00, 0x00, 0], +[0x3D1098, 0x42, 0x08, 0], +[0x3D1096, 0x63, 0x0C, 0], +[0x3D1092, 0x52, 0x4A, 0], +[0x3D1090, 0x4A, 0x29, 0], +[0x3D10D4, 0xC6, 0x18, 1], +[0x3D10DA, 0x00, 0x00, 1], +[0x3D10D8, 0x42, 0x08, 1], +[0x3D10D6, 0x63, 0x0C, 1], +[0x3D10D2, 0x52, 0x4A, 1], +[0x3D10D0, 0x4A, 0x29, 1], +[0x3D14D0, 0x84, 0x10, 0], +[0x3D14D2, 0x63, 0x0C, 0], +[0x3D14CE, 0x4A, 0x29, 0], +[0x3D14CC, 0x08, 0x21, 0], +[0x3D1510, 0x08, 0x21, 1], +[0x3D1512, 0x63, 0x0C, 1], +[0x3D150E, 0x4A, 0x29, 1], +[0x3D150C, 0x08, 0x21, 1], +[0x3CE0F4, 0x63, 0x0C, 1], +[0x3CE0F2, 0x63, 0x0C, 1], +[0x3CE0F0, 0x08, 0x21, 1], +[0x3CE0D4, 0x63, 0x0C, 0], +[0x3CE0D2, 0x63, 0x0C, 0], +[0x3CE0D0, 0x08, 0x21, 0]] + +blueHat = [ +[0x3CC884, 0x00, 0x7C, 0], +[0x3CC886, 0x00, 0x5C, 0], +[0x3CC8C4, 0x00, 0x7C, 1], +[0x3CC8C6, 0x00, 0x5C, 1], +[0x4F4CDC, 0x00, 0x7C, 0], +[0x4F4CDE, 0x00, 0x5C, 0], +[0x4F4D1C, 0x00, 0x7C, 1], +[0x4F4D1E, 0x00, 0x5C, 1], +[0x4F51D8, 0x00, 0x7C, 1], +[0x4F51DC, 0x00, 0x7C, 0], +[0x4F51E8, 0x73, 0x72, 0], +[0x4F51EA, 0x73, 0x72, 1], +[0x4F51DA, 0xB5, 0x7E, 1], +[0x4F51DE, 0xB5, 0x7E, 0], +[0x4FB686, 0x00, 0x7C, 0], +[0x4FB6A6, 0x00, 0x7C, 1], +[0x4FB684, 0xA5, 0x38, 0], +[0x4FB6A4, 0xA5, 0x38, 1], +[0x4FB688, 0xB5, 0x7E, 0], +[0x4FB6A8, 0xB5, 0x7E, 1], +[0x4FB786, 0x00, 0x7C, 0], +[0x4FB788, 0xB5, 0x7E, 0], +[0x4FB78A, 0x9C, 0x7F, 0], +[0x4FB7A6, 0x00, 0x7C, 1], +[0x4FB7A8, 0xB5, 0x7E, 1], +[0x4FB7AA, 0x9C, 0x7F, 1], +[0x51901C, 0x00, 0x7C, 0], +[0x519018, 0x00, 0x50, 0], +[0x51901A, 0x00, 0x5C, 0], +[0x51903C, 0x00, 0x7C, 1], +[0x519038, 0x00, 0x50, 1], +[0x51903A, 0x00, 0x5C, 1], +[0x5193EA, 0x00, 0x5C, 0], +[0x5193E8, 0x00, 0x7C, 0], +[0x51940A, 0x00, 0x5C, 1], +[0x519408, 0x00, 0x7C, 1], +[0x3A72AE, 0xC5, 0x4C, 1], +[0x3A7244, 0xC5, 0x4C, 0], +[0x3A724C, 0x07, 0x5D, 1], +[0x3A7290, 0xE6, 0x54, 0], +[0x3A72B2, 0xE6, 0x54, 1], +[0x3A7270, 0x42, 0x3C, 1], +[0x3A7288, 0x42, 0x3C, 0], +[0x3A7296, 0x07, 0x65, 0], +[0x3A7274, 0x07, 0x65, 1], +[0x3A7294, 0x07, 0x5D, 0], +[0x3A724A, 0x28, 0x71, 0], +[0x3A7278, 0x28, 0x71, 1], +[0x3A724E, 0x49, 0x7D, 0], +[0x3A727A, 0x49, 0x7D, 1], +[0x3A7252, 0xAC, 0x7D, 0], +[0x3A727C, 0xAC, 0x7D, 1], +[0x3A72BC, 0xAC, 0x7D, 1], +[0x3A726C, 0x00, 0x38, 1], +[0x3A7286, 0x00, 0x38, 0], +[0x3A728C, 0x84, 0x44, 0], +[0x3A7272, 0x84, 0x44, 1], +[0x3A7254, 0x0F, 0x7E, 1], +[0x3A7256, 0x0F, 0x7E, 0], +[0x3A7264, 0x0F, 0x7E, 1], +[0x9F9A58, 0xAD, 0x4D, 0], +[0x9F9A5E, 0xAD, 0x4D, 1], +[0x9F9A2A, 0x00, 0x7C, 0], +[0x9F9A30, 0x00, 0x7C, 1], +[0x9F9A36, 0x00, 0x7C, 0], +[0x9F9A3C, 0x00, 0x7C, 1], +[0x9F9A4A, 0x00, 0x7C, 0], +[0x9F9A50, 0x00, 0x7C, 1], +[0x9F9A56, 0x00, 0x54, 0], +[0x9F9A5C, 0x00, 0x54, 1], +[0x9F9A28, 0xA5, 0x38, 0], +[0x9F9A2E, 0xA5, 0x38, 1], +[0x9F9A48, 0xA5, 0x38, 0], +[0x9F9A4E, 0xA5, 0x38, 1], +[0x9F9A34, 0x00, 0x5C, 0], +[0x9F9A3A, 0x00, 0x5C, 1], +[0x9F9A2C, 0xB5, 0x7E, 0], +[0x9F9A32, 0xB5, 0x7E, 1], +[0x9F9A38, 0xB5, 0x7E, 0], +[0x9F9A3E, 0xB5, 0x7E, 1], +[0x9F9A4C, 0xB5, 0x7E, 0], +[0x9F9A52, 0xB5, 0x7E, 1], +[0xA5DD46, 0x8C, 0x5D, 0], +[0xA5DD44, 0x4A, 0x4D, 0], +[0xA5DD4A, 0x31, 0x7E, 0], +[0xA5DD3E, 0xAD, 0x4D, 0], +[0xA5DD40, 0xD6, 0x7E, 0], +[0xA5DD42, 0x7B, 0x7F, 0], +[0xA5DD48, 0xEF, 0x71, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x8C, 0x5D, 1], +[0xA5DD64, 0x4A, 0x4D, 1], +[0xA5DD6A, 0x31, 0x7E, 1], +[0xA5DD5E, 0xAD, 0x4D, 1], +[0xA5DD60, 0xD6, 0x7E, 1], +[0xA5DD62, 0x7B, 0x7F, 1], +[0xA5DD68, 0xEF, 0x71, 1], +[0x3D0E0C, 0x00, 0x7C, 1], +[0x3D0E18, 0x00, 0x7C, 0], +[0x3D0E0A, 0x00, 0x5C, 1], +[0x3D0E1A, 0x00, 0x5C, 0], +[0x3D0E08, 0xB5, 0x7E, 1], +[0x3D0E16, 0xB5, 0x7E, 0], +[0x3CC9C4, 0x00, 0x7C, 0], +[0x3CC9C6, 0x00, 0x5C, 0], +[0x3CDE7C, 0x00, 0x7C, 1], +[0x3CDE7E, 0x00, 0x5C, 1], +[0x51AD2C, 0x00, 0x7C, 0], +[0x51AD2E, 0x00, 0x5C, 0], +[0x51AD4C, 0x00, 0x7C, 1], +[0x51AD4E, 0x00, 0x5C, 1], +[0x51A4AE, 0x00, 0x5C, 0], +[0x51A4AC, 0x00, 0x7C, 0], +[0x51A4CC, 0x00, 0x7C, 1], +[0x51A4CE, 0x00, 0x5C, 1], +[0x51A98C, 0x00, 0x7C, 0], +[0x51A98E, 0x00, 0x5C, 0], +[0x51A96C, 0x00, 0x7C, 1], +[0x51A96E, 0x00, 0x5C, 1], +[0x51AA00, 0x00, 0x70, 0], +[0x51AA10, 0x00, 0x70, 1], +[0x51AA02, 0x00, 0x5C, 0], +[0x51AA12, 0x00, 0x5C, 1], +[0x51A9FE, 0x00, 0x7C, 0], +[0x51AA0E, 0x00, 0x7C, 1], +[0x51AA0A, 0x0F, 0x7E, 0], +[0x3CC984, 0x00, 0x7C, 0], +[0x3CC986, 0x00, 0x5C, 0], +[0x3D4B52, 0x00, 0x70, 0], +[0x3D4B5C, 0x00, 0x50, 0], +[0x3D4B54, 0x00, 0x7C, 0], +[0x3D4B56, 0x00, 0x5C, 0], +[0x3D4B50, 0xB5, 0x7E, 0], +[0x3CCA44, 0x00, 0x7C, 1], +[0x3CCA46, 0x00, 0x5C, 1], +[0x3CFB3C, 0x00, 0x7C, 0], +[0x3CFB3E, 0x00, 0x5C, 0], +[0x3CFB7C, 0x00, 0x7C, 1], +[0x3CFB7E, 0x00, 0x5C, 1], +[0x3D504C, 0x00, 0x6C, 0], +[0x3D504A, 0x00, 0x7C, 0], +[0x3D504E, 0x00, 0x5C, 0], +[0x3D508C, 0x00, 0x6C, 1], +[0x3D508A, 0x00, 0x7C, 1], +[0x3D508E, 0x00, 0x5C, 1], +[0xA5DDA2, 0x8C, 0x5D, 0], +[0xA5DDC2, 0x8C, 0x5D, 1], +[0xA5DDA6, 0x31, 0x7E, 0], +[0xA5DDC6, 0x31, 0x7E, 1], +[0xA5DDA4, 0xEF, 0x71, 0], +[0xA5DDC4, 0xEF, 0x71, 1], +[0xA5DDA8, 0xB5, 0x7E, 0], +[0xA5DDC8, 0xB5, 0x7E, 1], +[0x3D3E0C, 0x00, 0x7C, 1], +[0x3D3E10, 0x00, 0x7C, 0], +[0x3D3E0E, 0x00, 0x5C, 1], +[0x3D3E12, 0x00, 0x5C, 0], +[0x3CF1C0, 0x00, 0x7C, 0], +[0x3CF200, 0x00, 0x7C, 1], +[0x3CF1C2, 0x00, 0x5C, 0], +[0x3CF202, 0x00, 0x5C, 1], +[0x3D360E, 0x07, 0x5D, 1], +[0x3D3614, 0x07, 0x5D, 0], +[0x3D360C, 0xB5, 0x7E, 1], +[0x3D3612, 0xB5, 0x7E, 0], +[0x3D3604, 0xEF, 0x71, 0], +[0x3D3606, 0xEF, 0x71, 1], +[0x3D360A, 0xB5, 0x7E, 1], +[0x3D3610, 0xB5, 0x7E, 0], +[0x3D1A48, 0x84, 0x44, 0], +[0x3D1A46, 0xB5, 0x7E, 0], +[0x3D1A44, 0xB5, 0x7E, 0], +[0x3D1A4A, 0xEF, 0x71, 0], +[0x3D1A88, 0x84, 0x44, 1], +[0x3D1A8A, 0xCC, 0xC4, 1], +[0x3D1A86, 0xB5, 0x7E, 1], +[0x3D1A84, 0xB5, 0x7E, 1], +[0x3CE282, 0x00, 0x5C, 0], +[0x3CE2C2, 0x00, 0x5C, 1], +[0x3CE280, 0xB5, 0x7E, 0], +[0x3CE2C0, 0xB5, 0x7E, 1], +[0x4FA29E, 0x00, 0x5C, 0], +[0x4FA2DE, 0x00, 0x5C, 1], +[0x4FA29C, 0xB5, 0x7E, 0], +[0x4FA2DC, 0xB5, 0x7E, 1], +[0x3D4786, 0x0F, 0x7E, 1], +[0x3D478C, 0x0F, 0x7E, 0], +[0x3D478E, 0xE6, 0x54, 0], +[0x3D4788, 0xE6, 0x54, 1], +[0x3D4790, 0xE6, 0x54, 0], +[0x3D478A, 0x00, 0x6C, 1], +[0x3D4794, 0xEF, 0x71, 0], +[0x3D4792, 0x00, 0x6C, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0x9C, 0x7F, 1], +[0x3C9E40, 0x9C, 0x7F, 0], +[0x3C9E38, 0x9C, 0x7F, 1], +[0x3C9E3E, 0x9C, 0x7F, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0x00, 0x7C, 0], +[0x4F4D5E, 0x00, 0x5C, 0], +[0x3C9320, 0x00, 0x7C, 0], +[0x3C9322, 0x00, 0x5C, 0], +[0x9F9CF6, 0x00, 0x7C, 0], +[0x9F9CF8, 0x00, 0x5C, 0], +[0x4F4E1C, 0x00, 0x7C, 1], +[0x4F4E1E, 0x00, 0x5C, 1], +[0x3C9450, 0x00, 0x7C, 1], +[0x3C9452, 0x00, 0x5C, 1], +[0x9F9D74, 0x00, 0x7C, 1], +[0x9F9D76, 0x00, 0x5C, 1], +[0xA6202E, 0x8C, 0x5D, 0], +[0xA62032, 0x31, 0x7E, 0], +[0xA62030, 0xEF, 0x71, 0], +[0xA62034, 0xB5, 0x7E, 0], +[0xA6204E, 0x8C, 0x5D, 1], +[0xA62052, 0x31, 0x7E, 1], +[0xA62050, 0xEF, 0x71, 1], +[0xA62054, 0xB5, 0x7E, 1], +[0x3D4812, 0x07, 0x5D, 0], +[0x3D480E, 0x07, 0x5D, 1], +[0x3D4810, 0xB5, 0x7E, 0], +[0x3D480C, 0xB5, 0x7E, 1], +[0x3CC9FE, 0x00, 0x7C, 0], +[0x3CCA0A, 0x00, 0x5C, 0], +[0x8CBE20, 0x84, 0x44, 0], +[0x8CBE22, 0x00, 0x5C, 0], +[0x8CBE1E, 0x0F, 0x7E, 0], +[0x8CBE40, 0x84, 0x44, 1], +[0x8CBE42, 0x00, 0x5C, 1], +[0x8CBE3E, 0x0F, 0x7E, 1], +[0x8CBEE0, 0x00, 0x7C, 0], +[0x8CBEDE, 0x7B, 0x7F, 0], +[0x8CBEE2, 0x00, 0x5C, 0], +[0x3B8F38, 0x84, 0x44, 1], +[0x3B8F3A, 0x7B, 0x7F, 1], +[0x3B8F40, 0x84, 0x44, 0], +[0x3B8F42, 0x7B, 0x7F, 0], +[0x3D1094, 0xE6, 0x54, 0], +[0x3D109A, 0x4A, 0x4D, 0], +[0x3D1098, 0x00, 0x50, 0], +[0x3D1096, 0x00, 0x5C, 0], +[0x3D1092, 0x7B, 0x7F, 0], +[0x3D1090, 0xB5, 0x7E, 0], +[0x3D10D4, 0xE6, 0x54, 1], +[0x3D10DA, 0x4A, 0x4D, 1], +[0x3D10D8, 0x00, 0x50, 1], +[0x3D10D6, 0x00, 0x5C, 1], +[0x3D10D2, 0x7B, 0x7F, 1], +[0x3D10D0, 0xB5, 0x7E, 1], +[0x3D14D0, 0x00, 0x7C, 0], +[0x3D14D2, 0x00, 0x5C, 0], +[0x3D14CE, 0xB5, 0x7E, 0], +[0x3D14CC, 0x73, 0x72, 0], +[0x3D1510, 0x07, 0x5D, 1], +[0x3D1512, 0x00, 0x5C, 1], +[0x3D150E, 0xB5, 0x7E, 1], +[0x3D150C, 0x73, 0x72, 1], +[0x3CE0F4, 0x8C, 0x5D, 1], +[0x3CE0F2, 0x00, 0x70, 1], +[0x3CE0F0, 0x73, 0x72, 1], +[0x3CE0D4, 0x8C, 0x5D, 0], +[0x3CE0D2, 0x00, 0x70, 0], +[0x3CE0D0, 0x73, 0x72, 0]] + +chaosHat = [ +[0x3CC884, 0], +[0x3CC886, 0], +[0x3CC984, 0], +[0x3CC986, 0], +[0x3D0E16, 0], +[0x3D0E18, 0], +[0x3D0E1A, 0], +[0x3D4B50, 0], +[0x3D4B52, 0], +[0x3D4B54, 0], +[0x3D4B56, 0], +[0x4F4CDC, 0], +[0x4F4CDE, 0], +[0x4F51DC, 0], +[0x4F51DE, 0], +[0x4F51E8, 0], +[0x4fb684, 0], +[0x4fb686, 0], +[0x4fb688, 0], +[0x4FB786, 0], +[0x4fb788, 0], +[0x4fb78a, 0], +[0x519018, 0], +[0x51901a, 0], +[0x51901c, 0], +[0x5193E8, 0], +[0x5193EA, 0], +[0x51A4AC, 0], +[0x51A4AE, 0], +[0x51A98C, 0], +[0x51A98E, 0], +[0x51AD2C, 0], +[0x51AD2E, 0], +[0x9F9A28, 0], +[0x9F9A2A, 0], +[0x9F9A2C, 0], +[0x9F9A34, 0], +[0x9F9A36, 0], +[0x9F9A38, 0], +[0x9F9A48, 0], +[0x9F9A4A, 0], +[0x9F9A4C, 0], +[0x9F9A56, 0], +[0x9F9A58, 0], +[0xA5DD3E, 0], +[0xA5DD40, 0], +[0xA5DD42, 0], +[0xA5DD44, 0], +[0xA5DD46, 0], +[0xA5DD48, 0], +[0xA5DD4A, 0], +[0x3CC8C4, 1], +[0x3CC8C6, 1], +[0x3D0E08, 1], +[0x3D0E0A, 1], +[0x3D0E0C, 1], +[0x4F4D1C, 1], +[0x4F4D1E, 1], +[0x4F51D8, 1], +[0x4F51DA, 1], +[0x4F51EA, 1], +[0x4fb6a4, 1], +[0x4fb6a6, 1], +[0x4fb6a8, 1], +[0x4FB7A6, 1], +[0x4FB7A8, 1], +[0x4FB7AA, 1], +[0x519038, 1], +[0x51903A, 1], +[0x51903c, 1], +[0x519408, 1], +[0x51940a, 1], +[0x51A4CC, 1], +[0x51A4CE, 1], +[0x51A96C, 1], +[0x51A96E, 1], +[0x51AD4C, 1], +[0x51AD4E, 1], +[0x9F9A2E, 1], +[0x9F9A30, 1], +[0x9F9A32, 1], +[0x9F9A3A, 1], +[0x9F9A3C, 1], +[0x9F9A3E, 1], +[0x9F9A4E, 1], +[0x9F9A50, 1], +[0x9F9A52, 1], +[0x9F9A5C, 1], +[0x9F9A5E, 1], +[0xA5DD5E, 1], +[0xA5DD60, 1], +[0xA5DD62, 1], +[0xA5DD64, 1], +[0xA5DD66, 1], +[0xA5DD68, 1], +[0xA5DD6A, 1], +[0x3A7256, 0], +[0x3A7252, 0], +[0x3A724E, 0], +[0x3A724A, 0], +[0x3A7296, 0], +[0x3A7294, 0], +[0x3A7290, 0], +[0x3A7244, 0], +[0x3A728C, 0], +[0x3A7288, 0], +[0x3A7286, 0], +[0x3A7254, 1], +[0x3A7264, 1], +[0x3A727C, 1], +[0x3A72BC, 1], +[0x3A727A, 1], +[0x3A7278, 1], +[0x3A7274, 1], +[0x3A724C, 1], +[0x3A72B2, 1], +[0x3A72AE, 1], +[0x3A7272, 1], +[0x3A7270, 1], +[0x3A726C, 1], +[0xA5DDA2, 0], +[0xA5DDA4, 0], +[0xA5DDA6, 0], +[0xA5DDA8, 0], +[0x3D3E10, 0], +[0x3D3E12, 0], +[0x3D504A, 0], +[0x3D504C, 0], +[0x3D504E, 0], +[0x3D4B5C, 0], +[0xA5DDC2, 1], +[0xA5DDC4, 1], +[0xA5DDC6, 1], +[0xA5DDC8, 1], +[0x3D3E0C, 1], +[0x3D3E0E, 1], +[0x3D508A, 1], +[0x3D508C, 1], +[0x3D508E, 1], +[0x51A9FE, 0], +[0x51AA00, 0], +[0x51AA02, 0], +[0x51AA0A, 0], +[0x51AA0E, 1], +[0x51AA10, 1], +[0x51AA12, 1], +[0x3CFB3C, 0], +[0x3CFB3E, 0], +[0x3CC9C4, 0], +[0x3CC9C6, 0], +[0x3CFB7C, 1], +[0x3CFB7E, 1], +[0x3CCA44, 1], +[0x3CCA46, 1], +[0x3CDE7C, 1], +[0x3CDE7E, 1]] + +greenHat = [ +[0x3CC884, 0xA3, 0x03, 0], +[0x3CC886, 0xE0, 0x02, 0], +[0x3CC8C4, 0xA3, 0x03, 1], +[0x3CC8C6, 0xE0, 0x02, 1], +[0x4F4CDC, 0xA3, 0x03, 0], +[0x4F4CDE, 0xE0, 0x02, 0], +[0x4F4D1C, 0xA3, 0x03, 1], +[0x4F4D1E, 0xE0, 0x02, 1], +[0x4F51D8, 0xA3, 0x03, 1], +[0x4F51DC, 0xA3, 0x03, 0], +[0x4F51E8, 0xB1, 0x3B, 0], +[0x4F51EA, 0xB1, 0x3B, 1], +[0x4F51DA, 0xF3, 0x43, 1], +[0x4F51DE, 0xF3, 0x43, 0], +[0x4FB686, 0xA3, 0x03, 0], +[0x4FB6A6, 0xA3, 0x03, 1], +[0x4FB684, 0xC2, 0x01, 0], +[0x4FB6A4, 0xC2, 0x01, 1], +[0x4FB688, 0xF6, 0x5B, 0], +[0x4FB6A8, 0xF6, 0x5B, 1], +[0x4FB786, 0xA3, 0x03, 0], +[0x4FB788, 0xF6, 0x5B, 0], +[0x4FB78A, 0xFB, 0x6F, 0], +[0x4FB7A6, 0xA3, 0x03, 1], +[0x4FB7A8, 0xF6, 0x5B, 1], +[0x4FB7AA, 0xFB, 0x6F, 1], +[0x51901C, 0xA3, 0x03, 0], +[0x519018, 0xE0, 0x01, 0], +[0x51901A, 0xE0, 0x02, 0], +[0x51903C, 0xA3, 0x03, 1], +[0x519038, 0xE0, 0x01, 1], +[0x51903A, 0xE0, 0x02, 1], +[0x5193EA, 0xA0, 0x02, 0], +[0x5193E8, 0xA3, 0x03, 0], +[0x51940A, 0xA0, 0x02, 1], +[0x519408, 0xA3, 0x03, 1], +[0x3A72AE, 0x26, 0x43, 1], +[0x3A7244, 0x26, 0x43, 0], +[0x3A724C, 0x34, 0x2F, 1], +[0x3A7290, 0x4C, 0x3F, 0], +[0x3A72B2, 0x4C, 0x3F, 1], +[0x3A7270, 0x4E, 0x2E, 1], +[0x3A7288, 0x4E, 0x2E, 0], +[0x3A7296, 0x6D, 0x3F, 0], +[0x3A7274, 0x6D, 0x3F, 1], +[0x3A7294, 0x70, 0x3B, 0], +[0x3A724A, 0x8F, 0x3B, 0], +[0x3A7278, 0x8F, 0x3B, 1], +[0x3A724E, 0xB4, 0x33, 0], +[0x3A727A, 0xB4, 0x33, 1], +[0x3A7252, 0xD7, 0x2B, 0], +[0x3A727C, 0xD7, 0x2B, 1], +[0x3A72BC, 0xD7, 0x2B, 1], +[0x3A726C, 0xEC, 0x29, 1], +[0x3A7286, 0xEC, 0x29, 0], +[0x3A728C, 0xF0, 0x36, 0], +[0x3A7272, 0xF0, 0x36, 1], +[0x3A7254, 0xF9, 0x33, 1], +[0x3A7256, 0xF9, 0x33, 0], +[0x3A7264, 0xF9, 0x33, 1], +[0x9F9A58, 0x0C, 0x32, 0], +[0x9F9A5E, 0x0C, 0x32, 1], +[0x9F9A2A, 0xA3, 0x03, 0], +[0x9F9A30, 0xA3, 0x03, 1], +[0x9F9A36, 0xA3, 0x03, 0], +[0x9F9A3C, 0xA3, 0x03, 1], +[0x9F9A4A, 0xA3, 0x03, 0], +[0x9F9A50, 0xA3, 0x03, 1], +[0x9F9A56, 0xC1, 0x01, 0], +[0x9F9A5C, 0xC1, 0x01, 1], +[0x9F9A28, 0xC2, 0x01, 0], +[0x9F9A2E, 0xC2, 0x01, 1], +[0x9F9A48, 0xC2, 0x01, 0], +[0x9F9A4E, 0xC2, 0x01, 1], +[0x9F9A34, 0xE2, 0x02, 0], +[0x9F9A3A, 0xE2, 0x02, 1], +[0x9F9A2C, 0xF6, 0x5B, 0], +[0x9F9A32, 0xF6, 0x5B, 1], +[0x9F9A38, 0xF6, 0x5B, 0], +[0x9F9A3E, 0xF6, 0x5B, 1], +[0x9F9A4C, 0xF6, 0x5B, 0], +[0x9F9A52, 0xF6, 0x5B, 1], +[0xA5DD46, 0x24, 0x1E, 0], +[0xA5DD44, 0x82, 0x19, 0], +[0xA5DD4A, 0x89, 0x3F, 0], +[0xA5DD3E, 0xA9, 0x2D, 0], +[0xA5DD40, 0xB0, 0x57, 0], +[0xA5DD42, 0xD5, 0x5F, 0], +[0xA5DD48, 0xE7, 0x32, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x24, 0x1E, 1], +[0xA5DD64, 0x82, 0x19, 1], +[0xA5DD6A, 0x89, 0x3F, 1], +[0xA5DD5E, 0xA9, 0x2D, 1], +[0xA5DD60, 0xB0, 0x57, 1], +[0xA5DD62, 0xD5, 0x5F, 1], +[0xA5DD68, 0xE7, 0x32, 1], +[0x3D0E0C, 0xA3, 0x03, 1], +[0x3D0E18, 0xA3, 0x03, 0], +[0x3D0E0A, 0xE0, 0x02, 1], +[0x3D0E1A, 0xE0, 0x02, 0], +[0x3D0E08, 0xF6, 0x5B, 1], +[0x3D0E16, 0xF6, 0x5B, 0], +[0x3CC9C4, 0xA3, 0x03, 0], +[0x3CC9C6, 0xE0, 0x02, 0], +[0x3CDE7C, 0xA3, 0x03, 1], +[0x3CDE7E, 0xE0, 0x02, 1], +[0x51AD2C, 0xA3, 0x03, 0], +[0x51AD2E, 0xE0, 0x02, 0], +[0x51AD4C, 0xA3, 0x03, 1], +[0x51AD4E, 0xE0, 0x02, 1], +[0x51A4AE, 0xA0, 0x02, 0], +[0x51A4AC, 0xA3, 0x03, 0], +[0x51A4CC, 0xA3, 0x03, 1], +[0x51A4CE, 0xE0, 0x02, 1], +[0x51A98C, 0xA3, 0x03, 0], +[0x51A98E, 0xE0, 0x02, 0], +[0x51A96C, 0xA3, 0x03, 1], +[0x51A96E, 0xE0, 0x02, 1], +[0x51AA00, 0x60, 0x02, 0], +[0x51AA10, 0x60, 0x02, 1], +[0x51AA02, 0x61, 0x01, 0], +[0x51AA12, 0x61, 0x01, 1], +[0x51A9FE, 0xA3, 0x03, 0], +[0x51AA0E, 0xA3, 0x03, 1], +[0x51AA0A, 0xF0, 0x3B, 0], +[0x3CC984, 0xA3, 0x03, 0], +[0x3CC986, 0xE0, 0x02, 0], +[0x3D4B52, 0x43, 0x03, 0], +[0x3D4B5C, 0x60, 0x02, 0], +[0x3D4B54, 0xA3, 0x03, 0], +[0x3D4B56, 0xE0, 0x02, 0], +[0x3D4B50, 0xF6, 0x5B, 0], +[0x3CCA44, 0xA3, 0x03, 1], +[0x3CCA46, 0xE0, 0x02, 1], +[0x3CFB3C, 0xA3, 0x03, 0], +[0x3CFB3E, 0xE0, 0x02, 0], +[0x3CFB7C, 0xA3, 0x03, 1], +[0x3CFB7E, 0xE0, 0x02, 1], +[0x3D504C, 0x41, 0x03, 0], +[0x3D504A, 0xA3, 0x03, 0], +[0x3D504E, 0xE0, 0x02, 0], +[0x3D508C, 0x41, 0x03, 1], +[0x3D508A, 0xA3, 0x03, 1], +[0x3D508E, 0xE0, 0x02, 1], +[0xA5DDA2, 0x24, 0x1E, 0], +[0xA5DDC2, 0x24, 0x1E, 1], +[0xA5DDA6, 0x89, 0x3F, 0], +[0xA5DDC6, 0x89, 0x3F, 1], +[0xA5DDA4, 0xE7, 0x32, 0], +[0xA5DDC4, 0xE7, 0x32, 1], +[0xA5DDA8, 0xF6, 0x63, 0], +[0xA5DDC8, 0xF6, 0x63, 1], +[0x3D3E0C, 0xA3, 0x03, 1], +[0x3D3E10, 0xA3, 0x03, 0], +[0x3D3E0E, 0xE0, 0x02, 1], +[0x3D3E12, 0xE0, 0x02, 0], +[0x3CF1C0, 0xA3, 0x03, 0], +[0x3CF200, 0xA3, 0x03, 1], +[0x3CF1C2, 0xE0, 0x02, 0], +[0x3CF202, 0xE0, 0x02, 1], +[0x3D360E, 0x00, 0x43, 1], +[0x3D3614, 0x00, 0x43, 0], +[0x3D360C, 0x80, 0x4F, 1], +[0x3D3612, 0x80, 0x4F, 0], +[0x3D3604, 0xC1, 0x01, 0], +[0x3D3606, 0xC1, 0x01, 1], +[0x3D360A, 0xE3, 0x63, 1], +[0x3D3610, 0xE3, 0x63, 0], +[0x3D1A48, 0x28, 0x1B, 0], +[0x3D1A46, 0xF6, 0x5B, 0], +[0x3D1A44, 0xFC, 0x5F, 0], +[0x3D1A4A, 0xE7, 0x32, 0], +[0x3D1A88, 0x28, 0x1B, 1], +[0x3D1A8A, 0x81, 0x02, 1], +[0x3D1A86, 0xF6, 0x5B, 1], +[0x3D1A84, 0xFC, 0x5F, 1], +[0x3CE282, 0xA0, 0x36, 0], +[0x3CE2C2, 0xA0, 0x36, 1], +[0x3CE280, 0xE0, 0x4F, 0], +[0x3CE2C0, 0xE0, 0x4F, 1], +[0x4FA29E, 0xA0, 0x36, 0], +[0x4FA2DE, 0xA0, 0x36, 1], +[0x4FA29C, 0xE0, 0x4F, 0], +[0x4FA2DC, 0xE0, 0x4F, 1], +[0x3D4786, 0xA0, 0x07, 1], +[0x3D478C, 0xA0, 0x07, 0], +[0x3D478E, 0xC0, 0x02, 0], +[0x3D4788, 0xC0, 0x02, 1], +[0x3D4790, 0xC0, 0x02, 0], +[0x3D478A, 0xE0, 0x01, 1], +[0x3D4794, 0xE7, 0x32, 0], +[0x3D4792, 0xE7, 0x32, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0xF2, 0x73, 1], +[0x3C9E40, 0xF2, 0x73, 0], +[0x3C9E38, 0xF6, 0x77, 1], +[0x3C9E3E, 0xF6, 0x77, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0xA3, 0x03, 0], +[0x4F4D5E, 0xE0, 0x02, 0], +[0x3C9320, 0xA3, 0x03, 0], +[0x3C9322, 0xE0, 0x02, 0], +[0x9F9CF6, 0xA3, 0x03, 0], +[0x9F9CF8, 0xE0, 0x02, 0], +[0x4F4E1C, 0xA3, 0x03, 1], +[0x4F4E1E, 0xE0, 0x02, 1], +[0x3C9450, 0xA3, 0x03, 1], +[0x3C9452, 0xE0, 0x02, 1], +[0x9F9D74, 0xA3, 0x03, 1], +[0x9F9D76, 0xE0, 0x02, 1], +[0xA6202E, 0x24, 0x1E, 0], +[0xA62032, 0x89, 0x3F, 0], +[0xA62030, 0xE7, 0x32, 0], +[0xA62034, 0xF6, 0x63, 0], +[0xA6204E, 0x24, 0x1E, 1], +[0xA62052, 0x89, 0x3F, 1], +[0xA62050, 0xE7, 0x32, 1], +[0xA62054, 0xF6, 0x63, 1], +[0x3D4812, 0x64, 0x3B, 0], +[0x3D480E, 0x64, 0x3B, 1], +[0x3D4810, 0xEF, 0x57, 0], +[0x3D480C, 0xEF, 0x57, 1], +[0x3CC9FE, 0xA3, 0x03, 0], +[0x3CCA0A, 0xE0, 0x02, 0], +[0x8CBE20, 0x4D, 0x33, 0], +[0x8CBE22, 0xA7, 0x2A, 0], +[0x8CBE1E, 0xD3, 0x3F, 0], +[0x8CBE40, 0x4D, 0x33, 1], +[0x8CBE42, 0xA7, 0x2A, 1], +[0x8CBE3E, 0xD3, 0x3F, 1], +[0x8CBEE0, 0xA3, 0x03, 0], +[0x8CBEDE, 0xD5, 0x5F, 0], +[0x8CBEE2, 0xE0, 0x02, 0], +[0x3B8F38, 0x20, 0x17, 1], +[0x3B8F3A, 0xD3, 0x63, 1], +[0x3B8F40, 0x20, 0x17, 0], +[0x3B8F42, 0xD3, 0x63, 0], +[0x3D1094, 0x46, 0x1B, 0], +[0x3D109A, 0x80, 0x01, 0], +[0x3D1098, 0xE0, 0x01, 0], +[0x3D1096, 0xE0, 0x02, 0], +[0x3D1092, 0xED, 0x33, 0], +[0x3D1090, 0xFA, 0x67, 0], +[0x3D10D4, 0x46, 0x1B, 1], +[0x3D10DA, 0x80, 0x01, 1], +[0x3D10D8, 0xE0, 0x01, 1], +[0x3D10D6, 0xE0, 0x02, 1], +[0x3D10D2, 0xED, 0x33, 1], +[0x3D10D0, 0xFA, 0x67, 1], +[0x3D14D0, 0xA3, 0x03, 0], +[0x3D14D2, 0xE0, 0x02, 0], +[0x3D14CE, 0xF6, 0x5B, 0], +[0x3D14CC, 0xF2, 0x4B, 0], +[0x3D1510, 0x40, 0x03, 1], +[0x3D1512, 0xA0, 0x02, 1], +[0x3D150E, 0xF6, 0x5B, 1], +[0x3D150C, 0xF2, 0x4B, 1], +[0x3CE0F4, 0x40, 0x2A, 1], +[0x3CE0F2, 0x42, 0x2B, 1], +[0x3CE0F0, 0xF0, 0x3F, 1], +[0x3CE0D4, 0x40, 0x2A, 0], +[0x3CE0D2, 0x42, 0x2B, 0], +[0x3CE0D0, 0xF0, 0x3F, 0]] + +orangeHat = [ +[0x3CC884, 0x7F, 0x02, 0], +[0x3CC886, 0x3C, 0x02, 0], +[0x3CC8C4, 0x7F, 0x02, 1], +[0x3CC8C6, 0x3C, 0x02, 1], +[0x4F4CDC, 0x7F, 0x02, 0], +[0x4F4CDE, 0x3C, 0x02, 0], +[0x4F4D1C, 0x7F, 0x02, 1], +[0x4F4D1E, 0x3C, 0x02, 1], +[0x4F51D8, 0x7F, 0x02, 1], +[0x4F51DC, 0x7F, 0x02, 0], +[0x4F51E8, 0xFE, 0x42, 0], +[0x4F51EA, 0xFE, 0x42, 1], +[0x4F51DA, 0x3E, 0x43, 1], +[0x4F51DE, 0x3E, 0x43, 0], +[0x4FB686, 0x7F, 0x02, 0], +[0x4FB6A6, 0x7F, 0x02, 1], +[0x4FB684, 0x95, 0x01, 0], +[0x4FB6A4, 0x95, 0x01, 1], +[0x4FB688, 0x5E, 0x53, 0], +[0x4FB6A8, 0x5E, 0x53, 1], +[0x4FB786, 0x7F, 0x02, 0], +[0x4FB788, 0x5E, 0x53, 0], +[0x4FB78A, 0x9D, 0x6B, 0], +[0x4FB7A6, 0x7F, 0x02, 1], +[0x4FB7A8, 0x5E, 0x53, 1], +[0x4FB7AA, 0x9D, 0x6B, 1], +[0x51901C, 0x7F, 0x02, 0], +[0x519018, 0x3C, 0x01, 0], +[0x51901A, 0x3C, 0x02, 0], +[0x51903C, 0x7F, 0x02, 1], +[0x519038, 0x3C, 0x01, 1], +[0x51903A, 0x3C, 0x02, 1], +[0x5193EA, 0x3C, 0x02, 0], +[0x5193E8, 0x7F, 0x02, 0], +[0x51940A, 0x3C, 0x02, 1], +[0x519408, 0x7F, 0x02, 1], +[0x3A72AE, 0x56, 0x02, 1], +[0x3A7244, 0x56, 0x02, 0], +[0x3A724C, 0xBA, 0x02, 1], +[0x3A7290, 0x98, 0x02, 0], +[0x3A72B2, 0x98, 0x02, 1], +[0x3A7270, 0x14, 0x02, 1], +[0x3A7288, 0x14, 0x02, 0], +[0x3A7296, 0xB9, 0x02, 0], +[0x3A7274, 0xB9, 0x02, 1], +[0x3A7294, 0xBA, 0x02, 0], +[0x3A724A, 0xDA, 0x02, 0], +[0x3A7278, 0xDA, 0x02, 1], +[0x3A724E, 0xFC, 0x02, 0], +[0x3A727A, 0xFC, 0x02, 1], +[0x3A7252, 0x3E, 0x03, 0], +[0x3A727C, 0x3E, 0x03, 1], +[0x3A72BC, 0x3E, 0x03, 1], +[0x3A726C, 0xD1, 0x01, 1], +[0x3A7286, 0xD1, 0x01, 0], +[0x3A728C, 0x35, 0x02, 0], +[0x3A7272, 0x35, 0x02, 1], +[0x3A7254, 0x5F, 0x03, 1], +[0x3A7256, 0x5F, 0x03, 0], +[0x3A7264, 0x5F, 0x03, 1], +[0x9F9A58, 0x76, 0x3E, 0], +[0x9F9A5E, 0x76, 0x3E, 1], +[0x9F9A2A, 0x7F, 0x02, 0], +[0x9F9A30, 0x7F, 0x02, 1], +[0x9F9A36, 0x7F, 0x02, 0], +[0x9F9A3C, 0x7F, 0x02, 1], +[0x9F9A4A, 0x7F, 0x02, 0], +[0x9F9A50, 0x7F, 0x02, 1], +[0x9F9A56, 0xB6, 0x01, 0], +[0x9F9A5C, 0xB6, 0x01, 1], +[0x9F9A28, 0x95, 0x01, 0], +[0x9F9A2E, 0x95, 0x01, 1], +[0x9F9A48, 0x95, 0x01, 0], +[0x9F9A4E, 0x95, 0x01, 1], +[0x9F9A34, 0x3C, 0x02, 0], +[0x9F9A3A, 0x3C, 0x02, 1], +[0x9F9A2C, 0x5E, 0x53, 0], +[0x9F9A32, 0x5E, 0x53, 1], +[0x9F9A38, 0x5E, 0x53, 0], +[0x9F9A3E, 0x5E, 0x53, 1], +[0x9F9A4C, 0x5E, 0x53, 0], +[0x9F9A52, 0x5E, 0x53, 1], +[0xA5DD46, 0x36, 0x26, 0], +[0xA5DD44, 0x8F, 0x19, 0], +[0xA5DD4A, 0x1F, 0x37, 0], +[0xA5DD3E, 0x6D, 0x1D, 0], +[0xA5DD40, 0xBF, 0x5B, 0], +[0xA5DD42, 0xDF, 0x67, 0], +[0xA5DD48, 0xBB, 0x2E, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x36, 0x26, 1], +[0xA5DD64, 0x8F, 0x19, 1], +[0xA5DD6A, 0x1F, 0x37, 1], +[0xA5DD5E, 0x6D, 0x1D, 1], +[0xA5DD60, 0xBF, 0x5B, 1], +[0xA5DD62, 0xDF, 0x67, 1], +[0xA5DD68, 0xBB, 0x2E, 1], +[0x3D0E0C, 0x7F, 0x02, 1], +[0x3D0E18, 0x7F, 0x02, 0], +[0x3D0E0A, 0x3C, 0x02, 1], +[0x3D0E1A, 0x3C, 0x02, 0], +[0x3D0E08, 0x5E, 0x53, 1], +[0x3D0E16, 0x5E, 0x53, 0], +[0x3CC9C4, 0x7F, 0x02, 0], +[0x3CC9C6, 0x3C, 0x02, 0], +[0x3CDE7C, 0x7F, 0x02, 1], +[0x3CDE7E, 0x3C, 0x02, 1], +[0x51AD2C, 0x7F, 0x02, 0], +[0x51AD2E, 0x3C, 0x02, 0], +[0x51AD4C, 0x7F, 0x02, 1], +[0x51AD4E, 0x3C, 0x02, 1], +[0x51A4AE, 0x3C, 0x02, 0], +[0x51A4AC, 0x7F, 0x02, 0], +[0x51A4CC, 0x7F, 0x02, 1], +[0x51A4CE, 0x3C, 0x02, 1], +[0x51A98C, 0x7F, 0x02, 0], +[0x51A98E, 0x3C, 0x02, 0], +[0x51A96C, 0x7F, 0x02, 1], +[0x51A96E, 0x3C, 0x02, 1], +[0x51AA00, 0x3D, 0x02, 0], +[0x51AA10, 0x3D, 0x02, 1], +[0x51AA02, 0xB5, 0x01, 0], +[0x51AA12, 0xB5, 0x01, 1], +[0x51A9FE, 0x7F, 0x02, 0], +[0x51AA0E, 0x7F, 0x02, 1], +[0x51AA0A, 0x5E, 0x4F, 0], +[0x3CC984, 0x7F, 0x02, 0], +[0x3CC986, 0x3C, 0x02, 0], +[0x3D4B52, 0x3D, 0x02, 0], +[0x3D4B5C, 0xFA, 0x01, 0], +[0x3D4B54, 0x7F, 0x02, 0], +[0x3D4B56, 0x3C, 0x02, 0], +[0x3D4B50, 0x5E, 0x53, 0], +[0x3CCA44, 0x7F, 0x02, 1], +[0x3CCA46, 0x3C, 0x02, 1], +[0x3CFB3C, 0x7F, 0x02, 0], +[0x3CFB3E, 0x3C, 0x02, 0], +[0x3CFB7C, 0x7F, 0x02, 1], +[0x3CFB7E, 0x3C, 0x02, 1], +[0x3D504C, 0x3D, 0x02, 0], +[0x3D504A, 0x7F, 0x02, 0], +[0x3D504E, 0x3C, 0x02, 0], +[0x3D508C, 0x3D, 0x02, 1], +[0x3D508A, 0x7F, 0x02, 1], +[0x3D508E, 0x3C, 0x02, 1], +[0xA5DDA2, 0x36, 0x26, 0], +[0xA5DDC2, 0x36, 0x26, 1], +[0xA5DDA6, 0x1F, 0x37, 0], +[0xA5DDC6, 0x1F, 0x37, 1], +[0xA5DDA4, 0xBB, 0x2E, 0], +[0xA5DDC4, 0xBB, 0x2E, 1], +[0xA5DDA8, 0x5E, 0x53, 0], +[0xA5DDC8, 0x5E, 0x53, 1], +[0x3D3E0C, 0x7F, 0x02, 1], +[0x3D3E10, 0x7F, 0x02, 0], +[0x3D3E0E, 0x3C, 0x02, 1], +[0x3D3E12, 0x3C, 0x02, 0], +[0x3CF1C0, 0x7F, 0x02, 0], +[0x3CF200, 0x7F, 0x02, 1], +[0x3CF1C2, 0x3C, 0x02, 0], +[0x3CF202, 0x3C, 0x02, 1], +[0x3D360E, 0xBA, 0x02, 1], +[0x3D3614, 0xBA, 0x02, 0], +[0x3D360C, 0x3E, 0x43, 1], +[0x3D3612, 0x3E, 0x43, 0], +[0x3D3604, 0xBB, 0x2E, 0], +[0x3D3606, 0xBB, 0x2E, 1], +[0x3D360A, 0x5E, 0x53, 1], +[0x3D3610, 0x5E, 0x53, 0], +[0x3D1A48, 0x35, 0x02, 0], +[0x3D1A46, 0x5E, 0x53, 0], +[0x3D1A44, 0x5E, 0x53, 0], +[0x3D1A4A, 0xBB, 0x2E, 0], +[0x3D1A88, 0x35, 0x02, 1], +[0x3D1A8A, 0xDD, 0xD4, 1], +[0x3D1A86, 0x5E, 0x53, 1], +[0x3D1A84, 0x5E, 0x53, 1], +[0x3CE282, 0x3C, 0x02, 0], +[0x3CE2C2, 0x3C, 0x02, 1], +[0x3CE280, 0x5E, 0x53, 0], +[0x3CE2C0, 0x5E, 0x53, 1], +[0x4FA29E, 0x3C, 0x02, 0], +[0x4FA2DE, 0x3C, 0x02, 1], +[0x4FA29C, 0x5E, 0x53, 0], +[0x4FA2DC, 0x5E, 0x53, 1], +[0x3D4786, 0x5F, 0x03, 1], +[0x3D478C, 0x5F, 0x03, 0], +[0x3D478E, 0x98, 0x02, 0], +[0x3D4788, 0x98, 0x02, 1], +[0x3D4790, 0x98, 0x02, 0], +[0x3D478A, 0x3D, 0x02, 1], +[0x3D4794, 0xBB, 0x2E, 0], +[0x3D4792, 0x3D, 0x02, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0x9D, 0x6B, 1], +[0x3C9E40, 0x9D, 0x6B, 0], +[0x3C9E38, 0x9D, 0x6B, 1], +[0x3C9E3E, 0x9D, 0x6B, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0x7F, 0x02, 0], +[0x4F4D5E, 0x3C, 0x02, 0], +[0x3C9320, 0x7F, 0x02, 0], +[0x3C9322, 0x3C, 0x02, 0], +[0x9F9CF6, 0x7F, 0x02, 0], +[0x9F9CF8, 0x3C, 0x02, 0], +[0x4F4E1C, 0x7F, 0x02, 1], +[0x4F4E1E, 0x3C, 0x02, 1], +[0x3C9450, 0x7F, 0x02, 1], +[0x3C9452, 0x3C, 0x02, 1], +[0x9F9D74, 0x7F, 0x02, 1], +[0x9F9D76, 0x3C, 0x02, 1], +[0xA6202E, 0x36, 0x26, 0], +[0xA62032, 0x1F, 0x37, 0], +[0xA62030, 0xBB, 0x2E, 0], +[0xA62034, 0x5E, 0x53, 0], +[0xA6204E, 0x36, 0x26, 1], +[0xA62052, 0x1F, 0x37, 1], +[0xA62050, 0xBB, 0x2E, 1], +[0xA62054, 0x5E, 0x53, 1], +[0x3D4812, 0xBA, 0x02, 0], +[0x3D480E, 0xBA, 0x02, 1], +[0x3D4810, 0x5E, 0x53, 0], +[0x3D480C, 0x5E, 0x53, 1], +[0x3CC9FE, 0x7F, 0x02, 0], +[0x3CCA0A, 0x3C, 0x02, 0], +[0x8CBE20, 0x35, 0x02, 0], +[0x8CBE22, 0x3C, 0x02, 0], +[0x8CBE1E, 0x5E, 0x4F, 0], +[0x8CBE40, 0x35, 0x02, 1], +[0x8CBE42, 0x3C, 0x02, 1], +[0x8CBE3E, 0x5E, 0x4F, 1], +[0x8CBEE0, 0x7F, 0x02, 0], +[0x8CBEDE, 0xDF, 0x67, 0], +[0x8CBEE2, 0x3C, 0x02, 0], +[0x3B8F38, 0x35, 0x02, 1], +[0x3B8F3A, 0xDF, 0x67, 1], +[0x3B8F40, 0x35, 0x02, 0], +[0x3B8F42, 0xDF, 0x67, 0], +[0x3D1094, 0x98, 0x02, 0], +[0x3D109A, 0x8F, 0x19, 0], +[0x3D1098, 0x3C, 0x01, 0], +[0x3D1096, 0x3C, 0x02, 0], +[0x3D1092, 0xDF, 0x67, 0], +[0x3D1090, 0x5E, 0x53, 0], +[0x3D10D4, 0x98, 0x02, 1], +[0x3D10DA, 0x8F, 0x19, 1], +[0x3D10D8, 0x3C, 0x01, 1], +[0x3D10D6, 0x3C, 0x02, 1], +[0x3D10D2, 0xDF, 0x67, 1], +[0x3D10D0, 0x5E, 0x53, 1], +[0x3D14D0, 0x7F, 0x02, 0], +[0x3D14D2, 0x3C, 0x02, 0], +[0x3D14CE, 0x5E, 0x53, 0], +[0x3D14CC, 0xFE, 0x42, 0], +[0x3D1510, 0xBA, 0x02, 1], +[0x3D1512, 0x3C, 0x02, 1], +[0x3D150E, 0x5E, 0x53, 1], +[0x3D150C, 0xFE, 0x42, 1], +[0x3CE0F4, 0x36, 0x26, 1], +[0x3CE0F2, 0x3D, 0x02, 1], +[0x3CE0F0, 0xFE, 0x42, 1], +[0x3CE0D4, 0x36, 0x26, 0], +[0x3CE0D2, 0x3D, 0x02, 0], +[0x3CE0D0, 0xFE, 0x42, 0]] + +pinkHat = [ +[0x3CC884, 0xDF, 0x6E, 0], +[0x3CC886, 0xFF, 0x5D, 0], +[0x3CC8C4, 0xDF, 0x6E, 1], +[0x3CC8C6, 0xFF, 0x5D, 1], +[0x4F4CDC, 0xDF, 0x6E, 0], +[0x4F4CDE, 0xFF, 0x5D, 0], +[0x4F4D1C, 0xDF, 0x6E, 1], +[0x4F4D1E, 0xFF, 0x5D, 1], +[0x4F51D8, 0xDF, 0x6E, 1], +[0x4F51DC, 0xDF, 0x6E, 0], +[0x4F51E8, 0x3C, 0x6B, 0], +[0x4F51EA, 0x3C, 0x6B, 1], +[0x4F51DA, 0x7F, 0x77, 1], +[0x4F51DE, 0x7F, 0x77, 0], +[0x4FB686, 0xDF, 0x6E, 0], +[0x4FB6A6, 0xDF, 0x6E, 1], +[0x4FB684, 0xD4, 0x45, 0], +[0x4FB6A4, 0xD4, 0x45, 1], +[0x4FB688, 0x7F, 0x77, 0], +[0x4FB6A8, 0x7F, 0x77, 1], +[0x4FB786, 0xDF, 0x6E, 0], +[0x4FB788, 0x7F, 0x77, 0], +[0x4FB78A, 0x9E, 0x7F, 0], +[0x4FB7A6, 0xDF, 0x6E, 1], +[0x4FB7A8, 0x7F, 0x77, 1], +[0x4FB7AA, 0x9E, 0x7F, 1], +[0x51901C, 0xDF, 0x6E, 0], +[0x519018, 0x3C, 0x51, 0], +[0x51901A, 0xDD, 0x59, 0], +[0x51903C, 0xDF, 0x6E, 1], +[0x519038, 0x3C, 0x51, 1], +[0x51903A, 0xDD, 0x59, 1], +[0x5193EA, 0xFF, 0x5D, 0], +[0x5193E8, 0xDF, 0x6E, 0], +[0x51940A, 0xFF, 0x5D, 1], +[0x519408, 0xDF, 0x6E, 1], +[0x3A72AE, 0x3C, 0x5E, 1], +[0x3A7244, 0x3C, 0x5E, 0], +[0x3A724C, 0x5E, 0x66, 1], +[0x3A7290, 0x3D, 0x62, 0], +[0x3A72B2, 0x3D, 0x62, 1], +[0x3A7270, 0xFA, 0x55, 1], +[0x3A7288, 0xFA, 0x55, 0], +[0x3A7296, 0x9E, 0x6A, 0], +[0x3A7274, 0x9E, 0x6A, 1], +[0x3A7294, 0x5E, 0x66, 0], +[0x3A724A, 0xDE, 0x6A, 0], +[0x3A7278, 0xDE, 0x6A, 1], +[0x3A724E, 0xFE, 0x6E, 0], +[0x3A727A, 0xFE, 0x6E, 1], +[0x3A7252, 0x3E, 0x73, 0], +[0x3A727C, 0x3E, 0x73, 1], +[0x3A72BC, 0x3E, 0x73, 1], +[0x3A726C, 0xD8, 0x51, 1], +[0x3A7286, 0xD8, 0x51, 0], +[0x3A728C, 0x1B, 0x5A, 0], +[0x3A7272, 0x1B, 0x5A, 1], +[0x3A7254, 0x9E, 0x77, 1], +[0x3A7256, 0x9E, 0x77, 0], +[0x3A7264, 0x9E, 0x77, 1], +[0x9F9A58, 0x75, 0x52, 0], +[0x9F9A5E, 0x75, 0x52, 1], +[0x9F9A2A, 0xDF, 0x6E, 0], +[0x9F9A30, 0xDF, 0x6E, 1], +[0x9F9A36, 0xDF, 0x6E, 0], +[0x9F9A3C, 0xDF, 0x6E, 1], +[0x9F9A4A, 0xDF, 0x6E, 0], +[0x9F9A50, 0xDF, 0x6E, 1], +[0x9F9A56, 0xD3, 0x45, 0], +[0x9F9A5C, 0xD3, 0x45, 1], +[0x9F9A28, 0xD4, 0x45, 0], +[0x9F9A2E, 0xD4, 0x45, 1], +[0x9F9A48, 0xD4, 0x45, 0], +[0x9F9A4E, 0xD4, 0x45, 1], +[0x9F9A34, 0xFF, 0x5D, 0], +[0x9F9A3A, 0xFF, 0x5D, 1], +[0x9F9A2C, 0x7F, 0x77, 0], +[0x9F9A32, 0x7F, 0x77, 1], +[0x9F9A38, 0x7F, 0x77, 0], +[0x9F9A3E, 0x7F, 0x77, 1], +[0x9F9A4C, 0x7F, 0x77, 0], +[0x9F9A52, 0x7F, 0x77, 1], +[0xA5DD46, 0xD5, 0x49, 0], +[0xA5DD44, 0x91, 0x3D, 0], +[0xA5DD4A, 0xBD, 0x6A, 0], +[0xA5DD3E, 0x31, 0x39, 0], +[0xA5DD40, 0x3D, 0x73, 0], +[0xA5DD42, 0x5F, 0x77, 0], +[0xA5DD48, 0x59, 0x5A, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0xD5, 0x49, 1], +[0xA5DD64, 0x91, 0x3D, 1], +[0xA5DD6A, 0xBD, 0x6A, 1], +[0xA5DD5E, 0x31, 0x39, 1], +[0xA5DD60, 0x3D, 0x73, 1], +[0xA5DD62, 0x5F, 0x77, 1], +[0xA5DD68, 0x59, 0x5A, 1], +[0x3D0E0C, 0xDF, 0x6E, 1], +[0x3D0E18, 0xDF, 0x6E, 0], +[0x3D0E0A, 0xFF, 0x5D, 1], +[0x3D0E1A, 0xFF, 0x5D, 0], +[0x3D0E08, 0x7F, 0x77, 1], +[0x3D0E16, 0x7F, 0x77, 0], +[0x3CC9C4, 0xDF, 0x6E, 0], +[0x3CC9C6, 0xFF, 0x5D, 0], +[0x3CDE7C, 0xDF, 0x6E, 1], +[0x3CDE7E, 0xFF, 0x5D, 1], +[0x51AD2C, 0xDF, 0x6E, 0], +[0x51AD2E, 0xFF, 0x5D, 0], +[0x51AD4C, 0xDF, 0x6E, 1], +[0x51AD4E, 0xFF, 0x5D, 1], +[0x51A4AE, 0xFF, 0x5D, 0], +[0x51A4AC, 0xDF, 0x6E, 0], +[0x51A4CC, 0xDF, 0x6E, 1], +[0x51A4CE, 0xFF, 0x5D, 1], +[0x51A98C, 0xDF, 0x6E, 0], +[0x51A98E, 0xFF, 0x5D, 0], +[0x51A96C, 0xDF, 0x6E, 1], +[0x51A96E, 0xFF, 0x5D, 1], +[0x51AA00, 0xBD, 0x6A, 0], +[0x51AA10, 0xBD, 0x6A, 1], +[0x51AA02, 0xFF, 0x5D, 0], +[0x51AA12, 0xFF, 0x5D, 1], +[0x51A9FE, 0xDF, 0x6E, 0], +[0x51AA0E, 0xDF, 0x6E, 1], +[0x51AA0A, 0x5E, 0x77, 0], +[0x3CC984, 0xDF, 0x6E, 0], +[0x3CC986, 0xFF, 0x5D, 0], +[0x3D4B52, 0x7F, 0x66, 0], +[0x3D4B5C, 0xBC, 0x55, 0], +[0x3D4B54, 0xDF, 0x6E, 0], +[0x3D4B56, 0xFF, 0x5D, 0], +[0x3D4B50, 0x7F, 0x77, 0], +[0x3CCA44, 0xDF, 0x6E, 1], +[0x3CCA46, 0xFF, 0x5D, 1], +[0x3CFB3C, 0xDF, 0x6E, 0], +[0x3CFB3E, 0xFF, 0x5D, 0], +[0x3CFB7C, 0xDF, 0x6E, 1], +[0x3CFB7E, 0xFF, 0x5D, 1], +[0x3D504C, 0x9C, 0x62, 0], +[0x3D504A, 0xDF, 0x6E, 0], +[0x3D504E, 0xFF, 0x5D, 0], +[0x3D508C, 0x9C, 0x62, 1], +[0x3D508A, 0xDF, 0x6E, 1], +[0x3D508E, 0xFF, 0x5D, 1], +[0xA5DDA2, 0xD5, 0x49, 0], +[0xA5DDC2, 0xD5, 0x49, 1], +[0xA5DDA6, 0xBD, 0x6A, 0], +[0xA5DDC6, 0xBD, 0x6A, 1], +[0xA5DDA4, 0x59, 0x5A, 0], +[0xA5DDC4, 0x59, 0x5A, 1], +[0xA5DDA8, 0x3D, 0x6F, 0], +[0xA5DDC8, 0x3D, 0x6F, 1], +[0x3D3E0C, 0xDF, 0x6E, 1], +[0x3D3E10, 0xDF, 0x6E, 0], +[0x3D3E0E, 0xFF, 0x5D, 1], +[0x3D3E12, 0xFF, 0x5D, 0], +[0x3CF1C0, 0xDF, 0x6E, 0], +[0x3CF200, 0xDF, 0x6E, 1], +[0x3CF1C2, 0xFF, 0x5D, 0], +[0x3CF202, 0xFF, 0x5D, 1], +[0x3D360E, 0x5E, 0x66, 1], +[0x3D3614, 0x5E, 0x66, 0], +[0x3D360C, 0x7F, 0x77, 1], +[0x3D3612, 0x7F, 0x77, 0], +[0x3D3604, 0x59, 0x5A, 0], +[0x3D3606, 0x59, 0x5A, 1], +[0x3D360A, 0x7F, 0x77, 1], +[0x3D3610, 0x7F, 0x77, 0], +[0x3D1A48, 0x1B, 0x5A, 0], +[0x3D1A46, 0x7F, 0x77, 0], +[0x3D1A44, 0x7F, 0x77, 0], +[0x3D1A4A, 0x59, 0x5A, 0], +[0x3D1A88, 0x1B, 0x5A, 1], +[0x3D1A8A, 0xCC, 0xC8, 1], +[0x3D1A86, 0x7F, 0x77, 1], +[0x3D1A84, 0x7F, 0x77, 1], +[0x3CE282, 0xFF, 0x5D, 0], +[0x3CE2C2, 0xFF, 0x5D, 1], +[0x3CE280, 0x7F, 0x77, 0], +[0x3CE2C0, 0x7F, 0x77, 1], +[0x4FA29E, 0xFF, 0x5D, 0], +[0x4FA2DE, 0xFF, 0x5D, 1], +[0x4FA29C, 0x7F, 0x77, 0], +[0x4FA2DC, 0x7F, 0x77, 1], +[0x3D4786, 0x9E, 0x77, 1], +[0x3D478C, 0x9E, 0x77, 0], +[0x3D478E, 0x3D, 0x62, 0], +[0x3D4788, 0x3D, 0x62, 1], +[0x3D4790, 0x3D, 0x62, 0], +[0x3D478A, 0x9C, 0x62, 1], +[0x3D4794, 0x59, 0x5A, 0], +[0x3D4792, 0x9C, 0x62, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0x9E, 0x7F, 1], +[0x3C9E40, 0x9E, 0x7F, 0], +[0x3C9E38, 0x9E, 0x7F, 1], +[0x3C9E3E, 0x9E, 0x7F, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0xDF, 0x6E, 0], +[0x4F4D5E, 0xFF, 0x5D, 0], +[0x3C9320, 0xDF, 0x6E, 0], +[0x3C9322, 0xFF, 0x5D, 0], +[0x9F9CF6, 0xDF, 0x6E, 0], +[0x9F9CF8, 0xFF, 0x5D, 0], +[0x4F4E1C, 0xDF, 0x6E, 1], +[0x4F4E1E, 0xFF, 0x5D, 1], +[0x3C9450, 0xDF, 0x6E, 1], +[0x3C9452, 0xFF, 0x5D, 1], +[0x9F9D74, 0xDF, 0x6E, 1], +[0x9F9D76, 0xFF, 0x5D, 1], +[0xA6202E, 0xD5, 0x49, 0], +[0xA62032, 0xBD, 0x6A, 0], +[0xA62030, 0x59, 0x5A, 0], +[0xA62034, 0x3D, 0x6F, 0], +[0xA6204E, 0xD5, 0x49, 1], +[0xA62052, 0xBD, 0x6A, 1], +[0xA62050, 0x59, 0x5A, 1], +[0xA62054, 0x3D, 0x6F, 1], +[0x3D4812, 0x5E, 0x66, 0], +[0x3D480E, 0x5E, 0x66, 1], +[0x3D4810, 0x7F, 0x77, 0], +[0x3D480C, 0x7F, 0x77, 1], +[0x3CC9FE, 0xDF, 0x6E, 0], +[0x3CCA0A, 0xFF, 0x5D, 0], +[0x8CBE20, 0x1B, 0x5A, 0], +[0x8CBE22, 0xFF, 0x5D, 0], +[0x8CBE1E, 0x5E, 0x77, 0], +[0x8CBE40, 0x1B, 0x5A, 1], +[0x8CBE42, 0xFF, 0x5D, 1], +[0x8CBE3E, 0x5E, 0x77, 1], +[0x8CBEE0, 0xDF, 0x6E, 0], +[0x8CBEDE, 0x5F, 0x77, 0], +[0x8CBEE2, 0xFF, 0x5D, 0], +[0x3B8F38, 0x1B, 0x5A, 1], +[0x3B8F3A, 0x5F, 0x77, 1], +[0x3B8F40, 0x1B, 0x5A, 0], +[0x3B8F42, 0x5F, 0x77, 0], +[0x3D1094, 0x3D, 0x62, 0], +[0x3D109A, 0x91, 0x3D, 0], +[0x3D1098, 0x3C, 0x51, 0], +[0x3D1096, 0xDD, 0x59, 0], +[0x3D1092, 0x5F, 0x77, 0], +[0x3D1090, 0x7F, 0x77, 0], +[0x3D10D4, 0x3D, 0x62, 1], +[0x3D10DA, 0x91, 0x3D, 1], +[0x3D10D8, 0x3C, 0x51, 1], +[0x3D10D6, 0xDD, 0x59, 1], +[0x3D10D2, 0x5F, 0x77, 1], +[0x3D10D0, 0x7F, 0x77, 1], +[0x3D14D0, 0xDF, 0x6E, 0], +[0x3D14D2, 0xFF, 0x5D, 0], +[0x3D14CE, 0x7F, 0x77, 0], +[0x3D14CC, 0x3C, 0x6B, 0], +[0x3D1510, 0x5E, 0x66, 1], +[0x3D1512, 0xFF, 0x5D, 1], +[0x3D150E, 0x7F, 0x77, 1], +[0x3D150C, 0x3C, 0x6B, 1], +[0x3CE0F4, 0xD5, 0x49, 1], +[0x3CE0F2, 0xBD, 0x6A, 1], +[0x3CE0F0, 0x3C, 0x6B, 1], +[0x3CE0D4, 0xD5, 0x49, 0], +[0x3CE0D2, 0xBD, 0x6A, 0], +[0x3CE0D0, 0x3C, 0x6B, 0]] + +purpleHat = [ +[0x3CC884, 0x10, 0x7C, 0], +[0x3CC886, 0x0B, 0x5C, 0], +[0x3CC8C4, 0x10, 0x7C, 1], +[0x3CC8C6, 0x0B, 0x5C, 1], +[0x4F4CDC, 0x10, 0x7C, 0], +[0x4F4CDE, 0x0B, 0x5C, 0], +[0x4F4D1C, 0x10, 0x7C, 1], +[0x4F4D1E, 0x0B, 0x5C, 1], +[0x4F51D8, 0x10, 0x7C, 1], +[0x4F51DC, 0x10, 0x7C, 0], +[0x4F51E8, 0x98, 0x6E, 0], +[0x4F51EA, 0x98, 0x6E, 1], +[0x4F51DA, 0xFB, 0x7A, 1], +[0x4F51DE, 0xFB, 0x7A, 0], +[0x4FB686, 0x10, 0x7C, 0], +[0x4FB6A6, 0x10, 0x7C, 1], +[0x4FB684, 0x05, 0x28, 0], +[0x4FB6A4, 0x05, 0x28, 1], +[0x4FB688, 0xFB, 0x7A, 0], +[0x4FB6A8, 0xFB, 0x7A, 1], +[0x4FB786, 0x10, 0x7C, 0], +[0x4FB788, 0xFB, 0x7A, 0], +[0x4FB78A, 0x9E, 0x7F, 0], +[0x4FB7A6, 0x10, 0x7C, 1], +[0x4FB7A8, 0xFB, 0x7A, 1], +[0x4FB7AA, 0x9E, 0x7F, 1], +[0x51901C, 0x10, 0x7C, 0], +[0x519018, 0x05, 0x39, 0], +[0x51901A, 0x0F, 0x5C, 0], +[0x51903C, 0x10, 0x7C, 1], +[0x519038, 0x05, 0x39, 1], +[0x51903A, 0x0F, 0x5C, 1], +[0x5193EA, 0x0B, 0x5C, 0], +[0x5193E8, 0x10, 0x7C, 0], +[0x51940A, 0x0B, 0x5C, 1], +[0x519408, 0x10, 0x7C, 1], +[0x3A72AE, 0xB4, 0x51, 1], +[0x3A7244, 0xB4, 0x51, 0], +[0x3A724C, 0xF6, 0x59, 1], +[0x3A7290, 0xF6, 0x59, 0], +[0x3A72B2, 0x36, 0x5A, 1], +[0x3A7270, 0xF4, 0x50, 1], +[0x3A7288, 0xF4, 0x50, 0], +[0x3A7296, 0x79, 0x66, 0], +[0x3A7274, 0x79, 0x66, 1], +[0x3A7294, 0x36, 0x5A, 0], +[0x3A724A, 0x99, 0x66, 0], +[0x3A7278, 0x99, 0x66, 1], +[0x3A724E, 0xB9, 0x66, 0], +[0x3A727A, 0xB9, 0x66, 1], +[0x3A7252, 0x19, 0x67, 0], +[0x3A727C, 0x19, 0x67, 1], +[0x3A72BC, 0x19, 0x67, 1], +[0x3A726C, 0x54, 0x50, 1], +[0x3A7286, 0x54, 0x50, 0], +[0x3A728C, 0x74, 0x51, 0], +[0x3A7272, 0x74, 0x51, 1], +[0x3A7254, 0x5C, 0x73, 1], +[0x3A7256, 0x5C, 0x73, 0], +[0x3A7264, 0x5C, 0x73, 1], +[0x9F9A58, 0xF2, 0x51, 0], +[0x9F9A5E, 0xF2, 0x51, 1], +[0x9F9A2A, 0x10, 0x7C, 0], +[0x9F9A30, 0x10, 0x7C, 1], +[0x9F9A36, 0x10, 0x7C, 0], +[0x9F9A3C, 0x10, 0x7C, 1], +[0x9F9A4A, 0x10, 0x7C, 0], +[0x9F9A50, 0x10, 0x7C, 1], +[0x9F9A56, 0x06, 0x34, 0], +[0x9F9A5C, 0x06, 0x34, 1], +[0x9F9A28, 0x05, 0x28, 0], +[0x9F9A2E, 0x05, 0x28, 1], +[0x9F9A48, 0x05, 0x28, 0], +[0x9F9A4E, 0x05, 0x28, 1], +[0x9F9A34, 0x0F, 0x5C, 0], +[0x9F9A3A, 0x0F, 0x5C, 1], +[0x9F9A2C, 0xFB, 0x7A, 0], +[0x9F9A32, 0xFB, 0x7A, 1], +[0x9F9A38, 0xFB, 0x7A, 0], +[0x9F9A3E, 0xFB, 0x7A, 1], +[0x9F9A4C, 0xFB, 0x7A, 0], +[0x9F9A52, 0xFB, 0x7A, 1], +[0xA5DD46, 0x8A, 0x3C, 0], +[0xA5DD44, 0x66, 0x28, 0], +[0xA5DD4A, 0x32, 0x71, 0], +[0xA5DD3E, 0x4C, 0x39, 0], +[0xA5DD40, 0x34, 0x62, 0], +[0xA5DD42, 0x77, 0x72, 0], +[0xA5DD48, 0xED, 0x50, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x8A, 0x3C, 1], +[0xA5DD64, 0x66, 0x28, 1], +[0xA5DD6A, 0x32, 0x71, 1], +[0xA5DD5E, 0x4C, 0x39, 1], +[0xA5DD60, 0x34, 0x62, 1], +[0xA5DD62, 0x77, 0x72, 1], +[0xA5DD68, 0xED, 0x50, 1], +[0x3D0E0C, 0x10, 0x7C, 1], +[0x3D0E18, 0x10, 0x7C, 0], +[0x3D0E0A, 0x0B, 0x5C, 1], +[0x3D0E1A, 0x0B, 0x5C, 0], +[0x3D0E08, 0xFB, 0x7A, 1], +[0x3D0E16, 0xFB, 0x7A, 0], +[0x3CC9C4, 0x10, 0x7C, 0], +[0x3CC9C6, 0x0B, 0x5C, 0], +[0x3CDE7C, 0x10, 0x7C, 1], +[0x3CDE7E, 0x0B, 0x5C, 1], +[0x51AD2C, 0x10, 0x7C, 0], +[0x51AD2E, 0x0B, 0x5C, 0], +[0x51AD4C, 0x10, 0x7C, 1], +[0x51AD4E, 0x0B, 0x5C, 1], +[0x51A4AE, 0x0B, 0x5C, 0], +[0x51A4AC, 0x10, 0x7C, 0], +[0x51A4CC, 0x10, 0x7C, 1], +[0x51A4CE, 0x0B, 0x5C, 1], +[0x51A98C, 0x10, 0x7C, 0], +[0x51A98E, 0x0B, 0x5C, 0], +[0x51A96C, 0x10, 0x7C, 1], +[0x51A96E, 0x0B, 0x5C, 1], +[0x51AA00, 0x0B, 0x64, 0], +[0x51AA10, 0x0B, 0x64, 1], +[0x51AA02, 0x0B, 0x5C, 0], +[0x51AA12, 0x0B, 0x5C, 1], +[0x51A9FE, 0x10, 0x7C, 0], +[0x51AA0E, 0x10, 0x7C, 1], +[0x51AA0A, 0xF7, 0x79, 0], +[0x3CC984, 0x10, 0x7C, 0], +[0x3CC986, 0x0B, 0x5C, 0], +[0x3D4B52, 0x0E, 0x70, 0], +[0x3D4B5C, 0x09, 0x50, 0], +[0x3D4B54, 0x10, 0x7C, 0], +[0x3D4B56, 0x0B, 0x5C, 0], +[0x3D4B50, 0xFB, 0x7A, 0], +[0x3CCA44, 0x10, 0x7C, 1], +[0x3CCA46, 0x0B, 0x5C, 1], +[0x3CFB3C, 0x10, 0x7C, 0], +[0x3CFB3E, 0x0B, 0x5C, 0], +[0x3CFB7C, 0x10, 0x7C, 1], +[0x3CFB7E, 0x0B, 0x5C, 1], +[0x3D504C, 0x0C, 0x64, 0], +[0x3D504A, 0x10, 0x7C, 0], +[0x3D504E, 0x0B, 0x5C, 0], +[0x3D508C, 0x0C, 0x64, 1], +[0x3D508A, 0x10, 0x7C, 1], +[0x3D508E, 0x0B, 0x5C, 1], +[0xA5DDA2, 0x8A, 0x3C, 0], +[0xA5DDC2, 0x8A, 0x3C, 1], +[0xA5DDA6, 0x32, 0x71, 0], +[0xA5DDC6, 0x32, 0x71, 1], +[0xA5DDA4, 0xED, 0x50, 0], +[0xA5DDC4, 0xED, 0x50, 1], +[0xA5DDA8, 0xFB, 0x7A, 0], +[0xA5DDC8, 0xFB, 0x7A, 1], +[0x3D3E0C, 0x10, 0x7C, 1], +[0x3D3E10, 0x10, 0x7C, 0], +[0x3D3E0E, 0x0B, 0x5C, 1], +[0x3D3E12, 0x0B, 0x5C, 0], +[0x3CF1C0, 0x10, 0x7C, 0], +[0x3CF200, 0x10, 0x7C, 1], +[0x3CF1C2, 0x0B, 0x5C, 0], +[0x3CF202, 0x0B, 0x5C, 1], +[0x3D360E, 0xF6, 0x59, 1], +[0x3D3614, 0xF6, 0x59, 0], +[0x3D360C, 0xFB, 0x7A, 1], +[0x3D3612, 0xFB, 0x7A, 0], +[0x3D3604, 0xED, 0x50, 0], +[0x3D3606, 0xED, 0x50, 1], +[0x3D360A, 0xFB, 0x7A, 1], +[0x3D3610, 0xFB, 0x7A, 0], +[0x3D1A48, 0x74, 0x51, 0], +[0x3D1A46, 0xFB, 0x7A, 0], +[0x3D1A44, 0xFB, 0x7A, 0], +[0x3D1A4A, 0xED, 0x50, 0], +[0x3D1A88, 0x74, 0x51, 1], +[0x3D1A8A, 0xAA, 0xA4, 1], +[0x3D1A86, 0xFB, 0x7A, 1], +[0x3D1A84, 0xFB, 0x7A, 1], +[0x3CE282, 0x0B, 0x5C, 0], +[0x3CE2C2, 0x0B, 0x5C, 1], +[0x3CE280, 0xFB, 0x7A, 0], +[0x3CE2C0, 0xFB, 0x7A, 1], +[0x4FA29E, 0x0B, 0x5C, 0], +[0x4FA2DE, 0x0B, 0x5C, 1], +[0x4FA29C, 0xFB, 0x7A, 0], +[0x4FA2DC, 0xFB, 0x7A, 1], +[0x3D4786, 0x5C, 0x73, 1], +[0x3D478C, 0x5C, 0x73, 0], +[0x3D478E, 0xF6, 0x59, 0], +[0x3D4788, 0xF6, 0x59, 1], +[0x3D4790, 0xF6, 0x59, 0], +[0x3D478A, 0x0C, 0x64, 1], +[0x3D4794, 0xED, 0x50, 0], +[0x3D4792, 0x0C, 0x64, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0x9E, 0x7F, 1], +[0x3C9E40, 0x9E, 0x7F, 0], +[0x3C9E38, 0x9E, 0x7F, 1], +[0x3C9E3E, 0x9E, 0x7F, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0x10, 0x7C, 0], +[0x4F4D5E, 0x0B, 0x5C, 0], +[0x3C9320, 0x10, 0x7C, 0], +[0x3C9322, 0x0B, 0x5C, 0], +[0x9F9CF6, 0x10, 0x7C, 0], +[0x9F9CF8, 0x0B, 0x5C, 0], +[0x4F4E1C, 0x10, 0x7C, 1], +[0x4F4E1E, 0x0B, 0x5C, 1], +[0x3C9450, 0x10, 0x7C, 1], +[0x3C9452, 0x0B, 0x5C, 1], +[0x9F9D74, 0x10, 0x7C, 1], +[0x9F9D76, 0x0B, 0x5C, 1], +[0xA6202E, 0x8A, 0x3C, 0], +[0xA62032, 0x32, 0x71, 0], +[0xA62030, 0xED, 0x50, 0], +[0xA62034, 0xFB, 0x7A, 0], +[0xA6204E, 0x8A, 0x3C, 1], +[0xA62052, 0x32, 0x71, 1], +[0xA62050, 0xED, 0x50, 1], +[0xA62054, 0xFB, 0x7A, 1], +[0x3D4812, 0xF6, 0x59, 0], +[0x3D480E, 0xF6, 0x59, 1], +[0x3D4810, 0xFB, 0x7A, 0], +[0x3D480C, 0xFB, 0x7A, 1], +[0x3CC9FE, 0x10, 0x7C, 0], +[0x3CCA0A, 0x0B, 0x5C, 0], +[0x8CBE20, 0x74, 0x51, 0], +[0x8CBE22, 0x0B, 0x5C, 0], +[0x8CBE1E, 0xF7, 0x79, 0], +[0x8CBE40, 0x74, 0x51, 1], +[0x8CBE42, 0x0B, 0x5C, 1], +[0x8CBE3E, 0xF7, 0x79, 1], +[0x8CBEE0, 0x10, 0x7C, 0], +[0x8CBEDE, 0x77, 0x72, 0], +[0x8CBEE2, 0x0B, 0x5C, 0], +[0x3B8F38, 0x74, 0x51, 1], +[0x3B8F3A, 0x77, 0x72, 1], +[0x3B8F40, 0x74, 0x51, 0], +[0x3B8F42, 0x77, 0x72, 0], +[0x3D1094, 0xF6, 0x59, 0], +[0x3D109A, 0x66, 0x28, 0], +[0x3D1098, 0x05, 0x39, 0], +[0x3D1096, 0x0F, 0x5C, 0], +[0x3D1092, 0x77, 0x72, 0], +[0x3D1090, 0xFB, 0x7A, 0], +[0x3D10D4, 0xF6, 0x59, 1], +[0x3D10DA, 0x66, 0x28, 1], +[0x3D10D8, 0x05, 0x39, 1], +[0x3D10D6, 0x0F, 0x5C, 1], +[0x3D10D2, 0x77, 0x72, 1], +[0x3D10D0, 0xFB, 0x7A, 1], +[0x3D14D0, 0x10, 0x7C, 0], +[0x3D14D2, 0x0B, 0x5C, 0], +[0x3D14CE, 0xFB, 0x7A, 0], +[0x3D14CC, 0x98, 0x6E, 0], +[0x3D1510, 0xF6, 0x59, 1], +[0x3D1512, 0x0B, 0x5C, 1], +[0x3D150E, 0xFB, 0x7A, 1], +[0x3D150C, 0x98, 0x6E, 1], +[0x3CE0F4, 0x8A, 0x3C, 1], +[0x3CE0F2, 0x0B, 0x64, 1], +[0x3CE0F0, 0x98, 0x6E, 1], +[0x3CE0D4, 0x8A, 0x3C, 0], +[0x3CE0D2, 0x0B, 0x64, 0], +[0x3CE0D0, 0x98, 0x6E, 0]] + +redHat = [ +[0x3CC884, 0x3F, 0x04, 0], +[0x3CC886, 0x17, 0x00, 0], +[0x3CC8C4, 0x3F, 0x04, 1], +[0x3CC8C6, 0x17, 0x00, 1], +[0x4F4CDC, 0x3F, 0x04, 0], +[0x4F4CDE, 0x17, 0x00, 0], +[0x4F4D1C, 0x3F, 0x04, 1], +[0x4F4D1E, 0x17, 0x00, 1], +[0x4F51D8, 0x3F, 0x04, 1], +[0x4F51DC, 0x3F, 0x04, 0], +[0x4F51E8, 0x1D, 0x3A, 0], +[0x4F51EA, 0x1D, 0x3A, 1], +[0x4F51DA, 0x5F, 0x42, 1], +[0x4F51DE, 0x5F, 0x42, 0], +[0x4FB686, 0x3F, 0x04, 0], +[0x4FB6A6, 0x3F, 0x04, 1], +[0x4FB684, 0x0F, 0x00, 0], +[0x4FB6A4, 0x0F, 0x00, 1], +[0x4FB688, 0x5F, 0x42, 0], +[0x4FB6A8, 0x5F, 0x42, 1], +[0x4FB786, 0x3F, 0x04, 0], +[0x4FB788, 0x5F, 0x42, 0], +[0x4FB78A, 0xDF, 0x52, 0], +[0x4FB7A6, 0x3F, 0x04, 1], +[0x4FB7A8, 0x5F, 0x42, 1], +[0x4FB7AA, 0xDF, 0x52, 1], +[0x51901C, 0x3F, 0x04, 0], +[0x519018, 0xD0, 0x00, 0], +[0x51901A, 0x19, 0x00, 0], +[0x51903C, 0x3F, 0x04, 1], +[0x519038, 0xD0, 0x00, 1], +[0x51903A, 0x19, 0x00, 1], +[0x5193EA, 0x17, 0x00, 0], +[0x5193E8, 0x3F, 0x04, 0], +[0x51940A, 0x17, 0x00, 1], +[0x519408, 0x3F, 0x04, 1], +[0x3A72AE, 0x7D, 0x21, 1], +[0x3A7244, 0x9A, 0x29, 0], +[0x3A724C, 0xDE, 0x21, 1], +[0x3A7290, 0x7D, 0x21, 0], +[0x3A72B2, 0xDE, 0x21, 1], +[0x3A7270, 0x16, 0x1D, 1], +[0x3A7288, 0x16, 0x1D, 0], +[0x3A7296, 0x3F, 0x22, 0], +[0x3A7274, 0xDE, 0x21, 1], +[0x3A7294, 0xDE, 0x21, 0], +[0x3A724A, 0x5F, 0x22, 0], +[0x3A7278, 0x5F, 0x22, 1], +[0x3A724E, 0xDF, 0x22, 0], +[0x3A727A, 0xDF, 0x22, 1], +[0x3A7252, 0x3F, 0x1F, 0], +[0x3A727C, 0x3F, 0x1F, 1], +[0x3A72BC, 0x3F, 0x1F, 1], +[0x3A726C, 0x10, 0x1D, 1], +[0x3A7286, 0x10, 0x1D, 0], +[0x3A728C, 0x3C, 0x1D, 0], +[0x3A7272, 0x9A, 0x29, 1], +[0x3A7254, 0x9F, 0x23, 1], +[0x3A7256, 0x9F, 0x23, 0], +[0x3A7264, 0x9F, 0x23, 1], +[0x9F9A58, 0x71, 0x29, 0], +[0x9F9A5E, 0x71, 0x29, 1], +[0x9F9A2A, 0x3F, 0x04, 0], +[0x9F9A30, 0x3F, 0x04, 1], +[0x9F9A36, 0x3F, 0x04, 0], +[0x9F9A3C, 0x3F, 0x04, 1], +[0x9F9A4A, 0x3F, 0x04, 0], +[0x9F9A50, 0x3F, 0x04, 1], +[0x9F9A56, 0x30, 0x04, 0], +[0x9F9A5C, 0x30, 0x04, 1], +[0x9F9A28, 0x0F, 0x00, 0], +[0x9F9A2E, 0x0F, 0x00, 1], +[0x9F9A48, 0x0F, 0x00, 0], +[0x9F9A4E, 0x0F, 0x00, 1], +[0x9F9A34, 0x17, 0x00, 0], +[0x9F9A3A, 0x17, 0x00, 1], +[0x9F9A2C, 0x5F, 0x42, 0], +[0x9F9A32, 0x5F, 0x42, 1], +[0x9F9A38, 0x5F, 0x42, 0], +[0x9F9A3E, 0x5F, 0x42, 1], +[0x9F9A4C, 0x5F, 0x42, 0], +[0x9F9A52, 0x5F, 0x42, 1], +[0xA5DD46, 0x13, 0x00, 0], +[0xA5DD44, 0x0F, 0x00, 0], +[0xA5DD4A, 0x7F, 0x0C, 0], +[0xA5DD3E, 0x30, 0x21, 0], +[0xA5DD40, 0xDF, 0x35, 0], +[0xA5DD42, 0x9F, 0x4A, 0], +[0xA5DD48, 0x59, 0x08, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x13, 0x00, 1], +[0xA5DD64, 0x0F, 0x00, 1], +[0xA5DD6A, 0x7F, 0x0C, 1], +[0xA5DD5E, 0x30, 0x21, 1], +[0xA5DD60, 0xDF, 0x35, 1], +[0xA5DD62, 0x9F, 0x4A, 1], +[0xA5DD68, 0x59, 0x08, 1], +[0x3D0E0C, 0x3F, 0x04, 1], +[0x3D0E18, 0x3F, 0x04, 0], +[0x3D0E0A, 0x17, 0x00, 1], +[0x3D0E1A, 0x17, 0x00, 0], +[0x3D0E08, 0x5F, 0x42, 1], +[0x3D0E16, 0x5F, 0x42, 0], +[0x3CC9C4, 0x3F, 0x04, 0], +[0x3CC9C6, 0x17, 0x00, 0], +[0x3CDE7C, 0x3F, 0x04, 1], +[0x3CDE7E, 0x17, 0x00, 1], +[0x51AD2C, 0x3F, 0x04, 0], +[0x51AD2E, 0x17, 0x00, 0], +[0x51AD4C, 0x3F, 0x04, 1], +[0x51AD4E, 0x17, 0x00, 1], +[0x51A4AE, 0x17, 0x00, 0], +[0x51A4AC, 0x3F, 0x04, 0], +[0x51A4CC, 0x3F, 0x04, 1], +[0x51A4CE, 0x17, 0x00, 1], +[0x51A98C, 0x3F, 0x04, 0], +[0x51A98E, 0x17, 0x00, 0], +[0x51A96C, 0x3F, 0x04, 1], +[0x51A96E, 0x17, 0x00, 1], +[0x51AA00, 0x3A, 0x04, 0], +[0x51AA10, 0x3A, 0x04, 1], +[0x51AA02, 0x12, 0x00, 0], +[0x51AA12, 0x12, 0x00, 1], +[0x51A9FE, 0x1F, 0x0D, 0], +[0x51AA0E, 0x1F, 0x0D, 1], +[0x51AA0A, 0xFF, 0x26, 0], +[0x3CC984, 0x3F, 0x04, 0], +[0x3CC986, 0x17, 0x00, 0], +[0x3D4B52, 0x1D, 0x00, 0], +[0x3D4B5C, 0x13, 0x00, 0], +[0x3D4B54, 0x3F, 0x04, 0], +[0x3D4B56, 0x17, 0x00, 0], +[0x3D4B50, 0xBF, 0x56, 0], +[0x3CCA44, 0x3F, 0x04, 1], +[0x3CCA46, 0x17, 0x00, 1], +[0x3CFB3C, 0x3F, 0x04, 0], +[0x3CFB3E, 0x17, 0x00, 0], +[0x3CFB7C, 0x3F, 0x04, 1], +[0x3CFB7E, 0x17, 0x00, 1], +[0x3D504C, 0x1B, 0x00, 0], +[0x3D504A, 0x3F, 0x04, 0], +[0x3D504E, 0x17, 0x00, 0], +[0x3D508C, 0x1B, 0x00, 1], +[0x3D508A, 0x3F, 0x04, 1], +[0x3D508E, 0x17, 0x00, 1], +[0xA5DDA2, 0x13, 0x00, 0], +[0xA5DDC2, 0x13, 0x00, 1], +[0xA5DDA6, 0x7F, 0x0C, 0], +[0xA5DDC6, 0x7F, 0x0C, 1], +[0xA5DDA4, 0x59, 0x08, 0], +[0xA5DDC4, 0x59, 0x08, 1], +[0xA5DDA8, 0x3F, 0x5B, 0], +[0xA5DDC8, 0x3F, 0x5B, 1], +[0x3D3E0C, 0x3F, 0x04, 1], +[0x3D3E10, 0x3F, 0x04, 0], +[0x3D3E0E, 0x17, 0x00, 1], +[0x3D3E12, 0x17, 0x00, 0], +[0x3CF1C0, 0x3F, 0x04, 0], +[0x3CF200, 0x3F, 0x04, 1], +[0x3CF1C2, 0x17, 0x00, 0], +[0x3CF202, 0x17, 0x00, 1], +[0x3D360E, 0xDD, 0x10, 1], +[0x3D3614, 0xDD, 0x10, 0], +[0x3D360C, 0x3F, 0x46, 1], +[0x3D3612, 0x3F, 0x46, 0], +[0x3D3604, 0x76, 0x00, 0], +[0x3D3606, 0x76, 0x00, 1], +[0x3D360A, 0x5F, 0x6B, 1], +[0x3D3610, 0x5F, 0x6B, 0], +[0x3D1A48, 0x9D, 0x31, 0], +[0x3D1A46, 0xBF, 0x56, 0], +[0x3D1A44, 0x7F, 0x6F, 0], +[0x3D1A4A, 0xFA, 0x1C, 0], +[0x3D1A88, 0x9D, 0x31, 1], +[0x3D1A8A, 0xFA, 0x1C, 1], +[0x3D1A86, 0xBF, 0x56, 1], +[0x3D1A84, 0x7F, 0x6F, 1], +[0x3CE282, 0x18, 0x00, 0], +[0x3CE2C2, 0x18, 0x00, 1], +[0x3CE280, 0x1F, 0x52, 0], +[0x3CE2C0, 0x1F, 0x52, 1], +[0x4FA29E, 0x18, 0x00, 0], +[0x4FA2DE, 0x18, 0x00, 1], +[0x4FA29C, 0x1F, 0x52, 0], +[0x4FA2DC, 0x1F, 0x52, 1], +[0x3D4786, 0x1F, 0x03, 1], +[0x3D478C, 0x9F, 0x0B, 0], +[0x3D478E, 0x1F, 0x03, 0], +[0x3D4788, 0x3F, 0x25, 1], +[0x3D4790, 0x3F, 0x25, 0], +[0x3D478A, 0x1A, 0x00, 1], +[0x3D4794, 0x50, 0x08, 0], +[0x3D4792, 0x1A, 0x00, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0xDF, 0x5A, 1], +[0x3C9E40, 0xDF, 0x5A, 0], +[0x3C9E38, 0x5F, 0x6B, 1], +[0x3C9E3E, 0x5F, 0x6B, 0], +[0x3C9E36, 0xDF, 0x7B, 1], +[0x3C9E3C, 0xDF, 0x7B, 0], +[0x4F4D5C, 0x3F, 0x04, 0], +[0x4F4D5E, 0x17, 0x00, 0], +[0x3C9320, 0x3F, 0x04, 0], +[0x3C9322, 0x17, 0x00, 0], +[0x9F9CF6, 0x3F, 0x04, 0], +[0x9F9CF8, 0x17, 0x00, 0], +[0x4F4E1C, 0x3F, 0x04, 1], +[0x4F4E1E, 0x17, 0x00, 1], +[0x3C9450, 0x3F, 0x04, 1], +[0x3C9452, 0x17, 0x00, 1], +[0x9F9D74, 0x3F, 0x04, 1], +[0x9F9D76, 0x17, 0x00, 1], +[0xA6202E, 0x13, 0x00, 0], +[0xA62032, 0x7F, 0x0C, 0], +[0xA62030, 0x59, 0x08, 0], +[0xA62034, 0x3F, 0x5B, 0], +[0xA6204E, 0x13, 0x00, 1], +[0xA62052, 0x7F, 0x0C, 1], +[0xA62050, 0x59, 0x08, 1], +[0xA62054, 0x3F, 0x5B, 1], +[0x3D4812, 0xBD, 0x14, 0], +[0x3D480E, 0xBD, 0x14, 1], +[0x3D4810, 0xBF, 0x35, 0], +[0x3D480C, 0xBF, 0x35, 1], +[0x3CC9FE, 0x3F, 0x04, 0], +[0x3CCA0A, 0xF0, 0x00, 0], +[0x8CBE20, 0x9C, 0x35, 0], +[0x8CBE22, 0xF9, 0x28, 0], +[0x8CBE1E, 0xFF, 0x3D, 0], +[0x8CBE40, 0x9C, 0x35, 1], +[0x8CBE42, 0xF9, 0x28, 1], +[0x8CBE3E, 0xFF, 0x3D, 1], +[0x8CBEE0, 0x3F, 0x04, 0], +[0x8CBEDE, 0x7F, 0x4E, 0], +[0x8CBEE2, 0x17, 0x00, 0], +[0x3B8F38, 0x1F, 0x20, 1], +[0x3B8F3A, 0x1F, 0x5A, 1], +[0x3B8F40, 0x1F, 0x20, 0], +[0x3B8F42, 0x1F, 0x5A, 0], +[0x3D1094, 0x7C, 0x2D, 0], +[0x3D109A, 0x2F, 0x00, 0], +[0x3D1098, 0x36, 0x04, 0], +[0x3D1096, 0x7A, 0x0C, 0], +[0x3D1092, 0x7F, 0x4E, 0], +[0x3D1090, 0x9F, 0x6F, 0], +[0x3D10D4, 0x7C, 0x2D, 1], +[0x3D10DA, 0x2F, 0x00, 1], +[0x3D10D8, 0x36, 0x04, 1], +[0x3D10D6, 0x7A, 0x0C, 1], +[0x3D10D2, 0x7F, 0x4E, 1], +[0x3D10D0, 0x9F, 0x6F, 1], +[0x3D14D0, 0x3F, 0x04, 0], +[0x3D14D2, 0x17, 0x00, 0], +[0x3D14CE, 0x1F, 0x3E, 0], +[0x3D14CC, 0x1F, 0x57, 0], +[0x3D1510, 0xDE, 0x21, 1], +[0x3D1512, 0x17, 0x00, 1], +[0x3D150E, 0x1F, 0x3E, 1], +[0x3D150C, 0x1F, 0x57, 1], +[0x3CE0F4, 0x34, 0x04, 1], +[0x3CE0F2, 0x3A, 0x04, 1], +[0x3CE0F0, 0x1B, 0x3E, 1], +[0x3CE0D4, 0x34, 0x04, 0], +[0x3CE0D2, 0x3A, 0x04, 0], +[0x3CE0D0, 0x1B, 0x3E, 0]] + +silhouetteHat = [ +[0x3CC878, 0xFF, 0x7F, 0], +[0x3CC87A, 0xFF, 0x7F, 0], +[0x3CC87C, 0xFF, 0x7F, 0], +[0x3CC87E, 0xFF, 0x7F, 0], +[0x3CC880, 0xFF, 0x7F, 0], +[0x3CC882, 0xFF, 0x7F, 0], +[0x3CC884, 0xFF, 0x7F, 0], +[0x3CC886, 0xFF, 0x7F, 0], +[0x3CC888, 0xFF, 0x7F, 0], +[0x3CC88A, 0xFF, 0x7F, 0], +[0x3CC88C, 0xFF, 0x7F, 0], +[0x3CC88E, 0xFF, 0x7F, 0], +[0x3CC890, 0xFF, 0x7F, 0], +[0x3CC892, 0xFF, 0x7F, 0], +[0x3CC8B8, 0xFF, 0x7F, 1], +[0x3CC8BA, 0xFF, 0x7F, 1], +[0x3CC8BC, 0xFF, 0x7F, 1], +[0x3CC8BE, 0xFF, 0x7F, 1], +[0x3CC8C0, 0xFF, 0x7F, 1], +[0x3CC8C2, 0xFF, 0x7F, 1], +[0x3CC8C4, 0xFF, 0x7F, 1], +[0x3CC8C6, 0xFF, 0x7F, 1], +[0x3CC8C8, 0xFF, 0x7F, 1], +[0x3CC8CA, 0xFF, 0x7F, 1], +[0x3CC8CC, 0xFF, 0x7F, 1], +[0x3CC8CE, 0xFF, 0x7F, 1], +[0x3CC8D0, 0xFF, 0x7F, 1], +[0x3CC8D2, 0xFF, 0x7F, 1], +[0x4F4CD0, 0xFF, 0x7F, 0], +[0x4F4CD2, 0xFF, 0x7F, 0], +[0x4F4CD4, 0xFF, 0x7F, 0], +[0x4F4CD6, 0xFF, 0x7F, 0], +[0x4F4CD8, 0xFF, 0x7F, 0], +[0x4F4CDA, 0xFF, 0x7F, 0], +[0x4F4CDC, 0xFF, 0x7F, 0], +[0x4F4CDE, 0xFF, 0x7F, 0], +[0x4F4CE0, 0xFF, 0x7F, 0], +[0x4F4CE2, 0xFF, 0x7F, 0], +[0x4F4CE4, 0xFF, 0x7F, 0], +[0x4F4CE6, 0xFF, 0x7F, 0], +[0x4F4CE8, 0xFF, 0x7F, 0], +[0x4F4CEA, 0xFF, 0x7F, 0], +[0x4F4D10, 0xFF, 0x7F, 1], +[0x4F4D12, 0xFF, 0x7F, 1], +[0x4F4D14, 0xFF, 0x7F, 1], +[0x4F4D16, 0xFF, 0x7F, 1], +[0x4F4D18, 0xFF, 0x7F, 1], +[0x4F4D1A, 0xFF, 0x7F, 1], +[0x4F4D1C, 0xFF, 0x7F, 1], +[0x4F4D1E, 0xFF, 0x7F, 1], +[0x4F4D20, 0xFF, 0x7F, 1], +[0x4F4D22, 0xFF, 0x7F, 1], +[0x4F4D24, 0xFF, 0x7F, 1], +[0x4F4D26, 0xFF, 0x7F, 1], +[0x4F4D28, 0xFF, 0x7F, 1], +[0x4F4D2A, 0xFF, 0x7F, 1], +[0x4F51D8, 0xFF, 0x7F, 1], +[0x4F51DA, 0xFF, 0x7F, 1], +[0x4F51DC, 0xFF, 0x7F, 0], +[0x4F51DE, 0xFF, 0x7F, 0], +[0x4F51E8, 0xFF, 0x7F, 0], +[0x4F51EA, 0xFF, 0x7F, 1], +[0x4FB684, 0xFF, 0x7F, 0], +[0x4FB686, 0xFF, 0x7F, 0], +[0x4FB688, 0xFF, 0x7F, 0], +[0x4FB6A4, 0xFF, 0x7F, 1], +[0x4FB6A6, 0xFF, 0x7F, 1], +[0x4FB6A8, 0xFF, 0x7F, 1], +[0x4FB692, 0xFF, 0x7F, 0], +[0x4FB6B2, 0xFF, 0x7F, 1], +[0x4FB786, 0xFF, 0x7F, 0], +[0x4FB788, 0xFF, 0x7F, 0], +[0x4FB78A, 0xFF, 0x7F, 0], +[0x4FB7A6, 0xFF, 0x7F, 1], +[0x4FB7A8, 0xFF, 0x7F, 1], +[0x4FB7AA, 0xFF, 0x7F, 1], +[0x519006, 0xFF, 0x7F, 0], +[0x519008, 0xFF, 0x7F, 0], +[0x51900C, 0xFF, 0x7F, 0], +[0x51900E, 0xFF, 0x7F, 0], +[0x519010, 0xFF, 0x7F, 0], +[0x519012, 0xFF, 0x7F, 0], +[0x519014, 0xFF, 0x7F, 0], +[0x519016, 0xFF, 0x7F, 0], +[0x519018, 0xFF, 0x7F, 0], +[0x51901A, 0xFF, 0x7F, 0], +[0x51901C, 0xFF, 0x7F, 0], +[0x51901E, 0xFF, 0x7F, 0], +[0x519020, 0xFF, 0x7F, 0], +[0x519022, 0xFF, 0x7F, 0], +[0x519026, 0xFF, 0x7F, 1], +[0x519028, 0xFF, 0x7F, 1], +[0x51902C, 0xFF, 0x7F, 1], +[0x51902E, 0xFF, 0x7F, 1], +[0x519030, 0xFF, 0x7F, 1], +[0x519032, 0xFF, 0x7F, 1], +[0x519034, 0xFF, 0x7F, 1], +[0x519036, 0xFF, 0x7F, 1], +[0x519038, 0xFF, 0x7F, 1], +[0x51903A, 0xFF, 0x7F, 1], +[0x51903C, 0xFF, 0x7F, 1], +[0x51903E, 0xFF, 0x7F, 1], +[0x519040, 0xFF, 0x7F, 1], +[0x519042, 0xFF, 0x7F, 1], +[0x5193D2, 0xFF, 0x7F, 0], +[0x5193D4, 0xFF, 0x7F, 0], +[0x5193D6, 0xFF, 0x7F, 0], +[0x5193D8, 0xFF, 0x7F, 0], +[0x5193DA, 0xFF, 0x7F, 0], +[0x5193DC, 0xFF, 0x7F, 0], +[0x5193DE, 0xFF, 0x7F, 0], +[0x5193E0, 0xFF, 0x7F, 0], +[0x5193E2, 0xFF, 0x7F, 0], +[0x5193E4, 0xFF, 0x7F, 0], +[0x5193E6, 0xFF, 0x7F, 0], +[0x5193E8, 0xFF, 0x7F, 0], +[0x5193EA, 0xFF, 0x7F, 0], +[0x5193EC, 0xFF, 0x7F, 0], +[0x5193F2, 0xFF, 0x7F, 1], +[0x5193F4, 0xFF, 0x7F, 1], +[0x5193F6, 0xFF, 0x7F, 1], +[0x5193F8, 0xFF, 0x7F, 1], +[0x5193FA, 0xFF, 0x7F, 1], +[0x5193FC, 0xFF, 0x7F, 1], +[0x5193FE, 0xFF, 0x7F, 1], +[0x519400, 0xFF, 0x7F, 1], +[0x519402, 0xFF, 0x7F, 1], +[0x519404, 0xFF, 0x7F, 1], +[0x519406, 0xFF, 0x7F, 1], +[0x519408, 0xFF, 0x7F, 1], +[0x51940A, 0xFF, 0x7F, 1], +[0x51940C, 0xFF, 0x7F, 1], +[0x3A7244, 0xFF, 0x7F, 0], +[0x3A724A, 0xFF, 0x7F, 0], +[0x3A724C, 0xFF, 0x7F, 1], +[0x3A724E, 0xFF, 0x7F, 0], +[0x3A7252, 0xFF, 0x7F, 0], +[0x3A7254, 0xFF, 0x7F, 1], +[0x3A7256, 0xFF, 0x7F, 0], +[0x3A7264, 0xFF, 0x7F, 1], +[0x3A726C, 0xFF, 0x7F, 1], +[0x3A7270, 0xFF, 0x7F, 1], +[0x3A7272, 0xFF, 0x7F, 1], +[0x3A7274, 0xFF, 0x7F, 1], +[0x3A7278, 0xFF, 0x7F, 1], +[0x3A727A, 0xFF, 0x7F, 1], +[0x3A727C, 0xFF, 0x7F, 1], +[0x3A7286, 0xFF, 0x7F, 0], +[0x3A7288, 0xFF, 0x7F, 0], +[0x3A728C, 0xFF, 0x7F, 0], +[0x3A7290, 0xFF, 0x7F, 0], +[0x3A7294, 0xFF, 0x7F, 0], +[0x3A7296, 0xFF, 0x7F, 0], +[0x3A72AE, 0xFF, 0x7F, 1], +[0x3A72B2, 0xFF, 0x7F, 1], +[0x3A72BC, 0xFF, 0x7F, 1], +[0x9F9A28, 0xFF, 0x7F, 0], +[0x9F9A2A, 0xFF, 0x7F, 0], +[0x9F9A2C, 0xFF, 0x7F, 0], +[0x9F9A2E, 0xFF, 0x7F, 1], +[0x9F9A30, 0xFF, 0x7F, 1], +[0x9F9A32, 0xFF, 0x7F, 1], +[0x9F9A34, 0xFF, 0x7F, 0], +[0x9F9A36, 0xFF, 0x7F, 0], +[0x9F9A38, 0xFF, 0x7F, 0], +[0x9F9A3A, 0xFF, 0x7F, 1], +[0x9F9A3C, 0xFF, 0x7F, 1], +[0x9F9A3E, 0xFF, 0x7F, 1], +[0x9F9A48, 0xFF, 0x7F, 0], +[0x9F9A4A, 0xFF, 0x7F, 0], +[0x9F9A4C, 0xFF, 0x7F, 0], +[0x9F9A4E, 0xFF, 0x7F, 1], +[0x9F9A50, 0xFF, 0x7F, 1], +[0x9F9A52, 0xFF, 0x7F, 1], +[0x9F9A56, 0xFF, 0x7F, 0], +[0x9F9A58, 0xFF, 0x7F, 0], +[0x9F9A5C, 0xFF, 0x7F, 1], +[0x9F9A5E, 0xFF, 0x7F, 1], +[0x9F9A26, 0xFF, 0x7F, 0], +[0x9F9A46, 0xFF, 0x7F, 1], +[0xA5DD32, 0xFF, 0x7F, 0], +[0xA5DD34, 0xFF, 0x7F, 0], +[0xA5DD38, 0xFF, 0x7F, 0], +[0xA5DD3A, 0xFF, 0x7F, 0], +[0xA5DD3C, 0xFF, 0x7F, 0], +[0xA5DD3E, 0xFF, 0x7F, 0], +[0xA5DD40, 0xFF, 0x7F, 0], +[0xA5DD42, 0xFF, 0x7F, 0], +[0xA5DD44, 0xFF, 0x7F, 0], +[0xA5DD46, 0xFF, 0x7F, 0], +[0xA5DD48, 0xFF, 0x7F, 0], +[0xA5DD4A, 0xFF, 0x7F, 0], +[0xA5DD4C, 0xFF, 0x7F, 0], +[0xA5DD4E, 0x00, 0x00, 0], +[0xA5DD52, 0xFF, 0x7F, 1], +[0xA5DD54, 0xFF, 0x7F, 1], +[0xA5DD58, 0xFF, 0x7F, 1], +[0xA5DD5A, 0xFF, 0x7F, 1], +[0xA5DD5C, 0xFF, 0x7F, 1], +[0xA5DD5E, 0xFF, 0x7F, 1], +[0xA5DD60, 0xFF, 0x7F, 1], +[0xA5DD62, 0xFF, 0x7F, 1], +[0xA5DD64, 0xFF, 0x7F, 1], +[0xA5DD66, 0xFF, 0x7F, 1], +[0xA5DD68, 0xFF, 0x7F, 1], +[0xA5DD6A, 0xFF, 0x7F, 1], +[0xA5DD6C, 0xFF, 0x7F, 1], +[0xA5DD6E, 0x00, 0x00, 1], +[0x3D0E08, 0xFF, 0x7F, 1], +[0x3D0E0A, 0xFF, 0x7F, 1], +[0x3D0E0C, 0xFF, 0x7F, 1], +[0x3D0E16, 0xFF, 0x7F, 0], +[0x3D0E18, 0xFF, 0x7F, 0], +[0x3D0E1A, 0xFF, 0x7F, 0], +[0x3CC9B8, 0xFF, 0x7F, 0], +[0x3CC9BA, 0xFF, 0x7F, 0], +[0x3CC9BC, 0xFF, 0x7F, 0], +[0x3CC9BE, 0xFF, 0x7F, 0], +[0x3CC9C0, 0xFF, 0x7F, 0], +[0x3CC9C2, 0xFF, 0x7F, 0], +[0x3CC9C4, 0xFF, 0x7F, 0], +[0x3CC9C6, 0xFF, 0x7F, 0], +[0x3CC9C8, 0xFF, 0x7F, 0], +[0x3CC9CA, 0xFF, 0x7F, 0], +[0x3CC9CC, 0xFF, 0x7F, 0], +[0x3CC9CE, 0xFF, 0x7F, 0], +[0x3CC9D0, 0xFF, 0x7F, 0], +[0x3CC9D2, 0xFF, 0x7F, 0], +[0x3CDE6E, 0xFF, 0x7F, 1], +[0x3CDE70, 0xFF, 0x7F, 1], +[0x3CDE72, 0xFF, 0x7F, 1], +[0x3CDE74, 0xFF, 0x7F, 1], +[0x3CDE7C, 0xFF, 0x7F, 1], +[0x3CDE7E, 0xFF, 0x7F, 1], +[0x3CDE80, 0xFF, 0x7F, 1], +[0x3CDE82, 0xFF, 0x7F, 1], +[0x3CDE84, 0xFF, 0x7F, 1], +[0x3CDE86, 0xFF, 0x7F, 1], +[0x3CDE88, 0xFF, 0x7F, 1], +[0x3CDE8A, 0xFF, 0x7F, 1], +[0x51AD1E, 0xFF, 0x7F, 0], +[0x51AD20, 0xFF, 0x7F, 0], +[0x51AD22, 0xFF, 0x7F, 0], +[0x51AD24, 0xFF, 0x7F, 0], +[0x51AD26, 0xFF, 0x7F, 0], +[0x51AD28, 0xFF, 0x7F, 0], +[0x51AD2A, 0xFF, 0x7F, 0], +[0x51AD2C, 0xFF, 0x7F, 0], +[0x51AD2E, 0xFF, 0x7F, 0], +[0x51AD30, 0xFF, 0x7F, 0], +[0x51AD32, 0xFF, 0x7F, 0], +[0x51AD34, 0xFF, 0x7F, 0], +[0x51AD36, 0xFF, 0x7F, 0], +[0x51AD38, 0xFF, 0x7F, 0], +[0x51AD3A, 0xFF, 0x7F, 0], +[0x51AD3E, 0xFF, 0x7F, 1], +[0x51AD40, 0xFF, 0x7F, 1], +[0x51AD42, 0xFF, 0x7F, 1], +[0x51AD44, 0xFF, 0x7F, 1], +[0x51AD46, 0xFF, 0x7F, 1], +[0x51AD48, 0xFF, 0x7F, 1], +[0x51AD4A, 0xFF, 0x7F, 1], +[0x51AD4C, 0xFF, 0x7F, 1], +[0x51AD4E, 0xFF, 0x7F, 1], +[0x51AD50, 0xFF, 0x7F, 1], +[0x51AD52, 0xFF, 0x7F, 1], +[0x51AD54, 0xFF, 0x7F, 1], +[0x51AD56, 0xFF, 0x7F, 1], +[0x51AD58, 0xFF, 0x7F, 1], +[0x51AD5A, 0xFF, 0x7F, 1], +[0x51A49E, 0xFF, 0x7F, 0], +[0x51A4A0, 0xFF, 0x7F, 0], +[0x51A4A2, 0xFF, 0x7F, 0], +[0x51A4A4, 0xFF, 0x7F, 0], +[0x51A4A6, 0xFF, 0x7F, 0], +[0x51A4A8, 0xFF, 0x7F, 0], +[0x51A4AA, 0xFF, 0x7F, 0], +[0x51A4AC, 0xFF, 0x7F, 0], +[0x51A4AE, 0xFF, 0x7F, 0], +[0x51A4B0, 0xFF, 0x7F, 0], +[0x51A4B2, 0xFF, 0x7F, 0], +[0x51A4B4, 0xFF, 0x7F, 0], +[0x51A4B6, 0xFF, 0x7F, 0], +[0x51A4B8, 0xFF, 0x7F, 0], +[0x51A4BA, 0xFF, 0x7F, 0], +[0x51A4BE, 0xFF, 0x7F, 1], +[0x51A4C0, 0xFF, 0x7F, 1], +[0x51A4C2, 0xFF, 0x7F, 1], +[0x51A4C4, 0xFF, 0x7F, 1], +[0x51A4C6, 0xFF, 0x7F, 1], +[0x51A4C8, 0xFF, 0x7F, 1], +[0x51A4CA, 0xFF, 0x7F, 1], +[0x51A4CC, 0xFF, 0x7F, 1], +[0x51A4CE, 0xFF, 0x7F, 1], +[0x51A4D0, 0xFF, 0x7F, 1], +[0x51A4D2, 0xFF, 0x7F, 1], +[0x51A4D4, 0xFF, 0x7F, 1], +[0x51A4D6, 0xFF, 0x7F, 1], +[0x51A4D8, 0xFF, 0x7F, 1], +[0x51A4DA, 0xFF, 0x7F, 1], +[0x51A97E, 0xFF, 0x7F, 0], +[0x51A980, 0xFF, 0x7F, 0], +[0x51A982, 0xFF, 0x7F, 0], +[0x51A984, 0xFF, 0x7F, 0], +[0x51A986, 0xFF, 0x7F, 0], +[0x51A988, 0xFF, 0x7F, 0], +[0x51A98A, 0xFF, 0x7F, 0], +[0x51A98C, 0xFF, 0x7F, 0], +[0x51A98E, 0xFF, 0x7F, 0], +[0x51A990, 0xFF, 0x7F, 0], +[0x51A992, 0xFF, 0x7F, 0], +[0x51A994, 0xFF, 0x7F, 0], +[0x51A996, 0xFF, 0x7F, 0], +[0x51A998, 0xFF, 0x7F, 0], +[0x51A99A, 0xFF, 0x7F, 0], +[0x51A95E, 0xFF, 0x7F, 1], +[0x51A960, 0xFF, 0x7F, 1], +[0x51A962, 0xFF, 0x7F, 1], +[0x51A964, 0xFF, 0x7F, 1], +[0x51A966, 0xFF, 0x7F, 1], +[0x51A968, 0xFF, 0x7F, 1], +[0x51A96A, 0xFF, 0x7F, 1], +[0x51A96C, 0xFF, 0x7F, 1], +[0x51A96E, 0xFF, 0x7F, 1], +[0x51A970, 0xFF, 0x7F, 1], +[0x51A972, 0xFF, 0x7F, 1], +[0x51A974, 0xFF, 0x7F, 1], +[0x51A976, 0xFF, 0x7F, 1], +[0x51A978, 0xFF, 0x7F, 1], +[0x51A97A, 0xFF, 0x7F, 1], +[0x51A9FE, 0xFF, 0x7F, 0], +[0x51AA00, 0xFF, 0x7F, 0], +[0x51AA02, 0xFF, 0x7F, 0], +[0x51AA0A, 0xFF, 0x7F, 0], +[0x51AA0E, 0xFF, 0x7F, 1], +[0x51AA10, 0xFF, 0x7F, 1], +[0x51AA12, 0xFF, 0x7F, 1], +[0x3CC976, 0x7F, 0x4F, 0], +[0x3CC978, 0xFF, 0x7F, 0], +[0x3CC97A, 0xFF, 0x7F, 0], +[0x3CC97C, 0xFF, 0x7F, 0], +[0x3CC97E, 0xFF, 0x7F, 0], +[0x3CC980, 0xFF, 0x7F, 0], +[0x3CC982, 0xFF, 0x7F, 0], +[0x3CC984, 0xFF, 0x7F, 0], +[0x3CC986, 0xFF, 0x7F, 0], +[0x3CC988, 0xFF, 0x7F, 0], +[0x3CC98A, 0xFF, 0x7F, 0], +[0x3CC98C, 0xFF, 0x7F, 0], +[0x3CC98E, 0xFF, 0x7F, 0], +[0x3CC990, 0xFF, 0x7F, 0], +[0x3CC992, 0xFF, 0x7F, 0], +[0x3D4B44, 0xFF, 0x7F, 0], +[0x3D4B46, 0xFF, 0x7F, 0], +[0x3D4B48, 0xFF, 0x7F, 0], +[0x3D4B4A, 0xFF, 0x7F, 0], +[0x3D4B4C, 0xFF, 0x7F, 0], +[0x3D4B4E, 0xFF, 0x7F, 0], +[0x3D4B50, 0xFF, 0x7F, 0], +[0x3D4B52, 0xFF, 0x7F, 0], +[0x3D4B54, 0xFF, 0x7F, 0], +[0x3D4B56, 0xFF, 0x7F, 0], +[0x3D4B58, 0xFF, 0x7F, 0], +[0x3D4B5A, 0x00, 0x00, 0], +[0x3D4B5C, 0xFF, 0x7F, 0], +[0x3D4B5E, 0xFF, 0x7F, 0], +[0x3D4B42, 0xFF, 0x7F, 0], +[0x3CCA38, 0xFF, 0x7F, 1], +[0x3CCA3A, 0xFF, 0x7F, 1], +[0x3CCA3C, 0xFF, 0x7F, 1], +[0x3CCA3E, 0xFF, 0x7F, 1], +[0x3CCA40, 0xFF, 0x7F, 1], +[0x3CCA42, 0xFF, 0x7F, 1], +[0x3CCA44, 0xFF, 0x7F, 1], +[0x3CCA46, 0xFF, 0x7F, 1], +[0x3CCA48, 0xFF, 0x7F, 1], +[0x3CCA4A, 0xFF, 0x7F, 1], +[0x3CCA4C, 0xFF, 0x7F, 1], +[0x3CCA4E, 0xFF, 0x7F, 1], +[0x3CCA50, 0xFF, 0x7F, 1], +[0x3CCA52, 0xFF, 0x7F, 1], +[0x3CCA36, 0xFF, 0x7F, 1], +[0x3CFB30, 0xFF, 0x7F, 0], +[0x3CFB32, 0xFF, 0x7F, 0], +[0x3CFB34, 0xFF, 0x7F, 0], +[0x3CFB36, 0xFF, 0x7F, 0], +[0x3CFB38, 0xFF, 0x7F, 0], +[0x3CFB3A, 0xFF, 0x7F, 0], +[0x3CFB3C, 0xFF, 0x7F, 0], +[0x3CFB3E, 0xFF, 0x7F, 0], +[0x3CFB40, 0xFF, 0x7F, 0], +[0x3CFB42, 0xFF, 0x7F, 0], +[0x3CFB44, 0xFF, 0x7F, 0], +[0x3CFB46, 0xFF, 0x7F, 0], +[0x3CFB48, 0xFF, 0x7F, 0], +[0x3CFB4A, 0xFF, 0x7F, 0], +[0x3CFB70, 0xFF, 0x7F, 1], +[0x3CFB72, 0xFF, 0x7F, 1], +[0x3CFB74, 0xFF, 0x7F, 1], +[0x3CFB76, 0xFF, 0x7F, 1], +[0x3CFB78, 0xFF, 0x7F, 1], +[0x3CFB7A, 0xFF, 0x7F, 1], +[0x3CFB7C, 0xFF, 0x7F, 1], +[0x3CFB7E, 0xFF, 0x7F, 1], +[0x3CFB80, 0xFF, 0x7F, 1], +[0x3CFB82, 0xFF, 0x7F, 1], +[0x3CFB84, 0xFF, 0x7F, 1], +[0x3CFB86, 0xFF, 0x7F, 1], +[0x3CFB88, 0xFF, 0x7F, 1], +[0x3CFB8A, 0xFF, 0x7F, 1], +[0x3D5044, 0xFF, 0x7F, 0], +[0x3D5046, 0xFF, 0x7F, 0], +[0x3D5048, 0xFF, 0x7F, 0], +[0x3D504A, 0xFF, 0x7F, 0], +[0x3D504C, 0xFF, 0x7F, 0], +[0x3D504E, 0xFF, 0x7F, 0], +[0x3D5050, 0xFF, 0x7F, 0], +[0x3D5052, 0xFF, 0x7F, 0], +[0x3D5054, 0xFF, 0x7F, 0], +[0x3D5056, 0xFF, 0x7F, 0], +[0x3D505C, 0xFF, 0x7F, 0], +[0x3D505E, 0xFF, 0x7F, 0], +[0x3D5084, 0xFF, 0x7F, 1], +[0x3D5086, 0xFF, 0x7F, 1], +[0x3D5088, 0xFF, 0x7F, 1], +[0x3D508A, 0xFF, 0x7F, 1], +[0x3D508C, 0xFF, 0x7F, 1], +[0x3D508E, 0xFF, 0x7F, 1], +[0x3D5090, 0xFF, 0x7F, 1], +[0x3D5092, 0xFF, 0x7F, 1], +[0x3D5094, 0xFF, 0x7F, 1], +[0x3D5096, 0xFF, 0x7F, 1], +[0x3D509C, 0xFF, 0x7F, 1], +[0x3D509E, 0xFF, 0x7F, 1], +[0xA5DDA2, 0xFF, 0x7F, 0], +[0xA5DDA4, 0x00, 0x00, 0], +[0xA5DDA6, 0xFF, 0x7F, 0], +[0xA5DDA8, 0xFF, 0x7F, 0], +[0xA5DDAE, 0x00, 0x00, 0], +[0xA5DDC2, 0xFF, 0x7F, 1], +[0xA5DDC4, 0x00, 0x00, 1], +[0xA5DDC6, 0xFF, 0x7F, 1], +[0xA5DDC8, 0xFF, 0x7F, 1], +[0xA5DDCE, 0x00, 0x00, 1], +[0x3D3E0C, 0xFF, 0x7F, 1], +[0x3D3E0E, 0xFF, 0x7F, 1], +[0x3D3E10, 0xFF, 0x7F, 0], +[0x3D3E12, 0xFF, 0x7F, 0], +[0x3CF1C0, 0xFF, 0x7F, 0], +[0x3CF1C2, 0xFF, 0x7F, 0], +[0x3CF200, 0xFF, 0x7F, 1], +[0x3CF202, 0xFF, 0x7F, 1], +[0x3D3604, 0xFF, 0x7F, 0], +[0x3D3606, 0xFF, 0x7F, 1], +[0x3D360A, 0xFF, 0x7F, 1], +[0x3D360C, 0xFF, 0x7F, 1], +[0x3D360E, 0xFF, 0x7F, 1], +[0x3D3610, 0xFF, 0x7F, 0], +[0x3D3612, 0xFF, 0x7F, 0], +[0x3D3614, 0xFF, 0x7F, 0], +[0x3D1A42, 0xFF, 0x7F, 0], +[0x3D1A44, 0xFF, 0x7F, 0], +[0x3D1A46, 0xFF, 0x7F, 0], +[0x3D1A48, 0xFF, 0x7F, 0], +[0x3D1A4A, 0xFF, 0x7F, 0], +[0x3D1A82, 0xFF, 0x7F, 1], +[0x3D1A84, 0xFF, 0x7F, 1], +[0x3D1A86, 0xFF, 0x7F, 1], +[0x3D1A88, 0xFF, 0x7F, 1], +[0x3D1A8A, 0xFF, 0x7F, 1], +[0x3CE280, 0xFF, 0x7F, 0], +[0x3CE282, 0xFF, 0x7F, 0], +[0x3CE2C0, 0xFF, 0x7F, 1], +[0x3CE2C2, 0xFF, 0x7F, 1], +[0x4FA29C, 0xFF, 0x7F, 0], +[0x4FA29E, 0xFF, 0x7F, 0], +[0x4FA2DC, 0xFF, 0x7F, 1], +[0x4FA2DE, 0xFF, 0x7F, 1], +[0x8D3C5E, 0xFF, 0x7F, 0], +[0x8D3C60, 0xFF, 0x7F, 0], +[0x8D3C62, 0xFF, 0x7F, 0], +[0x8D3C64, 0xFF, 0x7F, 0], +[0x8D3B9C, 0xAE, 0x7E, 0], +[0x8D3BA0, 0x20, 0x4E, 0], +[0x8D3B9E, 0x6C, 0x7E, 0], +[0x3D4C02, 0xFF, 0x7F, 0], +[0x3D4C0C, 0xFF, 0x7F, 0], +[0x3D4C0E, 0xFF, 0x7F, 0], +[0x3D4C10, 0xFF, 0x7F, 0], +[0x3D4C12, 0xFF, 0x7F, 0], +[0x3D4C14, 0xFF, 0x7F, 0], +[0x3D2D96, 0xFF, 0x7F, 0], +[0x3D2D98, 0xFF, 0x7F, 0], +[0x3D2D9A, 0xFF, 0x7F, 0], +[0x3D2D9C, 0xFF, 0x7F, 0], +[0x8CC272, 0xFF, 0x7F, 1], +[0x8CC274, 0xFF, 0x7F, 1], +[0x8CC276, 0xFF, 0x7F, 1], +[0x8CC278, 0x00, 0x00, 1], +[0x8CC27A, 0x00, 0x00, 1], +[0x8CC27C, 0x00, 0x00, 1], +[0x3D4784, 0xFF, 0x7F, 0], +[0x3D4786, 0xFF, 0x7F, 1], +[0x3D4788, 0xFF, 0x7F, 1], +[0x3D478A, 0x00, 0x00, 1], +[0x3D478C, 0xFF, 0x7F, 0], +[0x3D478E, 0xFF, 0x7F, 0], +[0x3D4790, 0xFF, 0x7F, 0], +[0x3D4792, 0xFF, 0x7F, 0], +[0x3D4794, 0x00, 0x00, 0], +[0x8CF4B2, 0xFF, 0x7F, 1], +[0x8CF4B4, 0xFF, 0x7F, 1], +[0x8CF4B6, 0xFF, 0x7F, 1], +[0x8CF4B8, 0x00, 0x00, 1], +[0x8CF4BA, 0x00, 0x00, 1], +[0x8CF4BC, 0x00, 0x00, 1], +[0x8CF7B2, 0xFF, 0x7F, 1], +[0x8CF7B4, 0xFF, 0x7F, 1], +[0x8CF7B6, 0xFF, 0x7F, 1], +[0x8CF7B8, 0x00, 0x00, 1], +[0x8CF7BA, 0x00, 0x00, 1], +[0x8CF7BC, 0x00, 0x00, 1], +[0x8D2D52, 0xFF, 0x7F, 1], +[0x8D2D54, 0xFF, 0x7F, 1], +[0x8D2D56, 0xFF, 0x7F, 1], +[0x8D2D58, 0x00, 0x00, 1], +[0x8D2D5A, 0x00, 0x00, 1], +[0x8D2D5C, 0x00, 0x00, 1], +[0x8D0096, 0xFF, 0x7F, 1], +[0x8D0A16, 0xFF, 0x7F, 1], +[0x8D006E, 0xFF, 0x7F, 1], +[0x8D0070, 0xFF, 0x7F, 1], +[0x8D09AE, 0xFF, 0x7F, 1], +[0x8D09B0, 0xFF, 0x7F, 1], +[0x3CE8F6, 0xFF, 0x7F, 1], +[0x3CE8F8, 0xFF, 0x7F, 1], +[0x3CE8FA, 0xFF, 0x7F, 1], +[0x8D0952, 0xFF, 0x7F, 1], +[0x8D0954, 0xFF, 0x7F, 1], +[0x8D0956, 0x00, 0x00, 1], +[0x8D0958, 0xFF, 0x7F, 1], +[0x8D095A, 0x00, 0x00, 1], +[0x8D095C, 0x00, 0x00, 1], +[0x3CE976, 0xFF, 0x7F, 1], +[0x3CE978, 0xFF, 0x7F, 1], +[0x3CE97A, 0xFF, 0x7F, 1], +[0x4F8912, 0xFF, 0x7F, 1], +[0x4F8914, 0xFF, 0x7F, 1], +[0x4F8916, 0xFF, 0x7F, 1], +[0x8D0456, 0xFF, 0x7F, 0], +[0x8D09F6, 0xFF, 0x7F, 0], +[0x8D042E, 0xFF, 0x7F, 0], +[0x8D0430, 0xFF, 0x7F, 0], +[0x8D09CE, 0xFF, 0x7F, 0], +[0x8D09D0, 0xFF, 0x7F, 0], +[0x3CE8B6, 0xFF, 0x7F, 0], +[0x3CE8B8, 0xFF, 0x7F, 0], +[0x3CE8BA, 0xFF, 0x7F, 0], +[0x8D0890, 0xFF, 0x7F, 0], +[0x8D0892, 0xFF, 0x7F, 0], +[0x8D0894, 0xFF, 0x7F, 0], +[0x8D0896, 0xFF, 0x7F, 0], +[0x3CE932, 0xFF, 0x7F, 0], +[0x3CE936, 0xFF, 0x7F, 0], +[0x3CE938, 0xFF, 0x7F, 0], +[0x3CE93A, 0xFF, 0x7F, 0], +[0x3CE940, 0xFF, 0x7F, 0], +[0x4F88CE, 0xFF, 0x7F, 0], +[0x4F88D2, 0xFF, 0x7F, 0], +[0x4F88D4, 0xFF, 0x7F, 0], +[0x4F88D6, 0xFF, 0x7F, 0], +[0x4F88DC, 0xFF, 0x7F, 0], +[0x8D095E, 0xFF, 0x7F, 0], +[0x8D0960, 0xFF, 0x7F, 0], +[0x8D0962, 0xFF, 0x7F, 0], +[0x8D0964, 0xFF, 0x7F, 0], +[0x3D2104, 0xFF, 0x7F, 0], +[0x3D210E, 0xFF, 0x7F, 0], +[0x3D2110, 0xFF, 0x7F, 0], +[0x3D2118, 0xFF, 0x7F, 0], +[0x3D211A, 0xFF, 0x7F, 0], +[0x8D0052, 0xFF, 0x7F, 1], +[0x8D0054, 0xFF, 0x7F, 1], +[0x8D0056, 0xFF, 0x7F, 1], +[0x8D0058, 0x00, 0x00, 1], +[0x8D005A, 0x00, 0x00, 1], +[0x8D005C, 0x00, 0x00, 1], +[0x8D005E, 0xFF, 0x7F, 0], +[0x8D0060, 0xFF, 0x7F, 0], +[0x8D0062, 0xFF, 0x7F, 0], +[0x8D0064, 0xFF, 0x7F, 0], +[0x3C9E36, 0xFF, 0x7F, 1], +[0x3C9E38, 0xFF, 0x7F, 1], +[0x3C9E3A, 0xFF, 0x7F, 1], +[0x3C9E3C, 0xFF, 0x7F, 0], +[0x3C9E3E, 0xFF, 0x7F, 0], +[0x3C9E40, 0xFF, 0x7F, 0], +[0x4F4D50, 0xFF, 0x7F, 0], +[0x4F4D52, 0xFF, 0x7F, 0], +[0x4F4D54, 0xFF, 0x7F, 0], +[0x4F4D56, 0xFF, 0x7F, 0], +[0x4F4D58, 0xFF, 0x7F, 0], +[0x4F4D5A, 0xFF, 0x7F, 0], +[0x4F4D5C, 0xFF, 0x7F, 0], +[0x4F4D5E, 0xFF, 0x7F, 0], +[0x4F4D60, 0xFF, 0x7F, 0], +[0x4F4D62, 0xFF, 0x7F, 0], +[0x4F4D64, 0xFF, 0x7F, 0], +[0x4F4D66, 0xFF, 0x7F, 0], +[0x4F4D68, 0xFF, 0x7F, 0], +[0x4F4D6A, 0xFF, 0x7F, 0], +[0x3C9314, 0xFF, 0x7F, 0], +[0x3C9316, 0xBD, 0x7B, 0], +[0x3C9318, 0x39, 0x6F, 0], +[0x3C931A, 0xB5, 0x62, 0], +[0x3C931C, 0xB5, 0x56, 0], +[0x3C931E, 0x31, 0x46, 0], +[0x3C9320, 0xDE, 0x7F, 0], +[0x3C9322, 0x5A, 0x6F, 0], +[0x3C9324, 0x89, 0x52, 0], +[0x3C9326, 0x08, 0x46, 0], +[0x3C9328, 0x39, 0x67, 0], +[0x3C932A, 0x73, 0x4E, 0], +[0x3C932C, 0x10, 0x42, 0], +[0x3C932E, 0xAD, 0x35, 0], +[0x9F9CEA, 0xFF, 0x7F, 0], +[0x9F9CEC, 0xBD, 0x7B, 0], +[0x9F9CEE, 0x39, 0x6F, 0], +[0x9F9CF0, 0xB5, 0x62, 0], +[0x9F9CF2, 0xB5, 0x56, 0], +[0x9F9CF4, 0x31, 0x46, 0], +[0x9F9CF6, 0xDE, 0x7F, 0], +[0x9F9CF8, 0x5A, 0x6F, 0], +[0x9F9CFA, 0x89, 0x52, 0], +[0x9F9CFC, 0x08, 0x46, 0], +[0x9F9CFE, 0x39, 0x67, 0], +[0x9F9D00, 0x73, 0x4E, 0], +[0x9F9D02, 0x10, 0x42, 0], +[0x9F9D04, 0xAD, 0x35, 0], +[0x4F4E10, 0xFF, 0x7F, 1], +[0x4F4E12, 0xFF, 0x7F, 1], +[0x4F4E14, 0xFF, 0x7F, 1], +[0x4F4E16, 0xFF, 0x7F, 1], +[0x4F4E18, 0xFF, 0x7F, 1], +[0x4F4E1A, 0xFF, 0x7F, 1], +[0x4F4E1C, 0xFF, 0x7F, 1], +[0x4F4E1E, 0xFF, 0x7F, 1], +[0x4F4E20, 0xFF, 0x7F, 1], +[0x4F4E22, 0xFF, 0x7F, 1], +[0x4F4E24, 0xFF, 0x7F, 1], +[0x4F4E26, 0xFF, 0x7F, 1], +[0x4F4E28, 0xFF, 0x7F, 1], +[0x4F4E2A, 0xFF, 0x7F, 1], +[0x3C9444, 0xFF, 0x7F, 1], +[0x3C9446, 0xBD, 0x7B, 1], +[0x3C9448, 0x39, 0x6F, 1], +[0x3C944A, 0xB5, 0x62, 1], +[0x3C944C, 0xB5, 0x56, 1], +[0x3C944E, 0x31, 0x46, 1], +[0x3C9450, 0xDE, 0x7F, 1], +[0x3C9452, 0x5A, 0x6F, 1], +[0x3C9454, 0x89, 0x52, 1], +[0x3C9456, 0x08, 0x46, 1], +[0x3C9458, 0x39, 0x67, 1], +[0x3C945A, 0x73, 0x4E, 1], +[0x3C945C, 0x10, 0x42, 1], +[0x3C945E, 0xAD, 0x35, 1], +[0x9F9D68, 0xFF, 0x7F, 1], +[0x9F9D6A, 0xBD, 0x7B, 1], +[0x9F9D6C, 0x39, 0x6F, 1], +[0x9F9D6E, 0xB5, 0x62, 1], +[0x9F9D70, 0xB5, 0x56, 1], +[0x9F9D72, 0x31, 0x46, 1], +[0x9F9D74, 0xDE, 0x7F, 1], +[0x9F9D76, 0x5A, 0x6F, 1], +[0x9F9D78, 0x89, 0x52, 1], +[0x9F9D7A, 0x08, 0x46, 1], +[0x9F9D7C, 0x39, 0x67, 1], +[0x9F9D7E, 0x73, 0x4E, 1], +[0x9F9D80, 0x10, 0x42, 1], +[0x9F9D82, 0xAD, 0x35, 1], +[0x518E12, 0xFF, 0x7F, 0], +[0x518E10, 0xFF, 0x7F, 0], +[0x518E1A, 0xFF, 0x7F, 0], +[0x518E18, 0xFF, 0x7F, 0], +[0xA6202E, 0xFF, 0x7F, 0], +[0xA62030, 0xFF, 0x7F, 0], +[0xA62032, 0xFF, 0x7F, 0], +[0xA62034, 0xFF, 0x7F, 0], +[0xA6203A, 0x00, 0x00, 0], +[0xA6204E, 0xFF, 0x7F, 1], +[0xA62050, 0xFF, 0x7F, 1], +[0xA62052, 0xFF, 0x7F, 1], +[0xA62054, 0xFF, 0x7F, 1], +[0xA6205A, 0x00, 0x00, 1], +[0x3D4804, 0xFF, 0x7F, 0], +[0x3D4806, 0xFF, 0x7F, 0], +[0x3D4808, 0xFF, 0x7F, 0], +[0x3D480A, 0xFF, 0x7F, 0], +[0x3D4810, 0xFF, 0x7F, 0], +[0x3D4812, 0xFF, 0x7F, 0], +[0x3D480C, 0xFF, 0x7F, 1], +[0x3D480E, 0xFF, 0x7F, 1], +[0x8D049E, 0xFF, 0x7F, 0], +[0x8D04A0, 0xFF, 0x7F, 0], +[0x8D04A2, 0xFF, 0x7F, 0], +[0x8D0592, 0xFF, 0x7F, 1], +[0x8D0594, 0xFF, 0x7F, 1], +[0x8D0596, 0xFF, 0x7F, 1], +[0x8D0598, 0x00, 0x00, 1], +[0x8D059A, 0x00, 0x00, 1], +[0x8D059C, 0x00, 0x00, 1], +[0x4F5010, 0xFF, 0x7F, 0], +[0x4F5012, 0xFF, 0x7F, 0], +[0x4F5014, 0xFF, 0x7F, 0], +[0x4F5016, 0xFF, 0x7F, 0], +[0x4F4ECE, 0xFF, 0x7F, 0], +[0x4F4ED0, 0xFF, 0x7F, 0], +[0x4F4ED2, 0xFF, 0x7F, 0], +[0x4F4ED4, 0xFF, 0x7F, 0], +[0x4F4ED6, 0xFF, 0x7F, 0], +[0x4F4ED8, 0xFF, 0x7F, 0], +[0x4F4EDA, 0xFF, 0x7F, 1], +[0x4F4EDC, 0xFF, 0x7F, 1], +[0x4F4EDE, 0xFF, 0x7F, 1], +[0x4F4EE0, 0xFF, 0x7F, 1], +[0x4F4EE2, 0xFF, 0x7F, 1], +[0x3CC9F8, 0xFF, 0x7F, 0], +[0x3CC9FA, 0xFF, 0x7F, 0], +[0x3CC9FC, 0xFF, 0x7F, 0], +[0x3CC9FE, 0xFF, 0x7F, 0], +[0x3CCA00, 0xFF, 0x7F, 0], +[0x3CCA02, 0xFF, 0x7F, 0], +[0x3CCA0A, 0xFF, 0x7F, 0], +[0x3CCA0C, 0xFF, 0x7F, 0], +[0x3CCA0E, 0xFF, 0x7F, 0], +[0x3CCA10, 0xFF, 0x7F, 0], +[0x3CCA12, 0xFF, 0x7F, 0], +[0x8CBE1E, 0xFF, 0x7F, 0], +[0x8CBE20, 0xFF, 0x7F, 0], +[0x8CBE22, 0xFF, 0x7F, 0], +[0x8CBE3E, 0xFF, 0x7F, 1], +[0x8CBE40, 0xFF, 0x7F, 1], +[0x8CBE42, 0xFF, 0x7F, 1], +[0x8CBEDE, 0xFF, 0x7F, 0], +[0x8CBEE0, 0xFF, 0x7F, 0], +[0x8CBED4, 0xFF, 0x7F, 0], +[0x8CBEE2, 0xFF, 0x7F, 0], +[0x8CBECA, 0xFF, 0x7F, 0], +[0x3B8F38, 0xFF, 0x7F, 1], +[0x3B8F3A, 0xFF, 0x7F, 1], +[0x3B8F40, 0xFF, 0x7F, 0], +[0x3B8F42, 0xFF, 0x7F, 0], +[0x3D1090, 0xFF, 0x7F, 0], +[0x3D1092, 0xFF, 0x7F, 0], +[0x3D1094, 0xFF, 0x7F, 0], +[0x3D1096, 0xFF, 0x7F, 0], +[0x3D1098, 0xFF, 0x7F, 0], +[0x3D109A, 0x00, 0x00, 0], +[0x3D109C, 0xFF, 0x7F, 0], +[0x3D109E, 0xFF, 0x7F, 0], +[0x3D1082, 0xFF, 0x7F, 0], +[0x3D1084, 0xFF, 0x7F, 0], +[0x3D1086, 0xFF, 0x7F, 0], +[0x3D10C2, 0xFF, 0x7F, 1], +[0x3D10C4, 0xFF, 0x7F, 1], +[0x3D10C6, 0xFF, 0x7F, 1], +[0x3D10D0, 0xFF, 0x7F, 1], +[0x3D10D2, 0xFF, 0x7F, 1], +[0x3D10D4, 0xFF, 0x7F, 1], +[0x3D10D6, 0xFF, 0x7F, 1], +[0x3D10D8, 0xFF, 0x7F, 1], +[0x3D10DA, 0x00, 0x00, 1], +[0x3D10DC, 0xFF, 0x7F, 1], +[0x3D10DE, 0xFF, 0x7F, 1], +[0x3D14C2, 0xFF, 0x7F, 0], +[0x3D14C4, 0xFF, 0x7F, 0], +[0x3D14C6, 0xFF, 0x7F, 0], +[0x3D14C8, 0xFF, 0x7F, 0], +[0x3D14CA, 0xFF, 0x7F, 0], +[0x3D14CC, 0xFF, 0x7F, 0], +[0x3D14CE, 0xFF, 0x7F, 0], +[0x3D14D0, 0xFF, 0x7F, 0], +[0x3D14D2, 0xFF, 0x7F, 0], +[0x3D14D4, 0xFF, 0x7F, 0], +[0x3D14D6, 0xFF, 0x7F, 0], +[0x3D1502, 0xFF, 0x7F, 1], +[0x3D1504, 0xFF, 0x7F, 1], +[0x3D1506, 0xFF, 0x7F, 1], +[0x3D1508, 0xFF, 0x7F, 1], +[0x3D150A, 0xFF, 0x7F, 1], +[0x3D150C, 0xFF, 0x7F, 1], +[0x3D150E, 0xFF, 0x7F, 1], +[0x3D1510, 0xFF, 0x7F, 1], +[0x3D1512, 0xFF, 0x7F, 1], +[0x3D1514, 0xFF, 0x7F, 1], +[0x3D1516, 0xFF, 0x7F, 1], +[0x3CE0F0, 0xFF, 0x7F, 1], +[0x3CE0F2, 0xFF, 0x7F, 1], +[0x3CE0F4, 0xFF, 0x7F, 1], +[0x3CE0D0, 0xFF, 0x7F, 0], +[0x3CE0D2, 0xFF, 0x7F, 0], +[0x3CE0D4, 0xFF, 0x7F, 0], +[0x8D3DAC, 0xFF, 0x7F, 0], +[0x8D3DBC, 0xFF, 0x7F, 0], +[0x8D3DB4, 0xFF, 0x7F, 0], +[0x8D3D86, 0xFF, 0x7F, 0], +[0x8D3DBA, 0xFF, 0x7F, 0], +[0x8D3DB8, 0xFF, 0x7F, 0]] + +truechaosHat = [ +[0x3CC878, 0], +[0x3CC87A, 0], +[0x3CC87C, 0], +[0x3CC87E, 0], +[0x3CC880, 0], +[0x3CC882, 0], +[0x3CC884, 0], +[0x3CC886, 0], +[0x3CC888, 0], +[0x3CC88A, 0], +[0x3CC88C, 0], +[0x3CC88E, 0], +[0x3CC890, 0], +[0x3CC892, 0], +[0x3CC8B8, 1], +[0x3CC8BA, 1], +[0x3CC8BC, 1], +[0x3CC8BE, 1], +[0x3CC8C0, 1], +[0x3CC8C2, 1], +[0x3CC8C4, 1], +[0x3CC8C6, 1], +[0x3CC8C8, 1], +[0x3CC8CA, 1], +[0x3CC8CC, 1], +[0x3CC8CE, 1], +[0x3CC8D0, 1], +[0x3CC8D2, 1], +[0x4F4CD0, 0], +[0x4F4CD2, 0], +[0x4F4CD4, 0], +[0x4F4CD6, 0], +[0x4F4CD8, 0], +[0x4F4CDA, 0], +[0x4F4CDC, 0], +[0x4F4CDE, 0], +[0x4F4CE0, 0], +[0x4F4CE2, 0], +[0x4F4CE4, 0], +[0x4F4CE6, 0], +[0x4F4CE8, 0], +[0x4F4CEA, 0], +[0x4F4D10, 1], +[0x4F4D12, 1], +[0x4F4D14, 1], +[0x4F4D16, 1], +[0x4F4D18, 1], +[0x4F4D1A, 1], +[0x4F4D1C, 1], +[0x4F4D1E, 1], +[0x4F4D20, 1], +[0x4F4D22, 1], +[0x4F4D24, 1], +[0x4F4D26, 1], +[0x4F4D28, 1], +[0x4F4D2A, 1], +[0x4F51D8, 1], +[0x4F51DA, 1], +[0x4F51DC, 0], +[0x4F51DE, 0], +[0x4F51E8, 0], +[0x4F51EA, 1], +[0x4FB684, 0], +[0x4FB686, 0], +[0x4FB688, 0], +[0x4FB6A4, 1], +[0x4FB6A6, 1], +[0x4FB6A8, 1], +[0x4FB692, 0], +[0x4FB6B2, 1], +[0x4FB786, 0], +[0x4FB788, 0], +[0x4FB78A, 0], +[0x4FB7A6, 1], +[0x4FB7A8, 1], +[0x4FB7AA, 1], +[0x519006, 0], +[0x519008, 0], +[0x51900C, 0], +[0x51900E, 0], +[0x519010, 0], +[0x519012, 0], +[0x519014, 0], +[0x519016, 0], +[0x519018, 0], +[0x51901A, 0], +[0x51901C, 0], +[0x51901E, 0], +[0x519020, 0], +[0x519022, 0], +[0x519026, 1], +[0x519028, 1], +[0x51902C, 1], +[0x51902E, 1], +[0x519030, 1], +[0x519032, 1], +[0x519034, 1], +[0x519036, 1], +[0x519038, 1], +[0x51903A, 1], +[0x51903C, 1], +[0x51903E, 1], +[0x519040, 1], +[0x519042, 1], +[0x5193D2, 0], +[0x5193D4, 0], +[0x5193D6, 0], +[0x5193D8, 0], +[0x5193DA, 0], +[0x5193DC, 0], +[0x5193DE, 0], +[0x5193E0, 0], +[0x5193E2, 0], +[0x5193E4, 0], +[0x5193E6, 0], +[0x5193E8, 0], +[0x5193EA, 0], +[0x5193EC, 0], +[0x5193F2, 1], +[0x5193F4, 1], +[0x5193F6, 1], +[0x5193F8, 1], +[0x5193FA, 1], +[0x5193FC, 1], +[0x5193FE, 1], +[0x519400, 1], +[0x519402, 1], +[0x519404, 1], +[0x519406, 1], +[0x519408, 1], +[0x51940A, 1], +[0x51940C, 1], +[0x3A7244, 0], +[0x3A724A, 0], +[0x3A724C, 1], +[0x3A724E, 0], +[0x3A7252, 0], +[0x3A7254, 1], +[0x3A7256, 0], +[0x3A7264, 1], +[0x3A726C, 1], +[0x3A7270, 1], +[0x3A7272, 1], +[0x3A7274, 1], +[0x3A7278, 1], +[0x3A727A, 1], +[0x3A727C, 1], +[0x3A7286, 0], +[0x3A7288, 0], +[0x3A728C, 0], +[0x3A7290, 0], +[0x3A7294, 0], +[0x3A7296, 0], +[0x3A72AE, 1], +[0x3A72B2, 1], +[0x3A72BC, 1], +[0x9F9A28, 0], +[0x9F9A2A, 0], +[0x9F9A2C, 0], +[0x9F9A2E, 1], +[0x9F9A30, 1], +[0x9F9A32, 1], +[0x9F9A34, 0], +[0x9F9A36, 0], +[0x9F9A38, 0], +[0x9F9A3A, 1], +[0x9F9A3C, 1], +[0x9F9A3E, 1], +[0x9F9A48, 0], +[0x9F9A4A, 0], +[0x9F9A4C, 0], +[0x9F9A4E, 1], +[0x9F9A50, 1], +[0x9F9A52, 1], +[0x9F9A56, 0], +[0x9F9A58, 0], +[0x9F9A5C, 1], +[0x9F9A5E, 1], +[0x9F9A26, 0], +[0x9F9A46, 1], +[0xA5DD32, 0], +[0xA5DD34, 0], +[0xA5DD38, 0], +[0xA5DD3A, 0], +[0xA5DD3C, 0], +[0xA5DD3E, 0], +[0xA5DD40, 0], +[0xA5DD42, 0], +[0xA5DD44, 0], +[0xA5DD46, 0], +[0xA5DD48, 0], +[0xA5DD4A, 0], +[0xA5DD4C, 0], +[0xA5DD4E, 0], +[0xA5DD52, 1], +[0xA5DD54, 1], +[0xA5DD58, 1], +[0xA5DD5A, 1], +[0xA5DD5C, 1], +[0xA5DD5E, 1], +[0xA5DD60, 1], +[0xA5DD62, 1], +[0xA5DD64, 1], +[0xA5DD66, 1], +[0xA5DD68, 1], +[0xA5DD6A, 1], +[0xA5DD6C, 1], +[0xA5DD6E, 1], +[0x3D0E08, 1], +[0x3D0E0A, 1], +[0x3D0E0C, 1], +[0x3D0E16, 0], +[0x3D0E18, 0], +[0x3D0E1A, 0], +[0x3CC9B8, 0], +[0x3CC9BA, 0], +[0x3CC9BC, 0], +[0x3CC9BE, 0], +[0x3CC9C0, 0], +[0x3CC9C2, 0], +[0x3CC9C4, 0], +[0x3CC9C6, 0], +[0x3CC9C8, 0], +[0x3CC9CA, 0], +[0x3CC9CC, 0], +[0x3CC9CE, 0], +[0x3CC9D0, 0], +[0x3CC9D2, 0], +[0x3CDE6E, 1], +[0x3CDE70, 1], +[0x3CDE72, 1], +[0x3CDE74, 1], +[0x3CDE76, 2], +[0x3CDE78, 2], +[0x3CDE7A, 2], +[0x3CDE7C, 1], +[0x3CDE7E, 1], +[0x3CDE80, 1], +[0x3CDE82, 1], +[0x3CDE84, 1], +[0x3CDE86, 1], +[0x3CDE88, 1], +[0x3CDE8A, 1], +[0x51AD1E, 0], +[0x51AD20, 0], +[0x51AD22, 0], +[0x51AD24, 0], +[0x51AD26, 0], +[0x51AD28, 0], +[0x51AD2A, 0], +[0x51AD2C, 0], +[0x51AD2E, 0], +[0x51AD30, 0], +[0x51AD32, 0], +[0x51AD34, 0], +[0x51AD36, 0], +[0x51AD38, 0], +[0x51AD3A, 0], +[0x51AD3E, 1], +[0x51AD40, 1], +[0x51AD42, 1], +[0x51AD44, 1], +[0x51AD46, 1], +[0x51AD48, 1], +[0x51AD4A, 1], +[0x51AD4C, 1], +[0x51AD4E, 1], +[0x51AD50, 1], +[0x51AD52, 1], +[0x51AD54, 1], +[0x51AD56, 1], +[0x51AD58, 1], +[0x51AD5A, 1], +[0x51A49E, 0], +[0x51A4A0, 0], +[0x51A4A2, 0], +[0x51A4A4, 0], +[0x51A4A6, 0], +[0x51A4A8, 0], +[0x51A4AA, 0], +[0x51A4AC, 0], +[0x51A4AE, 0], +[0x51A4B0, 0], +[0x51A4B2, 0], +[0x51A4B4, 0], +[0x51A4B6, 0], +[0x51A4B8, 0], +[0x51A4BA, 0], +[0x51A4BE, 1], +[0x51A4C0, 1], +[0x51A4C2, 1], +[0x51A4C4, 1], +[0x51A4C6, 1], +[0x51A4C8, 1], +[0x51A4CA, 1], +[0x51A4CC, 1], +[0x51A4CE, 1], +[0x51A4D0, 1], +[0x51A4D2, 1], +[0x51A4D4, 1], +[0x51A4D6, 1], +[0x51A4D8, 1], +[0x51A4DA, 1], +[0x51A97E, 0], +[0x51A980, 0], +[0x51A982, 0], +[0x51A984, 0], +[0x51A986, 0], +[0x51A988, 0], +[0x51A98A, 0], +[0x51A98C, 0], +[0x51A98E, 0], +[0x51A990, 0], +[0x51A992, 0], +[0x51A994, 0], +[0x51A996, 0], +[0x51A998, 0], +[0x51A99A, 0], +[0x51A95E, 1], +[0x51A960, 1], +[0x51A962, 1], +[0x51A964, 1], +[0x51A966, 1], +[0x51A968, 1], +[0x51A96A, 1], +[0x51A96C, 1], +[0x51A96E, 1], +[0x51A970, 1], +[0x51A972, 1], +[0x51A974, 1], +[0x51A976, 1], +[0x51A978, 1], +[0x51A97A, 1], +[0x51A9FE, 0], +[0x51AA00, 0], +[0x51AA02, 0], +[0x51AA0A, 0], +[0x51AA0E, 1], +[0x51AA10, 1], +[0x51AA12, 1], +[0x3CC976, 0], +[0x3CC978, 0], +[0x3CC97A, 0], +[0x3CC97C, 0], +[0x3CC97E, 0], +[0x3CC980, 0], +[0x3CC982, 0], +[0x3CC984, 0], +[0x3CC986, 0], +[0x3CC988, 0], +[0x3CC98A, 0], +[0x3CC98C, 0], +[0x3CC98E, 0], +[0x3CC990, 0], +[0x3CC992, 0], +[0x3D4B44, 0], +[0x3D4B46, 0], +[0x3D4B48, 0], +[0x3D4B4A, 0], +[0x3D4B4C, 0], +[0x3D4B4E, 0], +[0x3D4B50, 0], +[0x3D4B52, 0], +[0x3D4B54, 0], +[0x3D4B56, 0], +[0x3D4B58, 0], +[0x3D4B5A, 0], +[0x3D4B5C, 0], +[0x3D4B5E, 0], +[0x3D4B42, 0], +[0x3CCA38, 1], +[0x3CCA3A, 1], +[0x3CCA3C, 1], +[0x3CCA3E, 1], +[0x3CCA40, 1], +[0x3CCA42, 1], +[0x3CCA44, 1], +[0x3CCA46, 1], +[0x3CCA48, 1], +[0x3CCA4A, 1], +[0x3CCA4C, 1], +[0x3CCA4E, 1], +[0x3CCA50, 1], +[0x3CCA52, 1], +[0x3CCA36, 1], +[0x3CFB30, 0], +[0x3CFB32, 0], +[0x3CFB34, 0], +[0x3CFB36, 0], +[0x3CFB38, 0], +[0x3CFB3A, 0], +[0x3CFB3C, 0], +[0x3CFB3E, 0], +[0x3CFB40, 0], +[0x3CFB42, 0], +[0x3CFB44, 0], +[0x3CFB46, 0], +[0x3CFB48, 0], +[0x3CFB4A, 0], +[0x3CFB70, 1], +[0x3CFB72, 1], +[0x3CFB74, 1], +[0x3CFB76, 1], +[0x3CFB78, 1], +[0x3CFB7A, 1], +[0x3CFB7C, 1], +[0x3CFB7E, 1], +[0x3CFB80, 1], +[0x3CFB82, 1], +[0x3CFB84, 1], +[0x3CFB86, 1], +[0x3CFB88, 1], +[0x3CFB8A, 1], +[0x3D5044, 0], +[0x3D5046, 0], +[0x3D5048, 0], +[0x3D504A, 0], +[0x3D504C, 0], +[0x3D504E, 0], +[0x3D5050, 0], +[0x3D5052, 0], +[0x3D5054, 0], +[0x3D5056, 0], +[0x3D505C, 0], +[0x3D505E, 0], +[0x3D5084, 1], +[0x3D5086, 1], +[0x3D5088, 1], +[0x3D508A, 1], +[0x3D508C, 1], +[0x3D508E, 1], +[0x3D5090, 1], +[0x3D5092, 1], +[0x3D5094, 1], +[0x3D5096, 1], +[0x3D509C, 1], +[0x3D509E, 1], +[0xA5DDA2, 0], +[0xA5DDA4, 0], +[0xA5DDA6, 0], +[0xA5DDA8, 0], +[0xA5DDAE, 0], +[0xA5DDC2, 1], +[0xA5DDC4, 1], +[0xA5DDC6, 1], +[0xA5DDC8, 1], +[0xA5DDCE, 1], +[0x3D3E0C, 1], +[0x3D3E0E, 1], +[0x3D3E10, 0], +[0x3D3E12, 0], +[0x3CF1C0, 0], +[0x3CF1C2, 0], +[0x3CF200, 1], +[0x3CF202, 1], +[0x3D3604, 0], +[0x3D3606, 1], +[0x3D360A, 1], +[0x3D360C, 1], +[0x3D360E, 1], +[0x3D3610, 0], +[0x3D3612, 0], +[0x3D3614, 0], +[0x3D1A42, 0], +[0x3D1A44, 0], +[0x3D1A46, 0], +[0x3D1A48, 0], +[0x3D1A4A, 0], +[0x3D1A82, 1], +[0x3D1A84, 1], +[0x3D1A86, 1], +[0x3D1A88, 1], +[0x3D1A8A, 1], +[0x3CE280, 0], +[0x3CE282, 0], +[0x3CE2C0, 1], +[0x3CE2C2, 1], +[0x4FA29C, 0], +[0x4FA29E, 0], +[0x4FA2DC, 1], +[0x4FA2DE, 1], +[0x8D3C5E, 0], +[0x8D3C60, 0], +[0x8D3C62, 0], +[0x8D3C64, 0], +[0x8D3B9C, 0], +[0x8D3BA0, 0], +[0x8D3B9E, 0], +[0x3D4C02, 0], +[0x3D4C0C, 0], +[0x3D4C0E, 0], +[0x3D4C10, 0], +[0x3D4C12, 0], +[0x3D4C14, 0], +[0x3D2D96, 0], +[0x3D2D98, 0], +[0x3D2D9A, 0], +[0x3D2D9C, 0], +[0x8CC272, 1], +[0x8CC274, 1], +[0x8CC276, 1], +[0x8CC278, 1], +[0x8CC27A, 1], +[0x8CC27C, 1], +[0x3D4784, 0], +[0x3D4786, 1], +[0x3D4788, 1], +[0x3D478A, 1], +[0x3D478C, 0], +[0x3D478E, 0], +[0x3D4790, 0], +[0x3D4792, 0], +[0x3D4794, 0], +[0x8CF4B2, 1], +[0x8CF4B4, 1], +[0x8CF4B6, 1], +[0x8CF4B8, 1], +[0x8CF4BA, 1], +[0x8CF4BC, 1], +[0x8CF7B2, 1], +[0x8CF7B4, 1], +[0x8CF7B6, 1], +[0x8CF7B8, 1], +[0x8CF7BA, 1], +[0x8CF7BC, 1], +[0x8D2D52, 1], +[0x8D2D54, 1], +[0x8D2D56, 1], +[0x8D2D58, 1], +[0x8D2D5A, 1], +[0x8D2D5C, 1], +[0x8D0096, 1], +[0x8D0A16, 1], +[0x8D006E, 1], +[0x8D0070, 1], +[0x8D09AE, 1], +[0x8D09B0, 1], +[0x3CE8F6, 1], +[0x3CE8F8, 1], +[0x3CE8FA, 1], +[0x8D0952, 1], +[0x8D0954, 1], +[0x8D0956, 1], +[0x8D0958, 1], +[0x8D095A, 1], +[0x8D095C, 1], +[0x3CE976, 1], +[0x3CE978, 1], +[0x3CE97A, 1], +[0x4F8912, 1], +[0x4F8914, 1], +[0x4F8916, 1], +[0x8D0456, 0], +[0x8D09F6, 0], +[0x8D042E, 0], +[0x8D0430, 0], +[0x8D09CE, 0], +[0x8D09D0, 0], +[0x3CE8B6, 0], +[0x3CE8B8, 0], +[0x3CE8BA, 0], +[0x8D0890, 0], +[0x8D0892, 0], +[0x8D0894, 0], +[0x8D0896, 0], +[0x3CE932, 0], +[0x3CE936, 0], +[0x3CE938, 0], +[0x3CE93A, 0], +[0x3CE940, 0], +[0x4F88CE, 0], +[0x4F88D2, 0], +[0x4F88D4, 0], +[0x4F88D6, 0], +[0x4F88DC, 0], +[0x8D095E, 0], +[0x8D0960, 0], +[0x8D0962, 0], +[0x8D0964, 0], +[0x3D2104, 0], +[0x3D210E, 0], +[0x3D2110, 0], +[0x3D2118, 0], +[0x3D211A, 0], +[0x8D0052, 1], +[0x8D0054, 1], +[0x8D0056, 1], +[0x8D0058, 1], +[0x8D005A, 1], +[0x8D005C, 1], +[0x8D005E, 0], +[0x8D0060, 0], +[0x8D0062, 0], +[0x8D0064, 0], +[0x3C9E36, 1], +[0x3C9E38, 1], +[0x3C9E3A, 1], +[0x3C9E3C, 0], +[0x3C9E3E, 0], +[0x3C9E40, 0], +[0x4F4D50, 0], +[0x4F4D52, 0], +[0x4F4D54, 0], +[0x4F4D56, 0], +[0x4F4D58, 0], +[0x4F4D5A, 0], +[0x4F4D5C, 0], +[0x4F4D5E, 0], +[0x4F4D60, 0], +[0x4F4D62, 0], +[0x4F4D64, 0], +[0x4F4D66, 0], +[0x4F4D68, 0], +[0x4F4D6A, 0], +[0x3C9314, 0], +[0x3C9316, 0], +[0x3C9318, 0], +[0x3C931A, 0], +[0x3C931C, 0], +[0x3C931E, 0], +[0x3C9320, 0], +[0x3C9322, 0], +[0x3C9324, 0], +[0x3C9326, 0], +[0x3C9328, 0], +[0x3C932A, 0], +[0x3C932C, 0], +[0x3C932E, 0], +[0x9F9CEA, 0], +[0x9F9CEC, 0], +[0x9F9CEE, 0], +[0x9F9CF0, 0], +[0x9F9CF2, 0], +[0x9F9CF4, 0], +[0x9F9CF6, 0], +[0x9F9CF8, 0], +[0x9F9CFA, 0], +[0x9F9CFC, 0], +[0x9F9CFE, 0], +[0x9F9D00, 0], +[0x9F9D02, 0], +[0x9F9D04, 0], +[0x4F4E10, 1], +[0x4F4E12, 1], +[0x4F4E14, 1], +[0x4F4E16, 1], +[0x4F4E18, 1], +[0x4F4E1A, 1], +[0x4F4E1C, 1], +[0x4F4E1E, 1], +[0x4F4E20, 1], +[0x4F4E22, 1], +[0x4F4E24, 1], +[0x4F4E26, 1], +[0x4F4E28, 1], +[0x4F4E2A, 1], +[0x3C9444, 1], +[0x3C9446, 1], +[0x3C9448, 1], +[0x3C944A, 1], +[0x3C944C, 1], +[0x3C944E, 1], +[0x3C9450, 1], +[0x3C9452, 1], +[0x3C9454, 1], +[0x3C9456, 1], +[0x3C9458, 1], +[0x3C945A, 1], +[0x3C945C, 1], +[0x3C945E, 1], +[0x9F9D68, 1], +[0x9F9D6A, 1], +[0x9F9D6C, 1], +[0x9F9D6E, 1], +[0x9F9D70, 1], +[0x9F9D72, 1], +[0x9F9D74, 1], +[0x9F9D76, 1], +[0x9F9D78, 1], +[0x9F9D7A, 1], +[0x9F9D7C, 1], +[0x9F9D7E, 1], +[0x9F9D80, 1], +[0x9F9D82, 1], +[0x518E12, 0], +[0x518E10, 0], +[0x518E1A, 0], +[0x518E18, 0], +[0xA6202E, 0], +[0xA62030, 0], +[0xA62032, 0], +[0xA62034, 0], +[0xA6203A, 0], +[0xA6204E, 1], +[0xA62050, 1], +[0xA62052, 1], +[0xA62054, 1], +[0xA6205A, 1], +[0x3D4804, 0], +[0x3D4806, 0], +[0x3D4808, 0], +[0x3D480A, 0], +[0x3D4810, 0], +[0x3D4812, 0], +[0x3D480C, 1], +[0x3D480E, 1], +[0x8D049E, 0], +[0x8D04A0, 0], +[0x8D04A2, 0], +[0x8D0592, 1], +[0x8D0594, 1], +[0x8D0596, 1], +[0x8D0598, 1], +[0x8D059A, 1], +[0x8D059C, 1], +[0x4F5010, 0], +[0x4F5012, 0], +[0x4F5014, 0], +[0x4F5016, 0], +[0x4F4ECE, 0], +[0x4F4ED0, 0], +[0x4F4ED2, 0], +[0x4F4ED4, 0], +[0x4F4ED6, 0], +[0x4F4ED8, 0], +[0x4F4EDA, 1], +[0x4F4EDC, 1], +[0x4F4EDE, 1], +[0x4F4EE0, 1], +[0x4F4EE2, 1], +[0x3CC9F8, 0], +[0x3CC9FA, 0], +[0x3CC9FC, 0], +[0x3CC9FE, 0], +[0x3CCA00, 0], +[0x3CCA02, 0], +[0x3CCA0A, 0], +[0x3CCA0C, 0], +[0x3CCA0E, 0], +[0x3CCA10, 0], +[0x3CCA12, 0], +[0x8CBE1E, 0], +[0x8CBE20, 0], +[0x8CBE22, 0], +[0x8CBE3E, 1], +[0x8CBE40, 1], +[0x8CBE42, 1], +[0x8CBEDE, 0], +[0x8CBEE0, 0], +[0x8CBED4, 0], +[0x8CBEE2, 0], +[0x8CBECA, 0], +[0x3B8F38, 1], +[0x3B8F3A, 1], +[0x3B8F40, 0], +[0x3B8F42, 0], +[0x3D1090, 0], +[0x3D1092, 0], +[0x3D1094, 0], +[0x3D1096, 0], +[0x3D1098, 0], +[0x3D109A, 0], +[0x3D109C, 0], +[0x3D109E, 0], +[0x3D1082, 0], +[0x3D1084, 0], +[0x3D1086, 0], +[0x3D10C2, 1], +[0x3D10C4, 1], +[0x3D10C6, 1], +[0x3D10D0, 1], +[0x3D10D2, 1], +[0x3D10D4, 1], +[0x3D10D6, 1], +[0x3D10D8, 1], +[0x3D10DA, 1], +[0x3D10DC, 1], +[0x3D10DE, 1], +[0x3D14C2, 0], +[0x3D14C4, 0], +[0x3D14C6, 0], +[0x3D14C8, 0], +[0x3D14CA, 0], +[0x3D14CC, 0], +[0x3D14CE, 0], +[0x3D14D0, 0], +[0x3D14D2, 0], +[0x3D14D4, 0], +[0x3D14D6, 0], +[0x3D1502, 1], +[0x3D1504, 1], +[0x3D1506, 1], +[0x3D1508, 1], +[0x3D150A, 1], +[0x3D150C, 1], +[0x3D150E, 1], +[0x3D1510, 1], +[0x3D1512, 1], +[0x3D1514, 1], +[0x3D1516, 1], +[0x3CE0F0, 1], +[0x3CE0F2, 1], +[0x3CE0F4, 1], +[0x3CE0D0, 0], +[0x3CE0D2, 0], +[0x3CE0D4, 0], +[0x8D3DAC, 0], +[0x8D3DBC, 0], +[0x8D3DB4, 0], +[0x8D3D86, 0], +[0x8D3DBA, 0], +[0x8D3DB8, 0]] + +whiteHat = [ +[0x3CC884, 0xFF, 0x7F, 0], +[0x3CC886, 0x7B, 0x6F, 0], +[0x3CC8C4, 0xFF, 0x7F, 1], +[0x3CC8C6, 0x7B, 0x6F, 1], +[0x4F4CDC, 0xFF, 0x7F, 0], +[0x4F4CDE, 0x7B, 0x6F, 0], +[0x4F4D1C, 0xFF, 0x7F, 1], +[0x4F4D1E, 0x7B, 0x6F, 1], +[0x4F51D8, 0xFF, 0x7F, 1], +[0x4F51DC, 0xFF, 0x7F, 0], +[0x4F51E8, 0x7B, 0x6F, 0], +[0x4F51EA, 0x7B, 0x6F, 1], +[0x4F51DA, 0x9C, 0x73, 1], +[0x4F51DE, 0x9C, 0x73, 0], +[0x4FB686, 0xFF, 0x7F, 0], +[0x4FB6A6, 0xFF, 0x7F, 1], +[0x4FB684, 0x73, 0x4E, 0], +[0x4FB6A4, 0x73, 0x4E, 1], +[0x4FB688, 0x7B, 0x6F, 0], +[0x4FB6A8, 0x7B, 0x6F, 1], +[0x4FB786, 0x73, 0x4E, 0], +[0x4FB788, 0xFF, 0x7F, 0], +[0x4FB78A, 0xFF, 0x7F, 0], +[0x4FB7A6, 0x73, 0x4E, 1], +[0x4FB7A8, 0xFF, 0x7F, 1], +[0x4FB7AA, 0xFF, 0x7F, 1], +[0x51901C, 0xFF, 0x7F, 0], +[0x519018, 0x73, 0x4E, 0], +[0x51901A, 0x7B, 0x6F, 0], +[0x51903C, 0xFF, 0x7F, 1], +[0x519038, 0x73, 0x4E, 1], +[0x51903A, 0x7B, 0x6F, 1], +[0x5193EA, 0x7B, 0x6F, 0], +[0x5193E8, 0xFF, 0x7F, 0], +[0x51940A, 0x7B, 0x6F, 1], +[0x519408, 0xFF, 0x7F, 1], +[0x3A72AE, 0xF7, 0x5E, 1], +[0x3A7244, 0xF7, 0x5E, 0], +[0x3A724C, 0x39, 0x67, 1], +[0x3A7290, 0x18, 0x63, 0], +[0x3A72B2, 0x18, 0x63, 1], +[0x3A7270, 0xB5, 0x56, 1], +[0x3A7288, 0xB5, 0x56, 0], +[0x3A7296, 0x5A, 0x6B, 0], +[0x3A7274, 0x5A, 0x6B, 1], +[0x3A7294, 0x39, 0x67, 0], +[0x3A724A, 0x7B, 0x6F, 0], +[0x3A7278, 0x7B, 0x6F, 1], +[0x3A724E, 0x9C, 0x73, 0], +[0x3A727A, 0x9C, 0x73, 1], +[0x3A7252, 0xBD, 0x77, 0], +[0x3A727C, 0xBD, 0x77, 1], +[0x3A72BC, 0xBD, 0x77, 1], +[0x3A726C, 0x94, 0x52, 1], +[0x3A7286, 0x94, 0x52, 0], +[0x3A728C, 0xD6, 0x5A, 0], +[0x3A7272, 0xD6, 0x5A, 1], +[0x3A7254, 0xFF, 0x7F, 1], +[0x3A7256, 0xFF, 0x7F, 0], +[0x3A7264, 0xFF, 0x7F, 1], +[0x9F9A58, 0x7B, 0x6F, 0], +[0x9F9A5E, 0x7B, 0x6F, 1], +[0x9F9A2A, 0x9C, 0x73, 0], +[0x9F9A30, 0x9C, 0x73, 1], +[0x9F9A36, 0x9C, 0x73, 0], +[0x9F9A3C, 0x9C, 0x73, 1], +[0x9F9A4A, 0x9C, 0x73, 0], +[0x9F9A50, 0x9C, 0x73, 1], +[0x9F9A56, 0xF7, 0x5E, 0], +[0x9F9A5C, 0xF7, 0x5E, 1], +[0x9F9A28, 0x73, 0x4E, 0], +[0x9F9A2E, 0x73, 0x4E, 1], +[0x9F9A48, 0x73, 0x4E, 0], +[0x9F9A4E, 0x73, 0x4E, 1], +[0x9F9A34, 0x73, 0x4E, 0], +[0x9F9A3A, 0x9C, 0x73, 1], +[0x9F9A2C, 0xFF, 0x7F, 0], +[0x9F9A32, 0xFF, 0x7F, 1], +[0x9F9A38, 0xFF, 0x7F, 0], +[0x9F9A3E, 0xFF, 0x7F, 1], +[0x9F9A4C, 0xFF, 0x7F, 0], +[0x9F9A52, 0xFF, 0x7F, 1], +[0xA5DD46, 0xF7, 0x5E, 0], +[0xA5DD44, 0x94, 0x52, 0], +[0xA5DD4A, 0x9C, 0x73, 0], +[0xA5DD3E, 0x31, 0x46, 0], +[0xA5DD40, 0xDE, 0x7B, 0], +[0xA5DD42, 0xFF, 0x7F, 0], +[0xA5DD48, 0x5A, 0x6B, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0xF7, 0x5E, 1], +[0xA5DD64, 0x94, 0x52, 1], +[0xA5DD6A, 0x9C, 0x73, 1], +[0xA5DD5E, 0x31, 0x46, 1], +[0xA5DD60, 0xDE, 0x7B, 1], +[0xA5DD62, 0xFF, 0x7F, 1], +[0xA5DD68, 0x5A, 0x6B, 1], +[0x3D0E0C, 0xFF, 0x7F, 1], +[0x3D0E18, 0xFF, 0x7F, 0], +[0x3D0E0A, 0x7B, 0x6F, 1], +[0x3D0E1A, 0x7B, 0x6F, 0], +[0x3D0E08, 0xFF, 0x7F, 1], +[0x3D0E16, 0xFF, 0x7F, 0], +[0x3CC9C4, 0xFF, 0x7F, 0], +[0x3CC9C6, 0x7B, 0x6F, 0], +[0x3CDE7C, 0xFF, 0x7F, 1], +[0x3CDE7E, 0x7B, 0x6F, 1], +[0x51AD2C, 0xFF, 0x7F, 0], +[0x51AD2E, 0x7B, 0x6F, 0], +[0x51AD4C, 0xFF, 0x7F, 1], +[0x51AD4E, 0x7B, 0x6F, 1], +[0x51A4AE, 0x7B, 0x6F, 0], +[0x51A4AC, 0xFF, 0x7F, 0], +[0x51A4CC, 0xFF, 0x7F, 1], +[0x51A4CE, 0x7B, 0x6F, 1], +[0x51A98C, 0xFF, 0x7F, 0], +[0x51A98E, 0x7B, 0x6F, 0], +[0x51A96C, 0xFF, 0x7F, 1], +[0x51A96E, 0x7B, 0x6F, 1], +[0x51AA00, 0x9C, 0x73, 0], +[0x51AA10, 0x9C, 0x73, 1], +[0x51AA02, 0xD6, 0x5A, 0], +[0x51AA12, 0xD6, 0x5A, 1], +[0x51A9FE, 0xFF, 0x7F, 0], +[0x51AA0E, 0xFF, 0x7F, 1], +[0x51AA0A, 0xFF, 0x7F, 0], +[0x3CC984, 0xFF, 0x7F, 0], +[0x3CC986, 0x7B, 0x6F, 0], +[0x3D4B52, 0xFF, 0x7F, 0], +[0x3D4B5C, 0xD6, 0x5A, 0], +[0x3D4B54, 0xFF, 0x7F, 0], +[0x3D4B56, 0x7B, 0x6F, 0], +[0x3D4B50, 0xFF, 0x7F, 0], +[0x3CCA44, 0xFF, 0x7F, 1], +[0x3CCA46, 0x7B, 0x6F, 1], +[0x3CFB3C, 0xFF, 0x7F, 0], +[0x3CFB3E, 0x7B, 0x6F, 0], +[0x3CFB7C, 0xFF, 0x7F, 1], +[0x3CFB7E, 0x7B, 0x6F, 1], +[0x3D504C, 0xBD, 0x77, 0], +[0x3D504A, 0xFF, 0x7F, 0], +[0x3D504E, 0x7B, 0x6F, 0], +[0x3D508C, 0xBD, 0x77, 1], +[0x3D508A, 0xFF, 0x7F, 1], +[0x3D508E, 0x7B, 0x6F, 1], +[0xA5DDA2, 0xF7, 0x5E, 0], +[0xA5DDC2, 0xF7, 0x5E, 1], +[0xA5DDA6, 0x9C, 0x73, 0], +[0xA5DDC6, 0x9C, 0x73, 1], +[0xA5DDA4, 0x5A, 0x6B, 0], +[0xA5DDC4, 0x5A, 0x6B, 1], +[0xA5DDA8, 0xFF, 0x7F, 0], +[0xA5DDC8, 0xFF, 0x7F, 1], +[0x3D3E0C, 0xFF, 0x7F, 1], +[0x3D3E10, 0xFF, 0x7F, 0], +[0x3D3E0E, 0x7B, 0x6F, 1], +[0x3D3E12, 0x7B, 0x6F, 0], +[0x3CF1C0, 0xFF, 0x7F, 0], +[0x3CF200, 0xFF, 0x7F, 1], +[0x3CF1C2, 0x7B, 0x6F, 0], +[0x3CF202, 0x7B, 0x6F, 1], +[0x3D360E, 0x39, 0x67, 1], +[0x3D3614, 0x39, 0x67, 0], +[0x3D360C, 0x9C, 0x73, 1], +[0x3D3612, 0x9C, 0x73, 0], +[0x3D3604, 0x5A, 0x6B, 0], +[0x3D3606, 0x5A, 0x6B, 1], +[0x3D360A, 0xFF, 0x7F, 1], +[0x3D3610, 0xFF, 0x7F, 0], +[0x3D1A48, 0xD6, 0x5A, 0], +[0x3D1A46, 0xFF, 0x7F, 0], +[0x3D1A44, 0xFF, 0x7F, 0], +[0x3D1A4A, 0x5A, 0x6B, 0], +[0x3D1A88, 0xD6, 0x5A, 1], +[0x3D1A8A, 0xFF, 0xF4, 1], +[0x3D1A86, 0xFF, 0x7F, 1], +[0x3D1A84, 0xFF, 0x7F, 1], +[0x3CE282, 0x7B, 0x6F, 0], +[0x3CE2C2, 0x7B, 0x6F, 1], +[0x3CE280, 0xFF, 0x7F, 0], +[0x3CE2C0, 0xFF, 0x7F, 1], +[0x4FA29E, 0x7B, 0x6F, 0], +[0x4FA2DE, 0x7B, 0x6F, 1], +[0x4FA29C, 0xFF, 0x7F, 0], +[0x4FA2DC, 0xFF, 0x7F, 1], +[0x3D4786, 0xFF, 0x7F, 1], +[0x3D478C, 0xFF, 0x7F, 0], +[0x3D478E, 0x18, 0x63, 0], +[0x3D4788, 0x18, 0x63, 1], +[0x3D4790, 0x18, 0x63, 0], +[0x3D478A, 0xBD, 0x77, 1], +[0x3D4794, 0x5A, 0x6B, 0], +[0x3D4792, 0xBD, 0x77, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0xFF, 0x7F, 1], +[0x3C9E40, 0xFF, 0x7F, 0], +[0x3C9E38, 0xFF, 0x7F, 1], +[0x3C9E3E, 0xFF, 0x7F, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0xFF, 0x7F, 0], +[0x4F4D5E, 0x7B, 0x6F, 0], +[0x3C9320, 0xFF, 0x7F, 0], +[0x3C9322, 0x7B, 0x6F, 0], +[0x9F9CF6, 0xFF, 0x7F, 0], +[0x9F9CF8, 0x7B, 0x6F, 0], +[0x4F4E1C, 0xFF, 0x7F, 1], +[0x4F4E1E, 0x7B, 0x6F, 1], +[0x3C9450, 0xFF, 0x7F, 1], +[0x3C9452, 0x7B, 0x6F, 1], +[0x9F9D74, 0xFF, 0x7F, 1], +[0x9F9D76, 0x7B, 0x6F, 1], +[0xA6202E, 0xF7, 0x5E, 0], +[0xA62032, 0x9C, 0x73, 0], +[0xA62030, 0x5A, 0x6B, 0], +[0xA62034, 0xFF, 0x7F, 0], +[0xA6204E, 0xF7, 0x5E, 1], +[0xA62052, 0x9C, 0x73, 1], +[0xA62050, 0x5A, 0x6B, 1], +[0xA62054, 0xFF, 0x7F, 1], +[0x3D4812, 0x39, 0x67, 0], +[0x3D480E, 0x39, 0x67, 1], +[0x3D4810, 0xFF, 0x7F, 0], +[0x3D480C, 0xFF, 0x7F, 1], +[0x3CC9FE, 0xFF, 0x7F, 0], +[0x3CCA0A, 0x7B, 0x6F, 0], +[0x8CBE20, 0xD6, 0x5A, 0], +[0x8CBE22, 0x7B, 0x6F, 0], +[0x8CBE1E, 0xFF, 0x7F, 0], +[0x8CBE40, 0xD6, 0x5A, 1], +[0x8CBE42, 0x7B, 0x6F, 1], +[0x8CBE3E, 0xFF, 0x7F, 1], +[0x8CBEE0, 0xFF, 0x7F, 0], +[0x8CBEDE, 0xFF, 0x7F, 0], +[0x8CBEE2, 0x7B, 0x6F, 0], +[0x3B8F38, 0xD6, 0x5A, 1], +[0x3B8F3A, 0xFF, 0x7F, 1], +[0x3B8F40, 0xD6, 0x5A, 0], +[0x3B8F42, 0xFF, 0x7F, 0], +[0x3D1094, 0x18, 0x63, 0], +[0x3D109A, 0x94, 0x52, 0], +[0x3D1098, 0x73, 0x4E, 0], +[0x3D1096, 0x7B, 0x6F, 0], +[0x3D1092, 0xFF, 0x7F, 0], +[0x3D1090, 0xFF, 0x7F, 0], +[0x3D10D4, 0x18, 0x63, 1], +[0x3D10DA, 0x94, 0x52, 1], +[0x3D10D8, 0x73, 0x4E, 1], +[0x3D10D6, 0x7B, 0x6F, 1], +[0x3D10D2, 0xFF, 0x7F, 1], +[0x3D10D0, 0xFF, 0x7F, 1], +[0x3D14D0, 0xFF, 0x7F, 0], +[0x3D14D2, 0x7B, 0x6F, 0], +[0x3D14CE, 0xFF, 0x7F, 0], +[0x3D14CC, 0x7B, 0x6F, 0], +[0x3D1510, 0x39, 0x67, 1], +[0x3D1512, 0x7B, 0x6F, 1], +[0x3D150E, 0xFF, 0x7F, 1], +[0x3D150C, 0x7B, 0x6F, 1], +[0x3CE0F4, 0xF7, 0x5E, 1], +[0x3CE0F2, 0x9C, 0x73, 1], +[0x3CE0F0, 0x7B, 0x6F, 1], +[0x3CE0D4, 0xF7, 0x5E, 0], +[0x3CE0D2, 0x9C, 0x73, 0], +[0x3CE0D0, 0x7B, 0x6F, 0]] + +yellowHat = [ +[0x3CC884, 0xFF, 0x07, 0], +[0x3CC886, 0xF7, 0x02, 0], +[0x3CC8C4, 0xFF, 0x07, 1], +[0x3CC8C6, 0xF7, 0x02, 1], +[0x4F4CDC, 0xFF, 0x07, 0], +[0x4F4CDE, 0xF7, 0x02, 0], +[0x4F4D1C, 0xFF, 0x07, 1], +[0x4F4D1E, 0xF7, 0x02, 1], +[0x4F51D8, 0xFF, 0x07, 1], +[0x4F51DC, 0xFF, 0x07, 0], +[0x4F51E8, 0xDE, 0x27, 0], +[0x4F51EA, 0xDE, 0x27, 1], +[0x4F51DA, 0xFF, 0x4F, 1], +[0x4F51DE, 0xFF, 0x4F, 0], +[0x4FB686, 0xFF, 0x07, 0], +[0x4FB6A6, 0xFF, 0x07, 1], +[0x4FB684, 0xCE, 0x01, 0], +[0x4FB6A4, 0xCE, 0x01, 1], +[0x4FB688, 0xFF, 0x4F, 0], +[0x4FB6A8, 0xFF, 0x4F, 1], +[0x4FB786, 0x39, 0x03, 0], +[0x4FB788, 0xFF, 0x07, 0], +[0x4FB78A, 0xFF, 0x63, 0], +[0x4FB7A6, 0x39, 0x03, 1], +[0x4FB7A8, 0xFF, 0x07, 1], +[0x4FB7AA, 0xFF, 0x63, 1], +[0x51901C, 0xFF, 0x07, 0], +[0x519018, 0xF7, 0x01, 0], +[0x51901A, 0xF7, 0x02, 0], +[0x51903C, 0xFF, 0x07, 1], +[0x519038, 0xF7, 0x01, 1], +[0x51903A, 0xF7, 0x02, 1], +[0x5193EA, 0xF7, 0x02, 0], +[0x5193E8, 0xFF, 0x07, 0], +[0x51940A, 0xF7, 0x02, 1], +[0x519408, 0xFF, 0x07, 1], +[0x3A72AE, 0x39, 0x13, 1], +[0x3A7244, 0x39, 0x13, 0], +[0x3A724C, 0x5A, 0x17, 1], +[0x3A7290, 0x5A, 0x17, 0], +[0x3A72B2, 0x7B, 0x13, 1], +[0x3A7270, 0x73, 0x0E, 1], +[0x3A7288, 0x73, 0x0E, 0], +[0x3A7296, 0x9C, 0x17, 0], +[0x3A7274, 0x9C, 0x17, 1], +[0x3A7294, 0x7B, 0x13, 0], +[0x3A724A, 0xBD, 0x17, 0], +[0x3A7278, 0xBD, 0x17, 1], +[0x3A724E, 0xDE, 0x17, 0], +[0x3A727A, 0xDE, 0x17, 1], +[0x3A7252, 0xFF, 0x1B, 0], +[0x3A727C, 0xFF, 0x1B, 1], +[0x3A72BC, 0xFF, 0x1B, 1], +[0x3A726C, 0x31, 0x02, 1], +[0x3A7286, 0x31, 0x02, 0], +[0x3A728C, 0x18, 0x13, 0], +[0x3A7272, 0xB5, 0x12, 1], +[0x3A7254, 0xFF, 0x3B, 1], +[0x3A7256, 0xFF, 0x3B, 0], +[0x3A7264, 0xFF, 0x3B, 1], +[0x9F9A58, 0xD6, 0x3A, 0], +[0x9F9A5E, 0xD6, 0x3A, 1], +[0x9F9A2A, 0xFF, 0x07, 0], +[0x9F9A30, 0xFF, 0x07, 1], +[0x9F9A36, 0xFF, 0x07, 0], +[0x9F9A3C, 0xFF, 0x07, 1], +[0x9F9A4A, 0xFF, 0x07, 0], +[0x9F9A50, 0xFF, 0x07, 1], +[0x9F9A56, 0x94, 0x02, 0], +[0x9F9A5C, 0x94, 0x02, 1], +[0x9F9A28, 0xCE, 0x01, 0], +[0x9F9A2E, 0xCE, 0x01, 1], +[0x9F9A48, 0xCE, 0x01, 0], +[0x9F9A4E, 0xCE, 0x01, 1], +[0x9F9A34, 0x70, 0x07, 0], +[0x9F9A3A, 0x70, 0x07, 1], +[0x9F9A2C, 0xFF, 0x4F, 0], +[0x9F9A32, 0xFF, 0x4F, 1], +[0x9F9A38, 0xFF, 0x4F, 0], +[0x9F9A3E, 0xFF, 0x4F, 1], +[0x9F9A4C, 0xFF, 0x4F, 0], +[0x9F9A52, 0xFF, 0x4F, 1], +[0xA5DD46, 0x94, 0x12, 0], +[0xA5DD44, 0xEF, 0x0D, 0], +[0xA5DD4A, 0xBD, 0x1B, 0], +[0xA5DD3E, 0xF7, 0x32, 0], +[0xA5DD40, 0xBD, 0x3F, 0], +[0xA5DD42, 0xFF, 0x57, 0], +[0xA5DD48, 0x39, 0x1B, 0], +[0xA5DD4E, 0xFF, 0x7F, 0], +[0xA5DD66, 0x94, 0x12, 1], +[0xA5DD64, 0xEF, 0x0D, 1], +[0xA5DD6A, 0xBD, 0x1B, 1], +[0xA5DD5E, 0xF7, 0x32, 1], +[0xA5DD60, 0xFF, 0x43, 1], +[0xA5DD62, 0xFF, 0x57, 1], +[0xA5DD68, 0x39, 0x1B, 1], +[0x3D0E0C, 0xFF, 0x07, 1], +[0x3D0E18, 0xFF, 0x07, 0], +[0x3D0E0A, 0xF7, 0x02, 1], +[0x3D0E1A, 0xF7, 0x02, 0], +[0x3D0E08, 0xFF, 0x4F, 1], +[0x3D0E16, 0xFF, 0x4F, 0], +[0x3CC9C4, 0xFF, 0x07, 0], +[0x3CC9C6, 0xF7, 0x02, 0], +[0x3CDE7C, 0xFF, 0x07, 1], +[0x3CDE7E, 0xF7, 0x02, 1], +[0x51AD2C, 0xFF, 0x07, 0], +[0x51AD2E, 0xF7, 0x02, 0], +[0x51AD4C, 0xFF, 0x07, 1], +[0x51AD4E, 0xF7, 0x02, 1], +[0x51A4AE, 0xF7, 0x02, 0], +[0x51A4AC, 0xFF, 0x07, 0], +[0x51A4CC, 0xFF, 0x07, 1], +[0x51A4CE, 0xF7, 0x02, 1], +[0x51A98C, 0xFF, 0x07, 0], +[0x51A98E, 0xF7, 0x02, 0], +[0x51A96C, 0xFF, 0x07, 1], +[0x51A96E, 0xF7, 0x02, 1], +[0x51AA00, 0x9C, 0x07, 0], +[0x51AA10, 0x9C, 0x07, 1], +[0x51AA02, 0xF7, 0x02, 0], +[0x51AA12, 0xF7, 0x02, 1], +[0x51A9FE, 0xFF, 0x07, 0], +[0x51AA0E, 0xFF, 0x07, 1], +[0x51AA0A, 0xFF, 0x3B, 0], +[0x3CC984, 0xFF, 0x07, 0], +[0x3CC986, 0xF7, 0x02, 0], +[0x3D4B52, 0x7B, 0x07, 0], +[0x3D4B5C, 0x94, 0x02, 0], +[0x3D4B54, 0xFF, 0x07, 0], +[0x3D4B56, 0xF7, 0x02, 0], +[0x3D4B50, 0xFF, 0x4F, 0], +[0x3CCA44, 0xFF, 0x07, 1], +[0x3CCA46, 0xF7, 0x02, 1], +[0x3CFB3C, 0xFF, 0x07, 0], +[0x3CFB3E, 0xF7, 0x02, 0], +[0x3CFB7C, 0xFF, 0x07, 1], +[0x3CFB7E, 0xF7, 0x02, 1], +[0x3D504C, 0x7B, 0x07, 0], +[0x3D504A, 0xFF, 0x07, 0], +[0x3D504E, 0xF7, 0x02, 0], +[0x3D508C, 0x7B, 0x07, 1], +[0x3D508A, 0xFF, 0x07, 1], +[0x3D508E, 0xF7, 0x02, 1], +[0xA5DDA2, 0x94, 0x12, 0], +[0xA5DDC2, 0x94, 0x12, 1], +[0xA5DDA6, 0xBD, 0x1B, 0], +[0xA5DDC6, 0xBD, 0x1B, 1], +[0xA5DDA4, 0x39, 0x1B, 0], +[0xA5DDC4, 0x39, 0x1B, 1], +[0xA5DDA8, 0xFF, 0x4F, 0], +[0xA5DDC8, 0xFF, 0x4F, 1], +[0x3D3E0C, 0xFF, 0x07, 1], +[0x3D3E10, 0xFF, 0x07, 0], +[0x3D3E0E, 0xF7, 0x02, 1], +[0x3D3E12, 0xF7, 0x02, 0], +[0x3CF1C0, 0xFF, 0x07, 0], +[0x3CF200, 0xFF, 0x07, 1], +[0x3CF1C2, 0xF7, 0x02, 0], +[0x3CF202, 0xF7, 0x02, 1], +[0x3D360E, 0x5A, 0x17, 1], +[0x3D3614, 0x5A, 0x17, 0], +[0x3D360C, 0xFF, 0x4F, 1], +[0x3D3612, 0xFF, 0x4F, 0], +[0x3D3604, 0x39, 0x1B, 0], +[0x3D3606, 0x39, 0x1B, 1], +[0x3D360A, 0xFF, 0x4F, 1], +[0x3D3610, 0xFF, 0x4F, 0], +[0x3D1A48, 0xB5, 0x12, 0], +[0x3D1A46, 0xFF, 0x4F, 0], +[0x3D1A44, 0xFF, 0x4F, 0], +[0x3D1A4A, 0x39, 0x1B, 0], +[0x3D1A88, 0xB5, 0x12, 1], +[0x3D1A8A, 0xBB, 0xB4, 1], +[0x3D1A86, 0xFF, 0x4F, 1], +[0x3D1A84, 0xFF, 0x4F, 1], +[0x3CE282, 0xF7, 0x02, 0], +[0x3CE2C2, 0xF7, 0x02, 1], +[0x3CE280, 0xFF, 0x4F, 0], +[0x3CE2C0, 0xFF, 0x4F, 1], +[0x4FA29E, 0xF7, 0x02, 0], +[0x4FA2DE, 0xF7, 0x02, 1], +[0x4FA29C, 0xFF, 0x4F, 0], +[0x4FA2DC, 0xFF, 0x4F, 1], +[0x3D4786, 0xFF, 0x3B, 1], +[0x3D478C, 0xFF, 0x3B, 0], +[0x3D478E, 0x5A, 0x17, 0], +[0x3D4788, 0x5A, 0x17, 1], +[0x3D4790, 0x5A, 0x17, 0], +[0x3D478A, 0x7B, 0x07, 1], +[0x3D4794, 0x39, 0x1B, 0], +[0x3D4792, 0x7B, 0x07, 0], +[0x3D4784, 0xFE, 0x33, 0], +[0x3C9E3A, 0xFF, 0x63, 1], +[0x3C9E40, 0xFF, 0x63, 0], +[0x3C9E38, 0xFF, 0x63, 1], +[0x3C9E3E, 0xFF, 0x63, 0], +[0x3C9E36, 0xFC, 0x7F, 1], +[0x3C9E3C, 0xFC, 0x7F, 0], +[0x4F4D5C, 0xFF, 0x07, 0], +[0x4F4D5E, 0xF7, 0x02, 0], +[0x3C9320, 0xFF, 0x07, 0], +[0x3C9322, 0xF7, 0x02, 0], +[0x9F9CF6, 0xFF, 0x07, 0], +[0x9F9CF8, 0xF7, 0x02, 0], +[0x4F4E1C, 0xFF, 0x07, 1], +[0x4F4E1E, 0xF7, 0x02, 1], +[0x3C9450, 0xFF, 0x07, 1], +[0x3C9452, 0xF7, 0x02, 1], +[0x9F9D74, 0xFF, 0x07, 1], +[0x9F9D76, 0xF7, 0x02, 1], +[0xA6202E, 0x94, 0x12, 0], +[0xA62032, 0xBD, 0x1B, 0], +[0xA62030, 0x39, 0x1B, 0], +[0xA62034, 0xFF, 0x4F, 0], +[0xA6204E, 0x94, 0x12, 1], +[0xA62052, 0xBD, 0x1B, 1], +[0xA62050, 0x39, 0x1B, 1], +[0xA62054, 0xFF, 0x4F, 1], +[0x3D4812, 0x5A, 0x17, 0], +[0x3D480E, 0x5A, 0x17, 1], +[0x3D4810, 0xFF, 0x4F, 0], +[0x3D480C, 0xFF, 0x4F, 1], +[0x3CC9FE, 0xFF, 0x07, 0], +[0x3CCA0A, 0xF7, 0x02, 0], +[0x8CBE20, 0xB5, 0x12, 0], +[0x8CBE22, 0xF7, 0x02, 0], +[0x8CBE1E, 0xFF, 0x3B, 0], +[0x8CBE40, 0xB5, 0x12, 1], +[0x8CBE42, 0xF7, 0x02, 1], +[0x8CBE3E, 0xFF, 0x3B, 1], +[0x8CBEE0, 0xFF, 0x07, 0], +[0x8CBEDE, 0xFF, 0x57, 0], +[0x8CBEE2, 0xF7, 0x02, 0], +[0x3B8F38, 0xB5, 0x12, 1], +[0x3B8F3A, 0xFF, 0x57, 1], +[0x3B8F40, 0xB5, 0x12, 0], +[0x3B8F42, 0xFF, 0x57, 0], +[0x3D1094, 0x5A, 0x17, 0], +[0x3D109A, 0xEF, 0x0D, 0], +[0x3D1098, 0xF7, 0x01, 0], +[0x3D1096, 0xF7, 0x02, 0], +[0x3D1092, 0xFF, 0x57, 0], +[0x3D1090, 0xFF, 0x4F, 0], +[0x3D10D4, 0x5A, 0x17, 1], +[0x3D10DA, 0xEF, 0x0D, 1], +[0x3D10D8, 0xF7, 0x01, 1], +[0x3D10D6, 0xF7, 0x02, 1], +[0x3D10D2, 0xFF, 0x57, 1], +[0x3D10D0, 0xFF, 0x4F, 1], +[0x3D14D0, 0xFF, 0x07, 0], +[0x3D14D2, 0xF7, 0x02, 0], +[0x3D14CE, 0xFF, 0x4F, 0], +[0x3D14CC, 0xDE, 0x27, 0], +[0x3D1510, 0x5A, 0x17, 1], +[0x3D1512, 0xF7, 0x02, 1], +[0x3D150E, 0xFF, 0x4F, 1], +[0x3D150C, 0xDE, 0x27, 1], +[0x3CE0F4, 0x94, 0x12, 1], +[0x3CE0F2, 0x9C, 0x07, 1], +[0x3CE0F0, 0xDE, 0x27, 1], +[0x3CE0D4, 0x94, 0x12, 0], +[0x3CE0D2, 0x9C, 0x07, 0], +[0x3CE0D0, 0xDE, 0x27, 0]] + +azurePants = [ +[0x3CC882, 0x8B, 0x73, 0], +[0x3CC880, 0xED, 0x7F, 0], +[0x3CC8C2, 0x8B, 0x73, 1], +[0x3CC8C0, 0xED, 0x7F, 1], +[0x4F4CDA, 0x8B, 0x73, 0], +[0x4F4CD8, 0xED, 0x7F, 0], +[0x4F4D1A, 0x8B, 0x73, 1], +[0x4F4D18, 0xED, 0x7F, 1], +[0x519014, 0x8B, 0x73, 0], +[0x519016, 0xED, 0x7F, 0], +[0x519034, 0x8B, 0x73, 1], +[0x519036, 0xED, 0x7F, 1], +[0x5193E6, 0x8B, 0x73, 0], +[0x5193E4, 0xED, 0x7F, 0], +[0x519406, 0x8B, 0x73, 1], +[0x519404, 0xED, 0x7F, 1], +[0x3CC9C2, 0x8B, 0x73, 0], +[0x3CC9C0, 0xED, 0x7F, 0], +[0x3CDE84, 0x8B, 0x73, 1], +[0x3CDE74, 0x8B, 0x73, 1], +[0x51AD2A, 0x8B, 0x73, 0], +[0x51AD26, 0xFA, 0x7F, 0], +[0x51AD28, 0xED, 0x7F, 0], +[0x51AD4A, 0x8B, 0x73, 1], +[0x51AD48, 0xED, 0x7F, 1], +[0x51AD46, 0xFA, 0x7F, 1], +[0x51A4AA, 0x8B, 0x73, 0], +[0x51A4A6, 0xFA, 0x7F, 0], +[0x51A4A8, 0xED, 0x7F, 0], +[0x51A4CA, 0x8B, 0x73, 1], +[0x51A4C8, 0xED, 0x7F, 1], +[0x51A4C6, 0xFA, 0x7F, 1], +[0x51A98A, 0x8B, 0x73, 0], +[0x51A986, 0xFA, 0x7F, 0], +[0x51A988, 0xED, 0x7F, 0], +[0x51A96A, 0x8B, 0x73, 1], +[0x51A968, 0xED, 0x7F, 1], +[0x51A966, 0xFA, 0x7F, 1], +[0x3CC982, 0x8B, 0x73, 0], +[0x3CC980, 0xED, 0x7F, 0], +[0x3D4B4E, 0xD6, 0x7B, 0], +[0x3D4B4C, 0xFA, 0x7F, 0], +[0x3CCA42, 0x8B, 0x73, 1], +[0x3CCA40, 0xED, 0x7F, 1], +[0x3CFB3A, 0x8B, 0x73, 0], +[0x3CFB38, 0xED, 0x7F, 0], +[0x3CFB7A, 0x8B, 0x73, 1], +[0x3CFB78, 0xED, 0x7F, 1], +[0x4F4D5A, 0x8B, 0x73, 0], +[0x4F4D58, 0xED, 0x7F, 0], +[0x3C931E, 0x8B, 0x73, 0], +[0x3C931C, 0xED, 0x7F, 0], +[0x9F9CF4, 0x8B, 0x73, 0], +[0x9F9CF2, 0xED, 0x7F, 0], +[0x4F4E1A, 0x8B, 0x73, 1], +[0x4F4E18, 0xED, 0x7F, 1], +[0x3C944E, 0x8B, 0x73, 1], +[0x3C944C, 0xED, 0x7F, 1], +[0x9F9D72, 0x8B, 0x73, 1], +[0x9F9D70, 0xED, 0x7F, 1], +[0x518E10, 0x8B, 0x73, 0], +[0x518E12, 0xFA, 0x7F, 0], +[0x3D4806, 0x8B, 0x73, 0], +[0x3D4804, 0xED, 0x7F, 0], +[0x3CCA02, 0x8B, 0x73, 0], +[0x3CCA00, 0xED, 0x7F, 0], +[0x3D14C6, 0xED, 0x7F, 0], +[0x3D1506, 0xED, 0x7F, 1]] + +blackPants = [ +[0x3CC882, 0x63, 0x0C, 0], +[0x3CC880, 0x84, 0x10, 0], +[0x3CC8C2, 0x63, 0x0C, 1], +[0x3CC8C0, 0x84, 0x10, 1], +[0x4F4CDA, 0x63, 0x0C, 0], +[0x4F4CD8, 0x84, 0x10, 0], +[0x4F4D1A, 0x63, 0x0C, 1], +[0x4F4D18, 0x84, 0x10, 1], +[0x519014, 0x63, 0x0C, 0], +[0x519016, 0x84, 0x10, 0], +[0x519034, 0x63, 0x0C, 1], +[0x519036, 0x84, 0x10, 1], +[0x5193E6, 0x63, 0x0C, 0], +[0x5193E4, 0x84, 0x10, 0], +[0x519406, 0x63, 0x0C, 1], +[0x519404, 0x84, 0x10, 1], +[0x3CC9C2, 0x63, 0x0C, 0], +[0x3CC9C0, 0x84, 0x10, 0], +[0x3CDE84, 0x63, 0x0C, 1], +[0x3CDE74, 0x63, 0x0C, 1], +[0x51AD2A, 0x63, 0x0C, 0], +[0x51AD26, 0x4A, 0x29, 0], +[0x51AD28, 0x84, 0x10, 0], +[0x51AD4A, 0x63, 0x0C, 1], +[0x51AD48, 0x84, 0x10, 1], +[0x51AD46, 0x4A, 0x29, 1], +[0x51A4AA, 0x63, 0x0C, 0], +[0x51A4A6, 0x4A, 0x29, 0], +[0x51A4A8, 0x84, 0x10, 0], +[0x51A4CA, 0x63, 0x0C, 1], +[0x51A4C8, 0x84, 0x10, 1], +[0x51A4C6, 0x4A, 0x29, 1], +[0x51A98A, 0x63, 0x0C, 0], +[0x51A986, 0x4A, 0x29, 0], +[0x51A988, 0x84, 0x10, 0], +[0x51A96A, 0x63, 0x0C, 1], +[0x51A968, 0x84, 0x10, 1], +[0x51A966, 0x4A, 0x29, 1], +[0x3CC982, 0x63, 0x0C, 0], +[0x3CC980, 0x84, 0x10, 0], +[0x3D4B4E, 0x08, 0x21, 0], +[0x3D4B4C, 0x4A, 0x29, 0], +[0x3CCA42, 0x63, 0x0C, 1], +[0x3CCA40, 0x84, 0x10, 1], +[0x3CFB3A, 0x63, 0x0C, 0], +[0x3CFB38, 0x84, 0x10, 0], +[0x3CFB7A, 0x63, 0x0C, 1], +[0x3CFB78, 0x84, 0x10, 1], +[0x4F4D5A, 0x63, 0x0C, 0], +[0x4F4D58, 0x84, 0x10, 0], +[0x3C931E, 0x63, 0x0C, 0], +[0x3C931C, 0x84, 0x10, 0], +[0x9F9CF4, 0x63, 0x0C, 0], +[0x9F9CF2, 0x84, 0x10, 0], +[0x4F4E1A, 0x63, 0x0C, 1], +[0x4F4E18, 0x84, 0x10, 1], +[0x3C944E, 0x63, 0x0C, 1], +[0x3C944C, 0x84, 0x10, 1], +[0x9F9D72, 0x63, 0x0C, 1], +[0x9F9D70, 0x84, 0x10, 1], +[0x518E10, 0x63, 0x0C, 0], +[0x518E12, 0x4A, 0x29, 0], +[0x3D4806, 0x63, 0x0C, 0], +[0x3D4804, 0x84, 0x10, 0], +[0x3CCA02, 0x63, 0x0C, 0], +[0x3CCA00, 0x84, 0x10, 0], +[0x3D14C6, 0x84, 0x10, 0], +[0x3D1506, 0x84, 0x10, 1]] + +bluePants = [ +[0x3CC882, 0x00, 0x5C, 0], +[0x3CC880, 0x00, 0x7C, 0], +[0x3CC8C2, 0x00, 0x5C, 1], +[0x3CC8C0, 0x00, 0x7C, 1], +[0x4F4CDA, 0x00, 0x5C, 0], +[0x4F4CD8, 0x00, 0x7C, 0], +[0x4F4D1A, 0x00, 0x5C, 1], +[0x4F4D18, 0x00, 0x7C, 1], +[0x519014, 0x00, 0x5C, 0], +[0x519016, 0x00, 0x7C, 0], +[0x519034, 0x00, 0x5C, 1], +[0x519036, 0x00, 0x7C, 1], +[0x5193E6, 0x00, 0x5C, 0], +[0x5193E4, 0x00, 0x7C, 0], +[0x519406, 0x00, 0x5C, 1], +[0x519404, 0x00, 0x7C, 1], +[0x3CC9C2, 0x00, 0x5C, 0], +[0x3CC9C0, 0x00, 0x7C, 0], +[0x3CDE84, 0x00, 0x5C, 1], +[0x3CDE74, 0x00, 0x5C, 1], +[0x51AD2A, 0x00, 0x5C, 0], +[0x51AD26, 0xB5, 0x7E, 0], +[0x51AD28, 0x00, 0x7C, 0], +[0x51AD4A, 0x00, 0x5C, 1], +[0x51AD48, 0x00, 0x7C, 1], +[0x51AD46, 0xB5, 0x7E, 1], +[0x51A4AA, 0x00, 0x5C, 0], +[0x51A4A6, 0xB5, 0x7E, 0], +[0x51A4A8, 0x00, 0x7C, 0], +[0x51A4CA, 0x00, 0x5C, 1], +[0x51A4C8, 0x00, 0x7C, 1], +[0x51A4C6, 0xB5, 0x7E, 1], +[0x51A98A, 0x00, 0x5C, 0], +[0x51A986, 0xB5, 0x7E, 0], +[0x51A988, 0x00, 0x7C, 0], +[0x51A96A, 0x00, 0x5C, 1], +[0x51A968, 0x00, 0x7C, 1], +[0x51A966, 0xB5, 0x7E, 1], +[0x3CC982, 0x00, 0x5C, 0], +[0x3CC980, 0x00, 0x7C, 0], +[0x3D4B4E, 0x73, 0x72, 0], +[0x3D4B4C, 0xB5, 0x7E, 0], +[0x3CCA42, 0x00, 0x5C, 1], +[0x3CCA40, 0x00, 0x7C, 1], +[0x3CFB3A, 0x00, 0x5C, 0], +[0x3CFB38, 0x00, 0x7C, 0], +[0x3CFB7A, 0x00, 0x5C, 1], +[0x3CFB78, 0x00, 0x7C, 1], +[0x4F4D5A, 0x00, 0x5C, 0], +[0x4F4D58, 0x00, 0x7C, 0], +[0x3C931E, 0x00, 0x5C, 0], +[0x3C931C, 0x00, 0x7C, 0], +[0x9F9CF4, 0x00, 0x5C, 0], +[0x9F9CF2, 0x00, 0x7C, 0], +[0x4F4E1A, 0x00, 0x5C, 1], +[0x4F4E18, 0x00, 0x7C, 1], +[0x3C944E, 0x00, 0x5C, 1], +[0x3C944C, 0x00, 0x7C, 1], +[0x9F9D72, 0x00, 0x5C, 1], +[0x9F9D70, 0x00, 0x7C, 1], +[0x518E10, 0x00, 0x5C, 0], +[0x518E12, 0xB5, 0x7E, 0], +[0x3D4806, 0x00, 0x5C, 0], +[0x3D4804, 0x00, 0x7C, 0], +[0x3CCA02, 0x00, 0x5C, 0], +[0x3CCA00, 0x00, 0x7C, 0], +[0x3D14C6, 0x00, 0x7C, 0], +[0x3D1506, 0x00, 0x7C, 1]] + +chaosPants = [ +[0x3CC880, 0], +[0x3CC882, 0], +[0x3CC8C0, 1], +[0x3CC8C2, 1], +[0x3CC980, 0], +[0x3CC982, 0], +[0x4f4cd8, 0], +[0x4F4CDA, 0], +[0x4F4D18, 1], +[0x4F4D1A, 1], +[0x519014, 0], +[0x519016, 0], +[0x519034, 1], +[0x519036, 1], +[0x5193E4, 0], +[0x5193E6, 0], +[0x519404, 1], +[0x519406, 1], +[0x51A988, 0], +[0x51A98A, 0], +[0x51A968, 1], +[0x51A96A, 1], +[0x51ad28, 0], +[0x51AD2A, 0], +[0x51AD48, 1], +[0x51AD4A, 1], +[0x3CFB38, 0], +[0x3CFB3A, 0], +[0x3CFB78, 1], +[0x3CFB7A, 1], +[0x3CC9C0, 0], +[0x3CC9C2, 0], +[0x3CCA40, 1], +[0x3CCA42, 1], +[0x3CDE74, 1], +[0x3D4B4C, 0], +[0x3D4B4E, 0]] + +greenPants = [ +[0x3CC882, 0xE0, 0x02, 0], +[0x3CC880, 0xA3, 0x03, 0], +[0x3CC8C2, 0xE0, 0x02, 1], +[0x3CC8C0, 0xA3, 0x03, 1], +[0x4F4CDA, 0xE0, 0x02, 0], +[0x4F4CD8, 0xA3, 0x03, 0], +[0x4F4D1A, 0xE0, 0x02, 1], +[0x4F4D18, 0xA3, 0x03, 1], +[0x519014, 0xE0, 0x02, 0], +[0x519016, 0xA3, 0x03, 0], +[0x519034, 0xE0, 0x02, 1], +[0x519036, 0xA3, 0x03, 1], +[0x5193E6, 0xE0, 0x02, 0], +[0x5193E4, 0xA3, 0x03, 0], +[0x519406, 0xE0, 0x02, 1], +[0x519404, 0xA3, 0x03, 1], +[0x3CC9C2, 0xE0, 0x02, 0], +[0x3CC9C0, 0xA3, 0x03, 0], +[0x3CDE84, 0xE0, 0x02, 1], +[0x3CDE74, 0xE0, 0x02, 1], +[0x51AD2A, 0xE0, 0x02, 0], +[0x51AD26, 0xF6, 0x5B, 0], +[0x51AD28, 0xA3, 0x03, 0], +[0x51AD4A, 0xE0, 0x02, 1], +[0x51AD48, 0xA3, 0x03, 1], +[0x51AD46, 0xF6, 0x5B, 1], +[0x51A4AA, 0xE0, 0x02, 0], +[0x51A4A6, 0xF6, 0x5B, 0], +[0x51A4A8, 0xA3, 0x03, 0], +[0x51A4CA, 0xE0, 0x02, 1], +[0x51A4C8, 0xA3, 0x03, 1], +[0x51A4C6, 0xF6, 0x5B, 1], +[0x51A98A, 0xE0, 0x02, 0], +[0x51A986, 0xF6, 0x5B, 0], +[0x51A988, 0xA3, 0x03, 0], +[0x51A96A, 0xE0, 0x02, 1], +[0x51A968, 0xA3, 0x03, 1], +[0x51A966, 0xF6, 0x5B, 1], +[0x3CC982, 0xE0, 0x02, 0], +[0x3CC980, 0xA3, 0x03, 0], +[0x3D4B4E, 0xB1, 0x3B, 0], +[0x3D4B4C, 0xF6, 0x5B, 0], +[0x3CCA42, 0xE0, 0x02, 1], +[0x3CCA40, 0xA3, 0x03, 1], +[0x3CFB3A, 0xE0, 0x02, 0], +[0x3CFB38, 0xA3, 0x03, 0], +[0x3CFB7A, 0xE0, 0x02, 1], +[0x3CFB78, 0xA3, 0x03, 1], +[0x4F4D5A, 0xE0, 0x02, 0], +[0x4F4D58, 0xA3, 0x03, 0], +[0x3C931E, 0xE0, 0x02, 0], +[0x3C931C, 0xA3, 0x03, 0], +[0x9F9CF4, 0xE0, 0x02, 0], +[0x9F9CF2, 0xA3, 0x03, 0], +[0x4F4E1A, 0xE0, 0x02, 1], +[0x4F4E18, 0xA3, 0x03, 1], +[0x3C944E, 0xE0, 0x02, 1], +[0x3C944C, 0xA3, 0x03, 1], +[0x9F9D72, 0xE0, 0x02, 1], +[0x9F9D70, 0xA3, 0x03, 1], +[0x518E10, 0xE0, 0x02, 0], +[0x518E12, 0xF6, 0x5B, 0], +[0x3D4806, 0xE0, 0x02, 0], +[0x3D4804, 0xA3, 0x03, 0], +[0x3CCA02, 0xE0, 0x02, 0], +[0x3CCA00, 0xA3, 0x03, 0], +[0x3D14C6, 0xA3, 0x03, 0], +[0x3D1506, 0xA3, 0x03, 1]] + +orangePants = [ +[0x3CC882, 0x3C, 0x02, 0], +[0x3CC880, 0x7F, 0x02, 0], +[0x3CC8C2, 0x3C, 0x02, 1], +[0x3CC8C0, 0x7F, 0x02, 1], +[0x4F4CDA, 0x3C, 0x02, 0], +[0x4F4CD8, 0x7F, 0x02, 0], +[0x4F4D1A, 0x3C, 0x02, 1], +[0x4F4D18, 0x7F, 0x02, 1], +[0x519014, 0x3C, 0x02, 0], +[0x519016, 0x7F, 0x02, 0], +[0x519034, 0x3C, 0x02, 1], +[0x519036, 0x7F, 0x02, 1], +[0x5193E6, 0x3C, 0x02, 0], +[0x5193E4, 0x7F, 0x02, 0], +[0x519406, 0x3C, 0x02, 1], +[0x519404, 0x7F, 0x02, 1], +[0x3CC9C2, 0x3C, 0x02, 0], +[0x3CC9C0, 0x7F, 0x02, 0], +[0x3CDE84, 0x3C, 0x02, 1], +[0x3CDE74, 0x3C, 0x02, 1], +[0x51AD2A, 0x3C, 0x02, 0], +[0x51AD26, 0x5E, 0x53, 0], +[0x51AD28, 0x7F, 0x02, 0], +[0x51AD4A, 0x3C, 0x02, 1], +[0x51AD48, 0x7F, 0x02, 1], +[0x51AD46, 0x5E, 0x53, 1], +[0x51A4AA, 0x3C, 0x02, 0], +[0x51A4A6, 0x5E, 0x53, 0], +[0x51A4A8, 0x7F, 0x02, 0], +[0x51A4CA, 0x3C, 0x02, 1], +[0x51A4C8, 0x7F, 0x02, 1], +[0x51A4C6, 0x5E, 0x53, 1], +[0x51A98A, 0x3C, 0x02, 0], +[0x51A986, 0x5E, 0x53, 0], +[0x51A988, 0x7F, 0x02, 0], +[0x51A96A, 0x3C, 0x02, 1], +[0x51A968, 0x7F, 0x02, 1], +[0x51A966, 0x5E, 0x53, 1], +[0x3CC982, 0x3C, 0x02, 0], +[0x3CC980, 0x7F, 0x02, 0], +[0x3D4B4E, 0xFE, 0x42, 0], +[0x3D4B4C, 0x5E, 0x53, 0], +[0x3CCA42, 0x3C, 0x02, 1], +[0x3CCA40, 0x7F, 0x02, 1], +[0x3CFB3A, 0x3C, 0x02, 0], +[0x3CFB38, 0x7F, 0x02, 0], +[0x3CFB7A, 0x3C, 0x02, 1], +[0x3CFB78, 0x7F, 0x02, 1], +[0x4F4D5A, 0x3C, 0x02, 0], +[0x4F4D58, 0x7F, 0x02, 0], +[0x3C931E, 0x3C, 0x02, 0], +[0x3C931C, 0x7F, 0x02, 0], +[0x9F9CF4, 0x3C, 0x02, 0], +[0x9F9CF2, 0x7F, 0x02, 0], +[0x4F4E1A, 0x3C, 0x02, 1], +[0x4F4E18, 0x7F, 0x02, 1], +[0x3C944E, 0x3C, 0x02, 1], +[0x3C944C, 0x7F, 0x02, 1], +[0x9F9D72, 0x3C, 0x02, 1], +[0x9F9D70, 0x7F, 0x02, 1], +[0x518E10, 0x3C, 0x02, 0], +[0x518E12, 0x5E, 0x53, 0], +[0x3D4806, 0x3C, 0x02, 0], +[0x3D4804, 0x7F, 0x02, 0], +[0x3CCA02, 0x3C, 0x02, 0], +[0x3CCA00, 0x7F, 0x02, 0], +[0x3D14C6, 0x7F, 0x02, 0], +[0x3D1506, 0x7F, 0x02, 1]] + +pinkPants = [ +[0x3CC882, 0xFF, 0x5D, 0], +[0x3CC880, 0xDF, 0x6E, 0], +[0x3CC8C2, 0xFF, 0x5D, 1], +[0x3CC8C0, 0xDF, 0x6E, 1], +[0x4F4CDA, 0xFF, 0x5D, 0], +[0x4F4CD8, 0xDF, 0x6E, 0], +[0x4F4D1A, 0xFF, 0x5D, 1], +[0x4F4D18, 0xDF, 0x6E, 1], +[0x519014, 0xFF, 0x5D, 0], +[0x519016, 0xDF, 0x6E, 0], +[0x519034, 0xFF, 0x5D, 1], +[0x519036, 0xDF, 0x6E, 1], +[0x5193E6, 0xFF, 0x5D, 0], +[0x5193E4, 0xDF, 0x6E, 0], +[0x519406, 0xFF, 0x5D, 1], +[0x519404, 0xDF, 0x6E, 1], +[0x3CC9C2, 0xFF, 0x5D, 0], +[0x3CC9C0, 0xDF, 0x6E, 0], +[0x3CDE84, 0xFF, 0x5D, 1], +[0x3CDE74, 0xFF, 0x5D, 1], +[0x51AD2A, 0xFF, 0x5D, 0], +[0x51AD26, 0x7F, 0x77, 0], +[0x51AD28, 0xDF, 0x6E, 0], +[0x51AD4A, 0xFF, 0x5D, 1], +[0x51AD48, 0xDF, 0x6E, 1], +[0x51AD46, 0x7F, 0x77, 1], +[0x51A4AA, 0xFF, 0x5D, 0], +[0x51A4A6, 0x7F, 0x77, 0], +[0x51A4A8, 0xDF, 0x6E, 0], +[0x51A4CA, 0xFF, 0x5D, 1], +[0x51A4C8, 0xDF, 0x6E, 1], +[0x51A4C6, 0x7F, 0x77, 1], +[0x51A98A, 0xFF, 0x5D, 0], +[0x51A986, 0x7F, 0x77, 0], +[0x51A988, 0xDF, 0x6E, 0], +[0x51A96A, 0xFF, 0x5D, 1], +[0x51A968, 0xDF, 0x6E, 1], +[0x51A966, 0x7F, 0x77, 1], +[0x3CC982, 0xFF, 0x5D, 0], +[0x3CC980, 0xDF, 0x6E, 0], +[0x3D4B4E, 0x3C, 0x6B, 0], +[0x3D4B4C, 0x7F, 0x77, 0], +[0x3CCA42, 0xFF, 0x5D, 1], +[0x3CCA40, 0xDF, 0x6E, 1], +[0x3CFB3A, 0xFF, 0x5D, 0], +[0x3CFB38, 0xDF, 0x6E, 0], +[0x3CFB7A, 0xFF, 0x5D, 1], +[0x3CFB78, 0xDF, 0x6E, 1], +[0x4F4D5A, 0xFF, 0x5D, 0], +[0x4F4D58, 0xDF, 0x6E, 0], +[0x3C931E, 0xFF, 0x5D, 0], +[0x3C931C, 0xDF, 0x6E, 0], +[0x9F9CF4, 0xFF, 0x5D, 0], +[0x9F9CF2, 0xDF, 0x6E, 0], +[0x4F4E1A, 0xFF, 0x5D, 1], +[0x4F4E18, 0xDF, 0x6E, 1], +[0x3C944E, 0xFF, 0x5D, 1], +[0x3C944C, 0xDF, 0x6E, 1], +[0x9F9D72, 0xFF, 0x5D, 1], +[0x9F9D70, 0xDF, 0x6E, 1], +[0x518E10, 0xFF, 0x5D, 0], +[0x518E12, 0x7F, 0x77, 0], +[0x3D4806, 0xFF, 0x5D, 0], +[0x3D4804, 0xDF, 0x6E, 0], +[0x3CCA02, 0xFF, 0x5D, 0], +[0x3CCA00, 0xDF, 0x6E, 0], +[0x3D14C6, 0xDF, 0x6E, 0], +[0x3D1506, 0xDF, 0x6E, 1]] + +purplePants = [ +[0x3CC882, 0x0B, 0x5C, 0], +[0x3CC880, 0x10, 0x7C, 0], +[0x3CC8C2, 0x0B, 0x5C, 1], +[0x3CC8C0, 0x10, 0x7C, 1], +[0x4F4CDA, 0x0B, 0x5C, 0], +[0x4F4CD8, 0x10, 0x7C, 0], +[0x4F4D1A, 0x0B, 0x5C, 1], +[0x4F4D18, 0x10, 0x7C, 1], +[0x519014, 0x0B, 0x5C, 0], +[0x519016, 0x10, 0x7C, 0], +[0x519034, 0x0B, 0x5C, 1], +[0x519036, 0x10, 0x7C, 1], +[0x5193E6, 0x0B, 0x5C, 0], +[0x5193E4, 0x10, 0x7C, 0], +[0x519406, 0x0B, 0x5C, 1], +[0x519404, 0x10, 0x7C, 1], +[0x3CC9C2, 0x0B, 0x5C, 0], +[0x3CC9C0, 0x10, 0x7C, 0], +[0x3CDE84, 0x0B, 0x5C, 1], +[0x3CDE74, 0x0B, 0x5C, 1], +[0x51AD2A, 0x0B, 0x5C, 0], +[0x51AD26, 0xFB, 0x7A, 0], +[0x51AD28, 0x10, 0x7C, 0], +[0x51AD4A, 0x0B, 0x5C, 1], +[0x51AD48, 0x10, 0x7C, 1], +[0x51AD46, 0xFB, 0x7A, 1], +[0x51A4AA, 0x0B, 0x5C, 0], +[0x51A4A6, 0xFB, 0x7A, 0], +[0x51A4A8, 0x10, 0x7C, 0], +[0x51A4CA, 0x0B, 0x5C, 1], +[0x51A4C8, 0x10, 0x7C, 1], +[0x51A4C6, 0xFB, 0x7A, 1], +[0x51A98A, 0x0B, 0x5C, 0], +[0x51A986, 0xFB, 0x7A, 0], +[0x51A988, 0x10, 0x7C, 0], +[0x51A96A, 0x0B, 0x5C, 1], +[0x51A968, 0x10, 0x7C, 1], +[0x51A966, 0xFB, 0x7A, 1], +[0x3CC982, 0x0B, 0x5C, 0], +[0x3CC980, 0x10, 0x7C, 0], +[0x3D4B4E, 0x98, 0x6E, 0], +[0x3D4B4C, 0xFB, 0x7A, 0], +[0x3CCA42, 0x0B, 0x5C, 1], +[0x3CCA40, 0x10, 0x7C, 1], +[0x3CFB3A, 0x0B, 0x5C, 0], +[0x3CFB38, 0x10, 0x7C, 0], +[0x3CFB7A, 0x0B, 0x5C, 1], +[0x3CFB78, 0x10, 0x7C, 1], +[0x4F4D5A, 0x0B, 0x5C, 0], +[0x4F4D58, 0x10, 0x7C, 0], +[0x3C931E, 0x0B, 0x5C, 0], +[0x3C931C, 0x10, 0x7C, 0], +[0x9F9CF4, 0x0B, 0x5C, 0], +[0x9F9CF2, 0x10, 0x7C, 0], +[0x4F4E1A, 0x0B, 0x5C, 1], +[0x4F4E18, 0x10, 0x7C, 1], +[0x3C944E, 0x0B, 0x5C, 1], +[0x3C944C, 0x10, 0x7C, 1], +[0x9F9D72, 0x0B, 0x5C, 1], +[0x9F9D70, 0x10, 0x7C, 1], +[0x518E10, 0x0B, 0x5C, 0], +[0x518E12, 0xFB, 0x7A, 0], +[0x3D4806, 0x0B, 0x5C, 0], +[0x3D4804, 0x10, 0x7C, 0], +[0x3CCA02, 0x0B, 0x5C, 0], +[0x3CCA00, 0x10, 0x7C, 0], +[0x3D14C6, 0x10, 0x7C, 0], +[0x3D1506, 0x10, 0x7C, 1]] + +redPants = [ +[0x3CC882, 0x17, 0x00, 0], +[0x3CC880, 0x3F, 0x04, 0], +[0x3CC8C2, 0x17, 0x00, 1], +[0x3CC8C0, 0x3F, 0x04, 1], +[0x4F4CDA, 0x17, 0x00, 0], +[0x4F4CD8, 0x3F, 0x04, 0], +[0x4F4D1A, 0x17, 0x00, 1], +[0x4F4D18, 0x3F, 0x04, 1], +[0x519014, 0x17, 0x00, 0], +[0x519016, 0x3F, 0x04, 0], +[0x519034, 0x17, 0x00, 1], +[0x519036, 0x3F, 0x04, 1], +[0x5193E6, 0x17, 0x00, 0], +[0x5193E4, 0x3F, 0x04, 0], +[0x519406, 0x17, 0x00, 1], +[0x519404, 0x3F, 0x04, 1], +[0x3CC9C2, 0x17, 0x00, 0], +[0x3CC9C0, 0x3F, 0x04, 0], +[0x3CDE84, 0x17, 0x00, 1], +[0x3CDE74, 0x3F, 0x04, 1], +[0x51AD2A, 0x17, 0x00, 0], +[0x51AD26, 0xBF, 0x56, 0], +[0x51AD28, 0x3F, 0x04, 0], +[0x51AD4A, 0x17, 0x00, 1], +[0x51AD48, 0x3F, 0x04, 1], +[0x51AD46, 0xBF, 0x56, 1], +[0x51A4AA, 0x17, 0x00, 0], +[0x51A4A6, 0xBF, 0x56, 0], +[0x51A4A8, 0x3F, 0x04, 0], +[0x51A4CA, 0x17, 0x00, 1], +[0x51A4C8, 0x3F, 0x04, 1], +[0x51A4C6, 0xBF, 0x56, 1], +[0x51A98A, 0x17, 0x00, 0], +[0x51A986, 0xBF, 0x56, 0], +[0x51A988, 0x3F, 0x04, 0], +[0x51A96A, 0x17, 0x00, 1], +[0x51A968, 0x3F, 0x04, 1], +[0x51A966, 0xBF, 0x56, 1], +[0x3CC982, 0x17, 0x00, 0], +[0x3CC980, 0x3F, 0x04, 0], +[0x3D4B4E, 0x1D, 0x3A, 0], +[0x3D4B4C, 0xBF, 0x56, 0], +[0x3CCA42, 0x17, 0x00, 1], +[0x3CCA40, 0x3F, 0x04, 1], +[0x3CFB3A, 0x17, 0x00, 0], +[0x3CFB38, 0x3F, 0x04, 0], +[0x3CFB7A, 0x17, 0x00, 1], +[0x3CFB78, 0x3F, 0x04, 1], +[0x4F4D5A, 0x17, 0x00, 0], +[0x4F4D58, 0x3F, 0x04, 0], +[0x3C931E, 0x17, 0x00, 0], +[0x3C931C, 0x3F, 0x04, 0], +[0x9F9CF4, 0x17, 0x00, 0], +[0x9F9CF2, 0x3F, 0x04, 0], +[0x4F4E1A, 0x17, 0x00, 1], +[0x4F4E18, 0x3F, 0x04, 1], +[0x3C944E, 0x17, 0x00, 1], +[0x3C944C, 0x3F, 0x04, 1], +[0x9F9D72, 0x17, 0x00, 1], +[0x9F9D70, 0x3F, 0x04, 1], +[0x518E10, 0x17, 0x00, 0], +[0x518E12, 0xBF, 0x56, 0], +[0x3D4806, 0x17, 0x00, 0], +[0x3D4804, 0x3F, 0x04, 0], +[0x3CCA02, 0x17, 0x00, 0], +[0x3CCA00, 0x3F, 0x04, 0], +[0x3D14C6, 0x3F, 0x04, 0], +[0x3D1506, 0x3F, 0x04, 1]] + +whitePants = [ +[0x3CC882, 0x7B, 0x6F, 0], +[0x3CC880, 0xFF, 0x7F, 0], +[0x3CC8C2, 0x7B, 0x6F, 1], +[0x3CC8C0, 0xFF, 0x7F, 1], +[0x4F4CDA, 0x7B, 0x6F, 0], +[0x4F4CD8, 0xFF, 0x7F, 0], +[0x4F4D1A, 0x7B, 0x6F, 1], +[0x4F4D18, 0xFF, 0x7F, 1], +[0x519014, 0x7B, 0x6F, 0], +[0x519016, 0xFF, 0x7F, 0], +[0x519034, 0x7B, 0x6F, 1], +[0x519036, 0xFF, 0x7F, 1], +[0x5193E6, 0x7B, 0x6F, 0], +[0x5193E4, 0xFF, 0x7F, 0], +[0x519406, 0x7B, 0x6F, 1], +[0x519404, 0xFF, 0x7F, 1], +[0x3CC9C2, 0x7B, 0x6F, 0], +[0x3CC9C0, 0xFF, 0x7F, 0], +[0x3CDE84, 0x7B, 0x6F, 1], +[0x3CDE74, 0x7B, 0x6F, 1], +[0x51AD2A, 0x7B, 0x6F, 0], +[0x51AD26, 0xFF, 0x7F, 0], +[0x51AD28, 0xFF, 0x7F, 0], +[0x51AD4A, 0x7B, 0x6F, 1], +[0x51AD48, 0xFF, 0x7F, 1], +[0x51AD46, 0xFF, 0x7F, 1], +[0x51A4AA, 0x7B, 0x6F, 0], +[0x51A4A6, 0xFF, 0x7F, 0], +[0x51A4A8, 0xFF, 0x7F, 0], +[0x51A4CA, 0x7B, 0x6F, 1], +[0x51A4C8, 0xFF, 0x7F, 1], +[0x51A4C6, 0xFF, 0x7F, 1], +[0x51A98A, 0x7B, 0x6F, 0], +[0x51A986, 0xFF, 0x7F, 0], +[0x51A988, 0xFF, 0x7F, 0], +[0x51A96A, 0x7B, 0x6F, 1], +[0x51A968, 0xFF, 0x7F, 1], +[0x51A966, 0xFF, 0x7F, 1], +[0x3CC982, 0x7B, 0x6F, 0], +[0x3CC980, 0xFF, 0x7F, 0], +[0x3D4B4E, 0x7B, 0x6F, 0], +[0x3D4B4C, 0xFF, 0x7F, 0], +[0x3CCA42, 0x7B, 0x6F, 1], +[0x3CCA40, 0xFF, 0x7F, 1], +[0x3CFB3A, 0x7B, 0x6F, 0], +[0x3CFB38, 0xFF, 0x7F, 0], +[0x3CFB7A, 0x7B, 0x6F, 1], +[0x3CFB78, 0xFF, 0x7F, 1], +[0x4F4D5A, 0x7B, 0x6F, 0], +[0x4F4D58, 0xFF, 0x7F, 0], +[0x3C931E, 0x7B, 0x6F, 0], +[0x3C931C, 0xFF, 0x7F, 0], +[0x9F9CF4, 0x7B, 0x6F, 0], +[0x9F9CF2, 0xFF, 0x7F, 0], +[0x4F4E1A, 0x7B, 0x6F, 1], +[0x4F4E18, 0xFF, 0x7F, 1], +[0x3C944E, 0x7B, 0x6F, 1], +[0x3C944C, 0xFF, 0x7F, 1], +[0x9F9D72, 0x7B, 0x6F, 1], +[0x9F9D70, 0xFF, 0x7F, 1], +[0x518E10, 0x7B, 0x6F, 0], +[0x518E12, 0xFF, 0x7F, 0], +[0x3D4806, 0x7B, 0x6F, 0], +[0x3D4804, 0xFF, 0x7F, 0], +[0x3CCA02, 0x7B, 0x6F, 0], +[0x3CCA00, 0xFF, 0x7F, 0], +[0x3D14C6, 0xFF, 0x7F, 0], +[0x3D1506, 0xFF, 0x7F, 1]] + +yellowPants = [ +[0x3CC882, 0xF7, 0x02, 0], +[0x3CC880, 0xFF, 0x07, 0], +[0x3CC8C2, 0xF7, 0x02, 1], +[0x3CC8C0, 0xFF, 0x07, 1], +[0x4F4CDA, 0xF7, 0x02, 0], +[0x4F4CD8, 0xFF, 0x07, 0], +[0x4F4D1A, 0xF7, 0x02, 1], +[0x4F4D18, 0xFF, 0x07, 1], +[0x519014, 0xF7, 0x02, 0], +[0x519016, 0xFF, 0x07, 0], +[0x519034, 0xF7, 0x02, 1], +[0x519036, 0xFF, 0x07, 1], +[0x5193E6, 0xF7, 0x02, 0], +[0x5193E4, 0xFF, 0x07, 0], +[0x519406, 0xF7, 0x02, 1], +[0x519404, 0xFF, 0x07, 1], +[0x3CC9C2, 0xF7, 0x02, 0], +[0x3CC9C0, 0xFF, 0x07, 0], +[0x3CDE84, 0xF7, 0x02, 1], +[0x3CDE74, 0xF7, 0x02, 1], +[0x51AD2A, 0xF7, 0x02, 0], +[0x51AD26, 0xFF, 0x4F, 0], +[0x51AD28, 0xFF, 0x07, 0], +[0x51AD4A, 0xF7, 0x02, 1], +[0x51AD48, 0xFF, 0x07, 1], +[0x51AD46, 0xFF, 0x4F, 1], +[0x51A4AA, 0xF7, 0x02, 0], +[0x51A4A6, 0xFF, 0x4F, 0], +[0x51A4A8, 0xFF, 0x07, 0], +[0x51A4CA, 0xF7, 0x02, 1], +[0x51A4C8, 0xFF, 0x07, 1], +[0x51A4C6, 0xFF, 0x4F, 1], +[0x51A98A, 0xF7, 0x02, 0], +[0x51A986, 0xFF, 0x4F, 0], +[0x51A988, 0xFF, 0x07, 0], +[0x51A96A, 0xF7, 0x02, 1], +[0x51A968, 0xFF, 0x07, 1], +[0x51A966, 0xFF, 0x4F, 1], +[0x3CC982, 0xF7, 0x02, 0], +[0x3CC980, 0xFF, 0x07, 0], +[0x3D4B4E, 0xDE, 0x27, 0], +[0x3D4B4C, 0xFF, 0x4F, 0], +[0x3CCA42, 0xF7, 0x02, 1], +[0x3CCA40, 0xFF, 0x07, 1], +[0x3CFB3A, 0xF7, 0x02, 0], +[0x3CFB38, 0xFF, 0x07, 0], +[0x3CFB7A, 0xF7, 0x02, 1], +[0x3CFB78, 0xFF, 0x07, 1], +[0x4F4D5A, 0xF7, 0x02, 0], +[0x4F4D58, 0xFF, 0x07, 0], +[0x3C931E, 0xF7, 0x02, 0], +[0x3C931C, 0xFF, 0x07, 0], +[0x9F9CF4, 0xF7, 0x02, 0], +[0x9F9CF2, 0xFF, 0x07, 0], +[0x4F4E1A, 0xF7, 0x02, 1], +[0x4F4E18, 0xFF, 0x07, 1], +[0x3C944E, 0xF7, 0x02, 1], +[0x3C944C, 0xFF, 0x07, 1], +[0x9F9D72, 0xF7, 0x02, 1], +[0x9F9D70, 0xFF, 0x07, 1], +[0x518E10, 0xF7, 0x02, 0], +[0x518E12, 0xFF, 0x4F, 0], +[0x3D4806, 0xF7, 0x02, 0], +[0x3D4804, 0xFF, 0x07, 0], +[0x3CCA02, 0xF7, 0x02, 0], +[0x3CCA00, 0xFF, 0x07, 0], +[0x3D14C6, 0xFF, 0x07, 0], +[0x3D1506, 0xFF, 0x07, 1]] \ No newline at end of file diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 4d3a324d7ef2..685235d2157e 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -1,45 +1,48 @@ import io import json -import pkgutil import random -import typing from . import Data +from typing import TYPE_CHECKING, Optional from BaseClasses import Item, Location from settings import get_settings from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes, APPatchExtension from .Items import item_table from .Locations import shop, badge, pants, location_table, hidden, all_locations -if typing.TYPE_CHECKING: +if TYPE_CHECKING: from . import MLSSWorld - -class Color: - def __init__(self, location, byte1, byte2, bro): - self.location = location - self.byte1 = byte1 - self.byte2 = byte2 - self.bro = bro - - colors = [ - "Red", - "Green", - "Blue", - "Cyan", - "Yellow", - "Orange", - "Purple", - "Pink", - "Black", - "White", - "Silhouette", - "Chaos", - "TrueChaos", + Data.redHat, + Data.greenHat, + Data.blueHat, + Data.azureHat, + Data.yellowHat, + Data.orangeHat, + Data.purpleHat, + Data.pinkHat, + Data.blackHat, + Data.whiteHat, + Data.silhouetteHat, + Data.chaosHat, + Data.truechaosHat ] -cpants = ["Vanilla", "Red", "Green", "Blue", "Cyan", "Yellow", "Orange", "Purple", "Pink", "Black", "White", "Chaos"] +pants = [ + Data.vanilla, + Data.redPants, + Data.greenPants, + Data.bluePants, + Data.azurePants, + Data.yellowPants, + Data.orangePants, + Data.purplePants, + Data.pinkPants, + Data.blackPants, + Data.whitePants, + Data.chaosPants +] def get_base_rom_as_bytes() -> bytes: @@ -341,58 +344,30 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: if "Shop" in location_name and "Coffee" not in location_name and item.player != world.player: desc_inject(world, patch, location, item) - swap_colors(world, patch, colors[world.options.mario_color], 0) - swap_colors(world, patch, colors[world.options.luigi_color], 1) - swap_pants(world, patch, cpants[world.options.mario_pants], 0) - swap_pants(world, patch, cpants[world.options.luigi_pants], 1) + swap_colors(world, patch, world.options.mario_pants.value, 0, True) + swap_colors(world, patch, world.options.luigi_pants.value, 1, True) + swap_colors(world, patch, world.options.mario_color.value, 0) + swap_colors(world, patch, world.options.luigi_color.value, 1) patch.write_file("token_data.bin", patch.get_token_binary()) -def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): - temp = pkgutil.get_data(__name__, "colors/" + color + ".txt") - temp_io = io.BytesIO(temp) - color_arr = [] - random = world.multiworld.per_slot_randoms[world.player] - - for lines in temp_io.readlines(): - arr = lines.decode("utf-8").strip().split(",") - if color != "Chaos" and color != "TrueChaos": - color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) - else: - color_arr.append(Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) - - colors_ = [c for c in color_arr if c.bro == bro] - - for c in colors_: - patch.write_token(APTokenTypes.WRITE, c.location, bytes([c.byte1, c.byte2])) - - -def swap_pants(world: "MLSSWorld", patch: MLSSProcedurePatch, color: str, bro: int): - mario_color = world.options.mario_color - luigi_color = world.options.luigi_color - random = world.multiworld.per_slot_randoms[world.player] - if bro == 0 and (colors[mario_color] == "TrueChaos" or colors[mario_color] == "Silhouette"): - return - if bro == 1 and (colors[luigi_color] == "TrueChaos" or colors[luigi_color] == "Silhouette"): +def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: int, bro: int, + pants_option: Optional[bool] = False): + if not pants_option and color == bro: return - if color == "Vanilla": - return - temp = pkgutil.get_data(__name__, "colors/pants/" + color + ".txt") - temp_io = io.BytesIO(temp) - color_arr = [] - - for lines in temp_io.readlines(): - arr = lines.decode("utf-8").strip().split(",") - if color != "Chaos": - color_arr.append(Color(int(arr[0], 16), int(arr[1], 16), int(arr[2], 16), int(arr[3], 16))) + chaos = False + if not pants_option and color == 11 or color == 12: + chaos = True + if pants_option and color == 11: + chaos = True + for c in [c for c in (pants[color] if pants_option else colors[color]) + if (c[3] == bro if not chaos else c[1] == bro)]: + if chaos: + patch.write_token(APTokenTypes.WRITE, c[0], + bytes([world.random.randint(0, 255), world.random.randint(0, 127)])) else: - color_arr.append(Color(int(arr[0], 16), random.randint(0, 255), random.randint(0, 127), int(arr[1], 16))) - - colors_ = [c for c in color_arr if c.bro == bro] - - for c in colors_: - patch.write_token(APTokenTypes.WRITE, c.location, bytes([c.byte1, c.byte2])) + patch.write_token(APTokenTypes.WRITE, c[0], bytes([c[1], c[2]])) def item_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: int, item_type: int, item: Item): From 1b11836d2ce09d3b6665fe5221104c399d58f348 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Wed, 1 May 2024 21:56:11 -0400 Subject: [PATCH 60/79] Actually removed the .txt files this time --- worlds/mlss/colors/Black.txt | 265 -------- worlds/mlss/colors/Blue.txt | 265 -------- worlds/mlss/colors/Chaos.txt | 156 ----- worlds/mlss/colors/Cyan.txt | 265 -------- worlds/mlss/colors/Green.txt | 265 -------- worlds/mlss/colors/Orange.txt | 265 -------- worlds/mlss/colors/Pink.txt | 265 -------- worlds/mlss/colors/Purple.txt | 265 -------- worlds/mlss/colors/Red.txt | 265 -------- worlds/mlss/colors/Silhouette.txt | 812 ------------------------- worlds/mlss/colors/TrueChaos.txt | 812 ------------------------- worlds/mlss/colors/White.txt | 265 -------- worlds/mlss/colors/Yellow.txt | 265 -------- worlds/mlss/colors/pants/Black.txt | 68 --- worlds/mlss/colors/pants/Blue.txt | 68 --- worlds/mlss/colors/pants/Chaos.txt | 37 -- worlds/mlss/colors/pants/Custom.txt | 37 -- worlds/mlss/colors/pants/Cyan.txt | 68 --- worlds/mlss/colors/pants/Green.txt | 68 --- worlds/mlss/colors/pants/Orange.txt | 68 --- worlds/mlss/colors/pants/Pink.txt | 68 --- worlds/mlss/colors/pants/Purple.txt | 68 --- worlds/mlss/colors/pants/Red.txt | 68 --- worlds/mlss/colors/pants/TrueChaos.txt | 37 -- worlds/mlss/colors/pants/Vanilla.txt | 37 -- worlds/mlss/colors/pants/White.txt | 68 --- worlds/mlss/colors/pants/Yellow.txt | 68 --- 27 files changed, 5258 deletions(-) delete mode 100644 worlds/mlss/colors/Black.txt delete mode 100644 worlds/mlss/colors/Blue.txt delete mode 100644 worlds/mlss/colors/Chaos.txt delete mode 100644 worlds/mlss/colors/Cyan.txt delete mode 100644 worlds/mlss/colors/Green.txt delete mode 100644 worlds/mlss/colors/Orange.txt delete mode 100644 worlds/mlss/colors/Pink.txt delete mode 100644 worlds/mlss/colors/Purple.txt delete mode 100644 worlds/mlss/colors/Red.txt delete mode 100644 worlds/mlss/colors/Silhouette.txt delete mode 100644 worlds/mlss/colors/TrueChaos.txt delete mode 100644 worlds/mlss/colors/White.txt delete mode 100644 worlds/mlss/colors/Yellow.txt delete mode 100644 worlds/mlss/colors/pants/Black.txt delete mode 100644 worlds/mlss/colors/pants/Blue.txt delete mode 100644 worlds/mlss/colors/pants/Chaos.txt delete mode 100644 worlds/mlss/colors/pants/Custom.txt delete mode 100644 worlds/mlss/colors/pants/Cyan.txt delete mode 100644 worlds/mlss/colors/pants/Green.txt delete mode 100644 worlds/mlss/colors/pants/Orange.txt delete mode 100644 worlds/mlss/colors/pants/Pink.txt delete mode 100644 worlds/mlss/colors/pants/Purple.txt delete mode 100644 worlds/mlss/colors/pants/Red.txt delete mode 100644 worlds/mlss/colors/pants/TrueChaos.txt delete mode 100644 worlds/mlss/colors/pants/Vanilla.txt delete mode 100644 worlds/mlss/colors/pants/White.txt delete mode 100644 worlds/mlss/colors/pants/Yellow.txt diff --git a/worlds/mlss/colors/Black.txt b/worlds/mlss/colors/Black.txt deleted file mode 100644 index c25fb73b3021..000000000000 --- a/worlds/mlss/colors/Black.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0x84,0x10,0, -0x3CC886,0x63,0x0C,0, -0x3CC8C4,0x84,0x10,1, -0x3CC8C6,0x63,0x0C,1, -0x4F4CDC,0x84,0x10,0, -0x4F4CDE,0x63,0x0C,0, -0x4F4D1C,0x84,0x10,1, -0x4F4D1E,0x63,0x0C,1, -0x4F51D8,0x84,0x10,1, -0x4F51DC,0x84,0x10,0, -0x4F51E8,0x08,0x21,0, -0x4F51EA,0x08,0x21,1, -0x4F51DA,0x4A,0x29,1, -0x4F51DE,0x4A,0x29,0, -0x4FB686,0x84,0x10,0, -0x4FB6A6,0x84,0x10,1, -0x4FB684,0x21,0x04,0, -0x4FB6A4,0x21,0x04,1, -0x4FB688,0x4A,0x29,0, -0x4FB6A8,0x4A,0x29,1, -0x4FB786,0x84,0x10,0, -0x4FB788,0x4A,0x29,0, -0x4FB78A,0x73,0x4E,0, -0x4FB7A6,0x84,0x10,1, -0x4FB7A8,0x4A,0x29,1, -0x4FB7AA,0x73,0x4E,1, -0x51901C,0x84,0x10,0, -0x519018,0x42,0x08,0, -0x51901A,0x63,0x0C,0, -0x51903C,0x84,0x10,1, -0x519038,0x42,0x08,1, -0x51903A,0x63,0x0C,1, -0x5193EA,0x63,0x0C,0, -0x5193E8,0x84,0x10,0, -0x51940A,0x63,0x0C,1, -0x519408,0x84,0x10,1, -0x3A72AE,0x84,0x10,1, -0x3A7244,0xA5,0x14,0, -0x3A724C,0x08,0x21,1, -0x3A7290,0xC6,0x18,0, -0x3A72B2,0xA5,0x14,1, -0x3A7270,0x63,0x0C,1, -0x3A7288,0x63,0x0C,0, -0x3A7296,0x29,0x25,0, -0x3A7274,0xA5,0x14,1, -0x3A7294,0x08,0x21,0, -0x3A724A,0x6B,0x2D,0, -0x3A7278,0xE7,0x1C,1, -0x3A724E,0xCE,0x39,0, -0x3A727A,0x29,0x25,1, -0x3A7252,0x10,0x42,0, -0x3A727C,0xAD,0x35,1, -0x3A72BC,0xAD,0x35,1, -0x3A726C,0x21,0x04,1, -0x3A7286,0x21,0x04,0, -0x3A728C,0x84,0x10,0, -0x3A7272,0x84,0x10,1, -0x3A7254,0x31,0x46,1, -0x3A7256,0x52,0x4A,0, -0x3A7264,0x31,0x46,1, -0x9F9A58,0x84,0x10,0, -0x9F9A5E,0x84,0x10,1, -0x9F9A2A,0x84,0x10,0, -0x9F9A30,0x84,0x10,1, -0x9F9A36,0x84,0x10,0, -0x9F9A3C,0x84,0x10,1, -0x9F9A4A,0x84,0x10,0, -0x9F9A50,0x84,0x10,1, -0x9F9A56,0x63,0x0C,0, -0x9F9A5C,0x63,0x0C,1, -0x9F9A28,0x21,0x04,0, -0x9F9A2E,0x21,0x04,1, -0x9F9A48,0x21,0x04,0, -0x9F9A4E,0x21,0x04,1, -0x9F9A34,0x63,0x0C,0, -0x9F9A3A,0x63,0x0C,1, -0x9F9A2C,0x4A,0x29,0, -0x9F9A32,0x4A,0x29,1, -0x9F9A38,0x4A,0x29,0, -0x9F9A3E,0x4A,0x29,1, -0x9F9A4C,0x4A,0x29,0, -0x9F9A52,0x4A,0x29,1, -0xA5DD46,0x63,0x0C,0, -0xA5DD44,0x00,0x00,0, -0xA5DD4A,0x6B,0x2D,0, -0xA5DD3E,0x21,0x04,0, -0xA5DD40,0xEF,0x3D,0, -0xA5DD42,0x52,0x4A,0, -0xA5DD48,0xE7,0x1C,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x63,0x0C,1, -0xA5DD64,0x00,0x00,1, -0xA5DD6A,0x6B,0x2D,1, -0xA5DD5E,0x21,0x04,1, -0xA5DD60,0xEF,0x3D,1, -0xA5DD62,0x52,0x4A,1, -0xA5DD68,0xE7,0x1C,1, -0x3D0E0C,0x84,0x10,1, -0x3D0E18,0x84,0x10,0, -0x3D0E0A,0x63,0x0C,1, -0x3D0E1A,0x63,0x0C,0, -0x3D0E08,0x4A,0x29,1, -0x3D0E16,0x4A,0x29,0, -0x3CC9C4,0x84,0x10,0, -0x3CC9C6,0x63,0x0C,0, -0x3CDE7C,0x84,0x10,1, -0x3CDE7E,0x63,0x0C,1, -0x51AD2C,0x84,0x10,0, -0x51AD2E,0x63,0x0C,0, -0x51AD4C,0x84,0x10,1, -0x51AD4E,0x63,0x0C,1, -0x51A4AE,0x63,0x0C,0, -0x51A4AC,0x84,0x10,0, -0x51A4CC,0x84,0x10,1, -0x51A4CE,0x63,0x0C,1, -0x51A98C,0x84,0x10,0, -0x51A98E,0x63,0x0C,0, -0x51A96C,0x84,0x10,1, -0x51A96E,0x63,0x0C,1, -0x51AA00,0x63,0x0C,0, -0x51AA10,0x63,0x0C,1, -0x51AA02,0x42,0x08,0, -0x51AA12,0x63,0x0C,1, -0x51A9FE,0x84,0x10,0, -0x51AA0E,0x84,0x10,1, -0x51AA0A,0x31,0x46,0, -0x3CC984,0x84,0x10,0, -0x3CC986,0x63,0x0C,0, -0x3D4B52,0x84,0x10,0, -0x3D4B5C,0x00,0x00,0, -0x3D4B54,0x84,0x10,0, -0x3D4B56,0x63,0x0C,0, -0x3D4B50,0x4A,0x29,0, -0x3CCA44,0x84,0x10,1, -0x3CCA46,0x63,0x0C,1, -0x3CFB3C,0x84,0x10,0, -0x3CFB3E,0x63,0x0C,0, -0x3CFB7C,0x84,0x10,1, -0x3CFB7E,0x63,0x0C,1, -0x3D504C,0xE7,0x1C,0, -0x3D504A,0x6B,0x2D,0, -0x3D504E,0x63,0x0C,0, -0x3D508C,0xE7,0x1C,1, -0x3D508A,0x6B,0x2D,1, -0x3D508E,0x63,0x0C,1, -0xA5DDA2,0x63,0x0C,0, -0xA5DDC2,0x63,0x0C,1, -0xA5DDA6,0x6B,0x2D,0, -0xA5DDC6,0x6B,0x2D,1, -0xA5DDA4,0xE7,0x1C,0, -0xA5DDC4,0xE7,0x1C,1, -0xA5DDA8,0xEF,0x3D,0, -0xA5DDC8,0xEF,0x3D,1, -0x3D3E0C,0x84,0x10,1, -0x3D3E10,0x84,0x10,0, -0x3D3E0E,0x63,0x0C,1, -0x3D3E12,0x63,0x0C,0, -0x3CF1C0,0x84,0x10,0, -0x3CF200,0x84,0x10,1, -0x3CF1C2,0x63,0x0C,0, -0x3CF202,0x63,0x0C,1, -0x3D360E,0x08,0x21,1, -0x3D3614,0x08,0x21,0, -0x3D360C,0x4A,0x29,1, -0x3D3612,0x4A,0x29,0, -0x3D3604,0xE7,0x1C,0, -0x3D3606,0xE7,0x1C,1, -0x3D360A,0x4A,0x29,1, -0x3D3610,0x4A,0x29,0, -0x3D1A48,0x84,0x10,0, -0x3D1A46,0x4A,0x29,0, -0x3D1A44,0x4A,0x29,0, -0x3D1A4A,0xE7,0x1C,0, -0x3D1A88,0x84,0x10,1, -0x3D1A8A,0xEE,0xE4,1, -0x3D1A86,0x4A,0x29,1, -0x3D1A84,0x4A,0x29,1, -0x3CE282,0x63,0x0C,0, -0x3CE2C2,0x63,0x0C,1, -0x3CE280,0x4A,0x29,0, -0x3CE2C0,0x4A,0x29,1, -0x4FA29E,0x63,0x0C,0, -0x4FA2DE,0x63,0x0C,1, -0x4FA29C,0x4A,0x29,0, -0x4FA2DC,0x4A,0x29,1, -0x3D4786,0x31,0x46,1, -0x3D478C,0x31,0x46,0, -0x3D478E,0xC6,0x18,0, -0x3D4788,0xC6,0x18,1, -0x3D4790,0xC6,0x18,0, -0x3D478A,0xE7,0x1C,1, -0x3D4794,0xE7,0x1C,0, -0x3D4792,0xE7,0x1C,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0x73,0x4E,1, -0x3C9E40,0x73,0x4E,0, -0x3C9E38,0x73,0x4E,1, -0x3C9E3E,0x73,0x4E,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0x84,0x10,0, -0x4F4D5E,0x63,0x0C,0, -0x3C9320,0x84,0x10,0, -0x3C9322,0x63,0x0C,0, -0x9F9CF6,0x84,0x10,0, -0x9F9CF8,0x63,0x0C,0, -0x4F4E1C,0x84,0x10,1, -0x4F4E1E,0x63,0x0C,1, -0x3C9450,0x84,0x10,1, -0x3C9452,0x63,0x0C,1, -0x9F9D74,0x84,0x10,1, -0x9F9D76,0x63,0x0C,1, -0xA6202E,0x63,0x0C,0, -0xA62032,0x6B,0x2D,0, -0xA62030,0xE7,0x1C,0, -0xA62034,0xEF,0x3D,0, -0xA6204E,0x63,0x0C,1, -0xA62052,0x6B,0x2D,1, -0xA62050,0xE7,0x1C,1, -0xA62054,0xEF,0x3D,1, -0x3D4812,0x08,0x21,0, -0x3D480E,0x08,0x21,1, -0x3D4810,0x4A,0x29,0, -0x3D480C,0x4A,0x29,1, -0x3CC9FE,0x84,0x10,0, -0x3CCA0A,0x63,0x0C,0, -0x8CBE20,0x84,0x10,0, -0x8CBE22,0x63,0x0C,0, -0x8CBE1E,0x31,0x46,0, -0x8CBE40,0x84,0x10,1, -0x8CBE42,0x63,0x0C,1, -0x8CBE3E,0x31,0x46,1, -0x8CBEE0,0x84,0x10,0, -0x8CBEDE,0x52,0x4A,0, -0x8CBEE2,0x63,0x0C,0, -0x3B8F38,0x84,0x10,1, -0x3B8F3A,0x52,0x4A,1, -0x3B8F40,0x84,0x10,0, -0x3B8F42,0x52,0x4A,0, -0x3D1094,0xC6,0x18,0, -0x3D109A,0x00,0x00,0, -0x3D1098,0x42,0x08,0, -0x3D1096,0x63,0x0C,0, -0x3D1092,0x52,0x4A,0, -0x3D1090,0x4A,0x29,0, -0x3D10D4,0xC6,0x18,1, -0x3D10DA,0x00,0x00,1, -0x3D10D8,0x42,0x08,1, -0x3D10D6,0x63,0x0C,1, -0x3D10D2,0x52,0x4A,1, -0x3D10D0,0x4A,0x29,1, -0x3D14D0,0x84,0x10,0, -0x3D14D2,0x63,0x0C,0, -0x3D14CE,0x4A,0x29,0, -0x3D14CC,0x08,0x21,0, -0x3D1510,0x08,0x21,1, -0x3D1512,0x63,0x0C,1, -0x3D150E,0x4A,0x29,1, -0x3D150C,0x08,0x21,1, -0x3CE0F4,0x63,0x0C,1, -0x3CE0F2,0x63,0x0C,1, -0x3CE0F0,0x08,0x21,1, -0x3CE0D4,0x63,0x0C,0, -0x3CE0D2,0x63,0x0C,0, -0x3CE0D0,0x08,0x21,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Blue.txt b/worlds/mlss/colors/Blue.txt deleted file mode 100644 index 927bbd865626..000000000000 --- a/worlds/mlss/colors/Blue.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0x00,0x7C,0, -0x3CC886,0x00,0x5C,0, -0x3CC8C4,0x00,0x7C,1, -0x3CC8C6,0x00,0x5C,1, -0x4F4CDC,0x00,0x7C,0, -0x4F4CDE,0x00,0x5C,0, -0x4F4D1C,0x00,0x7C,1, -0x4F4D1E,0x00,0x5C,1, -0x4F51D8,0x00,0x7C,1, -0x4F51DC,0x00,0x7C,0, -0x4F51E8,0x73,0x72,0, -0x4F51EA,0x73,0x72,1, -0x4F51DA,0xB5,0x7E,1, -0x4F51DE,0xB5,0x7E,0, -0x4FB686,0x00,0x7C,0, -0x4FB6A6,0x00,0x7C,1, -0x4FB684,0xA5,0x38,0, -0x4FB6A4,0xA5,0x38,1, -0x4FB688,0xB5,0x7E,0, -0x4FB6A8,0xB5,0x7E,1, -0x4FB786,0x00,0x7C,0, -0x4FB788,0xB5,0x7E,0, -0x4FB78A,0x9C,0x7F,0, -0x4FB7A6,0x00,0x7C,1, -0x4FB7A8,0xB5,0x7E,1, -0x4FB7AA,0x9C,0x7F,1, -0x51901C,0x00,0x7C,0, -0x519018,0x00,0x50,0, -0x51901A,0x00,0x5C,0, -0x51903C,0x00,0x7C,1, -0x519038,0x00,0x50,1, -0x51903A,0x00,0x5C,1, -0x5193EA,0x00,0x5C,0, -0x5193E8,0x00,0x7C,0, -0x51940A,0x00,0x5C,1, -0x519408,0x00,0x7C,1, -0x3A72AE,0xC5,0x4C,1, -0x3A7244,0xC5,0x4C,0, -0x3A724C,0x07,0x5D,1, -0x3A7290,0xE6,0x54,0, -0x3A72B2,0xE6,0x54,1, -0x3A7270,0x42,0x3C,1, -0x3A7288,0x42,0x3C,0, -0x3A7296,0x07,0x65,0, -0x3A7274,0x07,0x65,1, -0x3A7294,0x07,0x5D,0, -0x3A724A,0x28,0x71,0, -0x3A7278,0x28,0x71,1, -0x3A724E,0x49,0x7D,0, -0x3A727A,0x49,0x7D,1, -0x3A7252,0xAC,0x7D,0, -0x3A727C,0xAC,0x7D,1, -0x3A72BC,0xAC,0x7D,1, -0x3A726C,0x00,0x38,1, -0x3A7286,0x00,0x38,0, -0x3A728C,0x84,0x44,0, -0x3A7272,0x84,0x44,1, -0x3A7254,0x0F,0x7E,1, -0x3A7256,0x0F,0x7E,0, -0x3A7264,0x0F,0x7E,1, -0x9F9A58,0xAD,0x4D,0, -0x9F9A5E,0xAD,0x4D,1, -0x9F9A2A,0x00,0x7C,0, -0x9F9A30,0x00,0x7C,1, -0x9F9A36,0x00,0x7C,0, -0x9F9A3C,0x00,0x7C,1, -0x9F9A4A,0x00,0x7C,0, -0x9F9A50,0x00,0x7C,1, -0x9F9A56,0x00,0x54,0, -0x9F9A5C,0x00,0x54,1, -0x9F9A28,0xA5,0x38,0, -0x9F9A2E,0xA5,0x38,1, -0x9F9A48,0xA5,0x38,0, -0x9F9A4E,0xA5,0x38,1, -0x9F9A34,0x00,0x5C,0, -0x9F9A3A,0x00,0x5C,1, -0x9F9A2C,0xB5,0x7E,0, -0x9F9A32,0xB5,0x7E,1, -0x9F9A38,0xB5,0x7E,0, -0x9F9A3E,0xB5,0x7E,1, -0x9F9A4C,0xB5,0x7E,0, -0x9F9A52,0xB5,0x7E,1, -0xA5DD46,0x8C,0x5D,0, -0xA5DD44,0x4A,0x4D,0, -0xA5DD4A,0x31,0x7E,0, -0xA5DD3E,0xAD,0x4D,0, -0xA5DD40,0xD6,0x7E,0, -0xA5DD42,0x7B,0x7F,0, -0xA5DD48,0xEF,0x71,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x8C,0x5D,1, -0xA5DD64,0x4A,0x4D,1, -0xA5DD6A,0x31,0x7E,1, -0xA5DD5E,0xAD,0x4D,1, -0xA5DD60,0xD6,0x7E,1, -0xA5DD62,0x7B,0x7F,1, -0xA5DD68,0xEF,0x71,1, -0x3D0E0C,0x00,0x7C,1, -0x3D0E18,0x00,0x7C,0, -0x3D0E0A,0x00,0x5C,1, -0x3D0E1A,0x00,0x5C,0, -0x3D0E08,0xB5,0x7E,1, -0x3D0E16,0xB5,0x7E,0, -0x3CC9C4,0x00,0x7C,0, -0x3CC9C6,0x00,0x5C,0, -0x3CDE7C,0x00,0x7C,1, -0x3CDE7E,0x00,0x5C,1, -0x51AD2C,0x00,0x7C,0, -0x51AD2E,0x00,0x5C,0, -0x51AD4C,0x00,0x7C,1, -0x51AD4E,0x00,0x5C,1, -0x51A4AE,0x00,0x5C,0, -0x51A4AC,0x00,0x7C,0, -0x51A4CC,0x00,0x7C,1, -0x51A4CE,0x00,0x5C,1, -0x51A98C,0x00,0x7C,0, -0x51A98E,0x00,0x5C,0, -0x51A96C,0x00,0x7C,1, -0x51A96E,0x00,0x5C,1, -0x51AA00,0x00,0x70,0, -0x51AA10,0x00,0x70,1, -0x51AA02,0x00,0x5C,0, -0x51AA12,0x00,0x5C,1, -0x51A9FE,0x00,0x7C,0, -0x51AA0E,0x00,0x7C,1, -0x51AA0A,0x0F,0x7E,0, -0x3CC984,0x00,0x7C,0, -0x3CC986,0x00,0x5C,0, -0x3D4B52,0x00,0x70,0, -0x3D4B5C,0x00,0x50,0, -0x3D4B54,0x00,0x7C,0, -0x3D4B56,0x00,0x5C,0, -0x3D4B50,0xB5,0x7E,0, -0x3CCA44,0x00,0x7C,1, -0x3CCA46,0x00,0x5C,1, -0x3CFB3C,0x00,0x7C,0, -0x3CFB3E,0x00,0x5C,0, -0x3CFB7C,0x00,0x7C,1, -0x3CFB7E,0x00,0x5C,1, -0x3D504C,0x00,0x6C,0, -0x3D504A,0x00,0x7C,0, -0x3D504E,0x00,0x5C,0, -0x3D508C,0x00,0x6C,1, -0x3D508A,0x00,0x7C,1, -0x3D508E,0x00,0x5C,1, -0xA5DDA2,0x8C,0x5D,0, -0xA5DDC2,0x8C,0x5D,1, -0xA5DDA6,0x31,0x7E,0, -0xA5DDC6,0x31,0x7E,1, -0xA5DDA4,0xEF,0x71,0, -0xA5DDC4,0xEF,0x71,1, -0xA5DDA8,0xB5,0x7E,0, -0xA5DDC8,0xB5,0x7E,1, -0x3D3E0C,0x00,0x7C,1, -0x3D3E10,0x00,0x7C,0, -0x3D3E0E,0x00,0x5C,1, -0x3D3E12,0x00,0x5C,0, -0x3CF1C0,0x00,0x7C,0, -0x3CF200,0x00,0x7C,1, -0x3CF1C2,0x00,0x5C,0, -0x3CF202,0x00,0x5C,1, -0x3D360E,0x07,0x5D,1, -0x3D3614,0x07,0x5D,0, -0x3D360C,0xB5,0x7E,1, -0x3D3612,0xB5,0x7E,0, -0x3D3604,0xEF,0x71,0, -0x3D3606,0xEF,0x71,1, -0x3D360A,0xB5,0x7E,1, -0x3D3610,0xB5,0x7E,0, -0x3D1A48,0x84,0x44,0, -0x3D1A46,0xB5,0x7E,0, -0x3D1A44,0xB5,0x7E,0, -0x3D1A4A,0xEF,0x71,0, -0x3D1A88,0x84,0x44,1, -0x3D1A8A,0xCC,0xC4,1, -0x3D1A86,0xB5,0x7E,1, -0x3D1A84,0xB5,0x7E,1, -0x3CE282,0x00,0x5C,0, -0x3CE2C2,0x00,0x5C,1, -0x3CE280,0xB5,0x7E,0, -0x3CE2C0,0xB5,0x7E,1, -0x4FA29E,0x00,0x5C,0, -0x4FA2DE,0x00,0x5C,1, -0x4FA29C,0xB5,0x7E,0, -0x4FA2DC,0xB5,0x7E,1, -0x3D4786,0x0F,0x7E,1, -0x3D478C,0x0F,0x7E,0, -0x3D478E,0xE6,0x54,0, -0x3D4788,0xE6,0x54,1, -0x3D4790,0xE6,0x54,0, -0x3D478A,0x00,0x6C,1, -0x3D4794,0xEF,0x71,0, -0x3D4792,0x00,0x6C,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0x9C,0x7F,1, -0x3C9E40,0x9C,0x7F,0, -0x3C9E38,0x9C,0x7F,1, -0x3C9E3E,0x9C,0x7F,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0x00,0x7C,0, -0x4F4D5E,0x00,0x5C,0, -0x3C9320,0x00,0x7C,0, -0x3C9322,0x00,0x5C,0, -0x9F9CF6,0x00,0x7C,0, -0x9F9CF8,0x00,0x5C,0, -0x4F4E1C,0x00,0x7C,1, -0x4F4E1E,0x00,0x5C,1, -0x3C9450,0x00,0x7C,1, -0x3C9452,0x00,0x5C,1, -0x9F9D74,0x00,0x7C,1, -0x9F9D76,0x00,0x5C,1, -0xA6202E,0x8C,0x5D,0, -0xA62032,0x31,0x7E,0, -0xA62030,0xEF,0x71,0, -0xA62034,0xB5,0x7E,0, -0xA6204E,0x8C,0x5D,1, -0xA62052,0x31,0x7E,1, -0xA62050,0xEF,0x71,1, -0xA62054,0xB5,0x7E,1, -0x3D4812,0x07,0x5D,0, -0x3D480E,0x07,0x5D,1, -0x3D4810,0xB5,0x7E,0, -0x3D480C,0xB5,0x7E,1, -0x3CC9FE,0x00,0x7C,0, -0x3CCA0A,0x00,0x5C,0, -0x8CBE20,0x84,0x44,0, -0x8CBE22,0x00,0x5C,0, -0x8CBE1E,0x0F,0x7E,0, -0x8CBE40,0x84,0x44,1, -0x8CBE42,0x00,0x5C,1, -0x8CBE3E,0x0F,0x7E,1, -0x8CBEE0,0x00,0x7C,0, -0x8CBEDE,0x7B,0x7F,0, -0x8CBEE2,0x00,0x5C,0, -0x3B8F38,0x84,0x44,1, -0x3B8F3A,0x7B,0x7F,1, -0x3B8F40,0x84,0x44,0, -0x3B8F42,0x7B,0x7F,0, -0x3D1094,0xE6,0x54,0, -0x3D109A,0x4A,0x4D,0, -0x3D1098,0x00,0x50,0, -0x3D1096,0x00,0x5C,0, -0x3D1092,0x7B,0x7F,0, -0x3D1090,0xB5,0x7E,0, -0x3D10D4,0xE6,0x54,1, -0x3D10DA,0x4A,0x4D,1, -0x3D10D8,0x00,0x50,1, -0x3D10D6,0x00,0x5C,1, -0x3D10D2,0x7B,0x7F,1, -0x3D10D0,0xB5,0x7E,1, -0x3D14D0,0x00,0x7C,0, -0x3D14D2,0x00,0x5C,0, -0x3D14CE,0xB5,0x7E,0, -0x3D14CC,0x73,0x72,0, -0x3D1510,0x07,0x5D,1, -0x3D1512,0x00,0x5C,1, -0x3D150E,0xB5,0x7E,1, -0x3D150C,0x73,0x72,1, -0x3CE0F4,0x8C,0x5D,1, -0x3CE0F2,0x00,0x70,1, -0x3CE0F0,0x73,0x72,1, -0x3CE0D4,0x8C,0x5D,0, -0x3CE0D2,0x00,0x70,0, -0x3CE0D0,0x73,0x72,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Chaos.txt b/worlds/mlss/colors/Chaos.txt deleted file mode 100644 index d0b69570670e..000000000000 --- a/worlds/mlss/colors/Chaos.txt +++ /dev/null @@ -1,156 +0,0 @@ -0x3CC884,0, -0x3CC886,0, -0x3CC984,0, -0x3CC986,0, -0x3D0E16,0, -0x3D0E18,0, -0x3D0E1A,0, -0x3D4B50,0, -0x3D4B52,0, -0x3D4B54,0, -0x3D4B56,0, -0x4F4CDC,0, -0x4F4CDE,0, -0x4F51DC,0, -0x4F51DE,0, -0x4F51E8,0, -0x4fb684,0, -0x4fb686,0, -0x4fb688,0, -0x4FB786,0, -0x4fb788,0, -0x4fb78a,0, -0x519018,0, -0x51901a,0, -0x51901c,0, -0x5193E8,0, -0x5193EA,0, -0x51A4AC,0, -0x51A4AE,0, -0x51A98C,0, -0x51A98E,0, -0x51AD2C,0, -0x51AD2E,0, -0x9F9A28,0, -0x9F9A2A,0, -0x9F9A2C,0, -0x9F9A34,0, -0x9F9A36,0, -0x9F9A38,0, -0x9F9A48,0, -0x9F9A4A,0, -0x9F9A4C,0, -0x9F9A56,0, -0x9F9A58,0, -0xA5DD3E,0, -0xA5DD40,0, -0xA5DD42,0, -0xA5DD44,0, -0xA5DD46,0, -0xA5DD48,0, -0xA5DD4A,0, -0x3CC8C4,1, -0x3CC8C6,1, -0x3D0E08,1, -0x3D0E0A,1, -0x3D0E0C,1, -0x4F4D1C,1, -0x4F4D1E,1, -0x4F51D8,1, -0x4F51DA,1, -0x4F51EA,1, -0x4fb6a4,1, -0x4fb6a6,1, -0x4fb6a8,1, -0x4FB7A6,1, -0x4FB7A8,1, -0x4FB7AA,1, -0x519038,1, -0x51903A,1, -0x51903c,1, -0x519408,1, -0x51940a,1, -0x51A4CC,1, -0x51A4CE,1, -0x51A96C,1, -0x51A96E,1, -0x51AD4C,1, -0x51AD4E,1, -0x9F9A2E,1, -0x9F9A30,1, -0x9F9A32,1, -0x9F9A3A,1, -0x9F9A3C,1, -0x9F9A3E,1, -0x9F9A4E,1, -0x9F9A50,1, -0x9F9A52,1, -0x9F9A5C,1, -0x9F9A5E,1, -0xA5DD5E,1, -0xA5DD60,1, -0xA5DD62,1, -0xA5DD64,1, -0xA5DD66,1, -0xA5DD68,1, -0xA5DD6A,1, -0x3A7256,0, -0x3A7252,0, -0x3A724E,0, -0x3A724A,0, -0x3A7296,0, -0x3A7294,0, -0x3A7290,0, -0x3A7244,0, -0x3A728C,0, -0x3A7288,0, -0x3A7286,0, -0x3A7254,1, -0x3A7264,1, -0x3A727C,1, -0x3A72BC,1, -0x3A727A,1, -0x3A7278,1, -0x3A7274,1, -0x3A724C,1, -0x3A72B2,1, -0x3A72AE,1, -0x3A7272,1, -0x3A7270,1, -0x3A726C,1, -0xA5DDA2,0, -0xA5DDA4,0, -0xA5DDA6,0, -0xA5DDA8,0, -0x3D3E10,0, -0x3D3E12,0, -0x3D504A,0, -0x3D504C,0, -0x3D504E,0, -0x3D4B5C,0, -0xA5DDC2,1, -0xA5DDC4,1, -0xA5DDC6,1, -0xA5DDC8,1, -0x3D3E0C,1, -0x3D3E0E,1, -0x3D508A,1, -0x3D508C,1, -0x3D508E,1, -0x51A9FE,0, -0x51AA00,0, -0x51AA02,0, -0x51AA0A,0, -0x51AA0E,1, -0x51AA10,1, -0x51AA12,1, -0x3CFB3C,0, -0x3CFB3E,0, -0x3CC9C4,0, -0x3CC9C6,0, -0x3CFB7C,1, -0x3CFB7E,1, -0x3CCA44,1, -0x3CCA46,1, -0x3CDE7C,1, -0x3CDE7E,1, \ No newline at end of file diff --git a/worlds/mlss/colors/Cyan.txt b/worlds/mlss/colors/Cyan.txt deleted file mode 100644 index 3c7fd1e5f44a..000000000000 --- a/worlds/mlss/colors/Cyan.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0xED,0x7F,0, -0x3CC886,0x8B,0x73,0, -0x3CC8C4,0xED,0x7F,1, -0x3CC8C6,0x8B,0x73,1, -0x4F4CDC,0xED,0x7F,0, -0x4F4CDE,0x8B,0x73,0, -0x4F4D1C,0xED,0x7F,1, -0x4F4D1E,0x8B,0x73,1, -0x4F51D8,0xED,0x7F,1, -0x4F51DC,0xED,0x7F,0, -0x4F51E8,0xD6,0x7B,0, -0x4F51EA,0xD6,0x7B,1, -0x4F51DA,0xFA,0x7F,1, -0x4F51DE,0xFA,0x7F,0, -0x4FB686,0xED,0x7F,0, -0x4FB6A6,0xED,0x7F,1, -0x4FB684,0x8E,0x52,0, -0x4FB6A4,0x8E,0x52,1, -0x4FB688,0xFA,0x7F,0, -0x4FB6A8,0xFA,0x7F,1, -0x4FB786,0x8B,0x73,0, -0x4FB788,0xED,0x7F,0, -0x4FB78A,0xFA,0x7F,0, -0x4FB7A6,0x8B,0x73,1, -0x4FB7A8,0xED,0x7F,1, -0x4FB7AA,0xFA,0x7F,1, -0x51901C,0xED,0x7F,0, -0x519018,0xC9,0x5A,0, -0x51901A,0x8B,0x77,0, -0x51903C,0xED,0x7F,1, -0x519038,0xC9,0x5A,1, -0x51903A,0x8B,0x77,1, -0x5193EA,0x8B,0x73,0, -0x5193E8,0xED,0x7F,0, -0x51940A,0x8B,0x73,1, -0x519408,0xED,0x7F,1, -0x3A72AE,0x60,0x6F,1, -0x3A7244,0x20,0x67,0, -0x3A724C,0x60,0x6F,1, -0x3A7290,0x40,0x6B,0, -0x3A72B2,0xA0,0x77,1, -0x3A7270,0xC0,0x5A,1, -0x3A7288,0xC0,0x5A,0, -0x3A7296,0x80,0x73,0, -0x3A7274,0x80,0x73,1, -0x3A7294,0x60,0x6F,0, -0x3A724A,0xA0,0x77,0, -0x3A7278,0xA0,0x77,1, -0x3A724E,0xC0,0x7B,0, -0x3A727A,0xC0,0x7B,1, -0x3A7252,0xE0,0x7F,0, -0x3A727C,0xE0,0x7F,1, -0x3A72BC,0xE0,0x7F,1, -0x3A726C,0x80,0x52,1, -0x3A7286,0x80,0x52,0, -0x3A728C,0x00,0x63,0, -0x3A7272,0x00,0x63,1, -0x3A7254,0xF3,0x7F,1, -0x3A7256,0xF3,0x7F,0, -0x3A7264,0xF3,0x7F,1, -0x9F9A58,0x56,0x6B,0, -0x9F9A5E,0x56,0x6B,1, -0x9F9A2A,0xED,0x7F,0, -0x9F9A30,0xED,0x7F,1, -0x9F9A36,0xCC,0x7B,0, -0x9F9A3C,0xCC,0x7B,1, -0x9F9A4A,0xCC,0x7B,0, -0x9F9A50,0xCC,0x7B,1, -0x9F9A56,0x0A,0x63,0, -0x9F9A5C,0x0A,0x63,1, -0x9F9A28,0x8E,0x52,0, -0x9F9A2E,0x8E,0x52,1, -0x9F9A48,0x8E,0x52,0, -0x9F9A4E,0x8E,0x52,1, -0x9F9A34,0x8B,0x73,0, -0x9F9A3A,0x8B,0x73,1, -0x9F9A2C,0xFA,0x7F,0, -0x9F9A32,0xFA,0x7F,1, -0x9F9A38,0xFA,0x7F,0, -0x9F9A3E,0xFA,0x7F,1, -0x9F9A4C,0xFA,0x7F,0, -0x9F9A52,0xFA,0x7F,1, -0xA5DD46,0xAC,0x56,0, -0xA5DD44,0x2A,0x46,0, -0xA5DD4A,0x90,0x73,0, -0xA5DD3E,0x80,0x52,0, -0xA5DD40,0xF2,0x7F,0, -0xA5DD42,0xFC,0x7F,0, -0xA5DD48,0x2F,0x67,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0xAC,0x56,1, -0xA5DD64,0x2A,0x46,1, -0xA5DD6A,0x90,0x73,1, -0xA5DD5E,0x80,0x52,1, -0xA5DD60,0xF2,0x7F,1, -0xA5DD62,0xFC,0x7F,1, -0xA5DD68,0x2F,0x67,1, -0x3D0E0C,0xED,0x7F,1, -0x3D0E18,0xED,0x7F,0, -0x3D0E0A,0x8B,0x73,1, -0x3D0E1A,0x8B,0x73,0, -0x3D0E08,0xFA,0x7F,1, -0x3D0E16,0xFA,0x7F,0, -0x3CC9C4,0xED,0x7F,0, -0x3CC9C6,0x8B,0x73,0, -0x3CDE7C,0xED,0x7F,1, -0x3CDE7E,0x8B,0x73,1, -0x51AD2C,0xED,0x7F,0, -0x51AD2E,0x8B,0x73,0, -0x51AD4C,0xED,0x7F,1, -0x51AD4E,0x8B,0x73,1, -0x51A4AE,0x8B,0x73,0, -0x51A4AC,0xED,0x7F,0, -0x51A4CC,0xED,0x7F,1, -0x51A4CE,0x8B,0x73,1, -0x51A98C,0xED,0x7F,0, -0x51A98E,0x8B,0x73,0, -0x51A96C,0xED,0x7F,1, -0x51A96E,0x8B,0x73,1, -0x51AA00,0x8B,0x73,0, -0x51AA10,0x8B,0x73,1, -0x51AA02,0xA8,0x56,0, -0x51AA12,0xA8,0x56,1, -0x51A9FE,0xED,0x7F,0, -0x51AA0E,0xED,0x7F,1, -0x51AA0A,0xF3,0x7F,0, -0x3CC984,0xED,0x7F,0, -0x3CC986,0x8B,0x73,0, -0x3D4B52,0xAB,0x77,0, -0x3D4B5C,0x09,0x63,0, -0x3D4B54,0xED,0x7F,0, -0x3D4B56,0x8B,0x73,0, -0x3D4B50,0xFA,0x7F,0, -0x3CCA44,0xED,0x7F,1, -0x3CCA46,0x8B,0x73,1, -0x3CFB3C,0xED,0x7F,0, -0x3CFB3E,0x8B,0x73,0, -0x3CFB7C,0xED,0x7F,1, -0x3CFB7E,0x8B,0x73,1, -0x3D504C,0xAC,0x77,0, -0x3D504A,0xED,0x7F,0, -0x3D504E,0x8B,0x73,0, -0x3D508C,0xAC,0x77,1, -0x3D508A,0xED,0x7F,1, -0x3D508E,0x8B,0x73,1, -0xA5DDA2,0xAC,0x56,0, -0xA5DDC2,0xAC,0x56,1, -0xA5DDA6,0x90,0x73,0, -0xA5DDC6,0x90,0x73,1, -0xA5DDA4,0x2F,0x67,0, -0xA5DDC4,0x2F,0x67,1, -0xA5DDA8,0x97,0x73,0, -0xA5DDC8,0x97,0x73,1, -0x3D3E0C,0xED,0x7F,1, -0x3D3E10,0xED,0x7F,0, -0x3D3E0E,0x8B,0x73,1, -0x3D3E12,0x8B,0x73,0, -0x3CF1C0,0xED,0x7F,0, -0x3CF200,0xED,0x7F,1, -0x3CF1C2,0x8B,0x73,0, -0x3CF202,0x8B,0x73,1, -0x3D360E,0x60,0x6F,1, -0x3D3614,0x60,0x6F,0, -0x3D360C,0xFA,0x7F,1, -0x3D3612,0xFA,0x7F,0, -0x3D3604,0x2F,0x67,0, -0x3D3606,0x2F,0x67,1, -0x3D360A,0xFA,0x7F,1, -0x3D3610,0xFA,0x7F,0, -0x3D1A48,0x00,0x63,0, -0x3D1A46,0xFA,0x7F,0, -0x3D1A44,0xFA,0x7F,0, -0x3D1A4A,0x2F,0x67,0, -0x3D1A88,0x00,0x63,1, -0x3D1A8A,0xBB,0xB8,1, -0x3D1A86,0xFA,0x7F,1, -0x3D1A84,0xFA,0x7F,1, -0x3CE282,0x8B,0x73,0, -0x3CE2C2,0x8B,0x73,1, -0x3CE280,0xFA,0x7F,0, -0x3CE2C0,0xFA,0x7F,1, -0x4FA29E,0x8B,0x73,0, -0x4FA2DE,0x8B,0x73,1, -0x4FA29C,0xFA,0x7F,0, -0x4FA2DC,0xFA,0x7F,1, -0x3D4786,0xF3,0x7F,1, -0x3D478C,0xF3,0x7F,0, -0x3D478E,0x40,0x6B,0, -0x3D4788,0x40,0x6B,1, -0x3D4790,0x40,0x6B,0, -0x3D478A,0xAC,0x77,1, -0x3D4794,0x2F,0x67,0, -0x3D4792,0xAC,0x77,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0xFA,0x7F,1, -0x3C9E40,0xFA,0x7F,0, -0x3C9E38,0xFA,0x7F,1, -0x3C9E3E,0xFA,0x7F,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0xED,0x7F,0, -0x4F4D5E,0x8B,0x73,0, -0x3C9320,0xED,0x7F,0, -0x3C9322,0x8B,0x73,0, -0x9F9CF6,0xED,0x7F,0, -0x9F9CF8,0x8B,0x73,0, -0x4F4E1C,0xED,0x7F,1, -0x4F4E1E,0x8B,0x73,1, -0x3C9450,0xED,0x7F,1, -0x3C9452,0x8B,0x73,1, -0x9F9D74,0xED,0x7F,1, -0x9F9D76,0x8B,0x73,1, -0xA6202E,0xAC,0x56,0, -0xA62032,0x90,0x73,0, -0xA62030,0x2F,0x67,0, -0xA62034,0x97,0x73,0, -0xA6204E,0xAC,0x56,1, -0xA62052,0x90,0x73,1, -0xA62050,0x2F,0x67,1, -0xA62054,0x97,0x73,1, -0x3D4812,0x60,0x6F,0, -0x3D480E,0x60,0x6F,1, -0x3D4810,0xFA,0x7F,0, -0x3D480C,0xFA,0x7F,1, -0x3CC9FE,0xED,0x7F,0, -0x3CCA0A,0x8B,0x73,0, -0x8CBE20,0x00,0x63,0, -0x8CBE22,0x8B,0x73,0, -0x8CBE1E,0xF3,0x7F,0, -0x8CBE40,0x00,0x63,1, -0x8CBE42,0x8B,0x73,1, -0x8CBE3E,0xF3,0x7F,1, -0x8CBEE0,0xED,0x7F,0, -0x8CBEDE,0xFC,0x7F,0, -0x8CBEE2,0x8B,0x73,0, -0x3B8F38,0x00,0x63,1, -0x3B8F3A,0xFC,0x7F,1, -0x3B8F40,0x00,0x63,0, -0x3B8F42,0xFC,0x7F,0, -0x3D1094,0x40,0x6B,0, -0x3D109A,0x2A,0x46,0, -0x3D1098,0xC9,0x5A,0, -0x3D1096,0x8B,0x77,0, -0x3D1092,0xFC,0x7F,0, -0x3D1090,0xFA,0x7F,0, -0x3D10D4,0x40,0x6B,1, -0x3D10DA,0x2A,0x46,1, -0x3D10D8,0xC9,0x5A,1, -0x3D10D6,0x8B,0x77,1, -0x3D10D2,0xFC,0x7F,1, -0x3D10D0,0xFA,0x7F,1, -0x3D14D0,0xED,0x7F,0, -0x3D14D2,0x8B,0x73,0, -0x3D14CE,0xFA,0x7F,0, -0x3D14CC,0xD6,0x7B,0, -0x3D1510,0x60,0x6F,1, -0x3D1512,0x8B,0x73,1, -0x3D150E,0xFA,0x7F,1, -0x3D150C,0xD6,0x7B,1, -0x3CE0F4,0xAC,0x56,1, -0x3CE0F2,0x8B,0x73,1, -0x3CE0F0,0xD6,0x7B,1, -0x3CE0D4,0xAC,0x56,0, -0x3CE0D2,0x8B,0x73,0, -0x3CE0D0,0xD6,0x7B,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Green.txt b/worlds/mlss/colors/Green.txt deleted file mode 100644 index 59a2a56cdd94..000000000000 --- a/worlds/mlss/colors/Green.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0xA3,0x03,0, -0x3CC886,0xE0,0x02,0, -0x3CC8C4,0xA3,0x03,1, -0x3CC8C6,0xE0,0x02,1, -0x4F4CDC,0xA3,0x03,0, -0x4F4CDE,0xE0,0x02,0, -0x4F4D1C,0xA3,0x03,1, -0x4F4D1E,0xE0,0x02,1, -0x4F51D8,0xA3,0x03,1, -0x4F51DC,0xA3,0x03,0, -0x4F51E8,0xB1,0x3B,0, -0x4F51EA,0xB1,0x3B,1, -0x4F51DA,0xF3,0x43,1, -0x4F51DE,0xF3,0x43,0, -0x4FB686,0xA3,0x03,0, -0x4FB6A6,0xA3,0x03,1, -0x4FB684,0xC2,0x01,0, -0x4FB6A4,0xC2,0x01,1, -0x4FB688,0xF6,0x5B,0, -0x4FB6A8,0xF6,0x5B,1, -0x4FB786,0xA3,0x03,0, -0x4FB788,0xF6,0x5B,0, -0x4FB78A,0xFB,0x6F,0, -0x4FB7A6,0xA3,0x03,1, -0x4FB7A8,0xF6,0x5B,1, -0x4FB7AA,0xFB,0x6F,1, -0x51901C,0xA3,0x03,0, -0x519018,0xE0,0x01,0, -0x51901A,0xE0,0x02,0, -0x51903C,0xA3,0x03,1, -0x519038,0xE0,0x01,1, -0x51903A,0xE0,0x02,1, -0x5193EA,0xA0,0x02,0, -0x5193E8,0xA3,0x03,0, -0x51940A,0xA0,0x02,1, -0x519408,0xA3,0x03,1, -0x3A72AE,0x26,0x43,1, -0x3A7244,0x26,0x43,0, -0x3A724C,0x34,0x2F,1, -0x3A7290,0x4C,0x3F,0, -0x3A72B2,0x4C,0x3F,1, -0x3A7270,0x4E,0x2E,1, -0x3A7288,0x4E,0x2E,0, -0x3A7296,0x6D,0x3F,0, -0x3A7274,0x6D,0x3F,1, -0x3A7294,0x70,0x3B,0, -0x3A724A,0x8F,0x3B,0, -0x3A7278,0x8F,0x3B,1, -0x3A724E,0xB4,0x33,0, -0x3A727A,0xB4,0x33,1, -0x3A7252,0xD7,0x2B,0, -0x3A727C,0xD7,0x2B,1, -0x3A72BC,0xD7,0x2B,1, -0x3A726C,0xEC,0x29,1, -0x3A7286,0xEC,0x29,0, -0x3A728C,0xF0,0x36,0, -0x3A7272,0xF0,0x36,1, -0x3A7254,0xF9,0x33,1, -0x3A7256,0xF9,0x33,0, -0x3A7264,0xF9,0x33,1, -0x9F9A58,0x0C,0x32,0, -0x9F9A5E,0x0C,0x32,1, -0x9F9A2A,0xA3,0x03,0, -0x9F9A30,0xA3,0x03,1, -0x9F9A36,0xA3,0x03,0, -0x9F9A3C,0xA3,0x03,1, -0x9F9A4A,0xA3,0x03,0, -0x9F9A50,0xA3,0x03,1, -0x9F9A56,0xC1,0x01,0, -0x9F9A5C,0xC1,0x01,1, -0x9F9A28,0xC2,0x01,0, -0x9F9A2E,0xC2,0x01,1, -0x9F9A48,0xC2,0x01,0, -0x9F9A4E,0xC2,0x01,1, -0x9F9A34,0xE2,0x02,0, -0x9F9A3A,0xE2,0x02,1, -0x9F9A2C,0xF6,0x5B,0, -0x9F9A32,0xF6,0x5B,1, -0x9F9A38,0xF6,0x5B,0, -0x9F9A3E,0xF6,0x5B,1, -0x9F9A4C,0xF6,0x5B,0, -0x9F9A52,0xF6,0x5B,1, -0xA5DD46,0x24,0x1E,0, -0xA5DD44,0x82,0x19,0, -0xA5DD4A,0x89,0x3F,0, -0xA5DD3E,0xA9,0x2D,0, -0xA5DD40,0xB0,0x57,0, -0xA5DD42,0xD5,0x5F,0, -0xA5DD48,0xE7,0x32,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x24,0x1E,1, -0xA5DD64,0x82,0x19,1, -0xA5DD6A,0x89,0x3F,1, -0xA5DD5E,0xA9,0x2D,1, -0xA5DD60,0xB0,0x57,1, -0xA5DD62,0xD5,0x5F,1, -0xA5DD68,0xE7,0x32,1, -0x3D0E0C,0xA3,0x03,1, -0x3D0E18,0xA3,0x03,0, -0x3D0E0A,0xE0,0x02,1, -0x3D0E1A,0xE0,0x02,0, -0x3D0E08,0xF6,0x5B,1, -0x3D0E16,0xF6,0x5B,0, -0x3CC9C4,0xA3,0x03,0, -0x3CC9C6,0xE0,0x02,0, -0x3CDE7C,0xA3,0x03,1, -0x3CDE7E,0xE0,0x02,1, -0x51AD2C,0xA3,0x03,0, -0x51AD2E,0xE0,0x02,0, -0x51AD4C,0xA3,0x03,1, -0x51AD4E,0xE0,0x02,1, -0x51A4AE,0xA0,0x02,0, -0x51A4AC,0xA3,0x03,0, -0x51A4CC,0xA3,0x03,1, -0x51A4CE,0xE0,0x02,1, -0x51A98C,0xA3,0x03,0, -0x51A98E,0xE0,0x02,0, -0x51A96C,0xA3,0x03,1, -0x51A96E,0xE0,0x02,1, -0x51AA00,0x60,0x02,0, -0x51AA10,0x60,0x02,1, -0x51AA02,0x61,0x01,0, -0x51AA12,0x61,0x01,1, -0x51A9FE,0xA3,0x03,0, -0x51AA0E,0xA3,0x03,1, -0x51AA0A,0xF0,0x3B,0, -0x3CC984,0xA3,0x03,0, -0x3CC986,0xE0,0x02,0, -0x3D4B52,0x43,0x03,0, -0x3D4B5C,0x60,0x02,0, -0x3D4B54,0xA3,0x03,0, -0x3D4B56,0xE0,0x02,0, -0x3D4B50,0xF6,0x5B,0, -0x3CCA44,0xA3,0x03,1, -0x3CCA46,0xE0,0x02,1, -0x3CFB3C,0xA3,0x03,0, -0x3CFB3E,0xE0,0x02,0, -0x3CFB7C,0xA3,0x03,1, -0x3CFB7E,0xE0,0x02,1, -0x3D504C,0x41,0x03,0, -0x3D504A,0xA3,0x03,0, -0x3D504E,0xE0,0x02,0, -0x3D508C,0x41,0x03,1, -0x3D508A,0xA3,0x03,1, -0x3D508E,0xE0,0x02,1, -0xA5DDA2,0x24,0x1E,0, -0xA5DDC2,0x24,0x1E,1, -0xA5DDA6,0x89,0x3F,0, -0xA5DDC6,0x89,0x3F,1, -0xA5DDA4,0xE7,0x32,0, -0xA5DDC4,0xE7,0x32,1, -0xA5DDA8,0xF6,0x63,0, -0xA5DDC8,0xF6,0x63,1, -0x3D3E0C,0xA3,0x03,1, -0x3D3E10,0xA3,0x03,0, -0x3D3E0E,0xE0,0x02,1, -0x3D3E12,0xE0,0x02,0, -0x3CF1C0,0xA3,0x03,0, -0x3CF200,0xA3,0x03,1, -0x3CF1C2,0xE0,0x02,0, -0x3CF202,0xE0,0x02,1, -0x3D360E,0x00,0x43,1, -0x3D3614,0x00,0x43,0, -0x3D360C,0x80,0x4F,1, -0x3D3612,0x80,0x4F,0, -0x3D3604,0xC1,0x01,0, -0x3D3606,0xC1,0x01,1, -0x3D360A,0xE3,0x63,1, -0x3D3610,0xE3,0x63,0, -0x3D1A48,0x28,0x1B,0, -0x3D1A46,0xF6,0x5B,0, -0x3D1A44,0xFC,0x5F,0, -0x3D1A4A,0xE7,0x32,0, -0x3D1A88,0x28,0x1B,1, -0x3D1A8A,0x81,0x02,1, -0x3D1A86,0xF6,0x5B,1, -0x3D1A84,0xFC,0x5F,1, -0x3CE282,0xA0,0x36,0, -0x3CE2C2,0xA0,0x36,1, -0x3CE280,0xE0,0x4F,0, -0x3CE2C0,0xE0,0x4F,1, -0x4FA29E,0xA0,0x36,0, -0x4FA2DE,0xA0,0x36,1, -0x4FA29C,0xE0,0x4F,0, -0x4FA2DC,0xE0,0x4F,1, -0x3D4786,0xA0,0x07,1, -0x3D478C,0xA0,0x07,0, -0x3D478E,0xC0,0x02,0, -0x3D4788,0xC0,0x02,1, -0x3D4790,0xC0,0x02,0, -0x3D478A,0xE0,0x01,1, -0x3D4794,0xE7,0x32,0, -0x3D4792,0xE7,0x32,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0xF2,0x73,1, -0x3C9E40,0xF2,0x73,0, -0x3C9E38,0xF6,0x77,1, -0x3C9E3E,0xF6,0x77,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0xA3,0x03,0, -0x4F4D5E,0xE0,0x02,0, -0x3C9320,0xA3,0x03,0, -0x3C9322,0xE0,0x02,0, -0x9F9CF6,0xA3,0x03,0, -0x9F9CF8,0xE0,0x02,0, -0x4F4E1C,0xA3,0x03,1, -0x4F4E1E,0xE0,0x02,1, -0x3C9450,0xA3,0x03,1, -0x3C9452,0xE0,0x02,1, -0x9F9D74,0xA3,0x03,1, -0x9F9D76,0xE0,0x02,1, -0xA6202E,0x24,0x1E,0, -0xA62032,0x89,0x3F,0, -0xA62030,0xE7,0x32,0, -0xA62034,0xF6,0x63,0, -0xA6204E,0x24,0x1E,1, -0xA62052,0x89,0x3F,1, -0xA62050,0xE7,0x32,1, -0xA62054,0xF6,0x63,1, -0x3D4812,0x64,0x3B,0, -0x3D480E,0x64,0x3B,1, -0x3D4810,0xEF,0x57,0, -0x3D480C,0xEF,0x57,1, -0x3CC9FE,0xA3,0x03,0, -0x3CCA0A,0xE0,0x02,0, -0x8CBE20,0x4D,0x33,0, -0x8CBE22,0xA7,0x2A,0, -0x8CBE1E,0xD3,0x3F,0, -0x8CBE40,0x4D,0x33,1, -0x8CBE42,0xA7,0x2A,1, -0x8CBE3E,0xD3,0x3F,1, -0x8CBEE0,0xA3,0x03,0, -0x8CBEDE,0xD5,0x5F,0, -0x8CBEE2,0xE0,0x02,0, -0x3B8F38,0x20,0x17,1, -0x3B8F3A,0xD3,0x63,1, -0x3B8F40,0x20,0x17,0, -0x3B8F42,0xD3,0x63,0, -0x3D1094,0x46,0x1B,0, -0x3D109A,0x80,0x01,0, -0x3D1098,0xE0,0x01,0, -0x3D1096,0xE0,0x02,0, -0x3D1092,0xED,0x33,0, -0x3D1090,0xFA,0x67,0, -0x3D10D4,0x46,0x1B,1, -0x3D10DA,0x80,0x01,1, -0x3D10D8,0xE0,0x01,1, -0x3D10D6,0xE0,0x02,1, -0x3D10D2,0xED,0x33,1, -0x3D10D0,0xFA,0x67,1, -0x3D14D0,0xA3,0x03,0, -0x3D14D2,0xE0,0x02,0, -0x3D14CE,0xF6,0x5B,0, -0x3D14CC,0xF2,0x4B,0, -0x3D1510,0x40,0x03,1, -0x3D1512,0xA0,0x02,1, -0x3D150E,0xF6,0x5B,1, -0x3D150C,0xF2,0x4B,1, -0x3CE0F4,0x40,0x2A,1, -0x3CE0F2,0x42,0x2B,1, -0x3CE0F0,0xF0,0x3F,1, -0x3CE0D4,0x40,0x2A,0, -0x3CE0D2,0x42,0x2B,0, -0x3CE0D0,0xF0,0x3F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Orange.txt b/worlds/mlss/colors/Orange.txt deleted file mode 100644 index f3ba15f59b46..000000000000 --- a/worlds/mlss/colors/Orange.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0x7F,0x02,0, -0x3CC886,0x3C,0x02,0, -0x3CC8C4,0x7F,0x02,1, -0x3CC8C6,0x3C,0x02,1, -0x4F4CDC,0x7F,0x02,0, -0x4F4CDE,0x3C,0x02,0, -0x4F4D1C,0x7F,0x02,1, -0x4F4D1E,0x3C,0x02,1, -0x4F51D8,0x7F,0x02,1, -0x4F51DC,0x7F,0x02,0, -0x4F51E8,0xFE,0x42,0, -0x4F51EA,0xFE,0x42,1, -0x4F51DA,0x3E,0x43,1, -0x4F51DE,0x3E,0x43,0, -0x4FB686,0x7F,0x02,0, -0x4FB6A6,0x7F,0x02,1, -0x4FB684,0x95,0x01,0, -0x4FB6A4,0x95,0x01,1, -0x4FB688,0x5E,0x53,0, -0x4FB6A8,0x5E,0x53,1, -0x4FB786,0x7F,0x02,0, -0x4FB788,0x5E,0x53,0, -0x4FB78A,0x9D,0x6B,0, -0x4FB7A6,0x7F,0x02,1, -0x4FB7A8,0x5E,0x53,1, -0x4FB7AA,0x9D,0x6B,1, -0x51901C,0x7F,0x02,0, -0x519018,0x3C,0x01,0, -0x51901A,0x3C,0x02,0, -0x51903C,0x7F,0x02,1, -0x519038,0x3C,0x01,1, -0x51903A,0x3C,0x02,1, -0x5193EA,0x3C,0x02,0, -0x5193E8,0x7F,0x02,0, -0x51940A,0x3C,0x02,1, -0x519408,0x7F,0x02,1, -0x3A72AE,0x56,0x02,1, -0x3A7244,0x56,0x02,0, -0x3A724C,0xBA,0x02,1, -0x3A7290,0x98,0x02,0, -0x3A72B2,0x98,0x02,1, -0x3A7270,0x14,0x02,1, -0x3A7288,0x14,0x02,0, -0x3A7296,0xB9,0x02,0, -0x3A7274,0xB9,0x02,1, -0x3A7294,0xBA,0x02,0, -0x3A724A,0xDA,0x02,0, -0x3A7278,0xDA,0x02,1, -0x3A724E,0xFC,0x02,0, -0x3A727A,0xFC,0x02,1, -0x3A7252,0x3E,0x03,0, -0x3A727C,0x3E,0x03,1, -0x3A72BC,0x3E,0x03,1, -0x3A726C,0xD1,0x01,1, -0x3A7286,0xD1,0x01,0, -0x3A728C,0x35,0x02,0, -0x3A7272,0x35,0x02,1, -0x3A7254,0x5F,0x03,1, -0x3A7256,0x5F,0x03,0, -0x3A7264,0x5F,0x03,1, -0x9F9A58,0x76,0x3E,0, -0x9F9A5E,0x76,0x3E,1, -0x9F9A2A,0x7F,0x02,0, -0x9F9A30,0x7F,0x02,1, -0x9F9A36,0x7F,0x02,0, -0x9F9A3C,0x7F,0x02,1, -0x9F9A4A,0x7F,0x02,0, -0x9F9A50,0x7F,0x02,1, -0x9F9A56,0xB6,0x01,0, -0x9F9A5C,0xB6,0x01,1, -0x9F9A28,0x95,0x01,0, -0x9F9A2E,0x95,0x01,1, -0x9F9A48,0x95,0x01,0, -0x9F9A4E,0x95,0x01,1, -0x9F9A34,0x3C,0x02,0, -0x9F9A3A,0x3C,0x02,1, -0x9F9A2C,0x5E,0x53,0, -0x9F9A32,0x5E,0x53,1, -0x9F9A38,0x5E,0x53,0, -0x9F9A3E,0x5E,0x53,1, -0x9F9A4C,0x5E,0x53,0, -0x9F9A52,0x5E,0x53,1, -0xA5DD46,0x36,0x26,0, -0xA5DD44,0x8F,0x19,0, -0xA5DD4A,0x1F,0x37,0, -0xA5DD3E,0x6D,0x1D,0, -0xA5DD40,0xBF,0x5B,0, -0xA5DD42,0xDF,0x67,0, -0xA5DD48,0xBB,0x2E,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x36,0x26,1, -0xA5DD64,0x8F,0x19,1, -0xA5DD6A,0x1F,0x37,1, -0xA5DD5E,0x6D,0x1D,1, -0xA5DD60,0xBF,0x5B,1, -0xA5DD62,0xDF,0x67,1, -0xA5DD68,0xBB,0x2E,1, -0x3D0E0C,0x7F,0x02,1, -0x3D0E18,0x7F,0x02,0, -0x3D0E0A,0x3C,0x02,1, -0x3D0E1A,0x3C,0x02,0, -0x3D0E08,0x5E,0x53,1, -0x3D0E16,0x5E,0x53,0, -0x3CC9C4,0x7F,0x02,0, -0x3CC9C6,0x3C,0x02,0, -0x3CDE7C,0x7F,0x02,1, -0x3CDE7E,0x3C,0x02,1, -0x51AD2C,0x7F,0x02,0, -0x51AD2E,0x3C,0x02,0, -0x51AD4C,0x7F,0x02,1, -0x51AD4E,0x3C,0x02,1, -0x51A4AE,0x3C,0x02,0, -0x51A4AC,0x7F,0x02,0, -0x51A4CC,0x7F,0x02,1, -0x51A4CE,0x3C,0x02,1, -0x51A98C,0x7F,0x02,0, -0x51A98E,0x3C,0x02,0, -0x51A96C,0x7F,0x02,1, -0x51A96E,0x3C,0x02,1, -0x51AA00,0x3D,0x02,0, -0x51AA10,0x3D,0x02,1, -0x51AA02,0xB5,0x01,0, -0x51AA12,0xB5,0x01,1, -0x51A9FE,0x7F,0x02,0, -0x51AA0E,0x7F,0x02,1, -0x51AA0A,0x5E,0x4F,0, -0x3CC984,0x7F,0x02,0, -0x3CC986,0x3C,0x02,0, -0x3D4B52,0x3D,0x02,0, -0x3D4B5C,0xFA,0x01,0, -0x3D4B54,0x7F,0x02,0, -0x3D4B56,0x3C,0x02,0, -0x3D4B50,0x5E,0x53,0, -0x3CCA44,0x7F,0x02,1, -0x3CCA46,0x3C,0x02,1, -0x3CFB3C,0x7F,0x02,0, -0x3CFB3E,0x3C,0x02,0, -0x3CFB7C,0x7F,0x02,1, -0x3CFB7E,0x3C,0x02,1, -0x3D504C,0x3D,0x02,0, -0x3D504A,0x7F,0x02,0, -0x3D504E,0x3C,0x02,0, -0x3D508C,0x3D,0x02,1, -0x3D508A,0x7F,0x02,1, -0x3D508E,0x3C,0x02,1, -0xA5DDA2,0x36,0x26,0, -0xA5DDC2,0x36,0x26,1, -0xA5DDA6,0x1F,0x37,0, -0xA5DDC6,0x1F,0x37,1, -0xA5DDA4,0xBB,0x2E,0, -0xA5DDC4,0xBB,0x2E,1, -0xA5DDA8,0x5E,0x53,0, -0xA5DDC8,0x5E,0x53,1, -0x3D3E0C,0x7F,0x02,1, -0x3D3E10,0x7F,0x02,0, -0x3D3E0E,0x3C,0x02,1, -0x3D3E12,0x3C,0x02,0, -0x3CF1C0,0x7F,0x02,0, -0x3CF200,0x7F,0x02,1, -0x3CF1C2,0x3C,0x02,0, -0x3CF202,0x3C,0x02,1, -0x3D360E,0xBA,0x02,1, -0x3D3614,0xBA,0x02,0, -0x3D360C,0x3E,0x43,1, -0x3D3612,0x3E,0x43,0, -0x3D3604,0xBB,0x2E,0, -0x3D3606,0xBB,0x2E,1, -0x3D360A,0x5E,0x53,1, -0x3D3610,0x5E,0x53,0, -0x3D1A48,0x35,0x02,0, -0x3D1A46,0x5E,0x53,0, -0x3D1A44,0x5E,0x53,0, -0x3D1A4A,0xBB,0x2E,0, -0x3D1A88,0x35,0x02,1, -0x3D1A8A,0xDD,0xD4,1, -0x3D1A86,0x5E,0x53,1, -0x3D1A84,0x5E,0x53,1, -0x3CE282,0x3C,0x02,0, -0x3CE2C2,0x3C,0x02,1, -0x3CE280,0x5E,0x53,0, -0x3CE2C0,0x5E,0x53,1, -0x4FA29E,0x3C,0x02,0, -0x4FA2DE,0x3C,0x02,1, -0x4FA29C,0x5E,0x53,0, -0x4FA2DC,0x5E,0x53,1, -0x3D4786,0x5F,0x03,1, -0x3D478C,0x5F,0x03,0, -0x3D478E,0x98,0x02,0, -0x3D4788,0x98,0x02,1, -0x3D4790,0x98,0x02,0, -0x3D478A,0x3D,0x02,1, -0x3D4794,0xBB,0x2E,0, -0x3D4792,0x3D,0x02,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0x9D,0x6B,1, -0x3C9E40,0x9D,0x6B,0, -0x3C9E38,0x9D,0x6B,1, -0x3C9E3E,0x9D,0x6B,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0x7F,0x02,0, -0x4F4D5E,0x3C,0x02,0, -0x3C9320,0x7F,0x02,0, -0x3C9322,0x3C,0x02,0, -0x9F9CF6,0x7F,0x02,0, -0x9F9CF8,0x3C,0x02,0, -0x4F4E1C,0x7F,0x02,1, -0x4F4E1E,0x3C,0x02,1, -0x3C9450,0x7F,0x02,1, -0x3C9452,0x3C,0x02,1, -0x9F9D74,0x7F,0x02,1, -0x9F9D76,0x3C,0x02,1, -0xA6202E,0x36,0x26,0, -0xA62032,0x1F,0x37,0, -0xA62030,0xBB,0x2E,0, -0xA62034,0x5E,0x53,0, -0xA6204E,0x36,0x26,1, -0xA62052,0x1F,0x37,1, -0xA62050,0xBB,0x2E,1, -0xA62054,0x5E,0x53,1, -0x3D4812,0xBA,0x02,0, -0x3D480E,0xBA,0x02,1, -0x3D4810,0x5E,0x53,0, -0x3D480C,0x5E,0x53,1, -0x3CC9FE,0x7F,0x02,0, -0x3CCA0A,0x3C,0x02,0, -0x8CBE20,0x35,0x02,0, -0x8CBE22,0x3C,0x02,0, -0x8CBE1E,0x5E,0x4F,0, -0x8CBE40,0x35,0x02,1, -0x8CBE42,0x3C,0x02,1, -0x8CBE3E,0x5E,0x4F,1, -0x8CBEE0,0x7F,0x02,0, -0x8CBEDE,0xDF,0x67,0, -0x8CBEE2,0x3C,0x02,0, -0x3B8F38,0x35,0x02,1, -0x3B8F3A,0xDF,0x67,1, -0x3B8F40,0x35,0x02,0, -0x3B8F42,0xDF,0x67,0, -0x3D1094,0x98,0x02,0, -0x3D109A,0x8F,0x19,0, -0x3D1098,0x3C,0x01,0, -0x3D1096,0x3C,0x02,0, -0x3D1092,0xDF,0x67,0, -0x3D1090,0x5E,0x53,0, -0x3D10D4,0x98,0x02,1, -0x3D10DA,0x8F,0x19,1, -0x3D10D8,0x3C,0x01,1, -0x3D10D6,0x3C,0x02,1, -0x3D10D2,0xDF,0x67,1, -0x3D10D0,0x5E,0x53,1, -0x3D14D0,0x7F,0x02,0, -0x3D14D2,0x3C,0x02,0, -0x3D14CE,0x5E,0x53,0, -0x3D14CC,0xFE,0x42,0, -0x3D1510,0xBA,0x02,1, -0x3D1512,0x3C,0x02,1, -0x3D150E,0x5E,0x53,1, -0x3D150C,0xFE,0x42,1, -0x3CE0F4,0x36,0x26,1, -0x3CE0F2,0x3D,0x02,1, -0x3CE0F0,0xFE,0x42,1, -0x3CE0D4,0x36,0x26,0, -0x3CE0D2,0x3D,0x02,0, -0x3CE0D0,0xFE,0x42,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Pink.txt b/worlds/mlss/colors/Pink.txt deleted file mode 100644 index b9901dea6f4a..000000000000 --- a/worlds/mlss/colors/Pink.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0xDF,0x6E,0, -0x3CC886,0xFF,0x5D,0, -0x3CC8C4,0xDF,0x6E,1, -0x3CC8C6,0xFF,0x5D,1, -0x4F4CDC,0xDF,0x6E,0, -0x4F4CDE,0xFF,0x5D,0, -0x4F4D1C,0xDF,0x6E,1, -0x4F4D1E,0xFF,0x5D,1, -0x4F51D8,0xDF,0x6E,1, -0x4F51DC,0xDF,0x6E,0, -0x4F51E8,0x3C,0x6B,0, -0x4F51EA,0x3C,0x6B,1, -0x4F51DA,0x7F,0x77,1, -0x4F51DE,0x7F,0x77,0, -0x4FB686,0xDF,0x6E,0, -0x4FB6A6,0xDF,0x6E,1, -0x4FB684,0xD4,0x45,0, -0x4FB6A4,0xD4,0x45,1, -0x4FB688,0x7F,0x77,0, -0x4FB6A8,0x7F,0x77,1, -0x4FB786,0xDF,0x6E,0, -0x4FB788,0x7F,0x77,0, -0x4FB78A,0x9E,0x7F,0, -0x4FB7A6,0xDF,0x6E,1, -0x4FB7A8,0x7F,0x77,1, -0x4FB7AA,0x9E,0x7F,1, -0x51901C,0xDF,0x6E,0, -0x519018,0x3C,0x51,0, -0x51901A,0xDD,0x59,0, -0x51903C,0xDF,0x6E,1, -0x519038,0x3C,0x51,1, -0x51903A,0xDD,0x59,1, -0x5193EA,0xFF,0x5D,0, -0x5193E8,0xDF,0x6E,0, -0x51940A,0xFF,0x5D,1, -0x519408,0xDF,0x6E,1, -0x3A72AE,0x3C,0x5E,1, -0x3A7244,0x3C,0x5E,0, -0x3A724C,0x5E,0x66,1, -0x3A7290,0x3D,0x62,0, -0x3A72B2,0x3D,0x62,1, -0x3A7270,0xFA,0x55,1, -0x3A7288,0xFA,0x55,0, -0x3A7296,0x9E,0x6A,0, -0x3A7274,0x9E,0x6A,1, -0x3A7294,0x5E,0x66,0, -0x3A724A,0xDE,0x6A,0, -0x3A7278,0xDE,0x6A,1, -0x3A724E,0xFE,0x6E,0, -0x3A727A,0xFE,0x6E,1, -0x3A7252,0x3E,0x73,0, -0x3A727C,0x3E,0x73,1, -0x3A72BC,0x3E,0x73,1, -0x3A726C,0xD8,0x51,1, -0x3A7286,0xD8,0x51,0, -0x3A728C,0x1B,0x5A,0, -0x3A7272,0x1B,0x5A,1, -0x3A7254,0x9E,0x77,1, -0x3A7256,0x9E,0x77,0, -0x3A7264,0x9E,0x77,1, -0x9F9A58,0x75,0x52,0, -0x9F9A5E,0x75,0x52,1, -0x9F9A2A,0xDF,0x6E,0, -0x9F9A30,0xDF,0x6E,1, -0x9F9A36,0xDF,0x6E,0, -0x9F9A3C,0xDF,0x6E,1, -0x9F9A4A,0xDF,0x6E,0, -0x9F9A50,0xDF,0x6E,1, -0x9F9A56,0xD3,0x45,0, -0x9F9A5C,0xD3,0x45,1, -0x9F9A28,0xD4,0x45,0, -0x9F9A2E,0xD4,0x45,1, -0x9F9A48,0xD4,0x45,0, -0x9F9A4E,0xD4,0x45,1, -0x9F9A34,0xFF,0x5D,0, -0x9F9A3A,0xFF,0x5D,1, -0x9F9A2C,0x7F,0x77,0, -0x9F9A32,0x7F,0x77,1, -0x9F9A38,0x7F,0x77,0, -0x9F9A3E,0x7F,0x77,1, -0x9F9A4C,0x7F,0x77,0, -0x9F9A52,0x7F,0x77,1, -0xA5DD46,0xD5,0x49,0, -0xA5DD44,0x91,0x3D,0, -0xA5DD4A,0xBD,0x6A,0, -0xA5DD3E,0x31,0x39,0, -0xA5DD40,0x3D,0x73,0, -0xA5DD42,0x5F,0x77,0, -0xA5DD48,0x59,0x5A,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0xD5,0x49,1, -0xA5DD64,0x91,0x3D,1, -0xA5DD6A,0xBD,0x6A,1, -0xA5DD5E,0x31,0x39,1, -0xA5DD60,0x3D,0x73,1, -0xA5DD62,0x5F,0x77,1, -0xA5DD68,0x59,0x5A,1, -0x3D0E0C,0xDF,0x6E,1, -0x3D0E18,0xDF,0x6E,0, -0x3D0E0A,0xFF,0x5D,1, -0x3D0E1A,0xFF,0x5D,0, -0x3D0E08,0x7F,0x77,1, -0x3D0E16,0x7F,0x77,0, -0x3CC9C4,0xDF,0x6E,0, -0x3CC9C6,0xFF,0x5D,0, -0x3CDE7C,0xDF,0x6E,1, -0x3CDE7E,0xFF,0x5D,1, -0x51AD2C,0xDF,0x6E,0, -0x51AD2E,0xFF,0x5D,0, -0x51AD4C,0xDF,0x6E,1, -0x51AD4E,0xFF,0x5D,1, -0x51A4AE,0xFF,0x5D,0, -0x51A4AC,0xDF,0x6E,0, -0x51A4CC,0xDF,0x6E,1, -0x51A4CE,0xFF,0x5D,1, -0x51A98C,0xDF,0x6E,0, -0x51A98E,0xFF,0x5D,0, -0x51A96C,0xDF,0x6E,1, -0x51A96E,0xFF,0x5D,1, -0x51AA00,0xBD,0x6A,0, -0x51AA10,0xBD,0x6A,1, -0x51AA02,0xFF,0x5D,0, -0x51AA12,0xFF,0x5D,1, -0x51A9FE,0xDF,0x6E,0, -0x51AA0E,0xDF,0x6E,1, -0x51AA0A,0x5E,0x77,0, -0x3CC984,0xDF,0x6E,0, -0x3CC986,0xFF,0x5D,0, -0x3D4B52,0x7F,0x66,0, -0x3D4B5C,0xBC,0x55,0, -0x3D4B54,0xDF,0x6E,0, -0x3D4B56,0xFF,0x5D,0, -0x3D4B50,0x7F,0x77,0, -0x3CCA44,0xDF,0x6E,1, -0x3CCA46,0xFF,0x5D,1, -0x3CFB3C,0xDF,0x6E,0, -0x3CFB3E,0xFF,0x5D,0, -0x3CFB7C,0xDF,0x6E,1, -0x3CFB7E,0xFF,0x5D,1, -0x3D504C,0x9C,0x62,0, -0x3D504A,0xDF,0x6E,0, -0x3D504E,0xFF,0x5D,0, -0x3D508C,0x9C,0x62,1, -0x3D508A,0xDF,0x6E,1, -0x3D508E,0xFF,0x5D,1, -0xA5DDA2,0xD5,0x49,0, -0xA5DDC2,0xD5,0x49,1, -0xA5DDA6,0xBD,0x6A,0, -0xA5DDC6,0xBD,0x6A,1, -0xA5DDA4,0x59,0x5A,0, -0xA5DDC4,0x59,0x5A,1, -0xA5DDA8,0x3D,0x6F,0, -0xA5DDC8,0x3D,0x6F,1, -0x3D3E0C,0xDF,0x6E,1, -0x3D3E10,0xDF,0x6E,0, -0x3D3E0E,0xFF,0x5D,1, -0x3D3E12,0xFF,0x5D,0, -0x3CF1C0,0xDF,0x6E,0, -0x3CF200,0xDF,0x6E,1, -0x3CF1C2,0xFF,0x5D,0, -0x3CF202,0xFF,0x5D,1, -0x3D360E,0x5E,0x66,1, -0x3D3614,0x5E,0x66,0, -0x3D360C,0x7F,0x77,1, -0x3D3612,0x7F,0x77,0, -0x3D3604,0x59,0x5A,0, -0x3D3606,0x59,0x5A,1, -0x3D360A,0x7F,0x77,1, -0x3D3610,0x7F,0x77,0, -0x3D1A48,0x1B,0x5A,0, -0x3D1A46,0x7F,0x77,0, -0x3D1A44,0x7F,0x77,0, -0x3D1A4A,0x59,0x5A,0, -0x3D1A88,0x1B,0x5A,1, -0x3D1A8A,0xCC,0xC8,1, -0x3D1A86,0x7F,0x77,1, -0x3D1A84,0x7F,0x77,1, -0x3CE282,0xFF,0x5D,0, -0x3CE2C2,0xFF,0x5D,1, -0x3CE280,0x7F,0x77,0, -0x3CE2C0,0x7F,0x77,1, -0x4FA29E,0xFF,0x5D,0, -0x4FA2DE,0xFF,0x5D,1, -0x4FA29C,0x7F,0x77,0, -0x4FA2DC,0x7F,0x77,1, -0x3D4786,0x9E,0x77,1, -0x3D478C,0x9E,0x77,0, -0x3D478E,0x3D,0x62,0, -0x3D4788,0x3D,0x62,1, -0x3D4790,0x3D,0x62,0, -0x3D478A,0x9C,0x62,1, -0x3D4794,0x59,0x5A,0, -0x3D4792,0x9C,0x62,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0x9E,0x7F,1, -0x3C9E40,0x9E,0x7F,0, -0x3C9E38,0x9E,0x7F,1, -0x3C9E3E,0x9E,0x7F,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0xDF,0x6E,0, -0x4F4D5E,0xFF,0x5D,0, -0x3C9320,0xDF,0x6E,0, -0x3C9322,0xFF,0x5D,0, -0x9F9CF6,0xDF,0x6E,0, -0x9F9CF8,0xFF,0x5D,0, -0x4F4E1C,0xDF,0x6E,1, -0x4F4E1E,0xFF,0x5D,1, -0x3C9450,0xDF,0x6E,1, -0x3C9452,0xFF,0x5D,1, -0x9F9D74,0xDF,0x6E,1, -0x9F9D76,0xFF,0x5D,1, -0xA6202E,0xD5,0x49,0, -0xA62032,0xBD,0x6A,0, -0xA62030,0x59,0x5A,0, -0xA62034,0x3D,0x6F,0, -0xA6204E,0xD5,0x49,1, -0xA62052,0xBD,0x6A,1, -0xA62050,0x59,0x5A,1, -0xA62054,0x3D,0x6F,1, -0x3D4812,0x5E,0x66,0, -0x3D480E,0x5E,0x66,1, -0x3D4810,0x7F,0x77,0, -0x3D480C,0x7F,0x77,1, -0x3CC9FE,0xDF,0x6E,0, -0x3CCA0A,0xFF,0x5D,0, -0x8CBE20,0x1B,0x5A,0, -0x8CBE22,0xFF,0x5D,0, -0x8CBE1E,0x5E,0x77,0, -0x8CBE40,0x1B,0x5A,1, -0x8CBE42,0xFF,0x5D,1, -0x8CBE3E,0x5E,0x77,1, -0x8CBEE0,0xDF,0x6E,0, -0x8CBEDE,0x5F,0x77,0, -0x8CBEE2,0xFF,0x5D,0, -0x3B8F38,0x1B,0x5A,1, -0x3B8F3A,0x5F,0x77,1, -0x3B8F40,0x1B,0x5A,0, -0x3B8F42,0x5F,0x77,0, -0x3D1094,0x3D,0x62,0, -0x3D109A,0x91,0x3D,0, -0x3D1098,0x3C,0x51,0, -0x3D1096,0xDD,0x59,0, -0x3D1092,0x5F,0x77,0, -0x3D1090,0x7F,0x77,0, -0x3D10D4,0x3D,0x62,1, -0x3D10DA,0x91,0x3D,1, -0x3D10D8,0x3C,0x51,1, -0x3D10D6,0xDD,0x59,1, -0x3D10D2,0x5F,0x77,1, -0x3D10D0,0x7F,0x77,1, -0x3D14D0,0xDF,0x6E,0, -0x3D14D2,0xFF,0x5D,0, -0x3D14CE,0x7F,0x77,0, -0x3D14CC,0x3C,0x6B,0, -0x3D1510,0x5E,0x66,1, -0x3D1512,0xFF,0x5D,1, -0x3D150E,0x7F,0x77,1, -0x3D150C,0x3C,0x6B,1, -0x3CE0F4,0xD5,0x49,1, -0x3CE0F2,0xBD,0x6A,1, -0x3CE0F0,0x3C,0x6B,1, -0x3CE0D4,0xD5,0x49,0, -0x3CE0D2,0xBD,0x6A,0, -0x3CE0D0,0x3C,0x6B,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Purple.txt b/worlds/mlss/colors/Purple.txt deleted file mode 100644 index 846290bc33f2..000000000000 --- a/worlds/mlss/colors/Purple.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0x10,0x7C,0, -0x3CC886,0x0B,0x5C,0, -0x3CC8C4,0x10,0x7C,1, -0x3CC8C6,0x0B,0x5C,1, -0x4F4CDC,0x10,0x7C,0, -0x4F4CDE,0x0B,0x5C,0, -0x4F4D1C,0x10,0x7C,1, -0x4F4D1E,0x0B,0x5C,1, -0x4F51D8,0x10,0x7C,1, -0x4F51DC,0x10,0x7C,0, -0x4F51E8,0x98,0x6E,0, -0x4F51EA,0x98,0x6E,1, -0x4F51DA,0xFB,0x7A,1, -0x4F51DE,0xFB,0x7A,0, -0x4FB686,0x10,0x7C,0, -0x4FB6A6,0x10,0x7C,1, -0x4FB684,0x05,0x28,0, -0x4FB6A4,0x05,0x28,1, -0x4FB688,0xFB,0x7A,0, -0x4FB6A8,0xFB,0x7A,1, -0x4FB786,0x10,0x7C,0, -0x4FB788,0xFB,0x7A,0, -0x4FB78A,0x9E,0x7F,0, -0x4FB7A6,0x10,0x7C,1, -0x4FB7A8,0xFB,0x7A,1, -0x4FB7AA,0x9E,0x7F,1, -0x51901C,0x10,0x7C,0, -0x519018,0x05,0x39,0, -0x51901A,0x0F,0x5C,0, -0x51903C,0x10,0x7C,1, -0x519038,0x05,0x39,1, -0x51903A,0x0F,0x5C,1, -0x5193EA,0x0B,0x5C,0, -0x5193E8,0x10,0x7C,0, -0x51940A,0x0B,0x5C,1, -0x519408,0x10,0x7C,1, -0x3A72AE,0xB4,0x51,1, -0x3A7244,0xB4,0x51,0, -0x3A724C,0xF6,0x59,1, -0x3A7290,0xF6,0x59,0, -0x3A72B2,0x36,0x5A,1, -0x3A7270,0xF4,0x50,1, -0x3A7288,0xF4,0x50,0, -0x3A7296,0x79,0x66,0, -0x3A7274,0x79,0x66,1, -0x3A7294,0x36,0x5A,0, -0x3A724A,0x99,0x66,0, -0x3A7278,0x99,0x66,1, -0x3A724E,0xB9,0x66,0, -0x3A727A,0xB9,0x66,1, -0x3A7252,0x19,0x67,0, -0x3A727C,0x19,0x67,1, -0x3A72BC,0x19,0x67,1, -0x3A726C,0x54,0x50,1, -0x3A7286,0x54,0x50,0, -0x3A728C,0x74,0x51,0, -0x3A7272,0x74,0x51,1, -0x3A7254,0x5C,0x73,1, -0x3A7256,0x5C,0x73,0, -0x3A7264,0x5C,0x73,1, -0x9F9A58,0xF2,0x51,0, -0x9F9A5E,0xF2,0x51,1, -0x9F9A2A,0x10,0x7C,0, -0x9F9A30,0x10,0x7C,1, -0x9F9A36,0x10,0x7C,0, -0x9F9A3C,0x10,0x7C,1, -0x9F9A4A,0x10,0x7C,0, -0x9F9A50,0x10,0x7C,1, -0x9F9A56,0x06,0x34,0, -0x9F9A5C,0x06,0x34,1, -0x9F9A28,0x05,0x28,0, -0x9F9A2E,0x05,0x28,1, -0x9F9A48,0x05,0x28,0, -0x9F9A4E,0x05,0x28,1, -0x9F9A34,0x0F,0x5C,0, -0x9F9A3A,0x0F,0x5C,1, -0x9F9A2C,0xFB,0x7A,0, -0x9F9A32,0xFB,0x7A,1, -0x9F9A38,0xFB,0x7A,0, -0x9F9A3E,0xFB,0x7A,1, -0x9F9A4C,0xFB,0x7A,0, -0x9F9A52,0xFB,0x7A,1, -0xA5DD46,0x8A,0x3C,0, -0xA5DD44,0x66,0x28,0, -0xA5DD4A,0x32,0x71,0, -0xA5DD3E,0x4C,0x39,0, -0xA5DD40,0x34,0x62,0, -0xA5DD42,0x77,0x72,0, -0xA5DD48,0xED,0x50,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x8A,0x3C,1, -0xA5DD64,0x66,0x28,1, -0xA5DD6A,0x32,0x71,1, -0xA5DD5E,0x4C,0x39,1, -0xA5DD60,0x34,0x62,1, -0xA5DD62,0x77,0x72,1, -0xA5DD68,0xED,0x50,1, -0x3D0E0C,0x10,0x7C,1, -0x3D0E18,0x10,0x7C,0, -0x3D0E0A,0x0B,0x5C,1, -0x3D0E1A,0x0B,0x5C,0, -0x3D0E08,0xFB,0x7A,1, -0x3D0E16,0xFB,0x7A,0, -0x3CC9C4,0x10,0x7C,0, -0x3CC9C6,0x0B,0x5C,0, -0x3CDE7C,0x10,0x7C,1, -0x3CDE7E,0x0B,0x5C,1, -0x51AD2C,0x10,0x7C,0, -0x51AD2E,0x0B,0x5C,0, -0x51AD4C,0x10,0x7C,1, -0x51AD4E,0x0B,0x5C,1, -0x51A4AE,0x0B,0x5C,0, -0x51A4AC,0x10,0x7C,0, -0x51A4CC,0x10,0x7C,1, -0x51A4CE,0x0B,0x5C,1, -0x51A98C,0x10,0x7C,0, -0x51A98E,0x0B,0x5C,0, -0x51A96C,0x10,0x7C,1, -0x51A96E,0x0B,0x5C,1, -0x51AA00,0x0B,0x64,0, -0x51AA10,0x0B,0x64,1, -0x51AA02,0x0B,0x5C,0, -0x51AA12,0x0B,0x5C,1, -0x51A9FE,0x10,0x7C,0, -0x51AA0E,0x10,0x7C,1, -0x51AA0A,0xF7,0x79,0, -0x3CC984,0x10,0x7C,0, -0x3CC986,0x0B,0x5C,0, -0x3D4B52,0x0E,0x70,0, -0x3D4B5C,0x09,0x50,0, -0x3D4B54,0x10,0x7C,0, -0x3D4B56,0x0B,0x5C,0, -0x3D4B50,0xFB,0x7A,0, -0x3CCA44,0x10,0x7C,1, -0x3CCA46,0x0B,0x5C,1, -0x3CFB3C,0x10,0x7C,0, -0x3CFB3E,0x0B,0x5C,0, -0x3CFB7C,0x10,0x7C,1, -0x3CFB7E,0x0B,0x5C,1, -0x3D504C,0x0C,0x64,0, -0x3D504A,0x10,0x7C,0, -0x3D504E,0x0B,0x5C,0, -0x3D508C,0x0C,0x64,1, -0x3D508A,0x10,0x7C,1, -0x3D508E,0x0B,0x5C,1, -0xA5DDA2,0x8A,0x3C,0, -0xA5DDC2,0x8A,0x3C,1, -0xA5DDA6,0x32,0x71,0, -0xA5DDC6,0x32,0x71,1, -0xA5DDA4,0xED,0x50,0, -0xA5DDC4,0xED,0x50,1, -0xA5DDA8,0xFB,0x7A,0, -0xA5DDC8,0xFB,0x7A,1, -0x3D3E0C,0x10,0x7C,1, -0x3D3E10,0x10,0x7C,0, -0x3D3E0E,0x0B,0x5C,1, -0x3D3E12,0x0B,0x5C,0, -0x3CF1C0,0x10,0x7C,0, -0x3CF200,0x10,0x7C,1, -0x3CF1C2,0x0B,0x5C,0, -0x3CF202,0x0B,0x5C,1, -0x3D360E,0xF6,0x59,1, -0x3D3614,0xF6,0x59,0, -0x3D360C,0xFB,0x7A,1, -0x3D3612,0xFB,0x7A,0, -0x3D3604,0xED,0x50,0, -0x3D3606,0xED,0x50,1, -0x3D360A,0xFB,0x7A,1, -0x3D3610,0xFB,0x7A,0, -0x3D1A48,0x74,0x51,0, -0x3D1A46,0xFB,0x7A,0, -0x3D1A44,0xFB,0x7A,0, -0x3D1A4A,0xED,0x50,0, -0x3D1A88,0x74,0x51,1, -0x3D1A8A,0xAA,0xA4,1, -0x3D1A86,0xFB,0x7A,1, -0x3D1A84,0xFB,0x7A,1, -0x3CE282,0x0B,0x5C,0, -0x3CE2C2,0x0B,0x5C,1, -0x3CE280,0xFB,0x7A,0, -0x3CE2C0,0xFB,0x7A,1, -0x4FA29E,0x0B,0x5C,0, -0x4FA2DE,0x0B,0x5C,1, -0x4FA29C,0xFB,0x7A,0, -0x4FA2DC,0xFB,0x7A,1, -0x3D4786,0x5C,0x73,1, -0x3D478C,0x5C,0x73,0, -0x3D478E,0xF6,0x59,0, -0x3D4788,0xF6,0x59,1, -0x3D4790,0xF6,0x59,0, -0x3D478A,0x0C,0x64,1, -0x3D4794,0xED,0x50,0, -0x3D4792,0x0C,0x64,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0x9E,0x7F,1, -0x3C9E40,0x9E,0x7F,0, -0x3C9E38,0x9E,0x7F,1, -0x3C9E3E,0x9E,0x7F,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0x10,0x7C,0, -0x4F4D5E,0x0B,0x5C,0, -0x3C9320,0x10,0x7C,0, -0x3C9322,0x0B,0x5C,0, -0x9F9CF6,0x10,0x7C,0, -0x9F9CF8,0x0B,0x5C,0, -0x4F4E1C,0x10,0x7C,1, -0x4F4E1E,0x0B,0x5C,1, -0x3C9450,0x10,0x7C,1, -0x3C9452,0x0B,0x5C,1, -0x9F9D74,0x10,0x7C,1, -0x9F9D76,0x0B,0x5C,1, -0xA6202E,0x8A,0x3C,0, -0xA62032,0x32,0x71,0, -0xA62030,0xED,0x50,0, -0xA62034,0xFB,0x7A,0, -0xA6204E,0x8A,0x3C,1, -0xA62052,0x32,0x71,1, -0xA62050,0xED,0x50,1, -0xA62054,0xFB,0x7A,1, -0x3D4812,0xF6,0x59,0, -0x3D480E,0xF6,0x59,1, -0x3D4810,0xFB,0x7A,0, -0x3D480C,0xFB,0x7A,1, -0x3CC9FE,0x10,0x7C,0, -0x3CCA0A,0x0B,0x5C,0, -0x8CBE20,0x74,0x51,0, -0x8CBE22,0x0B,0x5C,0, -0x8CBE1E,0xF7,0x79,0, -0x8CBE40,0x74,0x51,1, -0x8CBE42,0x0B,0x5C,1, -0x8CBE3E,0xF7,0x79,1, -0x8CBEE0,0x10,0x7C,0, -0x8CBEDE,0x77,0x72,0, -0x8CBEE2,0x0B,0x5C,0, -0x3B8F38,0x74,0x51,1, -0x3B8F3A,0x77,0x72,1, -0x3B8F40,0x74,0x51,0, -0x3B8F42,0x77,0x72,0, -0x3D1094,0xF6,0x59,0, -0x3D109A,0x66,0x28,0, -0x3D1098,0x05,0x39,0, -0x3D1096,0x0F,0x5C,0, -0x3D1092,0x77,0x72,0, -0x3D1090,0xFB,0x7A,0, -0x3D10D4,0xF6,0x59,1, -0x3D10DA,0x66,0x28,1, -0x3D10D8,0x05,0x39,1, -0x3D10D6,0x0F,0x5C,1, -0x3D10D2,0x77,0x72,1, -0x3D10D0,0xFB,0x7A,1, -0x3D14D0,0x10,0x7C,0, -0x3D14D2,0x0B,0x5C,0, -0x3D14CE,0xFB,0x7A,0, -0x3D14CC,0x98,0x6E,0, -0x3D1510,0xF6,0x59,1, -0x3D1512,0x0B,0x5C,1, -0x3D150E,0xFB,0x7A,1, -0x3D150C,0x98,0x6E,1, -0x3CE0F4,0x8A,0x3C,1, -0x3CE0F2,0x0B,0x64,1, -0x3CE0F0,0x98,0x6E,1, -0x3CE0D4,0x8A,0x3C,0, -0x3CE0D2,0x0B,0x64,0, -0x3CE0D0,0x98,0x6E,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Red.txt b/worlds/mlss/colors/Red.txt deleted file mode 100644 index c16fe150886c..000000000000 --- a/worlds/mlss/colors/Red.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0x3F,0x04,0, -0x3CC886,0x17,0x00,0, -0x3CC8C4,0x3F,0x04,1, -0x3CC8C6,0x17,0x00,1, -0x4F4CDC,0x3F,0x04,0, -0x4F4CDE,0x17,0x00,0, -0x4F4D1C,0x3F,0x04,1, -0x4F4D1E,0x17,0x00,1, -0x4F51D8,0x3F,0x04,1, -0x4F51DC,0x3F,0x04,0, -0x4F51E8,0x1D,0x3A,0, -0x4F51EA,0x1D,0x3A,1, -0x4F51DA,0x5F,0x42,1, -0x4F51DE,0x5F,0x42,0, -0x4FB686,0x3F,0x04,0, -0x4FB6A6,0x3F,0x04,1, -0x4FB684,0x0F,0x00,0, -0x4FB6A4,0x0F,0x00,1, -0x4FB688,0x5F,0x42,0, -0x4FB6A8,0x5F,0x42,1, -0x4FB786,0x3F,0x04,0, -0x4FB788,0x5F,0x42,0, -0x4FB78A,0xDF,0x52,0, -0x4FB7A6,0x3F,0x04,1, -0x4FB7A8,0x5F,0x42,1, -0x4FB7AA,0xDF,0x52,1, -0x51901C,0x3F,0x04,0, -0x519018,0xD0,0x00,0, -0x51901A,0x19,0x00,0, -0x51903C,0x3F,0x04,1, -0x519038,0xD0,0x00,1, -0x51903A,0x19,0x00,1, -0x5193EA,0x17,0x00,0, -0x5193E8,0x3F,0x04,0, -0x51940A,0x17,0x00,1, -0x519408,0x3F,0x04,1, -0x3A72AE,0x7D,0x21,1, -0x3A7244,0x9A,0x29,0, -0x3A724C,0xDE,0x21,1, -0x3A7290,0x7D,0x21,0, -0x3A72B2,0xDE,0x21,1, -0x3A7270,0x16,0x1D,1, -0x3A7288,0x16,0x1D,0, -0x3A7296,0x3F,0x22,0, -0x3A7274,0xDE,0x21,1, -0x3A7294,0xDE,0x21,0, -0x3A724A,0x5F,0x22,0, -0x3A7278,0x5F,0x22,1, -0x3A724E,0xDF,0x22,0, -0x3A727A,0xDF,0x22,1, -0x3A7252,0x3F,0x1F,0, -0x3A727C,0x3F,0x1F,1, -0x3A72BC,0x3F,0x1F,1, -0x3A726C,0x10,0x1D,1, -0x3A7286,0x10,0x1D,0, -0x3A728C,0x3C,0x1D,0, -0x3A7272,0x9A,0x29,1, -0x3A7254,0x9F,0x23,1, -0x3A7256,0x9F,0x23,0, -0x3A7264,0x9F,0x23,1, -0x9F9A58,0x71,0x29,0, -0x9F9A5E,0x71,0x29,1, -0x9F9A2A,0x3F,0x04,0, -0x9F9A30,0x3F,0x04,1, -0x9F9A36,0x3F,0x04,0, -0x9F9A3C,0x3F,0x04,1, -0x9F9A4A,0x3F,0x04,0, -0x9F9A50,0x3F,0x04,1, -0x9F9A56,0x30,0x04,0, -0x9F9A5C,0x30,0x04,1, -0x9F9A28,0x0F,0x00,0, -0x9F9A2E,0x0F,0x00,1, -0x9F9A48,0x0F,0x00,0, -0x9F9A4E,0x0F,0x00,1, -0x9F9A34,0x17,0x00,0, -0x9F9A3A,0x17,0x00,1, -0x9F9A2C,0x5F,0x42,0, -0x9F9A32,0x5F,0x42,1, -0x9F9A38,0x5F,0x42,0, -0x9F9A3E,0x5F,0x42,1, -0x9F9A4C,0x5F,0x42,0, -0x9F9A52,0x5F,0x42,1, -0xA5DD46,0x13,0x00,0, -0xA5DD44,0x0F,0x00,0, -0xA5DD4A,0x7F,0x0C,0, -0xA5DD3E,0x30,0x21,0, -0xA5DD40,0xDF,0x35,0, -0xA5DD42,0x9F,0x4A,0, -0xA5DD48,0x59,0x08,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x13,0x00,1, -0xA5DD64,0x0F,0x00,1, -0xA5DD6A,0x7F,0x0C,1, -0xA5DD5E,0x30,0x21,1, -0xA5DD60,0xDF,0x35,1, -0xA5DD62,0x9F,0x4A,1, -0xA5DD68,0x59,0x08,1, -0x3D0E0C,0x3F,0x04,1, -0x3D0E18,0x3F,0x04,0, -0x3D0E0A,0x17,0x00,1, -0x3D0E1A,0x17,0x00,0, -0x3D0E08,0x5F,0x42,1, -0x3D0E16,0x5F,0x42,0, -0x3CC9C4,0x3F,0x04,0, -0x3CC9C6,0x17,0x00,0, -0x3CDE7C,0x3F,0x04,1, -0x3CDE7E,0x17,0x00,1, -0x51AD2C,0x3F,0x04,0, -0x51AD2E,0x17,0x00,0, -0x51AD4C,0x3F,0x04,1, -0x51AD4E,0x17,0x00,1, -0x51A4AE,0x17,0x00,0, -0x51A4AC,0x3F,0x04,0, -0x51A4CC,0x3F,0x04,1, -0x51A4CE,0x17,0x00,1, -0x51A98C,0x3F,0x04,0, -0x51A98E,0x17,0x00,0, -0x51A96C,0x3F,0x04,1, -0x51A96E,0x17,0x00,1, -0x51AA00,0x3A,0x04,0, -0x51AA10,0x3A,0x04,1, -0x51AA02,0x12,0x00,0, -0x51AA12,0x12,0x00,1, -0x51A9FE,0x1F,0x0D,0, -0x51AA0E,0x1F,0x0D,1, -0x51AA0A,0xFF,0x26,0, -0x3CC984,0x3F,0x04,0, -0x3CC986,0x17,0x00,0, -0x3D4B52,0x1D,0x00,0, -0x3D4B5C,0x13,0x00,0, -0x3D4B54,0x3F,0x04,0, -0x3D4B56,0x17,0x00,0, -0x3D4B50,0xBF,0x56,0, -0x3CCA44,0x3F,0x04,1, -0x3CCA46,0x17,0x00,1, -0x3CFB3C,0x3F,0x04,0, -0x3CFB3E,0x17,0x00,0, -0x3CFB7C,0x3F,0x04,1, -0x3CFB7E,0x17,0x00,1, -0x3D504C,0x1B,0x00,0, -0x3D504A,0x3F,0x04,0, -0x3D504E,0x17,0x00,0, -0x3D508C,0x1B,0x00,1, -0x3D508A,0x3F,0x04,1, -0x3D508E,0x17,0x00,1, -0xA5DDA2,0x13,0x00,0, -0xA5DDC2,0x13,0x00,1, -0xA5DDA6,0x7F,0x0C,0, -0xA5DDC6,0x7F,0x0C,1, -0xA5DDA4,0x59,0x08,0, -0xA5DDC4,0x59,0x08,1, -0xA5DDA8,0x3F,0x5B,0, -0xA5DDC8,0x3F,0x5B,1, -0x3D3E0C,0x3F,0x04,1, -0x3D3E10,0x3F,0x04,0, -0x3D3E0E,0x17,0x00,1, -0x3D3E12,0x17,0x00,0, -0x3CF1C0,0x3F,0x04,0, -0x3CF200,0x3F,0x04,1, -0x3CF1C2,0x17,0x00,0, -0x3CF202,0x17,0x00,1, -0x3D360E,0xDD,0x10,1, -0x3D3614,0xDD,0x10,0, -0x3D360C,0x3F,0x46,1, -0x3D3612,0x3F,0x46,0, -0x3D3604,0x76,0x00,0, -0x3D3606,0x76,0x00,1, -0x3D360A,0x5F,0x6B,1, -0x3D3610,0x5F,0x6B,0, -0x3D1A48,0x9D,0x31,0, -0x3D1A46,0xBF,0x56,0, -0x3D1A44,0x7F,0x6F,0, -0x3D1A4A,0xFA,0x1C,0, -0x3D1A88,0x9D,0x31,1, -0x3D1A8A,0xFA,0x1C,1, -0x3D1A86,0xBF,0x56,1, -0x3D1A84,0x7F,0x6F,1, -0x3CE282,0x18,0x00,0, -0x3CE2C2,0x18,0x00,1, -0x3CE280,0x1F,0x52,0, -0x3CE2C0,0x1F,0x52,1, -0x4FA29E,0x18,0x00,0, -0x4FA2DE,0x18,0x00,1, -0x4FA29C,0x1F,0x52,0, -0x4FA2DC,0x1F,0x52,1, -0x3D4786,0x1F,0x03,1, -0x3D478C,0x9F,0x0B,0, -0x3D478E,0x1F,0x03,0, -0x3D4788,0x3F,0x25,1, -0x3D4790,0x3F,0x25,0, -0x3D478A,0x1A,0x00,1, -0x3D4794,0x50,0x08,0, -0x3D4792,0x1A,0x00,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0xDF,0x5A,1, -0x3C9E40,0xDF,0x5A,0, -0x3C9E38,0x5F,0x6B,1, -0x3C9E3E,0x5F,0x6B,0, -0x3C9E36,0xDF,0x7B,1, -0x3C9E3C,0xDF,0x7B,0, -0x4F4D5C,0x3F,0x04,0, -0x4F4D5E,0x17,0x00,0, -0x3C9320,0x3F,0x04,0, -0x3C9322,0x17,0x00,0, -0x9F9CF6,0x3F,0x04,0, -0x9F9CF8,0x17,0x00,0, -0x4F4E1C,0x3F,0x04,1, -0x4F4E1E,0x17,0x00,1, -0x3C9450,0x3F,0x04,1, -0x3C9452,0x17,0x00,1, -0x9F9D74,0x3F,0x04,1, -0x9F9D76,0x17,0x00,1, -0xA6202E,0x13,0x00,0, -0xA62032,0x7F,0x0C,0, -0xA62030,0x59,0x08,0, -0xA62034,0x3F,0x5B,0, -0xA6204E,0x13,0x00,1, -0xA62052,0x7F,0x0C,1, -0xA62050,0x59,0x08,1, -0xA62054,0x3F,0x5B,1, -0x3D4812,0xBD,0x14,0, -0x3D480E,0xBD,0x14,1, -0x3D4810,0xBF,0x35,0, -0x3D480C,0xBF,0x35,1, -0x3CC9FE,0x3F,0x04,0, -0x3CCA0A,0xF0,0x00,0, -0x8CBE20,0x9C,0x35,0, -0x8CBE22,0xF9,0x28,0, -0x8CBE1E,0xFF,0x3D,0, -0x8CBE40,0x9C,0x35,1, -0x8CBE42,0xF9,0x28,1, -0x8CBE3E,0xFF,0x3D,1, -0x8CBEE0,0x3F,0x04,0, -0x8CBEDE,0x7F,0x4E,0, -0x8CBEE2,0x17,0x00,0, -0x3B8F38,0x1F,0x20,1, -0x3B8F3A,0x1F,0x5A,1, -0x3B8F40,0x1F,0x20,0, -0x3B8F42,0x1F,0x5A,0, -0x3D1094,0x7C,0x2D,0, -0x3D109A,0x2F,0x00,0, -0x3D1098,0x36,0x04,0, -0x3D1096,0x7A,0x0C,0, -0x3D1092,0x7F,0x4E,0, -0x3D1090,0x9F,0x6F,0, -0x3D10D4,0x7C,0x2D,1, -0x3D10DA,0x2F,0x00,1, -0x3D10D8,0x36,0x04,1, -0x3D10D6,0x7A,0x0C,1, -0x3D10D2,0x7F,0x4E,1, -0x3D10D0,0x9F,0x6F,1, -0x3D14D0,0x3F,0x04,0, -0x3D14D2,0x17,0x00,0, -0x3D14CE,0x1F,0x3E,0, -0x3D14CC,0x1F,0x57,0, -0x3D1510,0xDE,0x21,1, -0x3D1512,0x17,0x00,1, -0x3D150E,0x1F,0x3E,1, -0x3D150C,0x1F,0x57,1, -0x3CE0F4,0x34,0x04,1, -0x3CE0F2,0x3A,0x04,1, -0x3CE0F0,0x1B,0x3E,1, -0x3CE0D4,0x34,0x04,0, -0x3CE0D2,0x3A,0x04,0, -0x3CE0D0,0x1B,0x3E,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Silhouette.txt b/worlds/mlss/colors/Silhouette.txt deleted file mode 100644 index 5216a7863f7d..000000000000 --- a/worlds/mlss/colors/Silhouette.txt +++ /dev/null @@ -1,812 +0,0 @@ -0x3CC878,0xFF,0x7F,0, -0x3CC87A,0xFF,0x7F,0, -0x3CC87C,0xFF,0x7F,0, -0x3CC87E,0xFF,0x7F,0, -0x3CC880,0xFF,0x7F,0, -0x3CC882,0xFF,0x7F,0, -0x3CC884,0xFF,0x7F,0, -0x3CC886,0xFF,0x7F,0, -0x3CC888,0xFF,0x7F,0, -0x3CC88A,0xFF,0x7F,0, -0x3CC88C,0xFF,0x7F,0, -0x3CC88E,0xFF,0x7F,0, -0x3CC890,0xFF,0x7F,0, -0x3CC892,0xFF,0x7F,0, -0x3CC8B8,0xFF,0x7F,1, -0x3CC8BA,0xFF,0x7F,1, -0x3CC8BC,0xFF,0x7F,1, -0x3CC8BE,0xFF,0x7F,1, -0x3CC8C0,0xFF,0x7F,1, -0x3CC8C2,0xFF,0x7F,1, -0x3CC8C4,0xFF,0x7F,1, -0x3CC8C6,0xFF,0x7F,1, -0x3CC8C8,0xFF,0x7F,1, -0x3CC8CA,0xFF,0x7F,1, -0x3CC8CC,0xFF,0x7F,1, -0x3CC8CE,0xFF,0x7F,1, -0x3CC8D0,0xFF,0x7F,1, -0x3CC8D2,0xFF,0x7F,1, -0x4F4CD0,0xFF,0x7F,0, -0x4F4CD2,0xFF,0x7F,0, -0x4F4CD4,0xFF,0x7F,0, -0x4F4CD6,0xFF,0x7F,0, -0x4F4CD8,0xFF,0x7F,0, -0x4F4CDA,0xFF,0x7F,0, -0x4F4CDC,0xFF,0x7F,0, -0x4F4CDE,0xFF,0x7F,0, -0x4F4CE0,0xFF,0x7F,0, -0x4F4CE2,0xFF,0x7F,0, -0x4F4CE4,0xFF,0x7F,0, -0x4F4CE6,0xFF,0x7F,0, -0x4F4CE8,0xFF,0x7F,0, -0x4F4CEA,0xFF,0x7F,0, -0x4F4D10,0xFF,0x7F,1, -0x4F4D12,0xFF,0x7F,1, -0x4F4D14,0xFF,0x7F,1, -0x4F4D16,0xFF,0x7F,1, -0x4F4D18,0xFF,0x7F,1, -0x4F4D1A,0xFF,0x7F,1, -0x4F4D1C,0xFF,0x7F,1, -0x4F4D1E,0xFF,0x7F,1, -0x4F4D20,0xFF,0x7F,1, -0x4F4D22,0xFF,0x7F,1, -0x4F4D24,0xFF,0x7F,1, -0x4F4D26,0xFF,0x7F,1, -0x4F4D28,0xFF,0x7F,1, -0x4F4D2A,0xFF,0x7F,1, -0x4F51D8,0xFF,0x7F,1, -0x4F51DA,0xFF,0x7F,1, -0x4F51DC,0xFF,0x7F,0, -0x4F51DE,0xFF,0x7F,0, -0x4F51E8,0xFF,0x7F,0, -0x4F51EA,0xFF,0x7F,1, -0x4FB684,0xFF,0x7F,0, -0x4FB686,0xFF,0x7F,0, -0x4FB688,0xFF,0x7F,0, -0x4FB6A4,0xFF,0x7F,1, -0x4FB6A6,0xFF,0x7F,1, -0x4FB6A8,0xFF,0x7F,1, -0x4FB692,0xFF,0x7F,0, -0x4FB6B2,0xFF,0x7F,1, -0x4FB786,0xFF,0x7F,0, -0x4FB788,0xFF,0x7F,0, -0x4FB78A,0xFF,0x7F,0, -0x4FB7A6,0xFF,0x7F,1, -0x4FB7A8,0xFF,0x7F,1, -0x4FB7AA,0xFF,0x7F,1, -0x519006,0xFF,0x7F,0, -0x519008,0xFF,0x7F,0, -0x51900C,0xFF,0x7F,0, -0x51900E,0xFF,0x7F,0, -0x519010,0xFF,0x7F,0, -0x519012,0xFF,0x7F,0, -0x519014,0xFF,0x7F,0, -0x519016,0xFF,0x7F,0, -0x519018,0xFF,0x7F,0, -0x51901A,0xFF,0x7F,0, -0x51901C,0xFF,0x7F,0, -0x51901E,0xFF,0x7F,0, -0x519020,0xFF,0x7F,0, -0x519022,0xFF,0x7F,0, -0x519026,0xFF,0x7F,1, -0x519028,0xFF,0x7F,1, -0x51902C,0xFF,0x7F,1, -0x51902E,0xFF,0x7F,1, -0x519030,0xFF,0x7F,1, -0x519032,0xFF,0x7F,1, -0x519034,0xFF,0x7F,1, -0x519036,0xFF,0x7F,1, -0x519038,0xFF,0x7F,1, -0x51903A,0xFF,0x7F,1, -0x51903C,0xFF,0x7F,1, -0x51903E,0xFF,0x7F,1, -0x519040,0xFF,0x7F,1, -0x519042,0xFF,0x7F,1, -0x5193D2,0xFF,0x7F,0, -0x5193D4,0xFF,0x7F,0, -0x5193D6,0xFF,0x7F,0, -0x5193D8,0xFF,0x7F,0, -0x5193DA,0xFF,0x7F,0, -0x5193DC,0xFF,0x7F,0, -0x5193DE,0xFF,0x7F,0, -0x5193E0,0xFF,0x7F,0, -0x5193E2,0xFF,0x7F,0, -0x5193E4,0xFF,0x7F,0, -0x5193E6,0xFF,0x7F,0, -0x5193E8,0xFF,0x7F,0, -0x5193EA,0xFF,0x7F,0, -0x5193EC,0xFF,0x7F,0, -0x5193F2,0xFF,0x7F,1, -0x5193F4,0xFF,0x7F,1, -0x5193F6,0xFF,0x7F,1, -0x5193F8,0xFF,0x7F,1, -0x5193FA,0xFF,0x7F,1, -0x5193FC,0xFF,0x7F,1, -0x5193FE,0xFF,0x7F,1, -0x519400,0xFF,0x7F,1, -0x519402,0xFF,0x7F,1, -0x519404,0xFF,0x7F,1, -0x519406,0xFF,0x7F,1, -0x519408,0xFF,0x7F,1, -0x51940A,0xFF,0x7F,1, -0x51940C,0xFF,0x7F,1, -0x3A7244,0xFF,0x7F,0, -0x3A724A,0xFF,0x7F,0, -0x3A724C,0xFF,0x7F,1, -0x3A724E,0xFF,0x7F,0, -0x3A7252,0xFF,0x7F,0, -0x3A7254,0xFF,0x7F,1, -0x3A7256,0xFF,0x7F,0, -0x3A7264,0xFF,0x7F,1, -0x3A726C,0xFF,0x7F,1, -0x3A7270,0xFF,0x7F,1, -0x3A7272,0xFF,0x7F,1, -0x3A7274,0xFF,0x7F,1, -0x3A7278,0xFF,0x7F,1, -0x3A727A,0xFF,0x7F,1, -0x3A727C,0xFF,0x7F,1, -0x3A7286,0xFF,0x7F,0, -0x3A7288,0xFF,0x7F,0, -0x3A728C,0xFF,0x7F,0, -0x3A7290,0xFF,0x7F,0, -0x3A7294,0xFF,0x7F,0, -0x3A7296,0xFF,0x7F,0, -0x3A72AE,0xFF,0x7F,1, -0x3A72B2,0xFF,0x7F,1, -0x3A72BC,0xFF,0x7F,1, -0x9F9A28,0xFF,0x7F,0, -0x9F9A2A,0xFF,0x7F,0, -0x9F9A2C,0xFF,0x7F,0, -0x9F9A2E,0xFF,0x7F,1, -0x9F9A30,0xFF,0x7F,1, -0x9F9A32,0xFF,0x7F,1, -0x9F9A34,0xFF,0x7F,0, -0x9F9A36,0xFF,0x7F,0, -0x9F9A38,0xFF,0x7F,0, -0x9F9A3A,0xFF,0x7F,1, -0x9F9A3C,0xFF,0x7F,1, -0x9F9A3E,0xFF,0x7F,1, -0x9F9A48,0xFF,0x7F,0, -0x9F9A4A,0xFF,0x7F,0, -0x9F9A4C,0xFF,0x7F,0, -0x9F9A4E,0xFF,0x7F,1, -0x9F9A50,0xFF,0x7F,1, -0x9F9A52,0xFF,0x7F,1, -0x9F9A56,0xFF,0x7F,0, -0x9F9A58,0xFF,0x7F,0, -0x9F9A5C,0xFF,0x7F,1, -0x9F9A5E,0xFF,0x7F,1, -0x9F9A26,0xFF,0x7F,0, -0x9F9A46,0xFF,0x7F,1, -0xA5DD32,0xFF,0x7F,0, -0xA5DD34,0xFF,0x7F,0, -0xA5DD38,0xFF,0x7F,0, -0xA5DD3A,0xFF,0x7F,0, -0xA5DD3C,0xFF,0x7F,0, -0xA5DD3E,0xFF,0x7F,0, -0xA5DD40,0xFF,0x7F,0, -0xA5DD42,0xFF,0x7F,0, -0xA5DD44,0xFF,0x7F,0, -0xA5DD46,0xFF,0x7F,0, -0xA5DD48,0xFF,0x7F,0, -0xA5DD4A,0xFF,0x7F,0, -0xA5DD4C,0xFF,0x7F,0, -0xA5DD4E,0x00,0x00,0, -0xA5DD52,0xFF,0x7F,1, -0xA5DD54,0xFF,0x7F,1, -0xA5DD58,0xFF,0x7F,1, -0xA5DD5A,0xFF,0x7F,1, -0xA5DD5C,0xFF,0x7F,1, -0xA5DD5E,0xFF,0x7F,1, -0xA5DD60,0xFF,0x7F,1, -0xA5DD62,0xFF,0x7F,1, -0xA5DD64,0xFF,0x7F,1, -0xA5DD66,0xFF,0x7F,1, -0xA5DD68,0xFF,0x7F,1, -0xA5DD6A,0xFF,0x7F,1, -0xA5DD6C,0xFF,0x7F,1, -0xA5DD6E,0x00,0x00,1, -0x3D0E08,0xFF,0x7F,1, -0x3D0E0A,0xFF,0x7F,1, -0x3D0E0C,0xFF,0x7F,1, -0x3D0E16,0xFF,0x7F,0, -0x3D0E18,0xFF,0x7F,0, -0x3D0E1A,0xFF,0x7F,0, -0x3CC9B8,0xFF,0x7F,0, -0x3CC9BA,0xFF,0x7F,0, -0x3CC9BC,0xFF,0x7F,0, -0x3CC9BE,0xFF,0x7F,0, -0x3CC9C0,0xFF,0x7F,0, -0x3CC9C2,0xFF,0x7F,0, -0x3CC9C4,0xFF,0x7F,0, -0x3CC9C6,0xFF,0x7F,0, -0x3CC9C8,0xFF,0x7F,0, -0x3CC9CA,0xFF,0x7F,0, -0x3CC9CC,0xFF,0x7F,0, -0x3CC9CE,0xFF,0x7F,0, -0x3CC9D0,0xFF,0x7F,0, -0x3CC9D2,0xFF,0x7F,0, -0x3CDE6E,0xFF,0x7F,1, -0x3CDE70,0xFF,0x7F,1, -0x3CDE72,0xFF,0x7F,1, -0x3CDE74,0xFF,0x7F,1, -0x3CDE76,0xDF,0x6E,2, -0x3CDE78,0xFF,0x5D,2, -0x3CDE7A,0x7F,0x3C,2, -0x3CDE7C,0xFF,0x7F,1, -0x3CDE7E,0xFF,0x7F,1, -0x3CDE80,0xFF,0x7F,1, -0x3CDE82,0xFF,0x7F,1, -0x3CDE84,0xFF,0x7F,1, -0x3CDE86,0xFF,0x7F,1, -0x3CDE88,0xFF,0x7F,1, -0x3CDE8A,0xFF,0x7F,1, -0x51AD1E,0xFF,0x7F,0, -0x51AD20,0xFF,0x7F,0, -0x51AD22,0xFF,0x7F,0, -0x51AD24,0xFF,0x7F,0, -0x51AD26,0xFF,0x7F,0, -0x51AD28,0xFF,0x7F,0, -0x51AD2A,0xFF,0x7F,0, -0x51AD2C,0xFF,0x7F,0, -0x51AD2E,0xFF,0x7F,0, -0x51AD30,0xFF,0x7F,0, -0x51AD32,0xFF,0x7F,0, -0x51AD34,0xFF,0x7F,0, -0x51AD36,0xFF,0x7F,0, -0x51AD38,0xFF,0x7F,0, -0x51AD3A,0xFF,0x7F,0, -0x51AD3E,0xFF,0x7F,1, -0x51AD40,0xFF,0x7F,1, -0x51AD42,0xFF,0x7F,1, -0x51AD44,0xFF,0x7F,1, -0x51AD46,0xFF,0x7F,1, -0x51AD48,0xFF,0x7F,1, -0x51AD4A,0xFF,0x7F,1, -0x51AD4C,0xFF,0x7F,1, -0x51AD4E,0xFF,0x7F,1, -0x51AD50,0xFF,0x7F,1, -0x51AD52,0xFF,0x7F,1, -0x51AD54,0xFF,0x7F,1, -0x51AD56,0xFF,0x7F,1, -0x51AD58,0xFF,0x7F,1, -0x51AD5A,0xFF,0x7F,1, -0x51A49E,0xFF,0x7F,0, -0x51A4A0,0xFF,0x7F,0, -0x51A4A2,0xFF,0x7F,0, -0x51A4A4,0xFF,0x7F,0, -0x51A4A6,0xFF,0x7F,0, -0x51A4A8,0xFF,0x7F,0, -0x51A4AA,0xFF,0x7F,0, -0x51A4AC,0xFF,0x7F,0, -0x51A4AE,0xFF,0x7F,0, -0x51A4B0,0xFF,0x7F,0, -0x51A4B2,0xFF,0x7F,0, -0x51A4B4,0xFF,0x7F,0, -0x51A4B6,0xFF,0x7F,0, -0x51A4B8,0xFF,0x7F,0, -0x51A4BA,0xFF,0x7F,0, -0x51A4BE,0xFF,0x7F,1, -0x51A4C0,0xFF,0x7F,1, -0x51A4C2,0xFF,0x7F,1, -0x51A4C4,0xFF,0x7F,1, -0x51A4C6,0xFF,0x7F,1, -0x51A4C8,0xFF,0x7F,1, -0x51A4CA,0xFF,0x7F,1, -0x51A4CC,0xFF,0x7F,1, -0x51A4CE,0xFF,0x7F,1, -0x51A4D0,0xFF,0x7F,1, -0x51A4D2,0xFF,0x7F,1, -0x51A4D4,0xFF,0x7F,1, -0x51A4D6,0xFF,0x7F,1, -0x51A4D8,0xFF,0x7F,1, -0x51A4DA,0xFF,0x7F,1, -0x51A97E,0xFF,0x7F,0, -0x51A980,0xFF,0x7F,0, -0x51A982,0xFF,0x7F,0, -0x51A984,0xFF,0x7F,0, -0x51A986,0xFF,0x7F,0, -0x51A988,0xFF,0x7F,0, -0x51A98A,0xFF,0x7F,0, -0x51A98C,0xFF,0x7F,0, -0x51A98E,0xFF,0x7F,0, -0x51A990,0xFF,0x7F,0, -0x51A992,0xFF,0x7F,0, -0x51A994,0xFF,0x7F,0, -0x51A996,0xFF,0x7F,0, -0x51A998,0xFF,0x7F,0, -0x51A99A,0xFF,0x7F,0, -0x51A95E,0xFF,0x7F,1, -0x51A960,0xFF,0x7F,1, -0x51A962,0xFF,0x7F,1, -0x51A964,0xFF,0x7F,1, -0x51A966,0xFF,0x7F,1, -0x51A968,0xFF,0x7F,1, -0x51A96A,0xFF,0x7F,1, -0x51A96C,0xFF,0x7F,1, -0x51A96E,0xFF,0x7F,1, -0x51A970,0xFF,0x7F,1, -0x51A972,0xFF,0x7F,1, -0x51A974,0xFF,0x7F,1, -0x51A976,0xFF,0x7F,1, -0x51A978,0xFF,0x7F,1, -0x51A97A,0xFF,0x7F,1, -0x51A9FE,0xFF,0x7F,0, -0x51AA00,0xFF,0x7F,0, -0x51AA02,0xFF,0x7F,0, -0x51AA0A,0xFF,0x7F,0, -0x51AA0E,0xFF,0x7F,1, -0x51AA10,0xFF,0x7F,1, -0x51AA12,0xFF,0x7F,1, -0x3CC976,0x7F,0x4F,0, -0x3CC978,0xFF,0x7F,0, -0x3CC97A,0xFF,0x7F,0, -0x3CC97C,0xFF,0x7F,0, -0x3CC97E,0xFF,0x7F,0, -0x3CC980,0xFF,0x7F,0, -0x3CC982,0xFF,0x7F,0, -0x3CC984,0xFF,0x7F,0, -0x3CC986,0xFF,0x7F,0, -0x3CC988,0xFF,0x7F,0, -0x3CC98A,0xFF,0x7F,0, -0x3CC98C,0xFF,0x7F,0, -0x3CC98E,0xFF,0x7F,0, -0x3CC990,0xFF,0x7F,0, -0x3CC992,0xFF,0x7F,0, -0x3D4B44,0xFF,0x7F,0, -0x3D4B46,0xFF,0x7F,0, -0x3D4B48,0xFF,0x7F,0, -0x3D4B4A,0xFF,0x7F,0, -0x3D4B4C,0xFF,0x7F,0, -0x3D4B4E,0xFF,0x7F,0, -0x3D4B50,0xFF,0x7F,0, -0x3D4B52,0xFF,0x7F,0, -0x3D4B54,0xFF,0x7F,0, -0x3D4B56,0xFF,0x7F,0, -0x3D4B58,0xFF,0x7F,0, -0x3D4B5A,0x00,0x00,0, -0x3D4B5C,0xFF,0x7F,0, -0x3D4B5E,0xFF,0x7F,0, -0x3D4B42,0xFF,0x7F,0, -0x3CCA38,0xFF,0x7F,1, -0x3CCA3A,0xFF,0x7F,1, -0x3CCA3C,0xFF,0x7F,1, -0x3CCA3E,0xFF,0x7F,1, -0x3CCA40,0xFF,0x7F,1, -0x3CCA42,0xFF,0x7F,1, -0x3CCA44,0xFF,0x7F,1, -0x3CCA46,0xFF,0x7F,1, -0x3CCA48,0xFF,0x7F,1, -0x3CCA4A,0xFF,0x7F,1, -0x3CCA4C,0xFF,0x7F,1, -0x3CCA4E,0xFF,0x7F,1, -0x3CCA50,0xFF,0x7F,1, -0x3CCA52,0xFF,0x7F,1, -0x3CCA36,0xFF,0x7F,1, -0x3CFB30,0xFF,0x7F,0, -0x3CFB32,0xFF,0x7F,0, -0x3CFB34,0xFF,0x7F,0, -0x3CFB36,0xFF,0x7F,0, -0x3CFB38,0xFF,0x7F,0, -0x3CFB3A,0xFF,0x7F,0, -0x3CFB3C,0xFF,0x7F,0, -0x3CFB3E,0xFF,0x7F,0, -0x3CFB40,0xFF,0x7F,0, -0x3CFB42,0xFF,0x7F,0, -0x3CFB44,0xFF,0x7F,0, -0x3CFB46,0xFF,0x7F,0, -0x3CFB48,0xFF,0x7F,0, -0x3CFB4A,0xFF,0x7F,0, -0x3CFB70,0xFF,0x7F,1, -0x3CFB72,0xFF,0x7F,1, -0x3CFB74,0xFF,0x7F,1, -0x3CFB76,0xFF,0x7F,1, -0x3CFB78,0xFF,0x7F,1, -0x3CFB7A,0xFF,0x7F,1, -0x3CFB7C,0xFF,0x7F,1, -0x3CFB7E,0xFF,0x7F,1, -0x3CFB80,0xFF,0x7F,1, -0x3CFB82,0xFF,0x7F,1, -0x3CFB84,0xFF,0x7F,1, -0x3CFB86,0xFF,0x7F,1, -0x3CFB88,0xFF,0x7F,1, -0x3CFB8A,0xFF,0x7F,1, -0x3D5044,0xFF,0x7F,0, -0x3D5046,0xFF,0x7F,0, -0x3D5048,0xFF,0x7F,0, -0x3D504A,0xFF,0x7F,0, -0x3D504C,0xFF,0x7F,0, -0x3D504E,0xFF,0x7F,0, -0x3D5050,0xFF,0x7F,0, -0x3D5052,0xFF,0x7F,0, -0x3D5054,0xFF,0x7F,0, -0x3D5056,0xFF,0x7F,0, -0x3D505C,0xFF,0x7F,0, -0x3D505E,0xFF,0x7F,0, -0x3D5084,0xFF,0x7F,1, -0x3D5086,0xFF,0x7F,1, -0x3D5088,0xFF,0x7F,1, -0x3D508A,0xFF,0x7F,1, -0x3D508C,0xFF,0x7F,1, -0x3D508E,0xFF,0x7F,1, -0x3D5090,0xFF,0x7F,1, -0x3D5092,0xFF,0x7F,1, -0x3D5094,0xFF,0x7F,1, -0x3D5096,0xFF,0x7F,1, -0x3D509C,0xFF,0x7F,1, -0x3D509E,0xFF,0x7F,1, -0xA5DDA2,0xFF,0x7F,0, -0xA5DDA4,0x00,0x00,0, -0xA5DDA6,0xFF,0x7F,0, -0xA5DDA8,0xFF,0x7F,0, -0xA5DDAE,0x00,0x00,0, -0xA5DDC2,0xFF,0x7F,1, -0xA5DDC4,0x00,0x00,1, -0xA5DDC6,0xFF,0x7F,1, -0xA5DDC8,0xFF,0x7F,1, -0xA5DDCE,0x00,0x00,1, -0x3D3E0C,0xFF,0x7F,1, -0x3D3E0E,0xFF,0x7F,1, -0x3D3E10,0xFF,0x7F,0, -0x3D3E12,0xFF,0x7F,0, -0x3CF1C0,0xFF,0x7F,0, -0x3CF1C2,0xFF,0x7F,0, -0x3CF200,0xFF,0x7F,1, -0x3CF202,0xFF,0x7F,1, -0x3D3604,0xFF,0x7F,0, -0x3D3606,0xFF,0x7F,1, -0x3D360A,0xFF,0x7F,1, -0x3D360C,0xFF,0x7F,1, -0x3D360E,0xFF,0x7F,1, -0x3D3610,0xFF,0x7F,0, -0x3D3612,0xFF,0x7F,0, -0x3D3614,0xFF,0x7F,0, -0x3D1A42,0xFF,0x7F,0, -0x3D1A44,0xFF,0x7F,0, -0x3D1A46,0xFF,0x7F,0, -0x3D1A48,0xFF,0x7F,0, -0x3D1A4A,0xFF,0x7F,0, -0x3D1A82,0xFF,0x7F,1, -0x3D1A84,0xFF,0x7F,1, -0x3D1A86,0xFF,0x7F,1, -0x3D1A88,0xFF,0x7F,1, -0x3D1A8A,0xFF,0x7F,1, -0x3CE280,0xFF,0x7F,0, -0x3CE282,0xFF,0x7F,0, -0x3CE2C0,0xFF,0x7F,1, -0x3CE2C2,0xFF,0x7F,1, -0x4FA29C,0xFF,0x7F,0, -0x4FA29E,0xFF,0x7F,0, -0x4FA2DC,0xFF,0x7F,1, -0x4FA2DE,0xFF,0x7F,1, -0x8D3C5E,0xFF,0x7F,0, -0x8D3C60,0xFF,0x7F,0, -0x8D3C62,0xFF,0x7F,0, -0x8D3C64,0xFF,0x7F,0, -0x8D3B9C,0xAE,0x7E,0, -0x8D3BA0,0x20,0x4E,0, -0x8D3B9E,0x6C,0x7E,0, -0x3D4C02,0xFF,0x7F,0, -0x3D4C0C,0xFF,0x7F,0, -0x3D4C0E,0xFF,0x7F,0, -0x3D4C10,0xFF,0x7F,0, -0x3D4C12,0xFF,0x7F,0, -0x3D4C14,0xFF,0x7F,0, -0x3D2D96,0xFF,0x7F,0, -0x3D2D98,0xFF,0x7F,0, -0x3D2D9A,0xFF,0x7F,0, -0x3D2D9C,0xFF,0x7F,0, -0x8CC272,0xFF,0x7F,1, -0x8CC274,0xFF,0x7F,1, -0x8CC276,0xFF,0x7F,1, -0x8CC278,0x00,0x00,1, -0x8CC27A,0x00,0x00,1, -0x8CC27C,0x00,0x00,1, -0x3D4784,0xFF,0x7F,0, -0x3D4786,0xFF,0x7F,1, -0x3D4788,0xFF,0x7F,1, -0x3D478A,0x00,0x00,1, -0x3D478C,0xFF,0x7F,0, -0x3D478E,0xFF,0x7F,0, -0x3D4790,0xFF,0x7F,0, -0x3D4792,0xFF,0x7F,0, -0x3D4794,0x00,0x00,0, -0x8CF4B2,0xFF,0x7F,1, -0x8CF4B4,0xFF,0x7F,1, -0x8CF4B6,0xFF,0x7F,1, -0x8CF4B8,0x00,0x00,1, -0x8CF4BA,0x00,0x00,1, -0x8CF4BC,0x00,0x00,1, -0x8CF7B2,0xFF,0x7F,1, -0x8CF7B4,0xFF,0x7F,1, -0x8CF7B6,0xFF,0x7F,1, -0x8CF7B8,0x00,0x00,1, -0x8CF7BA,0x00,0x00,1, -0x8CF7BC,0x00,0x00,1, -0x8D2D52,0xFF,0x7F,1, -0x8D2D54,0xFF,0x7F,1, -0x8D2D56,0xFF,0x7F,1, -0x8D2D58,0x00,0x00,1, -0x8D2D5A,0x00,0x00,1, -0x8D2D5C,0x00,0x00,1, -0x8D0096,0xFF,0x7F,1, -0x8D0A16,0xFF,0x7F,1, -0x8D006E,0xFF,0x7F,1, -0x8D0070,0xFF,0x7F,1, -0x8D09AE,0xFF,0x7F,1, -0x8D09B0,0xFF,0x7F,1, -0x3CE8F6,0xFF,0x7F,1, -0x3CE8F8,0xFF,0x7F,1, -0x3CE8FA,0xFF,0x7F,1, -0x8D0952,0xFF,0x7F,1, -0x8D0954,0xFF,0x7F,1, -0x8D0956,0x00,0x00,1, -0x8D0958,0xFF,0x7F,1, -0x8D095A,0x00,0x00,1, -0x8D095C,0x00,0x00,1, -0x3CE976,0xFF,0x7F,1, -0x3CE978,0xFF,0x7F,1, -0x3CE97A,0xFF,0x7F,1, -0x4F8912,0xFF,0x7F,1, -0x4F8914,0xFF,0x7F,1, -0x4F8916,0xFF,0x7F,1, -0x8D0456,0xFF,0x7F,0, -0x8D09F6,0xFF,0x7F,0, -0x8D042E,0xFF,0x7F,0, -0x8D0430,0xFF,0x7F,0, -0x8D09CE,0xFF,0x7F,0, -0x8D09D0,0xFF,0x7F,0, -0x3CE8B6,0xFF,0x7F,0, -0x3CE8B8,0xFF,0x7F,0, -0x3CE8BA,0xFF,0x7F,0, -0x8D0890,0xFF,0x7F,0, -0x8D0892,0xFF,0x7F,0, -0x8D0894,0xFF,0x7F,0, -0x8D0896,0xFF,0x7F,0, -0x3CE932,0xFF,0x7F,0, -0x3CE936,0xFF,0x7F,0, -0x3CE938,0xFF,0x7F,0, -0x3CE93A,0xFF,0x7F,0, -0x3CE940,0xFF,0x7F,0, -0x4F88CE,0xFF,0x7F,0, -0x4F88D2,0xFF,0x7F,0, -0x4F88D4,0xFF,0x7F,0, -0x4F88D6,0xFF,0x7F,0, -0x4F88DC,0xFF,0x7F,0, -0x8D095E,0xFF,0x7F,0, -0x8D0960,0xFF,0x7F,0, -0x8D0962,0xFF,0x7F,0, -0x8D0964,0xFF,0x7F,0, -0x3D2104,0xFF,0x7F,0, -0x3D210E,0xFF,0x7F,0, -0x3D2110,0xFF,0x7F,0, -0x3D2118,0xFF,0x7F,0, -0x3D211A,0xFF,0x7F,0, -0x8D0052,0xFF,0x7F,1, -0x8D0054,0xFF,0x7F,1, -0x8D0056,0xFF,0x7F,1, -0x8D0058,0x00,0x00,1, -0x8D005A,0x00,0x00,1, -0x8D005C,0x00,0x00,1, -0x8D005E,0xFF,0x7F,0, -0x8D0060,0xFF,0x7F,0, -0x8D0062,0xFF,0x7F,0, -0x8D0064,0xFF,0x7F,0, -0x3C9E36,0xFF,0x7F,1, -0x3C9E38,0xFF,0x7F,1, -0x3C9E3A,0xFF,0x7F,1, -0x3C9E3C,0xFF,0x7F,0, -0x3C9E3E,0xFF,0x7F,0, -0x3C9E40,0xFF,0x7F,0, -0x4F4D50,0xFF,0x7F,0, -0x4F4D52,0xFF,0x7F,0, -0x4F4D54,0xFF,0x7F,0, -0x4F4D56,0xFF,0x7F,0, -0x4F4D58,0xFF,0x7F,0, -0x4F4D5A,0xFF,0x7F,0, -0x4F4D5C,0xFF,0x7F,0, -0x4F4D5E,0xFF,0x7F,0, -0x4F4D60,0xFF,0x7F,0, -0x4F4D62,0xFF,0x7F,0, -0x4F4D64,0xFF,0x7F,0, -0x4F4D66,0xFF,0x7F,0, -0x4F4D68,0xFF,0x7F,0, -0x4F4D6A,0xFF,0x7F,0, -0x3C9314,0xFF,0x7F,0, -0x3C9316,0xBD,0x7B,0, -0x3C9318,0x39,0x6F,0, -0x3C931A,0xB5,0x62,0, -0x3C931C,0xB5,0x56,0, -0x3C931E,0x31,0x46,0, -0x3C9320,0xDE,0x7F,0, -0x3C9322,0x5A,0x6F,0, -0x3C9324,0x89,0x52,0, -0x3C9326,0x08,0x46,0, -0x3C9328,0x39,0x67,0, -0x3C932A,0x73,0x4E,0, -0x3C932C,0x10,0x42,0, -0x3C932E,0xAD,0x35,0, -0x9F9CEA,0xFF,0x7F,0, -0x9F9CEC,0xBD,0x7B,0, -0x9F9CEE,0x39,0x6F,0, -0x9F9CF0,0xB5,0x62,0, -0x9F9CF2,0xB5,0x56,0, -0x9F9CF4,0x31,0x46,0, -0x9F9CF6,0xDE,0x7F,0, -0x9F9CF8,0x5A,0x6F,0, -0x9F9CFA,0x89,0x52,0, -0x9F9CFC,0x08,0x46,0, -0x9F9CFE,0x39,0x67,0, -0x9F9D00,0x73,0x4E,0, -0x9F9D02,0x10,0x42,0, -0x9F9D04,0xAD,0x35,0, -0x4F4E10,0xFF,0x7F,1, -0x4F4E12,0xFF,0x7F,1, -0x4F4E14,0xFF,0x7F,1, -0x4F4E16,0xFF,0x7F,1, -0x4F4E18,0xFF,0x7F,1, -0x4F4E1A,0xFF,0x7F,1, -0x4F4E1C,0xFF,0x7F,1, -0x4F4E1E,0xFF,0x7F,1, -0x4F4E20,0xFF,0x7F,1, -0x4F4E22,0xFF,0x7F,1, -0x4F4E24,0xFF,0x7F,1, -0x4F4E26,0xFF,0x7F,1, -0x4F4E28,0xFF,0x7F,1, -0x4F4E2A,0xFF,0x7F,1, -0x3C9444,0xFF,0x7F,1, -0x3C9446,0xBD,0x7B,1, -0x3C9448,0x39,0x6F,1, -0x3C944A,0xB5,0x62,1, -0x3C944C,0xB5,0x56,1, -0x3C944E,0x31,0x46,1, -0x3C9450,0xDE,0x7F,1, -0x3C9452,0x5A,0x6F,1, -0x3C9454,0x89,0x52,1, -0x3C9456,0x08,0x46,1, -0x3C9458,0x39,0x67,1, -0x3C945A,0x73,0x4E,1, -0x3C945C,0x10,0x42,1, -0x3C945E,0xAD,0x35,1, -0x9F9D68,0xFF,0x7F,1, -0x9F9D6A,0xBD,0x7B,1, -0x9F9D6C,0x39,0x6F,1, -0x9F9D6E,0xB5,0x62,1, -0x9F9D70,0xB5,0x56,1, -0x9F9D72,0x31,0x46,1, -0x9F9D74,0xDE,0x7F,1, -0x9F9D76,0x5A,0x6F,1, -0x9F9D78,0x89,0x52,1, -0x9F9D7A,0x08,0x46,1, -0x9F9D7C,0x39,0x67,1, -0x9F9D7E,0x73,0x4E,1, -0x9F9D80,0x10,0x42,1, -0x9F9D82,0xAD,0x35,1, -0x518E12,0xFF,0x7F,0, -0x518E10,0xFF,0x7F,0, -0x518E1A,0xFF,0x7F,0, -0x518E18,0xFF,0x7F,0, -0xA6202E,0xFF,0x7F,0, -0xA62030,0xFF,0x7F,0, -0xA62032,0xFF,0x7F,0, -0xA62034,0xFF,0x7F,0, -0xA6203A,0x00,0x00,0, -0xA6204E,0xFF,0x7F,1, -0xA62050,0xFF,0x7F,1, -0xA62052,0xFF,0x7F,1, -0xA62054,0xFF,0x7F,1, -0xA6205A,0x00,0x00,1, -0x3D4804,0xFF,0x7F,0, -0x3D4806,0xFF,0x7F,0, -0x3D4808,0xFF,0x7F,0, -0x3D480A,0xFF,0x7F,0, -0x3D4810,0xFF,0x7F,0, -0x3D4812,0xFF,0x7F,0, -0x3D480C,0xFF,0x7F,1, -0x3D480E,0xFF,0x7F,1, -0x8D049E,0xFF,0x7F,0, -0x8D04A0,0xFF,0x7F,0, -0x8D04A2,0xFF,0x7F,0, -0x8D0592,0xFF,0x7F,1, -0x8D0594,0xFF,0x7F,1, -0x8D0596,0xFF,0x7F,1, -0x8D0598,0x00,0x00,1, -0x8D059A,0x00,0x00,1, -0x8D059C,0x00,0x00,1, -0x4F5010,0xFF,0x7F,0, -0x4F5012,0xFF,0x7F,0, -0x4F5014,0xFF,0x7F,0, -0x4F5016,0xFF,0x7F,0, -0x4F4ECE,0xFF,0x7F,0, -0x4F4ED0,0xFF,0x7F,0, -0x4F4ED2,0xFF,0x7F,0, -0x4F4ED4,0xFF,0x7F,0, -0x4F4ED6,0xFF,0x7F,0, -0x4F4ED8,0xFF,0x7F,0, -0x4F4EDA,0xFF,0x7F,1, -0x4F4EDC,0xFF,0x7F,1, -0x4F4EDE,0xFF,0x7F,1, -0x4F4EE0,0xFF,0x7F,1, -0x4F4EE2,0xFF,0x7F,1, -0x3CC9F8,0xFF,0x7F,0, -0x3CC9FA,0xFF,0x7F,0, -0x3CC9FC,0xFF,0x7F,0, -0x3CC9FE,0xFF,0x7F,0, -0x3CCA00,0xFF,0x7F,0, -0x3CCA02,0xFF,0x7F,0, -0x3CCA0A,0xFF,0x7F,0, -0x3CCA0C,0xFF,0x7F,0, -0x3CCA0E,0xFF,0x7F,0, -0x3CCA10,0xFF,0x7F,0, -0x3CCA12,0xFF,0x7F,0, -0x8CBE1E,0xFF,0x7F,0, -0x8CBE20,0xFF,0x7F,0, -0x8CBE22,0xFF,0x7F,0, -0x8CBE3E,0xFF,0x7F,1, -0x8CBE40,0xFF,0x7F,1, -0x8CBE42,0xFF,0x7F,1, -0x8CBEDE,0xFF,0x7F,0, -0x8CBEE0,0xFF,0x7F,0, -0x8CBED4,0xFF,0x7F,0, -0x8CBEE2,0xFF,0x7F,0, -0x8CBECA,0xFF,0x7F,0, -0x3B8F38,0xFF,0x7F,1, -0x3B8F3A,0xFF,0x7F,1, -0x3B8F40,0xFF,0x7F,0, -0x3B8F42,0xFF,0x7F,0, -0x3D1090,0xFF,0x7F,0, -0x3D1092,0xFF,0x7F,0, -0x3D1094,0xFF,0x7F,0, -0x3D1096,0xFF,0x7F,0, -0x3D1098,0xFF,0x7F,0, -0x3D109A,0x00,0x00,0, -0x3D109C,0xFF,0x7F,0, -0x3D109E,0xFF,0x7F,0, -0x3D1082,0xFF,0x7F,0, -0x3D1084,0xFF,0x7F,0, -0x3D1086,0xFF,0x7F,0, -0x3D10C2,0xFF,0x7F,1, -0x3D10C4,0xFF,0x7F,1, -0x3D10C6,0xFF,0x7F,1, -0x3D10D0,0xFF,0x7F,1, -0x3D10D2,0xFF,0x7F,1, -0x3D10D4,0xFF,0x7F,1, -0x3D10D6,0xFF,0x7F,1, -0x3D10D8,0xFF,0x7F,1, -0x3D10DA,0x00,0x00,1, -0x3D10DC,0xFF,0x7F,1, -0x3D10DE,0xFF,0x7F,1, -0x3D14C2,0xFF,0x7F,0, -0x3D14C4,0xFF,0x7F,0, -0x3D14C6,0xFF,0x7F,0, -0x3D14C8,0xFF,0x7F,0, -0x3D14CA,0xFF,0x7F,0, -0x3D14CC,0xFF,0x7F,0, -0x3D14CE,0xFF,0x7F,0, -0x3D14D0,0xFF,0x7F,0, -0x3D14D2,0xFF,0x7F,0, -0x3D14D4,0xFF,0x7F,0, -0x3D14D6,0xFF,0x7F,0, -0x3D1502,0xFF,0x7F,1, -0x3D1504,0xFF,0x7F,1, -0x3D1506,0xFF,0x7F,1, -0x3D1508,0xFF,0x7F,1, -0x3D150A,0xFF,0x7F,1, -0x3D150C,0xFF,0x7F,1, -0x3D150E,0xFF,0x7F,1, -0x3D1510,0xFF,0x7F,1, -0x3D1512,0xFF,0x7F,1, -0x3D1514,0xFF,0x7F,1, -0x3D1516,0xFF,0x7F,1, -0x3CE0F0,0xFF,0x7F,1, -0x3CE0F2,0xFF,0x7F,1, -0x3CE0F4,0xFF,0x7F,1, -0x3CE0D0,0xFF,0x7F,0, -0x3CE0D2,0xFF,0x7F,0, -0x3CE0D4,0xFF,0x7F,0, -0x8D3DAC,0xFF,0x7F,0, -0x8D3DBC,0xFF,0x7F,0, -0x8D3DB4,0xFF,0x7F,0, -0x8D3D86,0xFF,0x7F,0, -0x8D3DBA,0xFF,0x7F,0, -0x8D3DB8,0xFF,0x7F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/TrueChaos.txt b/worlds/mlss/colors/TrueChaos.txt deleted file mode 100644 index f75da0a16d57..000000000000 --- a/worlds/mlss/colors/TrueChaos.txt +++ /dev/null @@ -1,812 +0,0 @@ -0x3CC878,0, -0x3CC87A,0, -0x3CC87C,0, -0x3CC87E,0, -0x3CC880,0, -0x3CC882,0, -0x3CC884,0, -0x3CC886,0, -0x3CC888,0, -0x3CC88A,0, -0x3CC88C,0, -0x3CC88E,0, -0x3CC890,0, -0x3CC892,0, -0x3CC8B8,1, -0x3CC8BA,1, -0x3CC8BC,1, -0x3CC8BE,1, -0x3CC8C0,1, -0x3CC8C2,1, -0x3CC8C4,1, -0x3CC8C6,1, -0x3CC8C8,1, -0x3CC8CA,1, -0x3CC8CC,1, -0x3CC8CE,1, -0x3CC8D0,1, -0x3CC8D2,1, -0x4F4CD0,0, -0x4F4CD2,0, -0x4F4CD4,0, -0x4F4CD6,0, -0x4F4CD8,0, -0x4F4CDA,0, -0x4F4CDC,0, -0x4F4CDE,0, -0x4F4CE0,0, -0x4F4CE2,0, -0x4F4CE4,0, -0x4F4CE6,0, -0x4F4CE8,0, -0x4F4CEA,0, -0x4F4D10,1, -0x4F4D12,1, -0x4F4D14,1, -0x4F4D16,1, -0x4F4D18,1, -0x4F4D1A,1, -0x4F4D1C,1, -0x4F4D1E,1, -0x4F4D20,1, -0x4F4D22,1, -0x4F4D24,1, -0x4F4D26,1, -0x4F4D28,1, -0x4F4D2A,1, -0x4F51D8,1, -0x4F51DA,1, -0x4F51DC,0, -0x4F51DE,0, -0x4F51E8,0, -0x4F51EA,1, -0x4FB684,0, -0x4FB686,0, -0x4FB688,0, -0x4FB6A4,1, -0x4FB6A6,1, -0x4FB6A8,1, -0x4FB692,0, -0x4FB6B2,1, -0x4FB786,0, -0x4FB788,0, -0x4FB78A,0, -0x4FB7A6,1, -0x4FB7A8,1, -0x4FB7AA,1, -0x519006,0, -0x519008,0, -0x51900C,0, -0x51900E,0, -0x519010,0, -0x519012,0, -0x519014,0, -0x519016,0, -0x519018,0, -0x51901A,0, -0x51901C,0, -0x51901E,0, -0x519020,0, -0x519022,0, -0x519026,1, -0x519028,1, -0x51902C,1, -0x51902E,1, -0x519030,1, -0x519032,1, -0x519034,1, -0x519036,1, -0x519038,1, -0x51903A,1, -0x51903C,1, -0x51903E,1, -0x519040,1, -0x519042,1, -0x5193D2,0, -0x5193D4,0, -0x5193D6,0, -0x5193D8,0, -0x5193DA,0, -0x5193DC,0, -0x5193DE,0, -0x5193E0,0, -0x5193E2,0, -0x5193E4,0, -0x5193E6,0, -0x5193E8,0, -0x5193EA,0, -0x5193EC,0, -0x5193F2,1, -0x5193F4,1, -0x5193F6,1, -0x5193F8,1, -0x5193FA,1, -0x5193FC,1, -0x5193FE,1, -0x519400,1, -0x519402,1, -0x519404,1, -0x519406,1, -0x519408,1, -0x51940A,1, -0x51940C,1, -0x3A7244,0, -0x3A724A,0, -0x3A724C,1, -0x3A724E,0, -0x3A7252,0, -0x3A7254,1, -0x3A7256,0, -0x3A7264,1, -0x3A726C,1, -0x3A7270,1, -0x3A7272,1, -0x3A7274,1, -0x3A7278,1, -0x3A727A,1, -0x3A727C,1, -0x3A7286,0, -0x3A7288,0, -0x3A728C,0, -0x3A7290,0, -0x3A7294,0, -0x3A7296,0, -0x3A72AE,1, -0x3A72B2,1, -0x3A72BC,1, -0x9F9A28,0, -0x9F9A2A,0, -0x9F9A2C,0, -0x9F9A2E,1, -0x9F9A30,1, -0x9F9A32,1, -0x9F9A34,0, -0x9F9A36,0, -0x9F9A38,0, -0x9F9A3A,1, -0x9F9A3C,1, -0x9F9A3E,1, -0x9F9A48,0, -0x9F9A4A,0, -0x9F9A4C,0, -0x9F9A4E,1, -0x9F9A50,1, -0x9F9A52,1, -0x9F9A56,0, -0x9F9A58,0, -0x9F9A5C,1, -0x9F9A5E,1, -0x9F9A26,0, -0x9F9A46,1, -0xA5DD32,0, -0xA5DD34,0, -0xA5DD38,0, -0xA5DD3A,0, -0xA5DD3C,0, -0xA5DD3E,0, -0xA5DD40,0, -0xA5DD42,0, -0xA5DD44,0, -0xA5DD46,0, -0xA5DD48,0, -0xA5DD4A,0, -0xA5DD4C,0, -0xA5DD4E,0, -0xA5DD52,1, -0xA5DD54,1, -0xA5DD58,1, -0xA5DD5A,1, -0xA5DD5C,1, -0xA5DD5E,1, -0xA5DD60,1, -0xA5DD62,1, -0xA5DD64,1, -0xA5DD66,1, -0xA5DD68,1, -0xA5DD6A,1, -0xA5DD6C,1, -0xA5DD6E,1, -0x3D0E08,1, -0x3D0E0A,1, -0x3D0E0C,1, -0x3D0E16,0, -0x3D0E18,0, -0x3D0E1A,0, -0x3CC9B8,0, -0x3CC9BA,0, -0x3CC9BC,0, -0x3CC9BE,0, -0x3CC9C0,0, -0x3CC9C2,0, -0x3CC9C4,0, -0x3CC9C6,0, -0x3CC9C8,0, -0x3CC9CA,0, -0x3CC9CC,0, -0x3CC9CE,0, -0x3CC9D0,0, -0x3CC9D2,0, -0x3CDE6E,1, -0x3CDE70,1, -0x3CDE72,1, -0x3CDE74,1, -0x3CDE76,2, -0x3CDE78,2, -0x3CDE7A,2, -0x3CDE7C,1, -0x3CDE7E,1, -0x3CDE80,1, -0x3CDE82,1, -0x3CDE84,1, -0x3CDE86,1, -0x3CDE88,1, -0x3CDE8A,1, -0x51AD1E,0, -0x51AD20,0, -0x51AD22,0, -0x51AD24,0, -0x51AD26,0, -0x51AD28,0, -0x51AD2A,0, -0x51AD2C,0, -0x51AD2E,0, -0x51AD30,0, -0x51AD32,0, -0x51AD34,0, -0x51AD36,0, -0x51AD38,0, -0x51AD3A,0, -0x51AD3E,1, -0x51AD40,1, -0x51AD42,1, -0x51AD44,1, -0x51AD46,1, -0x51AD48,1, -0x51AD4A,1, -0x51AD4C,1, -0x51AD4E,1, -0x51AD50,1, -0x51AD52,1, -0x51AD54,1, -0x51AD56,1, -0x51AD58,1, -0x51AD5A,1, -0x51A49E,0, -0x51A4A0,0, -0x51A4A2,0, -0x51A4A4,0, -0x51A4A6,0, -0x51A4A8,0, -0x51A4AA,0, -0x51A4AC,0, -0x51A4AE,0, -0x51A4B0,0, -0x51A4B2,0, -0x51A4B4,0, -0x51A4B6,0, -0x51A4B8,0, -0x51A4BA,0, -0x51A4BE,1, -0x51A4C0,1, -0x51A4C2,1, -0x51A4C4,1, -0x51A4C6,1, -0x51A4C8,1, -0x51A4CA,1, -0x51A4CC,1, -0x51A4CE,1, -0x51A4D0,1, -0x51A4D2,1, -0x51A4D4,1, -0x51A4D6,1, -0x51A4D8,1, -0x51A4DA,1, -0x51A97E,0, -0x51A980,0, -0x51A982,0, -0x51A984,0, -0x51A986,0, -0x51A988,0, -0x51A98A,0, -0x51A98C,0, -0x51A98E,0, -0x51A990,0, -0x51A992,0, -0x51A994,0, -0x51A996,0, -0x51A998,0, -0x51A99A,0, -0x51A95E,1, -0x51A960,1, -0x51A962,1, -0x51A964,1, -0x51A966,1, -0x51A968,1, -0x51A96A,1, -0x51A96C,1, -0x51A96E,1, -0x51A970,1, -0x51A972,1, -0x51A974,1, -0x51A976,1, -0x51A978,1, -0x51A97A,1, -0x51A9FE,0, -0x51AA00,0, -0x51AA02,0, -0x51AA0A,0, -0x51AA0E,1, -0x51AA10,1, -0x51AA12,1, -0x3CC976,0, -0x3CC978,0, -0x3CC97A,0, -0x3CC97C,0, -0x3CC97E,0, -0x3CC980,0, -0x3CC982,0, -0x3CC984,0, -0x3CC986,0, -0x3CC988,0, -0x3CC98A,0, -0x3CC98C,0, -0x3CC98E,0, -0x3CC990,0, -0x3CC992,0, -0x3D4B44,0, -0x3D4B46,0, -0x3D4B48,0, -0x3D4B4A,0, -0x3D4B4C,0, -0x3D4B4E,0, -0x3D4B50,0, -0x3D4B52,0, -0x3D4B54,0, -0x3D4B56,0, -0x3D4B58,0, -0x3D4B5A,0, -0x3D4B5C,0, -0x3D4B5E,0, -0x3D4B42,0, -0x3CCA38,1, -0x3CCA3A,1, -0x3CCA3C,1, -0x3CCA3E,1, -0x3CCA40,1, -0x3CCA42,1, -0x3CCA44,1, -0x3CCA46,1, -0x3CCA48,1, -0x3CCA4A,1, -0x3CCA4C,1, -0x3CCA4E,1, -0x3CCA50,1, -0x3CCA52,1, -0x3CCA36,1, -0x3CFB30,0, -0x3CFB32,0, -0x3CFB34,0, -0x3CFB36,0, -0x3CFB38,0, -0x3CFB3A,0, -0x3CFB3C,0, -0x3CFB3E,0, -0x3CFB40,0, -0x3CFB42,0, -0x3CFB44,0, -0x3CFB46,0, -0x3CFB48,0, -0x3CFB4A,0, -0x3CFB70,1, -0x3CFB72,1, -0x3CFB74,1, -0x3CFB76,1, -0x3CFB78,1, -0x3CFB7A,1, -0x3CFB7C,1, -0x3CFB7E,1, -0x3CFB80,1, -0x3CFB82,1, -0x3CFB84,1, -0x3CFB86,1, -0x3CFB88,1, -0x3CFB8A,1, -0x3D5044,0, -0x3D5046,0, -0x3D5048,0, -0x3D504A,0, -0x3D504C,0, -0x3D504E,0, -0x3D5050,0, -0x3D5052,0, -0x3D5054,0, -0x3D5056,0, -0x3D505C,0, -0x3D505E,0, -0x3D5084,1, -0x3D5086,1, -0x3D5088,1, -0x3D508A,1, -0x3D508C,1, -0x3D508E,1, -0x3D5090,1, -0x3D5092,1, -0x3D5094,1, -0x3D5096,1, -0x3D509C,1, -0x3D509E,1, -0xA5DDA2,0, -0xA5DDA4,0, -0xA5DDA6,0, -0xA5DDA8,0, -0xA5DDAE,0, -0xA5DDC2,1, -0xA5DDC4,1, -0xA5DDC6,1, -0xA5DDC8,1, -0xA5DDCE,1, -0x3D3E0C,1, -0x3D3E0E,1, -0x3D3E10,0, -0x3D3E12,0, -0x3CF1C0,0, -0x3CF1C2,0, -0x3CF200,1, -0x3CF202,1, -0x3D3604,0, -0x3D3606,1, -0x3D360A,1, -0x3D360C,1, -0x3D360E,1, -0x3D3610,0, -0x3D3612,0, -0x3D3614,0, -0x3D1A42,0, -0x3D1A44,0, -0x3D1A46,0, -0x3D1A48,0, -0x3D1A4A,0, -0x3D1A82,1, -0x3D1A84,1, -0x3D1A86,1, -0x3D1A88,1, -0x3D1A8A,1, -0x3CE280,0, -0x3CE282,0, -0x3CE2C0,1, -0x3CE2C2,1, -0x4FA29C,0, -0x4FA29E,0, -0x4FA2DC,1, -0x4FA2DE,1, -0x8D3C5E,0, -0x8D3C60,0, -0x8D3C62,0, -0x8D3C64,0, -0x8D3B9C,0, -0x8D3BA0,0, -0x8D3B9E,0, -0x3D4C02,0, -0x3D4C0C,0, -0x3D4C0E,0, -0x3D4C10,0, -0x3D4C12,0, -0x3D4C14,0, -0x3D2D96,0, -0x3D2D98,0, -0x3D2D9A,0, -0x3D2D9C,0, -0x8CC272,1, -0x8CC274,1, -0x8CC276,1, -0x8CC278,1, -0x8CC27A,1, -0x8CC27C,1, -0x3D4784,0, -0x3D4786,1, -0x3D4788,1, -0x3D478A,1, -0x3D478C,0, -0x3D478E,0, -0x3D4790,0, -0x3D4792,0, -0x3D4794,0, -0x8CF4B2,1, -0x8CF4B4,1, -0x8CF4B6,1, -0x8CF4B8,1, -0x8CF4BA,1, -0x8CF4BC,1, -0x8CF7B2,1, -0x8CF7B4,1, -0x8CF7B6,1, -0x8CF7B8,1, -0x8CF7BA,1, -0x8CF7BC,1, -0x8D2D52,1, -0x8D2D54,1, -0x8D2D56,1, -0x8D2D58,1, -0x8D2D5A,1, -0x8D2D5C,1, -0x8D0096,1, -0x8D0A16,1, -0x8D006E,1, -0x8D0070,1, -0x8D09AE,1, -0x8D09B0,1, -0x3CE8F6,1, -0x3CE8F8,1, -0x3CE8FA,1, -0x8D0952,1, -0x8D0954,1, -0x8D0956,1, -0x8D0958,1, -0x8D095A,1, -0x8D095C,1, -0x3CE976,1, -0x3CE978,1, -0x3CE97A,1, -0x4F8912,1, -0x4F8914,1, -0x4F8916,1, -0x8D0456,0, -0x8D09F6,0, -0x8D042E,0, -0x8D0430,0, -0x8D09CE,0, -0x8D09D0,0, -0x3CE8B6,0, -0x3CE8B8,0, -0x3CE8BA,0, -0x8D0890,0, -0x8D0892,0, -0x8D0894,0, -0x8D0896,0, -0x3CE932,0, -0x3CE936,0, -0x3CE938,0, -0x3CE93A,0, -0x3CE940,0, -0x4F88CE,0, -0x4F88D2,0, -0x4F88D4,0, -0x4F88D6,0, -0x4F88DC,0, -0x8D095E,0, -0x8D0960,0, -0x8D0962,0, -0x8D0964,0, -0x3D2104,0, -0x3D210E,0, -0x3D2110,0, -0x3D2118,0, -0x3D211A,0, -0x8D0052,1, -0x8D0054,1, -0x8D0056,1, -0x8D0058,1, -0x8D005A,1, -0x8D005C,1, -0x8D005E,0, -0x8D0060,0, -0x8D0062,0, -0x8D0064,0, -0x3C9E36,1, -0x3C9E38,1, -0x3C9E3A,1, -0x3C9E3C,0, -0x3C9E3E,0, -0x3C9E40,0, -0x4F4D50,0, -0x4F4D52,0, -0x4F4D54,0, -0x4F4D56,0, -0x4F4D58,0, -0x4F4D5A,0, -0x4F4D5C,0, -0x4F4D5E,0, -0x4F4D60,0, -0x4F4D62,0, -0x4F4D64,0, -0x4F4D66,0, -0x4F4D68,0, -0x4F4D6A,0, -0x3C9314,0, -0x3C9316,0, -0x3C9318,0, -0x3C931A,0, -0x3C931C,0, -0x3C931E,0, -0x3C9320,0, -0x3C9322,0, -0x3C9324,0, -0x3C9326,0, -0x3C9328,0, -0x3C932A,0, -0x3C932C,0, -0x3C932E,0, -0x9F9CEA,0, -0x9F9CEC,0, -0x9F9CEE,0, -0x9F9CF0,0, -0x9F9CF2,0, -0x9F9CF4,0, -0x9F9CF6,0, -0x9F9CF8,0, -0x9F9CFA,0, -0x9F9CFC,0, -0x9F9CFE,0, -0x9F9D00,0, -0x9F9D02,0, -0x9F9D04,0, -0x4F4E10,1, -0x4F4E12,1, -0x4F4E14,1, -0x4F4E16,1, -0x4F4E18,1, -0x4F4E1A,1, -0x4F4E1C,1, -0x4F4E1E,1, -0x4F4E20,1, -0x4F4E22,1, -0x4F4E24,1, -0x4F4E26,1, -0x4F4E28,1, -0x4F4E2A,1, -0x3C9444,1, -0x3C9446,1, -0x3C9448,1, -0x3C944A,1, -0x3C944C,1, -0x3C944E,1, -0x3C9450,1, -0x3C9452,1, -0x3C9454,1, -0x3C9456,1, -0x3C9458,1, -0x3C945A,1, -0x3C945C,1, -0x3C945E,1, -0x9F9D68,1, -0x9F9D6A,1, -0x9F9D6C,1, -0x9F9D6E,1, -0x9F9D70,1, -0x9F9D72,1, -0x9F9D74,1, -0x9F9D76,1, -0x9F9D78,1, -0x9F9D7A,1, -0x9F9D7C,1, -0x9F9D7E,1, -0x9F9D80,1, -0x9F9D82,1, -0x518E12,0, -0x518E10,0, -0x518E1A,0, -0x518E18,0, -0xA6202E,0, -0xA62030,0, -0xA62032,0, -0xA62034,0, -0xA6203A,0, -0xA6204E,1, -0xA62050,1, -0xA62052,1, -0xA62054,1, -0xA6205A,1, -0x3D4804,0, -0x3D4806,0, -0x3D4808,0, -0x3D480A,0, -0x3D4810,0, -0x3D4812,0, -0x3D480C,1, -0x3D480E,1, -0x8D049E,0, -0x8D04A0,0, -0x8D04A2,0, -0x8D0592,1, -0x8D0594,1, -0x8D0596,1, -0x8D0598,1, -0x8D059A,1, -0x8D059C,1, -0x4F5010,0, -0x4F5012,0, -0x4F5014,0, -0x4F5016,0, -0x4F4ECE,0, -0x4F4ED0,0, -0x4F4ED2,0, -0x4F4ED4,0, -0x4F4ED6,0, -0x4F4ED8,0, -0x4F4EDA,1, -0x4F4EDC,1, -0x4F4EDE,1, -0x4F4EE0,1, -0x4F4EE2,1, -0x3CC9F8,0, -0x3CC9FA,0, -0x3CC9FC,0, -0x3CC9FE,0, -0x3CCA00,0, -0x3CCA02,0, -0x3CCA0A,0, -0x3CCA0C,0, -0x3CCA0E,0, -0x3CCA10,0, -0x3CCA12,0, -0x8CBE1E,0, -0x8CBE20,0, -0x8CBE22,0, -0x8CBE3E,1, -0x8CBE40,1, -0x8CBE42,1, -0x8CBEDE,0, -0x8CBEE0,0, -0x8CBED4,0, -0x8CBEE2,0, -0x8CBECA,0, -0x3B8F38,1, -0x3B8F3A,1, -0x3B8F40,0, -0x3B8F42,0, -0x3D1090,0, -0x3D1092,0, -0x3D1094,0, -0x3D1096,0, -0x3D1098,0, -0x3D109A,0, -0x3D109C,0, -0x3D109E,0, -0x3D1082,0, -0x3D1084,0, -0x3D1086,0, -0x3D10C2,1, -0x3D10C4,1, -0x3D10C6,1, -0x3D10D0,1, -0x3D10D2,1, -0x3D10D4,1, -0x3D10D6,1, -0x3D10D8,1, -0x3D10DA,1, -0x3D10DC,1, -0x3D10DE,1, -0x3D14C2,0, -0x3D14C4,0, -0x3D14C6,0, -0x3D14C8,0, -0x3D14CA,0, -0x3D14CC,0, -0x3D14CE,0, -0x3D14D0,0, -0x3D14D2,0, -0x3D14D4,0, -0x3D14D6,0, -0x3D1502,1, -0x3D1504,1, -0x3D1506,1, -0x3D1508,1, -0x3D150A,1, -0x3D150C,1, -0x3D150E,1, -0x3D1510,1, -0x3D1512,1, -0x3D1514,1, -0x3D1516,1, -0x3CE0F0,1, -0x3CE0F2,1, -0x3CE0F4,1, -0x3CE0D0,0, -0x3CE0D2,0, -0x3CE0D4,0, -0x8D3DAC,0, -0x8D3DBC,0, -0x8D3DB4,0, -0x8D3D86,0, -0x8D3DBA,0, -0x8D3DB8,0, \ No newline at end of file diff --git a/worlds/mlss/colors/White.txt b/worlds/mlss/colors/White.txt deleted file mode 100644 index 08597e64b9e3..000000000000 --- a/worlds/mlss/colors/White.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0xFF,0x7F,0, -0x3CC886,0x7B,0x6F,0, -0x3CC8C4,0xFF,0x7F,1, -0x3CC8C6,0x7B,0x6F,1, -0x4F4CDC,0xFF,0x7F,0, -0x4F4CDE,0x7B,0x6F,0, -0x4F4D1C,0xFF,0x7F,1, -0x4F4D1E,0x7B,0x6F,1, -0x4F51D8,0xFF,0x7F,1, -0x4F51DC,0xFF,0x7F,0, -0x4F51E8,0x7B,0x6F,0, -0x4F51EA,0x7B,0x6F,1, -0x4F51DA,0x9C,0x73,1, -0x4F51DE,0x9C,0x73,0, -0x4FB686,0xFF,0x7F,0, -0x4FB6A6,0xFF,0x7F,1, -0x4FB684,0x73,0x4E,0, -0x4FB6A4,0x73,0x4E,1, -0x4FB688,0x7B,0x6F,0, -0x4FB6A8,0x7B,0x6F,1, -0x4FB786,0x73,0x4E,0, -0x4FB788,0xFF,0x7F,0, -0x4FB78A,0xFF,0x7F,0, -0x4FB7A6,0x73,0x4E,1, -0x4FB7A8,0xFF,0x7F,1, -0x4FB7AA,0xFF,0x7F,1, -0x51901C,0xFF,0x7F,0, -0x519018,0x73,0x4E,0, -0x51901A,0x7B,0x6F,0, -0x51903C,0xFF,0x7F,1, -0x519038,0x73,0x4E,1, -0x51903A,0x7B,0x6F,1, -0x5193EA,0x7B,0x6F,0, -0x5193E8,0xFF,0x7F,0, -0x51940A,0x7B,0x6F,1, -0x519408,0xFF,0x7F,1, -0x3A72AE,0xF7,0x5E,1, -0x3A7244,0xF7,0x5E,0, -0x3A724C,0x39,0x67,1, -0x3A7290,0x18,0x63,0, -0x3A72B2,0x18,0x63,1, -0x3A7270,0xB5,0x56,1, -0x3A7288,0xB5,0x56,0, -0x3A7296,0x5A,0x6B,0, -0x3A7274,0x5A,0x6B,1, -0x3A7294,0x39,0x67,0, -0x3A724A,0x7B,0x6F,0, -0x3A7278,0x7B,0x6F,1, -0x3A724E,0x9C,0x73,0, -0x3A727A,0x9C,0x73,1, -0x3A7252,0xBD,0x77,0, -0x3A727C,0xBD,0x77,1, -0x3A72BC,0xBD,0x77,1, -0x3A726C,0x94,0x52,1, -0x3A7286,0x94,0x52,0, -0x3A728C,0xD6,0x5A,0, -0x3A7272,0xD6,0x5A,1, -0x3A7254,0xFF,0x7F,1, -0x3A7256,0xFF,0x7F,0, -0x3A7264,0xFF,0x7F,1, -0x9F9A58,0x7B,0x6F,0, -0x9F9A5E,0x7B,0x6F,1, -0x9F9A2A,0x9C,0x73,0, -0x9F9A30,0x9C,0x73,1, -0x9F9A36,0x9C,0x73,0, -0x9F9A3C,0x9C,0x73,1, -0x9F9A4A,0x9C,0x73,0, -0x9F9A50,0x9C,0x73,1, -0x9F9A56,0xF7,0x5E,0, -0x9F9A5C,0xF7,0x5E,1, -0x9F9A28,0x73,0x4E,0, -0x9F9A2E,0x73,0x4E,1, -0x9F9A48,0x73,0x4E,0, -0x9F9A4E,0x73,0x4E,1, -0x9F9A34,0x73,0x4E,0, -0x9F9A3A,0x9C,0x73,1, -0x9F9A2C,0xFF,0x7F,0, -0x9F9A32,0xFF,0x7F,1, -0x9F9A38,0xFF,0x7F,0, -0x9F9A3E,0xFF,0x7F,1, -0x9F9A4C,0xFF,0x7F,0, -0x9F9A52,0xFF,0x7F,1, -0xA5DD46,0xF7,0x5E,0, -0xA5DD44,0x94,0x52,0, -0xA5DD4A,0x9C,0x73,0, -0xA5DD3E,0x31,0x46,0, -0xA5DD40,0xDE,0x7B,0, -0xA5DD42,0xFF,0x7F,0, -0xA5DD48,0x5A,0x6B,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0xF7,0x5E,1, -0xA5DD64,0x94,0x52,1, -0xA5DD6A,0x9C,0x73,1, -0xA5DD5E,0x31,0x46,1, -0xA5DD60,0xDE,0x7B,1, -0xA5DD62,0xFF,0x7F,1, -0xA5DD68,0x5A,0x6B,1, -0x3D0E0C,0xFF,0x7F,1, -0x3D0E18,0xFF,0x7F,0, -0x3D0E0A,0x7B,0x6F,1, -0x3D0E1A,0x7B,0x6F,0, -0x3D0E08,0xFF,0x7F,1, -0x3D0E16,0xFF,0x7F,0, -0x3CC9C4,0xFF,0x7F,0, -0x3CC9C6,0x7B,0x6F,0, -0x3CDE7C,0xFF,0x7F,1, -0x3CDE7E,0x7B,0x6F,1, -0x51AD2C,0xFF,0x7F,0, -0x51AD2E,0x7B,0x6F,0, -0x51AD4C,0xFF,0x7F,1, -0x51AD4E,0x7B,0x6F,1, -0x51A4AE,0x7B,0x6F,0, -0x51A4AC,0xFF,0x7F,0, -0x51A4CC,0xFF,0x7F,1, -0x51A4CE,0x7B,0x6F,1, -0x51A98C,0xFF,0x7F,0, -0x51A98E,0x7B,0x6F,0, -0x51A96C,0xFF,0x7F,1, -0x51A96E,0x7B,0x6F,1, -0x51AA00,0x9C,0x73,0, -0x51AA10,0x9C,0x73,1, -0x51AA02,0xD6,0x5A,0, -0x51AA12,0xD6,0x5A,1, -0x51A9FE,0xFF,0x7F,0, -0x51AA0E,0xFF,0x7F,1, -0x51AA0A,0xFF,0x7F,0, -0x3CC984,0xFF,0x7F,0, -0x3CC986,0x7B,0x6F,0, -0x3D4B52,0xFF,0x7F,0, -0x3D4B5C,0xD6,0x5A,0, -0x3D4B54,0xFF,0x7F,0, -0x3D4B56,0x7B,0x6F,0, -0x3D4B50,0xFF,0x7F,0, -0x3CCA44,0xFF,0x7F,1, -0x3CCA46,0x7B,0x6F,1, -0x3CFB3C,0xFF,0x7F,0, -0x3CFB3E,0x7B,0x6F,0, -0x3CFB7C,0xFF,0x7F,1, -0x3CFB7E,0x7B,0x6F,1, -0x3D504C,0xBD,0x77,0, -0x3D504A,0xFF,0x7F,0, -0x3D504E,0x7B,0x6F,0, -0x3D508C,0xBD,0x77,1, -0x3D508A,0xFF,0x7F,1, -0x3D508E,0x7B,0x6F,1, -0xA5DDA2,0xF7,0x5E,0, -0xA5DDC2,0xF7,0x5E,1, -0xA5DDA6,0x9C,0x73,0, -0xA5DDC6,0x9C,0x73,1, -0xA5DDA4,0x5A,0x6B,0, -0xA5DDC4,0x5A,0x6B,1, -0xA5DDA8,0xFF,0x7F,0, -0xA5DDC8,0xFF,0x7F,1, -0x3D3E0C,0xFF,0x7F,1, -0x3D3E10,0xFF,0x7F,0, -0x3D3E0E,0x7B,0x6F,1, -0x3D3E12,0x7B,0x6F,0, -0x3CF1C0,0xFF,0x7F,0, -0x3CF200,0xFF,0x7F,1, -0x3CF1C2,0x7B,0x6F,0, -0x3CF202,0x7B,0x6F,1, -0x3D360E,0x39,0x67,1, -0x3D3614,0x39,0x67,0, -0x3D360C,0x9C,0x73,1, -0x3D3612,0x9C,0x73,0, -0x3D3604,0x5A,0x6B,0, -0x3D3606,0x5A,0x6B,1, -0x3D360A,0xFF,0x7F,1, -0x3D3610,0xFF,0x7F,0, -0x3D1A48,0xD6,0x5A,0, -0x3D1A46,0xFF,0x7F,0, -0x3D1A44,0xFF,0x7F,0, -0x3D1A4A,0x5A,0x6B,0, -0x3D1A88,0xD6,0x5A,1, -0x3D1A8A,0xFF,0xF4,1, -0x3D1A86,0xFF,0x7F,1, -0x3D1A84,0xFF,0x7F,1, -0x3CE282,0x7B,0x6F,0, -0x3CE2C2,0x7B,0x6F,1, -0x3CE280,0xFF,0x7F,0, -0x3CE2C0,0xFF,0x7F,1, -0x4FA29E,0x7B,0x6F,0, -0x4FA2DE,0x7B,0x6F,1, -0x4FA29C,0xFF,0x7F,0, -0x4FA2DC,0xFF,0x7F,1, -0x3D4786,0xFF,0x7F,1, -0x3D478C,0xFF,0x7F,0, -0x3D478E,0x18,0x63,0, -0x3D4788,0x18,0x63,1, -0x3D4790,0x18,0x63,0, -0x3D478A,0xBD,0x77,1, -0x3D4794,0x5A,0x6B,0, -0x3D4792,0xBD,0x77,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0xFF,0x7F,1, -0x3C9E40,0xFF,0x7F,0, -0x3C9E38,0xFF,0x7F,1, -0x3C9E3E,0xFF,0x7F,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0xFF,0x7F,0, -0x4F4D5E,0x7B,0x6F,0, -0x3C9320,0xFF,0x7F,0, -0x3C9322,0x7B,0x6F,0, -0x9F9CF6,0xFF,0x7F,0, -0x9F9CF8,0x7B,0x6F,0, -0x4F4E1C,0xFF,0x7F,1, -0x4F4E1E,0x7B,0x6F,1, -0x3C9450,0xFF,0x7F,1, -0x3C9452,0x7B,0x6F,1, -0x9F9D74,0xFF,0x7F,1, -0x9F9D76,0x7B,0x6F,1, -0xA6202E,0xF7,0x5E,0, -0xA62032,0x9C,0x73,0, -0xA62030,0x5A,0x6B,0, -0xA62034,0xFF,0x7F,0, -0xA6204E,0xF7,0x5E,1, -0xA62052,0x9C,0x73,1, -0xA62050,0x5A,0x6B,1, -0xA62054,0xFF,0x7F,1, -0x3D4812,0x39,0x67,0, -0x3D480E,0x39,0x67,1, -0x3D4810,0xFF,0x7F,0, -0x3D480C,0xFF,0x7F,1, -0x3CC9FE,0xFF,0x7F,0, -0x3CCA0A,0x7B,0x6F,0, -0x8CBE20,0xD6,0x5A,0, -0x8CBE22,0x7B,0x6F,0, -0x8CBE1E,0xFF,0x7F,0, -0x8CBE40,0xD6,0x5A,1, -0x8CBE42,0x7B,0x6F,1, -0x8CBE3E,0xFF,0x7F,1, -0x8CBEE0,0xFF,0x7F,0, -0x8CBEDE,0xFF,0x7F,0, -0x8CBEE2,0x7B,0x6F,0, -0x3B8F38,0xD6,0x5A,1, -0x3B8F3A,0xFF,0x7F,1, -0x3B8F40,0xD6,0x5A,0, -0x3B8F42,0xFF,0x7F,0, -0x3D1094,0x18,0x63,0, -0x3D109A,0x94,0x52,0, -0x3D1098,0x73,0x4E,0, -0x3D1096,0x7B,0x6F,0, -0x3D1092,0xFF,0x7F,0, -0x3D1090,0xFF,0x7F,0, -0x3D10D4,0x18,0x63,1, -0x3D10DA,0x94,0x52,1, -0x3D10D8,0x73,0x4E,1, -0x3D10D6,0x7B,0x6F,1, -0x3D10D2,0xFF,0x7F,1, -0x3D10D0,0xFF,0x7F,1, -0x3D14D0,0xFF,0x7F,0, -0x3D14D2,0x7B,0x6F,0, -0x3D14CE,0xFF,0x7F,0, -0x3D14CC,0x7B,0x6F,0, -0x3D1510,0x39,0x67,1, -0x3D1512,0x7B,0x6F,1, -0x3D150E,0xFF,0x7F,1, -0x3D150C,0x7B,0x6F,1, -0x3CE0F4,0xF7,0x5E,1, -0x3CE0F2,0x9C,0x73,1, -0x3CE0F0,0x7B,0x6F,1, -0x3CE0D4,0xF7,0x5E,0, -0x3CE0D2,0x9C,0x73,0, -0x3CE0D0,0x7B,0x6F,0, \ No newline at end of file diff --git a/worlds/mlss/colors/Yellow.txt b/worlds/mlss/colors/Yellow.txt deleted file mode 100644 index 753a0ef97a22..000000000000 --- a/worlds/mlss/colors/Yellow.txt +++ /dev/null @@ -1,265 +0,0 @@ -0x3CC884,0xFF,0x07,0, -0x3CC886,0xF7,0x02,0, -0x3CC8C4,0xFF,0x07,1, -0x3CC8C6,0xF7,0x02,1, -0x4F4CDC,0xFF,0x07,0, -0x4F4CDE,0xF7,0x02,0, -0x4F4D1C,0xFF,0x07,1, -0x4F4D1E,0xF7,0x02,1, -0x4F51D8,0xFF,0x07,1, -0x4F51DC,0xFF,0x07,0, -0x4F51E8,0xDE,0x27,0, -0x4F51EA,0xDE,0x27,1, -0x4F51DA,0xFF,0x4F,1, -0x4F51DE,0xFF,0x4F,0, -0x4FB686,0xFF,0x07,0, -0x4FB6A6,0xFF,0x07,1, -0x4FB684,0xCE,0x01,0, -0x4FB6A4,0xCE,0x01,1, -0x4FB688,0xFF,0x4F,0, -0x4FB6A8,0xFF,0x4F,1, -0x4FB786,0x39,0x03,0, -0x4FB788,0xFF,0x07,0, -0x4FB78A,0xFF,0x63,0, -0x4FB7A6,0x39,0x03,1, -0x4FB7A8,0xFF,0x07,1, -0x4FB7AA,0xFF,0x63,1, -0x51901C,0xFF,0x07,0, -0x519018,0xF7,0x01,0, -0x51901A,0xF7,0x02,0, -0x51903C,0xFF,0x07,1, -0x519038,0xF7,0x01,1, -0x51903A,0xF7,0x02,1, -0x5193EA,0xF7,0x02,0, -0x5193E8,0xFF,0x07,0, -0x51940A,0xF7,0x02,1, -0x519408,0xFF,0x07,1, -0x3A72AE,0x39,0x13,1, -0x3A7244,0x39,0x13,0, -0x3A724C,0x5A,0x17,1, -0x3A7290,0x5A,0x17,0, -0x3A72B2,0x7B,0x13,1, -0x3A7270,0x73,0x0E,1, -0x3A7288,0x73,0x0E,0, -0x3A7296,0x9C,0x17,0, -0x3A7274,0x9C,0x17,1, -0x3A7294,0x7B,0x13,0, -0x3A724A,0xBD,0x17,0, -0x3A7278,0xBD,0x17,1, -0x3A724E,0xDE,0x17,0, -0x3A727A,0xDE,0x17,1, -0x3A7252,0xFF,0x1B,0, -0x3A727C,0xFF,0x1B,1, -0x3A72BC,0xFF,0x1B,1, -0x3A726C,0x31,0x02,1, -0x3A7286,0x31,0x02,0, -0x3A728C,0x18,0x13,0, -0x3A7272,0xB5,0x12,1, -0x3A7254,0xFF,0x3B,1, -0x3A7256,0xFF,0x3B,0, -0x3A7264,0xFF,0x3B,1, -0x9F9A58,0xD6,0x3A,0, -0x9F9A5E,0xD6,0x3A,1, -0x9F9A2A,0xFF,0x07,0, -0x9F9A30,0xFF,0x07,1, -0x9F9A36,0xFF,0x07,0, -0x9F9A3C,0xFF,0x07,1, -0x9F9A4A,0xFF,0x07,0, -0x9F9A50,0xFF,0x07,1, -0x9F9A56,0x94,0x02,0, -0x9F9A5C,0x94,0x02,1, -0x9F9A28,0xCE,0x01,0, -0x9F9A2E,0xCE,0x01,1, -0x9F9A48,0xCE,0x01,0, -0x9F9A4E,0xCE,0x01,1, -0x9F9A34,0x70,0x07,0, -0x9F9A3A,0x70,0x07,1, -0x9F9A2C,0xFF,0x4F,0, -0x9F9A32,0xFF,0x4F,1, -0x9F9A38,0xFF,0x4F,0, -0x9F9A3E,0xFF,0x4F,1, -0x9F9A4C,0xFF,0x4F,0, -0x9F9A52,0xFF,0x4F,1, -0xA5DD46,0x94,0x12,0, -0xA5DD44,0xEF,0x0D,0, -0xA5DD4A,0xBD,0x1B,0, -0xA5DD3E,0xF7,0x32,0, -0xA5DD40,0xBD,0x3F,0, -0xA5DD42,0xFF,0x57,0, -0xA5DD48,0x39,0x1B,0, -0xA5DD4E,0xFF,0x7F,0, -0xA5DD66,0x94,0x12,1, -0xA5DD64,0xEF,0x0D,1, -0xA5DD6A,0xBD,0x1B,1, -0xA5DD5E,0xF7,0x32,1, -0xA5DD60,0xFF,0x43,1, -0xA5DD62,0xFF,0x57,1, -0xA5DD68,0x39,0x1B,1, -0x3D0E0C,0xFF,0x07,1, -0x3D0E18,0xFF,0x07,0, -0x3D0E0A,0xF7,0x02,1, -0x3D0E1A,0xF7,0x02,0, -0x3D0E08,0xFF,0x4F,1, -0x3D0E16,0xFF,0x4F,0, -0x3CC9C4,0xFF,0x07,0, -0x3CC9C6,0xF7,0x02,0, -0x3CDE7C,0xFF,0x07,1, -0x3CDE7E,0xF7,0x02,1, -0x51AD2C,0xFF,0x07,0, -0x51AD2E,0xF7,0x02,0, -0x51AD4C,0xFF,0x07,1, -0x51AD4E,0xF7,0x02,1, -0x51A4AE,0xF7,0x02,0, -0x51A4AC,0xFF,0x07,0, -0x51A4CC,0xFF,0x07,1, -0x51A4CE,0xF7,0x02,1, -0x51A98C,0xFF,0x07,0, -0x51A98E,0xF7,0x02,0, -0x51A96C,0xFF,0x07,1, -0x51A96E,0xF7,0x02,1, -0x51AA00,0x9C,0x07,0, -0x51AA10,0x9C,0x07,1, -0x51AA02,0xF7,0x02,0, -0x51AA12,0xF7,0x02,1, -0x51A9FE,0xFF,0x07,0, -0x51AA0E,0xFF,0x07,1, -0x51AA0A,0xFF,0x3B,0, -0x3CC984,0xFF,0x07,0, -0x3CC986,0xF7,0x02,0, -0x3D4B52,0x7B,0x07,0, -0x3D4B5C,0x94,0x02,0, -0x3D4B54,0xFF,0x07,0, -0x3D4B56,0xF7,0x02,0, -0x3D4B50,0xFF,0x4F,0, -0x3CCA44,0xFF,0x07,1, -0x3CCA46,0xF7,0x02,1, -0x3CFB3C,0xFF,0x07,0, -0x3CFB3E,0xF7,0x02,0, -0x3CFB7C,0xFF,0x07,1, -0x3CFB7E,0xF7,0x02,1, -0x3D504C,0x7B,0x07,0, -0x3D504A,0xFF,0x07,0, -0x3D504E,0xF7,0x02,0, -0x3D508C,0x7B,0x07,1, -0x3D508A,0xFF,0x07,1, -0x3D508E,0xF7,0x02,1, -0xA5DDA2,0x94,0x12,0, -0xA5DDC2,0x94,0x12,1, -0xA5DDA6,0xBD,0x1B,0, -0xA5DDC6,0xBD,0x1B,1, -0xA5DDA4,0x39,0x1B,0, -0xA5DDC4,0x39,0x1B,1, -0xA5DDA8,0xFF,0x4F,0, -0xA5DDC8,0xFF,0x4F,1, -0x3D3E0C,0xFF,0x07,1, -0x3D3E10,0xFF,0x07,0, -0x3D3E0E,0xF7,0x02,1, -0x3D3E12,0xF7,0x02,0, -0x3CF1C0,0xFF,0x07,0, -0x3CF200,0xFF,0x07,1, -0x3CF1C2,0xF7,0x02,0, -0x3CF202,0xF7,0x02,1, -0x3D360E,0x5A,0x17,1, -0x3D3614,0x5A,0x17,0, -0x3D360C,0xFF,0x4F,1, -0x3D3612,0xFF,0x4F,0, -0x3D3604,0x39,0x1B,0, -0x3D3606,0x39,0x1B,1, -0x3D360A,0xFF,0x4F,1, -0x3D3610,0xFF,0x4F,0, -0x3D1A48,0xB5,0x12,0, -0x3D1A46,0xFF,0x4F,0, -0x3D1A44,0xFF,0x4F,0, -0x3D1A4A,0x39,0x1B,0, -0x3D1A88,0xB5,0x12,1, -0x3D1A8A,0xBB,0xB4,1, -0x3D1A86,0xFF,0x4F,1, -0x3D1A84,0xFF,0x4F,1, -0x3CE282,0xF7,0x02,0, -0x3CE2C2,0xF7,0x02,1, -0x3CE280,0xFF,0x4F,0, -0x3CE2C0,0xFF,0x4F,1, -0x4FA29E,0xF7,0x02,0, -0x4FA2DE,0xF7,0x02,1, -0x4FA29C,0xFF,0x4F,0, -0x4FA2DC,0xFF,0x4F,1, -0x3D4786,0xFF,0x3B,1, -0x3D478C,0xFF,0x3B,0, -0x3D478E,0x5A,0x17,0, -0x3D4788,0x5A,0x17,1, -0x3D4790,0x5A,0x17,0, -0x3D478A,0x7B,0x07,1, -0x3D4794,0x39,0x1B,0, -0x3D4792,0x7B,0x07,0, -0x3D4784,0xFE,0x33,0, -0x3C9E3A,0xFF,0x63,1, -0x3C9E40,0xFF,0x63,0, -0x3C9E38,0xFF,0x63,1, -0x3C9E3E,0xFF,0x63,0, -0x3C9E36,0xFC,0x7F,1, -0x3C9E3C,0xFC,0x7F,0, -0x4F4D5C,0xFF,0x07,0, -0x4F4D5E,0xF7,0x02,0, -0x3C9320,0xFF,0x07,0, -0x3C9322,0xF7,0x02,0, -0x9F9CF6,0xFF,0x07,0, -0x9F9CF8,0xF7,0x02,0, -0x4F4E1C,0xFF,0x07,1, -0x4F4E1E,0xF7,0x02,1, -0x3C9450,0xFF,0x07,1, -0x3C9452,0xF7,0x02,1, -0x9F9D74,0xFF,0x07,1, -0x9F9D76,0xF7,0x02,1, -0xA6202E,0x94,0x12,0, -0xA62032,0xBD,0x1B,0, -0xA62030,0x39,0x1B,0, -0xA62034,0xFF,0x4F,0, -0xA6204E,0x94,0x12,1, -0xA62052,0xBD,0x1B,1, -0xA62050,0x39,0x1B,1, -0xA62054,0xFF,0x4F,1, -0x3D4812,0x5A,0x17,0, -0x3D480E,0x5A,0x17,1, -0x3D4810,0xFF,0x4F,0, -0x3D480C,0xFF,0x4F,1, -0x3CC9FE,0xFF,0x07,0, -0x3CCA0A,0xF7,0x02,0, -0x8CBE20,0xB5,0x12,0, -0x8CBE22,0xF7,0x02,0, -0x8CBE1E,0xFF,0x3B,0, -0x8CBE40,0xB5,0x12,1, -0x8CBE42,0xF7,0x02,1, -0x8CBE3E,0xFF,0x3B,1, -0x8CBEE0,0xFF,0x07,0, -0x8CBEDE,0xFF,0x57,0, -0x8CBEE2,0xF7,0x02,0, -0x3B8F38,0xB5,0x12,1, -0x3B8F3A,0xFF,0x57,1, -0x3B8F40,0xB5,0x12,0, -0x3B8F42,0xFF,0x57,0, -0x3D1094,0x5A,0x17,0, -0x3D109A,0xEF,0x0D,0, -0x3D1098,0xF7,0x01,0, -0x3D1096,0xF7,0x02,0, -0x3D1092,0xFF,0x57,0, -0x3D1090,0xFF,0x4F,0, -0x3D10D4,0x5A,0x17,1, -0x3D10DA,0xEF,0x0D,1, -0x3D10D8,0xF7,0x01,1, -0x3D10D6,0xF7,0x02,1, -0x3D10D2,0xFF,0x57,1, -0x3D10D0,0xFF,0x4F,1, -0x3D14D0,0xFF,0x07,0, -0x3D14D2,0xF7,0x02,0, -0x3D14CE,0xFF,0x4F,0, -0x3D14CC,0xDE,0x27,0, -0x3D1510,0x5A,0x17,1, -0x3D1512,0xF7,0x02,1, -0x3D150E,0xFF,0x4F,1, -0x3D150C,0xDE,0x27,1, -0x3CE0F4,0x94,0x12,1, -0x3CE0F2,0x9C,0x07,1, -0x3CE0F0,0xDE,0x27,1, -0x3CE0D4,0x94,0x12,0, -0x3CE0D2,0x9C,0x07,0, -0x3CE0D0,0xDE,0x27,0, \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Black.txt b/worlds/mlss/colors/pants/Black.txt deleted file mode 100644 index b1437b3954d0..000000000000 --- a/worlds/mlss/colors/pants/Black.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x63,0x0C,0, -0x3CC880,0x84,0x10,0, -0x3CC8C2,0x63,0x0C,1, -0x3CC8C0,0x84,0x10,1, -0x4F4CDA,0x63,0x0C,0, -0x4F4CD8,0x84,0x10,0, -0x4F4D1A,0x63,0x0C,1, -0x4F4D18,0x84,0x10,1, -0x519014,0x63,0x0C,0, -0x519016,0x84,0x10,0, -0x519034,0x63,0x0C,1, -0x519036,0x84,0x10,1, -0x5193E6,0x63,0x0C,0, -0x5193E4,0x84,0x10,0, -0x519406,0x63,0x0C,1, -0x519404,0x84,0x10,1, -0x3CC9C2,0x63,0x0C,0, -0x3CC9C0,0x84,0x10,0, -0x3CDE84,0x63,0x0C,1, -0x3CDE74,0x63,0x0C,1, -0x51AD2A,0x63,0x0C,0, -0x51AD26,0x4A,0x29,0, -0x51AD28,0x84,0x10,0, -0x51AD4A,0x63,0x0C,1, -0x51AD48,0x84,0x10,1, -0x51AD46,0x4A,0x29,1, -0x51A4AA,0x63,0x0C,0, -0x51A4A6,0x4A,0x29,0, -0x51A4A8,0x84,0x10,0, -0x51A4CA,0x63,0x0C,1, -0x51A4C8,0x84,0x10,1, -0x51A4C6,0x4A,0x29,1, -0x51A98A,0x63,0x0C,0, -0x51A986,0x4A,0x29,0, -0x51A988,0x84,0x10,0, -0x51A96A,0x63,0x0C,1, -0x51A968,0x84,0x10,1, -0x51A966,0x4A,0x29,1, -0x3CC982,0x63,0x0C,0, -0x3CC980,0x84,0x10,0, -0x3D4B4E,0x08,0x21,0, -0x3D4B4C,0x4A,0x29,0, -0x3CCA42,0x63,0x0C,1, -0x3CCA40,0x84,0x10,1, -0x3CFB3A,0x63,0x0C,0, -0x3CFB38,0x84,0x10,0, -0x3CFB7A,0x63,0x0C,1, -0x3CFB78,0x84,0x10,1, -0x4F4D5A,0x63,0x0C,0, -0x4F4D58,0x84,0x10,0, -0x3C931E,0x63,0x0C,0, -0x3C931C,0x84,0x10,0, -0x9F9CF4,0x63,0x0C,0, -0x9F9CF2,0x84,0x10,0, -0x4F4E1A,0x63,0x0C,1, -0x4F4E18,0x84,0x10,1, -0x3C944E,0x63,0x0C,1, -0x3C944C,0x84,0x10,1, -0x9F9D72,0x63,0x0C,1, -0x9F9D70,0x84,0x10,1, -0x518E10,0x63,0x0C,0, -0x518E12,0x4A,0x29,0, -0x3D4806,0x63,0x0C,0, -0x3D4804,0x84,0x10,0, -0x3CCA02,0x63,0x0C,0, -0x3CCA00,0x84,0x10,0, -0x3D14C6,0x84,0x10,0, -0x3D1506,0x84,0x10,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Blue.txt b/worlds/mlss/colors/pants/Blue.txt deleted file mode 100644 index f97f60391b19..000000000000 --- a/worlds/mlss/colors/pants/Blue.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x00,0x5C,0, -0x3CC880,0x00,0x7C,0, -0x3CC8C2,0x00,0x5C,1, -0x3CC8C0,0x00,0x7C,1, -0x4F4CDA,0x00,0x5C,0, -0x4F4CD8,0x00,0x7C,0, -0x4F4D1A,0x00,0x5C,1, -0x4F4D18,0x00,0x7C,1, -0x519014,0x00,0x5C,0, -0x519016,0x00,0x7C,0, -0x519034,0x00,0x5C,1, -0x519036,0x00,0x7C,1, -0x5193E6,0x00,0x5C,0, -0x5193E4,0x00,0x7C,0, -0x519406,0x00,0x5C,1, -0x519404,0x00,0x7C,1, -0x3CC9C2,0x00,0x5C,0, -0x3CC9C0,0x00,0x7C,0, -0x3CDE84,0x00,0x5C,1, -0x3CDE74,0x00,0x5C,1, -0x51AD2A,0x00,0x5C,0, -0x51AD26,0xB5,0x7E,0, -0x51AD28,0x00,0x7C,0, -0x51AD4A,0x00,0x5C,1, -0x51AD48,0x00,0x7C,1, -0x51AD46,0xB5,0x7E,1, -0x51A4AA,0x00,0x5C,0, -0x51A4A6,0xB5,0x7E,0, -0x51A4A8,0x00,0x7C,0, -0x51A4CA,0x00,0x5C,1, -0x51A4C8,0x00,0x7C,1, -0x51A4C6,0xB5,0x7E,1, -0x51A98A,0x00,0x5C,0, -0x51A986,0xB5,0x7E,0, -0x51A988,0x00,0x7C,0, -0x51A96A,0x00,0x5C,1, -0x51A968,0x00,0x7C,1, -0x51A966,0xB5,0x7E,1, -0x3CC982,0x00,0x5C,0, -0x3CC980,0x00,0x7C,0, -0x3D4B4E,0x73,0x72,0, -0x3D4B4C,0xB5,0x7E,0, -0x3CCA42,0x00,0x5C,1, -0x3CCA40,0x00,0x7C,1, -0x3CFB3A,0x00,0x5C,0, -0x3CFB38,0x00,0x7C,0, -0x3CFB7A,0x00,0x5C,1, -0x3CFB78,0x00,0x7C,1, -0x4F4D5A,0x00,0x5C,0, -0x4F4D58,0x00,0x7C,0, -0x3C931E,0x00,0x5C,0, -0x3C931C,0x00,0x7C,0, -0x9F9CF4,0x00,0x5C,0, -0x9F9CF2,0x00,0x7C,0, -0x4F4E1A,0x00,0x5C,1, -0x4F4E18,0x00,0x7C,1, -0x3C944E,0x00,0x5C,1, -0x3C944C,0x00,0x7C,1, -0x9F9D72,0x00,0x5C,1, -0x9F9D70,0x00,0x7C,1, -0x518E10,0x00,0x5C,0, -0x518E12,0xB5,0x7E,0, -0x3D4806,0x00,0x5C,0, -0x3D4804,0x00,0x7C,0, -0x3CCA02,0x00,0x5C,0, -0x3CCA00,0x00,0x7C,0, -0x3D14C6,0x00,0x7C,0, -0x3D1506,0x00,0x7C,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Chaos.txt b/worlds/mlss/colors/pants/Chaos.txt deleted file mode 100644 index f40a4020bab7..000000000000 --- a/worlds/mlss/colors/pants/Chaos.txt +++ /dev/null @@ -1,37 +0,0 @@ -0x3CC880,0, -0x3CC882,0, -0x3CC8C0,1, -0x3CC8C2,1, -0x3CC980,0, -0x3CC982,0, -0x4f4cd8,0, -0x4F4CDA,0, -0x4F4D18,1, -0x4F4D1A,1, -0x519014,0, -0x519016,0, -0x519034,1, -0x519036,1, -0x5193E4,0, -0x5193E6,0, -0x519404,1, -0x519406,1, -0x51A988,0, -0x51A98A,0, -0x51A968,1, -0x51A96A,1, -0x51ad28,0, -0x51AD2A,0, -0x51AD48,1, -0x51AD4A,1, -0x3CFB38,0, -0x3CFB3A,0, -0x3CFB78,1, -0x3CFB7A,1, -0x3CC9C0,0, -0x3CC9C2,0, -0x3CCA40,1, -0x3CCA42,1, -0x3CDE74,1, -0x3D4B4C,0, -0x3D4B4E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Custom.txt b/worlds/mlss/colors/pants/Custom.txt deleted file mode 100644 index 3d0ce054c56e..000000000000 --- a/worlds/mlss/colors/pants/Custom.txt +++ /dev/null @@ -1,37 +0,0 @@ -0x3CC880,0,0, -0x3CC882,1,0, -0x3CC8C0,0,1, -0x3CC8C2,1,1, -0x3CC980,0,0, -0x3CC982,1,0, -0x4f4cd8,0,0, -0x4F4CDA,1,0, -0x4F4D18,0,1, -0x4F4D1A,1,1, -0x519014,0,0, -0x519016,1,0, -0x519034,0,1, -0x519036,1,1, -0x5193E4,0,0, -0x5193E6,1,0, -0x519404,0,1, -0x519406,1,1, -0x51A988,0,0, -0x51A98A,0,0, -0x51A968,0,1, -0x51A96A,1,1, -0x51ad28,0,0, -0x51AD2A,1,0, -0x51AD48,0,1, -0x51AD4A,1,1, -0x3CFB38,0,0, -0x3CFB3A,1,0, -0x3CFB78,0,1, -0x3CFB7A,1,1, -0x3CC9C0,0,0, -0x3CC9C2,1,0, -0x3CCA40,0,1, -0x3CCA42,1,1, -0x3CDE74,1,1, -0x3D4B4C,2,0, -0x3D4B4E,0,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Cyan.txt b/worlds/mlss/colors/pants/Cyan.txt deleted file mode 100644 index 898255c5fc4b..000000000000 --- a/worlds/mlss/colors/pants/Cyan.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x8B,0x73,0, -0x3CC880,0xED,0x7F,0, -0x3CC8C2,0x8B,0x73,1, -0x3CC8C0,0xED,0x7F,1, -0x4F4CDA,0x8B,0x73,0, -0x4F4CD8,0xED,0x7F,0, -0x4F4D1A,0x8B,0x73,1, -0x4F4D18,0xED,0x7F,1, -0x519014,0x8B,0x73,0, -0x519016,0xED,0x7F,0, -0x519034,0x8B,0x73,1, -0x519036,0xED,0x7F,1, -0x5193E6,0x8B,0x73,0, -0x5193E4,0xED,0x7F,0, -0x519406,0x8B,0x73,1, -0x519404,0xED,0x7F,1, -0x3CC9C2,0x8B,0x73,0, -0x3CC9C0,0xED,0x7F,0, -0x3CDE84,0x8B,0x73,1, -0x3CDE74,0x8B,0x73,1, -0x51AD2A,0x8B,0x73,0, -0x51AD26,0xFA,0x7F,0, -0x51AD28,0xED,0x7F,0, -0x51AD4A,0x8B,0x73,1, -0x51AD48,0xED,0x7F,1, -0x51AD46,0xFA,0x7F,1, -0x51A4AA,0x8B,0x73,0, -0x51A4A6,0xFA,0x7F,0, -0x51A4A8,0xED,0x7F,0, -0x51A4CA,0x8B,0x73,1, -0x51A4C8,0xED,0x7F,1, -0x51A4C6,0xFA,0x7F,1, -0x51A98A,0x8B,0x73,0, -0x51A986,0xFA,0x7F,0, -0x51A988,0xED,0x7F,0, -0x51A96A,0x8B,0x73,1, -0x51A968,0xED,0x7F,1, -0x51A966,0xFA,0x7F,1, -0x3CC982,0x8B,0x73,0, -0x3CC980,0xED,0x7F,0, -0x3D4B4E,0xD6,0x7B,0, -0x3D4B4C,0xFA,0x7F,0, -0x3CCA42,0x8B,0x73,1, -0x3CCA40,0xED,0x7F,1, -0x3CFB3A,0x8B,0x73,0, -0x3CFB38,0xED,0x7F,0, -0x3CFB7A,0x8B,0x73,1, -0x3CFB78,0xED,0x7F,1, -0x4F4D5A,0x8B,0x73,0, -0x4F4D58,0xED,0x7F,0, -0x3C931E,0x8B,0x73,0, -0x3C931C,0xED,0x7F,0, -0x9F9CF4,0x8B,0x73,0, -0x9F9CF2,0xED,0x7F,0, -0x4F4E1A,0x8B,0x73,1, -0x4F4E18,0xED,0x7F,1, -0x3C944E,0x8B,0x73,1, -0x3C944C,0xED,0x7F,1, -0x9F9D72,0x8B,0x73,1, -0x9F9D70,0xED,0x7F,1, -0x518E10,0x8B,0x73,0, -0x518E12,0xFA,0x7F,0, -0x3D4806,0x8B,0x73,0, -0x3D4804,0xED,0x7F,0, -0x3CCA02,0x8B,0x73,0, -0x3CCA00,0xED,0x7F,0, -0x3D14C6,0xED,0x7F,0, -0x3D1506,0xED,0x7F,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Green.txt b/worlds/mlss/colors/pants/Green.txt deleted file mode 100644 index 7034cb3a490c..000000000000 --- a/worlds/mlss/colors/pants/Green.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0xE0,0x02,0, -0x3CC880,0xA3,0x03,0, -0x3CC8C2,0xE0,0x02,1, -0x3CC8C0,0xA3,0x03,1, -0x4F4CDA,0xE0,0x02,0, -0x4F4CD8,0xA3,0x03,0, -0x4F4D1A,0xE0,0x02,1, -0x4F4D18,0xA3,0x03,1, -0x519014,0xE0,0x02,0, -0x519016,0xA3,0x03,0, -0x519034,0xE0,0x02,1, -0x519036,0xA3,0x03,1, -0x5193E6,0xE0,0x02,0, -0x5193E4,0xA3,0x03,0, -0x519406,0xE0,0x02,1, -0x519404,0xA3,0x03,1, -0x3CC9C2,0xE0,0x02,0, -0x3CC9C0,0xA3,0x03,0, -0x3CDE84,0xE0,0x02,1, -0x3CDE74,0xE0,0x02,1, -0x51AD2A,0xE0,0x02,0, -0x51AD26,0xF6,0x5B,0, -0x51AD28,0xA3,0x03,0, -0x51AD4A,0xE0,0x02,1, -0x51AD48,0xA3,0x03,1, -0x51AD46,0xF6,0x5B,1, -0x51A4AA,0xE0,0x02,0, -0x51A4A6,0xF6,0x5B,0, -0x51A4A8,0xA3,0x03,0, -0x51A4CA,0xE0,0x02,1, -0x51A4C8,0xA3,0x03,1, -0x51A4C6,0xF6,0x5B,1, -0x51A98A,0xE0,0x02,0, -0x51A986,0xF6,0x5B,0, -0x51A988,0xA3,0x03,0, -0x51A96A,0xE0,0x02,1, -0x51A968,0xA3,0x03,1, -0x51A966,0xF6,0x5B,1, -0x3CC982,0xE0,0x02,0, -0x3CC980,0xA3,0x03,0, -0x3D4B4E,0xB1,0x3B,0, -0x3D4B4C,0xF6,0x5B,0, -0x3CCA42,0xE0,0x02,1, -0x3CCA40,0xA3,0x03,1, -0x3CFB3A,0xE0,0x02,0, -0x3CFB38,0xA3,0x03,0, -0x3CFB7A,0xE0,0x02,1, -0x3CFB78,0xA3,0x03,1, -0x4F4D5A,0xE0,0x02,0, -0x4F4D58,0xA3,0x03,0, -0x3C931E,0xE0,0x02,0, -0x3C931C,0xA3,0x03,0, -0x9F9CF4,0xE0,0x02,0, -0x9F9CF2,0xA3,0x03,0, -0x4F4E1A,0xE0,0x02,1, -0x4F4E18,0xA3,0x03,1, -0x3C944E,0xE0,0x02,1, -0x3C944C,0xA3,0x03,1, -0x9F9D72,0xE0,0x02,1, -0x9F9D70,0xA3,0x03,1, -0x518E10,0xE0,0x02,0, -0x518E12,0xF6,0x5B,0, -0x3D4806,0xE0,0x02,0, -0x3D4804,0xA3,0x03,0, -0x3CCA02,0xE0,0x02,0, -0x3CCA00,0xA3,0x03,0, -0x3D14C6,0xA3,0x03,0, -0x3D1506,0xA3,0x03,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Orange.txt b/worlds/mlss/colors/pants/Orange.txt deleted file mode 100644 index e60e5bbc8851..000000000000 --- a/worlds/mlss/colors/pants/Orange.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x3C,0x02,0, -0x3CC880,0x7F,0x02,0, -0x3CC8C2,0x3C,0x02,1, -0x3CC8C0,0x7F,0x02,1, -0x4F4CDA,0x3C,0x02,0, -0x4F4CD8,0x7F,0x02,0, -0x4F4D1A,0x3C,0x02,1, -0x4F4D18,0x7F,0x02,1, -0x519014,0x3C,0x02,0, -0x519016,0x7F,0x02,0, -0x519034,0x3C,0x02,1, -0x519036,0x7F,0x02,1, -0x5193E6,0x3C,0x02,0, -0x5193E4,0x7F,0x02,0, -0x519406,0x3C,0x02,1, -0x519404,0x7F,0x02,1, -0x3CC9C2,0x3C,0x02,0, -0x3CC9C0,0x7F,0x02,0, -0x3CDE84,0x3C,0x02,1, -0x3CDE74,0x3C,0x02,1, -0x51AD2A,0x3C,0x02,0, -0x51AD26,0x5E,0x53,0, -0x51AD28,0x7F,0x02,0, -0x51AD4A,0x3C,0x02,1, -0x51AD48,0x7F,0x02,1, -0x51AD46,0x5E,0x53,1, -0x51A4AA,0x3C,0x02,0, -0x51A4A6,0x5E,0x53,0, -0x51A4A8,0x7F,0x02,0, -0x51A4CA,0x3C,0x02,1, -0x51A4C8,0x7F,0x02,1, -0x51A4C6,0x5E,0x53,1, -0x51A98A,0x3C,0x02,0, -0x51A986,0x5E,0x53,0, -0x51A988,0x7F,0x02,0, -0x51A96A,0x3C,0x02,1, -0x51A968,0x7F,0x02,1, -0x51A966,0x5E,0x53,1, -0x3CC982,0x3C,0x02,0, -0x3CC980,0x7F,0x02,0, -0x3D4B4E,0xFE,0x42,0, -0x3D4B4C,0x5E,0x53,0, -0x3CCA42,0x3C,0x02,1, -0x3CCA40,0x7F,0x02,1, -0x3CFB3A,0x3C,0x02,0, -0x3CFB38,0x7F,0x02,0, -0x3CFB7A,0x3C,0x02,1, -0x3CFB78,0x7F,0x02,1, -0x4F4D5A,0x3C,0x02,0, -0x4F4D58,0x7F,0x02,0, -0x3C931E,0x3C,0x02,0, -0x3C931C,0x7F,0x02,0, -0x9F9CF4,0x3C,0x02,0, -0x9F9CF2,0x7F,0x02,0, -0x4F4E1A,0x3C,0x02,1, -0x4F4E18,0x7F,0x02,1, -0x3C944E,0x3C,0x02,1, -0x3C944C,0x7F,0x02,1, -0x9F9D72,0x3C,0x02,1, -0x9F9D70,0x7F,0x02,1, -0x518E10,0x3C,0x02,0, -0x518E12,0x5E,0x53,0, -0x3D4806,0x3C,0x02,0, -0x3D4804,0x7F,0x02,0, -0x3CCA02,0x3C,0x02,0, -0x3CCA00,0x7F,0x02,0, -0x3D14C6,0x7F,0x02,0, -0x3D1506,0x7F,0x02,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Pink.txt b/worlds/mlss/colors/pants/Pink.txt deleted file mode 100644 index 95fe4a6016ed..000000000000 --- a/worlds/mlss/colors/pants/Pink.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0xFF,0x5D,0, -0x3CC880,0xDF,0x6E,0, -0x3CC8C2,0xFF,0x5D,1, -0x3CC8C0,0xDF,0x6E,1, -0x4F4CDA,0xFF,0x5D,0, -0x4F4CD8,0xDF,0x6E,0, -0x4F4D1A,0xFF,0x5D,1, -0x4F4D18,0xDF,0x6E,1, -0x519014,0xFF,0x5D,0, -0x519016,0xDF,0x6E,0, -0x519034,0xFF,0x5D,1, -0x519036,0xDF,0x6E,1, -0x5193E6,0xFF,0x5D,0, -0x5193E4,0xDF,0x6E,0, -0x519406,0xFF,0x5D,1, -0x519404,0xDF,0x6E,1, -0x3CC9C2,0xFF,0x5D,0, -0x3CC9C0,0xDF,0x6E,0, -0x3CDE84,0xFF,0x5D,1, -0x3CDE74,0xFF,0x5D,1, -0x51AD2A,0xFF,0x5D,0, -0x51AD26,0x7F,0x77,0, -0x51AD28,0xDF,0x6E,0, -0x51AD4A,0xFF,0x5D,1, -0x51AD48,0xDF,0x6E,1, -0x51AD46,0x7F,0x77,1, -0x51A4AA,0xFF,0x5D,0, -0x51A4A6,0x7F,0x77,0, -0x51A4A8,0xDF,0x6E,0, -0x51A4CA,0xFF,0x5D,1, -0x51A4C8,0xDF,0x6E,1, -0x51A4C6,0x7F,0x77,1, -0x51A98A,0xFF,0x5D,0, -0x51A986,0x7F,0x77,0, -0x51A988,0xDF,0x6E,0, -0x51A96A,0xFF,0x5D,1, -0x51A968,0xDF,0x6E,1, -0x51A966,0x7F,0x77,1, -0x3CC982,0xFF,0x5D,0, -0x3CC980,0xDF,0x6E,0, -0x3D4B4E,0x3C,0x6B,0, -0x3D4B4C,0x7F,0x77,0, -0x3CCA42,0xFF,0x5D,1, -0x3CCA40,0xDF,0x6E,1, -0x3CFB3A,0xFF,0x5D,0, -0x3CFB38,0xDF,0x6E,0, -0x3CFB7A,0xFF,0x5D,1, -0x3CFB78,0xDF,0x6E,1, -0x4F4D5A,0xFF,0x5D,0, -0x4F4D58,0xDF,0x6E,0, -0x3C931E,0xFF,0x5D,0, -0x3C931C,0xDF,0x6E,0, -0x9F9CF4,0xFF,0x5D,0, -0x9F9CF2,0xDF,0x6E,0, -0x4F4E1A,0xFF,0x5D,1, -0x4F4E18,0xDF,0x6E,1, -0x3C944E,0xFF,0x5D,1, -0x3C944C,0xDF,0x6E,1, -0x9F9D72,0xFF,0x5D,1, -0x9F9D70,0xDF,0x6E,1, -0x518E10,0xFF,0x5D,0, -0x518E12,0x7F,0x77,0, -0x3D4806,0xFF,0x5D,0, -0x3D4804,0xDF,0x6E,0, -0x3CCA02,0xFF,0x5D,0, -0x3CCA00,0xDF,0x6E,0, -0x3D14C6,0xDF,0x6E,0, -0x3D1506,0xDF,0x6E,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Purple.txt b/worlds/mlss/colors/pants/Purple.txt deleted file mode 100644 index da46a613e405..000000000000 --- a/worlds/mlss/colors/pants/Purple.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x0B,0x5C,0, -0x3CC880,0x10,0x7C,0, -0x3CC8C2,0x0B,0x5C,1, -0x3CC8C0,0x10,0x7C,1, -0x4F4CDA,0x0B,0x5C,0, -0x4F4CD8,0x10,0x7C,0, -0x4F4D1A,0x0B,0x5C,1, -0x4F4D18,0x10,0x7C,1, -0x519014,0x0B,0x5C,0, -0x519016,0x10,0x7C,0, -0x519034,0x0B,0x5C,1, -0x519036,0x10,0x7C,1, -0x5193E6,0x0B,0x5C,0, -0x5193E4,0x10,0x7C,0, -0x519406,0x0B,0x5C,1, -0x519404,0x10,0x7C,1, -0x3CC9C2,0x0B,0x5C,0, -0x3CC9C0,0x10,0x7C,0, -0x3CDE84,0x0B,0x5C,1, -0x3CDE74,0x0B,0x5C,1, -0x51AD2A,0x0B,0x5C,0, -0x51AD26,0xFB,0x7A,0, -0x51AD28,0x10,0x7C,0, -0x51AD4A,0x0B,0x5C,1, -0x51AD48,0x10,0x7C,1, -0x51AD46,0xFB,0x7A,1, -0x51A4AA,0x0B,0x5C,0, -0x51A4A6,0xFB,0x7A,0, -0x51A4A8,0x10,0x7C,0, -0x51A4CA,0x0B,0x5C,1, -0x51A4C8,0x10,0x7C,1, -0x51A4C6,0xFB,0x7A,1, -0x51A98A,0x0B,0x5C,0, -0x51A986,0xFB,0x7A,0, -0x51A988,0x10,0x7C,0, -0x51A96A,0x0B,0x5C,1, -0x51A968,0x10,0x7C,1, -0x51A966,0xFB,0x7A,1, -0x3CC982,0x0B,0x5C,0, -0x3CC980,0x10,0x7C,0, -0x3D4B4E,0x98,0x6E,0, -0x3D4B4C,0xFB,0x7A,0, -0x3CCA42,0x0B,0x5C,1, -0x3CCA40,0x10,0x7C,1, -0x3CFB3A,0x0B,0x5C,0, -0x3CFB38,0x10,0x7C,0, -0x3CFB7A,0x0B,0x5C,1, -0x3CFB78,0x10,0x7C,1, -0x4F4D5A,0x0B,0x5C,0, -0x4F4D58,0x10,0x7C,0, -0x3C931E,0x0B,0x5C,0, -0x3C931C,0x10,0x7C,0, -0x9F9CF4,0x0B,0x5C,0, -0x9F9CF2,0x10,0x7C,0, -0x4F4E1A,0x0B,0x5C,1, -0x4F4E18,0x10,0x7C,1, -0x3C944E,0x0B,0x5C,1, -0x3C944C,0x10,0x7C,1, -0x9F9D72,0x0B,0x5C,1, -0x9F9D70,0x10,0x7C,1, -0x518E10,0x0B,0x5C,0, -0x518E12,0xFB,0x7A,0, -0x3D4806,0x0B,0x5C,0, -0x3D4804,0x10,0x7C,0, -0x3CCA02,0x0B,0x5C,0, -0x3CCA00,0x10,0x7C,0, -0x3D14C6,0x10,0x7C,0, -0x3D1506,0x10,0x7C,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Red.txt b/worlds/mlss/colors/pants/Red.txt deleted file mode 100644 index 0cc46ee322f2..000000000000 --- a/worlds/mlss/colors/pants/Red.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x17,0x00,0, -0x3CC880,0x3F,0x04,0, -0x3CC8C2,0x17,0x00,1, -0x3CC8C0,0x3F,0x04,1, -0x4F4CDA,0x17,0x00,0, -0x4F4CD8,0x3F,0x04,0, -0x4F4D1A,0x17,0x00,1, -0x4F4D18,0x3F,0x04,1, -0x519014,0x17,0x00,0, -0x519016,0x3F,0x04,0, -0x519034,0x17,0x00,1, -0x519036,0x3F,0x04,1, -0x5193E6,0x17,0x00,0, -0x5193E4,0x3F,0x04,0, -0x519406,0x17,0x00,1, -0x519404,0x3F,0x04,1, -0x3CC9C2,0x17,0x00,0, -0x3CC9C0,0x3F,0x04,0, -0x3CDE84,0x17,0x00,1, -0x3CDE74,0x3F,0x04,1, -0x51AD2A,0x17,0x00,0, -0x51AD26,0xBF,0x56,0, -0x51AD28,0x3F,0x04,0, -0x51AD4A,0x17,0x00,1, -0x51AD48,0x3F,0x04,1, -0x51AD46,0xBF,0x56,1, -0x51A4AA,0x17,0x00,0, -0x51A4A6,0xBF,0x56,0, -0x51A4A8,0x3F,0x04,0, -0x51A4CA,0x17,0x00,1, -0x51A4C8,0x3F,0x04,1, -0x51A4C6,0xBF,0x56,1, -0x51A98A,0x17,0x00,0, -0x51A986,0xBF,0x56,0, -0x51A988,0x3F,0x04,0, -0x51A96A,0x17,0x00,1, -0x51A968,0x3F,0x04,1, -0x51A966,0xBF,0x56,1, -0x3CC982,0x17,0x00,0, -0x3CC980,0x3F,0x04,0, -0x3D4B4E,0x1D,0x3A,0, -0x3D4B4C,0xBF,0x56,0, -0x3CCA42,0x17,0x00,1, -0x3CCA40,0x3F,0x04,1, -0x3CFB3A,0x17,0x00,0, -0x3CFB38,0x3F,0x04,0, -0x3CFB7A,0x17,0x00,1, -0x3CFB78,0x3F,0x04,1, -0x4F4D5A,0x17,0x00,0, -0x4F4D58,0x3F,0x04,0, -0x3C931E,0x17,0x00,0, -0x3C931C,0x3F,0x04,0, -0x9F9CF4,0x17,0x00,0, -0x9F9CF2,0x3F,0x04,0, -0x4F4E1A,0x17,0x00,1, -0x4F4E18,0x3F,0x04,1, -0x3C944E,0x17,0x00,1, -0x3C944C,0x3F,0x04,1, -0x9F9D72,0x17,0x00,1, -0x9F9D70,0x3F,0x04,1, -0x518E10,0x17,0x00,0, -0x518E12,0xBF,0x56,0, -0x3D4806,0x17,0x00,0, -0x3D4804,0x3F,0x04,0, -0x3CCA02,0x17,0x00,0, -0x3CCA00,0x3F,0x04,0, -0x3D14C6,0x3F,0x04,0, -0x3D1506,0x3F,0x04,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/TrueChaos.txt b/worlds/mlss/colors/pants/TrueChaos.txt deleted file mode 100644 index f40a4020bab7..000000000000 --- a/worlds/mlss/colors/pants/TrueChaos.txt +++ /dev/null @@ -1,37 +0,0 @@ -0x3CC880,0, -0x3CC882,0, -0x3CC8C0,1, -0x3CC8C2,1, -0x3CC980,0, -0x3CC982,0, -0x4f4cd8,0, -0x4F4CDA,0, -0x4F4D18,1, -0x4F4D1A,1, -0x519014,0, -0x519016,0, -0x519034,1, -0x519036,1, -0x5193E4,0, -0x5193E6,0, -0x519404,1, -0x519406,1, -0x51A988,0, -0x51A98A,0, -0x51A968,1, -0x51A96A,1, -0x51ad28,0, -0x51AD2A,0, -0x51AD48,1, -0x51AD4A,1, -0x3CFB38,0, -0x3CFB3A,0, -0x3CFB78,1, -0x3CFB7A,1, -0x3CC9C0,0, -0x3CC9C2,0, -0x3CCA40,1, -0x3CCA42,1, -0x3CDE74,1, -0x3D4B4C,0, -0x3D4B4E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Vanilla.txt b/worlds/mlss/colors/pants/Vanilla.txt deleted file mode 100644 index 8cb514a5d7bf..000000000000 --- a/worlds/mlss/colors/pants/Vanilla.txt +++ /dev/null @@ -1,37 +0,0 @@ -0x3CC880,0xC6,0x7D,0, -0x3CC882,0x80,0x68,0, -0x3CC8C0,0xC6,0x7D,1, -0x3CC8C2,0x60,0x60,1, -0x3CC980,0xC6,0x7D,0, -0x3CC982,0x80,0x68,0, -0x4f4cd8,0xC6,0x7D,0, -0x4F4CDA,0x80,0x68,0, -0x4F4D18,0x83,0x7D,1, -0x4F4D1A,0x60,0x58,1, -0x519014,0x01,0x4D,0, -0x519016,0xC6,0x7D,0, -0x519034,0x01,0x4D,1, -0x519036,0xC6,0x7D,1, -0x5193E4,0xC6,0x7D,0, -0x5193E6,0x80,0x68,0, -0x519404,0x83,0x7D,1, -0x519406,0x60,0x58,1, -0x51A988,0xC6,0x7D,0, -0x51A98A,0x80,0x68,0, -0x51A968,0x83,0x7D,1, -0x51A96A,0x60,0x58,1, -0x51ad28,0xC6,0x7D,0, -0x51AD2A,0x80,0x68,0, -0x51AD48,0x83,0x7D,1, -0x51AD4A,0x60,0x58,1, -0x3CFB38,0xC6,0x7D,0, -0x3CFB3A,0x80,0x68,0, -0x3CFB78,0xC6,0x7D,1, -0x3CFB7A,0x60,0x60,1, -0x3CC9C0,0xC6,0x7D,0, -0x3CC9C2,0x80,0x68,0, -0x3CCA40,0x83,0x7D,1, -0x3CCA42,0x60,0x58,1, -0x3CDE74,0x83,0x7D,1, -0x3D4B4C,0x8F,0x7E,0, -0x3D4B4E,0x26,0x7E,0 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/White.txt b/worlds/mlss/colors/pants/White.txt deleted file mode 100644 index 9d6f5720dc7b..000000000000 --- a/worlds/mlss/colors/pants/White.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0x7B,0x6F,0, -0x3CC880,0xFF,0x7F,0, -0x3CC8C2,0x7B,0x6F,1, -0x3CC8C0,0xFF,0x7F,1, -0x4F4CDA,0x7B,0x6F,0, -0x4F4CD8,0xFF,0x7F,0, -0x4F4D1A,0x7B,0x6F,1, -0x4F4D18,0xFF,0x7F,1, -0x519014,0x7B,0x6F,0, -0x519016,0xFF,0x7F,0, -0x519034,0x7B,0x6F,1, -0x519036,0xFF,0x7F,1, -0x5193E6,0x7B,0x6F,0, -0x5193E4,0xFF,0x7F,0, -0x519406,0x7B,0x6F,1, -0x519404,0xFF,0x7F,1, -0x3CC9C2,0x7B,0x6F,0, -0x3CC9C0,0xFF,0x7F,0, -0x3CDE84,0x7B,0x6F,1, -0x3CDE74,0x7B,0x6F,1, -0x51AD2A,0x7B,0x6F,0, -0x51AD26,0xFF,0x7F,0, -0x51AD28,0xFF,0x7F,0, -0x51AD4A,0x7B,0x6F,1, -0x51AD48,0xFF,0x7F,1, -0x51AD46,0xFF,0x7F,1, -0x51A4AA,0x7B,0x6F,0, -0x51A4A6,0xFF,0x7F,0, -0x51A4A8,0xFF,0x7F,0, -0x51A4CA,0x7B,0x6F,1, -0x51A4C8,0xFF,0x7F,1, -0x51A4C6,0xFF,0x7F,1, -0x51A98A,0x7B,0x6F,0, -0x51A986,0xFF,0x7F,0, -0x51A988,0xFF,0x7F,0, -0x51A96A,0x7B,0x6F,1, -0x51A968,0xFF,0x7F,1, -0x51A966,0xFF,0x7F,1, -0x3CC982,0x7B,0x6F,0, -0x3CC980,0xFF,0x7F,0, -0x3D4B4E,0x7B,0x6F,0, -0x3D4B4C,0xFF,0x7F,0, -0x3CCA42,0x7B,0x6F,1, -0x3CCA40,0xFF,0x7F,1, -0x3CFB3A,0x7B,0x6F,0, -0x3CFB38,0xFF,0x7F,0, -0x3CFB7A,0x7B,0x6F,1, -0x3CFB78,0xFF,0x7F,1, -0x4F4D5A,0x7B,0x6F,0, -0x4F4D58,0xFF,0x7F,0, -0x3C931E,0x7B,0x6F,0, -0x3C931C,0xFF,0x7F,0, -0x9F9CF4,0x7B,0x6F,0, -0x9F9CF2,0xFF,0x7F,0, -0x4F4E1A,0x7B,0x6F,1, -0x4F4E18,0xFF,0x7F,1, -0x3C944E,0x7B,0x6F,1, -0x3C944C,0xFF,0x7F,1, -0x9F9D72,0x7B,0x6F,1, -0x9F9D70,0xFF,0x7F,1, -0x518E10,0x7B,0x6F,0, -0x518E12,0xFF,0x7F,0, -0x3D4806,0x7B,0x6F,0, -0x3D4804,0xFF,0x7F,0, -0x3CCA02,0x7B,0x6F,0, -0x3CCA00,0xFF,0x7F,0, -0x3D14C6,0xFF,0x7F,0, -0x3D1506,0xFF,0x7F,1 \ No newline at end of file diff --git a/worlds/mlss/colors/pants/Yellow.txt b/worlds/mlss/colors/pants/Yellow.txt deleted file mode 100644 index 7896b1a51fdc..000000000000 --- a/worlds/mlss/colors/pants/Yellow.txt +++ /dev/null @@ -1,68 +0,0 @@ -0x3CC882,0xF7,0x02,0, -0x3CC880,0xFF,0x07,0, -0x3CC8C2,0xF7,0x02,1, -0x3CC8C0,0xFF,0x07,1, -0x4F4CDA,0xF7,0x02,0, -0x4F4CD8,0xFF,0x07,0, -0x4F4D1A,0xF7,0x02,1, -0x4F4D18,0xFF,0x07,1, -0x519014,0xF7,0x02,0, -0x519016,0xFF,0x07,0, -0x519034,0xF7,0x02,1, -0x519036,0xFF,0x07,1, -0x5193E6,0xF7,0x02,0, -0x5193E4,0xFF,0x07,0, -0x519406,0xF7,0x02,1, -0x519404,0xFF,0x07,1, -0x3CC9C2,0xF7,0x02,0, -0x3CC9C0,0xFF,0x07,0, -0x3CDE84,0xF7,0x02,1, -0x3CDE74,0xF7,0x02,1, -0x51AD2A,0xF7,0x02,0, -0x51AD26,0xFF,0x4F,0, -0x51AD28,0xFF,0x07,0, -0x51AD4A,0xF7,0x02,1, -0x51AD48,0xFF,0x07,1, -0x51AD46,0xFF,0x4F,1, -0x51A4AA,0xF7,0x02,0, -0x51A4A6,0xFF,0x4F,0, -0x51A4A8,0xFF,0x07,0, -0x51A4CA,0xF7,0x02,1, -0x51A4C8,0xFF,0x07,1, -0x51A4C6,0xFF,0x4F,1, -0x51A98A,0xF7,0x02,0, -0x51A986,0xFF,0x4F,0, -0x51A988,0xFF,0x07,0, -0x51A96A,0xF7,0x02,1, -0x51A968,0xFF,0x07,1, -0x51A966,0xFF,0x4F,1, -0x3CC982,0xF7,0x02,0, -0x3CC980,0xFF,0x07,0, -0x3D4B4E,0xDE,0x27,0, -0x3D4B4C,0xFF,0x4F,0, -0x3CCA42,0xF7,0x02,1, -0x3CCA40,0xFF,0x07,1, -0x3CFB3A,0xF7,0x02,0, -0x3CFB38,0xFF,0x07,0, -0x3CFB7A,0xF7,0x02,1, -0x3CFB78,0xFF,0x07,1, -0x4F4D5A,0xF7,0x02,0, -0x4F4D58,0xFF,0x07,0, -0x3C931E,0xF7,0x02,0, -0x3C931C,0xFF,0x07,0, -0x9F9CF4,0xF7,0x02,0, -0x9F9CF2,0xFF,0x07,0, -0x4F4E1A,0xF7,0x02,1, -0x4F4E18,0xFF,0x07,1, -0x3C944E,0xF7,0x02,1, -0x3C944C,0xFF,0x07,1, -0x9F9D72,0xF7,0x02,1, -0x9F9D70,0xFF,0x07,1, -0x518E10,0xF7,0x02,0, -0x518E12,0xFF,0x4F,0, -0x3D4806,0xF7,0x02,0, -0x3D4804,0xFF,0x07,0, -0x3CCA02,0xF7,0x02,0, -0x3CCA00,0xFF,0x07,0, -0x3D14C6,0xFF,0x07,0, -0x3D1506,0xFF,0x07,1 \ No newline at end of file From 7046a25ad72f0f983d902203ca4eef508c45ea77 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:35:05 -0400 Subject: [PATCH 61/79] Update Rom.py --- worlds/mlss/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 685235d2157e..1b8a182509ae 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -29,7 +29,7 @@ Data.truechaosHat ] -pants = [ +cpants = [ Data.vanilla, Data.redPants, Data.greenPants, @@ -361,7 +361,7 @@ def swap_colors(world: "MLSSWorld", patch: MLSSProcedurePatch, color: int, bro: chaos = True if pants_option and color == 11: chaos = True - for c in [c for c in (pants[color] if pants_option else colors[color]) + for c in [c for c in (cpants[color] if pants_option else colors[color]) if (c[3] == bro if not chaos else c[1] == bro)]: if chaos: patch.write_token(APTokenTypes.WRITE, c[0], From 27c646d05a0c45c12f03683f3b9794b79858d285 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:43:07 -0400 Subject: [PATCH 62/79] Update README.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 50c5c557b979..db5c39ba0854 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,6 @@ Currently, the following games are supported: * A Short Hike * Yoshi's Island * Mario & Luigi: Superstar Saga -* For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled windows binaries. From ca421fc5fed7aab3a783e7eedc2370dbc6c91b9d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:43:24 -0400 Subject: [PATCH 63/79] Update worlds/mlss/Options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index df0f6ae18746..e2d9f6f27535 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -4,7 +4,7 @@ class BowsersCastleSkip(Toggle): """ - Skip straight from the entrance hall to bowletta in Bowser's Castle. + Skip straight from the entrance hall to Bowletta in Bowser's Castle. All Bowser's Castle items will be removed from the location pool. """ From 9011f93b836366db4b1d27c5d820974635e593f2 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:44:21 -0400 Subject: [PATCH 64/79] Update worlds/mlss/Client.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/Client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 7b963cc3262f..7672cc706118 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -149,7 +149,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if location in ctx.server_locations: locs_to_send.add(location) - # Loop for recieving items. Item is written as an ID into 0x3057. + # Loop for receiving items. Item is written as an ID into 0x3057. # ASM reads the ID in a loop and give the player the item before resetting the RAM address to 0x0. # If RAM address isn't 0x0 yet break out and try again later to give the rest of the items for i in range(len(ctx.items_received) - received_index): From b2b07f0f4bcdcbc6a434f42b8673e988d659dc6c Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:44:57 -0400 Subject: [PATCH 65/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index a70a863fd36b..0dd736c5ae6d 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -63,4 +63,4 @@ Items in a shop from another player's world will display the player name and ite ## When the player receives an item, what happens? -Items will be placed directly into the players inventory after a few seconds. Sometimes for certain events and cutscenes to be properly triggered right after you recieved an item, you may have to leave and re-enter the room to properly load everything required for the respective event or cutscene. +Items will be placed directly into the players inventory after a few seconds. Sometimes for certain events and cutscenes to be properly triggered right after you received an item, you may have to leave and re-enter the room to properly load everything required for the respective event or cutscene. From 26bce0eb16c9bebcd00d82da92a8cd8ee66a0716 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:45:12 -0400 Subject: [PATCH 66/79] Update worlds/mlss/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 2e15eb7f8258..b60730b8e128 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -45,7 +45,7 @@ class RomFile(settings.UserFilePath): class MLSSWorld(World): """ Adventure with Mario and Luigi together in the Beanbean Kingdom - to stop the evil cackletta and retrieve the Beanstar. + to stop the evil Cackletta and retrieve the Beanstar. """ game = "Mario & Luigi Superstar Saga" From 8aef4512db5bab4379f996350378e6481ab5cd13 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:45:22 -0400 Subject: [PATCH 67/79] Update worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md index 0dd736c5ae6d..4f83427d0955 100644 --- a/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md +++ b/worlds/mlss/docs/en_Mario & Luigi Superstar Saga.md @@ -17,7 +17,7 @@ Other Features such as Turbo through textboxes (Hold L/R+A) and Pipe Warping fro Enemies and Bosses can be randomized, and their stats can be scaled to feel more like the vanilla game's stats. -Other aspects of the game can be randomized as well such as music, sounds, battle backgrounds, Mario and Luigis Colors, and more. +Other aspects of the game can be randomized as well such as music, sounds, battle backgrounds, Mario and Luigi's Colors, and more. ## What is the goal of Mario & Luigi: Superstar Saga when randomized? From 679dcee460304b3900d73c8ff3540e08b55bae92 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 14:56:44 -0400 Subject: [PATCH 68/79] Update worlds/mlss/Data.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/Data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Data.py b/worlds/mlss/Data.py index 55d0cedc681f..749e63bcf24d 100644 --- a/worlds/mlss/Data.py +++ b/worlds/mlss/Data.py @@ -5702,4 +5702,4 @@ [0x3CCA02, 0xF7, 0x02, 0], [0x3CCA00, 0xFF, 0x07, 0], [0x3D14C6, 0xFF, 0x07, 0], -[0x3D1506, 0xFF, 0x07, 1]] \ No newline at end of file +[0x3D1506, 0xFF, 0x07, 1]] From 362628a02a981f4c07fe186f29fd18dc4d4d886d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 15:07:45 -0400 Subject: [PATCH 69/79] Review refactor. --- worlds/mlss/Items.py | 2 +- worlds/mlss/Options.py | 50 ++++++++++++++++++++++------------------- worlds/mlss/__init__.py | 8 +++---- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index 0d115eff0e54..3cc564d80862 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -6,7 +6,7 @@ class ItemData(typing.NamedTuple): code: int itemName: str - progression: ItemClassification + classification: ItemClassification itemID: int diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index df0f6ae18746..efce62878101 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -5,7 +5,7 @@ class BowsersCastleSkip(Toggle): """ Skip straight from the entrance hall to bowletta in Bowser's Castle. - All Bowser's Castle items will be removed from the location pool. + All Bowser's Castle locations will be removed from the location pool. """ display_name = "Bowser's Castle Skip" @@ -22,7 +22,7 @@ class ExtraPipes(Toggle): class SkipMinecart(Toggle): """ Skip the minecart minigame that leads you through Hoohoo Mountain Base. - This will remove the 1 item in the minecart cave from the location pool. + This will remove the 1 location in the minecart cave from the location pool. """ display_name = "Skip Minecart Minigame" @@ -30,7 +30,7 @@ class SkipMinecart(Toggle): class DisableSurf(Toggle): """ - Remove the surf minigame item from the location pool. + Remove the surf minigame location from the location pool. """ display_name = "Disable Surf Minigame" @@ -53,7 +53,7 @@ class MusicOptions(Choice): class RandomSounds(Toggle): """ - Randomizes every sound in the game, minus a select few that can softlock the game + Randomizes every sound in the game, minus a select few that can softlock the game. """ display_name = "Randomize Sounds" @@ -77,7 +77,7 @@ class MarioColor(Choice): option_white = 9 option_silhouette = 10 option_chaos = 11 - option_truechaos = 12 + option_true_chaos = 12 default = 0 @@ -99,7 +99,7 @@ class LuigiColor(Choice): option_white = 9 option_silhouette = 10 option_chaos = 11 - option_truechaos = 12 + option_true_chaos = 12 default = 1 @@ -148,11 +148,11 @@ class LuigiPants(Choice): class RandomizeEnemies(Choice): """ Randomize all normal enemy encounters in the game. - If Bowser's castle skip is enabled then enemies from Bowser's Castle will not be included. - disabled: Enemies will not be randomized - vanilla_groups: Vanilla enemy groups will be shuffled with each other. Custom enemy groups will not be made. - custom_groups: Custom enemy groups will be made and shuffled. Some enemy groups will only be semi-random. - (Groups including flying enemies or pestnuts) + If Bowser's castle skip is enabled, then enemies from Bowser's Castle will not be included. + Disabled: Enemies will not be randomized. + Vanilla Groups: Vanilla enemy groups will be shuffled with each other. Custom enemy groups will not be made. + Custom Groups: Custom enemy groups will be made and shuffled. Some enemy groups will only be semi-random, + including groups with flying enemies or pestnuts in them. """ display_name = "Randomize Enemies" @@ -166,15 +166,15 @@ class RandomizeBosses(Choice): """ Randomize all boss encounters in the game. If Bowser's castle skip is enabled then bosses from Bowser's Castle will not be included. - Some bosses are not randomized due to flags, and story (Such as the final boss) + Some bosses are not randomized due to flags, and story (such as the final boss). Boss Only: Bosses will only be swapped with another boss. Boss Normal: Bosses can be swapped with normal enemy encounters. """ display_name = "Randomize Bosses" option_disabled = 0 - option_bossonly = 1 - option_bossnormal = 2 + option_boss_only = 1 + option_boss_normal = 2 default = 0 @@ -191,7 +191,6 @@ class ScaleStats(Toggle): class XPMultiplier(Range): """ This will multiply any XP you receive in battle by the chosen multiplier. - """ display_name = "XP Multiplier" @@ -202,7 +201,7 @@ class XPMultiplier(Range): class TattleHp(Toggle): """ - This will display the enemies current and max health while in battle. + This will display the enemies' current and max health while in battle. """ display_name = "Tattle HP" @@ -210,7 +209,7 @@ class TattleHp(Toggle): class RandomizeBackgrounds(Toggle): """ - This randomizes the background image in battles + This randomizes the background image in battles. """ display_name = "Randomize Battle Backgrounds" @@ -218,7 +217,10 @@ class RandomizeBackgrounds(Toggle): class HiddenVisible(Choice): """ - This makes any hidden blocks in the game into regular item blocks. + This makes any hidden blocks in the game into regular item blocks and vice versa. + Disabled: Hidden blocks will remain invisible. + Hidden Visible: Hidden blocks will turn visible to the player. + Blocks Invisible: All item blocks will turn invisible. Hidden blocks will also remain invisible. """ display_name = "Item Block Visibility" @@ -247,19 +249,21 @@ class HarhallsPants(Toggle): 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. + allowing for the logic to account for players getting to certain areas in unintended ways. Enable at your own risk, this is not an option made for beginners. """ - display_name = "Difficult Logic Toggle" + display_name = "Difficult Logic" class ChuckleBeans(Choice): """ Choose how you want chuckle bean digspots to be randomized. - none: No chuckle bean digspots will be added into the item pool. - only_visible: Only chuckle bean digspots clearly marked with an X will be added into the item pool. - all: All chuckle bean digspots will be added into the item pool. + An amount of chuckle beans will be removed from the item pool, + equal to the amount of locations removed by the setting that you choose. + None: No chuckle bean digspots will be added into the location pool. + Only Visible: Only chuckle bean digspots clearly marked with an X will be added into the location pool. + All: All chuckle bean digspots will be added into the location pool. """ display_name = "Chuckle Beans" diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index 2e15eb7f8258..5ddb0dc54878 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -106,7 +106,7 @@ def create_items(self) -> None: required_items = [] precollected = [item for item in itemList if item in self.multiworld.precollected_items] for item in itemList: - if item.progression != ItemClassification.filler and item.progression != ItemClassification.skip_balancing: + if item.classification != ItemClassification.filler and item.classification != ItemClassification.skip_balancing: freq = item_frequencies.get(item.itemName, 1) if item in precollected: freq = max(freq - precollected.count(item), 0) @@ -120,7 +120,7 @@ def create_items(self) -> None: # Then, create our list of filler items filler_items = [] for item in itemList: - if item.progression != ItemClassification.filler: + if item.classification != ItemClassification.filler: continue if item.itemName == "5 Coins" and not self.options.coins: continue @@ -167,10 +167,10 @@ def set_rules(self) -> None: def create_item(self, name: str) -> MLSSItem: item = item_table[name] - return MLSSItem(item.itemName, item.progression, item.code, self.player) + return MLSSItem(item.itemName, item.classification, item.code, self.player) def get_filler_item_name(self) -> str: - return self.random.choice(list(filter(lambda item: item.progression == ItemClassification.filler, itemList))) + return self.random.choice(list(filter(lambda item: item.classification == ItemClassification.filler, itemList))) def generate_output(self, output_directory: str) -> None: patch = MLSSProcedurePatch(player=self.player, player_name=self.multiworld.player_name[self.player]) From ea1c0c7f27b31d107f5f7914afefe81586a5f10e Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 15:24:02 -0400 Subject: [PATCH 70/79] Update README.md Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index db5c39ba0854..dbf9865be65c 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Currently, the following games are supported: * A Short Hike * Yoshi's Island * Mario & Luigi: Superstar Saga + For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled windows binaries. From 6eb4b53028629f8100a98c77150582d3ea6b312a Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 16:03:34 -0400 Subject: [PATCH 71/79] Update worlds/mlss/Rules.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/mlss/Rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 02bb566abd24..53678dbfede7 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -61,7 +61,7 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canDash(state, world.player), ) - if world.options.chuckle_beans == 1 or world.options.chuckle_beans == 2: + if world.options.chuckle_beans != 0: add_rule( world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), From 6883b98c6b5db53eb6375cfe0f73faac1e36a0dc Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 16:25:53 -0400 Subject: [PATCH 72/79] Add coin blocks to LocationName --- worlds/mlss/Names/LocationName.py | 22 +++++++++++++ worlds/mlss/Rules.py | 52 +++++++++++++++---------------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index 84098f89308e..22796442ce5d 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -534,3 +534,25 @@ class LocationName: BadgeShopMomPiranhaFlag3 = "Badge Shop Mom Piranha Flag 3" HarhallsPants = "Harhall's Pants" HoohooMountainBaseBooStatueCaveCoinBlock1 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 1" + HoohooMountainBaseBooStatueCaveCoinBlock2 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 2" + HoohooMountainBaseBooStatueCaveCoinBlock3 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 3" + BeanbeanOutskirtsNWCoinBlock = "Beanbean Outskirts NW Coin Block" + BeanbeanOutskirtsSRoom1CoinBlock = "Beanbean Outskirts S Room 1 Coin Block" + BeanbeanOutskirtsSRoom2CoinBlock = "Beanbean Outskirts S Room 2 Coin Block" + ChateauPoppleRoomCoinBlock1 = "Chateau Popple Room Coin Block 1" + ChateauPoppleRoomCoinBlock2 = "Chateau Popple Room Coin Block 2" + ChucklehuckWoodsCaveRoom1CoinBlock = "Chuck Woods Cave Room 1 Coin Block" + ChucklehuckWoodsCaveRoom2CoinBlock = "Chuck Woods Cave Room 2 Coin Block" + ChucklehuckWoodsCaveRoom3CoinBlock = "Chuck Woods Cave Room 3 Coin Block" + ChucklehuckWoodsPipe5RoomCoinBlock = "Chucklehuck Woods Pipe 5 Room Coin Block" + ChucklehuckWoodsRoom7CoinBlock = "Chucklehuck Woods Room 7 Coin Block" + ChucklehuckWoodsAfterChucklerootCoinBlock = "Chucklehuck Woods After Chuckleroot Coin Block" + ChucklehuckWoodsKoopaRoomCoinBlock = "Chucklehuck Woods Koopa Room Coin Block" + ChucklehuckWoodsWinkleAreaCaveCoinBlock = "Chucklehuck Woods Winkle Area Cave Coin Block" + SewersPrisonRoomCoinBlock = "Sewers Prison Room Coin Block" + TeeheeValleyPastUltraHammerRocksCoinBlock = "Teehee Valley Past Ultra Hammer Rocks Coin Block" + SSChuckolaStorageRoomCoinBlock1 = "S.S. Chuckola Storage Room Coin Block 1" + SSChuckolaStorageRoomCoinBlock2 = "S.S. Chuckola Storage Room Coin Block 2" + GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock = "Gwarhar Lagoon First Underwater Area Room 2 Coin Block" + JokesEndSecondFloorWestRoomCoinBlock = "Joke's End Second Floor West Room Coin Block" + JokesEndNorthofBridgeRoomCoinBlock = "Joke's End North of Bridge Room Coin Block" diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 53678dbfede7..f686f37a627a 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -468,88 +468,88 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", world.player), + world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock2, world.player), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", world.player), + world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock3, world.player), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location("Beanbean Outskirts NW Coin Block", world.player), + world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWCoinBlock, world.player), lambda state: StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location("Beanbean Outskirts S Room 1 Coin Block", world.player), + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1CoinBlock, world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location("Beanbean Outskirts S Room 2 Coin Block", world.player), + world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2CoinBlock, world.player), lambda state: StateLogic.canCrash(state, world.player), ) add_rule( - world.multiworld.get_location("Chateau Popple Room Coin Block 1", world.player), + world.multiworld.get_location(LocationName.ChateauPoppleRoomCoinBlock1, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chateau Popple Room Coin Block 2", world.player), + world.multiworld.get_location(LocationName.ChateauPoppleRoomCoinBlock2, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Cave Room 1 Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom1CoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Cave Room 2 Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom2CoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Cave Room 3 Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom3CoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Pipe 5 Room Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsPipe5RoomCoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Room 7 Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7CoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods After Chuckleroot Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootCoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Koopa Room Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsKoopaRoomCoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location("Chucklehuck Woods Winkle Area Cave Coin Block", world.player), + world.multiworld.get_location(LocationName.ChucklehuckWoodsWinkleAreaCaveCoinBlock, world.player), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location("Sewers Prison Room Coin Block", world.player), + world.multiworld.get_location(LocationName.SewersPrisonRoomCoinBlock, world.player), lambda state: StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location("Teehee Valley Past Ultra Hammer Rocks Coin Block", world.player), + world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammerRocksCoinBlock, world.player), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 1", world.player), + world.multiworld.get_location(LocationName.SSChuckolaStorageRoomCoinBlock1, world.player), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location("Gwarhar Lagoon First Underwater Area Room 2 Coin Block", world.player), - lambda state: StateLogic.canDash(state, world.player) - and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), + world.multiworld.get_location(LocationName.SSChuckolaStorageRoomCoinBlock2, world.player), + lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location("S.S. Chuckola Storage Room Coin Block 2", world.player), - lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), + world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock, world.player), + lambda state: StateLogic.canDash(state, world.player) + and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), ) add_rule( - world.multiworld.get_location("Joke's End Second Floor West Room Coin Block", world.player), + world.multiworld.get_location(LocationName.JokesEndSecondFloorWestRoomCoinBlock, world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and ( @@ -558,7 +558,7 @@ def set_rules(world: "MLSSWorld", excluded): ), ) add_rule( - world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), + world.multiworld.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock, world.player), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and StateLogic.canDig(state, world.player) @@ -566,6 +566,6 @@ def set_rules(world: "MLSSWorld", excluded): ) if not world.options.difficult_logic: add_rule( - world.multiworld.get_location("Joke's End North of Bridge Room Coin Block", world.player), + world.multiworld.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock, world.player), lambda state: StateLogic.canCrash(state, world.player), ) From c072bd99fdc9bdc3d7176c0d3fc41d14b6d500ba Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 17:44:43 -0400 Subject: [PATCH 73/79] Refactor. --- worlds/mlss.apworld | Bin 0 -> 88634 bytes worlds/mlss/Names/LocationName.py | 7 +- worlds/mlss/Rules.py | 264 +++++++++++++++--------------- worlds/mlss/__init__.py | 3 +- 4 files changed, 138 insertions(+), 136 deletions(-) create mode 100644 worlds/mlss.apworld diff --git a/worlds/mlss.apworld b/worlds/mlss.apworld new file mode 100644 index 0000000000000000000000000000000000000000..3d1276e5659b4b9ee9ee59168b670f2a1cbd4e44 GIT binary patch literal 88634 zcmZ^K1zeQP_b-Zqw1||XK?q1o=Tb^8At6Y2H&O!9t<+KitI}OdgLDhhjRH%DbiAjo{@o( zxd|Kee>{Gh5(a+^9z$&u|F6ec%`BWP%xvu(O&-&VyExm~7&u!P8CYAp(;7LN7&x04 z(;B+dqN-=bX2SlTb%W~u^G6Df{x4D3S-Dv`|0B?yKk`?rX@1rN58H!{>Hq%{KQ9M6 zJKyu?&-r*cx%oMHIC!6Pnfao*<&zyp^u>K{^Zk5LFtQZ0K-T$rDWdQFNNU@G*L+)_ zkY4)FpNV@HpHt%&5@%8u7RZ{~W=0I9b6npsZpEgjYQ`j`W5$dy=cHaR*cZ;{MV@Zb zGxwi~Taw@SpM4`zG?QTl;-NOG|Cg8&;u0^UBwwnqs)@^}0tFg4yEvK%(DE5@^YWTL z=jS!%ck#H)ZGH`kTJMJPU*3|*uP_EV8L6}-so82y%KUkl4}0a?SA0(eMG#+` z%9GrqLrxtg)cr|TVwkBux(NmD>|3tcFUT3tIa>~v$@h?ueLUj$;jCU3(%0s1sNzDP zQNKX=^ld^Z)1%yB9wU3Q-)$sL)s=EZR#X{BKa z-JZ4jc`2BUE~-cR&yJ+JwKBbvNQR=WI~?`a)Hw6B9zDCyp!ter^jXH2_iWL~%KJ}y zA9NSxDu#y$y?_e-Scr0eqENFZEGhGd@b?AzRpzQ!YwqD@j`y9;fpo%?)%VSk3{P@$ zM|ugonr{lSTR9Hm*U&%j$CHJ-6m|p$^N&k$g{zkGU7$zu#QIRD^;Z0R&TPR7oqMQ} zXV9}d#QKETzNVD+qT-{#Yd^2euQ!)t^?RIEW78j`mC~*onaXFzq-ZAIT6rQv`B^IE z$*t9*oTc{{kvcp=D@L3)mUnm*=#qv~V`@IM4GU3YGg`#+vY)^FJ;20P!xVJKNtZJ_ z8zM}k-X3lpiC4T$+43+y=u5?qzz>#=L=|JWw!(3PB6Ij}1YF|vM-l=~7@j8Ax)ewS z_?{7}>HP8vFqXI@srKXZ0>hn~w}?`42%REu9tV1*-V5O(lU{q~%Ct_`_7FpA;Mo^_*BZvz~aqyeZKLy zV|h|Y(B1pN3?kVt4NJgyMv-Dw8@+md!h*Vp5vm~^B=AJ`+chl(B0-49>7s(;=v(mq zCUqILN}Q0GdbRzRSIe7lsqf$7Vt)4|9z6RpihI?~_A^qRMdzJZm!&cVuIqrDqxf*$ zJsoL0=I)B6%`_KEC~`uzO=Nk*)N%f?w+~+-%>*vHXJE6I2j~9!F zA9=oa*p7zupY78y*b@SZ>{B4%pTS^?PffyT}G*)!&Pmp6_dP|HsjA>vlJEe$noCC;gU+9 z4&uD{!nYCqmhN9FHVwIroMOtuUh3eJ#Ut-ImZt_U{iIoH$Vr67+=(7fGE|uAZ)5JfEwY58Q*Qm(R{6k$ca|%t zdmWhE@Z6?-@jk`t?YByo)Wy2N_{w({5nGe+2M?IF?9Itb)VH#UU-$3mETjiA22|fu z$b4E{;#BWQ$+jx&R5Sw*i2ax&{XIRe^}c!OXs=t{=ZrG6FHg;dnF`aGHqAPb50VZt zUqJ{`qp4ON-xB`ui_cv05F64YIP>~0PlnWV9IkNLyJCyU^L+j>^`i|~>XtSq+)a*|(6 z_|EJ1Zn76TPW{ybI$E>-u6x-uHFGpiCKeNEq zI5#QnD9v+42a5`lNU8REp}#tym%+=lZlLy zzs=oTsT2K(HAfy;XoJnqf7h_(P~e_*f{ zzZT?-#uR=OLbj@I?H$tf!_-2stTi!9A$#Z5;Dg4L7Lr2!?tu4!g3Z6WXy5DB@~x3Q zpkZK?8DcUsRryueG=&h?S4zyg(W&q(gj6>~wN>$XmP>!0b%lC?_ICrjKp%0D`^!50 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 z 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 literal 0 HcmV?d00001 diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index 22796442ce5d..7cbc2e4f31f8 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -541,9 +541,9 @@ class LocationName: BeanbeanOutskirtsSRoom2CoinBlock = "Beanbean Outskirts S Room 2 Coin Block" ChateauPoppleRoomCoinBlock1 = "Chateau Popple Room Coin Block 1" ChateauPoppleRoomCoinBlock2 = "Chateau Popple Room Coin Block 2" - ChucklehuckWoodsCaveRoom1CoinBlock = "Chuck Woods Cave Room 1 Coin Block" - ChucklehuckWoodsCaveRoom2CoinBlock = "Chuck Woods Cave Room 2 Coin Block" - ChucklehuckWoodsCaveRoom3CoinBlock = "Chuck Woods Cave Room 3 Coin Block" + ChucklehuckWoodsCaveRoom1CoinBlock = "Chucklehuck Woods Cave Room 1 Coin Block" + ChucklehuckWoodsCaveRoom2CoinBlock = "Chucklehuck Woods Cave Room 2 Coin Block" + ChucklehuckWoodsCaveRoom3CoinBlock = "Chucklehuck Woods Cave Room 3 Coin Block" ChucklehuckWoodsPipe5RoomCoinBlock = "Chucklehuck Woods Pipe 5 Room Coin Block" ChucklehuckWoodsRoom7CoinBlock = "Chucklehuck Woods Room 7 Coin Block" ChucklehuckWoodsAfterChucklerootCoinBlock = "Chucklehuck Woods After Chuckleroot Coin Block" @@ -556,3 +556,4 @@ class LocationName: GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock = "Gwarhar Lagoon First Underwater Area Room 2 Coin Block" JokesEndSecondFloorWestRoomCoinBlock = "Joke's End Second Floor West Room Coin Block" JokesEndNorthofBridgeRoomCoinBlock = "Joke's End North of Bridge Room Coin Block" + diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index f686f37a627a..13627eafc479 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -19,537 +19,537 @@ def set_rules(world: "MLSSWorld", excluded): if world.options.chuckle_beans == 0 or world.options.chuckle_beans == 1 and location.id in hidden: continue add_rule( - world.multiworld.get_location(location.name, world.player), + world.get_location(location.name), lambda state: StateLogic.canDig(state, world.player), ) if "Beanstone" in location.name: add_rule( - world.multiworld.get_location(location.name, world.player), + world.get_location(location.name), lambda state: StateLogic.canDig(state, world.player), ) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: - forbid_item(world.multiworld.get_location(location.name, world.player), "Hammers", world.player) + forbid_item(world.get_location(location.name), "Hammers", world.player) if "Badge" in location.name or "Pants" in location.name: add_rule( - world.multiworld.get_location(location.name, world.player), + world.get_location(location.name), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) if location.itemType != 0 and location.name not in excluded: if "Bowser" in location.name and world.options.castle_skip: continue - forbid_item(world.multiworld.get_location(location.name, world.player), "5 Coins", world.player) + forbid_item(world.get_location(location.name), "5 Coins", world.player) if world.options.chuckle_beans == 2: add_rule( - world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot, world.player), + world.get_location(LocationName.HoohooVillageSuperHammerCaveDigspot), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot2), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3, world.player), + world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot3), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3, world.player), + world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot3), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.JokesEndJojoraRoomDigspot, world.player), + world.get_location(LocationName.JokesEndJojoraRoomDigspot), lambda state: StateLogic.canDash(state, world.player), ) if world.options.chuckle_beans != 0: add_rule( - world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2, world.player), + world.get_location(LocationName.HoohooMountainBaseBoostatueRoomDigspot2), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsFarmRoomDigspot1), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2, world.player), + world.get_location(LocationName.ChucklehuckWoodsWhiteFruitRoomDigspot2), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1, world.player), + world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot1), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3, world.player), + world.get_location(LocationName.TeeheeValleyPastUltraHammersDigspot3), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNorthBeachDigspot3), lambda state: StateLogic.canDash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsEDigspot2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsEDigspot2), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNEDigspot1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNEDigspot1), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSRoom1Digspot2), lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), ) forbid_item( - world.multiworld.get_location(LocationName.SSChuckolaMembershipCard, world.player), "Nuts", world.player + world.get_location(LocationName.SSChuckolaMembershipCard), "Nuts", world.player ) # Bandaid Fix add_rule( - world.multiworld.get_location(LocationName.HoohooVillageHammerHouseBlock, world.player), + world.get_location(LocationName.HoohooVillageHammerHouseBlock), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2, world.player), + world.get_location(LocationName.HoohooMountainBaseBoostatueRoomBlock2), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBooStatueMole, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBooStatueMole), lambda state: StateLogic.canMini(state, world.player) and StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.HoohooVillageSuperHammerCaveBlock, world.player), + world.get_location(LocationName.HoohooVillageSuperHammerCaveBlock), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward1), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsFarmRoomMoleReward2), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsThunderHandMole, world.player), + world.get_location(LocationName.BeanbeanOutskirtsThunderHandMole), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWBlock, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNWBlock), lambda state: StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit1), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit2), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit3, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit3), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit4, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit4), lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit5, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit5), lambda state: StateLogic.super(state, world.player) and StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit6, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit6), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsBeanFruit7, world.player), + world.get_location(LocationName.BeanbeanOutskirtsBeanFruit7), lambda state: StateLogic.teehee(state, world.player) and StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1Block, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSRoom1Block), lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSRoom2Block1), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1, world.player), + world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock1), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2, world.player), + world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock2), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3, world.player), + world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock3), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4, world.player), + world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleSecretAreaBlock4), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock, world.player), + world.get_location(LocationName.WoohooHooniversityMiniMarioPuzzleBlock), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSecretScroll1), lambda state: StateLogic.thunder(state, world.player) and StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSecretScroll2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSecretScroll2), lambda state: StateLogic.thunder(state, world.player) and StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.HoohooVillageMoleBehindTurtle, world.player), + world.get_location(LocationName.HoohooVillageMoleBehindTurtle), lambda state: StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole1), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNESoloMarioMole2), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSuperHammerUpgrade), lambda state: StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade, world.player), + world.get_location(LocationName.BeanbeanOutskirtsUltraHammerUpgrade), lambda state: StateLogic.thunder(state, world.player) and StateLogic.pieces(state, world.player) and StateLogic.castleTown(state, world.player) and StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSoloLuigiCaveMole), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit, world.player), + world.get_location(LocationName.ChucklehuckWoodsRedChuckolaFruit), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit, world.player), + world.get_location(LocationName.ChucklehuckWoodsWhiteChuckolaFruit), lambda state: StateLogic.canDig(state, world.player) and StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock1), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock2), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock3), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock4), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock5), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootBlock6), lambda state: StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block1, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom7Block1), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7Block2, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom7Block2), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block1, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom4Block1), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block2, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom4Block2), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom4Block3, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom4Block3), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1, world.player), + world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock1), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2, world.player), + world.get_location(LocationName.ChucklehuckWoodsPipeRoomBlock2), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1, world.player), + world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock1), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2, world.player), + world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock2), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3, world.player), + world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock3), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4, world.player), + world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock4), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5, world.player), + world.get_location(LocationName.BeanbeanCastleTownMiniMarioBlock5), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastleFakeBeastar, world.player), + world.get_location(LocationName.BeanbeanCastleFakeBeastar), lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanCastlePeachsExtraDress, world.player), + world.get_location(LocationName.BeanbeanCastlePeachsExtraDress), lambda state: StateLogic.pieces(state, world.player) and StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.SewersRoom5Block1, world.player), + world.get_location(LocationName.SewersRoom5Block1), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.SewersRoom5Block2, world.player), + world.get_location(LocationName.SewersRoom5Block2), lambda state: StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block, world.player), + world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom1Block), lambda state: StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1, world.player), + world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block1), lambda state: StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2, world.player), + world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2Block2), lambda state: StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonRedPearlBean, world.player), + world.get_location(LocationName.GwarharLagoonRedPearlBean), lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonGreenPearlBean, world.player), + world.get_location(LocationName.GwarharLagoonGreenPearlBean), lambda state: StateLogic.fire(state, world.player) and StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1, world.player), + world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock1), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2, world.player), + world.get_location(LocationName.TeeheeValleyPastUltraHammersBlock2), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block, world.player), + world.get_location(LocationName.TeeheeValleySoloLuigiMazeRoom1Block), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.OhoOasisFirebrand, world.player), + world.get_location(LocationName.OhoOasisFirebrand), lambda state: StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.OhoOasisThunderhand, world.player), + world.get_location(LocationName.OhoOasisThunderhand), lambda state: StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanstarPieceYoshiTheater, world.player), + world.get_location(LocationName.BeanstarPieceYoshiTheater), lambda state: StateLogic.neon(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterAzureYoshi, world.player), + world.get_location(LocationName.YoshiTheaterAzureYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterBlueYoshi, world.player), + world.get_location(LocationName.YoshiTheaterBlueYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterGreenYoshi, world.player), + world.get_location(LocationName.YoshiTheaterGreenYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterOrangeYoshi, world.player), + world.get_location(LocationName.YoshiTheaterOrangeYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterPurpleYoshi, world.player), + world.get_location(LocationName.YoshiTheaterPurpleYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterRedYoshi, world.player), + world.get_location(LocationName.YoshiTheaterRedYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.YoshiTheaterYellowYoshi, world.player), + world.get_location(LocationName.YoshiTheaterYellowYoshi), lambda state: StateLogic.beanFruit(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.WinkleAreaBeanstarRoomBlock, world.player), + world.get_location(LocationName.WinkleAreaBeanstarRoomBlock), lambda state: StateLogic.winkle(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanstarPieceWinkleArea, world.player), + world.get_location(LocationName.BeanstarPieceWinkleArea), lambda state: StateLogic.winkle(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + world.get_location(LocationName.GwarharLagoonSpangleReward), lambda state: StateLogic.spangle(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag1, world.player), + world.get_location(LocationName.PantsShopMomPiranhaFlag1), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag2, world.player), + world.get_location(LocationName.PantsShopMomPiranhaFlag2), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.PantsShopMomPiranhaFlag3, world.player), + world.get_location(LocationName.PantsShopMomPiranhaFlag3), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag1, world.player), + world.get_location(LocationName.BadgeShopMomPiranhaFlag1), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag2, world.player), + world.get_location(LocationName.BadgeShopMomPiranhaFlag2), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BadgeShopMomPiranhaFlag3, world.player), + world.get_location(LocationName.BadgeShopMomPiranhaFlag3), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChateauGreenGoblet, world.player), + world.get_location(LocationName.ChateauGreenGoblet), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChateauRedGoblet, world.player), + world.get_location(LocationName.ChateauRedGoblet), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canMini(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonSpangle, world.player), + world.get_location(LocationName.GwarharLagoonSpangle), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonSpangleRoomBlock, world.player), + world.get_location(LocationName.GwarharLagoonSpangleRoomBlock), lambda state: StateLogic.ultra(state, world.player), ) if world.options.difficult_logic: add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonSpangleReward, world.player), + world.get_location(LocationName.GwarharLagoonSpangleReward), lambda state: StateLogic.canCrash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanstarPieceHermie, world.player), + world.get_location(LocationName.BeanstarPieceHermie), lambda state: StateLogic.canCrash(state, world.player), ) if world.options.chuckle_beans != 0: add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonPastHermieDigspot, world.player), + world.get_location(LocationName.GwarharLagoonPastHermieDigspot), lambda state: StateLogic.canCrash(state, world.player), ) if world.options.coins: add_rule( - world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1, world.player), + world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock2, world.player), + world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock2), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock3, world.player), + world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock3), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsNWCoinBlock, world.player), + world.get_location(LocationName.BeanbeanOutskirtsNWCoinBlock), lambda state: StateLogic.super(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom1CoinBlock, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSRoom1CoinBlock), lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.BeanbeanOutskirtsSRoom2CoinBlock, world.player), + world.get_location(LocationName.BeanbeanOutskirtsSRoom2CoinBlock), lambda state: StateLogic.canCrash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChateauPoppleRoomCoinBlock1, world.player), + world.get_location(LocationName.ChateauPoppleRoomCoinBlock1), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChateauPoppleRoomCoinBlock2, world.player), + world.get_location(LocationName.ChateauPoppleRoomCoinBlock2), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom1CoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsCaveRoom1CoinBlock), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom2CoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsCaveRoom2CoinBlock), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsCaveRoom3CoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsCaveRoom3CoinBlock), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsPipe5RoomCoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsPipe5RoomCoinBlock), lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsRoom7CoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsRoom7CoinBlock), lambda state: StateLogic.brooch(state, world.player) and StateLogic.hammers(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsAfterChucklerootCoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsAfterChucklerootCoinBlock), lambda state: StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsKoopaRoomCoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsKoopaRoomCoinBlock), lambda state: StateLogic.brooch(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.ChucklehuckWoodsWinkleAreaCaveCoinBlock, world.player), + world.get_location(LocationName.ChucklehuckWoodsWinkleAreaCaveCoinBlock), lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.SewersPrisonRoomCoinBlock, world.player), + world.get_location(LocationName.SewersPrisonRoomCoinBlock), lambda state: StateLogic.rose(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.TeeheeValleyPastUltraHammerRocksCoinBlock, world.player), + world.get_location(LocationName.TeeheeValleyPastUltraHammerRocksCoinBlock), lambda state: StateLogic.ultra(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.SSChuckolaStorageRoomCoinBlock1, world.player), + world.get_location(LocationName.SSChuckolaStorageRoomCoinBlock1), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.SSChuckolaStorageRoomCoinBlock2, world.player), + world.get_location(LocationName.SSChuckolaStorageRoomCoinBlock2), lambda state: StateLogic.super(state, world.player) or StateLogic.canDash(state, world.player), ) add_rule( - world.multiworld.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock, world.player), + world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock), lambda state: StateLogic.canDash(state, world.player) and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), ) add_rule( - world.multiworld.get_location(LocationName.JokesEndSecondFloorWestRoomCoinBlock, world.player), + world.get_location(LocationName.JokesEndSecondFloorWestRoomCoinBlock), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and ( @@ -558,7 +558,7 @@ def set_rules(world: "MLSSWorld", excluded): ), ) add_rule( - world.multiworld.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock, world.player), + world.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock), lambda state: StateLogic.ultra(state, world.player) and StateLogic.fire(state, world.player) and StateLogic.canDig(state, world.player) @@ -566,6 +566,6 @@ def set_rules(world: "MLSSWorld", excluded): ) if not world.options.difficult_logic: add_rule( - world.multiworld.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock, world.player), + world.get_location(LocationName.JokesEndNorthofBridgeRoomCoinBlock), lambda state: StateLogic.canCrash(state, world.player), ) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index f9abe1874d3c..f44343c230d0 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -57,9 +57,10 @@ class MLSSWorld(World): location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} required_client_version = (0, 4, 5) - disabled_locations: List[str] = [] + disabled_locations: List[str] def generate_early(self) -> None: + self.disabled_locations = [] if self.options.chuckle_beans == 0: self.disabled_locations += [location.name for location in all_locations if "Digspot" in location.name] if self.options.castle_skip: From 07385c842520619ea3ca03284e56c296a4d720ea Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 17:58:46 -0400 Subject: [PATCH 74/79] Update Items.py --- worlds/mlss/Items.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index 3cc564d80862..b95f1a0bc0a8 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -32,8 +32,8 @@ class MLSSItem(Item): ItemData(77771014, "1-UP Super", ItemClassification.useful, 0x17), ItemData(77771015, "Golden Mushroom", ItemClassification.useful, 0x18), ItemData(77771016, "Refreshing Herb", ItemClassification.filler, 0x19), - ItemData(77771017, "Red Pepper", ItemClassification.filler, 0x1A), - ItemData(77771018, "Green Pepper", ItemClassification.filler, 0x1B), + ItemData(77771017, "Red Pepper", ItemClassification.useful, 0x1A), + ItemData(77771018, "Green Pepper", ItemClassification.useful, 0x1B), ItemData(77771019, "Hoo Bean", ItemClassification.filler, 0x1D), ItemData(77771020, "Chuckle Bean", ItemClassification.filler, 0x1E), ItemData(77771021, "Woohoo Blend", ItemClassification.useful, 0x20), @@ -78,21 +78,21 @@ class MLSSItem(Item): ItemData(77771060, "Beanstar Piece 3", ItemClassification.progression, 0x67), ItemData(77771061, "Beanstar Piece 4", ItemClassification.progression, 0x70), ItemData(77771062, "Spangle", ItemClassification.progression, 0x72), - ItemData(77771063, "Beanlet 1", ItemClassification.useful, 0x73), - ItemData(77771064, "Beanlet 2", ItemClassification.useful, 0x74), - ItemData(77771065, "Beanlet 3", ItemClassification.useful, 0x75), - ItemData(77771066, "Beanlet 4", ItemClassification.useful, 0x76), - ItemData(77771067, "Beanlet 5", ItemClassification.useful, 0x77), - ItemData(77771068, "Beanstone 1", ItemClassification.useful, 0x80), - ItemData(77771069, "Beanstone 2", ItemClassification.useful, 0x81), - ItemData(77771070, "Beanstone 3", ItemClassification.useful, 0x82), - ItemData(77771071, "Beanstone 4", ItemClassification.useful, 0x83), - ItemData(77771072, "Beanstone 5", ItemClassification.useful, 0x84), - ItemData(77771073, "Beanstone 6", ItemClassification.useful, 0x85), - ItemData(77771074, "Beanstone 7", ItemClassification.useful, 0x86), - ItemData(77771075, "Beanstone 8", ItemClassification.useful, 0x87), - ItemData(77771076, "Beanstone 9", ItemClassification.useful, 0x90), - ItemData(77771077, "Beanstone 10", ItemClassification.useful, 0x91), + ItemData(77771063, "Beanlet 1", ItemClassification.filler, 0x73), + ItemData(77771064, "Beanlet 2", ItemClassification.filler, 0x74), + ItemData(77771065, "Beanlet 3", ItemClassification.filler, 0x75), + ItemData(77771066, "Beanlet 4", ItemClassification.filler, 0x76), + ItemData(77771067, "Beanlet 5", ItemClassification.filler, 0x77), + ItemData(77771068, "Beanstone 1", ItemClassification.filler, 0x80), + ItemData(77771069, "Beanstone 2", ItemClassification.filler, 0x81), + ItemData(77771070, "Beanstone 3", ItemClassification.filler, 0x82), + ItemData(77771071, "Beanstone 4", ItemClassification.filler, 0x83), + ItemData(77771072, "Beanstone 5", ItemClassification.filler, 0x84), + ItemData(77771073, "Beanstone 6", ItemClassification.filler, 0x85), + ItemData(77771074, "Beanstone 7", ItemClassification.filler, 0x86), + ItemData(77771075, "Beanstone 8", ItemClassification.filler, 0x87), + ItemData(77771076, "Beanstone 9", ItemClassification.filler, 0x90), + ItemData(77771077, "Beanstone 10", ItemClassification.filler, 0x91), ItemData(77771078, "Secret Scroll 1", ItemClassification.useful, 0x92), ItemData(77771079, "Secret Scroll 2", ItemClassification.useful, 0x93), ItemData(77771080, "Castle Badge", ItemClassification.useful, 0x9F), From f9f62412d8f8f54ea7dc86328104b1e776307f7f Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 17:59:17 -0400 Subject: [PATCH 75/79] Delete mlss.apworld --- worlds/mlss.apworld | Bin 88634 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 worlds/mlss.apworld diff --git a/worlds/mlss.apworld b/worlds/mlss.apworld deleted file mode 100644 index 3d1276e5659b4b9ee9ee59168b670f2a1cbd4e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88634 zcmZ^K1zeQP_b-Zqw1||XK?q1o=Tb^8At6Y2H&O!9t<+KitI}OdgLDhhjRH%DbiAjo{@o( zxd|Kee>{Gh5(a+^9z$&u|F6ec%`BWP%xvu(O&-&VyExm~7&u!P8CYAp(;7LN7&x04 z(;B+dqN-=bX2SlTb%W~u^G6Df{x4D3S-Dv`|0B?yKk`?rX@1rN58H!{>Hq%{KQ9M6 zJKyu?&-r*cx%oMHIC!6Pnfao*<&zyp^u>K{^Zk5LFtQZ0K-T$rDWdQFNNU@G*L+)_ zkY4)FpNV@HpHt%&5@%8u7RZ{~W=0I9b6npsZpEgjYQ`j`W5$dy=cHaR*cZ;{MV@Zb zGxwi~Taw@SpM4`zG?QTl;-NOG|Cg8&;u0^UBwwnqs)@^}0tFg4yEvK%(DE5@^YWTL z=jS!%ck#H)ZGH`kTJMJPU*3|*uP_EV8L6}-so82y%KUkl4}0a?SA0(eMG#+` z%9GrqLrxtg)cr|TVwkBux(NmD>|3tcFUT3tIa>~v$@h?ueLUj$;jCU3(%0s1sNzDP zQNKX=^ld^Z)1%yB9wU3Q-)$sL)s=EZR#X{BKa z-JZ4jc`2BUE~-cR&yJ+JwKBbvNQR=WI~?`a)Hw6B9zDCyp!ter^jXH2_iWL~%KJ}y zA9NSxDu#y$y?_e-Scr0eqENFZEGhGd@b?AzRpzQ!YwqD@j`y9;fpo%?)%VSk3{P@$ zM|ugonr{lSTR9Hm*U&%j$CHJ-6m|p$^N&k$g{zkGU7$zu#QIRD^;Z0R&TPR7oqMQ} zXV9}d#QKETzNVD+qT-{#Yd^2euQ!)t^?RIEW78j`mC~*onaXFzq-ZAIT6rQv`B^IE z$*t9*oTc{{kvcp=D@L3)mUnm*=#qv~V`@IM4GU3YGg`#+vY)^FJ;20P!xVJKNtZJ_ z8zM}k-X3lpiC4T$+43+y=u5?qzz>#=L=|JWw!(3PB6Ij}1YF|vM-l=~7@j8Ax)ewS z_?{7}>HP8vFqXI@srKXZ0>hn~w}?`42%REu9tV1*-V5O(lU{q~%Ct_`_7FpA;Mo^_*BZvz~aqyeZKLy zV|h|Y(B1pN3?kVt4NJgyMv-Dw8@+md!h*Vp5vm~^B=AJ`+chl(B0-49>7s(;=v(mq zCUqILN}Q0GdbRzRSIe7lsqf$7Vt)4|9z6RpihI?~_A^qRMdzJZm!&cVuIqrDqxf*$ zJsoL0=I)B6%`_KEC~`uzO=Nk*)N%f?w+~+-%>*vHXJE6I2j~9!F zA9=oa*p7zupY78y*b@SZ>{B4%pTS^?PffyT}G*)!&Pmp6_dP|HsjA>vlJEe$noCC;gU+9 z4&uD{!nYCqmhN9FHVwIroMOtuUh3eJ#Ut-ImZt_U{iIoH$Vr67+=(7fGE|uAZ)5JfEwY58Q*Qm(R{6k$ca|%t zdmWhE@Z6?-@jk`t?YByo)Wy2N_{w({5nGe+2M?IF?9Itb)VH#UU-$3mETjiA22|fu z$b4E{;#BWQ$+jx&R5Sw*i2ax&{XIRe^}c!OXs=t{=ZrG6FHg;dnF`aGHqAPb50VZt zUqJ{`qp4ON-xB`ui_cv05F64YIP>~0PlnWV9IkNLyJCyU^L+j>^`i|~>XtSq+)a*|(6 z_|EJ1Zn76TPW{ybI$E>-u6x-uHFGpiCKeNEq zI5#QnD9v+42a5`lNU8REp}#tym%+=lZlLy zzs=oTsT2K(HAfy;XoJnqf7h_(P~e_*f{ zzZT?-#uR=OLbj@I?H$tf!_-2stTi!9A$#Z5;Dg4L7Lr2!?tu4!g3Z6WXy5DB@~x3Q zpkZK?8DcUsRryueG=&h?S4zyg(W&q(gj6>~wN>$XmP>!0b%lC?_ICrjKp%0D`^!50 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 z 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 From ded8b730f475d297c124439c22d5182fa23e0d41 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 2 May 2024 22:39:48 -0400 Subject: [PATCH 76/79] Small asm bugfix --- worlds/mlss/Client.py | 2 +- worlds/mlss/data/basepatch.bsdiff | Bin 17621 -> 17624 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 7672cc706118..c8a659c5e102 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -118,7 +118,7 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: (0x4808, 2, "EWRAM"), (0x4407, 1, "EWRAM"), (0x2339, 1, "IWRAM"), - ], + ] ) flags = read_state[0] current_room = int.from_bytes(read_state[1], "little") diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index ba90b89f32e7a5aef23abeca7e963e71eb55bd2f..a25f8e38e6080baeac684e6ab1992b9a166004c4 100644 GIT binary patch delta 5261 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 P;X*=J`n!0ud>~vTPe_1_ From c3e4b57ec3aa0d899fa7a7ebefc6166a7b831244 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Fri, 3 May 2024 19:06:41 -0400 Subject: [PATCH 77/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 17624 -> 17622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index a25f8e38e6080baeac684e6ab1992b9a166004c4..ff1098b6e525d145926b21d3827ee68dc6274b39 100644 GIT binary patch literal 17622 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

~U^|aQfYF2A9ZKG4cZ!_Qc zS$^_1X1DDr!M)ID2H0!7lh5=s=Z-bF7;FaK(cSu(>DpG&ZTstozVJLB259!L>Uy=? z-8-bl%;3^pmDr+QeQKh>Zl* zdtcM0(@+awvLcBA=0IGcY)FWRj1dGionocfK5D+iQ$qu@=dbfG+;!+Tms4n$b8X&U zCa1%{hvm1}&=={(gpCOYb&ldvs33drhz8cG-c%%+uv7Vz1&4%^maU4QHfD+!HPX+qd``$gAX zb=Qiz>#n-%uZN8>j?o<9+R~)YYioWMNrp37WtLH4h8SUn7;@29VgQDd8dM06BMD+- zM)Ay&DlLC9Px(}^$%b3QzaTi=bNQJXfj~%tbbzv(-LP@J`n^6UBasUknViC^YYJZy z6ev)kLg}#&0YseTji9lppwVME#>U3R#$mUEQ!xq>VYz`21}oA$Gz7PcZ54#MQ1G3v z0ON}&k{|>_5<=T+fY2{Vh*>QQ+0yRLwE+VIA1xX-kS=X-AY z!&(5Vt732Kt8=BiYL3liUg5qtOa?a$QixhHlbpuMO}^e%zh2cQ(CQ)aL_%ceb$c5l z(3^3f!UUszZ?raxQBK~&czH6<2+s~!FoIKx(|$)Fs+8qvX+^~x6D87?$-AY=hOG64 zyEB zwVP|bze}p+AM*8bdbv3zZzs&55)A0WJDG>ish0Cz1&pslaUq){VAqg zt2E5)B$r^i@kd8|pz&Qn*5A==GcCC)a#QcIWK8f52WrfGJe8~PN6fG>-9|HIfZiT> z0qRA6g1vtCOIShD+4i)y9)H4!7m4$?JiI4E5sK{mkSC%mq_N=4jIyndd2f+Ft{VTp O@pmLsg$V*{N2}1|d%ds# literal 17624 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 A1^@s6 From 54f8ab19450463fdc2bbb069beec94220b17481d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sun, 5 May 2024 21:40:47 -0400 Subject: [PATCH 78/79] Client sends less messages to server --- worlds/mlss/Client.py | 33 +++++++++++++++++++-------------- worlds/mlss/Locations.py | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index c8a659c5e102..322f243ceb00 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -23,8 +23,9 @@ class MLSSClient(BizHawkClient): local_checked_locations: Set[int] goal_flag: int rom_slot_name: Optional[str] - eCount: int eUsed: List[int] + room: int + local_events: List[int] player_name: Optional[str] checked_flags: Dict[int, list] = {} @@ -35,8 +36,9 @@ def __init__(self) -> None: self.local_found_key_items = {} self.rom_slot_name = None self.seed_verify = False - self.eCount = 0 self.eUsed = [] + self.room = 0 + self.local_events = [] async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: from CommonClient import logger @@ -187,7 +189,8 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if backup_logo != "MLSSAP": return if flag_byte & mask != 0: - if location >= 0xDA0000: + if location >= 0xDA0000 and location not in self.local_events: + self.local_events += [location] await ctx.send_msgs( [ { @@ -247,17 +250,19 @@ async def game_watcher(self, ctx: "BizHawkClientContext") -> None: if not ctx.finished_game and cackletta != 0 and current_room == 0x1C7: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) - await ctx.send_msgs( - [ - { - "cmd": "Set", - "key": f"mlss_room_{ctx.team}_{ctx.slot}", - "default": 0, - "want_reply": False, - "operations": [{"operation": "replace", "value": current_room}], - } - ] - ) + if self.room != current_room: + self.room = current_room + await ctx.send_msgs( + [ + { + "cmd": "Set", + "key": f"mlss_room_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "replace", "value": current_room}], + } + ] + ) # Send locations if there are any to send. if locs_to_send != self.local_checked_locations: diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index 1301d2117acf..8c00432a8f06 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -1066,7 +1066,7 @@ class MLSSLocation(Location): 0x19B: 2, 0x19C: 1, 0x19E: 2, - 0x1A0: 2, + 0x19F: 2, 0x1A3: 1, 0x1A6: 2, 0x1AA: 1, From da807d44cc2f4b7111fa9b77c26c04f7ca6c9138 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Mon, 6 May 2024 00:50:11 -0400 Subject: [PATCH 79/79] Update basepatch.bsdiff --- worlds/mlss/data/basepatch.bsdiff | Bin 17622 -> 17619 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index ff1098b6e525d145926b21d3827ee68dc6274b39..45ed6a6b724fda04f43c17471aa42db1f2eabab3 100644 GIT binary patch literal 17619 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 literal 17622 zcmZ5`1yCG8x9+0B78ci#MS}-fT(Y<>?(Po3Jp>PKi|b;GyKC^^?v_As4VDB#lE;7F zt$XXeQ#EtG>Fzn*GgUKn&exxmmW-mD9E5ux7w}(JPV#^K^BLtoNXpQjpGVSwS<4_k zO*RdH3;*~3+s}W$|DUGcU$Mz|+SdHfeNpECF9Wv(-|1{|lpyTkbdY8Kw>Y`W0wvd4 zjsXSpm9%iV0v1~&bR$WfB8l}B;tXfbDo|fs2nd&KrB%NNa`Q$NRzen+##yl`n4U=A|@Ld6RJ{?9W4VhgY!kR0roFh{EAMtcAn)P8ObAP)WS5&voY zZ=)~Y10}#1)L7|iBRw!Q0ISE7DC%D4v>Nf7 zh^cX5g|vcvkO~ageOIPEx9QN<4}U4Rz#J2y&xcDAN8hcQ4E4xNjc}4PQN5!Hn*3s6>Ia2)l;;2p>BM^WLnf+3BsYEIDhWUxGdfM( z(NyR_cI>2pqjD3kbc`+53%0#zc}!~}&73S|1WU?{wjPBW7)qsH@Zt{#=?75L3di@je0--86bDN9l0=H?aNf6wpxjPm*o zKx$a9_2I&q0>wj~pkSjlf;8c;OBJ+ICwOwr1%By`wdTm^+tp?C!~l|Y7S^vT53>IK zQF3o=mw}62hcQ->(Za(ZwOWOrmukO0^D}8PnI*{TyI@0cu>@D;{*PU8`mFxh#gQ`$ z>lbdF^xu;;Rq3tbHBvi@8=kNy@n>VC2x1OjO$BxczL&ygnWMKo!Z^#=jOMZw9Mrm` z(g}E&d1qNm^mG*(+dFu!A6MIkw_T(dW9dk3?t(94;rkBd)JO18l))D~9IAxBL&hIo z%CdkOD{k{^OzLe|ZgY?APvxj?7?g#VKK*6|%rYDyA$8i4WCid88f_zX=9B#c|DSqPGFT=6ryNuDjv@D3%V`ujAbW`>5jG% z+MNz$2VCG)L+Fd>n{_? z9i%@Vk1P}c-r_0w6CycKA^?DljHqO$LUTGWHjkCfh)*ABsb0VtZYOE#U`q&xH^mD7 zhY#Q2|0v`>To|Bk|5$V`Gk``I*h>MMT~0l>ac!Dn4?dF1see9fxGl@6DtY_&5(AeK zUZy$BxGwhZC&dTBKAHQjlS#OxiM7v)i(xJ{p+D_GI1Kofzt_T@rZ)7$8m`aOm<{jG zsYEtj%0$-{{9#dsD7gGbR%B>fj+Lwwx6Vea_GvT=BN4SVuiH|iS0(dMUAcEvsbbYw z8n8`ZO+7hTldd$CS^?dzJ@TJuak-XKiwuv9bhMRDHDf=;2A=!y^@q#FJcsPU-YEAi z)3~_}n@Q+CqpUwD@L5ufWv^n)IN)m*u+9P>QQEc8LevrDqkv-w z$pyyJgMh_0U%->ga&nCb21qNo5tPZrm^R@vIv{{%J*3XlBH#*#yArG7SH{1}&OSRv zPUFG7uAg+NkD|t+!-$=oT?Fqyn+2_0m*+DD;1#~<5q40_QmF`M z3`bYMxG;6AcNVlH2Yuf_htZ&a@Jv4c*(0;}LG#qW)yL$AC|v-qMLv)8t*h=0uWlt9 zn?v&OH=nyc$474)|AY?ny+0A-jfee4=FuibE1xBtupf` z9nXgH!;dOmG=qsLz+fDy!G|7y=K<~omRSrw zc64lXbirGOH6>=j)yMJbS8;C4D~Ddw(JUMqXQ2WWb~JL?iB{*K_u=APrg~SqBB(5J zDS_X#l--N+2T0z4hN?K~2(WRjAOZN8MeS={W0lk$Ex8p|3f(0j^AhO>!pS$@j6@A% zyT)e=tap?*r6}WapD13t<>%QQ|InaiQvI#EnX|i190C2aOs_qf4E{A=z! zECOmUnPYHIw(^rUGKVL(@ZLVHlF`uF_e@zGuVJu{Qjp7L%kX6BDpl)1derdY6yOSA(d(_Rs`Goxq%7XkOFG8D0;%nNcBuc1I}(~o6;eCk6#v>z|G}P@5>?$g0yavf)wq)N;=G=N5Ry;EQLn< z;|Dhuml<)4`2UQMsfIQ^_UoDx+ZM>2-ak*{`kV) zPeP5t>!hG=U$Lw_XRJL&=PhQPWkZyk?>SI?Km=@ofr3rfd1kf5rBM30_mODU<~kAW z_Dmx2#IL31kZQD-SW&s(@Wc$nwA?M zOx~ersHs@M**L0DN0KDAo1?%;VFD1=nEPUED57&-xowm{CPE8~ zWO#V^b>*px)}6}IJhHsJbVMKrmUicYJ`HRwMGO& z#ifbmW5wkl*{K0Z(#){e2nU{+ibbk$2=fwEjwEEh!XcVFD=M^vS)so?<*j0vgIHF1 zD=&AY9E2IJC1cM3 zD+UsS?XwnW%PW@d1qxCi_u`No$SB;=1;*bn?CIsM1LmF^?9&wmBb~gGVXbf_P zK93M*kY1WELO>jf5O>T_G$;fBc`gDVV{<@2sy1R6ZRtOih64f1_is@TLb zY}2m|v}@I+UBynTZ=hR}s|s0NbCp0{#>{*ZSaW3gQs1_~ceQ>R&6SsoSRyhcs!r_W zclcmPg~_`N9~m+vRbs$XJ&IRxp%h&*SRpDtzR&FP)0MN#Uxp}hPiCj}Zx_FRmp5|j zBx*H$p|~i#oaf~+gXC1q4RgA#l1*ve_7t-hvaEy0>a3mj*9PEj#~uo^DXz|5^a&5mIZPLeoJvEp5goM!g_ZaXx}aZ(cY|^b z+HDy58X#jWk;(#*nMM9qBBp-ijRwsY^p7PM6@A7poNX}bt8=*uEK{bxSVGaFQ|b_I znNKogzX8G(^zA~GuFJFcnrvTO$c*)jUKuB&@84^p!3E z_1$+;a;31>*#J&@EF61q1-=A*XnaUC+WY9}=+}oJI#krT{tzi3HDid@C=oOq7eo6U zh)}yRq$*?$szZ!Hf}uG|&lVRLi^FDBTuhHikEO_nr6UIgt0j3lkm3(xlQYvau}v|4 z%#h-8E_$_v4Z@=nfn2bOhJ0#(|7J{yvfz-WGwF!M{N09ilZ!XR$`H4IChrl zD-$SYq;02=&VE?{08eZQOxJ~Pqdb#fyF1Ba z3o1zjdIwXCB1Q~jxR9wsmmd{tA5dyF&0Wzv!P*Benm(D|JcMUI0&^7iL)eW59!6V4 zRH*JIdw?E*g;KB9mYk^Wl^4&+oq1LZdt`n0;5OujRdG~47nGM z8%fa4D}16J!8mznhy({A&rJ1RH5k*NE`iBt(jCJ}qpXW`${MHp`=AY>q0xr&5kon+ z5v0RY*;3r6>plwaz1{LDNOj=1jE`9xvHaH^N|Kw`O98(S7TH;c$Mz{B>*~PNBj~Wy zSTaMPkNr!pDjs(p2gV?ZTQY4gq6vzM%;OJ%cA}d5mi{~{+Wg8ddF#6Q6tM~MkPO#gE`*ME$N5{+da;tiN${370va!-=_6lNA++hyi)6~CB2l6o-}Pa~jmIZW z(k1zN*941ayhbmv416G6UZQji0^{XhtKrS0p+V&BHGf57wnVhm$QZwWBnnMVcwEIO zh&EI@Av(ZT-qZ0-j{9oCCH_{;y8*qzz7q9X&bYnxQqmt#=92S8;o!!}P0HmYb25v) z)&x=MAA;n&83Ws)1IsG1Bzwq)cZnGy{pCZ$@*iM);z@QhP8K%k@ejwqUUBv;fV3;BAuy+|UdD}dCW>4`LD zPCG%`Ib=EAE3^3MnJI{{JlK*-#s~eP|K-KJP4)&Gr?-^s+a zro&K9y!cv41z-26dgrZ%PM9vHV*q=y?Y{XUubZV$Rmi3rRv@^Z-m#?`_KZ@RP z4$sqfG1LI*J{OP5SfVNd&J+=iwYlR(lfgezvra8UTcG8ZWq7xe+_jkW^6T>4`Fe zDzGhI!1(TK7#5c6OM47Isd3D1GAi@eFEL!=wso6H3WG1*X6q~v3>3f=(GQ~5n=a@& zR!ehMA>Ru>WbHH4D0EJYU;mlb0@Cc`GlxkPfMyZJXeT*i7ANlHP~^$=1WRv(RoLzy zI-W)oSopy$#yA}-*iB;MyMyB|8{P-3Qy11_qltkTv31*G=wAbr*KevIDgQOT#uc}~U64wMv?0-_qIT#e;rHfn*1cO_Gc-vju2d2dbJuCFP@Ku?4 zQ`zuR2g&3%TZdzmv7OT&wJW#}2n37?qX>3EuQc?_M`Iz?8MQ_5wb$m|G;WY2*|9c} zaa6*UJAMbePc-Kgd7?VlcAs0adKTVbIljaa%SmjlF8k(%TWRfyiy0o9o)=&!SpTN% zn13vh>9Cc_YKceY5a~bLv!5gNd zNWKF%b+Fd{2CO(^{;`@Tw4l;@4Xxkk#k&U@rF)c;sOa_ARLhNM+7tNKxU-;nOR0p zs(gD}`fEBmZ8wQWO~lE9l$5nj=0WB zWwhmx?qFka-DHlWB}BOd;g>LPR`=}S}Wr!4|P;=)0{(gd4!_UP8i_q21 z^N;3bY=Uiy-c=^yf^jT%cc_ayG}Z_|NuxKgI*d_4u4+Pc@AMw$;PSdESK6wQVUdYg2LY&t&;5pEy=$$ld4Jy9 z?Bqn!>IG9X6I4IP3su9pH%zto1>+-)CDL#1-@CDYB(3V>u&7oX2-oyDT);g&fluXO z1N6T*Y?(^59n64&=VgE6FRo)msZ-sFA-N`MFN85CnzQ1%cu z>yngAfMu2~v0Dp+_uCPmUMi1NXXS_D6AMs~tR=q8)28erFu!>Iz|K9ff&rv8pWH#u zt*v_SGT&*^;HBcW?GKN9Bh95mGSac%LrSk-GMhHy)ikW#%x0rIogVQE;}Ht%?0S{9 zyTO3t86X5sdKQY1I%9YKkn;-%r|$2 zeZ4H-bLy)>z7aGI8xZY9rH@3FhiSbX482Gu=7y|M`Em=&Yhk-4h2q&M_BXsRV1{LE zUy;ai{wvcAN7@CU2M{~!voIxn|3<@>r}@_)a9AyZ8tN5Zu$H#i8DTF<9N4o9f{&A* z4`b}5Uu}$M-C_B{!WXp}@)5tEK~uY`=DykH zJmy|zqCY&vPL;X&=$6D9qY`oI1b^qa>=;kcu-ASf@Mcq@YO_3Jw|m&w?%m9faE~6g zMwR4tx;x1Zm@eNfeE=&NAKbcGI!}O3e?)|Wu!8xCe6nTT#kKoPrPVMP;XEP+1?Y#9 z{8b{fOtX5}pe(2L{H-H?_?}};MPekl8f8kmF+8Wdjwy8@a(i1P?Wz4Z*dbEhM!I$V zt2wo^Tr;bnvG||N@feeq)pjk-+WbB{cuqZPL*&cQSzR_~0kbQzx;0epFnc{M+N@A1^&mgVz;wmWvr_v-m7MsX=Ng3bv#kEG2^8E+ z<&C&kpfMl~BSpBs4x6D{+qEkw==w_@>qO402$q{iw^ijga$lqE=(odY_8+QaIfICr zlXF|u%=E~!ht_l_MV_|C7~Xfv;?<_+VYAzofRU{peN^c&nTO=B4OxHW41bX^>0xXf z`*v5c?%P`Bd>VDoMP48_Wf`CWmJw)Vi-H( zQ{4d+DHI0QBYWPgDl;PT z?v>*VBM1~h*E5MsF5aVxYe}o?T0a%4e=->-*_DDex;aGrFHOnZ63`1EwE15;@_%^A zKhNmu>gw5jc?SQ!(iVunGO&eF&YOEfg}>RE&)JKfglq&ol#zO}EfqH2ZwiynVf-)^sEE&tBWK=mvizzYXsh5+nk=85IzR2CJZVXVKH1d(Y!D#Xn&#pM#x0+Lvh1JtyZ9QNdLwFV2+=g=0Yo<$s#003!&@c%RTpLf3H7ass_4x9!vF-ezddg=y`#ks~le};dhM3WbLG09ejgh?d zDVMj76Dx56yIl#i9;m0AsoG0A<;Zi~Rd*hWG+}PA&+k?`9YW8buV&NLAj43Tfz-w= zMUr*2U2K_Sp-wo&>w+S4-1a7AGr|}g#~K=K5^>A9-|&6wOsKFBriE`&lH;)y3k9G8=< z&Mp80i>$Nm$x7xGgkjRS$?*H?_76Ekv)T5dT(8&&$c}~*&mX z;sgF9vW%O&oN1%|r%sz8bf$akBJ|%;;~?9@gHJBkVccI^2ws5@ac)6{2(z&d5{pzww$y~_$L%eg* z?#Z~iYyxTY^&_L0d33xesNhU3EANoddB$&>aaKs21zFl;Z$6r%r?H}>YN(W{G%0S2 zy-WEs(URA;F6I{^gN~&wQ0l^rC6zYrJhB$4eTb~ljej5p9v(>P;>5NbZXbZQ3Mb}x zT~L=&=nmD3oLW?wiubqejkKrD9Z_KpO*ApZ)D-3p^f|4{6sMOR+@xoXT^c8&_p>EZ z%EHAitgRY{pEZ}+GkyzLLc2Wyt?C=c2wq;kudn+xiWCi9+L}gYql??e&&c(ash1F!%?GI=(%s*+_J*MoO=^$PjyOSJCuMzSPro#MtzGme<%MUZV0 zlpkf(Y>!_kFj^)P_XK?Mtdhb$kB+vf0i^WSHX4$Rn>aYJ&Gj3}g_CosIQvuBy~W`i zQYhsrFp76YXmsdl=G=K}T#7P@gw7uHN=!}r3YU8ylZV+u`*;>VAKvpVf2X_VH`tkO z7`Wm|!@}o&$n#fZ`36;tiydbAgHMH`ScKg`;^EMK{OL;xDqPTo$hw`0j^cMniEqUG z>Bo))+pPq1&wvYP+i)%kqn5_+PR&8Y9vijId39?OJEn5Wy!1tuN;3|HZlifl)~Eo_ zBp-JSZMu&AYrME@IJWA(Zx~8RXJmh-K0)^`PDqNJS9-ufmlI9A_wI{~>33|TD<~#m z1m{%SVkWwC>rUzsYg+}2^y#)TY=W0GoaDlas?4!B$qTD@z`wI1A?pq=b+X>Nd{Q}p;iBMi zqucj=Uj$%8Uvf7bJeUtihzW&-WD=r6U1HjBSMCu*YspOiXiW2NdlFy?-xdPbG-M-u zSx+zPq*Ed@5jT#tKZ1MDE$Ny-pT_f0|wtwj!{PfyTo)FwDV|}$i4l2ENU?+s^k#0#AuIz{MM_&vlOi2Fe(}0VQMLT z#xo6NYO#$Bb{JN%49ip;cB+5{R>i7?8ummB)?~W@3TEnFl~78p4eT5^P2o2&2nvr; zpeM(MMt8%o=>n4f9Xab+fLOmuOIV!w{CC{sGu2$nlDooBHX zb!ql5Iu%7m3f1Kw{K}hV%#CF&z)^0rw=eZ4F48Nakq9+mGsGO7^!Jut?zdm0jxC4rSt)R0oPZQ1x@#pb){PsKLIF`X?w~SpXHV#8jo0ZY z@1ZMcfpBS6v@Vu8EYnElT^=CP{QAAa#&8T=DeF)2eMGzFwPi~tzJ+Zq39<3enwTLD zX>K|*f0Zl|c0Z?3B%?KYY2z{rON9tYBAZsb(15J{BO56UM^*RNL5bwc>>rAruLbM0 zbgQ<1-uq>|qke&dO~b(%lpnkrY)$=9ER1c)0lPt$^WM3SnjjLEgfkaoGL+Wn$D%(K zJ7GvQJ#w|3+Bt4+7YA+aR`)@vS1ZtM4Q5F4WgaaS1o1POcCv^X9X5CD`{o9FOCd zKB%PC2}0B!Ct#UxA%jf_4G88s9a?5N8ZR#1ZJn*-8<|M?>cvKScK=)+91iOPn$Ps^ z#g21AJ}NQa*t0h&{q?5uFkP|6ESDWePc*C#^hd7voV4bM_PME@+4b93ZES3GOG{)q zvYNQ_SD(cxW?quL;ix-X5*O>GdrR#^4ji1QEaRt^y}7z_hyUv9`<5%rWDTtqoSbM? zeQ=)ziamD;QwJ6jhL1bL+A}8{$%EgQv>rOD^Eng$ z=G=++yDw4Ue{`2*4_{I#Vz%NET_)wn%F2) z>&4o~QW(S*hT6p{&3e_|g8N#UZnF;3ltm0i8?;LdA3)5qBKyEcH%3IN0(Ma*tZxHD zy>5n*D-58l8y_>t@w}ZuuS9%6A+jB-OsW)?v6n?I<97|?eW1|&BVu()L(h?$^fp47;euAZtofd~y>B6yOD`Fnr z|4&d1XbaU63&H2^GWQ~@SjSLa9p+Rr{)|)V{r#%iShDv-0UH}}994T)8bY9^eBbY+ zkCPe?$5UwuJR}+{@vrn-^-vhg;aZyS6J11KOxxOimm&FdJFoW^oP{%fyXM9K$Pr1y zs~r(BE!xzW9XVyYPO7w#-Z}IL5-k8iUg;Ed`58|a%(NQU!nA1!zY$Jezs+eU^*DE3 zN8SxB|NFL&FQG_}l0aF|JuM_+=J}%e__k5G@ry3JcJsUQ)uVB6Tu{;$;wne}G_(T{ zT9uOguVl*Nq>NCRm0IzoO<887sj1OuJWD*`qXUgW0F69N@Zq52D|tq`VkXnX_|JQj z14(C#1E;S!c4{pF+-qPr7hP=S3nkm;?#KK;*%D3{Gu8#{6j|@_--f!>tbV&<#Pl{< z>8y0UK6@mDYV}80i+lwU<5x+$^lT=@rr0)r6~49^UUOCsG}^i1=($bk81^-B!OS!! zhLx^(>I_2s+{v16xZYr4@VA$m5WhWP>s zK87vl$nBPv-fX7bPo6hD|_gYU3&o9y2WXiWK1es6`Kp~Vai>NTM%{JpIE8E z!ZVs2CiV^U&O$JObmEZaG810HwGT=>DONJyxs3YAHy_>pa;cvm#0zdFa50QrS3cT& zS#55d9$&hdV4+aQKak#_-6yfTu_qbGCB&QTnn-XHDn%M2fL)PB(& z8x%1hBOk|0LK#y8lKcb_q@zo=oErQTDb;WwczvNDZrUw3f7zukT6XO<2+z4^p$KxK ztN;4$RhC;d=DDjGcOte)+1RJ@h|jtFF9mdi%`|3rj2}=u$cp!d(?Vq36;H)dD%4fK zo_#bE!!-vmQVLqsy>S*P2?f-^^G<|>t6a_Pbp$wDJ>z%4!g5z1@i6^%3AwXK zwMQ>Wg?7TxSw;zICp%&p^Mqk zN^yCCd!ad2Qr58T59$N;Q1pNa2I*Y1%=eNdiezP9uZl`zh zlns2NUt{IWK!M-7?VRm5!@=NvP3p^)7jw3)(ym4sPGh9KlkH(eizT*|dUxC4iuF!{ zTTE?c_vwii_kq?@YW%!Cusnp%No8SQSE3V;Q9?bSDyj;{1W)4 z^rw`?+mWl?XGv`YMP{8IF)P_;4$GF@JXiL0?`rNCH;tEgX+BzJ>G@NoN)2{?BJ?Z7 zJws-y8K~n(S7B}U<_Za(UIx*`#(L^*%?u}HVkWFgH|b6n1;iAC2c|`0Xl;*0LPsD_ zcK|Exs`HXw*ukOMDE9h@F5B^Y&#no0VlA|2$7N-|tq)ii-;|qwZm_+j;ch@N6^ZSw zX1Qhkh0B{kmi%{j<5qguoW)$!%UjFMQf*&dYcoll37;PW6lyAhYbOim+g*u0(;R>jx;48RJYUs;V-kJ zs~gTPpIxksSsC{R;^atCszQ2G8Av%>i-LX#n#i3ezfq;sktXz)o9hqe7SbE=!ub|) zSw-DQk1wf?mVMo9Sc(TQW4}0fSIKx&vn%lGlu{}NgPe9pWMSVjnjX9&WB!tIKIHA~ z#rhe&iQkg`#>IuKR?Z-A6fX8iX<+JOnxj5{DsOAM9cB;;3c=otZfBx&qB1R7_Mc%s zJV`SkWpKs69V8;-|WOR417e^u(g#-qXpi1W1*OeeVyz*bbu5p31ne zmaAn3yMLx}!$a``1Bg&KU809>NN`X;@otvUu@W(YG3yx*W7a{zgbuBRs|ya?A8Eqs zv0Lv{f#C`)dtX!x8G4CQ>?iR=Af;6ogi0=@^ZYombXbWAp-?I!o_zF5mp?+L+4o_Z zgNm5ym8_?z$~322th52AI|qdZZ~DeOMO;4=AH08=xukZs`EGUqzVlaa0H#!nS&#m+ z_fFmn-vTb7shL)B@ml1yh@J3s(=#VKp$RXc801YWV;SX%w<4Fq#-7tu*2+7QCDD-0 z;Z*g^J7U#gRq9m!Eg>fbiUdWHj8283Ki@awnOEuboDgK@x|W$1vh@&RxcF7;mKh?z zfIVN(MXF$YOSUM%^eA1UaW)P2oZ%HU~ST?Q-?@E|} zV;*VZcL^gB2{~1eUR5j7Zsm$qm!2~FELc_I?%rtNm_tr7BBg>1g_=fVetxY)6}!p* z;QDaitNWg9r}o~XBUhPoL5C&yiCI~*=8=iSQ%`0AC0pOgQk~$Y%{6Rx4Vv1u*Q|<)>P^zq z6R}@GZwNC26|RBkT9}z(D*bUGtp$BYfYce)k7!2iq&5O@7}TmxzYAba2!Q z>?qw;Ke_Wr%1Vp3{tjL#(BFCcCu+H~goYSnmr;sZIm zw)6N!n>bC)dH}nzej9qObXBiERf(s8GcC^>>6d9ig@(thchPvbyz) z#Z33Xod9f+jLVhlh4dkc)Pn&Anx;o*B(h02h#`Jc@JFtV`rtf&y1#jd)U5-tZ zPgZ0YFx!VN!*yYW$g1sOgQjACiy&esSn2bgy^09BEy?~E5eW2x-yc0rlvgQ>80ZmK zjNV^U3GYn%Tf^5}+U9%*uRgux*C|i6pg#IjPS#9JP+WhuBaSTDwpNwAzc!iJnN8m7 z@#Xx-h2vlv_0RD| z78^MEZ+u#KtG#CQWCvPH-EV}$g_~-T?_hK$(uZRsW#2WNP8h|0iEP2DZ@fL;=9y6C zbPA6o(TaH&q*VnCybz;|pP6;baEZCRI2$y4l{9pL%j)z(SC=A7vrVLlp+6?UyK-|v z=lykE8&6q}h%Za*>W~hm<43I+lpkO69ch$Rx zxf~se!Ld}|OoXXXsc!E)QWi&%Vt)Cjv=hz^if1qIn6Q7o3dTK1$8lAurdBR!?pse# zQIyfqCtdlDk&r;ntXlLzFOu5u5r=5bc}b~p-+P1jlBLW@;HT)mil8|~>()-LIIzu= z?Tx@0n&nhWo8oj#Yh>5=E92f^elMqq2BjIi_xMWNA6vF-TfL`XWug|1VR=O~tTLGv z9G}Rh3zzy2q@2hc{QFTE4~Vv&e4P*zN} zsoeHC{s*vbovLcnvUFUMF{PqWmCF%P%7Swmvq5pEH~WGwsh;B&xi<(9#>9Hj5X(I! zozqS=6Pr*|MF|J^6b^G=>e8B$q>Yv(!*-sk59jd|1tV* z{cb(dvzlqFpSfhG5ucf4lx@`;(~lmOgG?TKwk^f;pK;`rB$7rn6Joz&s8F$CuI%o= znjIteV0&`(G}2Xm-r#O|&m9X)VpOy4jJCIq=XV={vrZBD@pC8(@8u0HwxTPh{A|kdFXViO<84r1QhP*nN0VY<(!0U% z7{cWoSuKqVQ%J^;3>yjy^j^R&^3pJHNZ}Q*6A{&f{g#J5x#pw0ooZ?qY$bB4whjNd z6BPM6E+74(D~p06;Z)pT1KO{`K%s80I+2jldJIM>p8KvA_D^#98b@S} zZ0Dw|Hn5tK{DNYG5aLIb(f1-YnCV}58YKmINkmWpzddDJ$vKMcoe4^XV2o0kgNmw_ z7jlHYvXexOFnz58u|_4m+*9yq`7=rwqVsWe?D00aU9>S*iXcNUicp}}pN+8W zbmk~}`wEhAAUhN^@%Y+LaER^3uj^2IY36cR)DP<(nIaS`tUl5#jDc{_USP;&* zx_bIEC2Im-Puez*1KWt}tAt5uSJA=Ga*i8fnjQD<0P$+5wqL+yJ=+4xS%d#+B+>mQuT*#?D39GdDn| zinM&>7zm3DHLqK`H0*oCnD*?SoD4`cY%;y;$XUi0c#rG77dBtHkP$LdVI#A@=a<-2 zX`v>&XwtIE%7KpDQFXcL(C917{9V>DalLuc%WQ>>ex$Q0WgLfn8oE_Wuwn@Ps8*#2 zqziQZ_9}Au;v~o{#^h0^BhxRN_vq47$rJ{)u9+QY$Ie7fG5N;-LH zC$VmzMDE^M3>ku`CY2|}4FT{GT^pH3TJGSYp2%E0NzF-Z`}@q`48WhQ5i-p0k$pF4 zu=)|5tFilA5>%8}oe=Nv&g6*7ku0!F`v^{?O3G_R@CgmZj3p9G|+p4^NL0~S@YreR|ZCxd*Ha?(OaSDs%sLmo#Lb&=tEK&Zd(nMF^ z0Ukc!&-2NH9%ZN9!|^!8N|w{>AM!NDFy&7F1vgZ}>ekS_JwUBqz` zPxuH+b+^>cv(F>vuLqJBQ}fat_3Bq(rGDs4FXz;6lVPXWs!X_tLoiuz@?)OVJ#QoC zSm);D3*$}9a*i}T*N^P?;x|9t)AK}ortzBxnu{lwekt30G8Hd03i*RiZb5uy{mn&J zRBaw^W|Dqo|3NhB(ohNU&+wEH6_Y-b@BakI12_C5na^@H!YQeO*(xceD8mi*gr*-nAf@b=y6Cr#78q*30#M6b7z# z>cz7La6@HAVnW5PIw^C{)hWtgM~z_ZOhr_)o=v7

~U^|aQfYF2A9ZKG4cZ!_Qc zS$^_1X1DDr!M)ID2H0!7lh5=s=Z-bF7;FaK(cSu(>DpG&ZTstozVJLB259!L>Uy=? z-8-bl%;3^pmDr+QeQKh>Zl* zdtcM0(@+awvLcBA=0IGcY)FWRj1dGionocfK5D+iQ$qu@=dbfG+;!+Tms4n$b8X&U zCa1%{hvm1}&=={(gpCOYb&ldvs33drhz8cG-c%%+uv7Vz1&4%^maU4QHfD+!HPX+qd``$gAX zb=Qiz>#n-%uZN8>j?o<9+R~)YYioWMNrp37WtLH4h8SUn7;@29VgQDd8dM06BMD+- zM)Ay&DlLC9Px(}^$%b3QzaTi=bNQJXfj~%tbbzv(-LP@J`n^6UBasUknViC^YYJZy z6ev)kLg}#&0YseTji9lppwVME#>U3R#$mUEQ!xq>VYz`21}oA$Gz7PcZ54#MQ1G3v z0ON}&k{|>_5<=T+fY2{Vh*>QQ+0yRLwE+VIA1xX-kS=X-AY z!&(5Vt732Kt8=BiYL3liUg5qtOa?a$QixhHlbpuMO}^e%zh2cQ(CQ)aL_%ceb$c5l z(3^3f!UUszZ?raxQBK~&czH6<2+s~!FoIKx(|$)Fs+8qvX+^~x6D87?$-AY=hOG64 zyEB zwVP|bze}p+AM*8bdbv3zZzs&55)A0WJDG>ish0Cz1&pslaUq){VAqg zt2E5)B$r^i@kd8|pz&Qn*5A==GcCC)a#QcIWK8f52WrfGJe8~PN6fG>-9|HIfZiT> z0qRA6g1vtCOIShD+4i)y9)H4!7m4$?JiI4E5sK{mkSC%mq_N=4jIyndd2f+Ft{VTp O@pmLsg$V*{N2}1|d%ds#