A downloadable asset pack

Get this asset pack and 24 more for $304.05 USD
View bundle
Buy Now
On Sale!
15% Off
$14.99 $12.74 USD or more

Dossier generates a mystery and then draws it. Exhibits establish facts. Testimony makes claims. The engine resolves whether an exhibit contradicts a statement, and the whole case lives on a corkboard the package draws - pinned exhibit plates, hand-strung twine, contradiction marks, and a charge sheet that composes itself from what the player actually proved.

Forty-four exhibits, each drawn from geometry, times five case-file treatments: 220 distinct plates. A ledger page, a torn note, a pocket watch, a spent cartridge, a glass shard. Pristine, creased, burnt, bloodied, redacted.

Every image on this page was rendered by the package itself, from a real GameMaker build. There is not one image file in it - no sprite, no atlas, no texture page.

The whole thing in four calls

case_data = dsr_case_make(20260830);
dsr_board_draw(case_data, 0, 0, room_width, room_height, links);
var _hits = dsr_impeachments(case_data.statements, case_data.exhibits);
dsr_case_accuse(case_data, suspect_index);
var _page = dsr_verdict_page(case_data, x, y, w, h);

44 exhibits x 5 treatments = 220 plates

The corpus is drawn, not collected. Documents - ledger page, torn note, telegram, letter, envelope, ticket stub, calling card, receipt, map fragment, photograph, newspaper cutting. Personal effects - pocket watch, spectacles, signet ring, locket, cigarette case, comb, hip flask, matchbook, fountain pen, button, glove. Weapons and tools - blade, cartridge, cosh, cord, crowbar, hatpin, chisel, wire. Substances - phial, medicine bottle, powder packet, wax seal, candle stub, inkwell, tobacco tin. Traces - boot print, fingerprint card, lock of hair, fabric scrap, key, buckle, glass shard.

Each one then carries a history. Creased is folded and dog-eared; burnt is attacked from one corner; bloodied is spattered and pooled; redacted is struck through with censor's bars that leave the first line clear. Wear is material-aware: paper creases, and brass scuffs - a pocket watch gets scratches and burnish, not fold lines, because metal does not fold.

Ten stocks, every ramp built in Oklab

foolscap, kraft, newsprint, card, photo, glass, steel, brass, leather, bone. Every exhibit can be cut from any stock, and each stock carries its own five-stop ramp plus ink, blood and char roles derived from its own ground. Every exhibit is shaded by surface normal against one fixed lamp, so a pocket watch and a wax seal read as physical objects rather than as icons, and an exhibit authored one day sits beside one authored the next without arguing.

The engine, and what it actually resolves

A case is a cast, a victim, a place, an hour and a culprit. Exhibits carry facts. Suspects give statements, and some of them lie. dsr_impeachments returns every place a statement is broken by an exhibit, deduplicated by speaker and exhibit so a charge sheet never repeats itself.

Correct and proven are separate answers, deliberately. A player can name the right suspect on a hunch without establishing anything - the charge sheet then shows the accusation with no ruled rows under it and no stamp. Naming the right suspect and having proved the contradictions is what gets the page stamped.

Measured by the package's own in-engine suite over 200 generated cases: zero unsolvable and zero unfair - every case can be cracked from the evidence it ships with.

The verdict page draws the document and none of the words

dsr_verdict_page renders the physical charge sheet - the paper with its deckle edge, the ruled rows, a miniature of the exhibit that did the work at the head of each row, the struck stamp - and returns the rectangles for you to set your own text into, in your own language and your own font.

A verdict page carries sentences: names, a place, an hour. Sentences are the one thing here that cannot be generated for you, because they are in your game's voice. Baking English into the package would mean forking the file to ship in any other language.

Verification, stated honestly

GML cannot be unit-tested outside the engine. What this package does instead is test itself inside it: Dossier.exe -selftest runs 1,477 assertions against the shipping build and writes the result to a file. They cover all 44 exhibits and all 220 plates being built, no two exhibits collapsing onto the same picture, every triangle fan's star-shaped precondition, every declared extent against real measured geometry, every stock ramp resolving with readable ink, the 200-case fairness sweep, and determinism.

What those assertions cannot do is judge a picture. The gallery above was reviewed by eye, and several rounds of corrections came out of that review rather than out of the suite.

One number worth stating plainly, because the store page should not claim more than the engine does: two exhibits essentially never contradict each other - measured at 0 contradictions across 1,440 exhibit pairs, with 78 sound links. That is the model being honest. An exhibit is physical evidence and is generated true; it is testimony that lies, and that is where the 102 contradictions across 2,916 statement-exhibit pairs come from.

Compatibility

Built and gate-verified against GameMaker runtime 2024.14.4.268 (the stable GMS2 runtime), on Windows, through a real Igor package build - 287 resources, zero errors. The .yymps was then extracted and compiled again on its own, so the payload you import is a complete compilable project rather than a folder that happened to zip.

Pure GML: no extensions, no shaders, no platform calls, so it carries to every export target GameMaker supports. Import with Tools ▶ Import Local Package, open rm_dossier_demo, press Run. GMRT is not a dependency and is not claimed; the GMS2 runtime is supported by the vendor until at least Q1 2028.

Determinism and namespacing

Nothing calls random(). Every tear, every blood spatter and every censor's bar comes from a seeded generator, so the same case seed is the same case forever and nothing flickers between frames. Every script, macro and global is prefixed dsr_ / DSR_: GML's global namespace is flat, and a collision inside your project is a support ticket nobody can debug remotely.

What you get

  • Dossier.yymps - the local package: 14 scripts of raw readable GML, header-documented
  • a runnable demo room, which is the quickstart and the smoke test
  • the demo driver object - drag to link exhibits, 1-5 to accuse, V for the verdict, N to deal a new case
  • two Open Sans fonts (Apache-2.0). These matter here: the verdict API draws no words, so a project importing without them gets a charge sheet with nothing written on it

One licence per developer who works with the source. Build anything you like with it, commercial or free, forever. Do not resell or redistribute the package itself.

Dossier is one of a set of pure-GML generators from this studio. Hearth furnishes interiors from purpose and occupant, and Borough draws the outsides of the same buildings - all three lit by the same lamp and built on the same relief discipline.

Purchase

Get this asset pack and 24 more for $304.05 USD
View bundle
Buy Now
On Sale!
15% Off
$14.99 $12.74 USD or more

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:

Dossier.yymps 391 kB

Development log

Leave a comment

Log in with itch.io to leave a comment.