Before you work on a map intended for upstream (that is, specifically
space-wizards/space-station-14
aka Wizards Den, not forks):
There is presently a "new map freeze" in place. Updates to existing maps are accepted, but new maps are being vetoed at present due to a lack of proper tooling.
Use a release build of the game. If anything goes wrong, a release build is less likely to crash and lose your work. Also: save often!
Please refer to the page contents menu on the right to get to the section that best suits your needs.
This guide is separated into workflow (setup, starting a map, saving, useful tools / commands and publishing) and content with anything else like glossary at the bottom.
If you've read "Workflow" and are looking for a refresher:
To create a new map: mapping ID
, or
To edit an existing map: mapping ID PATH
(e.g. mapping 3 Maps/saltern.yml
)
Note that ID
must be the map number of a map that does not already exist. Use lsmaps
to see a list of maps that are currently in use.
If desired, loadmapacts
Make changes
If needed, run fixgridatmos GID
Save the map: savemap ID PATH
. Important: If you are working with a salvage or a shuttle, you need savegrid GRID_ID PATH
instead.
To test the map:
Create a map prototype if it doesn't exist, then forcemap PROTOTYPE-NAME
restartroundnow
To return to mapping, go to Step 1. Do not save the map while testing.
So you're ready to start making maps for SS14? Excellent!
To get the best experience creating maps we suggest setting up the development environment as shown in this guide, as well as setting up a Git client for an easy way to get the latest updates, and to "PR" (pull request - "To submit") your work to the game. You can map without setting up a Git client, only using Git CLI, but you may find it harder.
Use of Notepad++ is also recommended for updating entity IDs on your map following an update. To do this, open your map.yml file with notepad++ and use the find and replace command (CTRL-F).
If you are using a development enviroment instead of just hosting a local server, make sure to use RELEASE instead of DEBUG mode. This is because DEBUG adds artificial lag (making mapping unpleasant) and crashes more (having more assertions enabled).
If you are launching via a console, you can just use:
dotnet run --project Content.Server --configuration RELEASE
dotnet run --project Content.Client --configuration RELEASE
If you are using an IDE, there will be some other way of setting the configuration. For example, in VS there is simply a dropdown menu:
Now to start creating maps follow the below steps:
mapping [MapID] [MapFile]
command to either create a new map or edit an existing one.
mapping 2 Maps/saltern.yml
mapping 2 [filename.yml]
. These are found in the bin/content.server/data folder.savemap [MapID] [MapFile]
command. For example, savemap 2 foo.yml
should save the server's second map to space-station-14/bin/Content.Server/data/foo.ymlP
("Pick") key will select the entity or tile currently under your mouse for placement.
colornetwork [entity id] Pipe [color]
where the entity ID is any uid of a pipe within a connected network of pipes (Use View Variable on a pipe to find this), and color is a color hex starting with #. See standard pipe colors below.zoom N
to zoom out while mapping. zoom 3
zooms out 3x. Use zoom 1
to restore normal zoom.fixrotations [GridID]
togglelight
command in console.forall with Battery do setbatterypercent $ID 100
mapping.autosave_interval
). You can turn it off with toggleautosave [map id]
or change the mapping.autosave
cvar.The actions toolbar allows you to assign entity, tile, and decal placement actions. These basically serve as shortcuts that allow you to quickly switch to placing common entities/tiles/decals. These actions can be selected either by left-clicking on a filled slot, or using the corresponding keybinding (by default, these are the number keys 0-9). You can also cycle between 10 toolbars using either the arrows on the toolbar, or by using shift + <0-9>.
To assign an entity to a slot, you can just open the entity placement window and click on an entity to start placing it. Clicking on an empty toolbar slot instead of somewhere in the game world will save that entity to that slot. If you are currently in the entity-eraser mode, clicking on an empty slot will instead create a shortcut to the erase-mode. You can assign tile-placement actions in a similar way. Note that tile deletion is simply the same as placing down space-tiles. Finally, to assign decal actions you need to open the decal menu and configure your decal selection. Once again, clicking on an empty slot will add that decal to the toolbar. You can't save a decal-erasing shortcut to the toolbar, as this requires the decal placement window to be open. To remove an action from a slot, simply right click that slot (assuming the action toolbar has not been locked/frozen).
A preset collection of mapping actions can be loaded to the toolbar by using the loadmapacts command. Note that as actions are unique to the currently controlled entity, if you use ghost or possession commands you will lose these actions and will have to re-run the command.
A station and a grid are not the same thing. For example, each asteroid is not it's own station, while a station may consist of multiple grids (e.g. escape shuttles). Most maps only have one grid, though you do still have to set up stations regardless. However, since you can use savemap and loadmap to save/load maps with multiple grids, there is support for overriding this behaviour.
To make a grid part of a station, give it a BecomesStationComponent with a unique ID string (only used for mapping purposes). For example, Saltern's grids have this component with the ID Saltern. You can edit these in VV, or in the map file directly.
To do this in game, find the ID of your station grid using F3 and hovering over a bare tile on the station. Then in console type vv [Grid euID] with the euID from the F3 screen. Navigate to server components and add or search for the BecomeStationComponent. Then add an ID to the relevant field. This ID must match the ID given in your map prototype file. This is the ID given before your roles list.
This means you can have multiple stations loaded in a single map, so do with that what you will.
To screenshot your station you need both a map prototype, stored on Resources/Maps which is the prototype that the savemap 2 name.yml
command from previous steps should generate and a game map prototype stored on Resources/Prototypes/Maps which contains the ID, path and other information, refer to the other prototypes in there as examples when making one.
After this, run the command dotnet run --project Content.MapRenderer {your_map_id_here}
, with the game map prototype ID. You can also set command line arguments through your IDE and run it that way. The image should be inside Resources/MapImages once completed.
Now that you've completed your map, you'll want to test it in game to ensure you can spawn correctly and there are no issues with doors, access, atmos, power etc etc. To do this:
Copy your newly saved mapping file from "space-station-14/bin/Content.Server/data/" to "space-station-14/resources/maps/"
Head to "space-station-14/resources/prototypes/maps" and create a .yml file for your map (known as a map prototype). As a guide, copy an existing one and change the name to match your new map, and edit the contents in a word editor like Notepad++ or your prefered method so that your new map has a unique ID and name. See section on multi-grid and multi-station for Station IDs (this is not the same as your map ID).
You can now relaunch the client and server. Once connected run the command forcemap [ID]
where the ID is the one specified in the .yml file we mentioned just before. Then run the restartnow
command to restart the server on your map.
Connect to the game and you should now be on your new map. Refer to the troubleshooting section if you're having issues.
Once you've tested your map by running it in game as shown previously, and you've ran through the quality control checklist as shown here, you're ready to do a pull request to get your map submitted to the game.
To pull request:
If you've recently updated your local copy, an entity ID you're using on the map has since changed. Check the client and server logs for the missing prototype ID.
Then open your map file in a word editor like Notepad++ and do a CTRL-F, find and replace - and search for the missing prototype ID and replace it with the new prototype ID. Then new ID you can find by checking recent Github PRs, asking on Discord or checking the relevant entity folder on Github.
If you've pulled the latest upstream master and you're trying to run the client and server but it's crashing / getting a fatal error - this likely means you need to rebuild the project in your IDE.
Open the project in Visual Studio Community or your preferred IDE and Build the project again. If you still get issues, make sure you're on the latest upstream, if necessary pull upstream again, run the "Run_this.py" script to update the submodules and if it still won't work, check discord for the latest info.
To ensure you have all the required items for each area of your map please refer to the attached checklist here as a guide.
If your map is now complete, follow the attached checklist here for a quality control checklist to ensure your map is fully functioning. To run your map for the first time refer to the next section.
If you added new rooms or changed layouts, you need to fix roundstart atmos after making those changes. Use the fixgridatmos [Grid euID] command to do this. (Press F3 or run lsgrid to find your grid euID)
If you're creating a new map from scratch instead of editing an existing map, then you might want to add an atmosphere to it. There are two commands for this, depending on your needs.
In order to create a life support system aboard your map you'll need to create a pipe network or two - one for distributing air, and one for pulling waste gasses out of the air. Use the following devices in your pipe networks (pipe net):
Prefer using standard pipe colors for your atmospherics layout so that players and other mappers can understand it better.
Your power network consists of HV, MV and LV wires. In all cases the wire needs to be placed UNDER the respective device to connect, except in the case of LV consumers as noted below:
Your main devices on a power network are as follows:
For all other details relating to power such as setting up engines, refer to the gameplay wiki here.
Decals allow mappers to add low-cost effects such as warning lines, dirt/rust or tile overlays to maps.
The decal placer is available in the adminbus menu, the sandbox menu, or by pressing F8. The controls are as follows:
Decals can be tinted custom colors with RGBA, can be made cleanable, can be ordered according to drawdepth, and can be rotated to any angle, though the spinbox defaults to increments of 90 degrees.
If you're unable to place decals, close and reopen the menu. Tiles and entities cannot be placed while the Decal Placer is open, and you cannot do interactions either as it overrides them.
Palettes can be selected in the decal menu. These are commonly used colors like departmental ones (sec, command, service, etc) which can be selected.
You can add your own palettes very easily. Simply go to Resources/Prototypes/Palettes, copy one of the templates into a new file, and change the ID/name as well as the colors you'd like to use. The colors are in the hex format RRGGBBAA.
All maps need warp points so observers can get around quicker.
Find the warp point in the entity spawner, place it, then right click, debug, view variable, navigate to serverside components, search for the warp component, then alter the name in that component to reflect what you want in the warp menu.
View variable (VV) is your friend. Right click an entity such as a door or sign and navigate to the server variables tab. In here you can edit the name and description of any entity on your map.
Use this to name specific doors on your map or give flavor to warning signs and buttons to make their purpose more obvious to players.
To map vehicles, similar to animals, you need to use the spawner and not the actual entity.
Once mapped make sure to also map a set of keys.
Machine linking works exactly how it does in game. Spawn yourself a multitool from the entity spawner and with it in hands, click on your entity you want to link (conveyors, blast doors, shutters etc) then click on a suitable input such as a button, switch or lever. Then select the way you want to link it, in most cases, default linking is best.
The default range of inputs like buttons is 30 tiles. If your button is further away you can edit the range using view variable. Right click > debug > view variable > server components > transmission component. Edit the range to suit your needs. Try to keep near enough the same as your target otherwise you might find it can be abused in game.
To enable the cargo shuttle for testing on a local server, run the following in the server console:
sudo cvar shuttle.cargo true
This is a space station simulator, after all, but if for some reason you need maps that function like planets that have a breathable atmosphere and gravity that can't be turned off (see the Nukie Planet):
There is a helper command
planet
that will apply sensible defaults for most of the below to an existing map.
Create a new map normally using mapping
. It is not necessary to add a gravity generator nor fixgridatmos
(yet), because of the following steps.
Open the Admin Menu (F7) → Objects → Maps, find the new map that you just created, click on it to pull up View Variables. Under Server Components → Add Component:
- space: False
mixture:
volume: 2500
temperature: 290
moles:
- 21.824879
- 82.10312
type: MapAtmosphere
fixgridatmos
Open the Admin Menu (F7) → Objects → Grids (not Maps!), find the new grid for the map that you just created, click on it to pull up View Variables. Under Server Components:
Save and test.
For escape / evac docks we use the 5-3-5 layout which is 5 tiles, 3 space gap and 5 tiles. The 5 tile portion should ideally be glass-dock-glass/-dock-glass where the glass is reinforced glass or reinforced wall. We suggest leaving a gap of at least 5 tiles either side of the docking area too, more if you can afford it, so ships can dock easier.
We strongly suggest using the glass variant of the docking airlocks so people can see through and not accidentally space the station. The dock can be as far away from the station as you like, with sufficient airlocks between the station and the last space facing docking airlock. This area should be well lit with an emergency light close by so docking shuttles can see the situation inside.
Arrivals dock can follow either the hangar type format or the flat type dock as seen with the escape dock above.
All maps should also have a docking arm in addition to the arrivals and escape docks. The docking arm must have the following features: