Add Prettier and ESLint tooling (Refs #77)
This commit is contained in:
@@ -5,20 +5,40 @@ export const EFFICIENCY_MIN_KILLS = 100;
|
||||
export const EFFICIENCY_MIN_DOWNS = 5;
|
||||
|
||||
export const efficiencyMetrics = [
|
||||
{ key: 'headshotRate', label: 'Headshots / kills', format: 'percent',
|
||||
description: `Total headshots divided by total kills in ended games. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games and ${EFFICIENCY_MIN_KILLS} kills.` },
|
||||
{ key: 'killsPerDown', label: 'Kills per down', format: 'number',
|
||||
description: `Total kills divided by total downs in ended games. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games and ${EFFICIENCY_MIN_DOWNS} downs.` },
|
||||
{ key: 'averageKills', label: 'Average kills', format: 'number',
|
||||
description: `Total kills divided by games played, including games the player left before they ended. Ranking requires at least ${EFFICIENCY_MIN_GAMES} ended games.` },
|
||||
{ key: 'averageRounds', label: 'Average rounds', format: 'number',
|
||||
description: `Total observed rounds divided by games played, including games the player left before they ended. Ranking requires at least ${EFFICIENCY_MIN_GAMES} ended games.` },
|
||||
{ key: 'completionRate', label: 'Completion rate', format: 'percent',
|
||||
description: `Games with the player in the final report divided by games played. Only ended games count, including games the player left early. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games.` }
|
||||
{
|
||||
key: 'headshotRate',
|
||||
label: 'Headshots / kills',
|
||||
format: 'percent',
|
||||
description: `Total headshots divided by total kills in ended games. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games and ${EFFICIENCY_MIN_KILLS} kills.`
|
||||
},
|
||||
{
|
||||
key: 'killsPerDown',
|
||||
label: 'Kills per down',
|
||||
format: 'number',
|
||||
description: `Total kills divided by total downs in ended games. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games and ${EFFICIENCY_MIN_DOWNS} downs.`
|
||||
},
|
||||
{
|
||||
key: 'averageKills',
|
||||
label: 'Average kills',
|
||||
format: 'number',
|
||||
description: `Total kills divided by games played, including games the player left before they ended. Ranking requires at least ${EFFICIENCY_MIN_GAMES} ended games.`
|
||||
},
|
||||
{
|
||||
key: 'averageRounds',
|
||||
label: 'Average rounds',
|
||||
format: 'number',
|
||||
description: `Total observed rounds divided by games played, including games the player left before they ended. Ranking requires at least ${EFFICIENCY_MIN_GAMES} ended games.`
|
||||
},
|
||||
{
|
||||
key: 'completionRate',
|
||||
label: 'Completion rate',
|
||||
format: 'percent',
|
||||
description: `Games with the player in the final report divided by games played. Only ended games count, including games the player left early. Ranking requires at least ${EFFICIENCY_MIN_GAMES} games.`
|
||||
}
|
||||
] as const;
|
||||
|
||||
export type EfficiencyMetric = typeof efficiencyMetrics[number]['key'];
|
||||
const metrics = new Set<string>(efficiencyMetrics.map(metric => metric.key));
|
||||
export type EfficiencyMetric = (typeof efficiencyMetrics)[number]['key'];
|
||||
const metrics = new Set<string>(efficiencyMetrics.map((metric) => metric.key));
|
||||
|
||||
export function isEfficiencyMetric(metric: string): metric is EfficiencyMetric {
|
||||
return metrics.has(metric);
|
||||
@@ -26,11 +46,16 @@ export function isEfficiencyMetric(metric: string): metric is EfficiencyMetric {
|
||||
|
||||
function sample(stats: PlayerStats, metric: EfficiencyMetric): [number, number] {
|
||||
switch (metric) {
|
||||
case 'headshotRate': return [stats.headshots, stats.kills];
|
||||
case 'killsPerDown': return [stats.kills, stats.downs];
|
||||
case 'averageKills': return [stats.kills, stats.gamesPlayed];
|
||||
case 'averageRounds': return [stats.roundsSurvived, stats.gamesPlayed];
|
||||
case 'completionRate': return [stats.gamesCompleted, stats.gamesPlayed];
|
||||
case 'headshotRate':
|
||||
return [stats.headshots, stats.kills];
|
||||
case 'killsPerDown':
|
||||
return [stats.kills, stats.downs];
|
||||
case 'averageKills':
|
||||
return [stats.kills, stats.gamesPlayed];
|
||||
case 'averageRounds':
|
||||
return [stats.roundsSurvived, stats.gamesPlayed];
|
||||
case 'completionRate':
|
||||
return [stats.gamesCompleted, stats.gamesPlayed];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,11 +85,16 @@ const count = (value: number, singular: string, plural = `${singular}s`) =>
|
||||
|
||||
export function efficiencySample(stats: PlayerStats, metric: EfficiencyMetric): string {
|
||||
switch (metric) {
|
||||
case 'headshotRate': return `${count(stats.headshots, 'headshot')} / ${count(stats.kills, 'kill')}`;
|
||||
case 'killsPerDown': return `${count(stats.kills, 'kill')} / ${count(stats.downs, 'down')}`;
|
||||
case 'averageKills': return `${count(stats.kills, 'kill')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
case 'averageRounds': return `${count(stats.roundsSurvived, 'observed round')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
case 'completionRate': return `${count(stats.gamesCompleted, 'finish', 'finishes')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
case 'headshotRate':
|
||||
return `${count(stats.headshots, 'headshot')} / ${count(stats.kills, 'kill')}`;
|
||||
case 'killsPerDown':
|
||||
return `${count(stats.kills, 'kill')} / ${count(stats.downs, 'down')}`;
|
||||
case 'averageKills':
|
||||
return `${count(stats.kills, 'kill')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
case 'averageRounds':
|
||||
return `${count(stats.roundsSurvived, 'observed round')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
case 'completionRate':
|
||||
return `${count(stats.gamesCompleted, 'finish', 'finishes')} / ${count(stats.gamesPlayed, 'ended game')}`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user