← game tracker

{data.game.shortName}

Level {data.rank?.level ?? '—'}{playerLimits.maxLevel ? ` / ${playerLimits.maxLevel}` : ''} · Prestige {data.rank?.prestige ?? '—'}{data.game.rules.rankCaps ? ` / ${playerLimits.maxPrestige}` : ''}{data.rank?.level === playerLimits.maxLevel && data.rank?.prestige === playerLimits.maxPrestige && data.game.rules.rankCaps ? ' · Prestige Master' : ''}

{weapons.length} weapons · {achievements.length} achievements · {data.challenges.length} challenges & unlocks

{#if !data.user}

sign in to save your progress.

{/if} {#if form?.message}{/if} {#if saveError}{/if}
{#each tabs as name (name)} {#if name === 'weapons'}{/each}
{#if tab === 'weapons'}
{#each rules.classes as name (name)}{/each}
{#each weaponRows as weapon (weapon.id)} {@const current = weaponRanks.get(weapon.id)} {@const limits = weaponRankLimits(rules, weapon)} {@const tiers = summary.mastery.weaponTiers(weapon)} {@const allMilestones = rules.milestones.filter((m) => appliesTo(m, weapon))}

{weapon.name}

{weapon.category}{weapon.postLaunch ? ' · DLC' : ''}

{#if limits.rankable} weaponRanks.set(r.itemId, r)} onedit={() => { rankWeapon = weapon.id; rankOpen = true; }} /> {:else}

No weapon level rank

{/if}
isDone(weapon.id, m.key)).length, total: allMilestones.length }} color="amber" compact /> {#if tiers.length} {tiers.map((t) => t.label).join(' · ')} {/if}
{#if allMilestones.length} Camos & milestones {allMilestones.filter((m) => isDone(weapon.id, m.key)) .length}/{allMilestones.length} {#each allMilestones as milestone (milestone.key)}{/each} {/if}
{:else}

No weapons match these filters.

{/each}

Showing {weaponRows.length} of {weapons.length} weapons · Changes save immediately. Prestige + starts the next prestige at level 1.

{:else if tab === 'achievements'} {#each categories as [category, list] (category)} {@const rows = list.filter((item) => !hideDone || !isDone(item.id, 'done'))}

{category}

{list.filter((item) => isDone(item.id, 'done')).length} of {list.length}

isDone(item.id, 'done')).length, total: list.length }} color="sky" compact />
{/each} {:else}
(challengePage = 1)} /> (challengePage = 1)} >{#each challengeCategories as category (category)}{/each}
{#each challengeRows.slice((challengePage - 1) * 36, challengePage * 36) as challenge (challenge.id)} {@const progress = data.challengeProgress.find((p) => p.challengeId === challenge.id)}
{#if challenge.icon}{/if}

{challenge.category}

{challenge.name}

{challenge.requirement}

{#if challenge.reward}

Unlock: {challenge.reward}

{/if}
{#if challenge.target}{:else}{/if}
Source & requirements ↗
{:else}

{data.challenges.length ? 'No matching challenges.' : 'No multiplayer challenge catalog has been imported for this game yet.'}

{/each}
{challengeRows.length} challenges · {challengePage} / {Math.max( 1, Math.ceil(challengeRows.length / 36) )}

Requirements adapted from Call of Duty Wiki contributors under CC BY-SA. Each card links to its source. This catalog includes confirmed source rows; coverage is not exhaustive.

{/if}
{selectedWeapon?.name ?? 'Player'} level & prestigeRecord your current rank in {data.game.shortName}. Weapon prestige also records that max level has been reached.{#if form?.message}{/if}
{ rankSaving = true; return async ({ result, update }) => { await update(); rankSaving = false; if (result.type === 'success') rankOpen = false; }; }} > {#if rankWeapon}{/if}
Progress overviewMastery, camos and achievements in {data.game.shortName}.
{#each bars as bar (bar.label)} {/each}

Weapon classes

{#each classesProgress as group (group.category)}{/each}
p.done).length} unlocked · partial targets count too`} /> (weaponRanks.get(w.id)?.prestige ?? 0) > 0).length, total: weapons.length }} color="violet" />

{[...rules.milestones, ...rules.tiers] .filter((r) => r.description) .map((r) => `${r.label}: ${r.description}`) .join('. ')}. DLC weapons do not gate class or overall camos.