Core: replace Location.event with advancement property (#2871)

This commit is contained in:
Aaron Wagener
2024-04-14 13:37:48 -05:00
committed by GitHub
parent f67e8497e0
commit 842a15fd3c
35 changed files with 79 additions and 144 deletions

View File

@@ -253,10 +253,8 @@ def generate_itempool(world):
region.locations.append(loc)
multiworld.push_item(loc, item_factory('Triforce', world), False)
loc.event = True
loc.locked = True
multiworld.get_location('Ganon', player).event = True
multiworld.get_location('Ganon', player).locked = True
event_pairs = [
('Agahnim 1', 'Beat Agahnim 1'),
@@ -273,7 +271,7 @@ def generate_itempool(world):
location = multiworld.get_location(location_name, player)
event = item_factory(event_name, world)
multiworld.push_item(location, event, False)
location.event = location.locked = True
location.locked = True
# set up item pool

View File

@@ -1193,7 +1193,6 @@ def set_trock_key_rules(world, player):
item = item_factory('Small Key (Turtle Rock)', world.worlds[player])
location = world.get_location('Turtle Rock - Big Key Chest', player)
location.place_locked_item(item)
location.event = True
toss_junk_item(world, player)
if world.accessibility[player] != 'locations':

View File

@@ -10,10 +10,6 @@ class AdvData(typing.NamedTuple):
class ChecksFinderAdvancement(Location):
game: str = "ChecksFinder"
def __init__(self, player: int, name: str, address: typing.Optional[int], parent):
super().__init__(player, name, address, parent)
self.event = not address
advancement_table = {
"Tile 1": AdvData(81000, 'Board'),

View File

@@ -61,7 +61,7 @@ class DLCqworld(World):
self.precollect_coinsanity()
locations_count = len([location
for location in self.multiworld.get_locations(self.player)
if not location.event])
if not location.advancement])
items_to_exclude = [excluded_items
for excluded_items in self.multiworld.precollected_items[self.player]]

View File

@@ -10,7 +10,7 @@ def get_all_item_names(multiworld: MultiWorld) -> List[str]:
def get_all_location_names(multiworld: MultiWorld) -> List[str]:
return [location.name for location in multiworld.get_locations() if not location.event]
return [location.name for location in multiworld.get_locations() if not location.advancement]
def assert_victory_exists(tester: DLCQuestTestBase, multiworld: MultiWorld):
@@ -38,5 +38,5 @@ def assert_can_win(tester: DLCQuestTestBase, multiworld: MultiWorld):
def assert_same_number_items_locations(tester: DLCQuestTestBase, multiworld: MultiWorld):
non_event_locations = [location for location in multiworld.get_locations() if not location.event]
non_event_locations = [location for location in multiworld.get_locations() if not location.advancement]
tester.assertEqual(len(multiworld.itempool), len(non_event_locations))

View File

@@ -90,7 +90,7 @@ def exclusion_rules(multiworld: MultiWorld, player: int, exclude_locations: typi
if loc_name not in multiworld.worlds[player].location_name_to_id:
raise Exception(f"Unable to exclude location {loc_name} in player {player}'s world.") from e
else:
if not location.event:
if not location.advancement:
location.progress_type = LocationProgressType.EXCLUDED
else:
logging.warning(f"Unable to exclude location {loc_name} in player {player}'s world.")

View File

@@ -60,13 +60,11 @@ class LinksAwakeningLocation(Location):
def __init__(self, player: int, region, ladxr_item):
name = meta_to_name(ladxr_item.metadata)
self.event = ladxr_item.event is not None
if self.event:
name = ladxr_item.event
address = None
if not self.event:
if ladxr_item.event is not None:
name = ladxr_item.event
else:
address = locations_to_id[name]
super().__init__(player, name, address)
self.parent_region = region

View File

@@ -154,7 +154,7 @@ class LinksAwakeningWorld(World):
# Place RAFT, other access events
for region in regions:
for loc in region.locations:
if loc.event:
if loc.address is None:
loc.place_locked_item(self.create_event(loc.ladxr_item.event))
# Connect Windfish -> Victory

View File

@@ -9,11 +9,6 @@ from BaseClasses import Location
class MeritousLocation(Location):
game: str = "Meritous"
def __init__(self, player: int, name: str = '', address: int = None, parent=None):
super(MeritousLocation, self).__init__(player, name, address, parent)
if "Wervyn Anixil" in name or "Defeat" in name:
self.event = True
offset = 593_000

View File

@@ -44,14 +44,11 @@ class OOTLocation(Location):
self.vanilla_item = vanilla_item
if filter_tags is None:
self.filter_tags = None
else:
else:
self.filter_tags = list(filter_tags)
self.never = False # no idea what this does
self.disabled = DisableType.ENABLED
if type == 'Event':
self.event = True
@property
def dungeon(self):
return self.parent_region.dungeon

View File

@@ -717,7 +717,6 @@ class OOTWorld(World):
item = self.create_item(name, allow_arbitrary_name=True)
self.multiworld.push_item(location, item, collect=False)
location.locked = True
location.event = True
if name not in item_table:
location.internal = True
return item
@@ -842,7 +841,7 @@ class OOTWorld(World):
all_state.sweep_for_events(locations=all_locations)
reachable = self.multiworld.get_reachable_locations(all_state, self.player)
unreachable = [loc for loc in all_locations if
(loc.internal or loc.type == 'Drop') and loc.event and loc.locked and loc not in reachable]
(loc.internal or loc.type == 'Drop') and loc.address is None and loc.locked and loc not in reachable]
for loc in unreachable:
loc.parent_region.locations.remove(loc)
# Exception: Sell Big Poe is an event which is only reachable if Bottle with Big Poe is in the item pool.
@@ -972,7 +971,6 @@ class OOTWorld(World):
for location in song_locations:
location.item = None
location.locked = False
location.event = False
else:
break

View File

@@ -115,8 +115,6 @@ class Overcooked2World(World):
region,
)
location.event = is_event
if priority:
location.progress_type = LocationProgressType.PRIORITY
else:

