Résumé
← projects

Glyphwild

A work-in-progress ASCII MMORPG in Rust and wgpu, now a single-player slice: grass, water, creatures, spells, and the interface are all text glyphs drawn on the GPU.

/ rust · wgpu · wgsl · game · rendering

A gameplay capture of the boss fight: the red dragon Cinnabrax, drawn in glyphs on scorched ground, with two glowing Cinderlings, health frames, and the player's scribe at top right

Overview

Glyphwild is a 2.5D MMORPG where every visible thing is text. Grass, water, trees, creatures, spells, and the interface are glyphs drawn on the GPU, with HDR lighting and bloom. The repository holds a single-player vertical slice, built so an authoritative server can join later without a rewrite. There is no server yet.

Features

You play a Cinderscribe, a scribe of fire, in a land called the Margins. You leave the town of Baseline, cross the Descender Mere, push through the night-dark Gutterwood, and burn the dragon Cinnabrax in its arena.

  • Quests: a six-quest chain of kill, deliver, collect, reach, and talk-to objectives that unlocks the boss arena
  • Combat: real-time tab targeting with cooldowns, six spells, and an automatic attack; Flame Lance interrupts casters, and Cinderfall scorches the ground it hits
  • Enemies: melee boars, ranged Quillbacks, Inkhound packs, and Blotcaller casters, with aggro, threat, leashing, and respawns
  • Boss: two phases of telegraphed circles and cones, rains of cinders, burning ground, Cinderling adds, and an enrage timer
  • Progression: levels 1 to 10, five equipment slots, four rarities, loot tables, potions, and a vendor
  • Saves: versioned, validated autosaves

How It Works

Figures are not text art. Each one is a puppet of painted, lit parts seen through a filter of glyphs.

  1. Paint: vector shapes become a lit material with fur, scale, leaf, and bark patterns, painted once at load.
  2. Pose: animation clips move the parts each frame. People, beasts, and the dragon have gaits solved from where their feet land, and cloth, ears, and tails swing on springs.
  3. Compose: each figure’s parts go into a figure atlas, where they cast soft shadows on one another.
  4. Filter: a fragment shader cuts the figure into one grid of glyph cells that travels with it. Each cell picks a glyph by brightness, or a stroke along the silhouette, and a dim copy of the material shows between glyphs.

When the camera pulls back, the cells grow in crossfaded steps, so glyphs stay legible and never shrink into texture.

Technical Details

  • Stack: Rust 2024 and wgpu, with WGSL shaders kept inside downlevel limits for phones
  • Simulation: a deterministic 30 Hz tick with no rendering, IO, clock, or ambient randomness; it takes intents and returns events and snapshots
  • Client boundary: the client talks only to LocalServer, and a network client could implement the same surface
  • Content: classes, abilities, monsters, quests, the map, and art in plain RON, validated as a whole and embedded in the binary
  • Rigs: a standard-library Python generator writes the rigged puppets, and CI checks that the files match it
  • Tests: unit, property, and rule tests, GPU smoke tests, and a determinism test where a scripted bot plays the whole chain, then a replay must reach the same state hash

Design Decisions

Treat the simulation as a server now. It owns every outcome and checks every intent against the world: cooldowns, range, line of sight, and bag space. A refused intent comes back as an event, so the client can explain it.

Material under glyphs. The first pass placed glyphs by hand, cell by cell. Detail stopped at the cell count, motion meant swapping frames, and the result read as text pasted into the world. Puppets under a filter fixed all three.

One bot, three jobs. The same scripted bot drives the determinism test, the balance runs, and the gameplay captures. It acts only through intents, so the simulation checks it like a player. It played the capture above.

Status

Work in progress. Desktop is playable end to end. The Android and iOS builds compile but have not run on a device, and frame rates on the target phones have not been measured.

A darker art pass has reached its first checkpoint: ranked lights, per-region moods and color grading, and a rebuilt interface. Content still uses neutral moods, so the world has not darkened yet. The capture above predates the new interface.

How I Built This

Coding agents built the slice in a cloud container, from a kickoff brief. In the art pass, an independent verifier checks each unit of work, and every commit must pass the repository’s gate.