Files
Grinch-AP/worlds/cccharles/__init__.py

172 lines
6.7 KiB
Python
Raw Normal View History

Choo-Choo Charles: implement new game and documentations (#5287) * Add cccharles world to AP > The logic has been tested, the game can be completed > The logic is simple and it does not take into account options ! The documentations are a work in progress * Update documentations > Redacted French and English Setup Guides > Redacted French and English Game Pages * Handling PR#5287 remarks > Revert unexpected changes on .run\Archipelago Unittests.run.xml (base Archipelago file) > Fixed typo "querty" -> "qwerty" in fr and eng Game Pages > Adding "Game page in other languages" section to eng Game Page documentation > Improved Steam path in fr and eng Setup Guides * Handled PR remarks + fixes > Added get_filler_item_name() to remove warnings > Fixed irrelevant links for documentations > Used the Player Options page instead of the default YAML on GitHub > Reworded all locations to make them simple and clear > Split some locations that can be linked with an entrance rule > Reworked all options > Updated regions according to locations > Replaced unnecessary rules by rules on entrances * Empty Options.py Only the base options are handled yet, "work in progress" features removed. * Handled PR remark > Fixed specific UT name * Handled PR remarks > UT updated by replacing depreciated features * Add start_inventory_from_pool as option This start_inventory_from_pool option is like regular start inventory but it takes items from the pool and replaces them with fillers Co-authored-by: Scipio Wright <scipiowright@gmail.com> * Handled PR remarks > Mainly fixed editorial and minor issues without impact on UT results (still passed) * Update the guides according to releases > Updated the depreciated guides because the may to release the Mod has been changed > Removed the fixed issues from 'Known Issues' > Add the "Mod Download" section to simplify the others sections. * Handled PR remark > base_id reduced to ensure it fits to signed int (32 bits) in case of future AP improvements * Handled PR remarks > Set topology_present to False because unnecessary > Added an exception in case of unknown item instead of using filler classification > Fixed an issue that caused the "Bug Spray" to be considered as filler > Reworked the test_claire_breakers() test to ensure the lighthouse mission can only be finished if at least 4 breakers are collected * Added Choo-Choo Charles to README.md * CCCharles: Added rules to win > The victory could be accessed from sphere 1, this is now fixed by adding the following items as requirements: - Temple Key - Green Egg - Blue Egg - Red Egg --------- Co-authored-by: Scipio Wright <scipiowright@gmail.com>
2025-09-08 10:37:51 +02:00
from .Items import CCCharlesItem, unique_item_dict, full_item_list, item_groups
from .Locations import location_table
from .Options import CCCharlesOptions
from .Rules import set_rules
from .Regions import create_regions
from BaseClasses import Tutorial, ItemClassification
from worlds.AutoWorld import World, WebWorld
class CCCharlesWeb(WebWorld):
"""
Choo-Choo Charles is a horror game.
A devil spider train from hell called Charles chases any person it finds on an island.
The goal is to gather scraps to upgrade a train to fight Charles and travel by train to find 3 eggs
to lead Charles to a brutal death and save the island.
"""
theme = "stone"
setup_en = Tutorial(
"Multiworld Setup Guide",
"A guide to setup Choo-Choo Charles for the Archipelago MultiWorld Randomizer.",
"English",
"setup_en.md",
"setup/en",
["Yaranorgoth"]
)
setup_fr = Tutorial(
"Guide d'Installation Multiworld",
"Un guide pour mettre en place Choo-Choo Charles pour le Randomiseur Multiworld Archipelago",
"Français",
"setup_fr.md",
"setup/fr",
["Yaranorgoth"]
)
tutorials = [setup_en, setup_fr]
game_info_languages = ["en", "fr"]
rich_text_options_doc = True
class CCCharlesWorld(World):
"""
An independent 3D horror game, taking place on an island.
The main gameplay consists of traveling and fighting a monster on board a train.
Upgrading the train requires leaving the train to gather resources with the threat of encountering the monster.
"""
game = "Choo-Choo Charles"
web = CCCharlesWeb()
item_name_to_id = unique_item_dict
location_name_to_id = location_table
item_name_groups = item_groups
# Options the player can set
options_dataclass = CCCharlesOptions
# Typing hints for all the options we defined
options: CCCharlesOptions
topology_present = False # Hide path to required location checks in spoiler
def create_regions(self) -> None:
create_regions(self.multiworld, self.options, self.player)
def create_item(self, name: str) -> CCCharlesItem:
item_id = unique_item_dict[name]
match name:
case "Scraps":
classification = ItemClassification.useful
case "30 Scraps Reward":
classification = ItemClassification.useful
case "25 Scraps Reward":
classification = ItemClassification.useful
case "35 Scraps Reward":
classification = ItemClassification.useful
case "40 Scraps Reward":
classification = ItemClassification.useful
case "South Mine Key":
classification = ItemClassification.progression
case "North Mine Key":
classification = ItemClassification.progression
case "Mountain Ruin Key":
classification = ItemClassification.progression
case "Barn Key":
classification = ItemClassification.progression
case "Candice's Key":
classification = ItemClassification.progression
case "Dead Fish":
classification = ItemClassification.progression
case "Lockpicks":
classification = ItemClassification.progression
case "Ancient Tablet":
classification = ItemClassification.progression
case "Blue Box":
classification = ItemClassification.progression
case "Page Drawing":
classification = ItemClassification.progression
case "Journal":
classification = ItemClassification.progression
case "Timed Dynamite":
classification = ItemClassification.progression
case "Box of Rockets":
classification = ItemClassification.progression
case "Breaker":
classification = ItemClassification.progression
case "Broken Bob":
classification = ItemClassification.progression
case "Employment Contracts":
classification = ItemClassification.progression
case "Mob Camp Key":
classification = ItemClassification.progression
case "Jar of Pickles":
classification = ItemClassification.progression
case "Orange Paint Can":
classification = ItemClassification.filler
case "Green Paint Can":
classification = ItemClassification.filler
case "White Paint Can":
classification = ItemClassification.filler
case "Pink Paint Can":
classification = ItemClassification.filler
case "Grey Paint Can":
classification = ItemClassification.filler
case "Blue Paint Can":
classification = ItemClassification.filler
case "Black Paint Can":
classification = ItemClassification.filler
case "Lime Paint Can":
classification = ItemClassification.filler
case "Teal Paint Can":
classification = ItemClassification.filler
case "Red Paint Can":
classification = ItemClassification.filler
case "Purple Paint Can":
classification = ItemClassification.filler
case "The Boomer":
classification = ItemClassification.filler
case "Bob":
classification = ItemClassification.filler
case "Green Egg":
classification = ItemClassification.progression
case "Blue Egg":
classification = ItemClassification.progression
case "Red Egg":
classification = ItemClassification.progression
case "Remote Explosive":
classification = ItemClassification.progression
case "Remote Explosive x8":
classification = ItemClassification.progression
case "Temple Key":
classification = ItemClassification.progression
case "Bug Spray":
classification = ItemClassification.progression
case _: # Should not occur
raise Exception("Unexpected case met: classification cannot be set for unknown item \"" + name + "\"")
return CCCharlesItem(name, classification, item_id, self.player)
def create_items(self) -> None:
self.multiworld.itempool += [self.create_item(item) for item in full_item_list]
def set_rules(self) -> None:
set_rules(self.multiworld, self.options, self.player)
def get_filler_item_name(self) -> str:
return "Scraps"