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:
| Stage | Condition | Visual |
|---|---|---|
| Mote | Default start | Layered ASCII noise pattern |
| Shade | Miasma < 20, Bond >= 300 | Face + body pattern |
| Creature | Miasma < 10, Bond >= 900 | Full procedural anatomy |
High miasma blocks evolution entirely. A neglected soul can stay a Mote forever.
Care Actions
| Action | Effect | Bond Points |
|---|---|---|
| Feed | Hunger +25, Weight +1 | +2 |
| Offering | Hunger +40, Weight +3 | +1 |
| Pet | Affection +30 | +4 |
| Purify | Miasma -20 (or -30 during manifestation) | +5 / +7 |
| Answer Call | Temperament +10, ends call | +2 |
| Trials | Symbol-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:
- Soul becomes corrupted
- Karmic debt +1
- Corruption count increments (affects creature generation)
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:
- Manifestation left untreated past 5 minutes
- Temperament call ignored past 2 minutes
- Lights turned on before wake time (disrupting sleep)
Effects:
- Lifespan decay multiplier:
1 + (debt × 0.03)— each point accelerates aging - Debt > 5 at end → “Faded” ending
- Debt <= 5 → “Transcendence” ending
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:
| Stat | Primary Drivers |
|---|---|
| Physical | Hunger stability, weight spike penalty, purification count, sickness count |
| Intelligence | Temperament call answer ratio, trial wins, bedtime discipline |
| Cognition | Miasma reduced via purify, dream log length |
| Kinesthetic | Interaction 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:
- Heads: 1–3, with eye count and character determined by care quality
- Segments: Count from
min(bondPoints/20, 15), width and pattern from soul weight - Limbs: Asymmetric left/right, count from temperament (low temperament → more limbs). Types: arms, legs, wings, tendrils, claws, fronds
- Tails: 0–2, length and split from seed
- Accessories: High care quality → halos, crowns, radiance. Low care → chains, shackles, burdens
- Mutations: High corruption → voidTouched. High max weight → gravityScarred
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.
- Weight 50–70: x1.1 decay. Weight >70: x1.2
- Corrupted: x1.15
- Per karmic debt point: x1.03
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
| Stage | Sleep | Wake |
|---|---|---|
| Mote | 20:00 | 06:00 |
| Shade | 22:00 | 07:00 |
| Creature | 23:00 | 08: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.