This is a little primer on how to use the engine, since it's probably a bit daunting to just dive in. Feel free to ask questions and I'll add them in to this FAQ.
How do I add in new items?
Check Scripts --> Data Mangling --> Item Database. There are plenty of example items showing off how the format works.
How do I make new levels?
On the title screen, first hit F1 to open the world map editor, then place the new levels (using appropriate area, size, etc). Then save the world map, back out to the title screen, and open the level editor with F2. Hit F2 again to select the level to load, and type in the number of the new levels you added to the world map. Level connectivity and some other metadata is stored in the world map data, and used later in the level editor.
When shipping a game, don't forget to take the output worldmap/level files (from the game's sandbox folder) and update the Include Files with the latest versions!
What can these editors do?
Press F1 to list all accepted commands, or check Objects --> Interface and Control --> Editors.
How do I use the World Map editor?
The world map is divided into "areas", which affect the default biome of the levels. The area system is counter-intuitive, but meant to make separating the game world into areas easier. Use 1/2 to cycle between areas: levels you place will use the selected area. When the player enters a new area, there's an announcement showing the area's name, and the areas have separate colors on the world map editor view so it's easier to tell them apart.
(Areas are defined in Scripts --> Data Mangling --> Worldmap --> wmap_init_areas.)
Note that since level IDs must be unique and never change, deleting a level will not free up its ID in any way. Be careful not to create/delete too many levels to avoid leaking memory (even without the level files, there's world map metadata for each level ID up until the final defined ID). It's not a super huge concern, but it's good to be aware of it.
Once you've placed some levels, you can edit them in the Level Editor. You can edit levels not defined in the world map, but some metadata is unavailable (biome, size, etc). The intended workflow is to always chart out an area in the world map editor first, then fill them in using the level editor.
How do I use the Level Editor?
Oh boy, I have no idea where to even begin explaining this gargantuan beast. First off, allot levels on the world map editor to create metadata like which map region they're part of before you start making new levels. It's not strictly necessary, but it fills in level size and some other metadata automatically.
Don't forget that you can press F1 to list all possible commands, and use the mouse wheel to zoom in/out.
The level editor has separate modes for tiles and objects. The tileset is based off of the biome, and you can only have one active tileset at once. Changing the biome will change the tileset and update all existing tiles to use the new tileset. The biome will default to the area's default biome, but nothing stops you from changing it (the cave areas in the undead city is an example of this in the demo). Press Space to toggle between object and tile modes.
Objects can be combined freely. They're stored in "object palettes" for convenience, grouping similar objects together. Press P to change object palette. The default palette is "util", which has doors, checkpoints and such... you need to add side doors to connect to adjacent rooms, so don't forget to do that.
To create tiles quickly, press T to enter "auto terrain mode". Draw a line and press either Enter or Insert to turn anything below/above that line into floor/ceiling. Slopes are added automatically, and the wall tiles are randomly selected to make for a less monotonous experience. (This doesn't work super well with all tilesets). You can also use Shift + T to enter "terrain chunk mode", which is like Auto Terrain Mode but lets you create chunks more freely (not just the entire level's wall / floor). It's a bit tricker to get used to, since it creates a reference point when you enter it that decides what's "below" or "above", but it's really powerful if you can master it.
Don't forget to save your level with F5 often! There's no undo feature.
What do I do with the skeletal animation files?
Copy the skeletal animation data to the clipboard with the hotkey, go to Scripts --> Effects --> Visual --> Skeleton Animation --> skelani_init_all_keyframes, and paste the data at the bottom. Change the "insert name here" line at the top to a new constant / enum / macro.
How do I add in phat loot in a level?
Press P to change the object palette, type in "item", and select the "loot orb" item from the list and place it in the level. Next hover over the loot orb and press E to edit its arguments, and you can type in an item name. The game looks this name up in the item database while loading the level, and will interpret a trailing " +2" as an upgrade level and " x3" as a quantity automatically. (Note that upgrade level only applies to weapons/armor and quantity only applies to consumables).
The reason the editor stores item names instead of item IDs is because there's no good way to access the constants, and manually parsing integer item IDs is just a mess. So this felt like the least painful solution at the time.
Also note that the game automatically manages flags for placed items (loot orbs, stat upgrades, etc) as long as they're children of the appropriate object.
How do I add in other things?
Check Scripts --> Editors --> Room --> init_objpalettes for a list of all available object palettes (and this is where you add new objects as well).
What's this "biome" thing?
A definition of the level's tileset, background layers, music, effect-controller object. Biomes are defined in Scripts --> Data Mangling --> Level --> level_init_biomes. The biome isn't displayed to the player in any way, so you can make as many as you want (e.g. for different tilesets using the same background, if you need a special tileset for a certain character's room or somesuch).
I wanna release the game now, how do I disable the editors?
Set the macro DEBUG_MODE to false. It's very close to the top of the macro list.
The "enter name" dialog box is kinda ugly...
I figured get_string_async() was the portable, recommended way to get a string in Game Maker these days. I kinda regret it.
Can I make metroidvanias that AREN'T Dark Souls 3 ripoffs in this engine?
Yeah - check out Scripts --> config_quickclone_features for a series of quick configuration parameters. You can disable the stamina system, make enemies drop health/ammo randomly, and similar tweaks.
How does the flags system work?
Flags are stored in an array: one bank per level, 30 subflags per bank. (Basically, 32 bits, rounded down a bit since GM is a bit weird when you set the sign bit manually). This means a flag is referred to with two numbers: its bank, and its subflag.
For treasure flags, the bank is always equal to the level number... level0 has treasure flags 0:0 to 0:30.
For story flags, the bank is just a random number. It might help organizing the game if you use the bank to group similar things together (like an NPC's questline).
How do I make NPCs and other things conditionally appear / be gone?
There's objects in the "event" object palette that destroys any overlapping objects if a story flag is set / not set.
How does the NPC system work?
There's two types of NPCs: script NPCs and oneliner NPCs. Script NPCs execute a script when interacted with, which typically initiates a cutscene and queues up messages, shop interactions, and such. Oneliner NPCs are exactly the same, but they have a set script that reads 1 line of dialogue. Oneliner NPCs are useful to reduce the number of redundant scripts in your project, letting you create tons of NPCs without making a custom cutscene script for each.
NPCs can be given a dialogue portrait sprite option, this isn't used in the demo since I felt it detracted from the experience.
NPCs can take either a sprite name or a script name as their "in-game sprite" argument. When used, the script should be Skelani Setup script (which initializes the skeleton animation system and loads sprites to all relevant body parts). Bordomir, Andrea, and the crestfallen knight use this approach, all other NPCs use sprites.
How does the Skeletal Animation system work?
Basically there's a list of angles, which are stored in the keyframe data. In an animation, angles between two keyframes are interpolated to find the current angles. All body parts' positions are computed from the angles, the skeleton's origin point (the bottom center), limb sizes, and the way the limbs are connected to each other.
You can find the skeleton animation system in Scripts --> Effects --> Visual --> Skeletal Animation.
The system is mostly hardcoded to use humanoid skeletons.
Why is the GMS2 source file version 2?
I found a serious issue with the collision checking (one of the compatibility scripts slowed it down noticeably in large levels) after uploading the first version, and fixed it.
My question isn't answered in this FAQ...
Ask it in a comment and I'll try to answer it!