A downloadable asset pack

Buy Now$14.99 USD or more

Your world has a history. Your history screen is a list of strings.

Every project with a world eventually accumulates records: the year the city was founded, the war that ended an age, the plague, the coronation, the voyage. They sit in a ScriptableObject or a JSON file, correct and complete, and then they get drawn as a vertical stack of text in the engine's default UI, and nobody reads them.

Annals draws that list as a chronicle page. An era band per age, a distinct generated mark for every event, reign ribbons under the years each ruler held, and the ornament that makes it an object rather than a chart. Hand it your records and it composes the page.

58 hand-authored marks. 7 media. No images.

There is no atlas, no sprite sheet, no font, no material and no shader anywhere in this package. Every device, every era ground, every ornament and every letter is a signed distance function drawn in code by a software rasteriser included in the source. The package ships zero image files, and you can check.

What is in the corpus

  • 26 event devices — war, siege, treaty, alliance, founding, coronation, death, birth, plague, famine, fire, flood, earthquake, storm, omen, eclipse, discovery, voyage, migration, schism, rebellion, council, trade, ruin, law and oath. What actually happened, drawn beside the year it happened in.
  • 10 reign devices — crown, circlet, laurel, helm, mitre, signet, sceptre, hand, star and mask. By what right the ruler held those years.
  • 10 era grounds — plain, ruled, hatched, diapered, waved, mottled, starred, gridded, marbled and scorched. What the surface of one age's register actually looks like up close.
  • 12 ornaments — fleuron, rosette, knot, vine, cartouche, corner, terminal, tassel, chain, pilcrow, crescent and sun.

Two axes that multiply

The medium is a property of the whole page; the tincture belongs to each age within it. They are independent, so a war in the First Age and a war in the Fifth are the same drawing in two different colours, exactly as a real illuminated chronicle distinguishes its registers, and eight ages never read as one band repeated eight times. Vellum is the palest, warmest page, written in iron gall and gilded. A woodcut is grey rag paper with one spot colour and no metal anywhere, because a relief print cannot make metal. A star chart inverts the whole thing: the ink goes silver on deep indigo, and every mark's modelling turns over with it. The amber data log steps deliberately sideways off the ladder, so the set is not a gradient.

It uses your words, and it refuses to guess

An event's kind is your own string — "war", "plague", "founding" — matched whole word, so "charcoal" can never claim "coal". An event whose kind the corpus does not recognise is drawn as a plain tick and not as a borrowed device. That is deliberate: a device makes a claim about what happened, and crossed swords beside a royal wedding is not a stylistic slip, it is a false statement about your data that a player reads as true.

Ages are optional

Supply none and the page bands your events itself, cutting the ages at the largest gaps between consecutive years — which is where a reader already perceives a boundary, and why equal slices would put a cut through the middle of your busiest decade. Supply your own when your world names its ages. An age with no events still gets its register, because a history is entitled to say that nothing happened for four hundred years, and a composer that dropped that band would be editing your world.

The deep past does not look like last week

Every event carries a fading derived from its own date against the span of the whole chronicle, so the founding of the world is worn almost into the page while last year's treaty is sharp and freshly inked. Undated records fall back to their position in the list, which is still an order.

The shortest integration

var chronicle = new Chronicle { Title = "ANNALS OF THE VEIL", Medium = Medium.Vellum };
chronicle.Events.Add(new ChronicleEvent("The Salt War", "war", -128, 0.85f));
chronicle.Events.Add(new ChronicleEvent("Vesper Crowned", "coronation", 514, 0.85f));
Texture2D page = AnnalsPage.Compose(chronicle, 900, 1200);

That is the whole minimum. Negative years work. Fractional years work.

Deterministic, and honest about cost

Nothing calls UnityEngine.Random. Every choice that looks random is hashed from the record's own text plus a seed you control, so the same history composes the same page forever.

Read this part before you buy. It is a CPU rasteriser with no atlas and no GPU, and it is not fast. Measured over five runs on one ordinary Windows workstation: 480x640 takes 11.0 to 12.9 seconds, 720x960 takes 26.3 to 27.5, and 900x1200 takes 39.5 to 41.6. That is seconds, not milliseconds, it works out at roughly 36 to 41 seconds per megapixel, and the high figure is an observation rather than a ceiling — a busier machine will exceed it. Cost is linear in pixel count, so halving both dimensions quarters it.

This is a bake-time cost and not a frame-time cost, and the package is built for that: compose when a save loads or a chapter ends, run the pure bake on a worker thread (the demo scene does exactly this, so the window stays responsive while it works), cache the texture, or export a PNG in the editor and ship the image. The editor window and the demo both print the real figure for your machine.

Full readable source. Nothing is obfuscated, minified or compiled away. Add your own event devices, re-tune the palettes, change the layout.

Requirements: Unity 2022.3 or newer. Every render pipeline, because the package does not render — it writes pixels into a Texture2D. No package dependencies. No Resources folder. Three assembly definitions; delete the Demo folder and nothing else notices.

AI disclosure: written with AI assistance. Code: yes. Graphics: yes — and note that "graphics" here means the drawing code, since the package ships no image files at all. There is no diffusion model and no network call anywhere in the art path. Sounds: no. Text and dialog: no.

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:

annals-unity.zip 243 kB
Version 1

Development log

Leave a comment

Log in with itch.io to leave a comment.