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)