80 lines
6.3 KiB
Python
80 lines
6.3 KiB
Python
from typing import TYPE_CHECKING
|
|
from worlds.generic.Rules import set_rule
|
|
|
|
if TYPE_CHECKING:
|
|
from . import FaxanaduWorld
|
|
|
|
|
|
def can_buy_in_eolis(state, player):
|
|
# Sword or Deluge so we can farm for gold.
|
|
# Ring of Elf so we can get 1500 from the King.
|
|
return state.has_any(["Progressive Sword", "Deluge", "Ring of Elf"], player)
|
|
|
|
|
|
def has_any_magic(state, player):
|
|
return state.has_any(["Deluge", "Thunder", "Fire", "Death", "Tilte"], player)
|
|
|
|
|
|
def set_rules(faxanadu_world: "FaxanaduWorld"):
|
|
player = faxanadu_world.player
|
|
multiworld = faxanadu_world.multiworld
|
|
|
|
# Region rules
|
|
set_rule(multiworld.get_entrance("Eolis -> Path to Apolune", player), lambda state:
|
|
state.has_all(["Key Jack", "Progressive Sword"], player)) # You can't go far with magic only
|
|
set_rule(multiworld.get_entrance("Apolune -> Tower of Trunk", player), lambda state: state.has("Key Jack", player))
|
|
set_rule(multiworld.get_entrance("Apolune -> Path to Forepaw", player), lambda state: state.has("Mattock", player))
|
|
set_rule(multiworld.get_entrance("Trunk -> Joker Spring", player), lambda state: state.has("Key Joker", player))
|
|
set_rule(multiworld.get_entrance("Trunk -> Tower of Fortress", player), lambda state: state.has("Key Jack", player))
|
|
set_rule(multiworld.get_entrance("Trunk -> Path to Mascon", player), lambda state:
|
|
state.has_all(["Key Queen", "Ring of Ruby", "Sky Spring Flow", "Tower of Fortress Spring Flow", "Joker Spring Flow"], player) and
|
|
state.has("Progressive Sword", player, 2))
|
|
set_rule(multiworld.get_entrance("Path to Mascon -> Tower of Red Potion", player), lambda state:
|
|
state.has("Key Queen", player) and
|
|
state.has("Red Potion", player, 4)) # It's impossible to go through the tower of Red Potion without at least 1-2 potions. Give them 4 for good measure.
|
|
set_rule(multiworld.get_entrance("Path to Victim -> Tower of Suffer", player), lambda state: state.has("Key Queen", player))
|
|
set_rule(multiworld.get_entrance("Path to Victim -> Victim", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_entrance("Mist -> Useless Tower", player), lambda state:
|
|
state.has_all(["Key King", "Unlock Wingboots"], player))
|
|
set_rule(multiworld.get_entrance("Mist -> Tower of Mist", player), lambda state: state.has("Key King", player))
|
|
set_rule(multiworld.get_entrance("Mist -> Path to Conflate", player), lambda state: state.has("Key Ace", player))
|
|
set_rule(multiworld.get_entrance("Path to Conflate -> Helm Branch", player), lambda state: state.has("Key King", player))
|
|
set_rule(multiworld.get_entrance("Path to Conflate -> Branches", player), lambda state: state.has("Key King", player))
|
|
set_rule(multiworld.get_entrance("Daybreak -> Dartmoor Castle", player), lambda state: state.has("Ring of Dworf", player))
|
|
set_rule(multiworld.get_entrance("Dartmoor Castle -> Evil Fortress", player), lambda state: state.has("Demons Ring", player))
|
|
|
|
# Location rules
|
|
set_rule(multiworld.get_location("Eolis Key Jack", player), lambda state: can_buy_in_eolis(state, player))
|
|
set_rule(multiworld.get_location("Eolis Hand Dagger", player), lambda state: can_buy_in_eolis(state, player))
|
|
set_rule(multiworld.get_location("Eolis Elixir", player), lambda state: can_buy_in_eolis(state, player))
|
|
set_rule(multiworld.get_location("Eolis Deluge", player), lambda state: can_buy_in_eolis(state, player))
|
|
set_rule(multiworld.get_location("Eolis Red Potion", player), lambda state: can_buy_in_eolis(state, player))
|
|
set_rule(multiworld.get_location("Path to Apolune Magic Shield", player), lambda state: state.has("Key King", player)) # Mid-late cost, make sure we've progressed
|
|
set_rule(multiworld.get_location("Path to Apolune Death", player), lambda state: state.has("Key Ace", player)) # Mid-late cost, make sure we've progressed
|
|
set_rule(multiworld.get_location("Tower of Trunk Hidden Mattock", player), lambda state:
|
|
# This is actually possible if the monster drop into the stairs and kill it with dagger. But it's a "pro move"
|
|
state.has("Deluge", player, 1) or
|
|
state.has("Progressive Sword", player, 2))
|
|
set_rule(multiworld.get_location("Path to Forepaw Glove", player), lambda state:
|
|
state.has_all(["Deluge", "Unlock Wingboots"], player))
|
|
set_rule(multiworld.get_location("Trunk Red Potion", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_location("Sky Spring", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_location("Tower of Fortress Spring", player), lambda state: state.has("Spring Elixir", player))
|
|
set_rule(multiworld.get_location("Tower of Fortress Guru", player), lambda state: state.has("Sky Spring Flow", player))
|
|
set_rule(multiworld.get_location("Tower of Suffer Hidden Wingboots", player), lambda state:
|
|
state.has("Deluge", player) or
|
|
state.has("Progressive Sword", player, 2))
|
|
set_rule(multiworld.get_location("Misty House", player), lambda state: state.has("Black Onyx", player))
|
|
set_rule(multiworld.get_location("Misty Doctor Office", player), lambda state: has_any_magic(state, player))
|
|
set_rule(multiworld.get_location("Conflate Guru", player), lambda state: state.has("Progressive Armor", player, 3))
|
|
set_rule(multiworld.get_location("Branches Hidden Mattock", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_location("Path to Daybreak Glove", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_location("Dartmoor Castle Hidden Hourglass", player), lambda state: state.has("Unlock Wingboots", player))
|
|
set_rule(multiworld.get_location("Dartmoor Castle Hidden Red Potion", player), lambda state: has_any_magic(state, player))
|
|
set_rule(multiworld.get_location("Fraternal Castle Guru", player), lambda state: state.has("Progressive Sword", player, 4))
|
|
set_rule(multiworld.get_location("Fraternal Castle Shop Hidden Ointment", player), lambda state: has_any_magic(state, player))
|
|
|
|
if faxanadu_world.options.require_dragon_slayer.value:
|
|
set_rule(multiworld.get_location("Evil One", player), lambda state:
|
|
state.has_all_counts({"Progressive Sword": 4, "Progressive Armor": 3, "Progressive Shield": 4}, player))
|