diff --git a/README.md b/README.md index fb82465030..c009d54fbe 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Currently, the following games are supported: * Yoshi's Island * Mario & Luigi: Superstar Saga * Bomb Rush Cyberfunk +* Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006 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 7db1dc2724..77432bfcd4 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -203,6 +203,9 @@ # Yoshi's Island /worlds/yoshisisland/ @PinkSwitch +#Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006 +/worlds/yugioh06/ @rensen + # Zillion /worlds/zillion/ @beauxq diff --git a/inno_setup.iss b/inno_setup.iss index 05bb27beca..529a96a33a 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -194,6 +194,11 @@ Root: HKCR; Subkey: "{#MyAppName}yipatch"; ValueData: "Archi Root: HKCR; Subkey: "{#MyAppName}yipatch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}yipatch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: ".apygo06"; ValueData: "{#MyAppName}ygo06patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ygo06patch"; ValueData: "Archipelago Yu-Gi-Oh 2006 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ygo06patch\DefaultIcon"; ValueData: "{app}\ArchipelagoBizHawkClient.exe,0"; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}ygo06patch\shell\open\command"; ValueData: """{app}\ArchipelagoBizHawkClient.exe"" ""%1"""; ValueType: string; ValueName: ""; + Root: HKCR; Subkey: ".archipelago"; ValueData: "{#MyAppName}multidata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Archipelago Server Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: ""; diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 9836a526c1..f77c16613f 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -504,6 +504,10 @@ class World(metaclass=AutoWorldRegister): def get_region(self, region_name: str) -> "Region": return self.multiworld.get_region(region_name, self.player) + @property + def player_name(self) -> str: + return self.multiworld.get_player_name(self.player) + @classmethod def get_data_package_data(cls) -> "GamesPackage": sorted_item_name_groups = { diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 05460e0f9b..05113514e4 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -18,7 +18,7 @@ import subprocess import threading import concurrent.futures import bsdiff4 -from typing import Optional, List +from typing import Collection, Optional, List, SupportsIndex from BaseClasses import CollectionState, Region, Location, MultiWorld from Utils import local_path, user_path, int16_as_bytes, int32_as_bytes, snes_to_pc, is_frozen, parse_yaml, read_snes_rom @@ -52,7 +52,7 @@ except: enemizer_logger = logging.getLogger("Enemizer") -class LocalRom(object): +class LocalRom: def __init__(self, file, patch=True, vanillaRom=None, name=None, hash=None): self.name = name @@ -71,13 +71,13 @@ class LocalRom(object): def read_byte(self, address: int) -> int: return self.buffer[address] - def read_bytes(self, startaddress: int, length: int) -> bytes: + def read_bytes(self, startaddress: int, length: int) -> bytearray: return self.buffer[startaddress:startaddress + length] def write_byte(self, address: int, value: int): self.buffer[address] = value - def write_bytes(self, startaddress: int, values): + def write_bytes(self, startaddress: int, values: Collection[SupportsIndex]) -> None: self.buffer[startaddress:startaddress + len(values)] = values def encrypt_range(self, startaddress: int, length: int, key: bytes): diff --git a/worlds/dkc3/Rom.py b/worlds/dkc3/Rom.py index efe8033d0f..0dc722a738 100644 --- a/worlds/dkc3/Rom.py +++ b/worlds/dkc3/Rom.py @@ -434,7 +434,7 @@ level_music_ids = [ 0x21, ] -class LocalRom(object): +class LocalRom: def __init__(self, file, patch=True, vanillaRom=None, name=None, hash=None): self.name = name @@ -457,7 +457,7 @@ class LocalRom(object): def read_byte(self, address: int) -> int: return self.buffer[address] - def read_bytes(self, startaddress: int, length: int) -> bytes: + def read_bytes(self, startaddress: int, length: int) -> bytearray: return self.buffer[startaddress:startaddress + length] def write_byte(self, address: int, value: int): diff --git a/worlds/overcooked2/__init__.py b/worlds/overcooked2/__init__.py index 633b624b84..be66fa3a8a 100644 --- a/worlds/overcooked2/__init__.py +++ b/worlds/overcooked2/__init__.py @@ -217,8 +217,6 @@ class Overcooked2World(World): # Autoworld Hooks def generate_early(self): - self.player_name = self.multiworld.player_name[self.player] - # 0.0 to 1.0 where 1.0 is World Record self.star_threshold_scale = self.options.star_threshold_scale / 100.0 diff --git a/worlds/pokemon_emerald/CHANGELOG.md b/worlds/pokemon_emerald/CHANGELOG.md index beb5344e6e..f0bed12577 100644 --- a/worlds/pokemon_emerald/CHANGELOG.md +++ b/worlds/pokemon_emerald/CHANGELOG.md @@ -1,3 +1,17 @@ +# 2.2.0 + +### Features + +- When you blacklist species from wild encounters and turn on dexsanity, blacklisted species are not added as locations +and won't show up in the wild. Previously they would be forced to show up exactly once. +- Added support for some new autotracking events. + +### Fixes + +- The Lilycove Wailmer now logically block you from the east. Actual game behavior is still unchanged for now. +- Water encounters in Slateport now correctly require Surf. +- Updated the tracker link in the setup guide. + # 2.1.1 ### Features @@ -12,10 +26,11 @@ _Separately released, branching from 2.0.0. Included procedure patch migration, ### Fixes -- Changed "Ho-oh" to "Ho-Oh" in options +- Changed "Ho-oh" to "Ho-Oh" in options. - Temporary fix to alleviate problems with sometimes not receiving certain items just after connecting if `remote_items` is `true`. -- Temporarily disable a possible location for Marine Cave to spawn, as its causes an overflow +- Temporarily disable a possible location for Marine Cave to spawn, as it causes an overflow. +- Water encounters in Dewford now correctly require Surf. # 2.0.0 diff --git a/worlds/smw/Rom.py b/worlds/smw/Rom.py index 36078d4622..ff3b5c3163 100644 --- a/worlds/smw/Rom.py +++ b/worlds/smw/Rom.py @@ -83,7 +83,7 @@ class LocalRom: def read_byte(self, address: int) -> int: return self.buffer[address] - def read_bytes(self, startaddress: int, length: int) -> bytes: + def read_bytes(self, startaddress: int, length: int) -> bytearray: return self.buffer[startaddress:startaddress + length] def write_byte(self, address: int, value: int): diff --git a/worlds/yoshisisland/Rom.py b/worlds/yoshisisland/Rom.py index fa3006afcf..0943ba8251 100644 --- a/worlds/yoshisisland/Rom.py +++ b/worlds/yoshisisland/Rom.py @@ -3,7 +3,7 @@ import os import Utils from worlds.Files import APDeltaPatch from settings import get_settings -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Collection, SupportsIndex from .Options import YoshiColors, BowserDoor, PlayerGoal, MinigameChecks @@ -396,7 +396,7 @@ location_table = { 0x30510B: [0x14B2, 4] } -class LocalRom(object): +class LocalRom: def __init__(self, file: str) -> None: self.name = None @@ -413,13 +413,13 @@ class LocalRom(object): def read_byte(self, address: int) -> int: return self.buffer[address] - def read_bytes(self, startaddress: int, length: int) -> bytes: + def read_bytes(self, startaddress: int, length: int) -> bytearray: return self.buffer[startaddress:startaddress + length] def write_byte(self, address: int, value: int) -> None: self.buffer[address] = value - def write_bytes(self, startaddress: int, values: bytearray) -> None: + def write_bytes(self, startaddress: int, values: Collection[SupportsIndex]) -> None: self.buffer[startaddress:startaddress + len(values)] = values def write_to_file(self, file: str) -> None: