103 lines
5 KiB
Text
103 lines
5 KiB
Text
@page "/guides/{mode}"
|
|
@using CsWeb.Services
|
|
@model CsWeb.Pages.Guides.ModeModel
|
|
@{
|
|
ViewData["Title"] = $"{Fmt.ModeName(Model.Mode)} guide";
|
|
var b = Model.B;
|
|
}
|
|
|
|
<h1>@Fmt.ModeName(Model.Mode)</h1>
|
|
|
|
@if (b is null)
|
|
{
|
|
<div class="notice">Live numbers unavailable right now (servers unreachable) — the prose still applies.</div>
|
|
}
|
|
else if (Model.Balance is { Online: false })
|
|
{
|
|
<div class="notice">Numbers below are from the last reachable server (@Fmt.Age(Model.Balance)).</div>
|
|
}
|
|
|
|
@if (Model.Mode == "tdm")
|
|
{
|
|
<p>
|
|
Team deathmatch against the horde. Everyone respawns; the map ends when one player reaches the kill goal
|
|
@if (b is not null) { <text>(currently <strong>@Fmt.IntOf(b.Match, "KillGoal")</strong> kills)</text> }
|
|
— <em>or</em> 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.
|
|
</p>
|
|
<p>
|
|
This is the mode with full loadout freedom — pick any primary and pistol with <code>!guns</code> 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.
|
|
</p>
|
|
}
|
|
else if (Model.Mode == "gungame")
|
|
{
|
|
<p>
|
|
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. <strong>Bots climb the same ladder</strong> — 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.
|
|
</p>
|
|
<p>
|
|
Kills needed per rung follow the weapon's tier — weak guns take grinding, strong guns breeze — while the
|
|
bots run the <em>inverse</em> curve, so the race stays tight whether you're stuck on a Nova or cruising an
|
|
AK. Weapon selection is off (your rung <em>is</em> 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
|
|
<a href="/leaderboard">leaderboard</a>; the clock survives reconnects, so there's no resetting a bad start.
|
|
</p>
|
|
var ladder = Model.Ladder().ToList();
|
|
@if (ladder.Count > 0)
|
|
{
|
|
<h2>The ladder</h2>
|
|
<div class="tablewrap">
|
|
<table>
|
|
<tr><th class="num">Rung</th><th>Weapon</th><th class="num">Tier</th></tr>
|
|
@foreach (var (r, i) in ladder.Select((r, i) => (r, i)))
|
|
{
|
|
<tr><td class="num">@(i + 1)</td><td>@Fmt.PrettyWeapon(r.Weapon)</td><td class="num">@r.Tier</td></tr>
|
|
}
|
|
</table>
|
|
</div>
|
|
<p class="muted small">Kills needed per rung scale with the weapon's tier — weak guns grind, strong guns breeze. Bots get the inverse curve.</p>
|
|
}
|
|
}
|
|
else
|
|
{
|
|
<p>
|
|
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 <em>mid</em>-wave, and XP banks <em>per cleared wave</em>:
|
|
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.
|
|
</p>
|
|
<p>
|
|
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 <a href="/leaderboard">leaderboard</a>.
|
|
</p>
|
|
var cards = Model.Cards().ToList();
|
|
@if (cards.Count > 0)
|
|
{
|
|
<h2>Card catalog</h2>
|
|
<div class="tablewrap">
|
|
<table>
|
|
<tr><th>Card</th><th class="num">Per pick</th><th class="num">Max picks</th><th>Notes</th></tr>
|
|
@foreach (var c in cards)
|
|
{
|
|
<tr>
|
|
<td>@Fmt.StrOf(c, "Name")</td>
|
|
<td class="num">@Fmt.NumOf(c, "PerPick")@(Fmt.BoolOf(c, "Flat") ? "" : "%")</td>
|
|
<td class="num">@Fmt.IntOf(c, "Cap")</td>
|
|
<td class="muted small">@(Fmt.BoolOf(c, "IsTeam") ? "team-wide, shared level" : Fmt.CardDetail(Fmt.StrOf(c, "Detail"), Fmt.NumOf(c, "PerPick")))</td>
|
|
</tr>
|
|
}
|
|
</table>
|
|
</div>
|
|
}
|
|
}
|
|
|
|
<p><a href="/theory">Theory</a> has the full stat tables and the handicap math behind all of this.</p>
|