93 lines
3.3 KiB
Python
93 lines
3.3 KiB
Python
|
from typing import List
|
|||
|
|
|||
|
from BaseClasses import ItemClassification, Region, Tutorial
|
|||
|
from worlds.AutoWorld import WebWorld, World
|
|||
|
from .Items import Celeste64Item, item_data_table, item_table
|
|||
|
from .Locations import Celeste64Location, location_data_table, location_table
|
|||
|
from .Names import ItemName
|
|||
|
from .Options import Celeste64Options
|
|||
|
|
|||
|
|
|||
|
class Celeste64WebWorld(WebWorld):
|
|||
|
theme = "ice"
|
|||
|
|
|||
|
setup_en = Tutorial(
|
|||
|
tutorial_name="Start Guide",
|
|||
|
description="A guide to playing Celeste 64 in Archipelago.",
|
|||
|
language="English",
|
|||
|
file_name="guide_en.md",
|
|||
|
link="guide/en",
|
|||
|
authors=["PoryGone"]
|
|||
|
)
|
|||
|
|
|||
|
tutorials = [setup_en]
|
|||
|
|
|||
|
|
|||
|
class Celeste64World(World):
|
|||
|
"""Relive the magic of Celeste Mountain alongside Madeline in this small, heartfelt 3D platformer.
|
|||
|
Created in a week(ish) by the Celeste team to celebrate the game’s sixth anniversary 🍓✨"""
|
|||
|
|
|||
|
game = "Celeste 64"
|
|||
|
web = Celeste64WebWorld()
|
|||
|
options_dataclass = Celeste64Options
|
|||
|
options: Celeste64Options
|
|||
|
location_name_to_id = location_table
|
|||
|
item_name_to_id = item_table
|
|||
|
|
|||
|
|
|||
|
def create_item(self, name: str) -> Celeste64Item:
|
|||
|
# Only make required amount of strawberries be Progression
|
|||
|
if getattr(self, "options", None) and name == ItemName.strawberry:
|
|||
|
classification: ItemClassification = ItemClassification.filler
|
|||
|
self.prog_strawberries = getattr(self, "prog_strawberries", 0)
|
|||
|
if self.prog_strawberries < self.options.strawberries_required.value:
|
|||
|
classification = ItemClassification.progression_skip_balancing
|
|||
|
self.prog_strawberries += 1
|
|||
|
|
|||
|
return Celeste64Item(name, classification, item_data_table[name].code, self.player)
|
|||
|
else:
|
|||
|
return Celeste64Item(name, item_data_table[name].type, item_data_table[name].code, self.player)
|
|||
|
|
|||
|
def create_items(self) -> None:
|
|||
|
item_pool: List[Celeste64Item] = []
|
|||
|
|
|||
|
item_pool += [self.create_item(name) for name in item_data_table.keys()]
|
|||
|
|
|||
|
item_pool += [self.create_item(ItemName.strawberry) for _ in range(21)]
|
|||
|
|
|||
|
self.multiworld.itempool += item_pool
|
|||
|
|
|||
|
|
|||
|
def create_regions(self) -> None:
|
|||
|
from .Regions import region_data_table
|
|||
|
# Create regions.
|
|||
|
for region_name in region_data_table.keys():
|
|||
|
region = Region(region_name, self.player, self.multiworld)
|
|||
|
self.multiworld.regions.append(region)
|
|||
|
|
|||
|
# Create locations.
|
|||
|
for region_name, region_data in region_data_table.items():
|
|||
|
region = self.multiworld.get_region(region_name, self.player)
|
|||
|
region.add_locations({
|
|||
|
location_name: location_data.address for location_name, location_data in location_data_table.items()
|
|||
|
if location_data.region == region_name
|
|||
|
}, Celeste64Location)
|
|||
|
region.add_exits(region_data_table[region_name].connecting_regions)
|
|||
|
|
|||
|
|
|||
|
def get_filler_item_name(self) -> str:
|
|||
|
return ItemName.strawberry
|
|||
|
|
|||
|
|
|||
|
def set_rules(self) -> None:
|
|||
|
from .Rules import set_rules
|
|||
|
set_rules(self)
|
|||
|
|
|||
|
|
|||
|
def fill_slot_data(self):
|
|||
|
return {
|
|||
|
"death_link": self.options.death_link.value,
|
|||
|
"death_link_amnesty": self.options.death_link_amnesty.value,
|
|||
|
"strawberries_required": self.options.strawberries_required.value
|
|||
|
}
|