['min_matches' => 25, 'display_name' => 'All Matches (min 25)'], // Skipping 'all' as per original logic
'clan_casual' => ['min_matches' => 18, 'display_name' => 'Clan Casual (min 18 matches, min 2 clan players)'],
'Intense' => ['min_matches' => 18, 'display_name' => 'Intense BR (min 18 matches)'],
'Casual' => ['min_matches' => 18, 'display_name' => 'Casual (min 18 matches)'],
'official' => ['min_matches' => 18, 'display_name' => 'Official (min 18 matches)'],
'custom' => ['min_matches' => 8, 'display_name' => 'Custom (min 8 matches)'],
'Ranked' => ['min_matches' => 8, 'display_name' => 'Ranked (min 8 matches)'],
];
// Load clan members to identify alts
$clanMembersPath = './config/clanmembers.json';
if (file_exists($clanMembersPath)) {
$clanmembersJson = file_get_contents($clanMembersPath);
$clanmembersData = json_decode($clanmembersJson, true);
if (isset($clanmembersData['alts']) && is_array($clanmembersData['alts'])) {
$alts = $clanmembersData['alts'];
} else {
$dataError .= " Error reading or invalid format for 'alts' in clan members file.";
}
} else {
$dataError .= " Clan members file not found.";
}
// Load player stats data
$statsPath = './data/player_last_stats.json';
if (file_exists($statsPath)) {
$statsJson = file_get_contents($statsPath);
$playersStatsData = json_decode($statsJson, true);
if (!is_array($playersStatsData)) {
$dataError .= " Error decoding player last stats data.";
$playersStatsData = null;
} else {
$lastUpdated = htmlspecialchars($playersStatsData['updated'] ?? 'N/A');
// Process stats for each defined category
foreach ($categories as $key => $categoryInfo) {
if (isset($playersStatsData[$key]) && is_array($playersStatsData[$key])) {
$categoryStats = [];
foreach ($playersStatsData[$key] as $player_data) {
// Basic validation and alt check
if (!isset($player_data['playername']) || is_null($player_data['playername']) || in_array($player_data['playername'], $alts)) {
continue;
}
// Minimum matches check
$matchesPlayed = $player_data['matches'] ?? 0;
if ($matchesPlayed < $categoryInfo['min_matches']) {
continue;
}
// Format stats for display
$formatted_player_data = [];
$formatted_player_data['playername'] = htmlspecialchars($player_data['playername']);
$formatted_player_data['deaths'] = number_format($player_data['deaths'] ?? 0, 0, ',', '');
$formatted_player_data['kills'] = number_format($player_data['kills'] ?? 0, 0, ',', '');
$formatted_player_data['humankills'] = number_format($player_data['humankills'] ?? 0, 0, ',', '');
$formatted_player_data['matches'] = htmlspecialchars($matchesPlayed);
$formatted_player_data['wins'] = number_format($player_data['wins'] ?? 0, 0, ',', '');
$formatted_player_data['winratio'] = number_format($player_data['winratio'] ?? 0, 2, ',', '');
$formatted_player_data['ahd'] = number_format($player_data['ahd'] ?? 0, 2, ',', '');
// Format K/D (handle null, Infinity, non-numeric)
$kd_h_raw = $player_data['KD_H'] ?? null;
$formatted_player_data['KD_H'] = ($kd_h_raw === null) ? "N/A" : (($kd_h_raw == "Infinity") ? "∞" : (is_numeric($kd_h_raw) ? number_format((float)$kd_h_raw, 2, ',', '') : "0"));
$kd_all_raw = $player_data['KD_ALL'] ?? null;
$formatted_player_data['KD_ALL'] = ($kd_all_raw === null) ? "N/A" : (($kd_all_raw == "Infinity") ? "∞" : (is_numeric($kd_all_raw) ? number_format((float)$kd_all_raw, 2, ',', '') : "0"));
// Format change indicator
$originalChange = isset($player_data['change']) ? str_replace(',', '.', $player_data['change']) : '0';
$changeValue = floatval($originalChange);
$formatted_player_data['change_value'] = number_format($changeValue, 2, ',', ''); // Display formatted number
if ($changeValue < 0) {
$formatted_player_data['change_image'] = 'images/red.png';
$formatted_player_data['change_alt'] = 'Decrease';
} elseif ($changeValue > 0) {
$formatted_player_data['change_image'] = 'images/green.png';
$formatted_player_data['change_alt'] = 'Increase';
} else {
$formatted_player_data['change_image'] = 'images/equal.png';
$formatted_player_data['change_alt'] = 'No change';
}
$categoryStats[] = $formatted_player_data;
}
$processedStats[$key] = $categoryStats;
}
}
}
} else {
$dataError .= " Player last stats data file not found.";
}
?>
Player Stats Past Quarter
$categoryInfo): ?>
No players met the criteria for this category.
| Player |
Win % |
AHD |
K/D Human |
Human Kills |
K/D All |
Kills |
Matches |
Wins |
Deaths |
Win % Change |
|
|
|
|
|
|
|
|
|
|
|
Last update: