Asynchronous ranked combat. You attack a snapshot of another player's team — they are not online, they do not need to be, and their side is piloted by their own autoplay settings. Opens at floor 15. 10 attacks a day, matches decided by the server, standings cut every week for pay — there are no seasons, and nothing ever resets your rating. Competitive PvP (live, double-blind, both players present) is unchanged and lives on its own page.
The loop
| Step | What happens |
| Queue | Spends one attack and mints a match: the server picks the defender from every snapshotted account at the Auto PvP rung whose power is inside a window around yours (×1.25, widening to ×1.5 and ×2 when the pool is thin), or a TOWER ECHO house team built for your best floor when nobody is in it (no rating moves either way on an echo); pins the seed, pins both teams, and starts a 20-minute clock. |
| Fight | Manual or autoplay, exactly like any other battle. The defense is piloted by the defender's own autoplay settings, and Competitive's damage ramp applies. |
| Finish | The server re-simulates the whole fight from the pinned seed and teams. Agreement settles the match; both ratings move. Cooldowns are the server’s: every move starts the fight ready, the re-sim tracks each one itself, and a submitted round that fires a move still cooling is flagged, never settled. A claim the server disproves is void: a roster that does not match the teams pinned at the queue, an illegal act in the replay, or a re-sim that reaches another winner — the ticket stays spent, neither rating moves, the match counts for nobody, and a report is filed for D. |
| Abandon | A match left unfinished past 20 minutes settles as a defense win. The attack is not refunded — walking away from a bad matchup is not free. |
Attacks
- 10 per day, refilling to that number at the daily reset (00:00 UTC;
pvp_ladder.csv apvp_daily). Nothing banks: unspent attacks do not carry over.
- At most two attacks on the same defender per day, so no one can be farmed and no one can farm one soft target.
- The premium shop sells 10 more for the current day, 4 Wraithgold (
premium_shop.csv SHOP-003). They stack above the daily ten and expire at the same reset.
- You never choose your opponent. The server picks from players near your hidden defense rating, so matches stay competitive as you climb.
The snapshot
Your defense is a copy of your team taken by the daily fold — the same team you last saved, with its gear, levels and moves frozen as they were. Your attack is the team you have equipped when you queue (D ruling 2026-08-25: “The team you take to async pvp needs to be the one you currently have equipped. The daily snapshot is for the DEFENDING team”). The client saves before it queues, and the server reads the attacking team from that save and pins it for the match — the client never names its own team — so both sides of every match are still a fixed, knowable thing.
- Your defense fights while you are offline. It is piloted by your autoplay settings — ultimate timing, targeting, buff and debuff priority — so those settings are your defensive strategy, not just a convenience.
- Re-gearing shows up on defense at the next daily reset — the snapshot is a day's photograph, not a live mirror — and on attack at once, from your next queue. (Until 2026-08-25 both sides used the daily snapshot; report #510.)
- An account that has never saved has no team slice: it cannot be attacked, and it cannot attack (“NO TEAM SAVED YET”).
Rating
- Glicko-2, seeded at 1500. Every player carries two ratings: a visible attack rating and a hidden defense rating.
- Attacking moves your attack rating; being attacked moves only your defense rating. A bad week of defenses cannot drag your visible rank down.
- The hidden rating is what matchmaking steers by. It is never shown, to you or to anyone else.
- The ladder shows what each player last won with — their class and the two creatures beside it.
Weeks, pay and inactivity
There are no seasons (D, Tower rulings T33, 2026-10-22). The ladder runs on weeks: the week closes on a fixed Sunday 00:00 UTC cutoff, the same clock as the daily reset, the standings are cut, the top ten are paid, and every rating carries on unchanged — nothing resets.
- Pay by rank (
codex/pvp_weekly_pay.csv): rank 1 gets incense and bait for 30 days plus the week’s medal; ranks 2–3 incense and bait for 30 days; ranks 4–10 incense for 30 days. The items arrive as timed boons on the account.
- You are paid only if you played that week: at least one attack of yours that settled and was not voided. Defending does not count.
- A thin week pays half. A week in which fewer than 10 players attacked pays 50% of every reward’s days and no medal (T46).
- Inactivity hides you: after 7 days without a settled attack you leave the Auto PvP board. From idle week 2 each full idle week takes 5% off your rating, down to the starting 1500 and never below it. Your next attack starts from the decayed rating and puts you back on the board.
Challenge by code
From the arena header, CHALLENGE lets you hand one player a code. If they are waiting for you live, the two of you get a Competitive match; if they are not, entering their code is one Auto PvP attack on their defense — same ticket, same limit of two attacks per defender per day, the same server replay and settle. Details and every refusal line on PvP.
Fair play
Every result is decided by the server, not reported by the client. The fight you watch and the fight the server verifies run the same code over the same bytes — one battle engine, shipped to both sides.
- The defense's moves are never accepted from an attacker's client: the server derives them from the pinned settings, so a weakened defense is a mismatch, not an advantage.
- The server builds both teams. Every stat, the gear package and every move of both sides is derived on the server from the saved roster — class soul and its level, equipped gear, sockets and souls, the two equipped creatures and their levels — against the codex tables, with the same code the game shows you. Nothing the client writes about a team's numbers is read (D ruling 2026-10-01, Rulings board row teamstats).
- Submitted teams are checked field by field against the snapshot pinned at mint — stats, gear, class, and every move including its effects.
- A result that fails either check is recorded and investigated rather than silently accepted.
Defense log
The PVP screen reports what happened while you were away: how many times your defense was attacked, how many held, and who came at you with what. Controlled by Notifications › PvP Defense Results.
Changelog
- 2026-11-03 — codex review (dfmc-client lane codexreview-a; D 2026-11-03 “review the codex…”). WIKI ONLY. The “Seasons” section is gone: the page now describes the weekly cut the way the game runs it (T33: there are no seasons; pay by rank from
pvp_weekly_pay.csv, a thin week pays half with no medal, T46; inactivity hides after 7 days and decays 5% a week from week 2 down to 1500), with every number read from pvp_ladder.csv / pvp_weekly_pay.csv / premium_shop.csv / unlocks.csv through csv-bind; the unlock floor is stated; a Challenge by code section points at the B16 rule on the PvP page; the page gets the shared nav like every other system page.
- 2026-10-22 — the queue is never empty: the defender pool, the power window and the TOWER ECHO (Tower rulings form card T6 part 5, D 2026-10-18; 0.89-4 board card Q15 "Queue never empty"). LIVE on release since 2026-10-23 (0.89). Every account whose best floor (the server's ratchet, now written on the daily defense snapshot as
maxf) has reached the Auto PvP rung and whose fold built a defense team is in the defender pool - the server's own snapshot, never the attacker's client; a snapshot below the rung is never served. The mint is power-filtered: the Worker computes the attacker's power from his stored save (src/power.js computePower, the T8 rule - the same number the fold wrote on every defender's snapshot) and the pick stays inside a window of ×1.25 around it, widening to ×1.5 and ×2 when the pool is thin; the rating band then picks inside the window as before. When no human stands in the widest window the match is against a TOWER ECHO: a house team the Worker builds from the codex for the attacker's ratchet floor (a class line, a level around the floor, two companions native to the floor band from creatures.csv, built by the same src/team.js slice every human defense is built by, stood at the T4 wild-HP band for that floor), seeded by attacker + day + idem so the same attacker meets varied but reproducible echoes. An echo match costs the attack, runs and settles like any other (replay, forfeit, expiry) and carries bot:1 on the row and the response - but writes no ladder result for any human: no rating or W/L move for the attacker, no row for the house, no season credit for that week. The arena card names the defender TOWER ECHO [ECHO]. An unreadable attacker power, or a Worker that carried no echo (codex tables missing), keeps the old unfiltered pick, so a missing table never empties the queue. Gate: tools/probe_t6e_tower_echo.py 13/23 → 23/23 on a local worker (ratchet 10 / 15 fixtures, a level-1 and a level-90 attacker). Full entry on system-pvp.
- 2026-10-22 — the attacker's Targeting is pinned at the mint (Tower rulings form card T13 remainder, D 2026-10-18: “Follow Targeting in autoplay”). LIVE on release since 2026-10-23 (0.89). The match row now carries the attacker's autoplay Targeting beside his team, read from his stored save like the defender's settings are read by the daily fold, so when a queued attack's target dies earlier in the round the attacker's side re-aims by it on the client and in the server's replay alike; the defense's pin was already there (T13). Matches minted before this keep the first enemy in line on the attacker's side. Full entry on system-pvp; the rule itself on system-autoplay.
- 2026-10-01 — the server builds both teams from the saved roster (D ruling, Rulings board: row teamstats, “SERVER AUTHORITATIVE, EVERYTHING”). LIVE on release since 2026-10-23 (0.89). The pinned teams used to be a team summary the game client wrote into the save (stats, gear package, moves and their effects); the attacker's at the mint, the defender's at the daily fold. One edit of that summary before a save was a forged team the server then verified a fight against. Both are now built on the server from what the save holds — class, gear, souls, the equipped creatures and their XP — against the codex tables: the stat and gear math is the one the power board uses, and the move list and move effects are the game's own code, kept identical by a build check. Honest teams are unchanged, number for number; a forged summary changes nothing. Nothing changes for players; an older client keeps working. Defense teams pinned before the deploy are replaced at the next daily fold.
- 2026-10-01 — a disproved result is void, and a week’s reward needs a match that week (D rulings, Rulings board: card apvp, row season). LIVE on release since 2026-10-23 (0.89). Void: since the 08-16 burn-in, a result the server’s check disproved was flagged and still paid as claimed: the attacker took the rating and the honest defender lost it. Every benign cause of a flag has since been fixed, so a flag now means a cheat or a client bug. Such a match is now refused: the ticket stays spent, no rating or win/loss record moves on either side, and the automatic report is still filed (one per reason per day, with the running count and the last match). The match-end note reads VOIDED instead of a victory. Season attendance: the reward used to require one settled match ever, attack or defense, so a top-ten account kept collecting every week after a single fight. A week’s reward now requires an attack you started in that week that closed as a real result (a void does not count); a missed week, including one closed late by the catch-up settle, pays only those who attacked in it.
- 2026-09-30 — the team slice must carry codex art ids, and the result says what the server ruled (project review F6-040, F195). On dev; LIVE on release since 2026-10-01 (0.88).. The save’s team slice (the attacker’s live team and, via the daily fold, the defense snapshot) carried each unit’s art token straight to the opponent’s unit sheet, where it sat inside a CSS
url(...); a forged token injected style onto the other player’s screen. A slice whose tokens are not codex ids (DFMC-nnn, CLS-LINE-n, BOSS-nnn) is now no slice: the queue door answers no_snapshot and the fold snapshots team: null (skipped as a defender) until the next honest save. The match-end note’s title now follows the server’s verdict: an expired match reads DEFEAT (it had read VICTORY with the defense-win sentence tacked on), and a result the finish door refused reads NOT COUNTED instead of VICTORY.
- 2026-09-30 — the finish door owns the starting board and ultimates are once per battle (project review F187, F188). On dev; LIVE on release since 2026-10-01 (0.88).. The re-sim used to take the attacker’s submitted starting board as-is — hit points, knock-outs, statuses and the fight-frozen Attack/Defense anchors were neither checked nor reset — so a claim with the defense at 1 HP, already knocked out, or an attacker at a hundred times his Attack re-simulated as a win and settled clean. Now every fight replays from the server’s own round 0: every unit at full HP, alive, no statuses, no ultimate spent, and an empty slot stays empty. The Attack/Defense anchors are re-derived from the pinned team slice with the client’s own formula and pinned (an attacker creature’s Defense may sit anywhere its own conditional Defense souls allow), and the gear package, seat, side and hero flag must match the slice — any mismatch fails the units pin. Ultimates: the engine now refuses a queued ultimate once that unit has spent it, as the class codex has always said (once per battle); the finish door strips any ultimate row from a creature (only the two heroes carry one, from the class token), and a replay that queues an ultimate on a spent or row-less unit ends there. Both are flagged exactly like a units-pin failure (paid during burn-in, reported) — the burn-in policy is unchanged. Honest play is unchanged: the client already starts every fight this way and only offers an ultimate while it is unspent. Gate:
tools/probe_f187_apvp_round0.mjs 9/21 on the old door, 21/21 after; the F056 probe and the battle-module parity probe stay green.
- 2026-09-29 — the finish door checks cooldowns (project review F056). On dev; LIVE on release since 2026-10-01 (0.88).. The shared battle engine never read a queued move’s cooldown — only the client’s buttons and autoplay brain honoured it — and the finish door replays the rounds the attacker submits, so a doctored claim that fired a cooldown-3 Nuke every round re-simulated as a win and settled. Now the re-sim ignores whatever cooldowns the claim carries, starts every move ready and tracks cooldowns from the engine’s own round tick, and the first round that queues a living attacker onto a move still cooling ends the replay: the match is flagged exactly like a roster that fails the units pin (paid during burn-in, reported). The engine itself now also refuses to fire a cooling ally move anywhere — the unit sits the round out — which changes nothing in honest play, because the client never queues one. The defender’s cooldowns are unchanged by this entry. Gate:
tools/probe_f056_apvp_cd.mjs 4/10 on the old engine, 10/10 after; the battle-module parity probe stays green.
- 2026-09-02 — the defense brain rides the pinned snapshot. LIVE on release since 2026-09-02 (0.66). The finish door re-simulates every match with the defender’s pinned settings and compares the winner to the claim, and the attacking client derives the defense’s moves from the same settings each round. A change to the picker therefore has to be agreed per match, not per deploy, or an honest fight would flag.
settings.brain is that agreement: the daily fold stamps brain: 2 into every new snapshot, the mint hands the snapshot’s settings to the attacker verbatim, and the re-sim reads the same object. A snapshot without the field is brain 1 — matches minted before the change replay exactly as they did. What brain 2 picks is on the Autoplay page.
- 2026-08-25 — you attack with the team you have equipped; the daily snapshot is the defender's (D ruling on report #510). On release. The mint used to pin the attacker's own daily snapshot as his team (“the team I took into battle was not the team I currently had equipped”). Now the client saves on queue, the Worker reads the live team slice from the attacker's own object and hands it to the mint, and the match pins that. The hub says so under QUEUE. Gate: the full-stack probe re-gears after the fold and the fight opens with the new party while the defender stays the fold's slice.
- 2026-08-21 — forfeit works, autoplay arrives in the fight and on the hub (D orders). LIVE on release since 2026-08-21 (0.58). Forfeit: yielding an Auto PVP fight now reports the loss and ends the match like any battle — the server settles a yielded match as a defense win under its own
ff status, with no re-simulation (there is nothing to verify in a claim against the claimant; before, the forfeit either failed with an error on round one or, worse, flagged the honest forfeiter as a sim mismatch, and on the client the confirm dialog closed and nothing else happened because the match-over handler died on the async match shape). Autoplay: the AUTOPLAY button now shows inside an Auto PVP fight and the toggle works there — an attack is local-vs-snapshot and autoplays exactly like PvE; live Competitive and replays remain excluded. The hub: the Auto QUEUE button wears the same gold “available” style as Competitive’s (the grey was a leftover from before the door went live), and directly above it sit the AUTOPLAY toggle and a settings cogwheel opening the autoplay options — the same settings that pilot this account’s defense. The battle screen’s ultimate button also rose clear of the tallest move selector (a measured 35px overlap; the fix is screenshot- and probe-checked). Gates: tools/probe_battleui_apvp.py 6/6 (0/6 against the build it replaces), probe_apvp_e2e.py’s new forfeit section 4/4 on a real minted match.
- 2026-08-16 — page created; the mode built end to end. Tickets, matchmaking, server-verified results, Glicko-2 ratings, the last-won-with ladder column, the defense log, weekly seasons and threshold rewards.