Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

CM13 Mapping Crash Course: Difference between revisions

From CM-SS13 - Wiki
(QOL wording to make it foolproof.)
 
Line 998: Line 998:


=== Nightmare Creator ===
=== Nightmare Creator ===
For the full guide on how to create nightmare inserts and how they work see: https://github.com/cmss13-devs/cmss13/blob/master/maps/Nightmare/README.creators.md.
For the full guide on how to create nightmare inserts and how they work see:
 
https://github.com/cmss13-devs/cmss13/blob/master/maps/Nightmare/doc/Quickstart.md


'''What are Nightmare inserts:'''
'''What are Nightmare inserts:'''

Latest revision as of 10:18, 7 October 2024

Signal Flare.gif This page is a work in progress.

This page is heavily work in progress. Until it is complete, it is suggested to use this guide. https://hackmd.io/@tgstation/SyVma0dS5#Ingredients


CM13 Mapping Crash Course

Disclaimer: BEFORE YOU START!

This guide assumes you’re using the most recent of StrongDMM, and already have a working knowledge of how to use Git, and are familiar with CM13's general Git Practices. As long as you know how Git works, and you have StrongDMM installed you’re ready to start mapping.


  • You can learn about Git, and how to use it here.
  • You can read about CM13’s specific Git Practices when they're finished.
  • You can get a copy of StrongDMM here.


If you’re looking for the guide on how to make Nightmare Creator (NMC) inserts, it will be here when they're finished. You can still use Byond’s map editor, but we strongly recommend you use StrongDMM for your own sanity. If you’re using Byond’s built in map editor, or fastDMM you’ll need to use Map.


Merge 2 (hyperlink to how-to-use-section at end of this article) before committing your map(s) to Git.


Merge Requests with un-merged maps cannot be accepted. You will need to use MM2 or StrongDMM if you want any chance of submitting a mapping change!


For international readers, this guide is written assuming your keyboard is using the US Standard QWERTY Layout. Some keystrokes may be different, or not work entirely. Unfortunately, StrongDMM (And Byond’s built in map editor) cannot have their hotkeys rebound.


This document is a work in progress, some information may be incorrect, there might be typos, and some information outright may be missing.


StrongDMM Reference

File commands

Command Description
Open Environment...

Opens a dialogue to locate a compiled DME file.

Note: Only one DME may be loaded at a time. Loading a DME will close all map windows. You will be asked to save all unsaved changes.

Recent Environments... Opens a side menu listing recently opened DME files.
New Map...Ctrl + N Creates a new map. You will be asked to enter X and Y bounds, as well as the amount of Z levels to include.

Note: CM13 does not use traditional Z levels, so always enter 1.

Open Map… Ctrl + O Opens any map on a local hard-disk.

Note: Opening a map will open a new map window, and will not close any other open map windows.

Open Available Map… Ctrl + Shift + O Opens any map recognized in the current DME.
Recent Maps Opens a side menu listing recently opened .dmm files for the currently loaded DME.
Close Map Ctrl + W Closes the current map window.
Close All Maps Ctrl + Shift + W Closes all open map windows.
Save Ctrl + S Saves current changes to the open map.

Note 1: This will save the currently opened map using the map format selected in the Preferences window. Make sure to use the TGM format always!

Note 2: If the currently opened map is of a different format than the selected format in preferences, it will be saved in the new format, even if no changes were made.

Save All Ctrl + Shift + S Saves current changes on all maps.
Save As... Opens a dialogue to save the current map under an alternate title.

Note: The newly saved version will not be automatically opened in the program. The new file will also not be appended with a valid file extension, you will need to type .dmm yourself in the save dialogue

Preferences... Opens the program Preferences window.

Note: Make sure you’re configured for CM13 properly.

Exit Ctrl + Q Exits the program.

Note: This closes all map windows, you will be asked to save all unsaved changes before quit.


Edit Commands

Command Description
Undo Ctrl + Z Moves a step back in edit history.

Note: One step in edit history is one action, click, keystroke, etc, that makes a change to the map that can be saved.

Redo Ctrl + Shift + Z Moves a step forward in edit history (if there are any available).
Cut Ctrl + X Removes the current selection from the map, and adds it to the clipboard.

Note: Cut only removes content from the currently enabled layers.

Copy Ctrl + C Copies the current selection of the map, and adds it to the clipboard.

Note: Copy only copies content from the currently enabled layers.

Paste Ctrl + V Pastes the current clipboard at the turf closest to the cursor.

Note: The clipboard is always pasted relative to the bottom left corner of the clipboard selection.

Delete Delete Deletes the current selection.

Note: Delete only removes objects from the currently enabled layers.

Deselect All Ctrl + D Deselects the current selection.
Set Map Size... Opens a dialogue that allows you to edit the X and Y bounds of the map, as well as add or subtract additional Z layers.

Note 1: CM13 does not make use of Z layers in its map files, as such you shouldn’t need to ever touch this option.

Note 2: There is no 0,0 coordinate, the origin coordinate is 1,1 located in the bottom left corner of the map

Find Instance… Ctrl + F Opens a dialogue that allows you to find all

instances of a certain typepath. Once an object or instance is found, the search results menu will appear, allowing you to jump to each located object, as well as replace the objects via typepath substitution.

