Celeste (Open World): Post-merge Logic Fix (#5415)

* APWorld Skeleton

* Hair Color Rando and first items

* All interactable items

* Checkpoint Items and Locations

* First pass sample intermediate data

* Bulk of Region/location code

* JSON Data Parser

* New items and Level Item mapping

* Data Parsing fixes and most of 1a data

* 1a complete data and region/location/item creation fixes

* Add Key Location type and ID output

* Add options to slot data

* 1B Level Data

* Added Location logging

* Add Goal Area Options

* 1c Level Data

* Old Site A B C level data

* Key/Binosanity and Hair Length options

* Key Item/Location and Clutter Event handling

* Remove generic 'keys' item

* 3a level data

* 3b and 3c level data

* Chapter 4 level data

* Chapter 5 Logic Data

* Chapter 5 level data

* Trap Support

* Add TrapLink Support

* Chapter 6 A/B/C Level Data

* Add active_levels to slot_data

* Item and Location Name Groups + style cleanups

* Chapter 7 Level Data and Items, Gemsanity option

* Goal Area and victory handling

* Fix slot_data

* Add Core Level Data

* Carsanity

* Farewell Level Data and ID Range Update

* Farewell level data and handling

* Music Shuffle

* Require Cassettes

* Change default trap expiration action to Deaths

* Handle Poetry

* Mod versioning

* Rename folder, general cleanup

* Additional Cleanup

* Handle Farewell Golden Goal when Include Goldens is off

* Better handling of Farewell Golden

* Update Docs

* Beta test bug fixes

* Bump to v1.0.0

* Update Changelog

* Several Logic tweaks

* Update APWorld Version

* Add Celeste (Open World) to README

* Peer review changes

* Logic Fixes:

* Adjust Mirror Temple B Key logic

* Increment APWorld version

* Fix several logic bugs

* Add missing link

* Add Item Name Groups for common alternative item names

* Account for Madeline's post-Celeste hair-dying activities

* Account for ignored member variable and hardcoded color in Celeste codebase

* Add Blue Clouds to the logic of reaching Farewell - intro-02-launch

* Type checking workaround

* Bump version number

* Adjust Setup Guide

* Minor typing fixes

* Logic and PR fixes

* Increment APWorld Version

* Use more world helpers

* Core review

* CODEOWNERS

* Minor logic fix and insert APWorld version into spoiler

* Fix merge error
This commit is contained in:
PoryGone
2025-09-03 21:50:59 -04:00
committed by GitHub
parent 3c28db0800
commit e342a20fde
3 changed files with 16 additions and 6 deletions

View File

@@ -1,5 +1,6 @@
from copy import deepcopy from copy import deepcopy
import math import math
from typing import TextIO
from BaseClasses import ItemClassification, Location, MultiWorld, Region, Tutorial from BaseClasses import ItemClassification, Location, MultiWorld, Region, Tutorial
from Utils import visualize_regions from Utils import visualize_regions
@@ -41,6 +42,8 @@ class CelesteOpenWorld(World):
options_dataclass = CelesteOptions options_dataclass = CelesteOptions
options: CelesteOptions options: CelesteOptions
apworld_version = 10005
level_data: dict[str, Level] = load_logic_data() level_data: dict[str, Level] = load_logic_data()
location_name_to_id: dict[str, int] = location_data_table location_name_to_id: dict[str, int] = location_data_table
@@ -251,7 +254,7 @@ class CelesteOpenWorld(World):
def fill_slot_data(self): def fill_slot_data(self):
return { return {
"apworld_version": 10004, "apworld_version": self.apworld_version,
"min_mod_version": 10000, "min_mod_version": 10000,
"death_link": self.options.death_link.value, "death_link": self.options.death_link.value,
@@ -292,6 +295,13 @@ class CelesteOpenWorld(World):
"chosen_poem": self.random.randint(0, 119), "chosen_poem": self.random.randint(0, 119),
} }
@classmethod
def stage_write_spoiler_header(cls, multiworld: MultiWorld, spoiler_handle: TextIO):
major: int = cls.apworld_version // 10000
minor: int = (cls.apworld_version % 10000) // 100
bugfix: int = (cls.apworld_version % 100)
spoiler_handle.write(f"\nCeleste (Open World) APWorld v{major}.{minor}.{bugfix}\n")
def output_active_traps(self) -> dict[int, int]: def output_active_traps(self) -> dict[int, int]:
trap_data = {} trap_data = {}

View File

@@ -37055,6 +37055,10 @@
{ {
"dest": "north-west", "dest": "north-west",
"rule": [ [ "double_dash_refills", "springs", "dash_switches" ] ] "rule": [ [ "double_dash_refills", "springs", "dash_switches" ] ]
},
{
"dest": "south-east-door",
"rule": []
} }
] ]
}, },
@@ -37082,10 +37086,6 @@
"dest": "north-east-door", "dest": "north-east-door",
"rule": [] "rule": []
}, },
{
"dest": "south-east-door",
"rule": []
},
{ {
"dest": "south-west-door", "dest": "south-west-door",
"rule": [] "rule": []

View File

@@ -4771,11 +4771,11 @@ all_region_connections: dict[str, RegionConnection] = {
"10a_d-00_north---10a_d-00_south": RegionConnection("10a_d-00_north", "10a_d-00_south", [["Farewell - Power Source Key 5", ], ]), "10a_d-00_north---10a_d-00_south": RegionConnection("10a_d-00_north", "10a_d-00_south", [["Farewell - Power Source Key 5", ], ]),
"10a_d-00_south-east---10a_d-00_south": RegionConnection("10a_d-00_south-east", "10a_d-00_south", [[ItemName.double_dash_refills, ItemName.dash_switches, ], ]), "10a_d-00_south-east---10a_d-00_south": RegionConnection("10a_d-00_south-east", "10a_d-00_south", [[ItemName.double_dash_refills, ItemName.dash_switches, ], ]),
"10a_d-00_south-east---10a_d-00_north-west": RegionConnection("10a_d-00_south-east", "10a_d-00_north-west", [[ItemName.double_dash_refills, ItemName.springs, ItemName.dash_switches, ], ]), "10a_d-00_south-east---10a_d-00_north-west": RegionConnection("10a_d-00_south-east", "10a_d-00_north-west", [[ItemName.double_dash_refills, ItemName.springs, ItemName.dash_switches, ], ]),
"10a_d-00_south-east---10a_d-00_south-east-door": RegionConnection("10a_d-00_south-east", "10a_d-00_south-east-door", []),
"10a_d-00_north-west---10a_d-00_south": RegionConnection("10a_d-00_north-west", "10a_d-00_south", [[ItemName.jellyfish, ItemName.dash_switches, ], ]), "10a_d-00_north-west---10a_d-00_south": RegionConnection("10a_d-00_north-west", "10a_d-00_south", [[ItemName.jellyfish, ItemName.dash_switches, ], ]),
"10a_d-00_north-west---10a_d-00_breaker": RegionConnection("10a_d-00_north-west", "10a_d-00_breaker", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ItemName.breaker_boxes, ], ]), "10a_d-00_north-west---10a_d-00_breaker": RegionConnection("10a_d-00_north-west", "10a_d-00_breaker", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ItemName.breaker_boxes, ], ]),
"10a_d-00_breaker---10a_d-00_south": RegionConnection("10a_d-00_breaker", "10a_d-00_south", []), "10a_d-00_breaker---10a_d-00_south": RegionConnection("10a_d-00_breaker", "10a_d-00_south", []),
"10a_d-00_breaker---10a_d-00_north-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-east-door", []), "10a_d-00_breaker---10a_d-00_north-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-east-door", []),
"10a_d-00_breaker---10a_d-00_south-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-east-door", []),
"10a_d-00_breaker---10a_d-00_south-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-west-door", []), "10a_d-00_breaker---10a_d-00_south-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-west-door", []),
"10a_d-00_breaker---10a_d-00_west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_west-door", []), "10a_d-00_breaker---10a_d-00_west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_west-door", []),
"10a_d-00_breaker---10a_d-00_north-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-west-door", []), "10a_d-00_breaker---10a_d-00_north-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-west-door", []),