diff --git a/Generate.py b/Generate.py index 3c27c237..e89482ad 100644 --- a/Generate.py +++ b/Generate.py @@ -37,7 +37,7 @@ def mystery_argparse(): parser.add_argument('--player_files_path', default=defaults["player_files_path"], help="Input directory for player files.") parser.add_argument('--seed', help='Define seed number to generate.', type=int) - parser.add_argument('--multi', default=defaults["players"], type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--multi', default=defaults["players"], type=lambda value: max(int(value), 1)) parser.add_argument('--spoiler', type=int, default=defaults["spoiler"]) parser.add_argument('--rom', default=options["lttp_options"]["rom_file"], help="Path to the 1.0 JP LttP Baserom.") parser.add_argument('--enemizercli', default=defaults["enemizer_path"]) @@ -46,7 +46,7 @@ def mystery_argparse(): parser.add_argument('--meta_file_path', default=defaults["meta_file_path"]) parser.add_argument('--log_output_path', help='Path to store output log') parser.add_argument('--log_level', default='info', help='Sets log level') - parser.add_argument('--yaml_output', default=0, type=lambda value: min(max(int(value), 0), 255), + parser.add_argument('--yaml_output', default=0, type=lambda value: max(int(value), 0), help='Output rolled mystery results to yaml up to specified number (made for async multiworld)') parser.add_argument('--plando', default=defaults["plando_options"], help='List of options that can be set manually. Can be combined, for example "bosses, items"') diff --git a/LttPClient.py b/LttPClient.py index da9482e4..3cb61a1d 100644 --- a/LttPClient.py +++ b/LttPClient.py @@ -25,6 +25,7 @@ from NetUtils import * from worlds.alttp import Regions, Shops from worlds.alttp import Items +from worlds.alttp.Rom import ROM_PLAYER_LIMIT import Utils from CommonClient import CommonContext, server_loop, console_loop, ClientCommandProcessor, gui_enabled, init_logging @@ -867,7 +868,8 @@ async def game_watcher(ctx: Context): snes_buffered_write(ctx, RECV_PROGRESS_ADDR, bytes([recv_index & 0xFF, (recv_index >> 8) & 0xFF])) snes_buffered_write(ctx, RECV_ITEM_ADDR, bytes([item.item])) - snes_buffered_write(ctx, RECV_ITEM_PLAYER_ADDR, bytes([item.player if item.player != ctx.slot else 0])) + snes_buffered_write(ctx, RECV_ITEM_PLAYER_ADDR, + bytes([min(ROM_PLAYER_LIMIT, item.player) if item.player != ctx.slot else 0])) if scout_location > 0 and scout_location in ctx.locations_info: snes_buffered_write(ctx, SCOUTREPLY_LOCATION_ADDR, bytes([scout_location])) snes_buffered_write(ctx, SCOUTREPLY_ITEM_ADDR, bytes([ctx.locations_info[scout_location][0]])) @@ -899,8 +901,6 @@ async def main(): parser.add_argument('--connect', default=None, help='Address of the multiworld host.') parser.add_argument('--password', default=None, help='Password of the multiworld host.') parser.add_argument('--loglevel', default='info', choices=['debug', 'info', 'warning', 'error', 'critical']) - parser.add_argument('--founditems', default=False, action='store_true', - help='Show items found by other players for themselves.') if not Utils.is_frozen(): # Frozen state has no cmd window in the first place parser.add_argument('--nogui', default=False, action='store_true', help="Turns off Client GUI.") args = parser.parse_args() diff --git a/WebHostLib/static/assets/faq/faq_en.md b/WebHostLib/static/assets/faq/faq_en.md index fef792af..5159fff7 100644 --- a/WebHostLib/static/assets/faq/faq_en.md +++ b/WebHostLib/static/assets/faq/faq_en.md @@ -22,7 +22,7 @@ player's game, they may find items which belong to the other player. If player A player B, the item will be sent to player B's world over the internet. This creates a cooperative experience during multi-world games, requiring players to rely upon each other to complete -their game. Currently, a maximum of 255 players can participate in a single multi-world. +their game. ## What happens if a person has to leave early? If a player must leave early, they can use Archipelago's forfeit system. When a player forfeits their game, all diff --git a/worlds/alttp/EntranceRandomizer.py b/worlds/alttp/EntranceRandomizer.py index 856ca611..49afb6c0 100644 --- a/worlds/alttp/EntranceRandomizer.py +++ b/worlds/alttp/EntranceRandomizer.py @@ -19,7 +19,7 @@ def parse_arguments(argv, no_defaults=False): # we need to know how many players we have first parser = argparse.ArgumentParser(add_help=False) - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--multi', default=defval(1), type=lambda value: max(int(value), 1)) multiargs, _ = parser.parse_known_args(argv) parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) @@ -238,7 +238,7 @@ def parse_arguments(argv, no_defaults=False): For unlit dark rooms, require the Lamp to be considered in logic by default. Torches means additionally easily accessible Torches that can be lit with Fire Rod are considered doable. None means full traversal through dark rooms without tools is considered doable.''') - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--multi', default=defval(1), type=lambda value: max(int(value), 1)) parser.add_argument('--names', default=defval('')) parser.add_argument('--outputpath') parser.add_argument('--game', default="A Link to the Past") diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 568ef893..97965c3a 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -5,6 +5,7 @@ from Patch import read_rom JAP10HASH = '03a63945398191337e896e5771f77173' RANDOMIZERBASEHASH = 'e397fef0e947d1bd760c68c4fe99a600' +ROM_PLAYER_LIMIT = 255 import io import json @@ -787,7 +788,7 @@ def patch_rom(world, rom, player, enemized): rom.write_byte(location.player_address, 0xFF) elif location.item.player != player: if location.player_address is not None: - rom.write_byte(location.player_address, location.item.player) + rom.write_byte(location.player_address, min(location.item.player, ROM_PLAYER_LIMIT)) else: itemid = 0x5A location_address = old_location_address_to_new_location_address.get(location.address, location.address) @@ -1653,8 +1654,10 @@ def patch_rom(world, rom, player, enemized): rom.write_bytes(0x7FC0, rom.name) # set player names - for p in range(1, min(world.players, 255) + 1): + for p in range(1, min(world.players, ROM_PLAYER_LIMIT) + 1): rom.write_bytes(0x195FFC + ((p - 1) * 32), hud_format_text(world.player_name[p])) + if world.players > ROM_PLAYER_LIMIT: + rom.write_bytes(0x195FFC + ((ROM_PLAYER_LIMIT - 1) * 32), hud_format_text("Archipelago")) # Write title screen Code hashint = int(rom.get_hash(), 16) @@ -1731,7 +1734,7 @@ def write_custom_shops(rom, world, player): item_data = [shop_id, item_code] + price_data + \ [item['max'], ItemFactory(item['replacement'], player).code if item['replacement'] else 0xFF] + \ - replacement_price_data + [0 if item['player'] == player else item['player']] + replacement_price_data + [0 if item['player'] == player else min(ROM_PLAYER_LIMIT, item['player'])] items_data.extend(item_data) rom.write_bytes(0x184800, shop_data) diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index f8ecbb28..d5129ced 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -15,8 +15,10 @@ def set_rules(world): player = world.player world = world.world if world.logic[player] == 'nologic': - logging.info( - 'WARNING! Seeds generated under this logic often require major glitches and may be impossible!') + if player == next(player_id for player_id in world.get_game_players("A Link to the Past") + if world.logic[player_id] == 'nologic'): # only warn one time + logging.info( + 'WARNING! Seeds generated under this logic often require major glitches and may be impossible!') if world.players == 1: world.get_region('Menu', player).can_reach_private = lambda state: True diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index 09ee8f9d..fce50d72 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -583,6 +583,6 @@ def price_to_funny_price(item: dict, world, player: int): if any(x in item['item'] for x in price_blacklist[p_type]): continue else: - item['price'] = min(price_chart[p_type](item['price']) , 255) + item['price'] = min(price_chart[p_type](item['price']), 255) item['price_type'] = p_type break