74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
from typing import Set
|
|
|
|
from ..AutoWorld import World, LogicMixin
|
|
from .Items import item_table, default_pool
|
|
from .Locations import lookup_name_to_id
|
|
from .Rules import set_rules, location_rules
|
|
from .Regions import locations_by_region, connectors
|
|
from .Options import options
|
|
from BaseClasses import Region, Item, Location, RegionType, Entrance
|
|
|
|
|
|
class OriBlindForest(World):
|
|
game: str = "Ori and the Blind Forest"
|
|
|
|
topology_present = True
|
|
|
|
item_name_to_id = item_table
|
|
location_name_to_id = lookup_name_to_id
|
|
|
|
options = options
|
|
|
|
hidden = True
|
|
|
|
def generate_early(self):
|
|
logic_sets = {"casual-core"}
|
|
for logic_set in location_rules:
|
|
if logic_set != "casual-core" and getattr(self.world, logic_set.replace("-", "_")):
|
|
logic_sets.add(logic_set)
|
|
self.logic_sets = logic_sets
|
|
|
|
set_rules = set_rules
|
|
|
|
def create_region(self, name: str):
|
|
return Region(name, RegionType.Generic, name, self.player, self.world)
|
|
|
|
def create_regions(self):
|
|
world = self.world
|
|
menu = self.create_region("Menu")
|
|
world.regions.append(menu)
|
|
start = Entrance(self.player, "Start Game", menu)
|
|
menu.exits.append(start)
|
|
|
|
# workaround for now, remove duplicate locations
|
|
already_placed_locations = set()
|
|
|
|
for region_name, locations in locations_by_region.items():
|
|
locations -= already_placed_locations
|
|
already_placed_locations |= locations
|
|
region = self.create_region(region_name)
|
|
if region_name == "SunkenGladesRunaway": # starting point
|
|
start.connect(region)
|
|
region.locations = {Location(self.player, location, lookup_name_to_id[location], region)
|
|
for location in locations}
|
|
world.regions.append(region)
|
|
|
|
for region_name, exits in connectors.items():
|
|
parent = world.get_region(region_name, self.player)
|
|
for exit in exits:
|
|
connection = Entrance(self.player, exit, parent)
|
|
connection.connect(world.get_region(exit, self.player))
|
|
parent.exits.append(connection)
|
|
|
|
def generate_basic(self):
|
|
for item_name, count in default_pool.items():
|
|
self.world.itempool.extend([self.create_item(item_name)] * count)
|
|
|
|
def create_item(self, name: str) -> Item:
|
|
return Item(name, not name.startswith("EX"), item_table[name], self.player)
|
|
|
|
|
|
class OriBlindForestLogic(LogicMixin):
|
|
def _oribf_has_all(self, items: Set[str], player:int):
|
|
return all(self.prog_items[item, player] if type(item) == str
|
|
else self.prog_items[item[0], player] >= item[1] for item in items) |