diff --git a/README.md b/README.md index 9e3d6a45..2c49aba9 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Currently, the following games are supported: * The Messenger * Kingdom Hearts 2 * The Legend of Zelda: Link's Awakening DX +* Clique 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 diff --git a/worlds/clique/Options.py b/worlds/clique/Options.py new file mode 100644 index 00000000..1d74d2c5 --- /dev/null +++ b/worlds/clique/Options.py @@ -0,0 +1,13 @@ +from typing import Dict + +from Options import Option, Toggle + + +class HardMode(Toggle): + """Only for masochists: requires 2 presses!""" + display_name = "Hard Mode" + + +clique_options: Dict[str, type(Option)] = { + "hard_mode": HardMode +} diff --git a/worlds/clique/__init__.py b/worlds/clique/__init__.py new file mode 100644 index 00000000..c73d0437 --- /dev/null +++ b/worlds/clique/__init__.py @@ -0,0 +1,109 @@ +from BaseClasses import Entrance, Item, ItemClassification, Location, MultiWorld, Region, Tutorial +from worlds.AutoWorld import WebWorld, World +from worlds.generic.Rules import set_rule +from .Options import clique_options + +item_table = { + "The feeling of satisfaction.": 69696969, + "Button Key": 69696968, +} + +location_table = { + "The Button": 69696969, + "The Desk": 69696968, +} + + +class CliqueWebWorld(WebWorld): + theme = "partyTime" + tutorials = [ + Tutorial( + tutorial_name="Start Guide", + description="A guide to playing Clique.", + language="English", + file_name="guide_en.md", + link="guide/en", + authors=["Phar"] + ) + ] + + +class CliqueWorld(World): + """The greatest game ever designed. Full of exciting gameplay!""" + + game = "Clique" + topology_present = False + data_version = 1 + web = CliqueWebWorld() + option_definitions = clique_options + + location_name_to_id = location_table + item_name_to_id = item_table + + def create_item(self, name: str) -> "Item": + return Item(name, ItemClassification.progression, self.item_name_to_id[name], self.player) + + def get_setting(self, name: str): + return getattr(self.multiworld, name)[self.player] + + def fill_slot_data(self) -> dict: + return {option_name: self.get_setting(option_name).value for option_name in self.option_definitions} + + def generate_basic(self) -> None: + self.multiworld.itempool.append(self.create_item("The feeling of satisfaction.")) + + if self.multiworld.hard_mode[self.player]: + self.multiworld.itempool.append(self.create_item("Button Key")) + + def create_regions(self) -> None: + if self.multiworld.hard_mode[self.player]: + self.multiworld.regions += [ + create_region(self.multiworld, self.player, "Menu", None, ["Entrance to THE BUTTON"]), + create_region(self.multiworld, self.player, "THE BUTTON", self.location_name_to_id) + ] + else: + self.multiworld.regions += [ + create_region(self.multiworld, self.player, "Menu", None, ["Entrance to THE BUTTON"]), + create_region(self.multiworld, self.player, "THE BUTTON", {"The Button": 69696969}) + ] + + self.multiworld.get_entrance("Entrance to THE BUTTON", self.player)\ + .connect(self.multiworld.get_region("THE BUTTON", self.player)) + + def get_filler_item_name(self) -> str: + return self.multiworld.random.choice(item_table) + + def set_rules(self) -> None: + if self.multiworld.hard_mode[self.player]: + set_rule( + self.multiworld.get_location("The Button", self.player), + lambda state: state.has("Button Key", self.player) + ) + + self.multiworld.completion_condition[self.player] = lambda state: \ + state.has("Button Key", self.player) + else: + self.multiworld.completion_condition[self.player] = lambda state: \ + state.has("The feeling of satisfaction.", self.player) + + +def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): + region = Region(name, player, world) + if locations: + for location_name in locations.keys(): + location = CliqueLocation(player, location_name, locations[location_name], region) + region.locations.append(location) + + if exits: + for _exit in exits: + region.exits.append(Entrance(player, _exit, region)) + + return region + + +class CliqueItem(Item): + game = "Clique" + + +class CliqueLocation(Location): + game: str = "Clique" diff --git a/worlds/clique/docs/en_Clique.md b/worlds/clique/docs/en_Clique.md new file mode 100644 index 00000000..bf0562e2 --- /dev/null +++ b/worlds/clique/docs/en_Clique.md @@ -0,0 +1,11 @@ +# Clique + +## What is this game? + +Even I don't know. + +## Where is the settings page? + +The [player settings page for this game](../player-settings) contains all the options you need to configure +and export a config file. + diff --git a/worlds/clique/docs/guide_en.md b/worlds/clique/docs/guide_en.md new file mode 100644 index 00000000..7b4b0f1c --- /dev/null +++ b/worlds/clique/docs/guide_en.md @@ -0,0 +1,6 @@ +# Clique Start Guide + +Go to the [Clique Game](http://clique.darkshare.site.nfoservers.com/) and enter the hostname:ip address, +then your slot name. + +Enjoy. \ No newline at end of file