mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
* Add panel hunt options * Make sure all panels are either solvable or disabled in panel hunt * Pick huntable panels * Discards in disable non randomized * Set up panel hunt requirement * Panel hunt functional * Make it so an event can have multiple names * Panel hunt with events * Add hunt entities to slot data * ruff * add to hint data, no client sneding yet * encode panel hunt amount in compact hint data * Remove print statement * my b * consistent * meh * additions for lcient * Nah * Victory panels ineligible for panel hunt * Panel Hunt Postgame option * cleanup * Add data generation file * pull out set * always disable gate ep in panel hunt * Disallow certain challenge panels from being panel hunt panels * Make panelhuntpostgame its own function, so it can be called even if normal postgame is enabled * disallow PP resets from panel hunt * Disable challenge timer and elevetor start respectively in disable hunt postgame * Fix panelhunt postgame * lol * When you test that the bug is fixed but not that the non-bug is not unfixed * Prevent Obelisks from being panel hunt panels * Make picking panels for panel hunt a bit more sophisticated, if less random * Better function maybe ig * Ok maybe that was a bit too much * Give advanced players some control over panel hunt * lint * correct the logic for amount to pick * decided the jingle thing was dumb, I'll figure sth out client side. Same area discouragement is now a configurable factor, and the logic has been significantly rewritten * comment * Make the option visible * Safety * Change assert slightly * We do a little logging * number tweak & we do a lil logging * we do a little more logging * Ruff * Panel Hunt Option Group * Idk how that got here * Update worlds/witness/options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Update worlds/witness/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * remove merge error * Update worlds/witness/player_logic.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * True * Don't have underwater sliding bridge when you have above water sliding bridge * These are not actually connected lol * get rid of unnecessary variable * Refactor compact hint function again * lint * Pull out Entity Hunt Picking into its own class, split it into many functions. Kept a lot of the comments tho * forgot to actually add the new file * some more refactoring & docstrings * consistent naming * flip elif change * Comment about naming * Make static eligible panels a constant I can refer back to * slight formatting change * pull out options-based eligibility into its own function * better text and stuff * lint * this is not necessary * capitalisation * Fix same area discouragement 0 * Simplify data file generation * Simplify data file generation * prevent div 0 * Add Vault Boxes -> Vault Panels to replacements * Update options.py * Update worlds/witness/entity_hunt.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Update entity_hunt.py * Fix some events not working * assert * remove now unused function * lint * Lasers Activate, Lasers don't Solve * lint * oops * mypy * lint * Add simple panel hunt unit test * Add Panel Hunt Tests * Add more Panel Hunt Tests * Disallow Box Short for normal panel hunt --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
81 lines
3.3 KiB
Python
81 lines
3.3 KiB
Python
"""
|
|
Defines constants for different types of locations in the game
|
|
"""
|
|
from typing import TYPE_CHECKING
|
|
|
|
from .data import static_locations as static_witness_locations
|
|
from .data import static_logic as static_witness_logic
|
|
from .player_logic import WitnessPlayerLogic
|
|
|
|
if TYPE_CHECKING:
|
|
from . import WitnessWorld
|
|
|
|
|
|
class WitnessPlayerLocations:
|
|
"""
|
|
Class that defines locations for a single player
|
|
"""
|
|
|
|
def __init__(self, world: "WitnessWorld", player_logic: WitnessPlayerLogic) -> None:
|
|
"""Defines locations AFTER logic changes due to options"""
|
|
|
|
self.PANEL_TYPES_TO_SHUFFLE = {"General", "Laser"}
|
|
self.CHECK_LOCATIONS = static_witness_locations.GENERAL_LOCATIONS.copy()
|
|
|
|
if world.options.shuffle_discarded_panels:
|
|
self.PANEL_TYPES_TO_SHUFFLE.add("Discard")
|
|
|
|
if world.options.shuffle_vault_boxes:
|
|
self.PANEL_TYPES_TO_SHUFFLE.add("Vault")
|
|
|
|
if world.options.shuffle_EPs == "individual":
|
|
self.PANEL_TYPES_TO_SHUFFLE.add("EP")
|
|
elif world.options.shuffle_EPs == "obelisk_sides":
|
|
self.PANEL_TYPES_TO_SHUFFLE.add("Obelisk Side")
|
|
|
|
for obelisk_loc in static_witness_locations.OBELISK_SIDES:
|
|
obelisk_loc_hex = static_witness_logic.ENTITIES_BY_NAME[obelisk_loc]["entity_hex"]
|
|
if player_logic.REQUIREMENTS_BY_HEX[obelisk_loc_hex] == frozenset({frozenset()}):
|
|
self.CHECK_LOCATIONS.discard(obelisk_loc)
|
|
|
|
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | player_logic.ADDED_CHECKS
|
|
|
|
self.CHECK_LOCATIONS.discard(static_witness_logic.ENTITIES_BY_HEX[player_logic.VICTORY_LOCATION]["checkName"])
|
|
|
|
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
|
|
static_witness_logic.ENTITIES_BY_HEX[entity_hex]["checkName"]
|
|
for entity_hex in player_logic.COMPLETELY_DISABLED_ENTITIES | player_logic.PRECOMPLETED_LOCATIONS
|
|
}
|
|
|
|
self.CHECK_PANELHEX_TO_ID = {
|
|
static_witness_logic.ENTITIES_BY_NAME[ch]["entity_hex"]: static_witness_locations.ALL_LOCATIONS_TO_ID[ch]
|
|
for ch in self.CHECK_LOCATIONS
|
|
if static_witness_logic.ENTITIES_BY_NAME[ch]["locationType"] in self.PANEL_TYPES_TO_SHUFFLE
|
|
}
|
|
|
|
dog_hex = static_witness_logic.ENTITIES_BY_NAME["Town Pet the Dog"]["entity_hex"]
|
|
dog_id = static_witness_locations.ALL_LOCATIONS_TO_ID["Town Pet the Dog"]
|
|
self.CHECK_PANELHEX_TO_ID[dog_hex] = dog_id
|
|
|
|
self.CHECK_PANELHEX_TO_ID = dict(
|
|
sorted(self.CHECK_PANELHEX_TO_ID.items(), key=lambda item: item[1])
|
|
)
|
|
|
|
self.EVENT_LOCATION_TABLE = {
|
|
event_location: None
|
|
for event_location in player_logic.EVENT_ITEM_PAIRS
|
|
}
|
|
|
|
check_dict = {
|
|
static_witness_logic.ENTITIES_BY_HEX[location]["checkName"]:
|
|
static_witness_locations.get_id(static_witness_logic.ENTITIES_BY_HEX[location]["entity_hex"])
|
|
for location in self.CHECK_PANELHEX_TO_ID
|
|
}
|
|
|
|
self.CHECK_LOCATION_TABLE = {**self.EVENT_LOCATION_TABLE, **check_dict}
|
|
|
|
def add_location_late(self, entity_name: str) -> None:
|
|
entity_hex = static_witness_logic.ENTITIES_BY_NAME[entity_name]["entity_hex"]
|
|
self.CHECK_LOCATION_TABLE[entity_hex] = static_witness_locations.get_id(entity_hex)
|
|
self.CHECK_PANELHEX_TO_ID[entity_hex] = static_witness_locations.get_id(entity_hex)
|