Note: This dialogue also functions as the Find and Replace function native to Byond’s Map Editor.

Options Command

Command Description
Layers Filter... Opens up the Layer Filter menu. Checking the box next to a typepath, enables it. Unmarked boxes are disabled. Permits precise filtering of typepaths.

Note: Layer in mapping terms refers to Areas, Turfs, Objects, and Mobs, and aids in filtering what needs to be viewed while mapping. What actually controls how objects layer in game, is the layer variable locally stored on objects.

Toggle Area Ctrl + 1 Toggles the Areas “Layer” appearing.

Note: The Area Layer is never rendered in game, and can obstruct the cursor during the mapping process if not disabled.

Toggle Turf Ctrl + 2 Toggles the Turf Layer appearing.
Toggle Object Ctrl + 3 Toggles the Object Layer appearing.
Toggle Mob Ctrl + 4 Toggles the Mob Layer appearing.
Frame Areas When enabled, draws a white frame at and

around Area borders, scaling with viewport zoom level.

Synchronize Maps View When enabled, forces all open map windows

viewport cameras to mirror.

Note: This is used to match Z levels together across map files, since CM13 doesn’t use Z levels like this, you probably won’t need this option.

Screenshot... Opens the Screenshot dialogue, allowing you

to export either the full view of map, or the current selection.

Note 1: The “Full” screenshot option does not work, and renders a black image. To export your entire map, make a full map selection.

Note 2: The Area Layer, and white borders from the Frame Areas option will not be rendered in the screenshot.

Note 3: The .png file extension needs to be manually typed in the save dialogue. It will not auto-append. This does not affect the saving process.

Window Commands

Command Description
Reset Windows F5 Moves all floating UI windows to their default

positions.

Fullscreen F11 Makes the application fullscreen, or

windowed if already fullscreen.

Help Commands

Command Description
Changelog... Opens up the Changelog window.
About... Displays Copyright Information, Program

License, and Revision #.

Viewport Controls

Command Description
Drag Viewport MMB Drags the viewport relative to cursor

movement.

Adjust Viewport ← → ↑ ↓ / Arrow Keys Moves the viewport one tile distance in the

direction pressed regardless of zoom level.

Zoom Viewport Scroll Up / Down, Ctrl + +,

Ctrl + -|| Zooms the viewport in or out relative to the tile closest to the cursor. There are 14 zoom levels.

Mapping Hotkeys

Command Description
Place Object LMB Places the Active Object on the tile beneath

the cursor. The Active Object will be placed above all other existing objects of its type. If the Active Object is a turf, it will replace the current turf on the tile.

Delete Topmost Object Ctrl + LMB Deletes the top most object on the clicked

turf.

Note: Only deletes objects from enabled layers.

Make Active Object Shift + LMB Makes the currently highlighted object the

Active Object. Only works on enabled layers.

Note: StrongDMM uses the term Active Object and Selected Object interchangeably. This guide will use the term Active Object for all instances of Selected Object for clarity’s sake.

Quick Edit Menu RMB Brings up a menu containing most all of the

Edit Commands. This menu also contains all objects on the clicked turf, including one’s on disabled layers. You can edit objects from here as well.

Edit Object Shift + RMB Opens up the variables window of the

highlighted object.

Note: All edits made to variables generate new instances, even if all edits were made at the same time! Unused instances are cleared when the map is saved. Don’t worry about making extras.

Delete Object Ctrl + Shift + LMB Deletes the highlighted object.
Replace with Active Object Ctrl + Shift + RMB Replaces the highlighted object with the

Active Object.

Note: This command, in-editor is called Replace with Selected Object.

Reset To Default Resets the clicked object to its most basic

form, removing all instance edits.

Note: Only available through the Quick Edit Menu.

Tile Mode 1 Changes placement mode to single tile.

Note: This is the closest you’ll get to a brush tool in StrongDMM.

Fill Mode 2 Changes placement mode to square

selections using LMB + Drag.

Selection Mode 3 Changes mode to Selection only.

Note: Selection Mode has its own unique mouse behaviors, listed below.

Select Area LMB + Drag Selects a square area relative to the initial

click, and where the cursor is dragged. The selection will be highlighted and given a green border.

Note: Only selects objects from enabled layers.

Move Area LMB + Drag Moves the selected area relative to the

cursor, overwriting tile contents when LMB is released, and leaving blank space where the original selection was made.

Edit Direction / Dir Slider Allows manipulation of an object’s cardinal

direction in the form of a slider, creating an instance if required.

Note: Only available through the Quick Edit Menu. Can also be done through Variable Edits.

Nudge X/Y-Axis Allows manipulation of an object’s offset via

Step, or Pixel, from its origin on a tile, creating an instance if required.

Note 1: Only available through the Quick Edit Menu. Can also be done through Variable Edits.

Note 2: Never, ever edit Step_X or Step_Y. The default nudge type can be set in the Preferences window.

Move To Top / Bottom Sends an object to the top, or bottom, in

terms of Byond sorting, of the same type. Note: Only available through the Quick Edit Menu.

Instance Commands

Command Description
Find Instance On Map Brings up the instance locator menu, as well

as the search results. The instance locator menu can be used to locate instances identical to the one you’ve got selected.

Note: You’ll need to manually define the search rectangle though, as it’ll default to the single tile you have selected.

