For those interested in using GML, I have a starting framework (in my current project) that's flexible enough to handle most 2D game styles, and includes a Level Chunker approach for ProcGen level design.
Slightly disjointed attempt at making a flexible framework for many types of 2D games. Many of the asset objects already have coding for proper actions/reactions (bomb collect adds bomb ammo, bomb set subtracts one, creates explosion, objects react to explosion sprites), and it also contains (optional) code for a "level chunk randomizer," which can be coded with strings to set tile objects.
No music, SFX, or tilesets yet; and character controls and stuff like gravity/collision checks aren't implemented as of now. All assets are Creative Commons. Could use better "placeholder bushes/trees" as well.
Level Chunker management tutorial:
1. Create a grid of "LevelGenChunk" objects, surround where closeoffs are desired with "Blackout" objects. These will randomly transform into "BattleChunk," "NaviChunk," and "TrapChunk" objects.
2. These three objects will check neighboring chunks and provide a Perlin Noise-style answer (IE: their "image_index") that will cause them to link to one another, and close off any of the same type (or Blackouts). The idea here is to provide flux between different playstyles, in order to prevent monotony.
+1 blocks off the top.
+2 blocks off the left.
+4 blocks off the right.
+8 blocks off the bottom.
"15" totals make standalone rooms that we can bridge with created doorways, or warp pipes, that sort of thing.
3. Based on the image index, the objects then use ten "fillScreen#" commands, each one laying fifteen tiles across. The first 15 variables are "image_index" frames for the "oScriptTiles" object. There's easy-to-pick-up-on patterns in that. Then for the 16th variable, just list the object (oScriptTiles).
It makes a 15 x 10 grid of 48x48 tiles; and so long as openings between them are mutual, it's all green. Tiles include two-tall/wide angles and inner/outer curvatures as well.
4. Just use conditional "create_object" commands after that to fill the chunks with objects!