View File

@@ -265,7 +265,6 @@ class PokemonRedBlueWorld(World):
state = sweep_from_pool(multiworld.state, progitempool + unplaced_items)
if (not item.advancement) or state.can_reach(loc, "Location", loc.player):
multiworld.push_item(loc, item, False)
loc.event = item.advancement
fill_locations.remove(loc)
break
else:

View File

@@ -197,7 +197,6 @@ def process_pokemon_locations(self):
mon = randomize_pokemon(self, original_mon, mons_list, 2, self.multiworld.random)
placed_mons[mon] += 1
location.item = self.create_item(mon)
location.event = True
location.locked = True
location.item.location = location
locations.append(location)
@@ -269,7 +268,6 @@ def process_pokemon_locations(self):
for slot in encounter_slots:
location = self.multiworld.get_location(slot.name, self.player)
location.item = self.create_item(slot.original_item)
location.event = True
location.locked = True
location.item.location = location
placed_mons[location.item.name] += 1

View File

@@ -1540,7 +1540,6 @@ def create_regions(self):
item = self.create_filler()
elif location.original_item == "Pokedex":
if self.multiworld.randomize_pokedex[self.player] == "vanilla":
location_object.event = True
event = True
item = self.create_item("Pokedex")
elif location.original_item == "Moon Stone" and self.multiworld.stonesanity[self.player]:

0
worlds/sc2wol/Regions.py Normal file
View File

View File

@@ -527,7 +527,6 @@ class SMZ3World(World):
if (loc.item.player == self.player and loc.always_allow(state, loc.item)):
loc.item.classification = ItemClassification.filler
loc.item.item.Progression = False
loc.item.location.event = False
self.unreachable.append(loc)
def get_filler_item_name(self) -> str:
@@ -573,7 +572,6 @@ class SMZ3World(World):
break
assert itemFromPool is not None, "Can't find anymore item(s) to pre fill GT"
self.multiworld.push_item(loc, itemFromPool, False)
loc.event = False
toRemove.sort(reverse = True)
for i in toRemove:
self.multiworld.itempool.pop(i)

