Archipelago/worlds/raft/Rules.py

180 lines
9.4 KiB
Python
Raw Normal View History

2022-01-21 21:41:53 +00:00
from ..generic.Rules import set_rule
from .Locations import location_table
from .Regions import regionMap
from ..AutoWorld import LogicMixin
class RaftLogic(LogicMixin):
def raft_paddleboard_mode_enabled(self, player):
return self.world.paddleboard_mode[player].value
def raft_big_islands_available(self, player):
return self.world.big_island_early_crafting[player].value or self.raft_can_access_radio_tower(player)
def raft_can_smelt_items(self, player):
return self.has("Smelter", player)
def raft_can_craft_bolt(self, player):
return self.raft_can_smelt_items(player) and self.has("Bolt", player)
def raft_can_craft_hinge(self, player):
return self.raft_can_smelt_items(player) and self.has("Hinge", player)
def raft_can_craft_battery(self, player):
return self.raft_can_smelt_items(player) and self.has("Battery", player)
def raft_can_craft_circuitBoard(self, player):
return self.raft_can_smelt_items(player) and self.has("Circuit board", player)
def raft_can_craft_reciever(self, player):
return self.raft_can_craft_circuitBoard(player) and self.raft_can_craft_hinge(player) and self.has("Receiver", player)
def raft_can_craft_antenna(self, player):
return self.raft_can_craft_circuitBoard(player) and self.raft_can_craft_bolt(player) and self.has("Antenna", player)
def raft_can_craft_plasticBottle(self, player):
return self.raft_can_smelt_items(player) and self.has("Empty bottle", player)
def raft_can_fire_bow(self, player):
return self.has("Basic bow", player) and self.has("Stone arrow", player)
def raft_can_craft_shears(self, player):
return self.raft_can_smelt_items(player) and self.raft_can_craft_hinge(player) and self.has("Shear", player)
def raft_can_craft_birdNest(self, player):
return self.has("Birds nest", player)
def raft_can_craft_engine(self, player):
return self.raft_can_smelt_items(player) and self.raft_can_craft_circuitBoard(player) and self.has("Engine", player)
def raft_can_craft_steeringWheel(self, player):
return (self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player)
and self.raft_can_craft_hinge(player) and self.has("Steering Wheel", player))
def raft_can_craft_machete(self, player):
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Machete", player)
def raft_can_craft_ziplineTool(self, player):
return self.raft_can_craft_hinge(player) and self.raft_can_craft_bolt(player) and self.has("Zipline tool", player)
def raft_can_get_dirt(self, player):
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Shovel", player)
def raft_can_craft_grassPlot(self, player):
return self.raft_can_get_dirt(player) and self.has("Grass plot", player)
def raft_can_craft_netLauncher(self, player):
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Net launcher", player)
def raft_can_craft_netCanister(self, player):
return self.raft_can_smelt_items(player) and self.has("Net canister", player)
def raft_can_capture_animals(self, player):
return (self.raft_can_craft_netLauncher(player) and self.raft_can_craft_netCanister(player)
and self.raft_can_craft_grassPlot(player))
def raft_can_navigate(self, player): # Sail is added by default and not considered in Archipelago
return self.raft_can_craft_battery(player) and self.raft_can_craft_reciever(player) and self.raft_can_craft_antenna(player)
def raft_can_drive(self, player): # The player can go wherever they want with the engine
return self.raft_can_craft_engine(player) and self.raft_can_craft_steeringWheel(player)
def raft_can_access_radio_tower(self, player):
return self.raft_can_navigate(player)
def raft_can_complete_radio_tower(self, player):
return self.raft_can_access_radio_tower(player)
def raft_can_access_vasagatan(self, player):
return self.raft_can_complete_radio_tower(player) and self.raft_can_navigate(player) and self.has("Vasagatan Frequency", player)
def raft_can_complete_vasagatan(self, player):
return self.raft_can_access_vasagatan(player)
def raft_can_access_balboa_island(self, player):
return (self.raft_can_complete_vasagatan(player)
and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player))
and self.has("Balboa Island Frequency", player))
def raft_can_complete_balboa_island(self, player):
return self.raft_can_access_balboa_island(player) and self.raft_can_craft_machete(player) and self.raft_can_fire_bow(player)
def raft_can_access_caravan_island(self, player):
return self.raft_can_complete_balboa_island(player) and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player)) and self.has("Caravan Island Frequency", player)
def raft_can_complete_caravan_island(self, player):
return self.raft_can_access_caravan_island(player) and self.raft_can_craft_ziplineTool(player)
def raft_can_access_tangaroa(self, player):
return self.raft_can_complete_caravan_island(player) and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player)) and self.has("Tangaroa Frequency", player)
def raft_can_complete_tangaroa(self, player):
return self.raft_can_access_tangaroa(player)
def set_rules(world, player):
regionChecks = {
"Raft": lambda state: True,
"ResearchTable": lambda state: True,
"RadioTower": lambda state: state.raft_can_access_radio_tower(player), # All can_access functions have state as implicit parameter for function
"Vasagatan": lambda state: state.raft_can_complete_radio_tower(player) and state.raft_can_access_vasagatan(player),
"BalboaIsland": lambda state: state.raft_can_complete_vasagatan(player) and state.raft_can_access_balboa_island(player),
"CaravanIsland": lambda state: state.raft_can_complete_balboa_island(player) and state.raft_can_access_caravan_island(player),
"Tangaroa": lambda state: state.raft_can_complete_caravan_island(player) and state.raft_can_access_tangaroa(player)
}
itemChecks = {
"Plank": lambda state: True,
"Plastic": lambda state: True,
"Clay": lambda state: True,
"Stone": lambda state: True,
"Rope": lambda state: True,
"Nail": lambda state: True,
"Scrap": lambda state: True,
"SeaVine": lambda state: True,
"Brick_Dry": lambda state: True,
"Thatch": lambda state: True, # Palm Leaf
"Placeable_GiantClam": lambda state: True,
"Leather": lambda state: state.raft_big_islands_available(player),
"Feather": lambda state: state.raft_big_islands_available(player) or state.raft_can_craft_birdNest(player),
"MetalIngot": lambda state: state.raft_can_smelt_items(player),
"CopperIngot": lambda state: state.raft_can_smelt_items(player),
"VineGoo": lambda state: state.raft_can_smelt_items(player),
"ExplosivePowder": lambda state: state.raft_big_islands_available(player) and state.raft_can_smelt_items(player),
"Glass": lambda state: state.raft_can_smelt_items(player),
"Bolt": lambda state: state.raft_can_craft_bolt(player),
"Hinge": lambda state: state.raft_can_craft_hinge(player),
"CircuitBoard": lambda state: state.raft_can_craft_circuitBoard(player),
"PlasticBottle_Empty": lambda state: state.raft_can_craft_plasticBottle(player),
"Shear": lambda state: state.raft_can_craft_shears(player),
"Wool": lambda state: state.raft_can_capture_animals(player) and state.raft_can_craft_shears(player),
"HoneyComb": lambda state: state.raft_can_access_balboa_island(player),
"Jar_Bee": lambda state: state.raft_can_access_balboa_island(player) and state.raft_can_smelt_items(player),
"Dirt": lambda state: state.raft_can_get_dirt(player),
"Egg": lambda state: state.raft_can_capture_animals(player),
# Specific items for story island location checks
"Machete": lambda state: state.raft_can_craft_machete(player),
"BowAndArrow": lambda state: state.raft_can_fire_bow(player),
"Zipline tool": lambda state: state.raft_can_craft_ziplineTool(player)
}
# Region access rules
for region in regionMap:
if region != "Menu":
for exitRegion in world.get_region(region, player).exits:
set_rule(world.get_entrance(exitRegion.name, player), regionChecks[region])
# Location access rules
for location in location_table:
locFromWorld = world.get_location(location["name"], player)
if "requiresAccessToItems" in location: # Specific item access required
def fullLocationCheck(state, location=location):
canAccess = regionChecks[location["region"]](state)
for item in location["requiresAccessToItems"]:
if not itemChecks[item](state):
canAccess = False
break
return canAccess
set_rule(locFromWorld, fullLocationCheck)
else: # Only region access required
set_rule(locFromWorld, regionChecks[location["region"]])
# Victory requirement
world.completion_condition[player] = lambda state: state.has("Victory", player)