Find Object On Map Brings up the instance locator menu, as well

as the search results. Instead of having an instance ID entered by default, the typepath of the selected object will be searchable instead.

New Instance... Opens up a variable editing window. Any

changes made to this window will generate a new instance in the instance viewer window for use later.

Note: Instances not placed on a map will be deleted upon the next load, and will have to be made again if you wish to use them.

Generate Instances from Icon-States Makes instances of the active object out of all

other valid icon-states within the icon file the active object is derived from.

Generate Instances from Directions Makes instances of the active object out of

any valid directional icons stored within its original icon-state.

Key Mapping Terms

Tile: Byond maps are giant grids. Each grid mark is a tile. Tiles always contain a space turf, this is as empty as a tile can get.


Active Object: The object currently selected / active. This is the object you’ll be placing down when you click. The object will be viewable in the Environment Tree to the left, and highlighted. If you have an instance selected, it will be highlighted in the instance window below.


Area(s): Areas are part of how Byond handles maps, and for CM13 it’s how we determine what portions of the map are valid for fire missions, what does, and does not require power (and thusAPCs), where resin, tunnels, Xeno Structures, Marine Structures, and other things are allowed or disallowed. Areas are never drawn in game. Anywhere without an area will not have lighting, and will kill any mob that enters it, just very very slowly. Areas are like the nervous system of a map. Without it, maps just don’t function.


Turf(s): Turfs are the walls, and the floors that make up the world. There can only be one turf per tile. If you’ve managed to get two on one, you’ve made a big mistake. Turfs are like the skeleton of a map.


Auto-Turf(s): Floor turfs that dynamically place borders around them when the map loads, or when they take damage in game. They look nice, but can get expensive when used en-masse. If your map’s tileset is primarily made of Auto-Turfs (Ice Colony and Kutjevo are good examples of this), make sure to be sparing on the Decals and other objects.


Open (Turf): Turfs that aren’t walls. Mobs can move through these.


Closed (Turf): Turfs that are walls. Mobs cannot move through these.


Invisible Wall Blocker: A type of Object (see below) that acts like an indestructible Closed turf. Used to deny access to areas that are out of bounds, but composed of Open turfs. Reinforced Wall: Walls that are destructible, but require extra effort to punch through. They can only be melted by higher tier Aliens, and stronger explosives (they may need multiple to break).

Hull: Walls that are indestructible. Usually denoted in-editor with a different icon. Often the subtype of another wall type.


Mob(s): These are Aliens, Humans, and NPC mobs. Mobs are divided into two categories, Carbons, and Simples. Carbons are complex and simulated, while Simples aren’t. For Example, Humans and Aliens are Carbon mobs, while Jones and AI Aliens are Simple mobs. Mobs have no comparative bodily analogy, sorry.

Map Sorting Layers: In StrongDMM, what is, and isn’t enabled in the viewport is referred to as a ‘Layer’, which can be sorted. This isn’t wholly accurate, but it is the term that gets used. Sorting Layers are NOT the same as Byond sorting, or CM13’s Object Layers. var/layer: This is the CM13 Object Layer, which is used to determine visual hierarchy in terms of drawing objects on a tile. Take note, this variable can be edited, though some map instances are overwritten upon server initialization, so it doesn’t always work!


Top / Bottom: When numerous objects of the same type are on the same visual layer (not to be confused with map sorting layers), some will appear above others and obscure them, this is determined by what is on Top, and what is on Bottom. This is what we’ve been referring to asByond Sorting. Since Byond isn’t 3D, Z-fighting isn’t possible, though if that could happen, this is what would prevent it. You usually don’t need to mess around with this at all. Players may also bring objects to the Top, or Bottom ingame.


Object(s): These are guns, clothing, windows, window frames, and pretty much everything else that isn’t a wall or floor. Everything you can interact with (save for mobs), are objects. Objects are the meat of a map.


Effect: A subtype of Objects, these are a whole host of things, from the holes Aliens melt in walls and the acid that gets vomited on items, to the sparks that come off of explosions. You shouldn’t be manually placing these unless they’re Decals or Landmarks.


Landmarks: A subtype of Effects, these are map objects that do something when the server loads the map, or function as a saved set of coordinates for a specific event (like the CORSAT teleporter). You’ll mostly be placing these as spawn points for various factions, and not much else save for a few other cases.


Decals: A subtype of Effects, these are non-interactable details on maps. Blood is the most common decal. Fun fact: The catwalks on Sorokyne Strata are also decals. Decals get expensive when placed en-masse, so try to be sparse with them .

Item: A subtype of Objects, these are all the things you, as a player can pick up, ranging from clothing and guns to cigarettes and unplanted Alien eggs.


Structures: A subtype of Objects, these include pretty much anything static (with some exceptions) on a map. Some examples include: chairs, lockers, windows, window frames, platforms, tall grass bushes, and potted plants.


Machines / Machinery: Machines, a subtype of Structures, are objects (mostly static) that have some sort of interaction with other objects. For example, Thermal Generators, APCs, wall lights are machines. All atmospheric objects are machines, but they have their own terminology.


Pipe: This is what a single pipe object is referred to in terms of Atmospherics.


Piping: This is what two or more pipe objects that are connected, are referred to in terms of Atmospherics. Note: This term should not be confused with the Pipeline, which more importantly, refers to the process by which Gitlab, CM13’s code hosting service determines if a Merge Request has no compilation conflicts, and passes all supplied unit tests. This is known as “Pipeline Passing”.


Pipe Machine: This is what one unconnected vent, scrubber, valve, cooler, port, etc, is referred to in terms of Atmospherics. Anything that isn’t a regular pipe, but can connect to pipes, is a pipe machine.Pipenet: This is what when one or more pipes are connected to pipe machines are referred to as in terms of Atmospherics. Xenos may freely traverse completed pipenets that have valid entrances and exits (Vents and or Scrubbers).


Powernet: This is the abstract power supply available from all active generators (Thermal / Portable) available on a single Z level. Powernets are localized entirely to their Z Level. PSU (Power Storage Unit / SMES): This object allows one to meter the power leaving the Powernet into machines, while also viewing total available power within the powernet. You need to place at least one per Z, preferably near a Generator.


Generator: Usually refers to a G-11 Thermal Generator map object, which when repaired puts power into the Powernet for use by PSUs and APCs. You need to place at least one per Z, preferably near a PSU and an APC.


APC (Area Power Controller): This object allows players to control the interaction between the Powernet, and Machines in the local Area (see above) the APC is placed within. Spawner: A general term that refers to something (usually a landmark) that makes something on map load, and then deletes itself.


Detailing: Refers to the aesthetic qualities of a map, or area in terms of objects, unique turfs, and other aesthetic sensibilities, such as color palette, and visual design. Detail Density: An aesthetic term that describes how detailed one area is vs another, as determined by the amount of objects, unique turfs, and others. It can also be used as a broad term to refer to a map as a whole in reference to total detailing, and potentially, performance deficits.


.DMM (Dreammaker Map): The file format that Byond maps are stored in. They’re actually plaintext, and can be opened with Notepad, or a code editor of choice.


TGM (TG Map): TGM is a .DMM format. It stores information in a far more humanly readable way, and also allows for Git Conflicts to be resolved in a far less messy manner. Map Merge 2 converts Byond Maps to TGM. TGM is not an extension type.


Map Merge 2: A python tool that converts Byond maps to TGM format, while also resolving conflicts between versions, if any are found.


Dictionary Key (Dict-Key): Byond stores map information in what are called Dictionary keys (dict-keys for short), which are a sequence of three letter characters contained at the bottom of the map file in a sequence. Dict-keys are first defined when a new combination of area, turf,object, and mob are placed on a tile. If this specific combination is ever reused, instead of defining those lines again (Byond maps are plaintext), the existing Dict-Key is used instead.


Corruption: Your map got done fucked up son. This happens in pretty much any Byond map editor. The Save As function is notorious for corruptions. Make sure to utilize Git Version control to ward away the setbacks of a map corruption.


Dictionary Corruption: Your map’s Dict-Keys have somehow been scrambled or altered. Depending on the extent of corruption, can, or cannot be fixed by hand. These are easy to spot when the Area Layer is enabled.


Variable Edit (Var-Edit): Usually refers to the act of editing the variables of an object (the information stored within it) in game. However you can also do this in-editor, which leads to instancing.


Instancing: The creation of variants of an object that differentiate from the original because of edited or alternative variables. These child objects are called Instances.


Instance: An object that has different variables than it’s base definition. Not to be confused with a Child Object in terms of Object Oriented Programming.


Typepath: The path of an object in-game and in-editor. Objects further down the typepath are Child Objects.


Environment Tree: This is the set of nested dropdowns of objects, and a visual representation of typepaths within the code. Get used to navigating it quickly and efficiently, as that is key to successful and intuitive mapping.


DME (Dream Maker Executable): The compiled game binary, used to run servers, and read by map editors to know what objects can be placed in maps.


Map Window: The tab/window in which a map is currently open. One map window per map. Viewport: The actual visuals within the Map Window, these two terms will likely get used interchangeable in conversation with maintainers, and this guide.


.DMI (Dreammaker Image): PNGs wrapped up in a different file format. These contain all the sprites in the game. In the code, DMI files are called as var/Icon.


Icon: This is the actual file in which an Icon-State is stored. Icons are typically .DMI filesIcon-State: This is a specific ‘state’ within an Icon. To check what states are valid, you can open the DMI, or have StrongDMM generate instances based on Icon-States in the instance context menu.


Tile Set: A specific set of icons, and code, that combine to create a thematically grouped collection of floors and walls. CORSAT, Sorokyne, Prison Station, and Solaris Ridge all have their own unique Tile Sets.


Tile/Object Palette: An analog to the art term, palette, your object (or tile) palette is the collection of frequently used tiles (and objects) that make up your map. Distinct from a Tile Set, in that it’s defined by frequent usage, and not necessarily consistency. For example, water tiles and atmospheric pipes are both part of your map’s palette, but aren’t part of a tile set.

Part 1: Using the Editor

Introduction

If you’re starting here and haven’t read anything yet, make sure you go read the disclaimer at the top, please, seriously. You won’t get anywhere without making sure you’re following what’s said there first.


For this guide we’ll be using StrongDMM, which is an alternative editor to Byond’s included Map Editor (sometimes referred to as BaseDMM). The reason we’ll be using StrongDMM is because it is more user friendly, (generally) has better performance, and most importantly, saves natively in TGM.


