 5fae1c087e
			
		
	
	5fae1c087e
	
	
	
		
			
			* Cleanup and new option support * Handle new locations * Support higher Strawberry counts * Don't add start inventory items to the pool * Support Move Shuffle functionality and items * Hard and Move Shuffle Logic * Fix Options * Update CHANGELOG.md * Add standard moves logic for signs 3 and 4 * Fix Option Tooltip * Add tracker link to setup guide * Fix unit test * Fix option tooltips * Missing Space * Move option checking out of rule function * Delete just_gen500.bat
		
			
				
	
	
		
			344 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import Dict, List
 | |
| 
 | |
| from BaseClasses import CollectionState
 | |
| from worlds.generic.Rules import set_rule
 | |
| 
 | |
| from . import Celeste64World
 | |
| from .Names import ItemName, LocationName
 | |
| 
 | |
| 
 | |
| def set_rules(world: Celeste64World):
 | |
|     if world.options.logic_difficulty == "standard":
 | |
|         if world.options.move_shuffle:
 | |
|             world.active_logic_mapping = location_standard_moves_logic
 | |
|         else:
 | |
|             world.active_logic_mapping = location_standard_logic
 | |
|     else:
 | |
|         if world.options.move_shuffle:
 | |
|             world.active_logic_mapping = location_hard_moves_logic
 | |
|         else:
 | |
|             world.active_logic_mapping = location_hard_logic
 | |
| 
 | |
|     for location in world.multiworld.get_locations(world.player):
 | |
|         set_rule(location, lambda state, location=location: location_rule(state, world, location.name))
 | |
| 
 | |
|     if world.options.logic_difficulty == "standard":
 | |
|         if world.options.move_shuffle:
 | |
|             world.goal_logic_mapping = goal_standard_moves_logic
 | |
|         else:
 | |
|             world.goal_logic_mapping = goal_standard_logic
 | |
|     else:
 | |
|         if world.options.move_shuffle:
 | |
|             world.goal_logic_mapping = goal_hard_moves_logic
 | |
|         else:
 | |
|             world.goal_logic_mapping = goal_hard_logic
 | |
| 
 | |
|     # Completion condition.
 | |
|     world.multiworld.completion_condition[world.player] = lambda state: goal_rule(state, world)
 | |
| 
 | |
| 
 | |
| goal_standard_logic: List[List[str]] = [[ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.double_dash_refill]]
 | |
| goal_hard_logic: List[List[str]] = [[]]
 | |
| goal_standard_moves_logic: List[List[str]] = [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb]]
 | |
| goal_hard_moves_logic: List[List[str]] = [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb],
 | |
|                                           [ItemName.traffic_block, ItemName.air_dash, ItemName.skid_jump],
 | |
|                                           [ItemName.ground_dash, ItemName.air_dash, ItemName.skid_jump],
 | |
|                                           [ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                                           [ItemName.traffic_block, ItemName.ground_dash, ItemName.air_dash]]
 | |
| 
 | |
| 
 | |