View File

@@ -486,4 +486,3 @@ class SoELocation(Location):
super().__init__(player, name, address, parent)
# unconditional assignments favor a split dict, saving memory
self.progress_type = LocationProgressType.EXCLUDED if exclude else LocationProgressType.DEFAULT
self.event = not address

View File

@@ -92,12 +92,6 @@ def create_region(world: MultiWorld, player: int, name: str, locations=None, exi
class SpireLocation(Location):
game: str = "Slay the Spire"
def __init__(self, player: int, name: str, address=None, parent=None):
super(SpireLocation, self).__init__(player, name, address, parent)
if address is None:
self.event = True
self.locked = True
class SpireItem(Item):
game = "Slay the Spire"

View File

@@ -30,10 +30,6 @@ client_version = 0
class StardewLocation(Location):
game: str = "Stardew Valley"
def __init__(self, player: int, name: str, address: Optional[int], parent=None):
super().__init__(player, name, address, parent)
self.event = not address
class StardewItem(Item):
game: str = "Stardew Valley"
@@ -144,7 +140,7 @@ class StardewValleyWorld(World):
locations_count = len([location
for location in self.multiworld.get_locations(self.player)
if not location.event])
if location.address is not None])
created_items = create_items(self.create_item, self.delete_item, locations_count, items_to_exclude, self.options,
self.random)

View File

@@ -371,8 +371,7 @@ class TestLocationGeneration(SVTestBase):
def test_all_location_created_are_in_location_table(self):
for location in self.get_real_locations():
if not location.event:
self.assertIn(location.name, location_table)
self.assertIn(location.name, location_table)
class TestMinLocationAndMaxItem(SVTestBase):
@@ -771,11 +770,10 @@ class TestShipsanityNone(SVTestBase):
}
def test_no_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event:
with self.subTest(location.name):
self.assertFalse("Shipsanity" in location.name)
self.assertNotIn(LocationTags.SHIPSANITY, location_table[location.name].tags)
for location in self.get_real_locations():
with self.subTest(location.name):
self.assertFalse("Shipsanity" in location.name)
self.assertNotIn(LocationTags.SHIPSANITY, location_table[location.name].tags)
class TestShipsanityCrops(SVTestBase):
@@ -785,8 +783,8 @@ class TestShipsanityCrops(SVTestBase):
}
def test_only_crop_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_CROP, location_table[location.name].tags)
@@ -808,8 +806,8 @@ class TestShipsanityCropsExcludeIsland(SVTestBase):
}
def test_only_crop_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_CROP, location_table[location.name].tags)
@@ -831,8 +829,8 @@ class TestShipsanityCropsNoQiCropWithoutSpecialOrders(SVTestBase):
}
def test_only_crop_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_CROP, location_table[location.name].tags)
@@ -854,8 +852,8 @@ class TestShipsanityFish(SVTestBase):
}
def test_only_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -878,8 +876,8 @@ class TestShipsanityFishExcludeIsland(SVTestBase):
}
def test_only_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -902,8 +900,8 @@ class TestShipsanityFishExcludeQiOrders(SVTestBase):
}
def test_only_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -926,8 +924,8 @@ class TestShipsanityFullShipment(SVTestBase):
}
def test_only_full_shipment_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FULL_SHIPMENT, location_table[location.name].tags)
self.assertNotIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -953,8 +951,8 @@ class TestShipsanityFullShipmentExcludeIsland(SVTestBase):
}
def test_only_full_shipment_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FULL_SHIPMENT, location_table[location.name].tags)
self.assertNotIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -979,8 +977,8 @@ class TestShipsanityFullShipmentExcludeQiBoard(SVTestBase):
}
def test_only_full_shipment_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertIn(LocationTags.SHIPSANITY_FULL_SHIPMENT, location_table[location.name].tags)
self.assertNotIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -1006,8 +1004,8 @@ class TestShipsanityFullShipmentWithFish(SVTestBase):
}
def test_only_full_shipment_and_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertTrue(LocationTags.SHIPSANITY_FULL_SHIPMENT in location_table[location.name].tags or
LocationTags.SHIPSANITY_FISH in location_table[location.name].tags)
@@ -1041,8 +1039,8 @@ class TestShipsanityFullShipmentWithFishExcludeIsland(SVTestBase):
}
def test_only_full_shipment_and_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertTrue(LocationTags.SHIPSANITY_FULL_SHIPMENT in location_table[location.name].tags or
LocationTags.SHIPSANITY_FISH in location_table[location.name].tags)
@@ -1075,8 +1073,8 @@ class TestShipsanityFullShipmentWithFishExcludeQiBoard(SVTestBase):
}
def test_only_full_shipment_and_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
with self.subTest(location.name):
self.assertTrue(LocationTags.SHIPSANITY_FULL_SHIPMENT in location_table[location.name].tags or
LocationTags.SHIPSANITY_FISH in location_table[location.name].tags)

