49 spells, 14 runes

Spellbox doesn't have a spell list. It has two rows of seven runes, and every spell is one rune from each. Here's the whole grid, the rules behind it, and why the entire magic system is a single table.

A Spellbox battle: the wizard's Frost Beam streaks across the arena into a goblin, and the battle log notes a critical hit and the goblin chilled for three turns
Beam plus Frost: a Frost Beam, here a critical hit that chilled the goblin for three turns.

How a delivery and an effect make a spell

Every spell is two runes. The delivery decides how the spell travels: a projectile, a burst around a point, a beam, a chain that jumps between targets, a mine, a shotgun spread, or a cast on yourself. The effect decides what it does when it lands: fire, frost, force, void, mend, poison, or lightning.

You carry five rune slots into a run, chosen at the workbench in your house, so no build has everything. A build with two deliveries and three effects can cast six different spells. One with three deliveries and two effects can also cast six, but with a different feel. Choosing what to leave behind is half the game.

The whole grid

Here are all 49, straight from the game's source. Rows are deliveries, columns are effects.

Fire Frost Force Void Mend Poison Lightning
Projectile Fireball Ice Shard Force Bolt Void Arrow Mending Shot Venom Bolt Thunder Bolt
Burst Flame Burst Frost Nova Shockwave Null Zone Healing Pulse Toxic Cloud Storm Burst
Beam Fire Ray Frost Beam Force Lance Disintegrate Healing Ray Acid Stream Volt Beam
Chain Chain Fire Ice Chain Magnetic Pull Null Chain Mend Chain Plague Chain Arc Chain
Mine Fire Trap Frost Trap Knockback Mine Silence Trap Healing Well Venom Trap Shock Trap
Shotgun Scatter Flame Ice Scatter Buckshot Blast Void Scatter Mend Scatter Toxic Spray Shock Burst
Self Ember Cloak Frost Skin Countershell Null Shell Rejuvenate Venom Skin Static Shield

Mana is just addition

Each rune has a mana cost, and a spell costs the sum of its two runes. There's no per-spell pricing to balance, and you can work out the cost of anything in your head.

Delivery Mana Effect Mana
Self 8 Force 8
Projectile 10 Frost 10
Mine 12 Poison 11
Beam 15 Fire 12
Chain 18 Lightning 13
Shotgun 18 Void 14
Burst 20 Mend 16

So a Fireball is 10 + 12 = 22 mana, and the battle screen shows exactly that. The cheapest spell in the game is Countershell (Self + Force, 16 mana). The most expensive is Healing Pulse (Burst + Mend, 36).

What each effect leaves behind

Five of the seven effects can leave a status on whatever they hit. The roll happens on a hit, crits included, never on a miss. Hitting something that already has the status refreshes its duration instead of stacking it, so there's no gain in spamming one effect.

Effect Status Chance Lasts
Fire Burning: damage over time 30% 2 turns
Frost Chilled 40% 3 turns
Void Silenced 25% 2 turns
Poison Poisoned: 3 damage per turn 45% 4 turns
Lightning Stunned 20% 1 turn

Force and Mend don't proc: Force pushes and pulls, and Mend heals. Poison spells deliberately hit for about half as much up front, because the poison does most of their work. Those 45% odds and four turns of ticking make it the patient player's effect.

The odd ones out

Self

Self spells don't travel at all. They wrap the caster in a reactive aura for a few turns. Countershell cuts incoming damage in half and has a 30% chance to reflect a whole hit back at the attacker. Frost Skin absorbs part of each hit and can chill whoever made it. Static Shield has an even chance to send half of each hit back. Rejuvenate is a plain heal over time: 14 health a turn for three turns.

Mine

Mines don't fire when cast. They arm on a cell you pick and go off three turns later, hitting a 3×3 area, so they damage whoever is standing there when the fuse runs out, not whoever was there when you cast. Cards can shorten the fuse, or let you arm several mines in one turn, and each extra mine adds 10% to your mine damage for the rest of the fight.

Luck

Every attack has about an 8% chance to miss and a 12% chance to crit for 1.5×, and damage rolls vary by 15% either way. That's enough that a plan which almost works will sometimes work, and a plan that should work will sometimes not. Most of the stories people tell about a run start there.

The whole system is one table

In code, a spell is a pure function of its two runes. The same pair always produces the same spell, and the game's entire spellbook is one table keyed by delivery and effect:

'projectile+fire':  { name: 'Fireball',     damage: 20, speed: 240, duration: 3 },
'burst+frost':      { name: 'Frost Nova',   damage: 10, radius: 90, duration: 3 },
'beam+void':        { name: 'Disintegrate', damage: 21, speed: 400 },
...

Adding a spell means adding a row, not touching combat, rendering, or the interface. A pair with no row still works, falling back to sensible defaults, so a new rune can't break a fight. The game asks for the current spell every frame (the battle screen previews it as you pick runes), so results are cached and frozen. Each pair is built once and shared, and nothing can change it by accident.

That small, closed design is why the grid above could be copied straight out of the source for this post. When the magic system is one table, the documentation and the game can't disagree.