A downloadable asset pack

Buy Now$14.99 USD or more

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.yympsTools ▸ Import Local Package, import everything, open rm_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

Purchase

Buy Now$14.99 USD or more

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:

Borough.yymps 364 kB

Development log

Leave a comment

Log in with itch.io to leave a comment.