A downloadable asset pack

Buy Now$14.99 USD or more

Not an icon pack. Vestige takes an achievement's own properties — its category, its tier, its id — and strikes a medal from them: a blank, a rim, a device sunk into the field, a legend around the edge, and a ribbon in its category's colours. Two awards are never the same medal, and the same award is the same medal forever.

Pure GML. There is no sprites/ directory, because there is nothing to put in one.

Why it looks like metal

There is one lamp, up and to the left, and every closed outline in the package is bevelled against it. A device is not a silhouette — it is the top of a raised shape, and the little wall between that top and the field around it points a different way on every side. Light that wall from a fixed lamp, colour it from the alloy's five-stop ramp, and the shape stops being a sticker and starts being struck metal.

That idea is about a hundred lines, and the rims, the blanks, the trophy case, the reveal toast and the drop shadows are all the same function pointed at something else.

What is in it

  • 42 devices — crossed blades, a gauntlet, a compass rose, an anvil, an open book, a harp, an hourglass, a honeycomb. Hand-drawn, six in each of seven categories.
  • 12 blanks — round, scallop, cross, star, shield, hex, octagon, quatrefoil, sunburst, rosette, cameo, cog.
  • 6 rims — plain, beaded, reeded, cable, laurel, dentil. Every bead and leaf struck and lit separately.
  • 7 alloys — iron, bronze, silver, gold, electrum, obsidian, adamant. A tier ladder you can read with the name covered up.
  • 8 ribbons — plain, pales, bend, chevron, saltire, quartered, barry, in each category's own dyes.
  • 6 case papers — walnut, ebony, slate, ivory, oxblood, verdigris.

And a real system under it

vst_init();
vst_define("first_blood", { name: "First Blood", category: "valour", tier: 1, points: 10 });
vst_grant("first_blood");

That is the whole integration.

  • Counters and tiered chains. vst_define_chain("slay", {...}, [10, 100, 1000]) defines three linked awards climbing the alloy ladder off one shared counter.
  • Prerequisites, resolved to a fixpoint, so a chain four deep unlocks correctly however it is reached.
  • Secret awards with three states — hidden, a blank you can see but not read, and earned.
  • Points, per-category completion, and a recency list.
  • Save and load as one string, tolerant of ids you have since renamed, and it never fires a toast for something the player earned last session.
  • The strike — the die falls, the metal flashes, a shock ring runs out of the impact, the medal settles and the panel comes out from behind it. Under four seconds, and it is a pure function of time, so it is the same on any framerate.
  • A trophy case with category tabs, progress bars, paging, and empty wells where the unearned awards go — so a player sees what is missing rather than a wall of grey.

Honest notes

  • It is not a platform achievement service. It tracks and displays awards inside your game. If you need Steam or console achievements, call their API alongside vst_grant.
  • It does not persist by itself. vst_save() hands you a string; where it goes is yours.
  • It ships no sound. Play your own on the strike.
  • Detail follows pixel size. Below about 190px the rim legend is dropped and below about 78px the incised lines go too, because draw_line_width floors every stroke at one pixel and a groove drawn under that is grey mush. A medal that keeps its silhouette reads; one that keeps its detail does not.

Verified

  • Built through Igor on runtime 2024.14.4.268 — exit 0, 0 errors, 0 warnings, 420 resources.
  • 760 assertions run in-engine against that build, 0 failures — the alloy ramps, the tier separation, the blank-form distinctness, the device corpus, the animation's continuity and the trophy case's layout across five window shapes.
  • Every image on this page was rendered by the code you are downloading, through the same public draw path, with the product's own alloys and its own fonts. vst_bake ships in the package so you can re-run it.
  • Not verified: GameMaker's import dialog cannot be driven headlessly. The .yymps payload is verified by extracting it and compiling the extracted project with Igor, which proves it is a complete compilable project and does not prove the IDE's importer likes the manifest. If it does not import cleanly, say so and it will be fixed.

Requirements

GameMaker 2024.14 or newer. Windows, macOS, Linux, HTML5, mobile — it is GML and geometry, so it runs wherever your game does.

Licence

One seat, unlimited commercial games, no redistribution of the source as an asset. Every medal it strikes is yours — name them, market them, put them on your key art, sell merchandise with them. Full terms in LICENSE.txt.

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:

Vestige 1.0.0 - GameMaker local package (.yymps) + raw GML 384 kB

Development log

Leave a comment

Log in with itch.io to leave a comment.