Part 1 will walk you through it all, from opening maps and making your first edits to creating instances in baby steps. If you’re already experienced with mapping software, or don’t want your hand held by a document and its contents, you can probably safely skip over to Part 2: Mapping Theory, and make use of the StrongDMM Reference when you need it.

1. Setting up StrongDMM

Before we can get started, we need to configure StrongDMM for CM13. Navigate to the File tab, open it up, and click Preferences… Make sure to set the Map Save Format drop down to TGM. Make sure Sanitize Variables and Clean Unused Keys are also both enabled. Lastly, ensure that Nudge Mode is set to pixel_x/pixel_y. Having this option set to step_x/step_y will break smooth movement in-game, and we don’t want that.After that’s all set, feel free to fiddle with the settings to your liking. When you’re ready to continue, X out of the menu.

2. Navigating Maps

To start things off, let's open your compiled CM13 DME file (if you don’t know how to do that, check out the guide here). Navigate to the File tab, and hit Open Environment… Once the loading bar at the top of the screen disappears, you should see a now populated Environment Tree to the left, and a blank screen. Double check in the upper left, it should read “ColonialMarinesALPHA - StrongDMM”.


From here, let’s open up a map file. Navigate to the File tab, and hit Open Map. This’ll open a Windows Explorer window in the base of your local repository. Head into the Maps folder, and select Z.01.LV624. You can open the map by hitting the Open button, or by double clicking.

MCC Fig1.jpg

Your window should now look something like

the left. Those funny colors and tiles that say ‘SW’ over them is the Areas Layer. In CM13, Areas are used to control what places need power, allow or disallow certain activities, such as construction or tunneling, and also what places can accept fire missions or CAS lasers. For now, we don’t need to pay attention to Areas. They can be safely toggled off by hitting Ctrl + 1 (Toggle Area Layer).


You might (or might now) see some white outlines around and at the borders of where Areas met. These borders will persist even when the Areas layer is disabled. If you find them distracting, you can disable them going to the Options tab, and unchecking Frame Areas.


There’s still a lot going on in our viewport, but before we can dive into what’s going on, let’s get used to navigating the map, and using viewport controls to get around.


First, let’s use MMB (Middle Mouse Button) to pan around the map. Click in the MMB, and release to stop panning. You’ll notice the editor slows down while panning quickly, or when panning over areas with lots of objects. This is completely normal, even for more robust hardware setups.


You can also Scroll up or down with your mouse wheel (or track pad, gesture commands that emulate scrolling also work) to zoom in and out of the viewport. Note, that when you zoom, it all happens relative to where your cursor is, and more specifically, which tile it is hovering over. You’ll pan further when zoomed out more.


Panning and zooming are the primary forms of navigating maps in StrongDMM.


If you’d like to make a more precise viewport adjustment, the arrow keys allow you to move the viewport by one tile in the cardinal direction you just pressed. This movement is relative to the current viewports positions, and won’t snap the viewport to be turf accurate, it’ll only move the viewport the distance of one turf at the current zoom level. There are 14 total zoom levels.

Basic Editing

Now that you’re comfy with moving around the map, we’re going to cover barebones editing controls. Navigate up to LV River, just north of Hydroponics.


For reference, in Byond mapping:

Up - North

Right - East

Left - West

Down - South


Zoom in to the river, and press 2, to change your tile placement mode to Fill. Tile mode, which can be activated with 1, can be useful, but we suggest you do the majority of your mapping on Fill mode, it becomes far more intuitive the more you use it.

MCC Fig2.jpg

Right now, you probably don’t have an Active Object, which is to say if you click,

nothing is going to be placed down. To change that, hold Shift, and then move your cursor over one of the “strange trees”. It should highlight green. Left click to make it the Active Object.


MCC Fig3.jpg

Place a few in the river, and then their undo placement with Ctrl + Z (You can also redo with Shift + Ctrl + Z). If you click twice on a tile, even though it doesn’t look like it, two trees will have been placed down. To confirm this, right click the tile. From there, you can highlight the second tree and then delete it. You can fiddle with the Dir and Offset settings, but we won’t be covering those until later.


Place two trees in a row next to one another. Now, hold Ctrl, and drag a selection box around them. Ctrl + Drag, on Fill and Select Mode, deletes the topmost objects of the selected type on a tile. The selected type does NOT refer to the Active Object, rather only if you have an Area, Turf, Object, or Mob as the Active Object. Top most deletion is handy when you need to quickly clear an area of a lot of objects, but not all of them. The last placed object (usually) is the top most object on a tile.


Undo, or place two more trees down. Holding Ctrl + Shift, click on one of them. It should highlight in red. This will delete the object. Deleting this way allows for deletion of any object, turf, mob, or area that’s currently visible. You have to be able to click it to delete it, so if it’s not enabled per the Layers Filter, no dice.


Undo, or place two more trees down. Now, select a new object, such as some of the flowers, or one of the reed bushes in the river and make it the Active Object. Go back to one of your trees, and this time Ctrl + Shift + RMB, instead of LMB. This will replace the tree with the Active Object.


Copy, Cut, Paste

Copying, cutting, and pasting are tools that, if used effectively, can greatly speed up the mapping process and cut down on the time spent combing the Environment Tree for the right object. Combined with picking the Active Object from already placed ones, you might not even have to use the environment tree at all.


