mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-26 05:23:21 -07:00
* initial work on procedure patch
* more flexibility
load default procedure for version 5 patches
add args for procedure
add default extension for tokens and bsdiff
allow specifying additional required extensions for generation
* pushing current changes to go fix tloz bug
* move tokens into a separate inheritable class
* forgot the commit to remove token from ProcedurePatch
* further cleaning from bad commit
* start on docstrings
* further work on docstrings and typing
* improve docstrings
* fix incorrect docstring
* cleanup
* clean defaults and docstring
* define interface that has only the bare minimum required
for `Patch.create_rom_file`
* change to dictionary.get
* remove unnecessary if statement
* update to explicitly check for procedure, restore compatible version and manual override
* Update Files.py
* remove struct uses
* Update Rom.py
* convert KDL3 to APPP
* change class variables to instance variables
* Update worlds/Files.py
Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
* Update worlds/Files.py
Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
* move required_extensions to tuple
* fix missing tuple ellipsis
* fix classvar mixup
* rename tokens to _tokens. use hasattr
* type hint cleanup
* Update Files.py
* initial base for local items, need to finish
* coo not clean
* handle local items for real, appp cleanup
* actually make bosses send their locations
* fix cloudy park 4 rule, zero deathlink message
* remove redundant door_shuffle bool
when generic ER gets in, this whole function gets rewritten. So just clean it a little now.
* properly fix deathlink messages, fix fill error
* update docs
* add prefill items
* fix kine fill error
* Update Rom.py
* Update Files.py
* mypy and softlock fix
* Update Gifting.py
* mypy phase 1
* fix rare async client bug
* Update __init__.py
* typing cleanup
* fix stone softlock
because of the way Kine's Stone works, you can't clear the stone blocks before clearing the burning blocks, so we have to bring Burning from outside
* Update Rom.py
* Add option groups
* Rename to lowercase
* finish rename
* whoops broke the world
* fix animal duplication bug
* overhaul filler generation
* add Miku flavor
* Update gifting.py
* fix issues related to max_hs increase
* Update test_locations.py
* fix boss shuffle not working if level shuffle is disabled
* fix bleeding default levels
* Update options.py
* thought this would print seed
* yay bad merges
* forgot options too
* yeah lets just break generation while at it
* this is probably a problem
* cap required heart stars
* Revert "cap required heart stars"
This reverts commit 759efd3e2b.
* fix duplication removal placement, deprecated test option
* forgot that we need to account for what we place
* move location ids
* rewrite trap handling
* further stage renumber fixes
* forgot one more
* basic UT support
* fix local heart star checks
* fix pattern
---------
Co-authored-by: beauxq <beauxq@yahoo.com>
Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
68 lines
3.7 KiB
Python
68 lines
3.7 KiB
Python
from . import KDL3TestBase
|
|
from ..names import location_name
|
|
from Options import PlandoConnection
|
|
import typing
|
|
|
|
|
|
class TestLocations(KDL3TestBase):
|
|
options = {
|
|
"open_world": True,
|
|
"ow_boss_requirement": 1,
|
|
"strict_bosses": False
|
|
# these ensure we can always reach all stages physically
|
|
}
|
|
|
|
def test_simple_heart_stars(self) -> None:
|
|
self.run_location_test(location_name.grass_land_muchi, ["ChuChu"])
|
|
self.run_location_test(location_name.grass_land_chao, ["Stone"])
|
|
self.run_location_test(location_name.grass_land_mine, ["Kine"])
|
|
self.run_location_test(location_name.ripple_field_kamuribana, ["Pitch", "Clean"])
|
|
self.run_location_test(location_name.ripple_field_bakasa, ["Kine", "Parasol"])
|
|
self.run_location_test(location_name.ripple_field_toad, ["Needle"])
|
|
self.run_location_test(location_name.ripple_field_mama_pitch, ["Pitch", "Kine", "Burning", "Stone"])
|
|
self.run_location_test(location_name.sand_canyon_auntie, ["Clean"])
|
|
self.run_location_test(location_name.sand_canyon_nyupun, ["ChuChu", "Cutter"])
|
|
self.run_location_test(location_name.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Spark", "Ice"])
|
|
self.run_location_test(location_name.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Clean", "Ice"])
|
|
self.run_location_test(location_name.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Spark", "Needle"])
|
|
self.run_location_test(location_name.sand_canyon_rob, ["Stone", "Kine", "Coo", "Parasol", "Clean", "Needle"])
|
|
self.run_location_test(location_name.cloudy_park_hibanamodoki, ["Coo", "Clean"])
|
|
self.run_location_test(location_name.cloudy_park_piyokeko, ["Needle"])
|
|
self.run_location_test(location_name.cloudy_park_mikarin, ["Coo"])
|
|
self.run_location_test(location_name.cloudy_park_pick, ["Rick"])
|
|
self.run_location_test(location_name.iceberg_kogoesou, ["Burning"])
|
|
self.run_location_test(location_name.iceberg_samus, ["Ice"])
|
|
self.run_location_test(location_name.iceberg_name, ["Burning", "Coo", "ChuChu"])
|
|
self.run_location_test(location_name.iceberg_angel, ["Cutter", "Burning", "Spark", "Parasol", "Needle", "Clean",
|
|
"Stone", "Ice"])
|
|
|
|
def run_location_test(self, location: str, itempool: typing.List[str]) -> None:
|
|
items = itempool.copy()
|
|
while len(itempool) > 0:
|
|
self.assertFalse(self.can_reach_location(location), str(self.multiworld.seed))
|
|
self.collect_by_name(itempool.pop())
|
|
self.assertTrue(self.can_reach_location(location), str(self.multiworld.seed))
|
|
self.remove(self.get_items_by_name(items))
|
|
|
|
|
|
class TestShiro(KDL3TestBase):
|
|
options = {
|
|
"open_world": False,
|
|
"plando_connections": [
|
|
PlandoConnection("Grass Land 1", "Iceberg 5", "both"),
|
|
PlandoConnection("Grass Land 2", "Ripple Field 5", "both"),
|
|
PlandoConnection("Grass Land 3", "Grass Land 1", "both")
|
|
],
|
|
"stage_shuffle": "shuffled",
|
|
"plando_options": "connections"
|
|
}
|
|
|
|
def test_shiro(self) -> None:
|
|
self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed))
|
|
self.collect_by_name("Nago")
|
|
self.assertFalse(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed))
|
|
# despite Shiro only requiring Nago for logic, it cannot be in logic because our two accessible stages
|
|
# do not actually give the player access to Nago, thus we need Kine to pass 2-5
|
|
self.collect_by_name("Kine")
|
|
self.assertTrue(self.can_reach_location("Iceberg 5 - Shiro"), str(self.multiworld.seed))
|