Witness: More bug fixes (#937)
* Fixed disable_non_randomized and other bugs * Slight performance & code sensibility increase * Added River Shortcut to Garden as a disabled check in disable_non_randomized * Changed no progression items exception to a warning * Added a list of disabled panels to slot_data for disable_non_randomized, so the client can automatically disable the right panels in the future * Made no progression exception conditional on playercount
This commit is contained in:
parent
a4a8894d22
commit
9553627136
|
@ -13,6 +13,7 @@ from .rules import set_rules
|
||||||
from .regions import WitnessRegions
|
from .regions import WitnessRegions
|
||||||
from .Options import is_option_enabled, the_witness_options, get_option_value
|
from .Options import is_option_enabled, the_witness_options, get_option_value
|
||||||
from .utils import best_junk_to_add_based_on_weights
|
from .utils import best_junk_to_add_based_on_weights
|
||||||
|
from logging import warning
|
||||||
|
|
||||||
|
|
||||||
class WitnessWebWorld(WebWorld):
|
class WitnessWebWorld(WebWorld):
|
||||||
|
@ -56,15 +57,20 @@ class WitnessWorld(World):
|
||||||
'panelhex_to_id': self.locat.CHECK_PANELHEX_TO_ID,
|
'panelhex_to_id': self.locat.CHECK_PANELHEX_TO_ID,
|
||||||
'item_id_to_door_hexes': self.items.ITEM_ID_TO_DOOR_HEX,
|
'item_id_to_door_hexes': self.items.ITEM_ID_TO_DOOR_HEX,
|
||||||
'door_hexes': self.items.DOORS,
|
'door_hexes': self.items.DOORS,
|
||||||
'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME
|
'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME,
|
||||||
|
'disabled_panels': self.player_logic.COMPLETELY_DISABLED_CHECKS,
|
||||||
}
|
}
|
||||||
|
|
||||||
def generate_early(self):
|
def generate_early(self):
|
||||||
if not (is_option_enabled(self.world, self.player, "shuffle_symbols")
|
if not (is_option_enabled(self.world, self.player, "shuffle_symbols")
|
||||||
or get_option_value(self.world, self.player, "shuffle_doors")
|
or get_option_value(self.world, self.player, "shuffle_doors")
|
||||||
or is_option_enabled(self.world, self.player, "shuffle_lasers")):
|
or is_option_enabled(self.world, self.player, "shuffle_lasers")):
|
||||||
raise Exception("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle, Door"
|
if self.world.players == 1:
|
||||||
" Shuffle or Laser Shuffle")
|
warning("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle, Door"
|
||||||
|
" Shuffle or Laser Shuffle if that doesn't seem right.")
|
||||||
|
else:
|
||||||
|
raise Exception("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle,"
|
||||||
|
" Door Shuffle or Laser Shuffle.")
|
||||||
|
|
||||||
self.player_logic = WitnessPlayerLogic(self.world, self.player)
|
self.player_logic = WitnessPlayerLogic(self.world, self.player)
|
||||||
self.locat = WitnessPlayerLocations(self.world, self.player, self.player_logic)
|
self.locat = WitnessPlayerLocations(self.world, self.player, self.player_logic)
|
||||||
|
|
|
@ -277,6 +277,8 @@ class WitnessPlayerLocations:
|
||||||
if not is_option_enabled(world, player, "shuffle_postgame"):
|
if not is_option_enabled(world, player, "shuffle_postgame"):
|
||||||
self.CHECK_LOCATIONS -= postgame
|
self.CHECK_LOCATIONS -= postgame
|
||||||
|
|
||||||
|
self.CHECK_LOCATIONS.discard(StaticWitnessLogic.CHECKS_BY_HEX[player_logic.VICTORY_LOCATION]["checkName"])
|
||||||
|
|
||||||
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
|
self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
|
||||||
StaticWitnessLogic.CHECKS_BY_HEX[check_hex]["checkName"]
|
StaticWitnessLogic.CHECKS_BY_HEX[check_hex]["checkName"]
|
||||||
for check_hex in player_logic.COMPLETELY_DISABLED_CHECKS
|
for check_hex in player_logic.COMPLETELY_DISABLED_CHECKS
|
||||||
|
|
|
@ -36,6 +36,9 @@ class WitnessPlayerLogic:
|
||||||
Panels outside of the same region will still be checked manually.
|
Panels outside of the same region will still be checked manually.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if panel_hex in self.COMPLETELY_DISABLED_CHECKS:
|
||||||
|
return frozenset()
|
||||||
|
|
||||||
check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]
|
check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]
|
||||||
|
|
||||||
these_items = frozenset({frozenset()})
|
these_items = frozenset({frozenset()})
|
||||||
|
@ -72,7 +75,9 @@ class WitnessPlayerLogic:
|
||||||
for option_panel in option:
|
for option_panel in option:
|
||||||
dep_obj = StaticWitnessLogic.CHECKS_BY_HEX.get(option_panel)
|
dep_obj = StaticWitnessLogic.CHECKS_BY_HEX.get(option_panel)
|
||||||
|
|
||||||
if option_panel in {"7 Lasers", "11 Lasers"}:
|
if option_panel in self.COMPLETELY_DISABLED_CHECKS:
|
||||||
|
new_items = frozenset()
|
||||||
|
elif option_panel in {"7 Lasers", "11 Lasers"}:
|
||||||
new_items = frozenset({frozenset([option_panel])})
|
new_items = frozenset({frozenset([option_panel])})
|
||||||
# If a panel turns on when a panel in a different region turns on,
|
# If a panel turns on when a panel in a different region turns on,
|
||||||
# the latter panel will be an "event panel", unless it ends up being
|
# the latter panel will be an "event panel", unless it ends up being
|
||||||
|
@ -204,9 +209,11 @@ class WitnessPlayerLogic:
|
||||||
elif get_option_value(world, player, "victory_condition") == 3:
|
elif get_option_value(world, player, "victory_condition") == 3:
|
||||||
self.VICTORY_LOCATION = "0xFFF00"
|
self.VICTORY_LOCATION = "0xFFF00"
|
||||||
|
|
||||||
self.COMPLETELY_DISABLED_CHECKS.add(
|
if get_option_value(world, player, "challenge_lasers") <= 7:
|
||||||
self.VICTORY_LOCATION
|
adjustment_linesets_in_order.append([
|
||||||
)
|
"Requirement Changes:",
|
||||||
|
"0xFFF00 - 11 Lasers - True",
|
||||||
|
])
|
||||||
|
|
||||||
if is_option_enabled(world, player, "disable_non_randomized_puzzles"):
|
if is_option_enabled(world, player, "disable_non_randomized_puzzles"):
|
||||||
adjustment_linesets_in_order.append(get_disable_unrandomized_list())
|
adjustment_linesets_in_order.append(get_disable_unrandomized_list())
|
||||||
|
@ -356,6 +363,12 @@ class WitnessPlayerLogic:
|
||||||
"0x2700B": "Open Door to Treehouse Laser House",
|
"0x2700B": "Open Door to Treehouse Laser House",
|
||||||
"0x00055": "Orchard Apple Trees 4 Turns On",
|
"0x00055": "Orchard Apple Trees 4 Turns On",
|
||||||
"0x17DDB": "Left Orange Bridge Fully Extended",
|
"0x17DDB": "Left Orange Bridge Fully Extended",
|
||||||
|
"0x03535": "Shipwreck Video Pattern Knowledge",
|
||||||
|
"0x03542": "Mountain Video Pattern Knowledge",
|
||||||
|
"0x0339E": "Desert Video Pattern Knowledge",
|
||||||
|
"0x03481": "Tutorial Video Pattern Knowledge",
|
||||||
|
"0x03702": "Jungle Video Pattern Knowledge",
|
||||||
|
"0x0356B": "Challenge Video Pattern Knowledge",
|
||||||
}
|
}
|
||||||
|
|
||||||
self.ALWAYS_EVENT_NAMES_BY_HEX = {
|
self.ALWAYS_EVENT_NAMES_BY_HEX = {
|
||||||
|
@ -371,12 +384,6 @@ class WitnessPlayerLogic:
|
||||||
"0x0C2B2": "Bunker Laser Activation",
|
"0x0C2B2": "Bunker Laser Activation",
|
||||||
"0x00BF6": "Swamp Laser Activation",
|
"0x00BF6": "Swamp Laser Activation",
|
||||||
"0x028A4": "Treehouse Laser Activation",
|
"0x028A4": "Treehouse Laser Activation",
|
||||||
"0x03535": "Shipwreck Video Pattern Knowledge",
|
|
||||||
"0x03542": "Mountain Video Pattern Knowledge",
|
|
||||||
"0x0339E": "Desert Video Pattern Knowledge",
|
|
||||||
"0x03481": "Tutorial Video Pattern Knowledge",
|
|
||||||
"0x03702": "Jungle Video Pattern Knowledge",
|
|
||||||
"0x0356B": "Challenge Video Pattern Knowledge",
|
|
||||||
"0x09F7F": "Mountaintop Trap Door Turns On",
|
"0x09F7F": "Mountaintop Trap Door Turns On",
|
||||||
"0x17C34": "Mountain Access",
|
"0x17C34": "Mountain Access",
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
Event Items:
|
Event Items:
|
||||||
Town Tower 4th Door Opens - 0x17CFB,0x3C12B,0x00B8D,0x17CF7
|
Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9
|
||||||
Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9,0x17CA4
|
|
||||||
Bunker Laser Activation - 0x00061,0x17D01,0x17C42
|
Bunker Laser Activation - 0x00061,0x17D01,0x17C42
|
||||||
Shadows Laser Activation - 0x00021,0x17D28,0x17C71
|
Shadows Laser Activation - 0x00021,0x17D28,0x17C71
|
||||||
|
|
||||||
Requirement Changes:
|
Requirement Changes:
|
||||||
0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9 | 0x17CA4
|
0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9
|
||||||
0x0C2B2 - 0x00061 | 0x17D01 | 0x17C42
|
0x0C2B2 - 0x00061 | 0x17D01 | 0x17C42
|
||||||
0x181B3 - 0x00021 | 0x17D28 | 0x17C71
|
0x181B3 - 0x00021 | 0x17D28 | 0x17C71
|
||||||
0x28B39 - True - Reflection
|
0x28B39 - True - Reflection
|
||||||
0x17CAB - True - True
|
0x17CAB - True - True
|
||||||
|
0x2779A - True - 0x17CFB | 0x3C12B | 0x17CF7
|
||||||
|
|
||||||
Disabled Locations:
|
Disabled Locations:
|
||||||
0x03505 (Tutorial Gate Close)
|
0x03505 (Tutorial Gate Close)
|
||||||
|
@ -61,7 +61,7 @@ Disabled Locations:
|
||||||
0x193AA (Monastery Branch Avoid 2)
|
0x193AA (Monastery Branch Avoid 2)
|
||||||
0x193AB (Monastery Branch Follow 1)
|
0x193AB (Monastery Branch Follow 1)
|
||||||
0x193A6 (Monastery Branch Follow 2)
|
0x193A6 (Monastery Branch Follow 2)
|
||||||
0x17CA4 (Monastery Laser) - 0x193A6 - True
|
0x17CA4 (Monastery Laser)
|
||||||
0x18590 (Tree Outlines) - True - Symmetry & Environment
|
0x18590 (Tree Outlines) - True - Symmetry & Environment
|
||||||
0x28AE3 (Vines Shadows Follow) - 0x18590 - Shadows Follow & Environment
|
0x28AE3 (Vines Shadows Follow) - 0x18590 - Shadows Follow & Environment
|
||||||
0x28938 (Four-way Apple Tree) - 0x28AE3 - Environment
|
0x28938 (Four-way Apple Tree) - 0x28AE3 - Environment
|
||||||
|
@ -103,4 +103,6 @@ Disabled Locations:
|
||||||
0x17E67 (Bunker Drop-Down Door Squares 2)
|
0x17E67 (Bunker Drop-Down Door Squares 2)
|
||||||
0x09DE0 (Bunker Laser)
|
0x09DE0 (Bunker Laser)
|
||||||
0x0A079 (Bunker Elevator Control)
|
0x0A079 (Bunker Elevator Control)
|
||||||
0x0042D (Mountaintop River Shape)
|
0x0042D (Mountaintop River Shape)
|
||||||
|
|
||||||
|
0x17CAA (River Door to Garden Panel)
|
Loading…
Reference in New Issue