DEV Community

Yurukusa
Yurukusa

Posted on

50 Lines of Code. 15 Build Names. One Accidental Challenge Mode.

Before v0.10.0, every run in my roguelike ended the same way.

Stats screen. Kill count. Time survived. Game over or victory. Back to the start.

There was nothing that said this run was yours specifically.

The problem I didn't know I had

The game has a synergy system. You equip spell modules, slot in supports, and if the right combination triggers, you get a named effect — Phantom Punisher, Chain Reaction, Soul Harvest.

But that name only appeared in the upgrade menu. The moment the run ended, it vanished.

You could survive 12 minutes with Phantom Punisher active, survive into Endless Mode, kill 400+ enemies — and the result screen would show you "Kills: 412" in plain gray text. No acknowledgment of what you built to get there.

The run was over. The identity was gone.

What I built

I asked Claude Code to look at the synergy system and implement automatic build naming on the result screen.

The logic it came up with (and I approved) works in layers:

  1. If you activated 3+ synergies → you're "Perfect Cascade" (the rarest outcome)
  2. If you activated 2 synergies → check a combo table for special names, otherwise use the primary synergy name
  3. If you activated 1 synergy → use that synergy's name
  4. If no synergies but you have supports equipped → generate from the support combination ("Pierce & Trigger Caster", "Chain & Fork Caster")
  5. Nothing equipped at all → "Solo Wanderer"

The result: every run ends with a line like [ Phantom Executioner ] in cyan on the result screen, between the separator and the star rating.

func _generate_build_name() -> String:
    var syn_names: Dictionary = {
        "phantom_punisher": "Phantom Executioner",
        "chain_reaction": "Chain Annihilator",
        "death_spiral": "Spiral Reaper",
        "frozen_storm": "Frostbolt Cyclone",
        "plague_bearer": "Plague Spreader",
        "thunder_god": "Storm Channeler",
        "soul_harvest": "Soul Reaper",
        "chaos_engine": "Chaos Master",
        "summoners_pact": "Wisp Summoner",
        "elemental_convergence": "Elemental Avatar",
    }
    var combo_names: Dictionary = {
        "phantom_punisher+soul_harvest": "Undying Phantom",
        "chain_reaction+frozen_storm": "Chain Blizzard",
        # ...
    }
    if _active_synergy_ids.size() >= 3:
        return "Perfect Cascade"
    # ... (rest of the logic)
Enter fullscreen mode Exit fullscreen mode

About 50 lines total.

All 10 build names (and how to unlock them)

Build Name How to get it
Phantom Executioner Phantom Punisher synergy (pierce + trigger)
Chain Annihilator Chain Reaction synergy (chain + fork)
Spiral Reaper Death Spiral synergy (orbit + trigger)
Frostbolt Cyclone Frozen Storm synergy (ice shard + chain)
Plague Spreader Plague Bearer synergy (poison nova + spread)
Storm Channeler Thunder God synergy (spark + concentrate)
Soul Reaper Soul Harvest synergy (holy beam + trigger)
Chaos Master Chaos Engine synergy (3+ different prefixes)
Wisp Summoner Summoner's Pact synergy (summon wisp + trigger)
Elemental Avatar Elemental Convergence synergy (3+ different elements)

Special combo names (two specific synergies at once):

| Build Name | Combination |
|---|

Running Claude Code autonomously? Claude Code Ops Kit ($19) — 10 hooks + 6 templates + 3 tools. Production-ready in 15 minutes.

---|
| Undying Phantom | Phantom Punisher + Soul Harvest |
| Chain Blizzard | Chain Reaction + Frozen Storm |
| Entropy Spiral | Death Spiral + Chaos Engine |
| Storm Avatar | Thunder God + Elemental Convergence |
| Plague Wisp | Plague Bearer + Summoner's Pact |

And if you activate 3 or more synergies simultaneously: Perfect Cascade. (This is rare. The synergy requirements stack up fast.)

No synergies but supports equipped? You get a name from your supports — "Chain & Pierce Caster", "Orbit & Trigger Caster", etc. Something specific to what you actually built.

Nothing at all: Solo Wanderer.

What changed

The mechanical change is small. The experiential change is not.

When the result screen shows "[ Phantom Executioner ]", there's a beat. A recognition moment. That's what I built. That's what this run was.

It's the same information as "you had Phantom Punisher active" — but it hits differently when it's a name rather than a system label.

A few effects I noticed:

Players now have something to say. "I got to Endless as a Chain Annihilator" is shareable. "I had chain + fork supports" is not. The name converts a technical state into a social object.

The result screen became worth reading. Before, you'd glance at the kill count and close it. Now there's a line that feels personal, and people read past it.

The build decision has weight. Knowing you're building toward a named identity makes the upgrade choices feel more intentional. "Am I going Phantom Executioner or Chain Annihilator this run?" is a real question now.

The "Solo Wanderer" case

This one surprised me.

Players who go through a full run without activating any synergy — intentionally or not — get the name "Solo Wanderer."

It could have been "No Build" or "Default." Instead it's a title. A playstyle identity.

It wouldn't surprise me if someone tried a Solo Wanderer challenge on purpose. A fallback case designed itself into a mode.

What I learned about small identity mechanics

This feature took less time to implement than the feature before it. But it changed how the game feels more than anything else I shipped this month.

The lesson: players need a mirror at the end of a run.

Stats are data. Names are identity. You need both, but the name is what makes the data meaningful.

In a roguelike where every run is supposed to feel different, you need to actually tell the player that this run was different. A build name does that in one line.

Play it

Spell Cascade is free in the browser: yurukusa.itch.io/spell-cascade

v0.10.0 is live. Find out what your build is called.

What name did you get?

Top comments (0)