Before we can copy, cut, or paste, we’re going to need to learn how to use the Selection Mode, which can be accessed by pressing 3. Notably, you cannot change tile placement and selection modes by using the Number Pad on an extended keyboard.


In Selection Mode, the mouse’s basic click functions follow special behaviors. Without any selection, you can LMB + Drag to make a new selection. Repeating the same action, LMB + Drag anywhere within the bounds of the selection will drag the selection relative to the mouse on the tile grid, replacing all content it’s floating over when you release the mouse. If you want to clear your selection, press Ctrl + D. When moving selections, the original tiles will be cleared. Only content on enabled layers will be selected and moved.


Copying, cutting, and pasting work exactly the same in regards to mouse controls. Notably, when pasting a selection onto a map, the content will overwrite everything around it. Pastes always are relative to the cursor, starting at their origin tile in the bottom left of the selection. If you paste a selection while not in Selection Mode, you will not be able to manipulate it after pasting, which can be frustrating. As such, make sure you do the most of your Cut, Copy, and Paste while in Selection Mode (3).


Instancing Objects

This segment covers the basics of instancing, and only the basics. Advanced instancing is something you’ll encounter on a case by case basis, and it’s best to get live help than refer to a guide for those cases.


Firstly, lets get familiar with the concept of instances. What are they, and why do we want to use them?


An instance is a variant of an object that is different in any way from its original state. An instance is NOT a child object further down the typepath.

Common instances include: renamed items and airlocks, changed item descriptions, APCs and NanoMeds offset to appear on walls, and floor tile variants. Mapping without instances can be done, but it requires a lot of extra code that isn’t needed. Why define a new child of an object that only has a different name, when we can instance the name instead?


Instances are stored on a map by map basis, and are not shared between them. However, StrongDMM is able to recognize instances between map windows if you have two or more open, which can be useful in certain situations.


MCC fig4.jpg

Reselect our friend the strange tree. Looking in the bottom left, you’ll spy there are already two instances of the strange tree being used on the map. This bottom left window is the instance viewer. Clicking either of the other instances will display the differing variables to the right of the initial window. You’ll notice the top most instance reads “Empty (instance with initial vars)”. When you

reset an object to default, it’s this topmost variant of itself that it will return to. Try placing any of these instances.


Let’s make some more instances. Right click any of the three and hit Generate Instances from Icon-States… This should make a bunch new instances for us to screw around with. You can always hit New Instance… if you only want to make one more, though unless you know exactly what you’d like to make, it’s usually a safer bet to generate from icon-states or directions.


Be careful when generating instances! You’ll notice that a bunch have been made when we hit Generate Instances from Icon-States…, maybe even too many. Some Icon files are very large, and have a lot of icon states shared between objects, turfs, and others. If you need to clear that list, close the map and re-open it. They should be gone when the map gets reloaded in the editor.


MCC fig5.jpg

If you have a lot of instances that you are using you can add additional rows to the instance window by clicking on the cog icon (upper right of the window). Let’s cover automatic instancing. Moving south of the river, head over to the medical dome and make one of the folding metal chairs the Active Object. You’ll notice it already has instances of all its directions in the lower left. Moving down the Environment Tree, select the comfy child object. Right click the initial instance, and hit Generate Instances from Directions… Now we have all the cardinal directions of the comfy chair for our mapping leisure. Not all objects have directional variants. When in doubt, you’ll probably have to check the icon file itself. While we can’t open the Icon in StrongDMM (or any map editor for that matter), we can find it easily.

Place down one of the new comfy chair instances anywhere on the map, and right click it. You’ll notice in the right click menu we can see all objects, regardless if their layer is enabled or not. Moving the cursor over the comfy chair will give us some extra options to explore.


This right click menu is known as the Quick Edit Menu, and gives you access to Edit Commands as well as more specific object functions.


Your first set of options is the ability to Nudge. Nudging allows you to offset the object on its tile, without actually moving it from the tile to another. This can be useful for decorative purposes or for wall mounted machinery, like NanoMeds, or APCs. Play around with the two sliders, but make sure you’ve got Nudge set to Pixel Nudge in your Preferences.You’ll notice that with each release of the mouse from the nudge sliders will make a new instance of the object. Making just three nudges, makes three objects! Remember, you can clear unused instances by reloading the map file after saving.


Secondly you’ll notice the Dir (Direction) slider. This can be used to rotate your object in various cardinal directions. If the object has directional sprites in it’s icon-state, they’ll be automatically applied.


Under those two aesthetic adjusters, you’ll notice the Move To Top, and Move To Bottom buttons. You can read about those in the Key Mapping Terms. You won’t really be using these.


Most importantly, we get to our two unfamiliar commands, Edit… (Shift + RMB) and Reset to Default.


Reset to Default does exactly as it says, and restores the object to its original initial variable state, or the top most instance of that object’s type.


Edit… (Shift + RMB) more importantly brings up the Variable Editing window (VarEdit shorthand). From here we can directly modify any variables associated to this object in the code. Before we get into anything in this window, make sure to tick the box next to By Type. This’ll group variables by what typepath they’re associated with.


If you tick the Modified box, only the currently modified variables will appear. You’ll notice that Dir, and Nudge (pixel_x, pixel_y) are both variables. Anytime you change a single variable, a new instance is made.You can also filter variables (or search them, it’s the same function) at the top bar.


