@page "/guides/{mode}" @using CsWeb.Services @model CsWeb.Pages.Guides.ModeModel @{ ViewData["Title"] = $"{Fmt.ModeName(Model.Mode)} guide"; var b = Model.B; }

@Fmt.ModeName(Model.Mode)

@if (b is null) {
Live numbers unavailable right now (servers unreachable) — the prose still applies.
} else if (Model.Balance is { Online: false }) {
Numbers below are from the last reachable server (@Fmt.Age(Model.Balance)).
} @if (Model.Mode == "tdm") {

Team deathmatch against the horde. Everyone respawns; the map ends when one player reaches the kill goal @if (b is not null) { (currently @Fmt.IntOf(b.Match, "KillGoal") kills) } — or when the bots do. Bot kills pool per squad-sized batch toward the same goal, so an ignored horde genuinely wins the map: the pace scales with player count, and a lone player races exactly one batch.

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.

} else if (Model.Mode == "gungame") {

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) {

The ladder

@foreach (var (r, i) in ladder.Select((r, i) => (r, i))) { }
RungWeaponTier
@(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 catalog

@foreach (var c in cards) { }
CardPer pickMax picksNotes
@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.