Add Free Terrain mode and terrain rules

This commit is contained in:
Catobat
2022-10-09 01:23:47 +02:00
parent 1fd1f9ca5c
commit 0c53fc8519
18 changed files with 603 additions and 106 deletions

View File

@@ -3,10 +3,11 @@ import logging
from collections import deque
import OverworldGlitchRules
from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier, KeyRuleType, LocationType
from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier, KeyRuleType, LocationType, Terrain
from BaseClasses import PotFlags
from Dungeons import dungeon_table
from RoomData import DoorKind
from OWEdges import OWExitTypes
from OverworldGlitchRules import overworld_glitches_rules
@@ -25,6 +26,8 @@ def set_rules(world, player):
ow_bunny_rules(world, player)
ow_terrain_rules(world, player)
if world.mode[player] == 'standard':
if not world.is_copied_world:
standard_rules(world, player)
@@ -1474,6 +1477,21 @@ def ow_bunny_rules(world, player):
add_bunny_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), player)
def ow_terrain_rules(world, player):
for edge in world.owedges:
if edge.player == player and edge.dest and edge.dest.terrain == Terrain.Water:
ent = world.get_entrance(edge.name, player)
if edge.terrain == Terrain.Land:
set_rule(ent, lambda state: state.has('Flippers', player))
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
for whirlpool_name in OWExitTypes['Whirlpool']:
ent = world.get_entrance(whirlpool_name, player)
if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'):
add_rule(ent, lambda state: state.has_Pearl(player))
def no_glitches_rules(world, player):
# todo: move some dungeon rules to no glictes logic - see these for examples
# add_rule(world.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player))