stats reorg, upcoming refinement
This commit is contained in:
@@ -43,37 +43,29 @@ const PlayerStatsTable = ({ playerStats }: PlayerStatsTableProps) => {
|
||||
direction: "desc",
|
||||
});
|
||||
|
||||
// Calculate MMR (Match Making Rating) based on multiple factors
|
||||
const calculateMMR = (stat: PlayerStats): number => {
|
||||
if (stat.matches === 0) return 0;
|
||||
|
||||
// Base score from win percentage (0-100)
|
||||
const winScore = stat.win_percentage;
|
||||
|
||||
// Match confidence factor (more matches = more reliable)
|
||||
// Cap at 20 matches for full confidence
|
||||
const matchConfidence = Math.min(stat.matches / 20, 1);
|
||||
const matchConfidence = Math.min(stat.matches / 15, 1);
|
||||
|
||||
// Performance metrics
|
||||
const avgCupsScore = Math.min(stat.avg_cups_per_match * 10, 100); // Cap at 10 avg cups
|
||||
const avgCupsScore = Math.min(stat.avg_cups_per_match * 10, 100);
|
||||
const marginScore = stat.margin_of_victory
|
||||
? Math.min(stat.margin_of_victory * 20, 50)
|
||||
: 0; // Cap at 2.5 margin
|
||||
: 0;
|
||||
|
||||
// Volume bonus for active players (small bonus for playing more)
|
||||
const volumeBonus = Math.min(stat.matches * 0.5, 10); // Max 10 point bonus
|
||||
const volumeBonus = Math.min(stat.matches * 0.5, 10);
|
||||
|
||||
// Weighted calculation
|
||||
const baseMMR =
|
||||
winScore * 0.5 + // Win % is 50% of score
|
||||
avgCupsScore * 0.25 + // Avg cups is 25% of score
|
||||
marginScore * 0.15 + // Win margin is 15% of score
|
||||
volumeBonus * 0.1; // Volume bonus is 10% of score
|
||||
winScore * 0.5 +
|
||||
avgCupsScore * 0.25 +
|
||||
marginScore * 0.15 +
|
||||
volumeBonus * 0.1;
|
||||
|
||||
// Apply confidence factor (players with few matches get penalized)
|
||||
const finalMMR = baseMMR * matchConfidence;
|
||||
|
||||
return Math.round(finalMMR * 10) / 10; // Round to 1 decimal
|
||||
return Math.round(finalMMR * 10) / 10;
|
||||
};
|
||||
|
||||
const handleSort = (key: SortKey) => {
|
||||
@@ -101,7 +93,6 @@ const PlayerStatsTable = ({ playerStats }: PlayerStatsTableProps) => {
|
||||
let aValue: number | string;
|
||||
let bValue: number | string;
|
||||
|
||||
// Special handling for MMR
|
||||
if (sortConfig.key === "mmr") {
|
||||
aValue = calculateMMR(a);
|
||||
bValue = calculateMMR(b);
|
||||
@@ -315,7 +306,7 @@ const PlayerStatsTable = ({ playerStats }: PlayerStatsTableProps) => {
|
||||
</Text>
|
||||
<Text size="xs" mt="xs" c="dimmed">
|
||||
* Confidence penalty applied for players
|
||||
with <20 matches
|
||||
with <15 matches
|
||||
</Text>
|
||||
<Text size="xs" mt="xs" c="dimmed">
|
||||
** Not an official rating
|
||||
|
||||
Reference in New Issue
Block a user