Files
Archipelago/worlds/witness/presets.py
T
NewSoupVi dc911399fb The Witness: More control over progressive symbols (#3961)
* More control over progressive symbols!

* Cleanup crew

* lol

* Make it configurable how second stage items act on their own

* only let independent symbols work if they're not progressive

* revert defaults

* Better description

* comment for reviewers

* A complicated docstring for a complicated function

* More accurate

* This probably works more generically

* Actually, this would cause other issues anyway, so no need to make this generic yet

* :/

* oops

* Change the system to use collect/remove override so that plando and start inventory work correctly

* Vi stop doing that thing challenge

* Make SecondStateSymbolsActIndependently an OptionSet

* jank

* oop

* this is why we make unit tests I guess

* More unit tests

* More unit tests

* Add note about the absence of Rotated Shapers from the independent symbols optionset

* More verbose description

* More verbose description

* slight reword

* Ruff ruff :3 I am a good puppy <3

* Remove invis dots

* oops

* Remove some unused symbols

* display name

* linecounting -> discard

* Make all progressive chains always work

* Unfortunately, this optimisation is now unsafe with plando :(

* oops

* This is now a possible optimisation

* optimise optimise optimise

* optimise optimise optimise

* fix

* ruff

* oh

* fixed frfr

* mypy

* Clean up the tests a bit

* oop

* I actually like this better now, so I'm doing it as default

* Put stuff on the actual item class for faster collect/remove

* giga oops

* Make proguseful work

* None item left beef

* unnecessary change

* formatting

* add proguseful test to progressive symbols tests

* add proguseful test to progressive symbols tests

* clean up collect/remove a bit more

* giga lmfao

* Put stuff in option groups

* Add the new symbol items to hint system

* bump req client version

* fix soft conflict in unit tests

* fix more merge errors
2026-04-18 18:07:23 +02:00

136 lines
4.9 KiB
Python

from typing import Any, Dict
from .options import *
witness_option_presets: Dict[str, Dict[str, Any]] = {
# Best for beginners. This is just default options, but with a much easier goal that skips the Mountain puzzles.
"Beginner Mode": {
"victory_condition": VictoryCondition.option_mountain_box_short,
"puzzle_skip_amount": 15,
},
# Great for short syncs & scratching that "speedrun with light routing elements" itch.
"Short & Dense": {
"progression_balancing": 30,
"puzzle_randomization": PuzzleRandomization.option_sigma_normal,
"shuffle_symbols": False,
"shuffle_doors": ShuffleDoors.option_panels,
"door_groupings": DoorGroupings.option_off,
"shuffle_boat": True,
"shuffle_lasers": ShuffleLasers.option_local,
"obelisk_keys": ObeliskKeys.option_false,
"disable_non_randomized_puzzles": True,
"shuffle_discarded_panels": False,
"shuffle_vault_boxes": False,
"shuffle_EPs": ShuffleEnvironmentalPuzzles.option_off,
"EP_difficulty": EnvironmentalPuzzlesDifficulty.option_normal,
"shuffle_postgame": False,
"victory_condition": VictoryCondition.option_mountain_box_short,
"mountain_lasers": 7,
"challenge_lasers": 11,
"early_caves": EarlyCaves.option_off,
"early_good_items": {"Door / Door Panel"},
"elevators_come_to_you": ElevatorsComeToYou.default,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": PuzzleSkipAmount.default,
"trap_weights": TrapWeights.default,
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
"death_link": DeathLink.default,
"death_link_amnesty": DeathLinkAmnesty.default,
"shuffle_dog": ShuffleDog.default,
},
# For relative beginners who want to move to the next step.
"Advanced, But Chill": {
"progression_balancing": 30,
"puzzle_randomization": PuzzleRandomization.option_sigma_normal,
"shuffle_symbols": True,
"shuffle_doors": ShuffleDoors.option_doors,
"door_groupings": DoorGroupings.option_regional,
"shuffle_boat": True,
"shuffle_lasers": ShuffleLasers.option_off,
"obelisk_keys": ObeliskKeys.option_false,
"disable_non_randomized_puzzles": False,
"shuffle_discarded_panels": True,
"shuffle_vault_boxes": True,
"shuffle_EPs": ShuffleEnvironmentalPuzzles.option_obelisk_sides,
"EP_difficulty": EnvironmentalPuzzlesDifficulty.option_normal,
"shuffle_postgame": False,
"victory_condition": VictoryCondition.option_mountain_box_long,
"mountain_lasers": 6,
"challenge_lasers": 9,
"early_caves": EarlyCaves.option_off,
"early_good_items": {"Symbol", "Door / Door Panel"}, # Not Obelisk Key bc I want EPs to open slowly in this one
"elevators_come_to_you": ElevatorsComeToYou.default,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
"trap_weights": TrapWeights.default,
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
"death_link": DeathLink.default,
"death_link_amnesty": DeathLinkAmnesty.default,
"shuffle_dog": ShuffleDog.default,
},
# Allsanity but without the BS (no expert, no tedious EPs).
"Nice Allsanity": {
"progression_balancing": 50,
"puzzle_randomization": PuzzleRandomization.option_sigma_normal,
"shuffle_symbols": True,
"shuffle_doors": ShuffleDoors.option_mixed,
"door_groupings": DoorGroupings.option_off,
"shuffle_boat": True,
"shuffle_lasers": ShuffleLasers.option_anywhere,
"obelisk_keys": ObeliskKeys.option_true,
"disable_non_randomized_puzzles": False,
"shuffle_discarded_panels": True,
"shuffle_vault_boxes": True,
"shuffle_EPs": ShuffleEnvironmentalPuzzles.option_individual,
"EP_difficulty": EnvironmentalPuzzlesDifficulty.option_normal,
"shuffle_postgame": False,
"victory_condition": VictoryCondition.option_challenge,
"mountain_lasers": 6,
"challenge_lasers": 9,
"early_caves": EarlyCaves.option_off,
"early_good_items": {"Symbol", "Door / Door Panel", "Obelisk Key"},
"elevators_come_to_you": ElevatorsComeToYou.valid_keys,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
"trap_weights": TrapWeights.default,
"hint_amount": HintAmount.default,
"area_hint_percentage": AreaHintPercentage.default,
"laser_hints": LaserHints.default,
"death_link": DeathLink.default,
"death_link_amnesty": DeathLinkAmnesty.default,
"shuffle_dog": ShuffleDog.option_random_item,
},
}