A downloadable asset pack

Buy Now$12.99 USD or more

Psyche is a sanity system for horror games where the meter is the least of it. It keeps one value from 100 (clear-headed) to 0 (gone) in five tiers - Lucid, Uneasy, Frayed, Delirious, Undone - and as it falls it changes what the player sees: things appear at the edge of vision, the walls go wrong, the text the player reads rots, and the picture itself starts to fail.

Every image on this page was drawn by the package itself, rendered by the shipped build.

48 apparitions, all drawn at run time

  • Figures: a silhouette in a doorway, a thing crouched in the corner, the tall one, a kneeling mourner, a ceiling crawler, one half through the wall, a procession - smoke bodies with rim light and eyes
  • Watchers: eyes in the dark, a blink set, a stare through a crack, a portrait that follows, a keyhole pupil, eyes under the furniture, a window of too many eyes
  • The room lies: a door that was not there, a tilted frame, an extra window, a stair to nothing, a corridor that should not fit, an opening in the plaster
  • The walls: a creeping stain, cracks, a breathing patch, frost, handprints climbing, drips running upward, veins, a face in the wallpaper
  • Writing: whispers rising up the wall, tally marks still being cut, letters peeling off and floating away, a crawling line, a word written backwards, letters coming back through fresh paint
  • Light: a failing sconce, a second shadow with nobody to cast it, light under no door, a lamp burning downward, a dark that eats light, candles nobody lit
  • Your double: footprints behind you, your after-image, a reflection a beat late, breath that is not yours

Each is drawn in the palette of the tier that summoned it - cold grey-blue at Uneasy, violet at Frayed, bruised rose at Delirious, blood and ember at Undone - and each breathes, blinks, flickers or crawls. Placement is deterministic per save, room and tier (a player can learn a haunted room and be right) and nested (worsening only ever adds), and apparitions keep to the edge of vision.

The picture goes wrong

psy_screen_draw takes the frame your game already drew and draws it back with the tier's damage: the edges closing in with a heartbeat, the colour draining toward the tier's hue, film grain, rows of the picture sliding sideways, the colour channels pulling apart. No shader - it runs on every export target - and one strength argument scales it all for an accessibility slider.

The text rots, and the meter shows it

Pass any sign, note or line of dialogue through psy_corrupt: letters slip, words repeat and hollow out, and at the worst tiers something else writes into the sentence. psy_draw_meter is a HUD bar in the five tiers' own colours that trembles at Delirious and worse.

my_psyche = psy_create({ seed: 1847 });
application_surface_draw_enable(false);
// Step: a drain while it is dark, a fright, your cue when a tier falls
psy_step(my_psyche, delta_time / 1000000, _dark ? 0.2 : 0);
psy_add(my_psyche, -25, "the body in the well");
// Draw GUI
psy_screen_draw(application_surface, 0, 0, display_get_gui_width(), display_get_gui_height(), my_psyche.tier, current_time / 1000, my_psyche.seed);
psy_draw_meter(my_psyche, 32, 48, 320);

The meter itself is a full system: falling into a worse tier is immediate, climbing back needs a margin (no strobing on a boundary), a drain finds a level instead of sliding to the bottom, every change keeps its cause, tier crossings arrive as events, and it saves and loads. A runnable demo room is included: a house you go down through, with a drain running and keys to frighten, restore, freeze and change room.

Tested, not just compiled

The in-engine suite reported 302 of 302 assertions on the shipped build: the tiers and their hysteresis, drain and settling over an hour of simulated play, save and load, placement over 40 saves x 5 tiers, text corruption, every one of the 48 apparitions drawn on a real surface with its ink measured against its footprint, and the screen layer measured on a test card (Lucid untouched; Undone darkens the corners, splits the colours, adds grain and warps the rows). The package was imported into a blank GameMaker project and used the way the Readme documents it (24 of 24 checks), 144 hostile calls against its documented API crashed nothing, and every function the Readme names was checked against the package (40 of 40).

Compatibility

  • GameMaker 2024.14 or later; built and tested on runtime 2024.14.4.268 (not tested on GMRT)
  • Pure GML: no extension, no shader, no sprite. Everything is namespaced psy_, PSY_ and global.psy_
  • Two Open Sans font resources (Apache-2.0, notice included) letter the six writing apparitions, the meter's tier name and the demo; everything else draws without a font
  • You get the .yymps package, the full readable project, the Readme and the licence

Also from CSAF

Pair it with Affliction, status effects with generated icons, for what fear does to the body; pass Missive's letters through psy_corrupt and watch them rot; making it in RPG Maker MZ instead? Lucidity is the sanity director for MZ.

AI disclosure: the code and the generated artwork of this package were written with AI assistance. It contains no audio.

Purchase

Buy Now$12.99 USD or more

In order to download this asset pack you must purchase it at or above the minimum price of $12.99 USD. You will get access to the following files:

Psyche_GameMaker.zip 629 kB

Development log

Leave a comment

Log in with itch.io to leave a comment.