mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-30 03:33:22 -07:00
Merge branch 'main' into tunc-logic-rules-redux
This commit is contained in:
@@ -65,7 +65,7 @@ def get_seed_name(random_source) -> str:
|
||||
return f"{random_source.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)
|
||||
|
||||
|
||||
def main(args=None):
|
||||
def main(args=None) -> Tuple[argparse.Namespace, int]:
|
||||
# __name__ == "__main__" check so unittests that already imported worlds don't trip this.
|
||||
if __name__ == "__main__" and "worlds" in sys.modules:
|
||||
raise Exception("Worlds system should not be loaded before logging init.")
|
||||
@@ -237,8 +237,7 @@ def main(args=None):
|
||||
with open(os.path.join(args.outputpath if args.outputpath else ".", f"generate_{seed_name}.yaml"), "wt") as f:
|
||||
yaml.dump(important, f)
|
||||
|
||||
from Main import main as ERmain
|
||||
return ERmain(erargs, seed)
|
||||
return erargs, seed
|
||||
|
||||
|
||||
def read_weights_yamls(path) -> Tuple[Any, ...]:
|
||||
@@ -547,7 +546,9 @@ def roll_alttp_settings(ret: argparse.Namespace, weights):
|
||||
if __name__ == '__main__':
|
||||
import atexit
|
||||
confirmation = atexit.register(input, "Press enter to close.")
|
||||
multiworld = main()
|
||||
erargs, seed = main()
|
||||
from Main import main as ERmain
|
||||
multiworld = ERmain(erargs, seed)
|
||||
if __debug__:
|
||||
import gc
|
||||
import sys
|
||||
|
||||
@@ -26,6 +26,7 @@ def _generate_local_inner(games: Iterable[str],
|
||||
with TemporaryDirectory() as players_dir:
|
||||
with TemporaryDirectory() as output_dir:
|
||||
import Generate
|
||||
import Main
|
||||
|
||||
for n, game in enumerate(games, 1):
|
||||
player_path = Path(players_dir) / f"{n}.yaml"
|
||||
@@ -42,7 +43,7 @@ def _generate_local_inner(games: Iterable[str],
|
||||
sys.argv = [sys.argv[0], "--seed", str(hash(tuple(games))),
|
||||
"--player_files_path", players_dir,
|
||||
"--outputpath", output_dir]
|
||||
Generate.main()
|
||||
Main.main(*Generate.main())
|
||||
output_files = list(Path(output_dir).glob('*.zip'))
|
||||
assert len(output_files) == 1
|
||||
final_file = dest / output_files[0].name
|
||||
|
||||
@@ -9,6 +9,7 @@ from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
import Generate
|
||||
import Main
|
||||
|
||||
|
||||
class TestGenerateMain(unittest.TestCase):
|
||||
@@ -58,7 +59,7 @@ class TestGenerateMain(unittest.TestCase):
|
||||
'--player_files_path', str(self.abs_input_dir),
|
||||
'--outputpath', self.output_tempdir.name]
|
||||
print(f'Testing Generate.py {sys.argv} in {os.getcwd()}')
|
||||
Generate.main()
|
||||
Main.main(*Generate.main())
|
||||
|
||||
self.assertOutput(self.output_tempdir.name)
|
||||
|
||||
@@ -67,7 +68,7 @@ class TestGenerateMain(unittest.TestCase):
|
||||
'--player_files_path', str(self.rel_input_dir),
|
||||
'--outputpath', self.output_tempdir.name]
|
||||
print(f'Testing Generate.py {sys.argv} in {os.getcwd()}')
|
||||
Generate.main()
|
||||
Main.main(*Generate.main())
|
||||
|
||||
self.assertOutput(self.output_tempdir.name)
|
||||
|
||||
@@ -86,7 +87,7 @@ class TestGenerateMain(unittest.TestCase):
|
||||
sys.argv = [sys.argv[0], '--seed', '0',
|
||||
'--outputpath', self.output_tempdir.name]
|
||||
print(f'Testing Generate.py {sys.argv} in {os.getcwd()}, player_files_path={self.yaml_input_dir}')
|
||||
Generate.main()
|
||||
Main.main(*Generate.main())
|
||||
finally:
|
||||
user_path.cached_path = user_path_backup
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import typing
|
||||
import bsdiff4
|
||||
|
||||
import settings
|
||||
from BaseClasses import Entrance, Item, ItemClassification, Location, Tutorial
|
||||
from BaseClasses import Entrance, Item, ItemClassification, Location, Tutorial, MultiWorld
|
||||
from Fill import fill_restrictive
|
||||
from worlds.AutoWorld import WebWorld, World
|
||||
from .Common import *
|
||||
@@ -24,7 +24,7 @@ from .LADXR.worldSetup import WorldSetup as LADXRWorldSetup
|
||||
from .Locations import (LinksAwakeningLocation, LinksAwakeningRegion,
|
||||
create_regions_from_ladxr, get_locations_to_id)
|
||||
from .Options import DungeonItemShuffle, links_awakening_options, ShuffleInstruments
|
||||
from .Rom import LADXDeltaPatch
|
||||
from .Rom import LADXDeltaPatch, get_base_rom_path
|
||||
|
||||
DEVELOPER_MODE = False
|
||||
|
||||
@@ -433,6 +433,12 @@ class LinksAwakeningWorld(World):
|
||||
|
||||
return "TRADING_ITEM_LETTER"
|
||||
|
||||
@classmethod
|
||||
def stage_assert_generate(cls, multiworld: MultiWorld):
|
||||
rom_file = get_base_rom_path()
|
||||
if not os.path.exists(rom_file):
|
||||
raise FileNotFoundError(rom_file)
|
||||
|
||||
def generate_output(self, output_directory: str):
|
||||
# copy items back to locations
|
||||
for r in self.multiworld.get_regions(self.player):
|
||||
|
||||
@@ -661,6 +661,9 @@ class PokemonRedBlueWorld(World):
|
||||
"dark_rock_tunnel_logic": self.multiworld.dark_rock_tunnel_logic[self.player].value,
|
||||
"split_card_key": self.multiworld.split_card_key[self.player].value,
|
||||
"all_elevators_locked": self.multiworld.all_elevators_locked[self.player].value,
|
||||
"require_pokedex": self.multiworld.require_pokedex[self.player].value,
|
||||
"area_1_to_1_mapping": self.multiworld.area_1_to_1_mapping[self.player].value,
|
||||
"blind_trainers": self.multiworld.blind_trainers[self.player].value,
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ As we are using BizHawk, this guide is only applicable to Windows and Linux syst
|
||||
|
||||
## Optional Software
|
||||
|
||||
- [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/j-imbo/pkmnrb_jim/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases)
|
||||
- [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/coveleski/rb_tracker/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases)
|
||||
|
||||
|
||||
## Configuring BizHawk
|
||||
@@ -109,7 +109,7 @@ server uses password, type in the bottom textfield `/connect <address>:<port> [p
|
||||
|
||||
Pokémon Red and Blue has a fully functional map tracker that supports auto-tracking.
|
||||
|
||||
1. Download [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/j-imbo/pkmnrb_jim/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases).
|
||||
1. Download [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/coveleski/rb_tracker/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases).
|
||||
2. Open PopTracker, and load the Pokémon Red and Blue pack.
|
||||
3. Click on the "AP" symbol at the top.
|
||||
4. Enter the AP address, slot name and password.
|
||||
|
||||
@@ -17,7 +17,7 @@ Al usar BizHawk, esta guía solo es aplicable en los sistemas de Windows y Linux
|
||||
|
||||
## Software Opcional
|
||||
|
||||
- [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/j-imbo/pkmnrb_jim/releases/latest), para usar con [PopTracker](https://github.com/black-sliver/PopTracker/releases)
|
||||
- [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/coveleski/rb_tracker/releases/latest), para usar con [PopTracker](https://github.com/black-sliver/PopTracker/releases)
|
||||
|
||||
|
||||
## Configurando BizHawk
|
||||
@@ -101,7 +101,7 @@ Ahora ya estás listo para tu aventura en Kanto.
|
||||
|
||||
Pokémon Red and Blue tiene un mapa completamente funcional que soporta seguimiento automático.
|
||||
|
||||
1. Descarga el [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/j-imbo/pkmnrb_jim/releases/latest) y [PopTracker](https://github.com/black-sliver/PopTracker/releases).
|
||||
1. Descarga el [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/coveleski/rb_tracker/releases/latest) y [PopTracker](https://github.com/black-sliver/PopTracker/releases).
|
||||
2. Abre PopTracker, y carga el pack de Pokémon Red and Blue.
|
||||
3. Haz clic en el símbolo "AP" en la parte superior.
|
||||
4. Ingresa la dirección de AP, nombre del slot y contraseña (si es que hay).
|
||||
|
||||
@@ -399,6 +399,16 @@ class WitnessPlayerLogic:
|
||||
mnt_lasers = world.options.mountain_lasers
|
||||
chal_lasers = world.options.challenge_lasers
|
||||
|
||||
# Victory Condition
|
||||
if victory == "elevator":
|
||||
self.VICTORY_LOCATION = "0x3D9A9"
|
||||
elif victory == "challenge":
|
||||
self.VICTORY_LOCATION = "0x0356B"
|
||||
elif victory == "mountain_box_short":
|
||||
self.VICTORY_LOCATION = "0x09F7F"
|
||||
elif victory == "mountain_box_long":
|
||||
self.VICTORY_LOCATION = "0xFFF00"
|
||||
|
||||
# Exclude panels from the post-game if shuffle_postgame is false.
|
||||
if not world.options.shuffle_postgame:
|
||||
adjustment_linesets_in_order += self.handle_postgame(world)
|
||||
@@ -418,17 +428,6 @@ class WitnessPlayerLogic:
|
||||
if not victory == "challenge":
|
||||
adjustment_linesets_in_order.append(["Disabled Locations:", "0x0A332"])
|
||||
|
||||
# Victory Condition
|
||||
|
||||
if victory == "elevator":
|
||||
self.VICTORY_LOCATION = "0x3D9A9"
|
||||
elif victory == "challenge":
|
||||
self.VICTORY_LOCATION = "0x0356B"
|
||||
elif victory == "mountain_box_short":
|
||||
self.VICTORY_LOCATION = "0x09F7F"
|
||||
elif victory == "mountain_box_long":
|
||||
self.VICTORY_LOCATION = "0xFFF00"
|
||||
|
||||
# Long box can usually only be solved by opening Mountain Entry. However, if it requires 7 lasers or less
|
||||
# (challenge_lasers <= 7), you can now solve it without opening Mountain Entry first.
|
||||
# Furthermore, if the user sets mountain_lasers > 7, the box is rotated to not require Mountain Entry either.
|
||||
@@ -874,7 +873,7 @@ class WitnessPlayerLogic:
|
||||
self.PRECOMPLETED_LOCATIONS = set()
|
||||
self.EXCLUDED_LOCATIONS = set()
|
||||
self.ADDED_CHECKS = set()
|
||||
self.VICTORY_LOCATION = "0x0356B"
|
||||
self.VICTORY_LOCATION: str
|
||||
|
||||
self.ALWAYS_EVENT_NAMES_BY_HEX = {
|
||||
"0x00509": "+1 Laser (Symmetry Laser)",
|
||||
|
||||
Reference in New Issue
Block a user