| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | # Adding Games
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | Like all contributions to Archipelago, New Game implementations should follow the [Contributing](/docs/contributing.md) | 
					
						
							|  |  |  | guide. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | Adding a new game to Archipelago has two major parts: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * Game Modification to communicate with Archipelago server (hereafter referred to as "client") | 
					
						
							|  |  |  | * Archipelago Generation and Server integration plugin (hereafter referred to as "world") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This document will attempt to illustrate the bare minimum requirements and expectations of both parts of a new world | 
					
						
							|  |  |  | integration. As game modification wildly varies by system and engine, and has no bearing on the Archipelago protocol, | 
					
						
							|  |  |  | it will not be detailed here. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Client
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The client is an intermediary program between the game and the Archipelago server. This can either be a direct | 
					
						
							|  |  |  | modification to the game, an external program, or both. This can be implemented in nearly any modern language, but it | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | must fulfill a few requirements in order to function as expected. Libraries for most modern languages and the spec for  | 
					
						
							|  |  |  | various packets can be found in the [network protocol](/docs/network%20protocol.md) API reference document. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Hard Requirements
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In order for the game client to behave as expected, it must be able to perform these functions: | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | * Handle both secure and unsecure websocket connections | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | * Reconnect if the connection is unstable and lost while playing | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | * Be able to change the port for saved connection info | 
					
						
							|  |  |  |   * Rooms hosted on the website attempt to reserve their port, but since there are a limited number of ports, this | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  |     privilege can be lost, requiring the room to be moved to a new port | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | * Send a status update packet alerting the server that the player has completed their goal | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | Regarding items and locations, the game client must be able to handle these tasks: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Location Handling
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Send a network packet to the server when it detects a location has been "checked" by the player in-game. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * If actions were taken in game that would usually trigger a location check, and those actions can only ever be taken  | 
					
						
							|  |  |  |   once, but the client was not connected when they happened: The client must send those location checks on connection  | 
					
						
							|  |  |  |   so that they are not permanently lost, e.g. by reading flags in the game state or save file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Item Handling
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Receive and parse network packets from the server when the player receives an item. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * It must reward items to the player on demand, as items can come from other players at any time. | 
					
						
							|  |  |  | * It must be able to reward copies of an item, up to and beyond the number the game normally expects. This may happen | 
					
						
							|  |  |  |   due to features such as starting inventory, item link replacement, admin commands, or item cheating. **Any** of  | 
					
						
							|  |  |  |   your items can be received **any** number of times. | 
					
						
							|  |  |  | * Admins and players may use server commands to create items without a player or location attributed to them. The | 
					
						
							|  |  |  |   client must be able to handle these items. | 
					
						
							|  |  |  | * It must keep an index for items received in order to resync. The ItemsReceived Packets are a single list with a | 
					
						
							|  |  |  |   guaranteed order. | 
					
						
							|  |  |  | * It must be able to receive items that were sent to the player while they were not connected to the server. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Encouraged Features
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These are "nice to have" features for a client, but they are not strictly required. It is encouraged to add them  | 
					
						
							|  |  |  | if possible. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * If your client appears in the Archipelago Launcher, you may define an icon for it that differentiates it from | 
					
						
							| 
									
										
										
										
											2025-04-10 13:21:33 -04:00
										 |  |  |   other clients. The icon size is 48x48 pixels, but smaller or larger images will scale to that size. | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## World
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The world is your game integration for the Archipelago generator, webhost, and multiworld server. It contains all the | 
					
						
							|  |  |  | information necessary for creating the items and locations to be randomized, the logic for item placement, the  | 
					
						
							|  |  |  | datapackage information so other game clients can recognize your game data, and documentation. Your world must be | 
					
						
							|  |  |  | written as a Python package to be loaded by Archipelago. This is currently done by creating a fork of the Archipelago | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | repository and creating a new world package in `/worlds/`.  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The base World class can be found in [AutoWorld](/worlds/AutoWorld.py). Methods available for your world to call  | 
					
						
							|  |  |  | during generation can be found in [BaseClasses](/BaseClasses.py) and [Fill](/Fill.py). Some examples and documentation  | 
					
						
							|  |  |  | regarding the API can be found in the [world api doc](/docs/world%20api.md). Before publishing, make sure to also  | 
					
						
							|  |  |  | check out [world maintainer.md](/docs/world%20maintainer.md). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Hard Requirements
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A bare minimum world implementation must satisfy the following requirements: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * It has a folder with the name of your game (or an abbreviation) under `/worlds/`  | 
					
						
							|  |  |  | * The `/worlds/{game}` folder contains an `__init__.py` | 
					
						
							|  |  |  | * Any subfolders within `/worlds/{game}` that contain `*.py` files also contain an `__init__.py` for frozen build  | 
					
						
							|  |  |  |   packaging | 
					
						
							|  |  |  | * The game folder has at least one game_info doc named with follow the format `{language_code}_{game_name}.md` | 
					
						
							|  |  |  | * The game folder has at least one setup doc | 
					
						
							|  |  |  | * There must be a `World` subclass in your game folder (typically in `/worlds/{game}/__init__.py`) where you create  | 
					
						
							|  |  |  |   your world and define all of its rules and features | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Within the `World` subclass you should also have: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * A [unique game name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L260) | 
					
						
							|  |  |  | * An [instance](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L295) of a `WebWorld`  | 
					
						
							|  |  |  | subclass for webhost documentation and behaviors | 
					
						
							|  |  |  |   * In your `WebWorld`, if you wrote a game_info doc in more than one language, override the list of  | 
					
						
							|  |  |  |     [game info languages](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L210) with the  | 
					
						
							|  |  |  |     ones you include. | 
					
						
							|  |  |  |   * In your `WebWorld`, override the list of  | 
					
						
							|  |  |  |     [tutorials](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L213) with each tutorial | 
					
						
							|  |  |  |     or setup doc you included in the game folder. | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | * A mapping for items and locations defining their names and ids for clients to be able to identify them. These are  | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  |   `item_name_to_id` and `location_name_to_id`, respectively. | 
					
						
							|  |  |  | * An implementation of `create_item` that can create an item when called by either your code or by another process  | 
					
						
							|  |  |  |   within Archipelago | 
					
						
							|  |  |  | * At least one `Region` for your player to start from (i.e. the Origin Region) | 
					
						
							|  |  |  |   * The default name of this region is "Menu" but you may configure a different name with  | 
					
						
							|  |  |  |     [origin_region_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L298-L299) | 
					
						
							|  |  |  | * A non-zero number of locations, added to your regions | 
					
						
							|  |  |  | * A non-zero number of items **equal** to the number of locations, added to the multiworld itempool | 
					
						
							|  |  |  |   * In rare cases, there may be 0-location-0-item games, but this is extremely atypical. | 
					
						
							| 
									
										
										
										
											2025-04-10 13:21:33 -04:00
										 |  |  | * A set  | 
					
						
							|  |  |  |   [completion condition](https://github.com/ArchipelagoMW/Archipelago/blob/main/BaseClasses.py#L77) (aka "goal") for | 
					
						
							|  |  |  |   the player. | 
					
						
							|  |  |  |   * Use your player as the index (`multiworld.completion_condition[player]`) for your world's completion goal. | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Encouraged Features
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These are "nice to have" features for a world, but they are not strictly required. It is encouraged to add them  | 
					
						
							|  |  |  | if possible. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * An implementation of | 
					
						
							|  |  |  |   [get_filler_item_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L473) | 
					
						
							|  |  |  |   * By default, this function chooses any item name from `item_name_to_id`, so you want to limit it to only the true | 
					
						
							|  |  |  |     filler items. | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | * An `options_dataclass` defining the options players have available to them | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  |   * This should be accompanied by a type hint for `options` with the same class name | 
					
						
							|  |  |  | * A [bug report page](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L220) | 
					
						
							|  |  |  | * A list of [option groups](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L226)  | 
					
						
							|  |  |  |   for better organization on the webhost | 
					
						
							|  |  |  | * A dictionary of [options presets](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L223) | 
					
						
							|  |  |  |   for player convenience | 
					
						
							|  |  |  | * A dictionary of [item name groups](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L273) | 
					
						
							|  |  |  |   for player convenience | 
					
						
							|  |  |  | * A dictionary of  | 
					
						
							|  |  |  |   [location name groups](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L276) | 
					
						
							|  |  |  |   for player convenience | 
					
						
							|  |  |  |   * Other games may also benefit from your name group dictionaries for hints, features, etc. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Discouraged or Prohibited Behavior
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These are behaviors or implementations that are known to cause various issues. Some of these points have notable | 
					
						
							|  |  |  | workarounds or preferred methods which should be used instead: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * All items submitted to the multiworld itempool must not be manually placed by the World.  | 
					
						
							|  |  |  |   * If you need to place specific items, there are multiple ways to do so, but they should not be added to the  | 
					
						
							|  |  |  |     multiworld itempool. | 
					
						
							|  |  |  | * It is not allowed to use `eval` for most reasons, chiefly due to security concerns.  | 
					
						
							| 
									
										
										
										
											2025-04-13 13:10:36 +02:00
										 |  |  | * It is discouraged to use PyYAML (i.e. `yaml.load`) directly due to security concerns. | 
					
						
							|  |  |  |   * When possible, use `Utils.parse_yaml` instead, as this defaults to the safe loader and the faster C parser. | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | * When submitting regions or items to the multiworld (`multiworld.regions` and `multiworld.itempool` respectively),  | 
					
						
							| 
									
										
										
										
											2025-04-10 13:21:33 -04:00
										 |  |  |   do **not** use `=` as this will overwrite all elements for all games in the seed. | 
					
						
							|  |  |  |   * Instead, use `append`, `extend`, or `+=`. | 
					
						
							| 
									
										
										
										
											2025-04-04 22:18:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Notable Caveats
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * The Origin Region will always be considered the "start" for the player | 
					
						
							|  |  |  | * The Origin Region is *always* considered accessible; i.e. the player is expected to always be able to return to the | 
					
						
							| 
									
										
										
										
											2024-03-28 19:31:59 -05:00
										 |  |  | start of the game from anywhere | 
					
						
							|  |  |  | * Regions are simply containers for locations that share similar access rules. They do not have to map to  | 
					
						
							|  |  |  | concrete, physical areas within your game and can be more abstract like tech trees or a questline. |