View File

@@ -557,8 +557,8 @@ class TestDonationLogicRandomized(SVTestBase):
railroad_item = "Railroad Boulder Removed"
swap_museum_and_bathhouse(self.multiworld, self.player)
collect_all_except(self.multiworld, railroad_item)
donation_locations = [location for location in self.multiworld.get_locations() if
not location.event and LocationTags.MUSEUM_DONATIONS in location_table[location.name].tags]
donation_locations = [location for location in self.get_real_locations() if
LocationTags.MUSEUM_DONATIONS in location_table[location.name].tags]
for donation in donation_locations:
self.assertFalse(self.world.logic.region.can_reach_location(donation.name)(self.multiworld.state))
@@ -713,10 +713,9 @@ class TestShipsanityNone(SVTestBase):
}
def test_no_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event:
self.assertFalse("Shipsanity" in location.name)
self.assertNotIn(LocationTags.SHIPSANITY, location_table[location.name].tags)
for location in self.get_real_locations():
self.assertFalse("Shipsanity" in location.name)
self.assertNotIn(LocationTags.SHIPSANITY, location_table[location.name].tags)
class TestShipsanityCrops(SVTestBase):
@@ -725,8 +724,8 @@ class TestShipsanityCrops(SVTestBase):
}
def test_only_crop_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
self.assertIn(LocationTags.SHIPSANITY_CROP, location_table[location.name].tags)
@@ -736,8 +735,8 @@ class TestShipsanityFish(SVTestBase):
}
def test_only_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
self.assertIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -747,8 +746,8 @@ class TestShipsanityFullShipment(SVTestBase):
}
def test_only_full_shipment_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
self.assertIn(LocationTags.SHIPSANITY_FULL_SHIPMENT, location_table[location.name].tags)
self.assertNotIn(LocationTags.SHIPSANITY_FISH, location_table[location.name].tags)
@@ -759,8 +758,8 @@ class TestShipsanityFullShipmentWithFish(SVTestBase):
}
def test_only_full_shipment_and_fish_shipsanity_locations(self):
for location in self.multiworld.get_locations(self.player):
if not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags:
for location in self.get_real_locations():
if LocationTags.SHIPSANITY in location_table[location.name].tags:
self.assertTrue(LocationTags.SHIPSANITY_FULL_SHIPMENT in location_table[location.name].tags or
LocationTags.SHIPSANITY_FISH in location_table[location.name].tags)
@@ -774,8 +773,8 @@ class TestShipsanityEverything(SVTestBase):
def test_all_shipsanity_locations_require_shipping_bin(self):
bin_name = "Shipping Bin"
collect_all_except(self.multiworld, bin_name)
shipsanity_locations = [location for location in self.multiworld.get_locations() if
not location.event and LocationTags.SHIPSANITY in location_table[location.name].tags]
shipsanity_locations = [location for location in self.get_real_locations() if
LocationTags.SHIPSANITY in location_table[location.name].tags]
bin_item = self.world.create_item(bin_name)
for location in shipsanity_locations:
with self.subTest(location.name):