| location_standard_logic: Dict[str, List[List[str]]] = {
 | |
|     LocationName.strawberry_4:  [[ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.strawberry_6:  [[ItemName.dash_refill],
 | |
|                                  [ItemName.traffic_block]],
 | |
|     LocationName.strawberry_7:  [[ItemName.dash_refill],
 | |
|                                  [ItemName.traffic_block]],
 | |
|     LocationName.strawberry_8:  [[ItemName.traffic_block]],
 | |
|     LocationName.strawberry_9:  [[ItemName.dash_refill]],
 | |
|     LocationName.strawberry_11: [[ItemName.dash_refill],
 | |
|                                  [ItemName.traffic_block]],
 | |
|     LocationName.strawberry_12: [[ItemName.dash_refill, ItemName.double_dash_refill],
 | |
|                                  [ItemName.traffic_block, ItemName.double_dash_refill]],
 | |
|     LocationName.strawberry_13: [[ItemName.dash_refill, ItemName.breakables],
 | |
|                                  [ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.strawberry_14: [[ItemName.dash_refill, ItemName.feather],
 | |
|                                  [ItemName.traffic_block, ItemName.feather]],
 | |
|     LocationName.strawberry_15: [[ItemName.dash_refill, ItemName.feather],
 | |
|                                  [ItemName.traffic_block, ItemName.feather]],
 | |
|     LocationName.strawberry_16: [[ItemName.dash_refill, ItemName.feather],
 | |
|                                  [ItemName.traffic_block, ItemName.feather]],
 | |
|     LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block]],
 | |
|     LocationName.strawberry_18: [[ItemName.dash_refill, ItemName.double_dash_refill],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.double_dash_refill]],
 | |
|     LocationName.strawberry_19: [[ItemName.dash_refill, ItemName.double_dash_refill, ItemName.spring],
 | |
|                                  [ItemName.traffic_block, ItemName.double_dash_refill, ItemName.feather, ItemName.spring]],
 | |
|     LocationName.strawberry_20: [[ItemName.dash_refill, ItemName.feather, ItemName.breakables],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.breakables]],
 | |
| 
 | |
|     LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.strawberry_22: [[ItemName.cassette, ItemName.dash_refill, ItemName.breakables]],
 | |
|     LocationName.strawberry_23: [[ItemName.cassette, ItemName.dash_refill, ItemName.coin],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.coin]],
 | |
|     LocationName.strawberry_24: [[ItemName.cassette, ItemName.dash_refill, ItemName.traffic_block]],
 | |
|     LocationName.strawberry_25: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.double_dash_refill]],
 | |
|     LocationName.strawberry_26: [[ItemName.cassette, ItemName.dash_refill],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block]],
 | |
|     LocationName.strawberry_27: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.coin]],
 | |
|     LocationName.strawberry_28: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.coin]],
 | |
|     LocationName.strawberry_29: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin]],
 | |
|     LocationName.strawberry_30: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.spring, ItemName.breakables]],
 | |
| 
 | |
|     LocationName.theo_1:     [[ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.theo_2:     [[ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.theo_3:     [[ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.badeline_1: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.badeline_2: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.badeline_3: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables]],
 | |
| 
 | |
|     LocationName.sign_2: [[ItemName.breakables]],
 | |
|     LocationName.sign_3: [[ItemName.dash_refill],
 | |
|                           [ItemName.traffic_block]],
 | |
|     LocationName.sign_4: [[ItemName.dash_refill, ItemName.double_dash_refill],
 | |
|                           [ItemName.dash_refill, ItemName.feather],
 | |
|                           [ItemName.traffic_block, ItemName.feather]],
 | |
|     LocationName.sign_5: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables]],
 | |
| 
 | |
|     LocationName.car_2: [[ItemName.breakables]],
 | |
| }
 | |
| 
 | |
| location_hard_logic: Dict[str, List[List[str]]] = {
 | |
|     LocationName.strawberry_13: [[ItemName.breakables]],
 | |
|     LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.traffic_block]],
 | |
|     LocationName.strawberry_20: [[ItemName.breakables]],
 | |
| 
 | |
|     LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables]],
 | |
|     LocationName.strawberry_22: [[ItemName.cassette]],
 | |
|     LocationName.strawberry_23: [[ItemName.cassette, ItemName.coin]],
 | |
|     LocationName.strawberry_24: [[ItemName.cassette]],
 | |
|     LocationName.strawberry_25: [[ItemName.cassette, ItemName.double_dash_refill]],
 | |
|     LocationName.strawberry_26: [[ItemName.cassette]],
 | |
|     LocationName.strawberry_27: [[ItemName.cassette]],
 | |
|     LocationName.strawberry_28: [[ItemName.cassette, ItemName.feather]],
 | |
|     LocationName.strawberry_29: [[ItemName.cassette]],
 | |
|     LocationName.strawberry_30: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.traffic_block, ItemName.breakables]],
 | |
| 
 | |
|     LocationName.sign_2: [[ItemName.breakables]],
 | |
| 
 | |
|     LocationName.car_2: [[ItemName.breakables]],
 | |
| }
 | |
| 
 | |
