The Witness: Local Laser Shuffle + Option Presets (#2590)

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
NewSoupVi 2024-01-16 15:14:06 +01:00 committed by GitHub
parent e6f7ed5060
commit 5c7bae7940
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 131 additions and 9 deletions

View File

@ -28,11 +28,14 @@ class ShuffleSymbols(DefaultOnToggle):
display_name = "Shuffle Symbols"
class ShuffleLasers(Toggle):
class ShuffleLasers(Choice):
"""If on, the 11 lasers are turned into items and will activate on their own upon receiving them.
Note: There is a visual bug that can occur with the Desert Laser. It does not affect gameplay - The Laser can still
be redirected as normal, for both applications of redirection."""
display_name = "Shuffle Lasers"
option_off = 0
option_local = 1
option_anywhere = 2
class ShuffleDoors(Choice):

View File

@ -6,6 +6,7 @@ from typing import Dict, Optional
from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, CollectionState
from Options import PerGameCommonOptions, Toggle
from .presets import witness_option_presets
from .hints import get_always_hint_locations, get_always_hint_items, get_priority_hint_locations, \
get_priority_hint_items, make_hints, generate_joke_hints
from worlds.AutoWorld import World, WebWorld
@ -31,6 +32,8 @@ class WitnessWebWorld(WebWorld):
["NewSoupVi", "Jarno"]
)]
options_presets = witness_option_presets
class WitnessWorld(World):
"""
@ -102,14 +105,29 @@ class WitnessWorld(World):
self.log_ids_to_hints = dict()
if not (self.options.shuffle_symbols or self.options.shuffle_doors or self.options.shuffle_lasers):
if self.multiworld.players == 1:
interacts_with_multiworld = (
self.options.shuffle_symbols or
self.options.shuffle_doors or
self.options.shuffle_lasers == "anywhere"
)
has_progression = (
interacts_with_multiworld
or self.options.shuffle_lasers == "local"
or self.options.shuffle_boat
or self.options.early_caves == "add_to_pool"
)
if not has_progression and self.multiworld.players == 1:
warning(f"{self.multiworld.get_player_name(self.player)}'s Witness world doesn't have any progression"
f" items. Please turn on Symbol Shuffle, Door Shuffle or Laser Shuffle if that doesn't"
f" seem right.")
else:
raise Exception(f"{self.multiworld.get_player_name(self.player)}'s Witness world doesn't have any"
f" progression items. Please turn on Symbol Shuffle, Door Shuffle or Laser Shuffle.")
f" items. Please turn on Symbol Shuffle, Door Shuffle or Laser Shuffle if that doesn't seem right.")
elif not interacts_with_multiworld and self.multiworld.players > 1:
raise Exception(f"{self.multiworld.get_player_name(self.player)}'s Witness world doesn't have enough"
f" progression items that can be placed in other players' worlds. Please turn on Symbol"
f" Shuffle, Door Shuffle or non-local Laser Shuffle.")
if self.options.shuffle_lasers == "local":
self.options.local_items.value |= self.item_name_groups["Lasers"]
def create_regions(self):
self.regio.create_regions(self, self.player_logic)

101
worlds/witness/presets.py Normal file
View File

@ -0,0 +1,101 @@
from typing import Any, Dict
from .options import *
witness_option_presets: Dict[str, Dict[str, Any]] = {
# 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,
"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,
"elevators_come_to_you": False,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": PuzzleSkipAmount.default,
"hint_amount": HintAmount.default,
"death_link": DeathLink.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,
"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,
"elevators_come_to_you": False,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
"hint_amount": HintAmount.default,
"death_link": DeathLink.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,
"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,
"elevators_come_to_you": True,
"trap_percentage": TrapPercentage.default,
"puzzle_skip_amount": 15,
"hint_amount": HintAmount.default,
"death_link": DeathLink.default,
},
}