You can also filter variables (or search them, it’s the same function) at the top bar.


MCC fig6.jpg

Finally, let’s figure out how to locate the actual icon file our comfy chair uses. Filter for, or look for the term “icon”. The resulting variable gives us the path to the icon file, you need only locate it in Windows Explorer now if you’d like to actually inspect the .dmi file.


For now, that’s all we’ll cover on variable editing. As said, you can edit everything via instancing, but you can’t change the direct code. In this case, if you wanted you could tell the comfy chair to find an entirely different icon file if you wanted to! Assuming of course you had the correct path punched in.

Common Variables

Command Description
desc

The description of an object. If set to null, it will use the parent objects description. This variable must be enclosed in full quotes “”, otherwise your map won’t compile.

Note: Smart quotes, and quotes, are not the same unicode character, and smart quotes will break your map file. StrongDMM never uses smart quotes, but a text editor you use might, so be careful if you’re pasting from an outside source.

name The name of an object. If set to null, it will display an empty space in game. This variable must be enclosed in full quotes “”,

otherwise your map won’t compile.

req_access Used by lockers and doors to determine what access is needed to open them. When set to null, no access is required.

Note: A list of access numbers can be in the code file (someone get me the name & path)

Open Map… Ctrl + O Opens any map on a local hard-disk.

Note: Opening a map will open a new map window, and will not close any other open map windows.

req_one_access Used by doors to determine if a single access number permits use opening. When set to null, no access is required
color The tint of the object. Use RGB or Hex Color Codes. Null is the default; no tint. Works best on grey-scale sprites.
luminosity The numeric intensity of how bright the object is in light calculations. Null means no light.

Can be given to objects that normally do not produce light, making them glow.

anchored A true (1) or false (0) variable that determines if an object can move. Objects that can normally be picked up, cannot be so when anchored is set to true.
wrenchable A true (1) or false (o) variable that determines if an object can be wrenched down to the ground, changing its anchor status.
density A true (1) or false (0) variable that determines if an object is ‘dense’. Dense objects prevent passage through the tile they inhabit. Walls are dense objects, floor tiles are not.
health The numeric health of an object. If set to null, it’ll use the parent value. When this reaches zero the object is destroyed or enters a damaged state. Varies per object type.

Objects that can be picked up (such as guns, or pillbottles) do not usually have health values.

unslashable A true (1) or false (0) variable that disables slashing by Aliens. Only valid on structures, walls, and other objects with health values that are targettable by default.
climb_delay A numeric value in terms of millisecond delay when climbing objects.
climbable A true (1) or false (0) variable that allows mobs to climb over, or onto the object in question. When null defaults to 0. May cause unintended behavior when set to true.
drag_delay A numeric value in terms of millisecond delay that is applied as a pause to mob movement after dragging an object. Calculated against a mob’s individual drag speed.
tag A string variable that is sometimes used to flag certain aspects of an object or turf with additional information. Usage is deprecated in modern CM13, but it shows up occasionally.
icon The direct file path within the code to the .dmi the object searches in for icon_states. Can point towards any other dmi if the pathing is correct.
icon_state The name of the icon_state within the .dmi file specified by the icon variable. Will display the no name sprite (usually an error or invisible) within the .dmi if the specified icon_state is invalid.
pixel_x / pixel_y Integer offsets that change the origin of an object on a tile (default is at 16,16, the center of the tile, which in pixel_x/y is 0,0). Can be modified easily with the right click menu.
bound_height/width Integer values, where 32 = 1 tile. When set larger than 32x32, a multi-tile object is created. Useful for large sprites, or

multi-sprite objects.

dir The cardinal direction (stored as an integer) in which the object is facing. If the icon_state has dir variants, these will display accordingly. The directions are as follows:

1 - North

2 - South

4 - East

8 - West

5 - Northeast

6 - Southeast

9 - Northwest

10 - Southwest

Note: 2 - South is the default dir value.

stuff List variable that contains the potential contents of a largecrate/random object. Can be directly modified to have different contents if paths are correct.
start_charge The % charge of an APC when it first spawns on map initialization. Should usually be left on defaults, or overridden to 0.
projectile_coverage The % chance a projectile has to hit the object in question when it passes through the tile it exists in.
flipped A true (1) or false (0) variable that determines if a table has been flipped or not. The flip direction is dependent on the dir variable.
frequency The frequency of headsets and intercoms. Defaults to 145.9 common channel. Custom frequencies must end in an odd number, otherwise they won’t work.

Part 2: Mapping Theory

Hopefully by now you’ve gotten decently comfortable with StrongDMM and know your way in and around instances. If you’re not yet, I advise you head back to the previous section, make a few edits on existing maps and screw around with the various tools and items you have at your disposal. Getting comfortable with the tools themselves is half the battle when working with Byond.

This following section is about general CM-13 mapping theory. Remind yourself that CM-13 is a combat server, as such any theory you might have learned, or developed yourself from another SS13 server does not apply here, at all. Seriously, don’t go in trying to make an SS13 map, or editing an existing map to be more like one. It is a quick road to having your merge request turned down for violating the theories and ideas you’re about to read.