View File

@@ -277,10 +277,10 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase):
self.multiworld.state.collect(self.world.create_item("Stardrop"), event=False)
def get_real_locations(self) -> List[Location]:
return [location for location in self.multiworld.get_locations(self.player) if not location.event]
return [location for location in self.multiworld.get_locations(self.player) if location.address is not None]
def get_real_location_names(self) -> List[str]:
return [location.name for location in self.multiworld.get_locations(self.player) if not location.event]
return [location.name for location in self.get_real_locations()]
pre_generated_worlds = {}

View File

@@ -20,7 +20,7 @@ class ModAssertMixin(TestCase):
self.assertTrue(item.mod_name is None or item.mod_name in chosen_mods,
f"Item {item.name} has is from mod {item.mod_name}. Allowed mods are {chosen_mods}.")
for multiworld_location in multiworld.get_locations():
if multiworld_location.event:
if multiworld_location.address is None:
continue
location = location_table[multiworld_location.name]
self.assertTrue(location.mod_name is None or location.mod_name in chosen_mods)

View File

@@ -13,7 +13,7 @@ def get_all_item_names(multiworld: MultiWorld) -> List[str]:
def get_all_location_names(multiworld: MultiWorld) -> List[str]:
return [location.name for location in multiworld.get_locations() if not location.event]
return [location.name for location in multiworld.get_locations() if location.address is not None]
class WorldAssertMixin(RuleAssertMixin, TestCase):
@@ -48,7 +48,7 @@ class WorldAssertMixin(RuleAssertMixin, TestCase):
self.assert_can_reach_victory(multiworld)
def assert_same_number_items_locations(self, multiworld: MultiWorld):
non_event_locations = [location for location in multiworld.get_locations() if not location.event]
non_event_locations = [location for location in multiworld.get_locations() if location.address is not None]
self.assertEqual(len(multiworld.itempool), len(non_event_locations))
def assert_can_reach_everything(self, multiworld: MultiWorld):

View File

@@ -206,7 +206,6 @@ def create_location(player: int, location_data: LocationData, region: Region) ->
location.access_rule = location_data.rule
if id is None:
location.event = True
location.locked = True
return location

View File

@@ -116,7 +116,6 @@ class TLoZWorld(World):
def create_location(self, name, id, parent, event=False):
return_location = TLoZLocation(self.player, name, id, parent)
return_location.event = event
return return_location
def create_regions(self):

View File

@@ -10,10 +10,6 @@ class AdvData(typing.NamedTuple):
class UndertaleAdvancement(Location):
game: str = "Undertale"
def __init__(self, player: int, name: str, address: typing.Optional[int], parent):
super().__init__(player, name, address, parent)
self.event = not address
advancement_table = {
"Snowman": AdvData(79100, "Snowdin Forest"),

View File

@@ -131,12 +131,6 @@ def create_region(world: MultiWorld, player: int, name: str, locations=None, exi
class WargrooveLocation(Location):
game: str = "Wargroove"
def __init__(self, player: int, name: str, address=None, parent=None):
super(WargrooveLocation, self).__init__(player, name, address, parent)
if address is None:
self.event = True
self.locked = True
class WargrooveItem(Item):
game = "Wargroove"

View File

@@ -109,9 +109,7 @@ class ZorkGrandInquisitorWorld(World):
region_mapping[data.region],
)
location.event = isinstance(location_enum_item, ZorkGrandInquisitorEvents)
if location.event:
if isinstance(location_enum_item, ZorkGrandInquisitorEvents):
location.place_locked_item(
ZorkGrandInquisitorItem(
data.event_item_name,