mirror of
				https://github.com/MarioSpore/Grinch-AP.git
				synced 2025-10-21 20:21:32 -06:00 
			
		
		
		
	
		
			
	
	
		
			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)) |