Muster - Battlefields That Draw Themselves
A downloadable asset pack
Keep your battle engine. This is the ground it is fought on.
Muster composes a whole tactical battlefield from a seed and draws it in pure GML: elevation, ground, cover, hazards, deployment zones and objectives. There is no sprite, no spritesheet, no atlas and no texture page in this package. sprites/ does not exist.
52 terrain features · 8 biomes · 8 seasons · an unbounded seed space
The picture and the rules are the same object
Every paid tactics framework on this shelf ships the rules of a fight and leaves you to find the terrain. Muster is the other half, and the reason it ships any rules at all is this:
A feature's cover value is not kept in step with its picture. It is the same row.
mst_feature_spec() returns a feature's materials, its geometry, its cover value, its line-of-sight block, its height and its movement cost together. The generator writes those numbers into the cell as it places the thing, and the query functions read them back. There is no second table and no synchronisation step, so you cannot reach a state where a boulder is drawn and queries as open ground — the bug every hand-built tile map eventually has.
The season changes how it plays, not just how it looks
Each material carries a susceptibility. Turf is 1.00 and changes completely; granite is 0.00 and does not move at all, so a snowbound field is a field under snow rather than a field that has been painted white.
And the movement costs come out of the same table that changed the colour. Snowbound turns standing water into something walkable and slows mud; thaw turns worked loam into mud that costs double; drought dries a river bed out. On the season sheet the same marsh crosses in 12, 18, 9 and 13 movement points depending on the time of year. The river you could not cross in autumn is a road in February.
What the generator guarantees
- Every field is crossable. Not hoped for — repaired. Blocking features are cleared, and where the ground itself seals the map, cells are regraded to a passable material from the same biome. Both repairs are counted and reported, so a map that needed six regrades is one you can reject rather than one you never hear about.
- Every deployment cell is standable. No unit ever starts inside a boulder or a pool.
- It is deterministic. Nothing calls
random(). A field is a pure function of size, seed, biome, season and strength — so store the seed, not the map, and a save, a replay or a multiplayer peer rebuilds it exactly.
Ask the ground questions
mst_cover_from() is directional — a unit behind a wall is exposed from behind it, and a higher attacker sees over low cover. Also: mst_los() (height-aware, supercover, so nobody gets shot through a corner), mst_move_range(), mst_path(), mst_step_cost(), and mst_field_report(), which tells you the crossing distance, the going rate, the cover split and the chokepoint count so you can generate in bulk and reject on the numbers.
Integration is four lines
field = mst_field_make(12, 12, 1701, "downland", "harvest", 0.8);
pal = mst_field_palette(field);
origin = mst_field_origin(field, 0, 0, room_width, room_height);
mst_field_draw(field, pal, origin[0], origin[1]);
A runnable demo room ships with it. Press C over a finished battlefield and watch the cover overlay land on exactly the ground each wall protects.
Compatibility
GameMaker Studio 2.3+ and GameMaker 2024.x. Built and verified against runtime 2024.14.4.268 (the current stable legacy runtime). Pure GML with no extensions, no DLLs and no external dependencies, so nothing here ties you to a platform. Import with Tools → Import Local Package and select all.
Everything is namespaced mst_ / MST_. GML's global namespace is flat and a collision in your project would be a compile error pointing at a file you did not write; there are no unprefixed globals in this package.
Verification, stated honestly
GML cannot be unit-tested outside the engine — there is no headless runner and no mocking. So this package builds through Igor and runs its own suite inside the finished executable: 14,790 in-engine assertions, 0 failures, covering the corpus counts, every material ramp, the season model's negative and positive controls, every feature building in every season, drawn height against declared height, field generation across all 64 biome/season pairs, line-of-sight symmetry, path costs against the distance field, and determinism. Assertions that could pass vacuously are paired with a guard proving the fixture is in the state they need.
Every image on this page was rendered by the package itself, through the same drawing code you get.
What that does not prove: a suite that computes numbers cannot see a picture. Every sheet was also opened and looked at, and several defects were found that way and only that way.
Raw, readable GML. Commented throughout. Minification would be a defect.
Also from CSAF, for GameMaker
Adversary — multi-phase bosses is what you fight on this terrain. Muster generates the battlefield; Adversary generates the boss standing on it, phases and tells included.
Borough — settlements · Panoply — loot and gear · Menagerie — companions · Affliction — status effects · Vestige — achievements · Bourse — markets · Repast — cooking · Livery — interface themes
| Updated | 2 days ago |
| Published | 9 days ago |
| Status | Released |
| Category | Assets |
| Author | CSAF — Core Systems Asset Factory |
| Made with | GameMaker |
| Tags | 2D, GameMaker, Generator, gml, Isometric, level-generation, Procedural Generation, sourcecode, Tactical, terrain |
| Languages | English |
| AI Disclosure | AI Assisted, Code, Graphics, Text |
Purchase
In order to download this asset pack you must purchase it at or above the minimum price of $12.74 USD. You will get access to the following files:







