@page "/guides/{mode}" @using CsWeb.Services @model CsWeb.Pages.Guides.ModeModel @{ ViewData["Title"] = $"{Fmt.ModeName(Model.Mode)} guide"; var b = Model.B; }
Team deathmatch against the horde. Everyone respawns; the map ends when one player reaches the kill goal
@if (b is not null) {
This is the mode with full loadout freedom — pick any primary and pistol with !guns or the
quick-buy shop, and swap mid-match whenever. It's also the purest read on your build: no ladder, no waves,
just you, the handicap, and a horde that shoots back harder the better you play. Brief spawn protection
keeps respawns from being feeding; it breaks the moment you attack.
Classic arms race with the RPG core riding along: advance a rung by getting kills with the current gun; the ladder ends in a knife finale. Bots climb the same ladder — a bot topping it ends the map, so you're racing them, not just each other. A headshot death demotes the victim one kill of progress — and that cuts both ways: headshotting the bot pack slows their climb, catching a headshot costs you yours.
Kills needed per rung follow the weapon's tier — weak guns take grinding, strong guns breeze — while the bots run the inverse curve, so the race stays tight whether you're stuck on a Nova or cruising an AK. Weapon selection is off (your rung is your gun), which makes Gun Game the skills-only mode: the shop sells stat levels, nothing else. Your run time (first damage → final knife) goes on the leaderboard; the clock survives reconnects, so there's no resetting a bad start.
var ladder = Model.Ladder().ToList(); @if (ladder.Count > 0) {| Rung | Weapon | Tier |
|---|---|---|
| @(i + 1) | @Fmt.PrettyWeapon(r.Weapon) | @r.Tier |
Kills needed per rung scale with the weapon's tier — weak guns grind, strong guns breeze. Bots get the inverse curve.
} } else {Co-op waves@(b is not null ? $" (up to {Fmt.IntOf(b.Survival, "WaveCount")})" : "") of escalating difficulty. Each wave has a kill budget; clear it and you get a breather — the fallen are revived, XP banks, and the squad drafts cards. Nobody respawns mid-wave, and XP banks per cleared wave: wipe halfway through and that wave's earnings are forfeit. Going down isn't the end (your squad can finish the wave and pick you back up), but a full wipe ends the run.
Cards are run-scoped upgrades stacking on top of your permanent build — strong on purpose, because the difficulty ramp is relentless: the handicap's escalation floor climbs wave over wave until the bots hit you at full force, and only a drafted-up squad outpaces it. The two team cards share one squad-wide level — anyone's pick raises everyone's multiplier — so coordinating drafts beats hoarding. Your deepest cleared wave goes on the leaderboard.
var cards = Model.Cards().ToList(); @if (cards.Count > 0) {| Card | Per pick | Max picks | Notes |
|---|---|---|---|
| @Fmt.StrOf(c, "Name") | @Fmt.NumOf(c, "PerPick")@(Fmt.BoolOf(c, "Flat") ? "" : "%") | @Fmt.IntOf(c, "Cap") | @(Fmt.BoolOf(c, "IsTeam") ? "team-wide, shared level" : Fmt.CardDetail(Fmt.StrOf(c, "Detail"), Fmt.NumOf(c, "PerPick"))) |
Theory has the full stat tables and the handicap math behind all of this.