With that said, the following segments are not set in stone (save for the Basic Map Requirements), but we highly recommend you follow them to the best of your ability. As you become more experienced with mapping, and CM-13 in general, that same experience is your license into more experimental or non-traditional maps and inserts.

One last thing before we continue, while the following segment is loosely outlined around the thought process of making an entirely new map, understand that there is no specific order to map making once you’re past the drafting stage, and you, and everyone else, may, and will, approach the mapping process in a way that best suites their abilities. You should also note that we (the CM-13 development team) expect contributor-mappers to not go and make new maps

as their first project. We suggest, and would much prefer it if you made Nightmare Inserts (NMC, for short). You can read about what Nightmare Creator is here.

Basic Map Requirements

A map built for the default gamemode Distress Signal can be boiled down to a few simple elements. Without these, the gamemode will not be able to run from start to finish properly.

  • At least one Landing Zone
  • An always powered indestructible dropship terminal placed next to each landing zone
  • An area that permits the construction of marine structures; for telecomms.
  • An area that permits the construction of alien structures; for the hivecore, spawning pool, and nest(s)
  • X amount of small host spawners, where X is the map size in walkable tiles divided by 1000 and rounded down.
  • One or more Hive Start landmarks; which allow the Queen to determine where to spawn the hivecore and herself at round start.
  • 10, at the minimum, Survivor spawners.
  • If your map uses the node income system; minimum one node spawner landmark and a node income controller object.
  • If your map uses the legacy income system; a legacy income controller object.

For a far more in depth break down of a Distress Signal map, you can check out this guide, written by TobiNerd, our Lead Mapper,

It is highly advised that you have more than one (our recommendation is 3-5) Hive Start landmarks in order to allow the Alien team a degree of choice when starting the round in terms of their overall strategy in regards to map control and their base of operations.

There aren’t any hard rules on where one should place Landing Zones. Smaller maps, for ease of balancing and income node placement, prefer only one landing zone, while larger maps should usually have two in order to increase marine FOB options. If you have two landing zones on your map, they should both be equally spaced from the first income node that marines encounter. If one is closer, it will always get picked preferentially due to the timing advantage. For more information on Landing Zones (and Hive placement), click here.

Small host spawners can be placed just about anywhere on the map, but it’s suggested that you place the most of them towards naturally occurring Alien territory. On most maps that do feature small hosts in thematic placement, they usually wind up in easily accessible containment cells grouped together in one place for ease of Alien team access. Small hosts should not be difficult to get, they provide pre-round activity for the Alien team, while also conferring a team resource.

Survivor spawns should be placed opposite of small host spawners; they should be closer to the LZ(s) than to potential Alien Hive Starts. Survivor spawns should also spawn next to or in a key location to allow ease of orientation. You can read more about Survivors here.


Layout, Chokepoint & Lanes

Lorem ipsum

Layout, Blockers

Lorem ipsum

Layout, Arenas

Lorem ipsum

Layout, Hives & LZs

Dropship terminals don’t have to be on or next to the landing zone directly like Sorokyne or LV, but they do need to be in an obvious place so that Queen players, new or old, do not get confused when attempting a hijack operation. CORSAT is a good example of non-traditional LZ computer placement, it’s in an office off to the side labelled flight control in clear view of the LZ.

Layout, Resource Nodes

Lorem ipsum

Pipes, as a hive-way

Lorem ipsum, bitch

Survivors, (and their Loot)

Lorem ipsum

Advanced Map Components

Lorem ipsum

Nightmare Creator

For the full guide on how to create nightmare inserts and how they work see: https://github.com/cmss13-devs/cmss13/blob/master/maps/Nightmare/doc/Quickstart.md

What are Nightmare inserts:

Nightmare inserts are variations to different locations on the map that occur based on a random chance, The most common example is the fog on LV, By default the fog is full but nightmare inserts might create a hole in the fog.


Sprinkles vs Variations:

Variations are a group of nightmare inserts, usually regarding the same location. The nightmare insertion system will only pick one of the inserts in a variation group.

Sprinkles however are independent inserts that might or might not happen, however are not dependent on if other spawn.


How to create Nightmare inserts?:

  • Open StrongDMM (SDMM) and choose a map and where you want to make a nightmare insert.
  • Once you have chosen your desired area take the measurements.
  • Create a new map file based on the measurements.
  • On the new map file replace the areas of the insert with /area/noop_template and turfs you don't want with /turf/noop_template.
  • Actually map in the insert.
  • Save the insert with the following format: SpawnChance.InsertName.dmm (So if you want a 40% spawn chance you put 40.InsertName.dmm).
  • Put the .dmm file inside the sprinkles folder of the map you want it for.
  • Put a /obj/effect/landmark/nightmare in the bottom left corner of your original measurements on your chosen map. The landmark represents the bottom left part of your insert so if it is in the wrong place, your insert will spawn wrong.
  • Change the landmark's insert_tag to your insert's name (If your insert is named 10.EasternGap.dmm, Your insert tag would be EasternGap)
  • That's it!

Part 3: Map Detailing

Using the Zoo

Lorem ipsum

Theming

Lorem ipsum, bitch

Detail Density

Lorem ipsum, bitch

Environmental Storytelling

Lorem ipsum, bitch

Custom Assets

Lorem ipsum, bitch

Getting Creative...

Lorem ipsum, bitch


Frequent Questions & Mistakes