Borough - Settlement And Architecture That Draws Its Own Buildings
A downloadable asset pack
Every image on this page was rendered by the product itself. There is not one sprite in the package.
A tileset gives you a town that looks the same in the last hour of your game as in the first. Borough gives you one that changes while it is played. You hand it a settlement — how prosperous it is, what it trades in, how wealthy, how old, how damaged — and it composes every building on the street from that state. Storeys, roof form, window rhythm, door furniture, wall material, signage and weathering are all derived. Nothing is swapped.
town = bor_settlement_create(1618);
pal = bor_palette_build(town);
bor_street_draw(town, pal, 0, 0, room_width, room_height, 7); // the whole street, one call
Then move it and draw again:
bor_settlement_step(town, 25, 0.6); // 25 good years - a storey goes on, glazing arrives
bor_settlement_damage(town, 0.5); // a siege - boards, soot, a bay comes down
44 authored forms, and the volume is the point
- 14 building roles — cottage, townhouse, longhouse, shopfront, inn, smithy, mill, granary, warehouse, chapel, guildhall, gatehouse, watchtower, tenement. Every pair is checked for silhouette separation, because silhouette is what a player can actually tell apart. The closest pair in the corpus sits at d=0.0287 against a floor of 0.020.
- 10 roof forms — gable, hip, half-hip, gambrel, mansard, catslide, monopitch, parapet, conical turret, crow-stepped gable. A steep alpine pitch and a flat southern parapet are different outlines, not different colours.
- 8 window rhythms — single, paired, triple, arcade, oriel, dormer, blind bay, shuttered.
- 6 door treatments and 6 wall treatments — timber frame, rubble, ashlar, brick, render, half-render.
On top of that: 6 regions × 6 trades, and 14 materials each with a five-stop relief ramp.
The light is the reason it does not look like the engine
Every mass is shaded by surface normal against one fixed lamp, from a five-stop Oklch ramp computed per material. There is no hex table anywhere in the package — the colours are solved. A material's ramp darkens, desaturates and compresses as it wears, because a weathered wall is not just a darker wall: it is one whose lit and shadowed faces have moved closer together. A soot-black wall with a bright highlight on it reads as wet plastic, and this one does not.
Age and damage are real, and they are different things
Age sags the ridge, accretes a lean-to onto the gable end, and greens the wall from the ground up. Damage works from the top down instead — soot streaks below the eaves, boards across the windows, and at the far end of the range a bay of wall gone entirely, which is the only weathering that changes the silhouette. Three hundred years of ageing moves a cottage's outline by d=0.0587 and takes it from 178 drawn parts to 300. Both axes are continuous.
What runs, and what it cost to prove
- Builds clean through the real GameMaker compiler — Igor, runtime 2024.14.4.268, exit 0, zero errors and zero warnings.
- 1001 assertions pass, 0 fail, inside a compiled executable rather than a simulation of GML. 118 building masses and 68 roof masses are proven convex and simple; every role pair is checked for silhouette separation; the corpus counts are asserted, so the numbers above cannot drift from the code.
- The store images are baked by the product, through its own public draw calls, so this page cannot show you something the package does not do.
Stated plainly: GML cannot be unit-tested outside the engine, and the IDE's import dialog cannot be driven headlessly. The .yymps is verified by extracting it and compiling the project inside it — which catches a missing file or a resource the manifest forgot — not by watching the import succeed.
COMPATIBILITY
- GameMaker 2024.11 and newer. Built and verified against runtime 2024.14.4.268.
- Pure GML. No extensions, no DLLs, no shaders, no sprites, no texture pages.
- Nothing global is unprefixed — every script, macro and global is
bor_/BOR_. - It draws into the rectangle you give it and does not touch your rooms, layers or cameras. No absolute paths, no hardcoded room or layer indices.
- Import order does not matter. Nothing is captured at load time.
WHAT YOU GET
Borough.yymps— Tools ▸ Import Local Package, import everything, openrm_borough_demo, press Run.- 14 scripts of raw, readable GML, every public function carrying a header block. Minification would be a defect.
- A runnable demo room with a readout, and a demo object short enough to read in one sitting.
- Open Sans (Apache-2.0) for the demo readout only, with its licence and NOTICE inside the package. Delete the fonts and you lose the readout and nothing else.
Core Systems Asset Factory
| Published | 1 day ago |
| Status | Released |
| Category | Assets |
| Author | CSAF — Core Systems Asset Factory |
| Made with | GameMaker |
| Tags | 2D, architecture, buildings, GameMaker, Generator, gml, Medieval, Procedural Generation, sourcecode, town |
| Languages | English |
| AI Disclosure | AI Assisted, Code, Graphics |
Purchase
In order to download this asset pack you must purchase it at or above the minimum price of $14.99 USD. You will get access to the following files:







Leave a comment
Log in with itch.io to leave a comment.