| location_standard_moves_logic: Dict[str, List[List[str]]] = {
 | |
|     LocationName.strawberry_1:  [[ItemName.ground_dash],
 | |
|                                  [ItemName.air_dash],
 | |
|                                  [ItemName.skid_jump],
 | |
|                                  [ItemName.climb]],
 | |
|     LocationName.strawberry_2:  [[ItemName.ground_dash],
 | |
|                                  [ItemName.air_dash],
 | |
|                                  [ItemName.skid_jump],
 | |
|                                  [ItemName.climb]],
 | |
|     LocationName.strawberry_3:  [[ItemName.air_dash],
 | |
|                                  [ItemName.skid_jump]],
 | |
|     LocationName.strawberry_4:  [[ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_5:  [[ItemName.air_dash]],
 | |
|     LocationName.strawberry_6:  [[ItemName.dash_refill, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.ground_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.skid_jump],
 | |
|                                  [ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.strawberry_7:  [[ItemName.dash_refill, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.ground_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.skid_jump],
 | |
|                                  [ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.strawberry_8:  [[ItemName.traffic_block, ItemName.ground_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.skid_jump],
 | |
|                                  [ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.strawberry_9:  [[ItemName.dash_refill, ItemName.air_dash]],
 | |
|     LocationName.strawberry_10: [[ItemName.climb]],
 | |
|     LocationName.strawberry_11: [[ItemName.dash_refill, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.strawberry_12: [[ItemName.dash_refill, ItemName.double_dash_refill, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.double_dash_refill, ItemName.air_dash]],
 | |
|     LocationName.strawberry_13: [[ItemName.dash_refill, ItemName.breakables, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.breakables, ItemName.ground_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_14: [[ItemName.dash_refill, ItemName.feather, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.air_dash]],
 | |
|     LocationName.strawberry_15: [[ItemName.dash_refill, ItemName.feather, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.climb]],
 | |
|     LocationName.strawberry_16: [[ItemName.dash_refill, ItemName.feather, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.feather]],
 | |
|     LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.ground_dash],
 | |
|                                  [ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                                  [ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.skid_jump],
 | |
|                                  [ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.strawberry_18: [[ItemName.dash_refill, ItemName.double_dash_refill, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.double_dash_refill, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_19: [[ItemName.dash_refill, ItemName.double_dash_refill, ItemName.spring, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.double_dash_refill, ItemName.feather, ItemName.spring, ItemName.air_dash]],
 | |
|     LocationName.strawberry_20: [[ItemName.dash_refill, ItemName.feather, ItemName.breakables, ItemName.air_dash],
 | |
|                                  [ItemName.traffic_block, ItemName.feather, ItemName.breakables, ItemName.air_dash]],
 | |
| 
 | |
|     LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_22: [[ItemName.cassette, ItemName.dash_refill, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_23: [[ItemName.cassette, ItemName.dash_refill, ItemName.coin, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.coin, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_24: [[ItemName.cassette, ItemName.dash_refill, ItemName.traffic_block, ItemName.air_dash]],
 | |
|     LocationName.strawberry_25: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.double_dash_refill, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_26: [[ItemName.cassette, ItemName.dash_refill, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_27: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin, ItemName.air_dash],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.coin, ItemName.air_dash]],
 | |
|     LocationName.strawberry_28: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.feather, ItemName.coin, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_29: [[ItemName.cassette, ItemName.dash_refill, ItemName.feather, ItemName.coin, ItemName.air_dash, ItemName.skid_jump]],
 | |
|     LocationName.strawberry_30: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.spring, ItemName.breakables, ItemName.air_dash, ItemName.climb]],
 | |
| 
 | |
|     LocationName.granny_1:   [[ItemName.ground_dash],
 | |
|                               [ItemName.air_dash],
 | |
|                               [ItemName.skid_jump],
 | |
|                               [ItemName.climb]],
 | |
|     LocationName.granny_2:   [[ItemName.ground_dash],
 | |
|                               [ItemName.air_dash],
 | |
|                               [ItemName.skid_jump],
 | |
|                               [ItemName.climb]],
 | |
|     LocationName.granny_3:   [[ItemName.ground_dash],
 | |
|                               [ItemName.air_dash],
 | |
|                               [ItemName.skid_jump],
 | |
|                               [ItemName.climb]],
 | |
|     LocationName.theo_1:     [[ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.theo_2:     [[ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.theo_3:     [[ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.badeline_1: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.badeline_2: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.badeline_3: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb]],
 | |
| 
 | |
|     LocationName.sign_1: [[ItemName.ground_dash],
 | |
|                           [ItemName.air_dash],
 | |
|                           [ItemName.skid_jump],
 | |
|                           [ItemName.climb]],
 | |
|     LocationName.sign_2: [[ItemName.breakables, ItemName.ground_dash],
 | |
|                           [ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.sign_3:  [[ItemName.dash_refill, ItemName.air_dash],
 | |
|                            [ItemName.traffic_block, ItemName.ground_dash],
 | |
|                            [ItemName.traffic_block, ItemName.air_dash],
 | |
|                            [ItemName.traffic_block, ItemName.skid_jump],
 | |
|                            [ItemName.traffic_block, ItemName.climb]],
 | |
|     LocationName.sign_4: [[ItemName.dash_refill, ItemName.double_dash_refill, ItemName.air_dash],
 | |
|                           [ItemName.dash_refill, ItemName.feather, ItemName.air_dash],
 | |
|                           [ItemName.traffic_block, ItemName.feather, ItemName.ground_dash],
 | |
|                           [ItemName.traffic_block, ItemName.feather, ItemName.air_dash],
 | |
|                           [ItemName.traffic_block, ItemName.feather, ItemName.skid_jump],
 | |
|                           [ItemName.traffic_block, ItemName.feather, ItemName.climb]],
 | |
|     LocationName.sign_5: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb]],
 | |
| 
 | |
|     LocationName.car_2: [[ItemName.breakables, ItemName.ground_dash],
 | |
|                          [ItemName.breakables, ItemName.air_dash]],
 | |
| }
 | |
| 
 | |
| location_hard_moves_logic: Dict[str, List[List[str]]] = {
 | |
|     LocationName.strawberry_3:  [[ItemName.air_dash],
 | |
|                                  [ItemName.skid_jump]],
 | |
|     LocationName.strawberry_5:  [[ItemName.ground_dash],
 | |
|                                  [ItemName.air_dash]],
 | |
|     LocationName.strawberry_8:  [[ItemName.traffic_block],
 | |
|                                  [ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.strawberry_10: [[ItemName.air_dash],
 | |
|                                  [ItemName.climb]],
 | |
|     LocationName.strawberry_11: [[ItemName.ground_dash],
 | |
|                                  [ItemName.air_dash],
 | |
|                                  [ItemName.skid_jump]],
 | |
|     LocationName.strawberry_12: [[ItemName.feather],
 | |
|                                  [ItemName.ground_dash],
 | |
|                                  [ItemName.air_dash]],
 | |
|     LocationName.strawberry_13: [[ItemName.breakables, ItemName.ground_dash],
 | |
|                                  [ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_14: [[ItemName.feather, ItemName.air_dash],
 | |
|                                  [ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_15: [[ItemName.feather],
 | |
|                                  [ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.traffic_block]],
 | |
|     LocationName.strawberry_18: [[ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.double_dash_refill, ItemName.air_dash]],
 | |
|     LocationName.strawberry_19: [[ItemName.air_dash, ItemName.skid_jump],
 | |
|                                  [ItemName.double_dash_refill, ItemName.spring, ItemName.air_dash],
 | |
|                                  [ItemName.spring, ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.strawberry_20: [[ItemName.breakables, ItemName.air_dash]],
 | |
| 
 | |
|     LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.strawberry_22: [[ItemName.cassette, ItemName.ground_dash, ItemName.air_dash],
 | |
|                                  [ItemName.cassette, ItemName.dash_refill, ItemName.air_dash]],
 | |
|     LocationName.strawberry_23: [[ItemName.cassette, ItemName.coin, ItemName.air_dash]],
 | |
|     LocationName.strawberry_24: [[ItemName.cassette, ItemName.ground_dash, ItemName.air_dash],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.air_dash]],
 | |
|     LocationName.strawberry_25: [[ItemName.cassette, ItemName.double_dash_refill, ItemName.air_dash, ItemName.climb]],
 | |
|     LocationName.strawberry_26: [[ItemName.cassette, ItemName.ground_dash],
 | |
|                                  [ItemName.cassette, ItemName.air_dash]],
 | |
|     LocationName.strawberry_27: [[ItemName.cassette, ItemName.air_dash, ItemName.skid_jump],
 | |
|                                  [ItemName.cassette, ItemName.traffic_block, ItemName.coin, ItemName.air_dash],
 | |
|                                  [ItemName.cassette, ItemName.coin, ItemName.ground_dash],
 | |
|                                  [ItemName.cassette, ItemName.feather, ItemName.coin, ItemName.air_dash]],
 | |
|     LocationName.strawberry_28: [[ItemName.cassette, ItemName.feather, ItemName.air_dash],
 | |
|                                  [ItemName.cassette, ItemName.feather, ItemName.climb]],
 | |
|     LocationName.strawberry_29: [[ItemName.cassette, ItemName.dash_refill, ItemName.air_dash, ItemName.skid_jump],
 | |
|                                  [ItemName.cassette, ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.strawberry_30: [[ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.traffic_block, ItemName.breakables, ItemName.ground_dash, ItemName.air_dash, ItemName.climb, ItemName.skid_jump],
 | |
|                                  [ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.traffic_block, ItemName.breakables, ItemName.feather, ItemName.air_dash, ItemName.climb, ItemName.skid_jump],
 | |
|                                  [ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.traffic_block, ItemName.breakables, ItemName.spring, ItemName.ground_dash, ItemName.air_dash, ItemName.climb],
 | |
|                                  [ItemName.cassette, ItemName.dash_refill, ItemName.double_dash_refill, ItemName.traffic_block, ItemName.breakables, ItemName.spring, ItemName.feather, ItemName.air_dash, ItemName.climb]],
 | |
| 
 | |
|     LocationName.badeline_1: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb],
 | |
|                               [ItemName.traffic_block, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.ground_dash, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                               [ItemName.traffic_block, ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.badeline_2: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb],
 | |
|                               [ItemName.traffic_block, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.ground_dash, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                               [ItemName.traffic_block, ItemName.ground_dash, ItemName.air_dash]],
 | |
|     LocationName.badeline_3: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb],
 | |
|                               [ItemName.traffic_block, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.ground_dash, ItemName.air_dash, ItemName.skid_jump],
 | |
|                               [ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                               [ItemName.traffic_block, ItemName.ground_dash, ItemName.air_dash]],
 | |
| 
 | |
|     LocationName.sign_2: [[ItemName.breakables, ItemName.ground_dash],
 | |
|                           [ItemName.breakables, ItemName.air_dash]],
 | |
|     LocationName.sign_5: [[ItemName.double_dash_refill, ItemName.feather, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash, ItemName.climb],
 | |
|                           [ItemName.traffic_block, ItemName.air_dash, ItemName.skid_jump],
 | |
|                           [ItemName.ground_dash, ItemName.air_dash, ItemName.skid_jump],
 | |
|                           [ItemName.feather, ItemName.traffic_block, ItemName.air_dash],
 | |
|                           [ItemName.traffic_block, ItemName.ground_dash, ItemName.air_dash]],
 | |
| 
 | |
|     LocationName.car_2: [[ItemName.breakables, ItemName.ground_dash],
 | |
|                          [ItemName.breakables, ItemName.air_dash]],
 | |
| }
 | |
| 
 | |
| 
 | |
| def location_rule(state: CollectionState, world: Celeste64World, loc: str) -> bool:
 | |
| 
 | |
|     if loc not in world.active_logic_mapping:
 | |
|         return True
 | |
| 
 | |
|     for possible_access in world.active_logic_mapping[loc]:
 | |
|         if state.has_all(possible_access, world.player):
 | |
|             return True
 | |
| 
 | |
|     return False
 | |
| 
 | |
| def goal_rule(state: CollectionState, world: Celeste64World) -> bool:
 | |
|     if not state.has(ItemName.strawberry, world.player, world.strawberries_required):
 | |
|         return False
 | |
| 
 | |
|     for possible_access in world.goal_logic_mapping:
 | |
|         if state.has_all(possible_access, world.player):
 | |
|             return True
 | |
| 
 | |
|     return False
 |