Player Head-to-Head

Compare two players on maps they've both played.

0} oncompare={onCompare} currentPlayer={playerProfile} /> {#if errorMsg}
{errorMsg}
{/if} {#if items.length > 0}
Shared Maps
{totalComparable}
Wins {idShortA}
{winsA}
Wins {idShortB}
{winsB}
Ties
{ties}
Avg Acc {idShortA}
{avgAccA.toFixed(2)}%
Avg Acc {idShortB}
{avgAccB.toFixed(2)}%
Median {idShortA}
{medAccA.toFixed(2)}%
Median {idShortB}
{medAccB.toFixed(2)}%
Avg Win Margin
{avgMargin.toFixed(2)}%
95th %ile Margin
{p95Margin.toFixed(2)}%
Longest Streak {idShortA}
{longestA}
Longest Streak {idShortB}
{longestB}
Win Share
{idShortA} {(shareA * 100).toFixed(1)}% Ties {(shareT * 100).toFixed(1)}% {idShortB} {(shareB * 100).toFixed(1)}%
{#if totalComparable > 0} {/if} {totalComparable} maps
Win Margin Histogram (A − B, %)
{#each histogram as count, i}
= 0 ? 'rgba(0,255,204,0.8)' : 'rgba(255,0,170,0.8)'};`} >
{/each}
Left (magenta) favors {idShortB}, Right (cyan) favors {idShortA}
Cumulative Wins Over Time
{#if cumSeries.length > 1} {#key cumSeries.length} `${mapX(p.t, 600)},${mapY(p.a, 120)}`).join(' ')} /> `${mapX(p.t, 600)},${mapY(p.b, 120)}`).join(' ')} /> {/key} {/if}
{/if} {#if items.length > 0}
{filtered.length} / {items.length} songs
{#if loadingMeta}
Loading covers…
{/if} {#if loadingStars}
Loading star ratings…
{/if}
{#each pageItems as item}
{idShortA}
{item.accA != null ? item.accA.toFixed(2) + '%' : '—'}
{item.rankA ? `Rank #${item.rankA}` : ''}
{idShortB}
{item.accB != null ? item.accB.toFixed(2) + '%' : '—'}
{item.rankB ? `Rank #${item.rankB}` : ''}
{#if item.accA != null && item.accB != null} {#if item.accA === item.accB} TIE?! {:else if item.accA > item.accB} Winner: {idShortA} by {(item.accA - item.accB).toFixed(2)}% {:else} Winner: {idShortB} by {(item.accB - item.accA).toFixed(2)}% {/if} {:else} Incomplete {/if}
{/each}
{#if totalPages > 1}
Page {page} / {totalPages}
{/if} {/if}