Skip to content

Commit

Permalink
Celeste 64: Implement New Game (ArchipelagoMW#2798)
Browse files Browse the repository at this point in the history
Co-authored-by: chandler05 <[email protected]>
Co-authored-by: Silvris <[email protected]>
Co-authored-by: Zach Parks <[email protected]>
  • Loading branch information
4 people authored Mar 5, 2024
1 parent a5a1494 commit db30a01
Show file tree
Hide file tree
Showing 13 changed files with 534 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ Currently, the following games are supported:
* Final Fantasy Mystic Quest
* TUNIC
* Kirby's Dream Land 3
* Celeste 64

For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
Expand Down
3 changes: 3 additions & 0 deletions docs/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
# Bumper Stickers
/worlds/bumpstik/ @FelicitusNeko

# Celeste 64
/worlds/celeste64/ @PoryGone

# ChecksFinder
/worlds/checksfinder/ @jonloveslegos

Expand Down
58 changes: 58 additions & 0 deletions worlds/celeste64/Items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from typing import Dict, NamedTuple, Optional

from BaseClasses import Item, ItemClassification
from .Names import ItemName


celeste_64_base_id: int = 0xCA0000


class Celeste64Item(Item):
game = "Celeste 64"


class Celeste64ItemData(NamedTuple):
code: Optional[int] = None
type: ItemClassification = ItemClassification.filler


item_data_table: Dict[str, Celeste64ItemData] = {
ItemName.strawberry: Celeste64ItemData(
code = celeste_64_base_id + 0,
type=ItemClassification.progression_skip_balancing,
),
ItemName.dash_refill: Celeste64ItemData(
code = celeste_64_base_id + 1,
type=ItemClassification.progression,
),
ItemName.double_dash_refill: Celeste64ItemData(
code = celeste_64_base_id + 2,
type=ItemClassification.progression,
),
ItemName.feather: Celeste64ItemData(
code = celeste_64_base_id + 3,
type=ItemClassification.progression,
),
ItemName.coin: Celeste64ItemData(
code = celeste_64_base_id + 4,
type=ItemClassification.progression,
),
ItemName.cassette: Celeste64ItemData(
code = celeste_64_base_id + 5,
type=ItemClassification.progression,
),
ItemName.traffic_block: Celeste64ItemData(
code = celeste_64_base_id + 6,
type=ItemClassification.progression,
),
ItemName.spring: Celeste64ItemData(
code = celeste_64_base_id + 7,
type=ItemClassification.progression,
),
ItemName.breakables: Celeste64ItemData(
code = celeste_64_base_id + 8,
type=ItemClassification.progression,
)
}

item_table = {name: data.code for name, data in item_data_table.items() if data.code is not None}
142 changes: 142 additions & 0 deletions worlds/celeste64/Locations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
from typing import Dict, NamedTuple, Optional

from BaseClasses import Location
from .Names import LocationName


celeste_64_base_id: int = 0xCA0000


class Celeste64Location(Location):
game = "Celeste 64"


class Celeste64LocationData(NamedTuple):
region: str
address: Optional[int] = None


location_data_table: Dict[str, Celeste64LocationData] = {
LocationName.strawberry_1 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 0,
),
LocationName.strawberry_2 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 1,
),
LocationName.strawberry_3 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 2,
),
LocationName.strawberry_4 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 3,
),
LocationName.strawberry_5 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 4,
),
LocationName.strawberry_6 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 5,
),
LocationName.strawberry_7 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 6,
),
LocationName.strawberry_8 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 7,
),
LocationName.strawberry_9 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 8,
),
LocationName.strawberry_10 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 9,
),
LocationName.strawberry_11 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 10,
),
LocationName.strawberry_12 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 11,
),
LocationName.strawberry_13 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 12,
),
LocationName.strawberry_14 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 13,
),
LocationName.strawberry_15 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 14,
),
LocationName.strawberry_16 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 15,
),
LocationName.strawberry_17 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 16,
),
LocationName.strawberry_18 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 17,
),
LocationName.strawberry_19 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 18,
),
LocationName.strawberry_20 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 19,
),
LocationName.strawberry_21 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 20,
),
LocationName.strawberry_22 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 21,
),
LocationName.strawberry_23 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 22,
),
LocationName.strawberry_24 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 23,
),
LocationName.strawberry_25 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 24,
),
LocationName.strawberry_26 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 25,
),
LocationName.strawberry_27 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 26,
),
LocationName.strawberry_28 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 27,
),
LocationName.strawberry_29 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 28,
),
LocationName.strawberry_30 : Celeste64LocationData(
region = "Forsaken City",
address = celeste_64_base_id + 29,
)
}

