Soulforger (Irmos Care)

Category: Virtual Pet / Simulation
Stack: React + Vite (browser)
Play it: Itch.io


Premise

You raise a soul from a formless mote to a fully realized creature. Every care action — feeding, petting, purifying, answering temperament calls — shapes the soul’s stats, appearance, and final form. Neglect accumulates as karmic debt. The creature you end up with is a direct reflection of how you cared for it.

The design question was: can a tamagotchi loop produce genuinely unique outcomes through stat-driven procedural generation?


Soul Stages

Evolution is gated by bond points and miasma:

StageConditionVisual
MoteDefault startLayered ASCII noise pattern
ShadeMiasma < 20, Bond >= 300Face + body pattern
CreatureMiasma < 10, Bond >= 900Full procedural anatomy

High miasma blocks evolution entirely. A neglected soul can stay a Mote forever.


Care Actions

ActionEffectBond Points
FeedHunger +25, Weight +1+2
OfferingHunger +40, Weight +3+1
PetAffection +30+4
PurifyMiasma -20 (or -30 during manifestation)+5 / +7
Answer CallTemperament +10, ends call+2
TrialsSymbol-choice minigame (~33% win)+5 on win

Feeding vs. Offering is a weight management tradeoff — offerings restore more hunger but spike weight faster, which affects Physical PICK and creature anatomy.


Miasma Manifestations

Every 3 hours, a manifestation event fires. Miasma rises at 3x normal rate (0.3/s vs 0.1/s) while a manifestation is active. If not purified within 5 minutes:

Purifying during a manifestation clears corruption, gives +7 bond points, and resets the 3-hour timer. This is the primary urgency mechanic — miss a manifestation and the consequences compound.


Temperament Calls

Random interval (0–30 minutes). The soul demands attention. Answer within 2 minutes for +10 temperament and +2 bond. Ignore it and karmic debt +1. The answer rate feeds directly into Intelligence PICK.


Karmic Debt

Sources:

Effects:

Karmic debt is the long-term consequence system. Individual mistakes are small, but they accumulate into a fundamentally different outcome.


PICK Stats

Computed once at Creature evolution. Four stats derived entirely from care history:

StatPrimary Drivers
PhysicalHunger stability, weight spike penalty, purification count, sickness count
IntelligenceTemperament call answer ratio, trial wins, bedtime discipline
CognitionMiasma reduced via purify, dream log length
KinestheticInteraction cadence, balance of feed/pet/purify actions

Each stat uses weighted sub-components (e.g., Physical: 35% hunger stability, 25% weight spike penalty, 25% purify bonus, 15% sickness penalty). The weights are defined in balance.ts and could be retuned without code changes.


Procedural Creature Generation

The creature’s anatomy is generated from a seed plus care stats via generateDeepAnatomy:

Names are generated from syllable banks with epithets derived from stats (e.g., “Thrice-Forsaken” for high karmic debt, “Beloved of the Eternal” for high bond).

The palette uses hue from bond points and temperament, with saturation and lightness affected by karmic debt, miasma, and remaining lifespan.


Decay and Lifespan

Base lifespan: 168 hours. Decay per second: base × weightMult × corruptedMult × karmicMult.

Hunger drains at -0.15/s awake. Affection at -0.1/s. Miasma rises at +0.1/s (or +0.3/s during manifestation). Sleep halts all decay and enables dream fragments.


Bedtimes

StageSleepWake
Mote20:0006:00
Shade22:0007:00
Creature23:0008:00

Waking the soul early costs karmic debt +1 and discipline -8. Bedtime discipline feeds into Intelligence PICK.


Dream Fragments

While sleeping, every 10 minutes a dream is logged from themes like “veiled sigils,” “silent arches,” “incense embers,” “distant bells.” Dream log length feeds Cognition PICK — more sleep means more dreams means higher cognitive development.


Persistence

Save key: soulforger_save. Offline simulation up to 360 minutes in 1-minute steps. Events queue to localStorage when offline and flush every 15 seconds when reconnected.