mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00

* map option objects to a `World.options` dict * convert RoR2 to options dict system for testing * add temp behavior for lttp with notes * copy/paste bad * convert `set_default_common_options` to a namespace property * reorganize test call order * have fill_restrictive use the new options system * update world api * update soe tests * fix world api * core: auto initialize a dataclass on the World class with the option results * core: auto initialize a dataclass on the World class with the option results: small tying improvement * add `as_dict` method to the options dataclass * fix namespace issues with tests * have current option updates use `.value` instead of changing the option * update ror2 to use the new options system again * revert the junk pool dict since it's cased differently * fix begin_with_loop typo * write new and old options to spoiler * change factorio option behavior back * fix comparisons * move common and per_game_common options to new system * core: automatically create missing options_dataclass from legacy option_definitions * remove spoiler special casing and add back the Factorio option changing but in new system * give ArchipIDLE the default options_dataclass so its options get generated and spoilered properly * reimplement `inspect.get_annotations` * move option info generation for webhost to new system * need to include Common and PerGame common since __annotations__ doesn't include super * use get_type_hints for the options dictionary * typing.get_type_hints returns the bases too. * forgot to sweep through generate * sweep through all the tests * swap to a metaclass property * move remaining usages from get_type_hints to metaclass property * move remaining usages from __annotations__ to metaclass property * move remaining usages from legacy dictionaries to metaclass property * remove legacy dictionaries * cache the metaclass property * clarify inheritance in world api * move the messenger to new options system * add an assert for my dumb * update the doc * rename o to options * missed a spot * update new messenger options * comment spacing Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * fix tests * fix missing import * make the documentation definition more accurate * use options system for loc creation * type cast MessengerWorld * fix typo and use quotes for cast * LTTP: set random seed in tests * ArchipIdle: remove change here as it's default on AutoWorld * Stardew: Need to set state because `set_default_common_options` used to * The Messenger: update shop rando and helpers to new system; optimize imports * Add a kwarg to `as_dict` to do the casing for you * RoR2: use new kwarg for less code * RoR2: revert some accidental reverts * The Messenger: remove an unnecessary variable * remove TypeVar that isn't used * CommonOptions not abstract * Docs: fix mistake in options api.md Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * create options for item link worlds * revert accidental doc removals * Item Links: set default options on group * Messenger: Limited Movement option first draft * The Messenger: add automated setup through the launcher * drop tomllib * don't uselessly import launcher * The Messenger: fix missing goal requirement for power seal hunt * make hard mode goal harder * make fire seal a bit more lenient * have limited movement force minimal accessibility * add an early meditation option * clean up precollected notes tests a bit * add linux support * add steam deck support * await monokickstart * minor styling cleanup * more minor styling cleanup * Initial implementation of Generic ER * Move ERType to Entrance.Type, fix typing imports * updates based on testing (read: flailing) * Updates from feedback * Various bug fixes in ERCollectionState * Use deque instead of queue.Queue * Allow partial entrances in collection state earlier, doc improvements * Prevent early loops in region graph, improve reusability of ER stage code * Typos, grammar, PEP8, and style "fixes" * use RuntimeError instead of bare Exceptions * return tuples from connect since it's slightly faster for our purposes * move the shuffle to the beginning of find_pairing * do er_state placements within pairing lookups to remove code duplication * requested adjustments * Add some temporary performance logging * Use CollectionState to track available exits and placed regions * remove seal shuffle option * some cleanup stuff * portal rando progress * pre-emptive region creation * seals need to be in the datapackage * put mega shards in old order * fix typos and make it actually work * fix more missed connections and add portal events * fix all the portal rando code * finish initial logic implementation * remove/comment out debug stuff * does not actually support plando yet * typos and fix a crash when 3 available portals was selected * finish initial logic for all connections and remove/rename as necessary * fix typos and add some more leniency * move item classification determination to its own method rather than split between two spots * super complicated solution for handling installing the alpha builds * fix logic bugs and add a test * implement logic to shuffle the cutscene portals even though it's probably not possible * just use the one list * fix some issues with the mod checking/downloading * Core: have webhost slot name links go through the launcher so that components can use them * add uri support to the launcher component function * generate output file under specific conditions * cleanup connections.py * set topology_present to true when portals are shuffled * add requirement for ghost pit loc since it's pretty hard without movement * bring hard logic back * misc cleanup * fix asset grabbing of latest version * implement ER * just use the entrances for the spoiler instead of manipulating the cache * remove test defaults * remove excessive comprehension * cleanup and cater data for the client * add elemental skylands to the shuffle pools * initial attempts at hint text * use network items for offline seeds * change around the offline seed data again * move er after portal shuffle and ensure a minimal sphere 1 * Add a method to automatically disconnect entrances in a coupled-compliant way Update docs and cleanup todos * Make find_placeable_exits deterministic by sorting blocked_connections set * add more ER transitions * fix spoiler output of portal warps * add path to hint_data * rename entrance to tot to be a bit clearer * cleanup imports and update description for hard logic * cleanup for PR to main * missed a spot * cleanup monokickstart * add location_name_groups * update docs for new setup * client can reconnect on its own now, no need for a button. * fix mod download link grabbing the wrong assets * cleanup mod pulling a bit and display version it's trying to update to * plando support * comment out broken steam deck support * supports plando * satisfy flake for currently unused file * fix the items accessibility test * review comments * add searing crags portal to starting portals when disabled like option says * address sliver comments * rip out currently unused transition shuffle * add aerobatics warrior requirement to fire seal --------- Co-authored-by: el-u <109771707+el-u@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@yahoo.com> Co-authored-by: Sean Dempsey <dempsey.sean@outlook.com> Co-authored-by: qwint <qwint.42@gmail.com>
202 lines
6.6 KiB
Python
202 lines
6.6 KiB
Python
from dataclasses import dataclass
|
|
from typing import Dict
|
|
|
|
from schema import And, Optional, Or, Schema
|
|
|
|
from Options import Accessibility, Choice, DeathLinkMixin, DefaultOnToggle, OptionDict, PerGameCommonOptions, Range, \
|
|
StartInventoryPool, Toggle
|
|
|
|
|
|
class MessengerAccessibility(Accessibility):
|
|
default = Accessibility.option_locations
|
|
# defaulting to locations accessibility since items makes certain items self-locking
|
|
__doc__ = Accessibility.__doc__.replace(f"default {Accessibility.default}", f"default {default}")
|
|
|
|
|
|
class Logic(Choice):
|
|
"""
|
|
The level of logic to use when determining what locations in your world are accessible.
|
|
|
|
Normal: Can require damage boosts, but otherwise approachable for someone who has beaten the game.
|
|
Hard: Expects more knowledge and tighter execution. Has leashing, normal clips and much tighter d-boosting in logic.
|
|
"""
|
|
display_name = "Logic Level"
|
|
option_normal = 0
|
|
option_hard = 1
|
|
alias_oob = 1
|
|
alias_challenging = 1
|
|
|
|
|
|
class MegaShards(Toggle):
|
|
"""Whether mega shards should be item locations."""
|
|
display_name = "Shuffle Mega Time Shards"
|
|
|
|
|
|
class LimitedMovement(Toggle):
|
|
"""
|
|
Removes either rope dart or wingsuit from the itempool. Forces logic to at least hard and accessibility to minimal.
|
|
"""
|
|
display_name = "Limited Movement"
|
|
|
|
|
|
class EarlyMed(Toggle):
|
|
"""Guarantees meditation will be found early"""
|
|
display_name = "Early Meditation"
|
|
|
|
|
|
class AvailablePortals(Range):
|
|
"""Number of portals that are available from the start. Autumn Hills, Howling Grotto, and Glacial Peak are always available. If portal outputs are not randomized, Searing Crags will also be available."""
|
|
display_name = "Available Starting Portals"
|
|
range_start = 3
|
|
range_end = 6
|
|
default = 6
|
|
|
|
|
|
class ShufflePortals(Choice):
|
|
"""
|
|
Whether the portals lead to random places.
|
|
Entering a portal from its vanilla area will always lead to HQ, and will unlock it if relevant.
|
|
Supports plando.
|
|
|
|
None: Portals will take you where they're supposed to.
|
|
Shops: Portals can lead to any area except Music Box and Elemental Skylands, with each portal output guaranteed to not overlap with another portal's. Will only put you at a portal or a shop.
|
|
Checkpoints: Like Shops except checkpoints without shops are also valid drop points.
|
|
Anywhere: Like Checkpoints except it's possible for multiple portals to output to the same map.
|
|
"""
|
|
display_name = "Shuffle Portal Outputs"
|
|
option_none = 0
|
|
alias_off = 0
|
|
option_shops = 1
|
|
option_checkpoints = 2
|
|
option_anywhere = 3
|
|
|
|
|
|
class ShuffleTransitions(Choice):
|
|
"""
|
|
Whether the transitions between the levels should be randomized.
|
|
Supports plando.
|
|
|
|
None: Level transitions lead where they should.
|
|
Coupled: Returning through a transition will take you from whence you came.
|
|
Decoupled: Any level transition can take you to any other level transition.
|
|
"""
|
|
display_name = "Shuffle Level Transitions"
|
|
option_none = 0
|
|
alias_off = 0
|
|
option_coupled = 1
|
|
option_decoupled = 2
|
|
|
|
|
|
class Goal(Choice):
|
|
"""Requirement to finish the game."""
|
|
display_name = "Goal"
|
|
option_open_music_box = 0
|
|
option_power_seal_hunt = 1
|
|
|
|
|
|
class MusicBox(DefaultOnToggle):
|
|
"""Whether the music box gauntlet needs to be done."""
|
|
display_name = "Music Box Gauntlet"
|
|
|
|
|
|
class NotesNeeded(Range):
|
|
"""How many notes are needed to access the Music Box."""
|
|
display_name = "Notes Needed"
|
|
range_start = 1
|
|
range_end = 6
|
|
default = range_end
|
|
|
|
|
|
class AmountSeals(Range):
|
|
"""Number of power seals that exist in the item pool when power seal hunt is the goal."""
|
|
display_name = "Total Power Seals"
|
|
range_start = 1
|
|
range_end = 85
|
|
default = 45
|
|
|
|
|
|
class RequiredSeals(Range):
|
|
"""Percentage of total seals required to open the shop chest."""
|
|
display_name = "Percent Seals Required"
|
|
range_start = 10
|
|
range_end = 100
|
|
default = range_end
|
|
|
|
|
|
class ShopPrices(Range):
|
|
"""Percentage modifier for shuffled item prices in shops"""
|
|
display_name = "Shop Prices Modifier"
|
|
range_start = 25
|
|
range_end = 400
|
|
default = 100
|
|
|
|
|
|
def planned_price(location: str) -> Dict[Optional, Or]:
|
|
return {
|
|
Optional(location): Or(
|
|
And(int, lambda n: n >= 0),
|
|
{
|
|
Optional(And(int, lambda n: n >= 0)): And(int, lambda n: n >= 0)
|
|
}
|
|
)
|
|
}
|
|
|
|
|
|
class PlannedShopPrices(OptionDict):
|
|
"""Plan specific prices on shop slots. Supports weighting"""
|
|
display_name = "Shop Price Plando"
|
|
schema = Schema({
|
|
**planned_price("Karuta Plates"),
|
|
**planned_price("Serendipitous Bodies"),
|
|
**planned_price("Path of Resilience"),
|
|
**planned_price("Kusari Jacket"),
|
|
**planned_price("Energy Shuriken"),
|
|
**planned_price("Serendipitous Minds"),
|
|
**planned_price("Prepared Mind"),
|
|
**planned_price("Meditation"),
|
|
**planned_price("Rejuvenative Spirit"),
|
|
**planned_price("Centered Mind"),
|
|
**planned_price("Strike of the Ninja"),
|
|
**planned_price("Second Wind"),
|
|
**planned_price("Currents Master"),
|
|
**planned_price("Aerobatics Warrior"),
|
|
**planned_price("Demon's Bane"),
|
|
**planned_price("Devil's Due"),
|
|
**planned_price("Time Sense"),
|
|
**planned_price("Power Sense"),
|
|
**planned_price("Focused Power Sense"),
|
|
**planned_price("Green Kappa Figurine"),
|
|
**planned_price("Blue Kappa Figurine"),
|
|
**planned_price("Ountarde Figurine"),
|
|
**planned_price("Red Kappa Figurine"),
|
|
**planned_price("Demon King Figurine"),
|
|
**planned_price("Quillshroom Figurine"),
|
|
**planned_price("Jumping Quillshroom Figurine"),
|
|
**planned_price("Scurubu Figurine"),
|
|
**planned_price("Jumping Scurubu Figurine"),
|
|
**planned_price("Wallaxer Figurine"),
|
|
**planned_price("Barmath'azel Figurine"),
|
|
**planned_price("Queen of Quills Figurine"),
|
|
**planned_price("Demon Hive Figurine"),
|
|
})
|
|
|
|
|
|
@dataclass
|
|
class MessengerOptions(DeathLinkMixin, PerGameCommonOptions):
|
|
accessibility: MessengerAccessibility
|
|
start_inventory: StartInventoryPool
|
|
logic_level: Logic
|
|
shuffle_shards: MegaShards
|
|
limited_movement: LimitedMovement
|
|
early_meditation: EarlyMed
|
|
available_portals: AvailablePortals
|
|
shuffle_portals: ShufflePortals
|
|
# shuffle_transitions: ShuffleTransitions
|
|
goal: Goal
|
|
music_box: MusicBox
|
|
notes_needed: NotesNeeded
|
|
total_seals: AmountSeals
|
|
percent_seals_required: RequiredSeals
|
|
shop_price: ShopPrices
|
|
shop_price_plan: PlannedShopPrices
|