location_table = {name: data.address for name, data in location_data_table.items() if data.address is not None}
11 changes: 11 additions & 0 deletions worlds/celeste64/Names/ItemName.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
strawberry = "Strawberry"

dash_refill = "Dash Refills"
double_dash_refill = "Double Dash Refills"
feather = "Feathers"
coin = "Coins"
cassette = "Cassettes"

traffic_block = "Traffic Blocks"
spring = "Springs"
breakables = "Breakable Blocks"
31 changes: 31 additions & 0 deletions worlds/celeste64/Names/LocationName.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Strawberry Locations
strawberry_1 = "First Strawberry"
strawberry_2 = "Floating Blocks Strawberry"
strawberry_3 = "South-East Tower Top Strawberry"
strawberry_4 = "Theo Strawberry"
strawberry_5 = "Fall Through Spike Floor Strawberry"
strawberry_6 = "Troll Strawberry"
strawberry_7 = "Falling Blocks Strawberry"
strawberry_8 = "Traffic Block Strawberry"
strawberry_9 = "South-West Dash Refills Strawberry"
strawberry_10 = "South-East Tower Side Strawberry"
strawberry_11 = "Girders Strawberry"
strawberry_12 = "North-East Tower Bottom Strawberry"
strawberry_13 = "Breakable Blocks Strawberry"
strawberry_14 = "Feather Maze Strawberry"
strawberry_15 = "Feather Chain Strawberry"
strawberry_16 = "Feather Hidden Strawberry"
strawberry_17 = "Double Dash Puzzle Strawberry"
strawberry_18 = "Double Dash Spike Climb Strawberry"
strawberry_19 = "Double Dash Spring Strawberry"
strawberry_20 = "North-East Tower Breakable Bottom Strawberry"
strawberry_21 = "Theo Tower Lower Cassette Strawberry"
strawberry_22 = "Theo Tower Upper Cassette Strawberry"
strawberry_23 = "South End of Bridge Cassette Strawberry"
strawberry_24 = "You Are Ready Cassette Strawberry"
strawberry_25 = "Cassette Hidden in the House Strawberry"
strawberry_26 = "North End of Bridge Cassette Strawberry"
strawberry_27 = "Distant Feather Cassette Strawberry"
strawberry_28 = "Feather Arches Cassette Strawberry"
strawberry_29 = "North-East Tower Cassette Strawberry"
strawberry_30 = "Badeline Cassette Strawberry"
Empty file.
25 changes: 25 additions & 0 deletions worlds/celeste64/Options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from dataclasses import dataclass

from Options import Range, DeathLink, PerGameCommonOptions


class StrawberriesRequired(Range):
"""How many Strawberries you must receive to finish"""
display_name = "Strawberries Required"
range_start = 0
range_end = 20
default = 15

class DeathLinkAmnesty(Range):
"""How many deaths it takes to send a DeathLink"""
display_name = "Death Link Amnesty"
range_start = 1
range_end = 30
default = 10


@dataclass
class Celeste64Options(PerGameCommonOptions):
death_link: DeathLink
death_link_amnesty: DeathLinkAmnesty
strawberries_required: StrawberriesRequired
11 changes: 11 additions & 0 deletions worlds/celeste64/Regions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from typing import Dict, List, NamedTuple


class Celeste64RegionData(NamedTuple):
connecting_regions: List[str] = []


region_data_table: Dict[str, Celeste64RegionData] = {
"Menu": Celeste64RegionData(["Forsaken City"]),
"Forsaken City": Celeste64RegionData(),
}
Loading

0 comments on commit db30a01

Please sign in to comment.