2026-11-03 21:47:33
Raise a war-band of ridiculous beasts. Train them, rest them, scar them, and lead the survivors to the throne.
Twelve elemental clans of beasts send their fiercest champions to the arena. You do not buy a deck, you raise a war-band: every beast you recruit trains, fights, gets hurt, rests and grows. Some fall, the survivors carry the marks of every battle. Only one war-band holds the throne at the end.
AniMagica is an auto-battler strategy card game. It is free to play with no pay-to-win. It offers an accessible yet rich game experience that is fun and challenging to master.
A band of veterans. The units are not disposable pieces. Each unit keeps its story (experience, level, 💀 Deaths, battles and kills): it grows when it fights, takes a 💀 Death each time it dies in a battle (COMBAT.md “💀 Deaths”), becomes Injured after 3, and heals when it rests in the 🏡 Refuge (REFUGE.md). The player chooses who fights, who rests and who is sold, so the survivors of the last battle are the ones the player raised. A game ends with the report of the band (the MVP and the veterans).
It borrows some proven and successful concepts like
What sets it apart from the games above:
Many of the metas can be ignored, and the game can be played without any knowledge of these mechanics.
Of course, experienced players will use and stack these mechanics to their advantage.
A player’s game ends when they’re eliminated or become the last one standing.
The placements follow the ranking of COMBAT.md (“Ranking”).
There are two distinct ladders. Do not confuse them.
After each turn, the 8 players of a game are ranked on the local ladder. It orders the Swiss-style pairing and the in-game standings. The final placement is the elimination order (last one standing is 1st); among players eliminated at the same time, this ranking breaks the tie. The result panel of the end of the game shows this placement among all the players (“You finished 4th of 8”); a shared victory shows no place.
The in-game standings are always shown: online on the board (players
list) and the end screen; offline inside the Oracle
(visible once it opens), refreshed after each turn. One line per player
in ladder order, without rank number: ⚔️ for the next opponent of the
player (or the eliminated player whose ghost it fights), the name (🙂
You, 💻 3 for a bot), 💚 and the 💚 Vitality, then its 2 main elements
(most units first) on its ⚔️ Battlefield as it entered the last battle, or
out once eliminated. Example:
⚔️ 💻 3 💚 9 🔥 3 💧 2. The ties use those frozen boards,
never the boards being planned. The standings are the only place that
shows the next opponent offline: there is no other message for it.
Every player has Rank points (start at 1000, never below 0). The global ladder orders all players by Rank points. It is only used to find players of similar skill when a game is created; it does not affect a game in progress.
Similar skill = close Rank points. The 8 players of a game are the first queued player plus the 7 queued players whose Rank points are the closest to theirs. The accepted gap starts at 100 points and widens by 10 points per second of waiting, so nobody waits forever.
When a game ends, each player’s placement (1st = last one standing) changes their Rank points like in auto-battlers, with a multiplayer Elo:
S = (N - placement) / (N - 1): 1st = 1, last = 0
(N = 8).E = 1 / (1 + 10^((lobbyAverage - rating) / 400)),
normalised so the lobby sums to N/2.delta = round(K * (S - E)) with K =
40, the new rating is floored at 0.Result: the top 4 gain points, the bottom 4 lose points, the total stays close to zero, and a stronger player gains less (and loses more) than a weaker one for the same placement.
Worked example, 8 players with equal ratings (E = 0.5):
| Placement | Score S | Delta |
|---|---|---|
| 1st | 1.00 | +20 |
| 2nd | 0.86 | +14 |
| 3rd | 0.71 | +9 |
| 4th | 0.57 | +3 |
| 5th | 0.43 | -3 |
| 6th | 0.29 | -9 |
| 7th | 0.14 | -14 |
| 8th | 0.00 | -20 |
👤 Players will be able to purchase vanities like skin and such. The game will never have pay-to-win features as it usually ruins the experience of many players.
Orientation. This spec is written in portrait terms: the 3 lanes are vertical columns (left, center, right), the rows are front and back from the enemy side down to the player, and the player is at the bottom. The ⚔️ Battlefield zone and the combat replay draw this same grid in both orientations of the screen: in landscape the grid is not turned, only the place of the zones changes (landscape: the 🧺 Marketplace on the full width at the top, then the 🏡 Refuge, the ⚔️ Battlefield and the Oracle). The words “left / center / right lane” and “front / back row” therefore mean the same on every screen.
The screen turns. The orientation follows the window: portrait when it is taller than wide, landscape otherwise, at the start and each time it changes, any number of times (portrait, landscape, portrait…). The game in progress is kept: every zone is laid out again with its cards, doors and title, and the zoomed card and the tooltip close. The turn waits while something moves (the end of a turn and its combat, an animation that locks the UI, a drag) and happens when it is over, in the last orientation of the window (none when the window turned back meanwhile). The menus are laid out again.
Each player has its own section of the ⚔️ Battlefield, which is
structured into a 3x2 grid. There are 3
Vertical 🛣️ Lanes. Each 🛣️ Lane
contains 2 rows: Front and Back,
giving you a total of 6 positions on your side of the
⚔️ Battlefield, mirrored by 6 on the opponent’s side. You can deploy one
unit per position, giving you the possibility to engage up to 6 units
per combat (at most 2 per lane). 🛣️ Lanes confine combats: units interact
only within their 🛣️ Lane (units cannot change lanes, see
COMBAT.md MOVE). 🛣️ Lane pairing is mirrored:
the Left lane faces the opponent’s Left lane (same lane index; the
combat pairs lane i of player 1 with lane i of
player 2). 🛣️ Lanes are resolved in the order center, left, right.
| Left lane | Center lane | Right lane | |
|---|---|---|---|
| Front row | unit 1 | unit 2 | unit 3 |
| Back row | unit 4 | unit 5 | unit 6 |
At the start of the game, the player has limited coins to buy units. For this reason, not all positions are available. The positions and lanes open progressively based on the ⟳️ Turn number: a lane at a time, a pair of positions: the center lane at turn 1, the left lane at turn 3, the right lane at turn 5; the ⚔️ Battlefield is complete at turn 5. The number of lanes with an open position defines how many vitality points can be lost (1, 1, 2, 2, then 3): a lane opens exactly when a lane is added to the cap. The table below shows the ⟳️ Turn at which a position is open.
| Left lane | Center lane | Right lane | |
|---|---|---|---|
| Front row | 3 | 1 | 5 |
| Back row | 3 | 1 | 5 |
| ⟳️ Turn | 🪙 Income | Total Earned | Slots | 💚 Max Vitality Loss† |
|---|---|---|---|---|
| 1 | 4 🪙 | 4 🪙 | 2 | 1 |
| 2 | 5 🪙 | 9 🪙 | 2 | 1 |
| 3 | 6 🪙 | 15 🪙 | 4 | 2 |
| 4 | 7 🪙 | 22 🪙 | 4 | 2 |
| 5 | 8 🪙 | 30 🪙 | 6 | 3 |
| 6 | 9 🪙 | 39 🪙 | same | same |
| 7 | 9 🪙 | 48 🪙 | same | same |
| 8 | 10 🪙 | 58 🪙 | same | same |
| 9 | 10 🪙 | 68 🪙 | same | same |
| 10 | 11 🪙 | 79 🪙 | same | same |
| 11 | 11 🪙 | 90 🪙 | same | same |
| 12 | 12 🪙 | 102 🪙 | same | same |
| 13 | 12 🪙 | 114 🪙 | same | same |
| 14 | 12 🪙 | 126 🪙 | same | same |
| 15 | 12 🪙 | 138 🪙 | same | same |
The income grows by 1 every turn up to turn 6, then by 1 every 2
turns, and never above 12 (it starts at 4 coins). The
bonuses of the cards (income+) come on top of the
table.
† 💚 Max Vitality Loss: from turn 12, or once 3 players remain,
every 💚 Vitality loss costs +1 more (overtime rule, see
COMBAT.md, After each battle).
A unit cannot be dropped on a closed position (the drop is refused). A drop with no slot chosen is auto-placed (below). The client and the server share one rule for deploying, undeploying and reordering: open slots of the turn, no Injured deployment, the deployment traits, the 🏡 Refuge capacity (6); the ideal row is a hint, never a refusal. An injured unit leaving the battlefield does not change which slots are open: open slots depend only on the ⟳️ Turn.
A unit bought while the player owns the same card (⚔️ Battlefield or 🏡 Refuge) merges into it (MERGING.md): the bought card takes no slot, and a merged unit on the ⚔️ Battlefield keeps its slot (the survivor is the ⚔️ Battlefield one). Dropped on the ⚔️ Battlefield, such a purchase needs no free or open slot and moves no unit, whatever the slot it is dropped on: no slot preview, the unit in place stays, the bought card goes from where it was dropped to the 🪦️ Graveyard. Merging is how a few slots hold more power: a Double occupies one slot with the summed stats of two units, so it is also a bigger target for the lane.
👤 Players group their units by vertical 🛣️ Lanes, with each unit assigned to one of 2 horizontal rows.
| position name | Ideal unit | Role | 💪 Attack order |
|---|---|---|---|
| Front row | 🗡 Melee | Tank | 1 |
| Back row | 🏹 Shooter, 🪄 Spellcaster | DPS, Support | 2 |
A unit is in its ideal row only when its type matches the table above (🗡 Melee in the Front row, 🏹 Shooter and 🪄 Spellcaster in the Back row). This is strict: no other row counts as ideal for a type. A ranged unit may stand in the Front row: it reaches more of the lane but fights next to the enemy 🗡 Melee (Disrupted, COMBAT.md). The UI hints (slot highlight when dragging, warning on drop) and the bots follow this rule.
Automatic placement. When a unit is deployed without a chosen slot (auto-deploy, a unit displaced by a deployment, the bots), the game picks the slot in this order, among the open and empty slots only (a displaced unit first tries the ideal row of its own lane, see COMBAT.md, then follows this order):
Dropping on a closed cell. A unit dragged from the ⚔️ Battlefield and dropped on a closed cell (or on no cell) always returns to its original slot, never to a new one; the slot preview shows it while dragging. A card that comes from the 🧺 Marketplace or the 🏡 Refuge and is dropped there takes the automatic placement above. For a unit dragged from the 🧺 Marketplace, the preview says what the drop does: if the ⚔️ Battlefield has an open empty cell, that cell (the automatic placement) is highlighted and the text is “Buy + Deploy”; if the ⚔️ Battlefield is full, the locked cell stays highlighted with the lock icon and the drop is refused.
Preview text of a purchase. Dropping a unit of the
🧺 Marketplace on an open cell also shows “Buy + Deploy”. The text over the
dragged card is the plain Buy, except when the drop also
does something: a unit bought and deployed reuses the three-line text of
the spells (Buy, +, Use, each
line with its own color and size) with its last line replaced by
Deploy, and a purchase that merges into an owned unit
replaces it by Double, Triple,
Quad, Quintuple or Sextuple.
The bots also move a unit placed by the fallback to its ideal row as soon as a slot of that row is available (moving a unit inside the ⚔️ Battlefield is free).
No penalty outside the ideal row. A unit outside its ideal row suffers no penalty other than the position itself: a unit with no enemy in range moves for free until one is (a 🗡 Melee in the Back row attacks once the cell in front of it is free), see COMBAT.md.
COMBAT.md, Placement tactics).At each 🧹️ Maintenance, the 🏡 Refuge steps run in this order:
round((🎖️ Level + ⭐ Tier) / 2) (it is not the
Rested state below).After staying in the refuge for 1 ⟳️ Turn,
MarketExcludesCardsBelowTier only raises the minimum tier
of the cards offered; it never lets a card above the tier of the
🧺 Marketplace appear. A card above the tier of the 🧺 Marketplace can only
appear through the fallback.You can perform these actions:
max(0, max(1, floor(cost / 2)) - 💀 Deaths) coins, where the
cost is its tier: half its cost rounded down, minimum 1, minus its
💀 Deaths (a ⭐ Tier 6 unit: 3, 2, 1, then 0 from 3 💀 Deaths). A merged unit
(Double, Triple …) sells for that value x its copies,
see MERGING.md. A unit with 3 or more 💀 Deaths
sells for 0: this is intended. It is Injured (COMBAT.md “💀 Deaths”) and
can heal in the 🏡 Refuge instead of being sold. A spell
sells for 50% of its cost, rounded down, with a minimum of 1
coin, like a healthy unit. Examples: a 🔮 Spell of ⭐ Tier 1, 2 or 3
gives 1 coin; a 🔮 Spell of ⭐ Tier 4 or 5 gives 2 coins; a 🔮 Spell of ⭐ Tier 6 or
7 gives 3 coins. A temporary discount on the cost of units never lowers
the sell value. A card tagged NotForResell can never be
sold back.market reduce next spell cost,
market reduce next unit cost (${VALUE} coins) and
market reduce upgrade (${VALUE} coins off the next upgrade)
keep a pending discount until it is used (it is not cleared at the start
of a turn, unlike the Oath of allegiance). It applies to the next spell,
the next unit or the next upgrade, then is consumed. Discounts of the
same kind add up, a cost never goes below 0, the unused part is lost.
market free upgrade upgrades the 🧺 Marketplace at once
without paying. When an effect would change nothing (🧺 Marketplace at
maximum tier, upgrade already free) the spell is not consumed and a
message says why. The reduced cost is displayed by the card price and by
the upgrade button.The table below shows the number of cards offered by type. The percentages of unit types are per-slot probabilities: each unit slot independently draws its type with these percentages (they are not exact quotas of an offer).
When the 📦 Shoe has no copy left of the drawn type, the fallback order is:
A unit is never offered twice in one offer. The 🔮 Spell keeps its own slot.
| ⭐ Tier | 🗡 Melee | 🏹 Shooter | 🪄 Spellcaster | 🐼 Units | 🔮 Spells | Totals |
|---|---|---|---|---|---|---|
| 1 | 100% | ❌ | ❌ | 3 | 1 | 4 |
| 2 | 100% | ❌ | ❌ | 4 | 1 | 5 |
| 3 | 65% | 35% | ❌ | 5 | 1 | 6 |
| 4 | 45% | 35% | 20% | 5 | 1 | 6 |
| 5 | 40% | 35% | 25% | 5 | 1 | 6 |
| 6 | 35% | 35% | 30% | 5 | 1 | 6 |
| 7 (max) | 30% | 35% | 35% | 5 | 1 | 6 |
What a unit may have at each tier (no trait or enchantment before tier 2, no 🏹 Shooter before tier 3, no 🪄 Spellcaster before tier 4) is the table “Progression by tier” of UNITS.md.
The table below shows the cost of upgrading the 🧺 Marketplace.
| ⭐ Tier | Upgrade cost | Cumulative Total 🪙 Cost |
|---|---|---|
| 1 | 0 🪙 | 0 🪙 |
| 2 | 4 🪙 | 4 🪙 |
| 3 | 6 🪙 | 10 🪙 |
| 4 | 8 🪙 | 18 🪙 |
| 5 | 10 🪙 | 28 🪙 |
| 6 | 11 🪙 | 39 🪙 |
| 7 (max) | 12 🪙 | 51 🪙 |
| ⚙️️ Phase | 🏷️ Name | Automatic |
|---|---|---|
| 1 | 🧹️ Maintenance | ✅ |
| 2 | 🧰 Preparation | ❌ |
| 3 | ⚔️ Combat | ✅ |
TRAITS.md “Permanent and temporary traits”). The permanent
traits stay.You take strategic and tactical decisions to prepare for combat. A limited amount of time is given to this phase. It increases at each turn: 30 s at turn 0, +1 s per turn, 45 s from turn 15 on.
| ⟳️ Turn | 0 | 1 | 5 | 10 | 15+ |
|---|---|---|---|---|---|
| Planning time | 30 s | 31 s | 35 s | 40 s | 45 s |
⚔️ Combat replay duration used for the game length budget: ~15 s at speed x1, ~7.5 s at x2, ~2 s with Skip; maintenance and transitions ~5 s.
Each card has its own abilities. There are 🐼 Unit cards to fight and 🔮 Spell cards to boost your units.
By strategically placing them on the ⚔️ Battlefield, you create interactions, build traps and advantages.
TRAITS.md).Orientation. The descriptions of this spec (lanes left / center / right, rows front / back, “vertical” moves along a lane, player A at the bottom) are written in portrait terms, see BATTLEFIELD.md. The combat replay and the ⚔️ Battlefield zone draw this same grid on every screen: the lanes are columns, player A (cells 0..1) at the bottom and the enemy (cells 2..3) at the top. Only the place of the log changes:
| Portrait screen | Landscape screen |
|---|---|
| 🛣️ Lanes on top across the full screen width, the log panel below them | The log on the left (over the 🏡 Refuge), the lanes on its right: the player half lies on the ⚔️ Battlefield zone, so the units do not move when the combat starts |
🛣️ Lane resolution order (center, left, right) and the cell numbers of a lane (0 = player back row … 3 = enemy back row: 2 rows) do not depend on the orientation. The cells of a lane run from the bottom (0) to the top (3).
After each battle:
BATTLEFIELD.md: 1, 1, 2,
2, then 3).The log of the replay (the panel and the console) presents all the units at the beginning, then refers to a unit only by its alias.
UNIT_TYPE_EMOJI ELEMENT_EMOJI (ENEMY-#|ALLY-#) «CARD_NAME» ATTACK_EMOJI ATTACK_VALUE HEALTH_EMOJI HEALTH_VALUE [DEFENSE_EMOJI DEFENSE_VALUE],
for example 🗡🔥ALLY-1 «Wolf» 💪3 ❤️4 🛡️2. The emoji and
their value are written together (no space), the defense is left out
when it is 0, # is the index of the unit among the units of
its side (base 1) over the whole battle, and a unit that is summoned
during the combat is presented when it arrives.Center lane: The enemy wins) is colored by its outcome for
the player: the red of the cells of the ⚔️ Battlefield for a loss, the
yellow of the won title for a win, the color of the log for a tie.UNIT_TYPE_EMOJI ELEMENT_EMOJI (ENEMY-#|ALLY-#) written
without space (🗡🔥ALLY-1): never its name, nor its stats,
nor a suffix such as (enemy).🗡🔥ALLY-1 receives 💀+1 💀 Death, XP+1 (the part that does not
apply is left out, a unit that received nothing has no line). They
replace the two lines of the totals
(🐼 Units that received a 💀 Death, XP gained).ALLY-1 & ENEMY-1 attack each other, then the two
damages are explained on two separate lines
(ALLY-1 deals 💥3 to ENEMY-1 (❤️ 4 → 1)). Any other attack
is one line:
ALLY-1 attacks ENEMY-1 for 💥3 (❤️ 4 → 1).Before each round, check if: * both players have no active units left; it’s a tie — no points are lost * one player has no living units in a lane, they lose that lane * No-progress: a round with no attack and no move ends the lane with a tie when both sides have units alive.
In the combat replay the outcome of a lane is shown without text on the board:
The units in the combat replay:
+25%, -50%, combined as the damage
combines them), each cause named (Dominance +25%,
Disrupted -50%, Round x2);On Hit,
On Kill…), on the step that raised it.Before the first round of a lane (and only when both players have a living unit in it), in this order: the stat effects of the combat start traits (herding, pack instinct, rested, intimidate), then 💪 Attack / ❤️ Health mimicry, then the strikes (first strike: flat damage equal to the level of the unit to the closest enemy, resolved as steps of the round 0). If a side has no living unit left after the strikes, it loses the lane without any round. See TRAITS.md “⚔️ Combat start traits”.
A battle is a series of Rounds until all lanes are resolved. Per Round
A unit is considered active if:
Row-ordered resolution: 🐼 Units on both sides act simultaneously in this order:
💥 Damage is calculated based on the unit’s 💪 Attack, modified by 🕯️ Enchantments
The target’s 🛡️ Shield uses this formula:
lostShield = min(shield, damage); shield -= lostShield;
🛡️ Shield points lost are lost permanently.
The target’s ❤️ Health uses this formula:
lostHealth = min(health, damage - lostShield); health -= lostHealth;
When a unit is dead (❤️ Health <= 0), it is immediately removed from the ⚔️ Battlefield. This frees the space for other units to move.
A unit can only perform one action per round, but special enchantments can allow a unit to perform additional actions.
To ensure combat termination and prevent an endless fight: after round 6, damage doubles at each round, compounding (round 7 = x2, round 8 = x4, round 9 = x8, …).
All modifiers are applied before resolving calculation.
Defensive traits: dodge (-50%) lowers the damage
taken, never below 0 damage. A Protection from
💥 Damage routing: see TRAITS.md, “💥 Damage routing traits”. A share of the damage of an attack can be sent back to the attacker (backlash) or spill to a second enemy (overflow damage, ricochet). These secondary hits raise On wound / On kill on the receiver, the receiver earns the XP of the battle (XP section below), but they are not an ATTACK: no On hit for the source, and they never chain.
Close combat penalty: Disrupted, -50% damage dealt (the unit no longer takes more damage), flat. 💥 Damage is rounded to the nearest 🧮 integer once all modifiers are applied.
The range defines which enemies the attacker can reach, counted in cells of the lane (1 = touching). Close combat is defined by touching an enemy 🗡 Melee unit.
| 🧬 Type | 💪 Attack range | Enemy 🎯 Target policy | Close combat penalty |
|---|---|---|---|
| 🗡 Melee | 1 | Closest | ❌ |
| 🏹 Shooter | 2 | Weakest | 🔴 Disrupted |
| 🪄 Spellcaster | 3 | Furthest | 🔴 Disrupted |
The ranges follow the rows of a side: 🏹 Shooter = rows (2), 🪄 Spellcaster = 2 x rows - 1 (3, the whole lane from its back row).
At the start of the combat, units receive order of attack based on their row that stay constant for all rounds. * The front row units receive the highest priority, then the back row. * Even a unit change row or walks into an enemy cell, it keeps the priority of its original home row.
| 💪 Attack order | Optimal 🐼 Unit type | |
|---|---|---|
| Front row | 1 | 🗡 Melee |
| Back row | 2 | 🏹 Shooter, 🪄 Spellcaster |
The row of a unit decides its attack priority (above), what it reaches (the ranges count cells) and how soon it is touched by an enemy 🗡 Melee.
| 🐼 Unit type | 📝 Notes | |
|---|---|---|
| Front row | 🗡 Melee | The 🗡 Melee touches the enemy front row at once; when it is empty it needs a MOVE (its action) to reach the enemy back row |
| Back row | 🗡 Melee | (1) |
| Front row | 🏹 Shooter, 🪄 Spellcaster | They reach the whole enemy lane but stand next to the enemy front row (2) |
| Back row | 🏹 Shooter | It reaches the enemy front row; when only the enemy back row is left it spends one round to step up |
| Back row | 🪄 Spellcaster | It reaches the whole lane and is protected by its front row |
📝 Notes: * (1) A 🗡 Melee behind an ally cannot pass it: it can only move through empty cells, so it attacks once the cell in front of it is free (its ally moved on or died). * (2) A 🏹 Shooter or a 🪄 Spellcaster suffers the close combat penalty (Disrupted) as soon as it touches an enemy 🗡 Melee.
🛣️ Lane with player A at the bottom of the table, player B at the top (on every screen). A’s 🏹 Shooter stands in the front row. B has a 🗡 Melee (front, ❤️ Health 10) and a 🏹 Shooter (back, ❤️ Health 3 + 🛡️ Shield 1). Both are in range (distance 1 and 2), so A’s 🏹 Shooter picks the weakest: ❤️ Health + 🛡️ Shield = 4 for B’s 🏹 Shooter, against 10, and attacks B’s 🏹 Shooter. From A’s back row the same 🏹 Shooter would reach B’s front row only (distance 3 to B’s back row). A’s 🪄 Spellcaster would target B’s back row, the furthest, from any row.
A’s front 🏹 Shooter faces B’s front 🗡 Melee (❤️ Health 4, 🛡️ Shield 0) and B’s back 🏹 Shooter (❤️ Health 2, 🛡️ Shield 2). Both have ❤️ Health + 🛡️ Shield = 4, so the tiebreak is the closest: A’s 🏹 Shooter attacks the 🗡 Melee (distance 1, against 2).
Numbering the cells of a lane from A’s back row (0) to B’s back row (3): A’s front row is cell 1, B’s front row is cell 2.
All actions are carried out automatically.
🐼 Units have 1 action per round.
If there is an enemy within reach, the action is always an ATTACK.
There are only 2 possible actions: ATTACK and MOVE. The MOVE costs the action: one cell per action, so a unit that moves does not attack in the same round, except a unit with charge. There is no PREPARE action any more: a unit that can neither attack nor move waits.
ATTACK:
MOVE (a unit with no enemy in range):
🕛 End of a lane: the combat replay walks every unit left back to its home cell (its home row on its own side), so that each one stands in its camp when the result is shown. Only the view moves: the units keep their slot of the ⚔️ Battlefield.
round((🎖️ Level + ⭐ Tier) / 2) (a unit without
💀 Deaths gets nothing).Progression has 5 levels. Merging identical units (Double, Triple …, MERGING.md) is the other, bigger way to grow a unit.
| 🧬 Trait | XP given per turn |
|---|---|
| 🟢 Mentoring | 1 |
| 🎖️ Level | XP required | Cumulative XP |
|---|---|---|
| 1 (start) | 0 | 0 |
| 2 | 2 | 2 |
| 3 | 3 | 5 |
| 4 | 3 | 8 |
| 5 (Max) | 4 | 12 |
first strike (damage = level, 1 to
5), the by level effects and On level up (see TRAITS.md, TRIGGERS.md).| ☯ Element | 🗿 Clan | Associated animals | Metas | Environment |
|---|---|---|---|---|
| 🔥️ Fire | 🐓 Rooster | Chicken Peacock Ostrich Flamingo Pheasant Guinea Fowl | - | Farmlands, Wetlands, Coasts |
| 🔥️ Fire | 🐱 Cat | Tiger Lion Hyena Leopard Jaguar Cheetah Puma Lynx | Eating units to improve | Jungle, forests |
| 🔥️ Fire | 🐉 Dragon | Griffon Bird of Prey Succubus Harpy Basilisk Hydra | Improving on wound | Mountain, Volcano |
| 💧 Water | 🐍 Cobra | Shark Octopus Python Moray Eel | Def–, Atk++ | Caverns, Mangroves |
| 💧 Water | 🐖 Pig | Bear Hippo Wild boar Rhino Tapir Capybara Warthog | Def++ | Grasslands, Swamps |
| 💧 Water | 🐸 Frog | Rat Toad Salamander Newt Mudskipper | Egg laying (Egg Layer) | Forests, wetlands, Coasts |
| 🌿️ Earth | 🐃 Buffalo | Elephant Cow Ox Yak Bison | Def++ | Savannas, scrublands, valleys |
| 🌿️ Earth | 🐼 Panda | Goat Sheep Ibex Markhor Tahr Chamois | Atk–, summon | Hillsides, Bamboo forests |
| 🌿️ Earth | 🐕 Dog | Wolf Fox Dingo Jackal | - | Forest, Tundra, Himalaya |
| 🌪️️ Wind | 🐇 Rabbit | Mouse Hamster Squirrel Hare | Faster XP | Farms, Meadows |
| 🌪️️ Wind | 🦓 Zebra | Horse Donkey Mule Okapi Elk Camel Saiga | Speed, Extra cards, Atk–, Def– | Plains, Deserts, Steppes |
| 🌪️️ Wind | 🐒 Monkey | Gorilla Orangutan Chimpanzee Baboon Gibbon Capuchin | Def–, ❤️ Health–, Atk++ | Jungles, Tropical Rainforest |
Metas notation (what the clan units favour in their stat budget, compared to the tier average of the same unit type):
Atk++ / Atk--: the clan units have a
higher / lower 💪 Attack budget than the tier average.Def++ / Def--: same for 🛡️ Shield,
❤️ Health--: same for ❤️ Health.-: the clan has no specific meta (no clan-specific stat
tendency).🧬 Traits: the traits are specific to an ELEMENT, not to a
clan. A trait reserved to some elements may be carried by the
units of every clan of these elements; the list comes
from the DB (☯ Elements of the 🧬 Traits table) and is in TRAITS.md “☯ Element-specific traits”. A trait for
◯️ Neutral is allowed to every element. A clan has no trait of its own.
This is the target distribution of cards in the game (the cards of the game are still far from it, see “Current distribution” below). The 240 units (20 x 12) are for the 12 clans; only 4 clans (one per element, about 80 units) plus the neutral units are in the shoe of a game. When a clan is drawable: ELEMENTS.md “Reactivity”. ⭐ Tier thresholds: 🏹 Shooters appear from tier 3, 🪄 Spellcasters from tier 4 (see MARKETPLACE.md).
| ⭐ Tier | 🗡 Melee | 🏹 Shooter | 🪄 Spellcaster | 🐼 Units total |
|---|---|---|---|---|
| 1 | 3 | 0 | 0 | 3 |
| 2 | 2 | 0 | 0 | 2 |
| 3 | 1 | 2 | 0 | 3 |
| 4 | 0 | 1 | 2 | 3 |
| 5 | 1 | 1 | 1 | 3 |
| 6 | 1 | 1 | 1 | 3 |
| 7 | 1 | 1 | 1 | 3 |
| 1 clan | 9 | 6 | 5 | 20 |
| 4 clans | 36 | 24 | 20 | 80 |
| 12 clans | 108 | 72 | 60 | 240 |
| 🗿 Clans units | ◯️ Neutral units | 🔮 Spells total | 🃏 Cards total |
|---|---|---|---|
| 240 | 24 | 55 | 319 |
Generated by
tools/card_distribution/card_distribution.py --write from
game/frontend/public/cards.json (the card data is never
edited by the script); refresh it after the cards change.
Current cards for sale (generated from cards.json, the
NotForSale cards are not counted); gap = current - target (negative:
cards missing).
| 🗿 Clan | ☯ Element | Active | 🗡 Melee | 🏹 Shooter | 🪄 Spellcaster | 🐼 Units total | Gap |
|---|---|---|---|---|---|---|---|
| 🐓 Rooster | 🔥️ | ✅ | 15 (+6) ✅ | 10 (+4) ✅ | 8 (+3) ✅ | 33/20 | +13 |
| 🐱 Cat | 🔥️ | ❌ | 0 (-9) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 0/20 | -20 |
| 🐉 Dragon | 🔥️ | ❌ | 0 (-9) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 0/20 | -20 |
| 🐍 Cobra | 💧 | ❌ | 7 (-2) ❌ | 4 (-2) ❌ | 3 (-2) ❌ | 14/20 | -6 |
| 🐖 Pig | 💧 | ❌ | 14 (+5) ✅ | 5 (-1) ❌ | 6 (+1) ✅ | 25/20 | +5 |
| 🐸 Frog | 💧 | ❌ | 0 (-9) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 0/20 | -20 |
| 🐃 Buffalo | 🌿️ | ✅ | 16 (+7) ✅ | 3 (-3) ❌ | 5 (0) ✅ | 24/20 | +4 |
| 🐼 Panda | 🌿️ | ❌ | 12 (+3) ✅ | 8 (+2) ✅ | 7 (+2) ✅ | 27/20 | +7 |
| 🐕 Dog | 🌿️ | ❌ | 2 (-7) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 2/20 | -18 |
| 🐇 Rabbit | 🌪️️ | ❌ | 0 (-9) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 0/20 | -20 |
| 🦓 Zebra | 🌪️️ | ❌ | 0 (-9) ❌ | 0 (-6) ❌ | 0 (-5) ❌ | 0/20 | -20 |
| 🐒 Monkey | 🌪️️ | ❌ | 15 (+6) ✅ | 10 (+4) ✅ | 8 (+3) ✅ | 33/20 | +13 |
| ◯️ Neutral | ❌ | 8 (-3) ❌ | 5 (-2) ❌ | 1 (-5) ❌ | 14/24 | -10 | |
| 12 clans | 81 (-27) ❌ | 40 (-32) ❌ | 37 (-23) ❌ | 158/240 | -82 |
🔮 Spells: 55 (target 55, gap 0).
Gap per clan and tier, melee/shooter/spellcaster
(negative: missing, positive: surplus):
| 🗿 Clan | Active | ⭐ Tier 1 | ⭐ Tier 2 | ⭐ Tier 3 | ⭐ Tier 4 | ⭐ Tier 5 | ⭐ Tier 6 | ⭐ Tier 7 |
|---|---|---|---|---|---|---|---|---|
| 🐓 Rooster | ✅ | 0/0/0 ✅ | 0/0/0 ✅ | +1/0/0 ✅ | +2/+1/-2 ❌ | +1/-1/+3 ❌ | +1/+3/+2 ✅ | +1/+1/0 ✅ |
| 🐱 Cat | ❌ | -3/0/0 ❌ | -2/0/0 ❌ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🐉 Dragon | ❌ | -3/0/0 ❌ | -2/0/0 ❌ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🐍 Cobra | ❌ | -3/0/0 ❌ | 0/0/0 ✅ | +1/-1/0 ❌ | +2/0/-2 ❌ | 0/-1/0 ❌ | -1/0/+1 ❌ | -1/0/-1 ❌ |
| 🐖 Pig | ❌ | +2/0/0 ✅ | -2/0/0 ❌ | +1/0/0 ✅ | +2/0/-2 ❌ | 0/-1/+2 ❌ | +1/+1/0 ✅ | +1/-1/+1 ❌ |
| 🐸 Frog | ❌ | -3/0/0 ❌ | -2/0/0 ❌ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🐃 Buffalo | ✅ | 0/0/0 ✅ | -1/0/0 ❌ | +1/-1/0 ❌ | +3/0/-1 ❌ | +2/-1/0 ❌ | +1/0/+2 ✅ | +1/-1/-1 ❌ |
| 🐼 Panda | ❌ | +2/0/0 ✅ | -2/0/0 ❌ | +1/0/0 ✅ | +1/0/-2 ❌ | +1/-1/+3 ❌ | +1/+3/+1 ✅ | -1/0/0 ❌ |
| 🐕 Dog | ❌ | -3/0/0 ❌ | 0/0/0 ✅ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🐇 Rabbit | ❌ | -3/0/0 ❌ | -2/0/0 ❌ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🦓 Zebra | ❌ | -3/0/0 ❌ | -2/0/0 ❌ | -1/-2/0 ❌ | 0/-1/-2 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ | -1/-1/-1 ❌ |
| 🐒 Monkey | ❌ | +2/0/0 ✅ | -2/0/0 ❌ | +2/0/0 ✅ | +1/+1/-2 ❌ | +2/-1/+2 ❌ | 0/+3/+2 ✅ | +1/+1/+1 ✅ |
| ◯️ Neutral | 1/0/0 | 2/0/0 | 2/3/0 | 2/0/1 | 0/1/0 | 1/1/0 | 0/0/0 |
A unit is always associated with one of the 4 elements + ◯️ Neutral (no clan is ◯️ Neutral):
☯ Elements only give upside: nothing in a lane can punish a placement.
On the ⚔️ Battlefield with the placement in the same lane, allies can affect each other:
Every reaction is on or off: there are no levels, no
+/++/+++ and no stacks. A second
source of the same reaction does nothing.
| lane pos. | 🐼 Unit | 🟢 Buffs | 🔴 Debuffs |
|---|---|---|---|
| Front | 🔥️ Fire | 🟢 Resonance | 0 |
| Back | 🔥️ Fire | 🟢 Resonance | 0 |
| lane pos. | 🐼 Unit | 🟢 Buffs | 🔴 Debuffs |
|---|---|---|---|
| Front | 🌪️️ Wind | 0 | 0 |
| Back | 🌿️ Earth | 0 | 0 |
A mixed lane (🌪️️ Wind, 🌿️ Earth) has no Resonance and no penalty: every unit takes the plain damage.
| Hit (💪 Attack 10) | 💥 Damage |
|---|---|
| 🌪️️ Wind hits 🌿️ Earth | 10 x 1.25 = 12.5 -> 13 |
| 🌪️️ Wind (in a lane of 2 🌪️️ Wind) hits ◯️ Neutral | 10 x 1.25 = 12.5 -> 13 |
| 🌪️️ Wind (in a lane of 2 🌪️️ Wind) hits 🌿️ Earth | 10 x (1 + 0.25 + 0.25) = 15 |
| 🌿️ Earth hits 🌪️️ Wind (dominated, no reaction) | 10 |
| 🏹 Shooter touching an enemy 🗡 Melee (Disrupted) | 10 x 0.5 = 5 |
| Disrupted 🪄 Spellcaster in a Resonance lane | 10 x 1.25 x 0.5 = 6.25 -> 6 |
| ☯ Element | Vibe | Ideas |
|---|---|---|
| 🌿️ Earth | Grounded | Stability, endurance, nature, strength |
| 🔥️ Fire | Passionate | Power, transformation, destruction, intensity |
| 💧 Water | Fluid | Adaptability, healing, mystery, emotional |
| 🌪️️ Wind | Free | Speed, intellect, invisibility, cerebral |
There are 3 types of 🐼 Unit cards.
| 🧬 Type | Defense |
|---|---|
| 🗡 Melee | High |
| 🏹 Shooter | Medium |
| 🪄 Spellcaster | Low |
A card can only be in one of these locations:
| 🚩 Location | When |
|---|---|
| 📦 Shoe | Before purchase |
| 🧺 Marketplace | Before purchase |
| 🏡 Refuge | After purchase |
| ⚔️ Battlefield | After purchase |
| 🪦️ Graveyard | After resale (a 🐼 Unit or a 🔮 Spell sold) or after being cast (🔮 Spell); public to all players. A sold 🔮 Spell does not go back to the 📦 Shoe |
${TRAITS})
follow it in the description: on the same line after “,” (ex:
It gains +50 🛡️ Shield, 🔥 Protection), or on their own
explained line in the long description.Choose a unit. It gains +1 💀 Death, +15 💪 Attack).| 🖼️ Image | 🏷️ Name | ⭐ | X | 🕯️ Enchantment | 👥 |
|---|---|---|---|---|---|
| Brief Incarnation | 5 | 0 | clone target unit 🎯On spell use⏳-1 | ||
| Clone of Power | 7 | 0 | clone target unit 🎯On spell use🧬ephemeral | ||
| Twin Deployment | 6 | 0 | extra on deploy 🎯On purchase⏳-1 | ||
| Return to ashes | 6 | get coins from destroyed units 🎯On spell use | |||
| Lottery Fair | 3 | 0 | get coins random 🎯On purchase | ||
| Delayed Gratification | 1 | 2 | get coins 🎯On next turn start | ||
| Delayed Gratification+++ | 5 | 8 | get coins 🎯On next turn start | ||
| 1 Gold coin | 1 | 1 | get coins 🎯On spell use | ||
| 2 Gold coins | 2 | 2 | get coins 🎯On spell use | ||
| 3 Gold coins | 3 | 3 | get coins 🎯On spell use | ||
| Awakening of a champion | 3 | 3 | get predominant clan unit tier mp 🎯On purchase | ||
| Wild 🔮 Spell Invocation | 3 | 0 | get random spell tier mp 🎯On purchase | ||
| Unbound Mana Gift | 2 | 3 | get random spell tier x 🎯On purchase | ||
| 🌪️️ Wind Summoning | 3 | 0 | get random unit in group tier mp 🎯On purchase | 🌪️️ Wind | |
| 🌿️ Earth Summoning | 3 | 0 | get random unit in group tier mp 🎯On purchase | 🌿 Earth | |
| 💧 Water Summoning | 3 | 0 | get random unit in group tier mp 🎯On purchase | 💧 Water | |
| 🔥️ Fire Summoning | 3 | 0 | get random unit in group tier mp 🎯On purchase | 🔥️ Fire | |
| Fortune’s Fountain | 4 | 1 | income+ 🎯On purchase | ||
| Eternal ☯ Element Rebirth | 5 | 0 | market card replace by element 🎯On purchase⏳-1 | ||
| 🔮 Spell Stream Infinity | 4 | 0 | market card replace by spell 🎯On purchase⏳-1 | ||
| Legion of the endless | 3 | 0 | market card replace by type 🎯On purchase⏳-1 | ||
| No mercy for the weak | 5 | 3 | market excludes cards below tier 🎯On purchase | ||
| Oath of allegiance | 4 | 0 | market reduce all units cost 🎯On spell use | ||
| Magician’s Gift | 2 | market refresh with spells 🎯On purchase | |||
| Renewal of Power | 4 | 0 | market refresh with units next tier 🎯On purchase | ||
| Renewal of 🌪️️ Wind | 3 | market refresh with units 🎯On purchase | 🌪️️ Wind | ||
| Renewal of 🌿️ Earth | 3 | market refresh with units 🎯On purchase | 🌿 Earth | ||
| Renewal of 💧 Water | 3 | market refresh with units 🎯On purchase | 💧 Water | ||
| Renewal of 🔥️ Fire | 3 | market refresh with units 🎯On purchase | 🔥️ Fire | ||
| Renewal of Neutrality | 3 | 0 | market refresh with units 🎯On purchase | ◯️ Neutral | |
| Feast on the Frail | 6 | 0 | prop eat lvp to group💪 Attack,❤️ Health,🛡️ Shield🎯On purchase | ||
| Survival of the Fittest | 2 | prop eat random by mvp💪 Attack,❤️ Health,🛡️ Shield🎯On purchase | |||
| Hard-Won Strength | 3 | 0 | prop+ by level to group💪 Attack,❤️ Health🎯On purchase | ||
| Diamond Pentablade | 4 | 0 | prop+ by tier mp to group💪 Attack🎯On purchase | ||
| Unstable Mutation | 7 | 200 | prop+ random by percentage💪 Attack,❤️ Health🎯On spell use | ||
| Unpredictable Empowerment | 1 | 3 | prop+ random💪 Attack,❤️ Health,🛡️ Shield🎯On spell use | ||
| Baker’s Bounty | 2 | 1 | prop+ to group💪 Attack,❤️ Health🎯On spell use | ||
| Strong and Proud | 5 | 4 | prop+ to group💪 Attack,❤️ Health🎯On spell use | ||
| Lessons of War | 7 | 3 | prop+ to group🪖 Experience🎯On spell use | ||
| Chosen by the sword | 2 | 7 | prop+ to random in group💪 Attack🎯On purchase | ||
| Bloom of Life | 1 | 2 | prop+❤️ Health🎯On spell use | ||
| Elixir of Life | 6 | -3 | prop+💀 Death🎯On spell use | ||
| Fireside Feast | 1 | 1 | prop+💪 Attack,❤️ Health🎯On spell use | ||
| Celestial Blade | 1 | 3 | prop+💪 Attack🎯On spell use | ||
| Diamond blade | 2 | 5 | prop+💪 Attack🎯On spell use | ||
| Elixir of 💀 Death | 5 | 1 | prop+💀 Death🎯On spell use, prop+💪 Attack🎯On spell use | ||
| Shell of Serenity | 2 | 8 | prop+🛡️ Shield🎯On spell use | ||
| Protection at a Price | 5 | 100 | prop+🛡️ Shield🎯On spell use | ||
| Shell of Serenity++ | 6 | 10 | prop+🛡️ Shield🎯On spell use | ||
| Divine 🛡️ Shield | 6 | 50 | prop+🛡️ Shield🎯On spell use | ||
| Echoes of 🪖 Experience | 4 | 2 | prop+🪖 Experience🎯On spell use | ||
| Echoes of 🪖 Experience++ | 6 | 4 | prop+🪖 Experience🎯On spell use | ||
| Ascension through resurrection | 2 | 0 | replace target unit by higher tier unit 🎯On spell use | ||
| Reset of No Regret | 2 | replace units by random units 🎯On spell use | |||
| Requiem for a Massacre | 3 | 0 | replace units by spirits 🎯On spell use | ||
| Protection from 🔥️ Fire | 3 | traits+ 🎯On purchase | |||
| Protection from 🌿️ Earth | 3 | traits+ 🎯On purchase | |||
| Protection from 💧 Water | 3 | traits+ 🎯On purchase | |||
| Protection from 🌪️️ Wind | 3 | traits+ 🎯On purchase | |||
| Last Breath Gift | 5 | 0 | traits+ 🎯On purchase | ||
| Pass the Torch | 5 | 0 | traits+ 🎯On purchase |
Rationale says why):
point: a flat number of value points,
a whole number without limit (a trait can be worth 30 or -30), can be
0;percent: a share of the value points
of a unit of the card tier, from 0 to 1 (negative for a drawback), can
be 0. Most combat traits are worth a constant share of the unit (dodge
about 26%, shield piercing 17%, ricochet 15%), so their value in points
grows with the tier; the points are
round(percent x 7 x tier) (7 per tier, also for a neutral
card).point). The value of a card adds them to the stat points,
with the tier of the card.🃏 Card 🔢 Value =
💪 Attack × 💪 Attack 🪙 Cost +
❤️ Health × ❤️ Health 🪙 Cost +
🛡️ Shield × 🛡️ Shield 🪙 Cost +
🧬 Trait value (point or percent) for each 🧬 Trait +
🕯️ Enchantment value (point or percent of its ✴️ Effect) for each 🕯️ Enchantment
| 🔢 Value points | 💪 Attack | ❤️ Health | 🛡️ Shield |
|---|---|---|---|
| 2 | 2 | 0 | 0 |
| 3 | 0 | 2 | 0 |
| 1 | 0 | 0 | 2 |
| 6 | 3 | 1 | 3 |
| 7.5 | 3 | 3 | 0 |
| ⭐ Tier | ◯️ Neutral 🗡 Melee | ◯️ Neutral 🏹 Shooter | ◯️ Neutral 🪄 Spellcaster | ☯ Element 🗡 Melee | ☯ Element 🏹 Shooter | ☯ Element 🪄 Spellcaster |
|---|---|---|---|---|---|---|
| 1 | 8 | n/a | n/a | 7 | n/a | n/a |
| 2 | 16 | n/a | n/a | 14 | n/a | n/a |
| 3 | 24 | 21.6 | n/a | 21 | 18.9 | n/a |
| 4 | 32 | 28.8 | 25.6 | 28 | 25.2 | 22.4 |
| 5 | 40 | 36 | 32 | 35 | 31.5 | 28 |
| 6 | 48 | 43.2 | 38.4 | 42 | 37.8 | 33.6 |
| 7 | 56 | 50.4 | 44.8 | 49 | 44.1 | 39.2 |
The 🏹 Shooter is allowed from tier 3 and the 🪄 Spellcaster from tier 4, so the cells below those tiers are never used (n/a).
1.5 x ❤️ Health / (💪 Attack + 1.5 x ❤️ Health + 0.5 x 🛡️ Shield). Each
unit type has a band: the data check warns about a card below the floor
or above the ceiling; the ideal is the target of the design, never
checked.| 🐼 Unit type | Floor | Ideal ❤️ Health | Ceiling |
|---|---|---|---|
| 🗡 Melee | 40% | 60-70% | 75% |
| 🏹 Shooter | 30% | 45-60% | 65% |
| 🪄 Spellcaster | 40% | 50-65% | 75% |
In 💪 Attack per ❤️ Health point
(A / H = 1.5 x (1 - share) / share): 30% = 3.5, 40% = 2.25,
50% = 1.5, 60% = 1.0 (💪 Attack = ❤️ Health, the most common stat line), 65% =
0.8, 75% = 0.5.
🗡 Melee holds the most ❤️ Health (front row, attacks the closest enemy, no close-combat penalty), the 🏹 Shooter the least (back row, range 2, attacks the weakest, Disrupted (-50% damage dealt) when touching an enemy 🗡 Melee), the 🪄 Spellcaster is between them (back row, range 3: the whole lane).
Exempt from the check: a card with the tag
NotForSale, Developing, Inactive
or StatExemption (a declared exception, for example a
support caster); a card with the trait Ephemeral,
💪 Attack mimicry, ❤️ Health mimicry,
💪 Attack assimilation or ❤️ Health assimilation
(their stats come from elsewhere); and every ⭐ Tier 1 card (one ❤️ Health
point moves the share by 20 to 30 points: 3/1 = 33%, 2/2 = 60%, 1/3 =
82%). The list is kept in one place in TRAITS.md “❤️ Health share
exemptions”.
The budget check of the data is a warning, not an error.
What a unit may have, by tier. The 🧺 Marketplace of a tier offers the units of its tier (MARKETPLACE.md); a new feature appears at the tier where its cell turns ✅, so a new player meets one idea at a time.
| ⭐ Tier | 🗡 Melee | 🏹 Shooter | 🪄 Spellcaster | 🧬 Trait or enchantment | New for the player |
|---|---|---|---|---|---|
| 1 | ✅ | ❌ | ❌ | ❌ | Stats only (💪 Attack, ❤️ Health, 🛡️ Shield), the 🗡 Melee fight and the lanes |
| 2 | ✅ | ❌ | ❌ | ✅ | The first traits and enchantments |
| 3 | ✅ | ✅ | ❌ | ✅ | 🏹 Shooters: the reach and the Disrupted state (COMBAT.md “🐼 Unit capabilities”) |
| 4 | ✅ | ✅ | ✅ | ✅ | 🪄 Spellcasters: the whole roster of types |
| 5 to 7 | ✅ | ✅ | ✅ | ✅ | Stronger units of the same kinds (the budget grows by 7 points per tier) |
tierOneUnitIsPlain, tierAllowsType in
card-validators.ts) and by a test that compares this table
with the code.tierOneUnitIsPlain in
card-validators.ts). It does not check the spells (a ⭐ Tier 1
spell is an enchantment), nor any card that cannot be bought: a card
with the tag NotForSale is never verified, and neither are
the Inactive and Developing ones (eggs,
spirits, cards created by effects, unfinished cards). The cards that
still break the rule are listed in the test
TierOneUnitIsPlain, until they are fixed in the
database.A unit state is a condition of a unit that the rules compute from the game (the elements, the positions, the 🏡 Refuge, the 💀 Deaths, the battle) or that its card carries as a tag. It is not a trait: it has no row in the DB, no value points, and no 🔮 Spell gives or removes it (TRAITS.md “States that are not traits”). The info scroll of the zoomed card explains the ones that apply (“🃏 Card details” below).
| State | 📝 Description | Explained in |
|---|---|---|
| Dominance | The element of the attacker beats the one of its target: 💪+25% damage dealt. | ELEMENTS.md, TRAITS.md “States that are not traits” |
| Resonance | The 2 units of the lane share the same non-neutral element: 💪+25% damage dealt. | ELEMENTS.md “Between allies”, TRAITS.md |
| Disrupted | A 🏹 Shooter or a 🪄 Spellcaster touching an enemy 🗡 Melee: 💪-50% damage dealt. | COMBAT.md “🐼 Unit capabilities”, TRAITS.md |
| Rested | The unit spent the last 🧹️ Maintenance in the 🏡 Refuge: 💪+25% 💪 Attack for the next battle. | REFUGE.md “Staying in the 🏡 Refuge”, TRAITS.md “⚔️ Combat start traits” |
| Injured | 3 💀 Deaths or more: the unit cannot be deployed or fight, it rests in the 🏡 Refuge until it heals. | COMBAT.md “Deaths”, REFUGE.md |
| Poisoned | Hit by a poisonous unit during the battle: ❤️-50% of its current ❤️ Health at each round end. | TRAITS.md “Round traits” |
| Developing | An egg stage (tag
Developing): it evolves into the next stage at each
🧹️ Maintenance spent in the 🏡 Refuge, and never merges. |
REFUGE.md “Egg chains”, MERGING.md, TRAITS.md “Developing is a tag” |
When neither side of the card has that room (portrait), the scroll goes below the card, else above it, centred on it; in landscape, when neither side of the card has the width of the scroll, the card slides horizontally toward its closer screen border, just enough to leave that width on its other side; the card is never resized, and the scroll always stays inside the screen.
A click on a card shows it in full (the zoomed card). Beside it, never over it (on its right, else on its left, touching the card frame), a scroll like the tooltip one lists what the card does not show, in this order, one note per line:
Triple: 3 copies of the card merged into one unit, then
Not the sum: each added copy gives 50% of the card stats, here 💪+5 💪 Attack, ❤️+3 ❤️ Health and 🛡️+1 🛡️ Shield
(what the copies added, MERGING.md “Stats of a merge”; the 🛡️ Shield only
when they added some). An empty line follows. Then, from a Triple,
Merge boost: ... says which trait is held twice or which
value is multiplied (MERGING.md “Merge boost”). Only here: the card
description does not explain the merge.Developing only (an egg stage, TRAITS.md “Developing is a
tag”):
🥚 Developing: at each 🧹️ Maintenance it spends in the 🏡 Refuge it evolves into <next stage>; it never merges
(no “into” for the last stage of a chain, REFUGE.md “Egg chains”). Only
here: the card description does not explain the tag.Dominance 🌪️ > 🌿 > 💧 > 🔥 > 🌪️: 🔥 Fire beats 🌪️ Wind: +25% damage;
a ◯️ Neutral unit has no Dominance (ELEMENTS.md). An empty line comes
before and after it.A note that does not apply is left out, and there are never two empty lines in a row. The scroll closes with the zoomed card.
| 🖼️ Image | 🏷️ Name | 🗿 Clan | ⭐ | 💪 | ❤️ | 🛡️ | 🧬 Traits | X | 🕯️ Enchantment | 👥 |
|---|---|---|---|---|---|---|---|---|---|---|
| Skarn the Oasis Raider | ◯️ null | 1 | 1 | 4 | 0 | 0 | ||||
| Trade Oasis Keeper | ◯️ null | 2 | 2 | 3 | 1 | last stand | 0 | |||
| The Golden Gladiator | ◯️ null | 2 | 4 | 4 | 0 | poisonous | 0 | |||
| Sand Sentinel | ◯️ null | 3 | 9 | 6 | 0 | first strike | 0 | |||
| Al Zarah The Caravaner | ◯️ null | 3 | 7 | 6 | 0 | dodge | 0 | |||
| ◯️ Neutral Spirit | ◯️ null | 3 | 0 | 1 | 0 | ephemeral | 0 | |||
| The Blackscale Warlord | ◯️ null | 4 | 11 | 11 | 1 | first strike | 0 | |||
| Parasitic Blob | ◯️ null | 4 | 0 | 1 | 0 | attack assimilation, health assimilation | 0 | |||
| Crok Hellscale | ◯️ null | 6 | 12 | 15 | 1 | shield piercing | 0 | |||
| Simian Scout | 🌪️️ 🐒 Monkey | 1 | 1 | 1 | 0 | 0 | ||||
| Dozing Slacker | 🌪️️ 🐒 Monkey | 1 | 3 | 2 | 0 | 1 | ||||
| Sirocco Striker | 🌪️️ 🐒 Monkey | 1 | 3 | 2 | 0 | 2 | ||||
| Hoopoe ravager | 🌪️️ 🐒 Monkey | 1 | 1 | 3 | 0 | 2 | ||||
| Rusher King | 🌪️️ 🐒 Monkey | 1 | 4 | 2 | 0 | |||||
| Pyrojack The Reluctant | 🌪️️ 🐒 Monkey | 1 | 1 | 4 | 0 | 2 | ||||
| Bari the vanguard | 🌪️️ 🐒 Monkey | 1 | 1 | 1 | 0 | 0 | ||||
| Knucklegrunt | 🌪️️ 🐒 Monkey | 2 | 7 | 6 | 0 | fury | 0 | |||
| Brutus The Butcher | 🌪️️ 🐒 Monkey | 2 | 9 | 4 | 0 | 🌿protection | 0 | |||
| Simian Smogsmash | 🌪️️ 🐒 Monkey | 2 | 5 | 4 | 0 | 0 | ||||
| Tribal Martyr | 🌪️️ 🐒 Monkey | 3 | 6 | 6 | 0 | taunt | 6 | |||
| Gale-force vane | 🌪️️ 🐒 Monkey | 3 | 9 | 6 | 0 | ricochet | 0 | |||
| Silverback Brute | 🌪️️ 🐒 Monkey | 3 | 9 | 4 | 0 | overflow damage | 0 | |||
| 🌪️️ Wind Spirit | 🌪️️ 🐒 Monkey | 3 | 0 | 1 | 0 | ephemeral | 0 | |||
| Bonker Basher | 🌪️️ 🐒 Monkey | 4 | 12 | 12 | 0 | overflow damage | 0 | |||
| Orangoon Twins | 🌪️️ 🐒 Monkey | 4 | 9 | 9 | 0 | 0 | summon 🎯On death🃏Simian Smogsmash | |||
| Grungle the savage | 🌪️️ 🐒 Monkey | 4 | 7 | 10 | 0 | 1 | prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | ☯ UnitElement | ||
| Banana Brute | 🌪️️ 🐒 Monkey | 5 | 15 | 10 | 0 | first strike | 0 | |||
| Ballrog Brawler | 🌪️️ 🐒 Monkey | 5 | 11 | 12 | 0 | last stand | 1 | |||
| Gormilla The Unshaken | 🌪️️ 🐒 Monkey | 5 | 7 | 14 | 0 | fury | 0 | |||
| Quickfoot zingo | 🌪️️ 🐒 Monkey | 5 | 18 | 8 | 0 | ricochet | 1 | |||
| Endless Screamers | 🌪️️ 🐒 Monkey | 6 | 9 | 14 | 0 | 0 | summon 🎯On death🃏Orangoon Twins | |||
| Rimba | 🌪️️ 🐒 Monkey | 6 | 18 | 12 | 0 | ricochet | 2 | |||
| Bantu the woodsman | 🌪️️ 🐒 Monkey | 7 | 20 | 14 | 0 | charge | 0 | |||
| Vita flesh | 🌪️️ 🐒 Monkey | 7 | 23 | 14 | 0 | 💧protection | 1 | |||
| Ivory Impaler | 🌱️ 🐃 Buffalo | 1 | 1 | 3 | 1 | 1 | ☯ UnitElement | |||
| Karrak the Watcher | 🌱️ 🐃 Buffalo | 1 | 1 | 3 | 1 | 0 | ||||
| Blacknok | 🌱️ 🐃 Buffalo | 1 | 1 | 3 | 1 | 1 | ||||
| Gaj’Kar Kragspike | 🌱️ 🐃 Buffalo | 2 | 4 | 4 | 2 | shield piercing | 2 | prop+ to random in group🛡️ Shield🎯On sale,On purchase | ||
| Tharok the Stomper | 🌱️ 🐃 Buffalo | 3 | 2 | 4 | 6 | backlash | 4 | |||
| Saffran Solwane | 🌱️ 🐃 Buffalo | 3 | 4 | 6 | 2 | social herding | 1 | |||
| Thamur Hammer Tusk | 🌱️ 🐃 Buffalo | 4 | 5 | 10 | 4 | overflow damage | 0 | |||
| Clubadon Mastokar | 🌱️ 🐃 Buffalo | 4 | 7 | 8 | 6 | overflow damage | 0 | |||
| Kravok the Piercer | 🌱️ 🐃 Buffalo | 4 | 8 | 6 | 6 | shield piercing | 0 | |||
| Khan Whitehorn | 🌱️ 🐃 Buffalo | 5 | 14 | 10 | 4 | social herding | 2 | |||
| Klotch the Cleaver | 🌱️ 🐃 Buffalo | 5 | 14 | 9 | 7 | social herding | 3 | |||
| Cragmilker | 🌱️ 🐃 Buffalo | 5 | 10 | 13 | 3 | social herding | 2 | |||
| Black Spire | 🌱️ 🐃 Buffalo | 6 | 11 | 17 | 1 | last stand | 6 | |||
| Arbitrator Proxacutor | 🌱️ 🐃 Buffalo | 6 | 13 | 13 | 13 | social herding | 3 | |||
| Merciless Golden Mane | 🌱️ 🐃 Buffalo | 7 | 13 | 18 | 8 | 💧protection | 4 | |||
| Kumar The Nightcleaver | 🌱️ 🐃 Buffalo | 7 | 10 | 16 | 4 | shield piercing | 4 | prop+💪 Attack🎯On kill by ally⏳-1 | ||
| Vireya the Sylvan Riftwolf | 🌱️ 🐕 Dog | 2 | 1 | 3 | 1 | pack instinct | 1 | |||
| Tenebris Fang | 🌱️ 🐕 Dog | 2 | 1 | 3 | 1 | 🔥️protection | 0 | |||
| 🌿️ Earth Spirit | 🌱️ 🐕 Dog | 3 | 0 | 1 | 0 | ephemeral | 0 | |||
| Kestrel-thorn Kid | 🌱️ 🐼 Panda | 1 | 1 | 3 | 1 | 0 | ||||
| High-markhor goro | 🌱️ 🐼 Panda | 1 | 1 | 2 | 0 | 0 | ||||
| Root-caller feng | 🌱️ 🐼 Panda | 1 | 1 | 3 | 1 | 0 | ||||
| The highland blade | 🌱️ 🐼 Panda | 1 | 1 | 2 | 2 | 0 | ||||
| Koda the unyielding | 🌱️ 🐼 Panda | 1 | 1 | 2 | 2 | 0 | ||||
| Sledge the sentry | 🌱️ 🐼 Panda | 3 | 4 | 6 | 2 | charge | 0 | |||
| Soren of the peak | 🌱️ 🐼 Panda | 3 | 4 | 6 | 2 | health transfer | 0 | |||
| Karn the Avalanche | 🌱️ 🐼 Panda | 4 | 4 | 8 | 4 | 1 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | ||
| Sentry veda | 🌱️ 🐼 Panda | 5 | 11 | 12 | 0 | 🌪️️protection | 0 | |||
| Stone Binder | 🌱️ 🐼 Panda | 5 | 6 | 13 | 7 | 🔥️protection | 0 | |||
| Braken the twin-hitter | 🌱️ 🐼 Panda | 6 | 11 | 17 | 1 | overflow damage | 0 | |||
| Bould the earth crafter | 🌱️ 🐼 Panda | 6 | 10 | 15 | 3 | 🌪️️protection | 1 | prop+ to random in group in refuge🛡️ Shield🎯On hit⏳-1 | ☯ UnitElement | |
| Azurecoil Ambusher | 💧 🐍 Cobra | 2 | 2 | 3 | 1 | 0 | prop transfer to random💪 Attack🎯On death | |||
| Scorchcoil venom | 💧 🐍 Cobra | 2 | 2 | 3 | 1 | poisonous | 0 | |||
| Ripple Channeler | 💧 🐍 Cobra | 3 | 3 | 6 | 6 | 🔥️protection | 0 | |||
| Orichal Wyrm | 💧 🐍 Cobra | 3 | 6 | 5 | 1 | 1 | get random spell tier x 🎯On combat surviving⏳-1 | |||
| 💧 Water Spirit | 💧 🐍 Cobra | 3 | 0 | 1 | 0 | ephemeral | 0 | |||
| Twisty Tempest Tongue | 💧 🐍 Cobra | 4 | 7 | 9 | 1 | poisonous, 🌪️️protection | 0 | |||
| Shallow Scourge Predator | 💧 🐍 Cobra | 4 | 8 | 9 | 3 | poisonous | 0 | |||
| Cavecoil Immortal | 💧 🐍 Cobra | 5 | 10 | 13 | 1 | poisonous | 0 | |||
| Mudtusk Recruit | 💧 🐖 Pig | 1 | 2 | 2 | 2 | 1 | ||||
| Prince Fougash | 💧 🐖 Pig | 1 | 1 | 3 | 1 | 0 | ||||
| Piglet Clet-Ush | 💧 🐖 Pig | 1 | 1 | 3 | 1 | 0 | ||||
| Spear Lirael | 💧 🐖 Pig | 1 | 2 | 2 | 2 | 0 | ||||
| Noj the monk | 💧 🐖 Pig | 1 | 1 | 3 | 1 | 0 | ||||
| Clet-Ush the Grown | 💧 🐖 Pig | 3 | 4 | 6 | 2 | first strike | 0 | |||
| Bristle-weaver koel | 💧 🐖 Pig | 3 | 4 | 5 | 1 | 1 | prop+ to group💪 Attack,❤️ Health🎯On purchase | ☯ UnitElement | ||
| Warthog Charger | 💧 🐖 Pig | 4 | 9 | 8 | 2 | 🔥️protection | 1 | |||
| Stone-heart brin | 💧 🐖 Pig | 4 | 5 | 9 | 7 | first strike | 0 | |||
| Riptide axe thalia | 💧 🐖 Pig | 5 | 11 | 11 | 3 | 🌪️️protection | 1 | |||
| Root-strider mara | 💧 🐖 Pig | 6 | 11 | 14 | 4 | charge | 0 | |||
| Tide shield borin | 💧 🐖 Pig | 6 | 9 | 16 | 8 | 1 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | ||
| Riptide dagger siren | 💧 🐖 Pig | 6 | 12 | 15 | 7 | poisonous | 2 | |||
| Vorin | 💧 🐖 Pig | 7 | 15 | 16 | 8 | health transfer | 0 | |||
| Tusk-scarred thorne | 💧 🐖 Pig | 7 | 14 | 15 | 4 | health transfer | 2 | |||
| 🐸 Frog eggs | 💧 🐸 Frog | 1 | 0 | 3 | 0 | 0 | ||||
| Tadpoles | 💧 🐸 Frog | 1 | 0 | 2 | 0 | 0 | ||||
| Legged tadpoles | 💧 🐸 Frog | 1 | 0 | 1 | 0 | 0 | ||||
| Cluckopatra | 🔥️ 🐓 Rooster | 1 | 1 | 2 | 1 | 1 | ||||
| 🏁 First Feather | 🔥️ 🐓 Rooster | 1 | 1 | 1 | 1 | |||||
| Sir Squawkalot | 🔥️ 🐓 Rooster | 1 | 2 | 3 | 1 | |||||
| Dormant egg | 🔥️ 🐓 Rooster | 1 | 0 | 3 | 0 | |||||
| Developing egg | 🔥️ 🐓 Rooster | 1 | 0 | 2 | 0 | |||||
| Hatching egg | 🔥️ 🐓 Rooster | 1 | 0 | 1 | 0 | |||||
| Hatchling prodigy | 🔥️ 🐓 Rooster | 1 | 1 | 1 | 0 | prop+ by level💪 Attack,❤️ Health🎯On level up, prop+ by tier mp💪 💪 Attack,❤️ Health🎯On combat surviving | ||||
| Brackenwood Guardian | 🔥️ 🐓 Rooster | 1 | 3 | 2 | ||||||
| Bonebreaker krik | 🔥️ 🐓 Rooster | 1 | 1 | 3 | 1 | 0 | ||||
| Rhythm Flapwing | 🔥️ 🐓 Rooster | 1 | 1 | 2 | 0 | 2 | ||||
| Fluffcano McBoom | 🔥️ 🐓 Rooster | 2 | 2 | 1 | egg layer | |||||
| Spiky Bantami | 🔥️ 🐓 Rooster | 2 | 8 | 4 | 2 | 0 | ||||
| Golden order veteran | 🔥️ 🐓 Rooster | 2 | 6 | 5 | 3 | 0 | prop+ by level to random in group in refuge💪 Attack🎯On combat end | 🔥️ Fire | ||
| Clawrus | 🔥️ 🐓 Rooster | 2 | 3 | 2 | 0 | egg layer | 0 | |||
| Bulwark Brisker | 🔥️ 🐓 Rooster | 3 | 8 | 8 | 4 | 3 | prop+❤️ Health🎯On attack boost⏳-1 | |||
| Grimfang | 🔥️ 🐓 Rooster | 3 | 11 | 11 | 1 | mercenary | 1 | |||
| Whisperwing lyra | 🔥️ 🐓 Rooster | 3 | 14 | 9 | 1 | mercenary | 1 | |||
| Talon The Cleaver | 🔥️ 🐓 Rooster | 4 | 9 | 9 | 3 | dodge | ||||
| Terrorcock | 🔥️ 🐓 Rooster | 4 | 13 | 10 | 2 | last stand | 0 | |||
| Boomerang blitz | 🔥️ 🐓 Rooster | 4 | 9 | 8 | 2 | 🌪️️protection | 0 | |||
| Dominus quill | 🔥️ 🐓 Rooster | 4 | 9 | 8 | 2 | first strike | 0 | |||
| Regulus | 🔥️ 🐓 Rooster | 4 | 10 | 11 | 1 | shield piercing | 0 | |||
| Embercluck | 🔥️ 🐓 Rooster | 5 | 12 | 7 | 2 | dodge | 0 | |||
| Magus Plumpheus | 🔥️ 🐓 Rooster | 5 | 22 | 13 | 5 | mercenary | 2 | |||
| Gronak | 🔥️ 🐓 Rooster | 5 | 14 | 14 | 2 | 2 | prop+💪 Attack🎯On kill by ally⏳-1 | |||
| Arakian | 🔥️ 🐓 Rooster | 6 | 11 | 13 | 3 | egg layer | 0 | |||
| Terran | 🔥️ 🐓 Rooster | 6 | 11 | 12 | 2 | dodge | 0 | |||
| Aura flare | 🔥️ 🐓 Rooster | 7 | 12 | 15 | 3 | dodge | 0 | |||
| Pyrecrest Warden | 🔥️ 🐓 Rooster | 7 | 15 | 18 | 4 | 🌿protection | 2 | |||
| 🔥️ Fire Spirit | 🔥️ 🐱 Cat | 3 | 0 | 1 | 0 | ephemeral | 0 |
| 🖼️ Image | 🏷️ Name | 🗿 Clan | ⭐ | 💪 | ❤️ | 🛡️ | 🧬 Traits | X | 🕯️ Enchantment | 👥 |
|---|---|---|---|---|---|---|---|---|---|---|
| Redscale Dunehunter | ◯️ null | 3 | 8 | 6 | 2 | 0 | ||||
| Sunslinger | ◯️ null | 3 | 11 | 5 | 1 | 🔥️protection | 0 | |||
| Grafty Amalgam | ◯️ null | 3 | 0 | 1 | 0 | attack mimicry, health mimicry | 0 | |||
| Dust Strangler | ◯️ null | 5 | 13 | 10 | 🌪️️protection | 0 | ||||
| Burning Sands Hunter | ◯️ null | 6 | 17 | 12 | 4 | last stand | 0 | |||
| Sneaky Skirmisher | 🌪️️ 🐒 Monkey | 3 | 10 | 8 | 0 | first strike | 0 | |||
| Fast Slinger | 🌪️️ 🐒 Monkey | 3 | 6 | 6 | 0 | overflow damage | 0 | |||
| Sneaky Sniper | 🌪️️ 🐒 Monkey | 3 | 13 | 6 | 0 | first strike | 2 | |||
| Boomerang queen | 🌪️️ 🐒 Monkey | 3 | 7 | 4 | 0 | ricochet | 0 | |||
| Canopy Skyhunter | 🌪️️ 🐒 Monkey | 4 | 11 | 6 | 0 | ricochet | 0 | |||
| Jangal | 🌪️️ 🐒 Monkey | 4 | 8 | 8 | 0 | ricochet | 0 | |||
| Bomboon Grenadoon | 🌪️️ 🐒 Monkey | 5 | 22 | 8 | 0 | ricochet | 0 | |||
| Simian Sapper | 🌪️️ 🐒 Monkey | 5 | 12 | 8 | 0 | dodge, ricochet | 0 | |||
| Gorok | 🌪️️ 🐒 Monkey | 5 | 24 | 8 | 0 | 12 | prop+ to random in group💪 Attack🎯On deploy | ☯ UnitElement | ||
| Boulder aim | 🌪️️ 🐒 Monkey | 6 | 17 | 8 | 0 | 🔥️protection | 0 | |||
| Jungle maven | 🌪️️ 🐒 Monkey | 6 | 21 | 10 | 0 | dodge | 0 | |||
| Scattershot clay | 🌪️️ 🐒 Monkey | 6 | 15 | 8 | 0 | ricochet | 0 | |||
| Shuriken master | 🌪️️ 🐒 Monkey | 6 | 23 | 12 | 0 | ricochet | 0 | |||
| Billy Bomber | 🌪️️ 🐒 Monkey | 7 | 19 | 8 | 0 | ricochet, 🌿protection | 0 | |||
| Koko Rokai | 🌪️️ 🐒 Monkey | 7 | 12 | 8 | 0 | ricochet, 🔥️protection | 3 | prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | ||
| Zirfail Darksnout | 🌱️ 🐃 Buffalo | 3 | 7 | 5 | 1 | social herding | 1 | |||
| Arokh the Ivory Fang | 🌱️ 🐃 Buffalo | 4 | 8 | 9 | 3 | social herding | 1 | |||
| Hornshot Twinbolt | 🌱️ 🐃 Buffalo | 6 | 13 | 10 | 2 | 🔥️protection | 0 | |||
| Anchor-hedge Slinger | 🌱️ 🐼 Panda | 3 | 6 | 5 | 3 | 2 | ||||
| Thicket Trapper | 🌱️ 🐼 Panda | 3 | 6 | 5 | 3 | 1 | prop+ to random in group💪 Attack🎯On hit⏳-1 | ☯ UnitElement | ||
| Scent-seeker mira | 🌱️ 🐼 Panda | 4 | 9 | 8 | 2 | health transfer | 1 | |||
| Dax the tracker | 🌱️ 🐼 Panda | 6 | 15 | 17 | 9 | last stand | 0 | |||
| Elowen the scout | 🌱️ 🐼 Panda | 6 | 14 | 10 | 0 | 💧protection | 0 | |||
| Ibex Archer Lhamo | 🌱️ 🐼 Panda | 6 | 17 | 18 | 0 | 🌪️️protection | 0 | |||
| Sentry-stone Matriarch | 🌱️ 🐼 Panda | 6 | 12 | 14 | 2 | 3 | get random unit in group tier x 🎯On purchase | ☯ UnitElement | ||
| The meadow stalkers | 🌱️ 🐼 Panda | 6 | 10 | 10 | 6 | intimidate | 1 | |||
| Pinnacle Warden | 🌱️ 🐼 Panda | 7 | 14 | 15 | 1 | 🔥️protection | 0 | |||
| Lagoon Shade Medic | 💧 🐍 Cobra | 3 | 6 | 4 | 0 | dodge | 2 | |||
| HydroSpire Healer | 💧 🐍 Cobra | 4 | 13 | 6 | 0 | 4 | prop+❤️ Health🎯On round end⏳-1 | |||
| Gravedigger Guardian | 💧 🐍 Cobra | 6 | 12 | 12 | 0 | poisonous | 0 | |||
| Thunder Viper | 💧 🐍 Cobra | 7 | 19 | 10 | 0 | 0 | get random spell tier mp 🎯On lane won⏳-1 | |||
| Marsh Slinger | 💧 🐖 Pig | 3 | 4 | 5 | 5 | 1 | prop+ to random in group💪 Attack🎯On purchase | ☯ UnitElement | ||
| Bog Harpooner | 💧 🐖 Pig | 3 | 4 | 5 | 5 | 1 | prop+ to random in group💪 Attack🎯On hit⏳-1 | ☯ UnitElement | ||
| Cartographer Nerida | 💧 🐖 Pig | 3 | 7 | 6 | 4 | dodge | 1 | |||
| Orin | 💧 🐖 Pig | 4 | 10 | 9 | 5 | 2 | prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | ☯ UnitElement | ||
| Diver Mirel | 💧 🐖 Pig | 4 | 6 | 6 | 6 | dodge | 1 | |||
| Dart nix | 💧 🐖 Pig | 6 | 9 | 10 | 10 | 🔥️protection | 0 | |||
| Dart nix2 | 💧 🐖 Pig | 6 | 9 | 10 | 10 | 🌪️️protection | 0 | |||
| Ruddy Biscuit | 🔥️ 🐓 Rooster | 3 | 6 | 4 | dodge | |||||
| MacFeather Swiftshot | 🔥️ 🐓 Rooster | 3 | 7 | 5 | 1 | 🌿protection | ||||
| Galliard | 🔥️ 🐓 Rooster | 3 | 10 | 5 | 1 | dodge | 0 | |||
| Luckywood Ranger | 🔥️ 🐓 Rooster | 3 | 10 | 7 | 3 | 0 | get card 🎯On purchase🃏1 Gold coin | |||
| Aelion | 🔥️ 🐓 Rooster | 3 | 6 | 4 | 0 | dodge | 0 | |||
| Youngshot Fatwing | 🔥️ 🐓 Rooster | 4 | 15 | 7 | 7 | 0 | prop+ by level💪 Attack🎯On kill | |||
| Hookshot | 🔥️ 🐓 Rooster | 4 | 9 | 6 | 0 | dodge | 0 | |||
| Scurry | 🔥️ 🐓 Rooster | 4 | 11 | 7 | 1 | 🌿protection | 0 | |||
| Sir Boltfeather | 🔥️ 🐓 Rooster | 6 | 11 | 12 | 2 | 0 | get card 🎯On purchase🃏Renewal of 🔥️ Fire | |||
| Duo-shot doug | 🔥️ 🐓 Rooster | 6 | 12 | 10 | 4 | 🌪️️protection | 0 | |||
| Ironbow master zik1 | 🔥️ 🐓 Rooster | 6 | 21 | 15 | 3 | last stand | 2 | |||
| Ironbow master zik2 | 🔥️ 🐓 Rooster | 6 | 21 | 14 | 4 | 💧protection | 0 | |||
| Flicker | 🔥️ 🐓 Rooster | 7 | 15 | 9 | 3 | dodge | 0 | |||
| Featherdart shae | 🔥️ 🐓 Rooster | 7 | 18 | 8 | 0 | dodge | 0 |
| 🖼️ Image | 🏷️ Name | 🗿 Clan | ⭐ | 💪 | ❤️ | 🛡️ | 🧬 Traits | X | 🕯️ Enchantment | 👥 |
|---|---|---|---|---|---|---|---|---|---|---|
| Instructor Magilysk | ◯️ null | 4 | 12 | 12 | 2 | get random unit in group tier x 🎯On purchase | ☯ UnitElement | |||
| Echo keeper kalu | 🌪️️ 🐒 Monkey | 4 | 7 | 6 | 0 | attack mimicry | 0 | |||
| Flora weave | 🌪️️ 🐒 Monkey | 4 | 7 | 10 | 0 | 1 | prop+ to random in group in refuge❤️ Health🎯On hit by ally⏳-1 | ☯ UnitElement | ||
| Silas whisper | 🌪️️ 🐒 Monkey | 4 | 10 | 8 | 0 | dodge | 2 | |||
| Mojo Kong | 🌪️️ 🐒 Monkey | 5 | 7 | 14 | 0 | overflow damage | 4 | prop+ to group💪 Attack🎯On spell use by ally⏳-1 | ☯ UnitElement | |
| Aetheron | 🌪️️ 🐒 Monkey | 5 | 16 | 12 | 0 | ricochet | 1 | |||
| Khtun shaman | 🌪️️ 🐒 Monkey | 5 | 6 | 6 | 0 | dodge | 1 | prop+ to random in group💪 Attack🎯On hit⏳-1 | ☯ UnitElement | |
| Vigor | 🌪️️ 🐒 Monkey | 5 | 14 | 14 | 0 | fury | 2 | prop+❤️ Health🎯On round end⏳-1 | ||
| Spark-student kael | 🌪️️ 🐒 Monkey | 5 | 13 | 6 | 0 | 3 | prop+ to random in group💪 Attack🎯On hit⏳-1 | ☯ UnitElement | ||
| Elemantor The Protector | 🌪️️ 🐒 Monkey | 6 | 10 | 20 | 0 | 0 | traits+ random to random in group 🎯On turn end,On purchase🧬🌿protection,🔥️protection,💧protection,🌪️️protection⏳-1 | ☯ UnitElement | ||
| Rocchet | 🌪️️ 🐒 Monkey | 6 | 14 | 10 | 0 | 1 | prop+ to random in group💪 Attack🎯On hit⏳-1 | |||
| Luminara | 🌪️️ 🐒 Monkey | 6 | 11 | 8 | 0 | ricochet | 2 | prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | ☯ UnitElement | |
| Morwen | 🌪️️ 🐒 Monkey | 6 | 14 | 14 | 0 | gifted learner | 2 | prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | ☯ UnitElement | |
| Malphas the defiler | 🌪️️ 🐒 Monkey | 6 | 14 | 10 | 0 | dodge, ricochet | 3 | |||
| Zephyrin | 🌪️️ 🐒 Monkey | 6 | 20 | 16 | 0 | 💧protection | 1 | |||
| Mirage-weaver nyx | 🌪️️ 🐒 Monkey | 7 | 11 | 8 | 0 | health mimicry | 0 | |||
| Sky whisper | 🌪️️ 🐒 Monkey | 7 | 15 | 10 | 0 | ricochet | 2 | |||
| Barzok Bustabull | 🌱️ 🐃 Buffalo | 4 | 3 | 7 | 0 | 1 | prop+ to random in group in refuge❤️ Health🎯On hit by ally⏳-1 | |||
| Lorzok ThunderHoof | 🌱️ 🐃 Buffalo | 5 | 11 | 12 | 12 | intimidate | 3 | |||
| Krag’Ar The Protector | 🌱️ 🐃 Buffalo | 6 | 15 | 9 | 3 | 1 | prop+ to random in group in refuge🛡️ Shield🎯On hit⏳-1 | 🌿 Earth | ||
| Hornseer of Fury | 🌱️ 🐃 Buffalo | 6 | 11 | 12 | 0 | 🔥️protection | 2 | |||
| Tuskwalker, living soil | 🌱️ 🐃 Buffalo | 6 | 9 | 18 | 8 | 5 | prop+ random to group in refuge💪 Attack,❤️ Health,🛡️ Shield🎯On combat surviving⏳-1 | 🌿 Earth | ||
| Rho the Moss Mender | 🌱️ 🐼 Panda | 5 | 9 | 11 | 2 | health transfer | 1 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | |
| Bloom-summoner mei | 🌱️ 🐼 Panda | 5 | 8 | 9 | 1 | 1 | prop+ to random in group in refuge❤️ Health🎯On hit by ally⏳-1 | ☯ UnitElement | ||
| Kaelen the earth-lord | 🌱️ 🐼 Panda | 5 | 10 | 15 | 3 | 2 | prop+ random to group in refuge💪 Attack,❤️ Health,🛡️ Shield🎯On combat surviving⏳-1 | ☯ UnitElement | ||
| Livia the healer | 🌱️ 🐼 Panda | 5 | 7 | 9 | 3 | 💧protection | 1 | |||
| Vaelin the Herd-herald | 🌱️ 🐼 Panda | 6 | 14 | 19 | 3 | 2 | prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | ☯ UnitElement | ||
| Yin of the Bamboo Veil | 🌱️ 🐼 Panda | 6 | 12 | 15 | 1 | 🌪️️protection | 2 | prop+ to group in refuge💪 Attack,❤️ Health🎯On kill⏳-1 | ☯ UnitElement | |
| Elder Bambookeeper | 🌱️ 🐼 Panda | 7 | 8 | 12 | 0 | 2 | prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | ☯ UnitElement | ||
| Venombra | 💧 🐍 Cobra | 5 | 15 | 15 | 1 | poisonous | 0 | |||
| Shadowmend Broodmother | 💧 🐍 Cobra | 6 | 13 | 13 | 1 | 🌿protection | 8 | prop+ to group❤️ Health🎯On round end⏳-1 | 💧 Water | |
| Thalassaryn | 💧 🐍 Cobra | 6 | 14 | 10 | 2 | prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | 💧 Water | |||
| Healer | 💧 🐖 Pig | 4 | 3 | 9 | 0 | health transfer | 1 | prop+ to random in group in refuge❤️ Health🎯On hit by ally⏳-1 | ☯ UnitElement | |
| Wizard | 💧 🐖 Pig | 5 | 5 | 8 | 8 | 1 | prop+ to random in group in refuge🛡️ Shield🎯On hit⏳-1 | ☯ UnitElement | ||
| Bramble-weaver sylas | 💧 🐖 Pig | 5 | 6 | 8 | 8 | first strike | 2 | |||
| Ore-whisperer liora | 💧 🐖 Pig | 5 | 8 | 13 | 7 | 2 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | ||
| Tide Joran | 💧 🐖 Pig | 6 | 9 | 17 | 5 | 1 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | ||
| Root-scribe toorne2 | 💧 🐖 Pig | 6 | 11 | 15 | 7 | 3 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | ||
| Root-scribe toorne | 💧 🐖 Pig | 7 | 7 | 10 | 10 | 3 | prop+ random to group in refuge💪 Attack,❤️ Health,🛡️ Shield🎯On combat surviving⏳-1 | ☯ UnitElement | ||
| Stone-singer mirael | 💧 🐖 Pig | 7 | 8 | 9 | 9 | 2 | prop+ to group in refuge💪 Attack,❤️ Health🎯On kill⏳-1 | ☯ UnitElement | ||
| Brackenwood Druid | 🔥️ 🐓 Rooster | 4 | 14 | 10 | 🌿protection | 8 | 🔥️ Fire | |||
| Emberwhisper | 🔥️ 🐓 Rooster | 4 | 6 | 8 | 0 | egg layer | 2 | prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | ☯ UnitElement | |
| Magmingo Ignisquawk | 🔥️ 🐓 Rooster | 5 | 13 | 6 | 5 | prop+💪 Attack🎯On attack boost of ally⏳-1 | ☯ UnitElement | |||
| Flaminar Cindravius | 🔥️ 🐓 Rooster | 5 | 16 | 14 | 💧protection | 0 | ||||
| Marquise Aquina | 🔥️ 🐓 Rooster | 5 | 19 | 10 | 0 | traits+ to random in group 🎯On kill by ally,On purchase🧬💧protection⏳-1 | ☯ UnitElement | |||
| Magister Krotum | 🔥️ 🐓 Rooster | 5 | 14 | 12 | 2 | 2 | prop+ to group in refuge💪 Attack,❤️ Health🎯On kill⏳-1 | ☯ UnitElement | ||
| Aetherian | 🔥️ 🐓 Rooster | 5 | 10 | 15 | 1 | shield piercing | 1 | |||
| Blazecaller | 🔥️ 🐓 Rooster | 5 | 10 | 8 | 0 | 💧protection | 1 | |||
| Scorchmender | 🔥️ 🐓 Rooster | 5 | 9 | 12 | 0 | health transfer | 2 | prop+ to group❤️ Health🎯On round end⏳-1 | ☯ UnitElement | |
| Ignis weaver | 🔥️ 🐓 Rooster | 6 | 15 | 14 | 0 | egg layer | 1 | prop+💪 Attack🎯On kill by ally⏳-1 | ||
| Ignisara | 🔥️ 🐓 Rooster | 6 | 11 | 10 | 2 | 2 | prop+ to random in group💪 Attack🎯On hit⏳-1 | ☯ UnitElement | ||
| Scribe pyra | 🔥️ 🐓 Rooster | 6 | 15 | 17 | 7 | 3 | prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | ☯ UnitElement | ||
| Vesperia | 🔥️ 🐓 Rooster | 6 | 10 | 12 | 0 | dodge, egg layer | 3 | |||
| Ashbinder | 🔥️ 🐓 Rooster | 7 | 7 | 10 | 4 | dodge | 1 |
The huge diversity of possible enchantments gives a significant depth to the game. Powerful strategies emerge when combining enchantments from different units.
tier mp pullers give cards of the 🧺 Marketplace tier. The
tier x pullers (e.g. Unbound Mana Gift) are an exception:
they give cards of the tier X of the card value, even above the
🧺 Marketplace tier.prop equalize attack health raises the lowest of the 💪 Attack
/ ❤️ Health of the unit to the highest of both (the 🛡️ Shield is untouched,
nothing happens when they are equal).
prop give to random in group GIVES a copy of the current
values of its 💪 Attack / ❤️ Health / 🛡️ Shield (the listed properties) to
${VALUE} random other units of the group; the giver keeps
its values (“give” = share). With fewer candidates than
${VALUE}, all of them receive it. Both follow the
permanence rule above (battle-only in ⚔️ Combat).cast spell (on itself),
cast spell on group,
cast spell on random in group,
cast spell on target apply the enchantments of the spell
named by 🃏 Card to the target(s) as if the spell had been played,
but the spell card does not exist: no purchase, no cost, no tier,
nothing in the 🪦️ Graveyard (a temporary card holds the enchantments and is
dropped). cast random spell tier mp / x pick the spell like
the card pullers (from the shoe pool, no copy consumed), then cast it on
the unit. The triggers of the cast spell fire normally, but
On spell use / On spell use by ally are NOT
raised for the cast (it is not a played card). A spell cannot be cast
from its own cast (recursion guard on the name of the spell: a chain of
casts A -> B -> A stops before it casts B again; the played spell
is not part of the chain, so a played spell that casts itself is applied
twice). A spell that needs a unit is not cast (warning) when there is no
unit; a spell without target is cast once, whatever the size of the
group. Casts do nothing during a ⚔️ Combat (spells are not used
there).🕯️ Enchantments parameterize an ✴️ Effect with
⏳, default 1). -1 = unlimited,
except that a one-shot trigger (On deploy, On purchase, On sale, On
spell use, On next turn start) is always consumed once on a card. The
exception does not apply to an enchantment that a spell installed on the
player (Legion of the endless, 🔮 Spell Stream Infinity, Eternal ☯ Element
Rebirth: market card replace by … On purchase): it reacts to
every purchase, -1 for the whole game, n for n
purchases.The enchantment name format is
{effect}{properties}[🎯triggers][🃏card][🧬traits][⏳duration].
There is no ⏰ Delay parameter. A delay is expressed with a future-event
trigger (On next turn start, …); a counter or countdown
(“every Nth”, several turns) may be designed later together with the
server persistence of the applied enchantments.
⚡ Trigger repeaters (extra on deploy,
extra on turn start, extra on turn end,
extra on death): the rows are kept in the data. Only
extra on deploy repeats its trigger today; the three others
have no effect yet (no card uses them).
🕯️ Enchantments are further parameterized by the 🐼 Unit or 🔮 Spell with
prop+ that is the 2nd or later enchantment of a
card reads a second 🔢 Value, which must then be given and not 0: Elixir of
💀 Death has 🔢 Value 1 = 💀 Death, second 🔢 Value 10 = 💪 Attack)Market cost reducers
(market reduce next spell cost,
market reduce next unit cost,
market reduce upgrade, market free upgrade):
see MARKETPLACE.md.
| 🏷️ Name | ✴️ Effect 📝 Description |
|---|---|
| cast random spell tier mp | Cast on itself a random spell at the current market tier |
| clone target unit 🎯On spell use⏳-1 | Duplicate unit stats and traits, not its spells |
| clone target unit 🎯On spell use🧬ephemeral | Duplicate unit stats and traits, not its spells |
| extra on death ⏳-1 | Your future ‘ |
| extra on deploy 🎯On purchase⏳-1 | Your future ‘ |
| extra on turn end ⏳-1 | Your future ‘ |
| extra on turn start ⏳-1 | Your future ‘ |
| get card 🎯On purchase🃏1 Gold coin | Get 🃏 Card |
| get card 🎯On purchase🃏2 Gold coins | Get 🃏 Card |
| get card 🎯On purchase🃏3 Gold coins | Get 🃏 Card |
| get card 🎯On purchase🃏Protection from 🌿️ Earth | Get 🃏 Card |
| get card 🎯On purchase🃏Renewal of 🌿️ Earth | Get 🃏 Card |
| get card 🎯On purchase🃏Renewal of 🔥️ Fire | Get 🃏 Card |
| get card 🎯On purchase🃏Renewal of 💧 Water | Get 🃏 Card |
| get card 🎯On purchase🃏Renewal of 🌪️️ Wind | Get 🃏 Card |
| get coins from destroyed units 🎯On spell use | Destroy all units and gain their original value + 1 🪙 |
| get coins random 🎯On purchase | Get a random amount of 🪙 between 2 to 6 |
| get coins 🎯On next turn start | Get 🔢 Value 🪙 |
| get coins 🎯On purchase | Get 🔢 Value 🪙 |
| get coins 🎯On spell use | Get 🔢 Value 🪙 |
| get predominant clan unit tier mp 🎯On purchase | Get a random unit at the current market tier of your predominant clan |
| get random spell tier mp 🎯On lane won⏳-1 | Get a random spell at the current market tier |
| get random spell tier mp 🎯On purchase | Get a random spell at the current market tier |
| get random spell tier x 🎯On combat surviving⏳-1 | Get a random spell from tier 🔢 Value |
| get random spell tier x 🎯On purchase | Get a random spell from tier 🔢 Value |
| get random unit in group tier mp 🎯On purchase | Get a random 👥 Group unit at the current market tier |
| get random unit in group tier x 🎯On purchase | Get a random 👥 Group unit from tier 🔢 Value |
| income+ 🎯On purchase | Increase your income by 🔢 Value 🪙 |
| market card replace by element 🎯On purchase⏳-1 | Whenever you purchase a unit, place a |
| market card replace by spell 🎯On purchase⏳-1 | Whenever you purchase a card, place a |
| market card replace by type 🎯On purchase⏳-1 | Whenever you purchase a unit, place a |
| market excludes cards below tier 🎯On purchase | Market does not offer cards below ⭐ Tier 🔢 Value |
| market free upgrade | Upgrade the marketplace for free |
| market reduce all units cost 🎯On spell use | Reduce the cost of all units by 1 for this turn only |
| market reduce upgrade | Reduce cost by 🔢 Value of your next marketplace upgrade |
| market refresh with spells 🎯On purchase | Refresh the marketplace with spells |
| market refresh with units next tier 🎯On purchase | Refresh the marketplace with 👥 Group units of the next tier |
| market refresh with units 🎯On purchase | Refresh the marketplace with 👥 Group units |
| prop amplify spell❤️ Health | Your 📊 Properties spells increases by 🔢 Value |
| prop amplify spell💪 Attack | Your 📊 Properties spells increases by 🔢 Value |
| prop amplify spell💪 Attack,❤️ Health | Your 📊 Properties spells increases by 🔢 Value |
| prop amplify spell🛡️ Shield | Your 📊 Properties spells increases by 🔢 Value |
| prop eat lvp to group💪 Attack,❤️ Health,🛡️ Shield🎯On purchase | Your 👥 Group units eat your lowest health unit to gain its 📊 Properties |
| prop eat random by mvp💪 Attack,❤️ Health,🛡️ Shield🎯On purchase | Your highest 💪 Attack unit eats one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat random in mp❤️ Health | Eat random unit from the marketplace to gain its 📊 Properties |
| prop eat random in mp💪 Attack | Eat random unit from the marketplace to gain its 📊 Properties |
| prop eat random in mp💪 Attack,❤️ Health | Eat random unit from the marketplace to gain its 📊 Properties |
| prop eat random in mp🛡️ Shield | Eat random unit from the marketplace to gain its 📊 Properties |
| prop eat random❤️ Health | Eat one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat random💪 Attack | Eat one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat random💪 Attack,❤️ Health | Eat one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat random💪 Attack,❤️ Health | Eat one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat random🛡️ Shield | Eat one of your unit randomly to gain its 📊 Properties ($HAS_TRAIT?and 🧬 Traits) |
| prop eat target❤️ Health | ($TARGET?Choose a unit.) Eat it and gain its 📊 Properties |
| prop eat target💪 Attack | ($TARGET?Choose a unit.) Eat it and gain its 📊 Properties |
| prop eat target💪 Attack,❤️ Health | ($TARGET?Choose a unit.) Eat it and gain its 📊 Properties |
| prop eat target🛡️ Shield | ($TARGET?Choose a unit.) Eat it and gain its 📊 Properties |
| prop equalize attack health | Set 💪 Attack and ❤️ Health to the highest value of both |
| prop give to random in group❤️ Health | Give its 📊 Properties to 🔢 Value random 👥 Group unit(s) |
| prop give to random in group💪 Attack | Give its 📊 Properties to 🔢 Value random 👥 Group unit(s) |
| prop give to random in group💪 Attack,❤️ Health | Give its 📊 Properties to 🔢 Value random 👥 Group unit(s) |
| prop give to random in group🛡️ Shield🎯On sale,On purchase | Give its 📊 Properties to 🔢 Value random 👥 Group unit(s) |
| prop transfer to random❤️ Health | Transfer its 📊 Properties to a random 👥 Group unit |
| prop transfer to random💪 Attack,❤️ Health | Transfer its 📊 Properties to a random 👥 Group unit |
| prop transfer to random💪 Attack🎯On death | Transfer its 📊 Properties to a random 👥 Group unit |
| prop transfer to random🛡️ Shield | Transfer its 📊 Properties to a random 👥 Group unit |
| prop+ by level to group💪 Attack,❤️ Health🎯On purchase | Give 📊 Properties +${LEVEL} (current unit level) to your 👥 Group units |
| prop+ by level to random in group in refuge💪 Attack🎯On combat end | Give 📊 Properties +${LEVEL} (current unit level) to a random 👥 Group unit in the refuge |
| prop+ by level❤️ Health | ($TARGET?Choose a unit.) It gains 📊 Properties +${LEVEL} (current unit level) |
| prop+ by level💪 Attack,❤️ Health🎯On level up | ($TARGET?Choose a unit.) It gains 📊 Properties +${LEVEL} (current unit level) |
| prop+ by level💪 Attack🎯On kill | ($TARGET?Choose a unit.) It gains 📊 Properties +${LEVEL} (current unit level) |
| prop+ by level🛡️ Shield | ($TARGET?Choose a unit.) It gains 📊 Properties +${LEVEL} (current unit level) |
| prop+ by tier mp to group💪 Attack🎯On purchase | Give 📊 Properties +${TIER} (current market tier) to your 👥 Group units |
| prop+ by tier mp❤️ Health | ($TARGET?Choose a unit.) It gains 📊 Properties +${TIER} (current market tier) |
| prop+ by tier mp💪 Attack,❤️ Health🎯On combat surviving | ($TARGET?Choose a unit.) It gains 📊 Properties +${TIER} (current market tier) |
| prop+ by tier mp💪 Attack🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties +${TIER} (current market tier) |
| prop+ by tier mp🛡️ Shield | ($TARGET?Choose a unit.) It gains 📊 Properties +${TIER} (current market tier) |
| prop+ random by percentage💪 Attack,❤️ Health🎯On spell use | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT? 🧬 Traits and) one of: 📊 Properties + 🔢 Value |
| prop+ random to group in refuge💪 Attack,❤️ Health,🛡️ Shield🎯On combat surviving⏳-1 | Give one of: ($HAS_TRAIT? 🧬 Traits and) 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ random💪 Attack,❤️ Health,🛡️ Shield🎯On spell use | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT? 🧬 Traits and) one of: 📊 Properties + 🔢 Value |
| prop+ to group in refuge❤️ Health🎯On combat surviving⏳-1 | Give 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ to group in refuge💪 Attack | Give 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ to group in refuge💪 Attack,❤️ Health🎯On kill⏳-1 | Give 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ to group in refuge💪 Attack,❤️ Health🎯On purchase | Give 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ to group in refuge🛡️ Shield | Give 📊 Properties + 🔢 Value to 👥 Group units in the refuge |
| prop+ to group❤️ Health🎯On round end⏳-1 | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to group💪 Attack,❤️ Health🎯On purchase | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to group💪 Attack,❤️ Health🎯On spell use | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to group💪 Attack🎯On spell use by ally⏳-1 | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to group🛡️ Shield | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to group🪖 Experience🎯On spell use | Give 📊 Properties + 🔢 Value to your 👥 Group units |
| prop+ to random in group in refuge❤️ Health🎯On hit by ally⏳-1 | Give 📊 Properties + 🔢 Value to a random 👥 Group unit in the refuge |
| prop+ to random in group in refuge💪 Attack | Give 📊 Properties + 🔢 Value to a random 👥 Group unit in the refuge |
| prop+ to random in group in refuge💪 Attack,❤️ Health | Give 📊 Properties + 🔢 Value to a random 👥 Group unit in the refuge |
| prop+ to random in group in refuge🛡️ Shield | Give 📊 Properties + 🔢 Value to a random 👥 Group unit in the refuge |
| prop+ to random in group in refuge🛡️ Shield🎯On hit⏳-1 | Give 📊 Properties + 🔢 Value to a random 👥 Group unit in the refuge |
| prop+ to random in group❤️ Health | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group💪 Attack,❤️ Health | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group💪 Attack🎯On deploy | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group💪 Attack🎯On hit⏳-1 | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group💪 Attack🎯On kill by ally⏳-1 | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group💪 Attack🎯On purchase | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group🛡️ Shield🎯On purchase | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to random in group🛡️ Shield🎯On sale,On purchase | Give 📊 Properties + 🔢 Value to a random 👥 Group unit |
| prop+ to target in group❤️ Health | ($TARGET?Choose a 👥 Group unit:) 📊 Properties + 🔢 Value |
| prop+ to target in group💪 Attack | ($TARGET?Choose a 👥 Group unit:) 📊 Properties + 🔢 Value |
| prop+ to target in group💪 Attack,❤️ Health | ($TARGET?Choose a 👥 Group unit:) 📊 Properties + 🔢 Value |
| prop+ to target in group🛡️ Shield | ($TARGET?Choose a 👥 Group unit:) 📊 Properties + 🔢 Value |
| prop+❤️ Health🎯On attack boost⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+❤️ Health🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+❤️ Health🎯On round end⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+❤️ Health🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💀 Death🎯On death | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💀 Death🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health,🛡️ Shield🎯On attack boost⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health,🛡️ Shield🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health🎯On refuge staying⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack,❤️ Health🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack🎯On attack boost of ally⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack🎯On kill by ally⏳-1 | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+💪 Attack🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+🛡️ Shield🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+🛡️ Shield🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+🪖 Experience🎯On purchase | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| prop+🪖 Experience🎯On spell use | ($TARGET?Choose a unit.) It gains 📊 Properties + 🔢 Value |
| replace target unit by higher tier unit 🎯On spell use | Replace a unit with a random unit of the same type and next tier, keeping its stats except deaths |
| replace units by random units 🎯On spell use | Replace your units with random ones of the same tiers and types |
| replace units by spirits 🎯On spell use | Replaces permanently battlefield units by ephemeral spirit with double stats, they live only 1 turn. |
| summon 🎯On death🃏Orangoon Twins | Summon 🃏 Card to replace this |
| summon 🎯On death🃏Simian Smogsmash | Summon 🃏 Card to replace this |
| traits+ random to random in group 🎯On turn end,On purchase🧬🌿protection,🔥️protection,💧protection,🌪️️protection⏳-1 | Give one of: 🧬 Traits to a random 👥 Group unit |
| traits+ to random in group 🎯On kill by ally,On purchase🧬💧protection⏳-1 | Give 🧬 Traits to a random 👥 Group unit |
| traits+ to random in group 🎯On turn end🧬🌿protection,🔥️protection,💧protection,🌪️️protection⏳-1 | Give 🧬 Traits to a random 👥 Group unit |
| traits+ 🎯On purchase | ($TARGET?Choose a unit.) It gains 🧬 Traits |
| traits+ 🎯On spell use | ($TARGET?Choose a unit.) It gains 🧬 Traits |
There is no single rule: every computed value
follows the rule of the code that computes it. Rounding “to the nearest”
is JavaScript Math.round, which rounds a half up (0.5 gives
1). “Can be 0” means that a small base gives nothing.
| ✴️ Effect | Computation | Rounding | Minimum |
|---|---|---|---|
| 🎖️ Level bonus (each level reached) | 25% of the printed 💪 Attack and of the printed ❤️ Health, times the copies | nearest | 1 each (per copy) |
| Merge, stat added by a copy | 50% of the stat of the card | down for an even copy count (Double, Quadruple, Sextuple), up for an odd one (Triple, Quintuple) | 0 |
| 💥 Damage of a hit | 💪 Attack x round doubling x (100 + Dominance/Resonance %) x (100 - Disrupted %) x (100 + damage taken %), over 100 per bracket | nearest, once at the end (the damage taken bracket is floored at -100%) | 0 |
| Lifesteal | 50% of the damage dealt, times the number of Lifesteal | nearest | 0 |
| Ricochet | 50% of the damage of the hit, times the number of Ricochet | nearest | 0 |
| Backlash | 25% of the damage taken | nearest | 0 |
| 💥 Damage routed to another unit | the routed damage x (100 + damage taken %) / 100 | nearest | 0 |
| Poison (each tick) | 50% of the current ❤️ Health | down | 1 (0 only for a unit without ❤️ Health) |
| 💪 Attack transfer / ❤️ Health transfer (on death) | 50% of the 💪 Attack / of the ❤️ Health of the card | down | 0 (a gift of 0 is not given) |
| ⚔️ Combat start effects that change a stat by a percentage (Rested +25% 💪 Attack…) | percentage of the current stat | nearest, with the sign of the percentage | 0 (a small stat gives a change of 0); the result keeps 💪 Attack at 0 or more and ❤️ Health at 1 or more |
| Cannibalism, gain | half of the stat of the prey | down | 0 |
| Cannibalism, starving | the unit loses half of its stat | the loss is rounded down | the stat never goes below 1 |
| Assimilation | 50% of the stat of each target | down | 0 |
Unstable Mutation
(prop+ random by percentage) |
VALUE % of the current 💪 Attack or ❤️ Health of the unit, one of the two drawn at random | down | +1 (a small stat still gains 1) |
Return to ashes
(get coins from destroyed units) |
the original cost of each destroyed unit: its tier, times its copies (not its sell value), + 1 coin per destroyed unit | - | - |
| 🛡️ Shield gained by resting (healing a 💀 Death) | (🎖️ Level + ⭐ Tier) / 2 | nearest (half up) | - |
| Sell value | half of the base cost (the tier) | down | 1 |
| 🔢 Value points of a trait or an effect | percent x 7 x tier |
nearest, then compared with the flat
point: the larger in absolute value wins |
- |
get coins from destroyed units): every unit of the
⚔️ Battlefield, then of the 🏡 Refuge, goes to the 🪦️ Graveyard (never recycled,
no 💀 Death, no XP) and the player gains the original cost of each + 1 coin
per unit. The spell is refused, not consumed, when the player has no
unit (“You have no unit to destroy”). Visual FX: the units burn one
after the other (350 ms apart) with the shader FX
ashes-burn (the card burns from its bottom up, chars with
glowing cracks, crumbles into ash flakes), embers rise from each card,
the coins of each unit fly to the purse as it burns and the coin widget
flashes at the end.prop+ random by percentage): the chosen unit gains one
random property among the listed ones (💪 Attack or ❤️ Health) by VALUE % of
its current value. Visual FX: the existing kaleidoscope
(kaleidoscope-reforge, the unit mutates) then the FX of the
property that was drawn (attack-bonus for 💪 Attack,
bloom-growth for ❤️ Health). The description shows the % after
the value of each property (“+200% 💪 Attack, +200% ❤️ Health”).| Parameter | Data type | Source | 📝 Description |
|---|---|---|---|
| PROPERTIES | set of 📌 enum | enchantment (props) |
set of properties: 💪 Attack, ❤️ Health, 🛡️ Shield, 🪖 Experience (and 🎖️ Level, 💀 Death for the spells that use them) |
| PROPERTY | 📌 enum | enchantment | one property of the set above, when the effect iterates over PROPERTIES |
| TRAITS | set of 📌 enum | enchantment (traits) |
traits granted by the effect |
| CARD | card | enchantment (card) |
the name of a card, when the effect uses a card |
| GROUP | 📌 enum | card (fxGroup) |
all (empty), UnitElement (the 5 elements) or UnitType (the 3 unit types) |
| VALUE | number | card (fxValue) |
any number; a second enchantment of the same card reads
fxValue2 |
| 🏷️ Name | 🎯 Target | 📝 Description |
|---|---|---|
| cast random spell tier mp | Cast on itself a random spell at the current market tier | |
| cast random spell tier x | Cast on itself a random spell from tier ${VALUE} | |
| cast spell | Cast ${CARD} on itself | |
| cast spell on group | Cast ${CARD} on each of your ${GROUP} units | |
| cast spell on random in group | Cast ${CARD} on a random ${GROUP} unit | |
| cast spell on target | ✅ | ($TARGET?Choose a unit.) Cast ${CARD} ($TARGET?on it) |
| clone target unit | ✅ | Duplicate unit stats and traits, not its spells |
| extra on death | Your future ‘ |
|
| extra on deploy | Your future ‘ |
|
| extra on turn end | Your future ‘ |
|
| extra on turn start | Your future ‘ |
|
| get card | Get ${CARD} | |
| get coins | Get ${VALUE} 🪙 | |
| get coins from destroyed units | Destroy all units and gain their original value + 1 🪙 | |
| get coins random | Get a random amount of 🪙 between 2 to 6 | |
| get predominant clan unit tier mp | Get a random unit at the current market tier of your predominant clan | |
| get random spell tier mp | Get a random spell at the current market tier | |
| get random spell tier x | Get a random spell from tier ${VALUE} | |
| get random unit in group tier mp | Get a random ${GROUP} unit at the current market tier | |
| get random unit in group tier x | Get a random ${GROUP} unit from tier ${VALUE} | |
| income+ | Increase your income by ${VALUE} 🪙 | |
| market card replace by element | Whenever you purchase a unit, place a |
|
| market card replace by spell | Whenever you purchase a card, place a |
|
| market card replace by type | Whenever you purchase a unit, place a |
|
| market excludes cards below tier | Market does not offer cards below ⭐ Tier ${VALUE} | |
| market free upgrade | Upgrade the marketplace for free | |
| market reduce all units cost | Reduce the cost of all units by 1 for this turn only | |
| market reduce next spell cost | Reduce cost by ${VALUE} of your next spell | |
| market reduce next unit cost | Reduce cost by ${VALUE} of your next unit | |
| market reduce upgrade | Reduce cost by ${VALUE} of your next marketplace upgrade | |
| market refresh with spells | Refresh the marketplace with spells | |
| market refresh with units | Refresh the marketplace with ${GROUP} units | |
| market refresh with units next tier | Refresh the marketplace with ${GROUP} units of the next tier | |
| prop amplify spell | Your ${PROPERTIES} spells increases by ${VALUE} | |
| prop eat lvp to group | Your ${GROUP} units eat your lowest health unit to gain its ${PROPERTIES} | |
| prop eat random | Eat one of your unit randomly to gain its ${PROPERTIES} ($HAS_TRAIT?and ${TRAITS}) | |
| prop eat random by mvp | Your highest 💪 Attack unit eats one of your unit randomly to gain its ${PROPERTIES} ($HAS_TRAIT?and ${TRAITS}) | |
| prop eat random in mp | Eat random unit from the marketplace to gain its ${PROPERTIES} | |
| prop eat target | ✅ | ($TARGET?Choose a unit.) Eat it and gain its ${PROPERTIES} |
| prop equalize attack health | Set 💪 Attack and ❤️ Health to the highest value of both | |
| prop give to random in group | Give its ${PROPERTIES} to ${VALUE} random ${GROUP} unit(s) | |
| prop transfer to random | Transfer its ${PROPERTIES} to a random ${GROUP} unit | |
| prop+ | ✅ | ($TARGET?Choose a unit.) It gains ${PROPERTIES} +${VALUE} |
| prop+ by level | ✅ | ($TARGET?Choose a unit.) It gains ${PROPERTIES} +${LEVEL} (current unit level) |
| prop+ by level to group | Give ${PROPERTIES} +${LEVEL} (current unit level) to your ${GROUP} units | |
| prop+ by level to group in refuge | Give ${PROPERTIES} +${LEVEL} (current unit level) to ${GROUP} units in the refuge | |
| prop+ by level to random in group | Give ${PROPERTIES} +${LEVEL} (current unit level) to a random ${GROUP} unit | |
| prop+ by level to random in group in refuge | Give ${PROPERTIES} +${LEVEL} (current unit level) to a random ${GROUP} unit in the refuge | |
| prop+ by level to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit:)${PROPERTIES} +${LEVEL} (current unit level) |
| prop+ by tier mp | ✅ | ($TARGET?Choose a unit.) It gains ${PROPERTIES} +${TIER} (current market tier) |
| prop+ by tier mp to group | Give ${PROPERTIES} +${TIER} (current market tier) to your ${GROUP} units | |
| prop+ by tier mp to group in refuge | Give ${PROPERTIES} +${TIER} (current market tier)to ${GROUP} units in the refuge | |
| prop+ by tier mp to random in group | Give ${PROPERTIES} +${TIER} (current market tier) to a random ${GROUP} unit | |
| prop+ by tier mp to random in group in refuge | Give ${PROPERTIES} +${TIER} (current market tier) to a random ${GROUP} unit in the refuge | |
| prop+ by tier mp to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit:)${PROPERTIES} +${TIER} (current market tier) |
| prop+ random | ✅ | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT?${TRAITS} and) one of: ${PROPERTIES} +${VALUE} |
| prop+ random by level | ✅ | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT?${TRAITS} and) one of: ${PROPERTIES} +${LEVEL} (current unit level) |
| prop+ random by percentage | ✅ | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT?${TRAITS} and) one of: ${PROPERTIES} +${VALUE} |
| prop+ random by tier mp | ✅ | ($TARGET?Choose a unit.) It gains ($HAS_TRAIT?${TRAITS} and) one of: ${PROPERTIES} +${TIER} (current market tier) |
| prop+ random to group | Give one of: ($HAS_TRAIT?${TRAITS} and) ${PROPERTIES} +${VALUE} to your ${GROUP} units | |
| prop+ random to group in refuge | Give one of: ($HAS_TRAIT?${TRAITS} and) ${PROPERTIES} +${VALUE} to ${GROUP} units in the refuge | |
| prop+ random to random in group | Give one of: ($HAS_TRAIT?${TRAITS} and) ${PROPERTIES} +${VALUE} to a random ${GROUP} unit | |
| prop+ random to random in group in refuge | Give one of: ($HAS_TRAIT?${TRAITS} and) ${PROPERTIES} +${VALUE} to a random ${GROUP} unit in the refuge | |
| prop+ random to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit.) It gains ($HAS_TRAIT?${TRAITS} and) one of: ${PROPERTIES} +${VALUE} |
| prop+ to group | Give ${PROPERTIES} +${VALUE} to your ${GROUP} units | |
| prop+ to group in refuge | Give ${PROPERTIES} +${VALUE} to ${GROUP} units in the refuge | |
| prop+ to random in group | Give ${PROPERTIES} +${VALUE} to a random ${GROUP} unit | |
| prop+ to random in group in refuge | Give ${PROPERTIES} +${VALUE} to a random ${GROUP} unit in the refuge | |
| prop+ to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit:)${PROPERTIES} +${VALUE} |
| prop- to mvp attack unit | Inflict ${VALUE} damage to the highest 💪 Attack enemy | |
| prop- to mvp health unit | Inflict ${VALUE} damage to the highest ❤️ Health enemy | |
| replace target unit by higher tier unit | ✅ | Replace a unit with a random unit of the same type and next tier, keeping its stats except deaths |
| replace units by random units | Replace your units with random ones of the same tiers and types | |
| replace units by spirits | Replaces permanently battlefield units by ephemeral spirit with double stats, they live only 1 turn. | |
| summon | Summon ${CARD} to replace this | |
| traits+ | ✅ | ($TARGET?Choose a unit.) It gains ${TRAITS} |
| traits+ random | ✅ | ($TARGET?Choose a unit.) It gains one of: ${TRAITS} |
| traits+ random to group | Give one of: ${TRAITS} to your ${GROUP} units | |
| traits+ random to group in refuge | Give one of: ${TRAITS} to your ${GROUP} units in the refuge | |
| traits+ random to random in group | Give one of: ${TRAITS} to a random ${GROUP} unit | |
| traits+ random to random in group in refuge | Give one of: ${TRAITS} to a random ${GROUP} unit in the refuge | |
| traits+ random to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit.) It gains one of: ${TRAITS} |
| traits+ to group | Give ${TRAITS} to your ${GROUP} units | |
| traits+ to group in refuge | Give ${TRAITS} to your ${GROUP} units in the refuge | |
| traits+ to random in group | Give ${TRAITS} to a random ${GROUP} unit | |
| traits+ to random in group in refuge | Give ${TRAITS} to a random ${GROUP} unit in the refuge | |
| traits+ to target in group | ✅ | ($TARGET?Choose a ${GROUP} unit.) It gains ${TRAITS} |
generated_from_db/TABLE_TRIGGERS.md): it only matters for
the target. When an effect requires a target unit and none is given, a
unit card with a non-manual trigger targets itself; with a manual
trigger it does not, the target must be chosen by the player. Manual
does not change when the trigger fires: it always fires from its game
event.${GROUP}, it is matched against the
source unit of the event (ex: On purchase of
ally of a 🔥️ Fire group reacts only if the bought unit is 🔥️ Fire).by level effect reads that level). The 💪 Attack and ❤️ Health of
the level (25% of the printed stats, COMBAT.md “🎖️ Levels”) are added by
the maintenance itself: the enchantment adds its own bonus on top. It
fires at every level-up, whatever the duration of the enchantment.COMBAT.md).The list of the triggers and the condition required to activate each
of them is generated_from_db/TABLE_TRIGGERS.md (generated
from the DB).
A trigger of an enchantment is consumed when it
fires; the enchantment duration (duration, -1 = infinite)
is the number of times its triggers can fire. Some triggers are
one-shot: On deploy, On purchase,
On sale, On spell use and On next turn start
are consumed by their first use, whatever the duration of the
enchantment (ex: duration 2 with On deploy fires once). The
other triggers are recurring: they fire as many times as the duration
allows. An infinite duration is never consumed.
On turn start, On turn end and On next turn start are future events: when a spell is bought or used they cannot fire at once. Only the targetless effects of a spell are attached to the player, and they fire at the next occurrence of the event; the enchantment of the spell card is marked consumed for that trigger. An effect that needs a target unit stays on the unit and fires on its own events. The future triggers of a unit card stay on the unit.
On purchase and On spell use are not displayed during the play: the effect is obvious because the player has just done the action. Every other trigger is shown to the player when it fires.
The trigger of a spell decides what the player can do with it
(COMBAT.md “Using spells”):
| ⚡ Trigger of the spell | Possible actions |
|---|---|
| On spell use | BUY (keep it in the 🏡 Refuge), then USE later; or BUY & USE in the same drag |
| On purchase only, or only a future event (ex: On next turn start) | BUY & USE only: the purchase drag is also the use |
On purchase and On spell use never exist on the same card, and On spell use only exists on spell cards. Using a spell (On spell use) also raises On spell use by ally on the units of the player. The preview of the actions of a spell depends on its trigger, NOT on whether a target is required.
When an event happens on a card, its enchantments are processed one after the other, in the order of the card (the order of the DB), each one consumed independently. The enchantments attached to the player (future events) are processed in the order they were attached. The effects are applied in that order, so a later one sees the result of the earlier ones.
An effect can raise another trigger (ex: a unit in the 🏡 Refuge gains 💪 Attack, which raises On attack boost of ally on the other units, which gain 💪 Attack in turn). To stop the loops the processor remembers the pair trigger + source card being processed: the same trigger from the same source card is ignored while it is already being processed, but a different source card is allowed.
| 🏷️ Name | 📝 Condition | Manual |
|---|---|---|
| On combat surviving | when it survives a combat | |
| On first hit | when it deals damage, once per combat | |
| On first kill | when it kills its first enemy per combat | |
| On first wound | when it takes damage, once per combat | |
| On next turn start | when the next turn starts | |
| On round 1 | when the 1st round starts | |
| On round 2 | when the 2nd round starts | |
| On deploy | when it enters the ⚔️ Battlefield | ✅ |
| On deploy of ally | when another ${GROUP} unit enters the ⚔️ Battlefield | ✅ |
| On purchase | when you buy a card | ✅ |
| On purchase of ally | when you buy a ${GROUP} unit | ✅ |
| On sale | when you sell it | ✅ |
| On sale of ally | when you sell a ${GROUP} unit | ✅ |
| On spell use | when you consume a spell | ✅ |
| On spell use by ally | when a spell is cast | ✅ |
| On attack boost | when it increases its 💪 Attack | |
| On attack boost of ally | when another ${GROUP} unit increases its 💪 Attack | |
| On combat end | when a combat ends | |
| On combat lost | if you lost your last combat | |
| On combat start | when a combat starts | |
| On death | when it dies | |
| On death of ally | when another ${GROUP} unit dies | |
| On healing | when it recovers some lost ❤️ Health | |
| On healing of ally | when another ${GROUP} unit recovers some lost ❤️ Health | |
| On health boost | when it increases its ❤️ Health | |
| On health boost of ally | when another ${GROUP} unit increases its ❤️ Health | |
| On hit | when it deals damage | |
| On hit by ally | when another ${GROUP} unit deals damage | |
| On kill | when it kills an enemy | |
| On kill by ally | when another ${GROUP} unit kills an enemy | |
| On kill of melee | when it kills an enemy 🗡 Melee | |
| On kill of shooter | when it kills an enemy 🏹 Shooter | |
| On kill of spellcaster | when it kills an enemy 🪄 Spellcaster | |
| On lane lost | when you lose a 🛣️ Lane | |
| On lane won | when you win a 🛣️ Lane | |
| On level up | when it increases its 🎖️ Level | |
| On marketplace upgrade | when you upgrade the 🧺 Marketplace | |
| On refuge mating | when it spends a turn in the 🏡 Refuge with a mate | |
| On refuge staying | when it spends a turn in the 🏡 Refuge | |
| On round end | when a round ends | |
| On round start | when a round starts | |
| On shield boost | when it increases its 🛡️ Shield | |
| On shield boost of ally | when another ${GROUP} unit increases its 🛡️ Shield | |
| On turn end | when a turn ends | |
| On turn start | when a turn starts | |
| On wound | when it takes damage | |
| On wound of ally | when another ${GROUP} unit takes damage |
The full list of traits (name, Permanent, ±, description, ⚡ Triggers)
is generated_from_db/TABLE_TRAITS.md, generated from the
DB: it is the reference for the exact values, this file explains the
rules.
TABLE_TRAITS.md is the moment where the trait
acts (combat start, round end, hit / wound, combat end, turn start…). A
trait with an empty ⚡ Triggers column is a permanent rule read where it
applies (ex: hibernation). The trigger of a trait is not an 🕯️ Enchantment
trigger (see TRIGGERS.md): nothing is consumed.${VALUE} in their description (ex: tribute, mercenary,
hibernation, social herding). The VALUE is the VALUE of the
card, shared by all the traits of that card whose
description contains ${VALUE}: a trait reads it only if its
description contains ${VALUE} (first strike does not: it
inflicts the level of the unit). A trait without ${VALUE}
has fixed numbers (<-25%>).A unit can hold the same trait twice: the first trait of a Triple or
more when it is positive (MERGING.md “Merge boost”: a negative first
trait is removed instead), or a trait granted by a spell to a unit that
has it. The traits with a number add up (dodge,
backlash, attack / health transfer, intimidate, lifesteal, fury,
ricochet, gifted learner, mentoring, first strike); the other traits
count once. A trait that reads ${VALUE} is not held twice
by the merge: its VALUE is multiplied instead.
The short list of the 7 states, with where each one is explained, is the table “🐼 Unit states” of UNITS.md.
These states are computed by the rules from the state of the game or of the battle. They have no row in the DB, no value points, and no spell can give or remove them: a unit never carries them in its traits, so they never show as a trait (the trait icon, the trait notes, the description). The info scroll of the zoomed card explains each one that applies (UNITS.md “🃏 Card details”). Each has one level: on or off, with a flat percentage, the same from any number of sources.
| State | Derived from | ✴️ Effect | Shown by |
|---|---|---|---|
| Dominance | The element of the attacker beats the one
of its target (ELEMENTS.md) |
💪+25% damage dealt | the combat log and the replay of the hit
(+25% Dominance) and the ☯ Element note of the scroll |
| Resonance | Both units of the lane of the attacker
share its element (ELEMENTS.md) |
💪+25% damage dealt | the combat log and the replay, the Resonance note of the scroll |
| Disrupted | A 🏹 Shooter or a 🪄 Spellcaster touching an
enemy 🗡 Melee (COMBAT.md) |
💪-50% damage dealt | the combat log and the replay, the unit type note of the scroll |
| Rested | The unit spent the last 🧹️ Maintenance in the 🏡 Refuge and is deployed (REFUGE.md; “⚔️ Combat start traits”) | 💪+25% 💪 Attack for the battle | the Rested note of the scroll, the combat log |
| Injured | 3 💀 Deaths or more (COMBAT.md “💀 Deaths”) | cannot be deployed or fight, it rests in the 🏡 Refuge | the 3 skulls, the dark greyscale combat card, the 💀 Deaths / Injured notes of the scroll |
| Poisoned | Hit by a poisonous unit during the battle (“Round traits”) | ❤️-50% of the current ❤️ Health at each round end | the combat log and the replay (the poison ticks) |
The egg stages (Dormant egg, Developing egg, Hatching egg and the
🐸 Frog ones) carry the tag Developing and
not a trait: an egg is a kind of card, not a property that a spell could
give or take. The tag means that the card (REFUGE.md “Egg chains”): *
evolves into the next stage of its chain at each 🧹️ Maintenance it spends
in the 🏡 Refuge; * never merges (MERGING.md “Eligibility”); * is exempt
from the ❤️ Health share check (UNITS.md). The info scroll of a card with
this tag says it (UNITS.md “🃏 Card details”).
The ❤️ Health share check (UNITS.md “❤️ Health share”) skips a card in every one of these cases, and only these:
StatExemption: a declared
exception, for example a support caster (the tag is kept for it);Developing (the egg stages),
Inactive or NotForSale;Ephemeral,
💪 Attack mimicry, ❤️ Health mimicry,
💪 Attack assimilation or ❤️ Health assimilation:
their stats come from elsewhere;Some traits are specific to an ELEMENT, not to a
clan: only the units of these elements may carry them (checked
when the cards are loaded). The DB gives them in the
☯ Elements column of the 🧬 Traits table (ex:
🌿️ Earth,🌪️️ Wind).
| ☯ Element | 🧬 Traits |
|---|---|
| 🔥 Fire (🐓 Rooster, 🐱 Cat, 🐉 Dragon) | shield piercing, fury, egg layer, cannibalism |
| 💧 Water (🐍 Cobra, 🐖 Pig, 🐸 Frog) | poisonous, lifesteal, egg layer, cannibalism |
| 🌿 Earth (🐃 Buffalo, 🐼 Panda, 🐕 Dog) | overflow damage, shield piercing, backlash, hibernation, pack instinct, social herding, intimidate |
| 🌪️ Wind (🐇 Rabbit, 🦓 Zebra, 🐒 Monkey) | overflow damage, ricochet, fury, half-life revival, gifted learner |
The other traits (mentoring, protections, first strike, dodge, the transfers, the mimicries, the assimilations, tribute, taunt, charge…) have no element: every unit may carry them.
A trait is either permanent or
temporary. The Permanent column of
generated_from_db/TABLE_TRAITS.md says which.
traits column of the cards): it would be lost at the
first maintenance. The data check reports it. 🧬 Traits given by
enchantments/spells (traits+) may be temporary.prop+ ... On kill,
prop+ to group, a trait granted in combat…), the stats and
traits are battle-only, permanent or not: they are
removed at the end of the battle. The effects of the post-combat
triggers (On combat surviving, On combat end, On combat lost, On level
up) are permanent.| 🧬 Trait | ✴️ Effect |
|---|---|
| 🔥️ / 💧 / 🌿 / 🌪️️ protection | Negates the first damage of ITS element in the battle |
| dodge | 💥 -50% damage taken (deterministic, no chance) |
| random protection | 🔮 Spell only: becomes one of the 4 protections when the spell is used on a unit |
The first hit of the battle that would kill the unit (an attack, a strike of the combat start or a secondary hit; not the poison) leaves it at 1 ❤️ Health instead: the 🛡️ Shield the hit removed is lost, the unit is not dead (no On kill, no On death, no 💀 Death), and the trait is spent for this battle (the trait stays on the card and is back at the next battle, like a Protection). Any later lethal hit kills it. The step of the replay shows the ❤️ Health 1 and names the trait. A trait given twice counts once.
Resolved once at the start of each lane, before the first round, in this order: player 1 then player 2, by ⚔️ Battlefield slot (front row first), and the traits of a unit in their order. Every effect reads the values at the combat start, before any combat start effect, so the order never changes a result (rested +25% and intimidate -25% on the same unit cancel out). Rested comes after the traits of the unit.
| 🧬 Trait | ✴️ Effect | Reads the VALUE |
|---|---|---|
| first strike | Inflicts damage equal to its level (1 to 5) to the closest enemy | no |
| intimidate | The nearest enemy suffers 💪-25% | no |
| social herding | ❤️+VALUE for each other member of the clan on the ⚔️ Battlefield | yes |
| pack instinct | 💪+VALUE for each other member of the pack (the clan) on the ⚔️ Battlefield | yes |
Resolved at the end of each round of a lane, battle-only (nothing is written to the card), before the Round end enchantments:
The poison is shown as a step of the replay.
Read when a unit attacks or is wounded; battle-only.
| 🧬 Trait | ✴️ Effect |
|---|---|
| shield piercing | The damage ignores the 🛡️ Shield: the whole damage goes to the ❤️ Health and the 🛡️ Shield is untouched |
| lifesteal | The attacker gains 50% (rounded to the nearest, a trait given twice stacks) of the damage it really inflicted (🛡️ Shield and ❤️ Health removed) as ❤️. There is no ceiling: the ❤️ Health can exceed the maximum. Only the part of the gain that brings the ❤️ Health back up to the ❤️ Health of the start of the lane is a healing (it raises On healing / On healing of ally); a gain above it is a boost. A secondary hit gives nothing |
| fury | The unit gains 💪 equal to the damage it really took (🛡️ Shield and ❤️ Health removed) |
| 🧬 Trait | ✴️ Effect |
|---|---|
| charge | Can attack after move: the unit that has just moved attacks in the same action when an enemy is then in range |
| taunt | Enemies in range must target this unit |
| last stand | Survives the first lethal hit with 1 ❤️ Health, once per combat (see “Defensive traits”) |
Resolved at the start of each turn for the units of the ⚔️ Battlefield and of the 🏡 Refuge, in the order of the payments (the ⚔️ Battlefield first, then the 🏡 Refuge, by position), after the income of the turn:
| 🧬 Trait | ✴️ Effect |
|---|---|
| tribute | The player receives VALUE coins (the VALUE of the card; a trait given by an enchantment uses the VALUE of the card that is its source). The coins are received one unit after the other |
| mercenary | The unit costs VALUE coins; a unit that cannot be paid is dismissed (COMBAT.md) |
The tributes come before the mercenary fees, so the coins of a tribute can pay a mercenary.
Resolved once, when the unit that carries the trait is purchased; the change is permanent (the real cards). The unit drains up to 3 random other units of the player (🏡 Refuge or ⚔️ Battlefield; distinct, fewer when the player owns fewer), each trait with its own draws (attack first):
| 🧬 Trait | ✴️ Effect |
|---|---|
| attack assimilation | Each target loses 50% of its 💪 (rounded down) and the drainer gains what was drained |
| health assimilation | Each target loses 50% of its ❤️ - 1 (rounded down; a target keeps at least 1 ❤️) and the drainer gains what was drained |
No damage crosses lanes. In a lane the cells are a line: behind a unit is the allied unit in the next cell towards the own back; the next enemy after a target is the next living enemy beyond it on the line from the attacker to the target (range ignored; nothing if there is none).
| 🧬 Trait | ✴️ Effect |
|---|---|
| overflow damage | When the target dies, the excess over its remaining 🛡️ Shield + ❤️ Health (❤️ Health only for a 🛡️ Shield piercing attacker) hits the next enemy |
| ricochet | 50% (rounded to the nearest, a trait given twice stacks) of the final damage of the main hit, after the modifiers, hits the next enemy |
| backlash | Redirects 💥25% (rounded to the nearest) of the damage of an attack on the unit back to the attacker: the unit takes the rest |
damage - backlash; the backlash is sent even when the rest
of the damage kills the unit, and it can kill the attacker (the unit
that sends it back earns the kill). A trait given twice counts once.
Nothing is sent when the share rounds to 0.| 🏷️ Name | Permanent | ± | 📝 Description | ⚡ Triggers |
|---|---|---|---|---|
| attack assimilation | ✅ | 🟢 | Drain and gain <50%> 💪 of up to 3 random ally units | On purchase |
| attack mimicry | ✅ | 🟢 | Copy 💪 from the first ally in the lane | On combat start |
| attack transfer | ✅ | 🟢 | Give <50%> of its 💪 to the first ally in the lane | On death |
| backlash | ✅ | 🟢 | Redirect 💥<25%> back to the attacker | On wound |
| charge | ✅ | 🟢 | Can attack after move | |
| dodge | ✅ | 🟢 | 💥<-50%> | On first wound |
| egg layer | ✅ | 🟢 | Give sometimes a card | On refuge staying |
| first strike | ✅ | 🟢 | Inflict damage equals to its level to the closest enemy | On combat start |
| fury | ✅ | 🟢 | Increase 💪 by 💥 taken | On first wound |
| gifted learner | ✅ | 🟢 | 🪖<+1> | On combat surviving |
| health assimilation | ✅ | 🟢 | Drain and gain <50%> ❤️-1 of up to 3 random ally units | On purchase |
| health mimicry | ✅ | 🟢 | Copy ❤️ from the first ally in the lane | On combat start |
| health transfer | ✅ | 🟢 | Give <50%> of its ❤️ to the first ally in the lane | On death |
| intimidate | ✅ | 🟢 | Nearest enemy suffers 💪<-25%> | On combat start |
| last stand | ✅ | 🟢 | Survives the first lethal hit with 1 ❤️ Health, once per combat | On death |
| lifesteal | ✅ | 🟢 | Gain 50% of inflicted 💥 to its ❤️ (can exceed max health) | On hit |
| mentoring | ✅ | 🟢 | Give 🪖<+1> to the unit on the right when resting in 🏡 Refuge | On refuge staying |
| overflow damage | ✅ | 🟢 | Unabsorbed damage goes to the next enemy | On hit |
| pack instinct | ✅ | 🟢 | 💪<+${VALUE}> for each other member of the clan in ⚔️ Battlefield | On combat start |
| poisonous | ✅ | 🟢 | Poison any unit it damages, once per combat | On first hit |
| random protection | ✅ | 🟢 | Negate random damage once | |
| ricochet | ✅ | 🟢 | 💪 Attack also hits the next enemy with 50% of attack | On hit |
| shield piercing | ✅ | 🟢 | 💥 Damage ignores shield | On hit |
| social herding | ✅ | 🟢 | ❤️<+${VALUE}> for each other member of the clan in ⚔️ Battlefield | On combat start |
| taunt | ✅ | 🟢 | Enemies in range must target this unit | |
| tribute | ✅ | 🟢 | <+${VALUE}> coins at each turn start | On turn start |
| 🌪️️protection | ✅ | 🟢 | Negate 🌪️️damage once | On first wound |
| 🌿protection | ✅ | 🟢 | Negate 🌿damage once | On first wound |
| 💧protection | ✅ | 🟢 | Negate 💧damage once | On first wound |
| 🔥️protection | ✅ | 🟢 | Negate 🔥️damage once | On first wound |
| cannibalism | ✅ | 🔴 | Eat the lowest health ally in the same zone and gain half of ally 💪 and ❤️, if unable to eat, lose half of its 💪 and ❤️ | On turn start |
| ephemeral | ✅ | 🔴 | Vanishes permanently on next turn. | On turn start |
| half-life revival | ✅ | 🔴 | if died last turn, resurrect with only half of its ❤️ Health | On turn start |
| hibernation | ✅ | 🔴 | Must stay ${VALUE} ⟳️ Turn(s) in refuge before deploying | |
| mercenary | ✅ | 🔴 | 🪙 Costs ${VALUE} coins at the start of each turn, otherwise it leaves. | On turn start |
The game knows its cards, enchantments, effects, traits and triggers
from JSON data files
(frontend/public/*.json, read by the client and by the
server through the shared loader). The database holds only a thin copy
of the cards (icards) and the instances of a game. This
page describes both, as the code has them.
JsonCard. The same
immutable data is used by 🐼 Units and 🔮 Spells, to represent a card
in the 📦 Shoe.| Field | Used by | Data type | 📝 Description |
|---|---|---|---|
| id | both | 🧮 integer | identifier in the data |
| name | both | 🧾 string | name of the card displayed in the game. The label
(UPPERCASE_WITH_UNDERSCORES) is computed from it. |
| type | both | 🧾 string | CardType: 🗡 Melee, 🏹 Shooter, 🪄 Spellcaster or 🔮 Spell (the data writes it with an emoji prefix) |
| clan | both | 🧾 string | ClanType, absent for a neutral card (the element comes from the clan). A spell can use the clan to extract its element. |
| tier | both | 🧾 string | “1” to “7” in the data (the code reads it with
parseInt); the tier at which the card becomes available in
the 🧺 Marketplace |
| atk | unit | 🧮 integer | 💪 Attack, absent = 0 |
| hp | unit | 🧮 integer | ❤️ Health, absent = 0 |
| def | unit | 🧮 integer | 🛡️ Shield, absent = 0 |
| traits | both | 🧾 string | traits of the unit, comma separated, absent = none |
| enchantments | both | 🧾 string | names of the enchantments, separated by \| (the names
contain commas), absent = none |
| fxGroup | both | 🧾 string | group used by the effect and the trigger: all (absent), UnitElement or UnitType |
| fxValue | both | 🧮 integer | value used by the effect; fxValue2 is the value of the
second enchantment (only one card has it) |
| tags | both | 🧾 string | comma separated CardTagType: Breedable, Developing (egg), NotForSale, NotForResell, Inactive, StatExemption |
| hash | both | 🧾 string | hash of the image of the card |
attack, health, shield); only
the data file abbreviates them (atk, hp,
def).📝 Comment, ✏️ Prompt or
🖼️ Image field. The tier 7 exists in the data (20 cards).icards, a copy of a card of the
data created the first time a game needs it
(findOrCreateICard): id (name in uppercase, other
characters replaced by _), name, type, tier, 💪 Attack,
❤️ Health, 🛡️ Shield, clan, fxGroup and fxValue. The server holds no card data
of its own: the data files are the source.| 🏷️ Name | Data type | Attributes | 📝 Description |
|---|---|---|---|
| 🗝 Id | 🧾 string | primary key | internal name (only UPPERCASE and ’_’ characters) |
| 🏷️ Name | 🧾 string | non-null | name of the card displayed in the game |
| 🧬 Type | 🧾 string | non-null | CardType |
| 📝 Comment | 🧾 string | nullable | internal notes (never written by the game) |
| ✏️ Prompt | 🧾 string | nullable | ai prompt used to generate the image (never written by the game) |
| 🖼️ Image | 🧮 integer | nullable | image of the card (never written by the game) |
| ⭐ Tier | 🧮 integer | non-null | tier of the card, 1-7 (the comment of the entity still says 1-6) |
| 🪙 Cost | 🧮 integer | default=4 | legacy: never written nor read, the price is the ⭐ Tier. The default of 4 is stale. |
| 🕯️ Enchantment | IEnchantment | nullable | enchantment to apply (never written by the game) |
| 🔢 Fx Value | 🧮 integer | nullable | used by the effect |
| 👥 Fx Group | 🧾 string | nullable | ELEMENT, CLAN, TYPE or null |
| 🧬 Traits | list of 📌 enum | nullable | never written by the game: the traits come from the data |
| 🗿 Clan | 🧾 string | nullable | ClanType, null for neutral units |
| 💪 Attack | 🧮 integer | default=1 | damage inflicted to a unit when attacking |
| ❤️ Health | 🧮 integer | default=1 | each 💥 Damage point removes one health point, ❤️ Health is fully restored after a combat |
| 🛡️ Shield | 🧮 integer | default=0 | blocks 💥 Damage until depleted, 🛡️ Shield points are permanently lost and not restored after a combat |
🃏 MCard (MCardImpl, played by the
client, the bots and the server engine) and the database row
🃏 MCard (mcards).attack and one
health (the current values); the row stores them as
curAttack/curHealth and the max values as
maxAttack/maxHealth. When a unit is written
back, the max columns are set to the same value as the current ones (the
runner writes maxAttack = attack,
maxHealth = health).| 🏷️ Name | Used by | Data type | Default | 📝 Description |
|---|---|---|---|---|
| 🗝 Id | both | 🧾 string | unique (the runtime model has a numeric
uid) |
|
| ⟳️ Turn | both | 🧮 integer | non-null | turn at which the card has been bought |
| 🃏 Card | both | 🃏 ICard (row) / JsonCard (runtime) | non-null | reference to the immutable template |
| 🎮 Game | both | 🧮 integer | non-null | index of the game |
| 👤 Owner | both | 🧮 integer | non-null | index of the game player (0-7), row only |
| 🚩 Zone | both | 📌 enum | non-null | CardZone (the runtime default is SHOE) |
| 🔢️ Order | both | 🧮 integer | non-null | ordered position in the zone |
| 💪 Cur Attack | unit | 🧮 integer | 0 | current 💪 Attack (row); attack
at runtime |
| ❤️ Cur Health | unit | 🧮 integer | 0 | current ❤️ Health (row); health
at runtime |
| 💪 Max Attack | unit | 🧮 integer | 0 | row only, kept equal to the current 💪 Attack by the runners |
| ❤️ Max Health | unit | 🧮 integer | 0 | row only, kept equal to the current ❤️ Health; used for the totals of the ranking |
| 🛡️ Shield | unit | 🧮 integer | 0 | current 🛡️ Shield |
| 🪖 Experience | unit | 🧮 integer | 0 | XP banked towards the next level, spent on a level up |
| 💀 Deaths | unit | 🧮 integer | 0 | times the unit died in a battle and was not healed; 3 or more injure it. Healed by resting in the 🏡 Refuge. |
| Copies | unit | 🧮 integer | 1 | identical units merged into this one (1 = never merged); the stats are the sum of the copies |
| 🏡 Refuge ⟳️ Turns | unit | 🧮 integer | 0 | maintenance phases of the current stay in the 🏡 Refuge (Hibernation); 0 outside of it |
| Range | unit | 🧮 integer | 1 | range of the unit when attacking |
| 🎖️ Level | unit | 🧮 integer | 1 at runtime (START_LEVEL);
0 in the row (column default) |
from 1 to 5. The 💪 Attack boost is a share of the printed stats, see ✴️ Effects. A row saved under the old 9 levels is clamped to 5 when read. |
| 🕯️ Enchantments | unit | list of MEnchantment | enchantments of the unit | |
| 🔮 Spells | unit | list of 🃏 MCard | row only: spells cast on the unit
(unit points back to the unit) |
| 🏷️ Name | Data type | Default | 📝 Description |
|---|---|---|---|
| Battles | 🧮 integer | 0 | battles in which the unit was on a lane |
| Kills | 🧮 integer | 0 | enemy units it killed with an attack |
| 💀 Deaths Taken | 🧮 integer | 0 | 💀 Deaths ever received in a battle, the healed ones included |
| 🏡 Refuge Spent | 🧮 integer | 0 | maintenance phases ever spent in the 🏡 Refuge |
A merge sums the history of the copies. They are kept apart from
💀 Deaths (which heals) and 🏡 Refuge ⟳️ Turns (the
current stay).
enchantments.json
(JsonEnchantment), and a copy exists in the table
ienchantments.id, name,
duration, fx (the one
effect), triggers (comma separated), props
(comma separated properties), traits (comma separated),
card (name of a card). A delay in the data is
reported as an error and ignored.| 🏷️ Name | Data type | Attributes | 📝 Description |
|---|---|---|---|
| 🗝 Id | 🧾 string | primary key | internal name (only UPPERCASE and ’_’ characters) |
| 🏷️ Name | 🧾 string | non-null | name displayed |
| ✴️ Effect | 📌 enum | non-null | EffectType applied |
| ⚡ Triggers | list of 📌 enum | nullable | decides when to trigger the effect. If none, it is applied instantly when used. |
| 📊 Properties | list of 🧾 string | nullable | properties to modify (💪 Attack, ❤️ Health, 🛡️ Shield, 🪖 Experience…) |
| ⏳ Duration | 🧮 integer | default=1 | for how many turns the effect repeats (-1=infinite, 0=never, 1=default) |
| ⏰ Delay | 🧮 integer | default=0 | legacy: the delay is gone from the design and from the engine; the column is still in the entity |
| ⏳ Cooldown | 🧮 integer | default=0 | legacy: currently unused |
| 🃏 Card | 🃏 ICard | nullable | optional when the effect uses a card |
| 🧬 Traits | list of 📌 enum | nullable | optional when the effect grants traits |
| 📝 Comment | 🧾 string | nullable | internal notes |
MEnchantment
(MEnchantmentImpl) extends the template with its source
card and its consumed triggers. The row is
menchantments:| 🏷️ Name | Data type | Attributes | 📝 Description |
|---|---|---|---|
| 🗝 Id | 🧾 string | primary key | |
| ⟳️ Turn | 🧮 integer | non-null | turn at which the enchantment has been bought |
| 🕯️ Enchantment | IEnchantment | non-null | reference to the template |
| 🎮 Game | 🧮 integer | non-null | index of the game |
| 👤 Owner | 🧮 integer | non-null | index of the game player (0-7) |
| 🔢️ Order | 🧮 integer | non-null | ordered position at the unit |
| 🐼 Unit | 🃏 MCard | nullable | the unit it has been cast on |
| 🏁 First Use | 🔘 boolean | default=true | legacy: always written true, absent from the runtime model |
| ⏳ Duration | 🧮 integer | default=0 | counter of the rounds already affected |
| ⏰ Delay | 🧮 integer | default=0 | legacy: “delay and cooldown counter”, always written 0, the design has no delay |
| Data | text (JSON) | nullable | what the engine needs to rebuild the applied enchantment: source card name, triggers, traits and values given at application, consumed triggers. null = the template alone. |
effects.json,
triggers.json, traits.json), read by
JsonEffect, JsonTrigger and
JsonTrait. The tables effects,
triggers and traits exist as entities but the
game never reads nor writes them.| Data | Fields in the JSON |
|---|---|
| ✴️ Effect | id, name, desc (description,
uses PROPERTIES / VALUE / GROUP), target (1 when a target
unit is required), point, percent |
| ⚡ Trigger | id, name, condition,
manual (1 when the event results directly from a player’s
action), combat (1 when it is triggered in combat) |
| 🧬 Trait | id, name, desc,
positive (“+” benefits the player, otherwise harms it),
permanent, triggers (one),
triggerExplained (Y/N), elements (the elements
whose units may carry it), point, percent |
point is a flat value,
percent a share of the points of a unit of the tier; the
larger in absolute value counts, and a negative value is a
drawback.singleRound, visible; ✴️ Effect:
logic; ⚡ Trigger: no manual), and miss the data
fields above.Pity refresh. After a lost duel without winning any lane, your next 🧰 Preparation phase starts with one free 🧺 Marketplace refresh. It’s worth only 1 coin, but it gives the loser a better chance of finding the unit that fixes their board. It’s hard to exploit because the reward is small and it’s about choice rather than stats.
Consolation coin. A player who loses the duel but wins at least one lane gets +2 coins. The payout is tied to partial success, so you can’t farm it by fielding a weak board, and it gives losers a reason to fight for every lane even when the duel is gone. Only the loser gets it; paying per-lane coins to both sides would feed the winner’s snowball instead. The consolation coin can’t fire before turn 5. A loser needs to win at least one lane, which requires three open lanes, so turns 1–4 rely on the 1-coin pity refresh alone.
Underdog market slot. 👤 Players in the bottom half of the ladder see one extra card in the 🧺 Marketplace. This fits especially well because of the shared 📦 Shoe: leaders can buy or hoard the good copies, and an extra slot gives trailing players a fairer chance at what’s left. Tanking to reach the bottom half costs 💚 Vitality you can’t get back, so few players will do it on purpose.
Streak bounty. A player on a win streak carries a bounty of 1 coin per consecutive win, capped at 3 or 4. Whoever breaks the streak collects it. This rewards beating the leader rather than losing, so it can’t be exploited, and it adds drama: show the bounty on the 🪜 Ladder and in the Oracle, and players will look forward to drawing the leader.
| Mechanic | Main effect | Exploit risk | Complexity |
|---|---|---|---|
| Pity refresh | More choice after a loss | Very low | Very low |
| Consolation coin | Economy for partial success | Low | Very low |
| Underdog market slot | Fairer access to the shared pool | Low | Low |
| Streak bounty | Punishes runaway leaders | None | Low |
The game screen or board is composed of different “UI elements” that can be shown or hidden depending on the turn phase.
Due to the high number of graphics to create, the goal is to leverage the help of generative AI. It is now possible to generate high-quality images in high resolution that do adhere to the prompt requirement.
The following rules are based on experience using different generative tools.
All animals will have anthropomorphic sounds where a human mimics the animal sound in different languages (like Cocorico, …). We will favor the most ridiculous ones for fun.