A tactical two-player match-3: one shared board, charged wires and a fight for ground. Working title.
Download PDF Design breakdownMana Fields is a duel of two players on one 6×14 match-3 board. One player's keep stands below it, the other's above. Whoever first brings the rival keep to 0 wins.
The board is more than a source of resources. Units stand on it, the borders of each player's ground run across it, and under every row lies a wire that builds up charge. The same swap pays mana, charges a wire, can strike the enemy and can expose your own units to an overload.
A turn is spent on three things: matching gems, casting spells and moving units, at 1 AP each. Mana buys units, direct damage, healing and buildings. Units walk forward on their own, strike, and widen the ground their owner is allowed to play on.
Both players play the same gems. Gravity depends on whose turn it is: for the bottom player gems fall down, for the top player they fall up.
Every match charges its row. A bonus shape on your own ground releases that charge into the enemy. Charge nobody takes overloads the row and hits whatever stands on it.
You may only swap on your own cells. Ground comes from the hero at your keep and from your units in the field. The middle of the board starts out neutral.
The game's interface is in English; in-game names are used as they are, so they can be found in the screenshots.
A swap, a spell or a unit's step. Each costs 1 AP.
The harder the shape, the more damage. Cascades count the same way.
Mana goes to the player, charge settles on the wire of every row of the shape.
Mana becomes units, damage, healing and buildings.
A blow flies down its column. Units and charged shields in its way take it first.
Ground runs across the whole loop: it decides where you may swap, how much mana a match pays and whether a bonus shape strikes at all.
Opened with a tap on the crest or on a card in the book. The board under the card is dimmed.
Every screenshot is taken from build 0.3.6 in a 720×1280 window, in Hot seat: Plasma Syndicate at the bottom, Flux Commune at the top. The battle runs on a fixed seed; some states are reached through the debug menu.
Every number lives in one file, config.json, and changes without touching code. The monospaced label to the right of a heading says which key controls what.
Match-3 feeds the spellbook. Bonus shapes pay less mana, but they strike and release the wires. Every turn the player chooses between income and damage.
| Shape | Mana | Damage | Releases rows |
|---|
Wires make every match dangerous, even the rival's. Charge on a row that nobody takes will sooner or later hit the units on it or tear the wire.
The charge of one row. The wire is shared by both players.
Ground decides where a player may act at all. It can be taken only with units, so a summon is also an expansion.
First the units' total power is compared. On a tie, the hero's power in their home rows decides. Otherwise the cell is neutral. A unit's influence also runs back, as wide, to its own edge of the board: a unit that has walked forward is not cut off from home.
The right to swap (both cells yours), full mana for a match and the strike of a bonus shape. Units go on nodes with all four cells around them yours, buildings on lines with both rows yours from end to end.
Every spell costs 1 AP on top of its mana. Racial spells cost no mana, but work once a turn and burn 1 row of your own gems: whole, or only its blue gems for Storm.
| Spell | Price | What it does |
|---|---|---|
| Strike | 8 | 10 damage to a unit, a building (at a shield's pad) or a keep, your own included. Nothing in the way stops it. |
| Ranger | 10 | Summons a fighter onto your own ground. |
| Tower | 10 | Summons a tower of two blocks with a small diamond between them. It never moves. |
| Bombarder | 10 | Summons a bomber that moves only when you move it. |
| Heal | 9 | +10 HP to your keep, a unit or a building of yours, up to its maximum. |
| Collect | 8 | Drains 3 rows: all their charge becomes mana, no damage is dealt. |
| Hammer | 11 | Knocks out one gem on your own ground. What falls into the gap may match. No limit a turn. |
| Frost | 5 | Freezes 1 row the enemy holds until the end of their next turn: they cannot swap gems in it. |
| Charge | 11 | Releases 3 rows: all their charge strikes the enemy. |
| E-Shield | 88 | A shield on a line, 12 HP. Puts blows out with the charge of the 2 neighbouring rows, 1 charge for 1 damage. |
| Load | 9 | Gives an E-Shield of yours 10 charge of its own. It is spent on blows before the rows' charge and cannot be released. |
| Rewire | 0 | Mends a torn wire. |
| Killer Red | 1 | 2 damage to the enemy keep, every enemy unit and building. |
| Storm Blue | 1 | Every blue gem in 1 of your home rows goes: 1 direct damage to the enemy keep for each, past its shields, plus 1 damage from blue mana that resistance cuts. |
| Armor Green | 1 | +1 HP to your keep and all your units, past their maximum. |
Carries the frontier forward. Fully charged, it shoots the nearest enemy anywhere on the board: units first, then buildings, then the keep.
Two blocks side by side with a small diamond between them: one body that stops blows along 3 columns. Fully charged, it shoots the nearest enemy anywhere on the board: units first, then buildings, then the keep. Builds nothing.
Fully charged, it lobs bombs, each at a random 2×2 square of the enemy's half or at their keep (31 equal targets). It hits everything of the enemy's it touches and blows up 4 gems with no mana and no charge.
With no charge it stops nothing. Broken by Strike, Killer and any blow down a column where a pad stands.
Units stand on the nodes between gems and take up no cells, so the board never shrinks. A blow down a column loses as much as the obstacle has HP, and the rest flies on.
A race sets a passive effect every turn, one spell of its own, and the colour of mana its keep is fully immune to; of every other colour, half reaches the keep. The book of ten shared spells is the same for all.
At turn end: 2 damage to the enemy keep and every enemy unit. Nothing intercepts it.
Spell: Killer.
Keep immune to red mana damage; takes half from .
At turn start: +1+1+1 mana.
Spell: Storm.
Keep immune to blue mana damage; takes half from .
At turn start: +3 HP to your keep and +2 HP to every unit of yours, up to their maximum.
Spell: Armor.
Keep immune to green mana damage; takes half from .
Resistance works only against damage from mana (a shape's strike, a release, Charge) and only for the keep: 100% of its own colour, 50% of the others. Direct damage lands in full, and units take all of it.
The bot does not change the rules, but it sets the campaign's difficulty. It tries every action on the real game and weighs the result.
Levels 1–5: the bar's height is the error of its judgement, in points. 6: no error, plays only on its own side. 7: across the whole board. 8–9: plan 2 and 3 actions ahead. 10: the same, but weighs the 8 best options instead of 4.
Three big questions are wide open: what the game is called, what it is about and how it looks. They come first below. After them, the places where numbers and the interface deserve a check. All of this is drawn from the code and the build, not from playtests.
None of the three is settled. Everything in the screenshots is a working version, assembled to test the mechanics.
Mana Fields is a working title. The word "mana" comes from fantasy, while the game now speaks the language of wires, charge and plasma.
The project began as stylised fantasy and was repainted as cyber. The layers are mixed: keep, hero, spell and race live next to wire, E-Shield and Plasma Syndicate. The unit mark files are still called imp, mage, treant.
Right now it is flat neon on near-black. Gems and units are drawn as one-colour silhouettes; the interface is built from rectangles without a single picture. There are no characters, background or setting.
These three decisions are linked: the name and the vocabulary depend on the theme, and the theme sets the art. The mechanics barely depend on them, so they can change without touching the rules.
Sources: config.json, scripts/game.gd, scripts/bot.gd, spec.md, build 0.3.6. Where the spec disagreed with the config, the config was taken.