Cards and slots
Three days ago I shipped an upgrade tree. Today I deleted it.
A plan doc landed in my downloads folder this week. Subtitle: “Replaces the strain-forking upgrade tree.” I read it once, hated that I knew it was right, read it again, and then spent the day ripping out everything I’d built on Tuesday.
The arc, in three stages.
Stage one was the original design. The bat bites aliens. Bites earn XP. XP gets spent in a skill tree to unlock virus mutations. Mutations branch the active strain into a new strain. You carry up to four strains at once, switch between them with the D-pad, and pick the right one mid-night. Entry 06 is me building that. Custom backend in C++, ForkStrain, UVirusStrainConfig, ResearchedUpgradeIDs, banked CurrentXP. The whole machine.
Two things bothered me that I tried not to look at. The first was the four-strain D-pad. Managing four concurrent infections in a town across a single night sounded clever in a doc and felt, when I actually pictured playing it, like email. I had four configurations to remember and the player was supposed to pick the right one in the half-second before a bite. The second was XP. The currency was infections. The mutations were powered by the same loop they were trying to enable. It’s a wheel turning a wheel.
Stage two was a middle ground I thought about for a day and didn’t write down. The tree stays, but XP just unlocks the option permanently. A separate dial called “slots” controls how many of the unlocks you can equip onto the active strain at one time. So the tree was the catalog of what existed, and the slots were the loadout. That fixed the four-strain juggling problem (one strain, equipped loadout) but kept the XP treadmill. The currency was still infections paying for the thing infections were supposed to enable.
Stage three is what I built today. No tree. No XP. Two axes:
- Cards, earned by exploring. Roosts in the world drop cards. Contamination sites (a dead bird, a poisoned well, a quarantine zone) drop the rarer ones. The bat’s library is the cards it has found, and the library grows by wandering.
- Slots, earned by infecting. The act of biting things grows the bat’s slot capacity. The currency is the behavior itself, not a counter you watch tick up.
Cards into slots, one card per slot, the active strain is the sum of what’s equipped. I dropped the idea of stacking the same card twice in the same loadout midway through the afternoon. Stacking would have let you double down on Airborne, but it also meant the design would only feel deep if I made the slot count grow fast. Cleaner solution: ship two different Airborne-ish cards and let the player collect both if they want to invest hard. Acquisition becomes the depth axis. The slot count can stay small without the design getting shallow.
I ripped about half the GameMode out. ForkStrain, ActiveSlotStrainIDs, AssignStrainToSlot, OnStrainForked, the four-strain library plumbing, RetiredStrainIDs, RunRetirementSweep, the D-pad input bindings. Deleted four widgets that were going to need full rewrites anyway: StrainLibraryWidget, MutationScreenWidget, ActiveStrainWidget, XPDisplayWidget. Renamed UVirusUpgradeDefinition to UVirusCardDefinition. The save game got smaller. The header got smaller. Everything got smaller.
Added one new thing I’m pleased with: a field-researcher voice that writes a three-beat note about each night. “Strain S4 expanded by 6 this cycle, outpacing mortality of 2. Spread was bounded by the available susceptible population.” It reads off the actual daytime sim’s bottleneck, never invents results, and never tells the player they were wrong, only suited to this and not that. The journal lives on the same screen where the player composes the loadout, so the feedback loop closes in one place. No grades, no scores, no “S-tier strain.” Just a quiet observation and then a new night.
The C++ contract for the new strain editor is in place. No WBP for it exists yet. That’s tomorrow. Build’s green, six new files written, four deleted, and the upgrade tree I was proud of three days ago is sitting in git status next to its replacement.
Anyway. Two pivots in four days, both deletions. The next entry should be about building something.