55 lines
1.9 KiB
JavaScript
55 lines
1.9 KiB
JavaScript
|
// events.js
|
||
|
const events = require('events');
|
||
|
const { calculateElo } = require('./elo');
|
||
|
const { updatePlayerElo } = require('./database');
|
||
|
|
||
|
class GameEventEmitter extends events.EventEmitter {}
|
||
|
|
||
|
const gameEventEmitter = new GameEventEmitter();
|
||
|
|
||
|
function handleRoundEnd(redScore, blueScore, playerScores, currentPlayers) {
|
||
|
console.log(`Round ended. Red: ${redScore}, Blue: ${blueScore}`);
|
||
|
|
||
|
let winningTeam, losingTeam;
|
||
|
|
||
|
if (redScore > blueScore) {
|
||
|
winningTeam = 'red';
|
||
|
losingTeam = 'blue';
|
||
|
} else if (blueScore > redScore) {
|
||
|
winningTeam = 'blue';
|
||
|
losingTeam = 'red';
|
||
|
} else {
|
||
|
console.log("It's a draw. No Elo change.");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const kFactor = 32; // You can adjust this as needed
|
||
|
|
||
|
const winningPlayers = currentPlayers.filter(player => player.team === winningTeam);
|
||
|
const losingPlayers = currentPlayers.filter(player => player.team === losingTeam);
|
||
|
|
||
|
const averageWinningElo = winningPlayers.reduce((acc, player) => acc + player.elo, 0) / winningPlayers.length;
|
||
|
const averageLosingElo = losingPlayers.reduce((acc, player) => acc + player.elo, 0) / losingPlayers.length;
|
||
|
|
||
|
winningPlayers.forEach(async (player) => {
|
||
|
const individualPerformanceFactor = playerScores[player.id] / redScore; // Adjust based on individual contribution
|
||
|
player.elo = calculateElo(player.elo, averageLosingElo, 1 * individualPerformanceFactor, kFactor);
|
||
|
await updatePlayerElo(player);
|
||
|
});
|
||
|
|
||
|
losingPlayers.forEach(async (player) => {
|
||
|
const individualPerformanceFactor = playerScores[player.id] / blueScore; // Adjust based on individual contribution
|
||
|
player.elo = calculateElo(player.elo, averageWinningElo, 0 * individualPerformanceFactor, kFactor);
|
||
|
await updatePlayerElo(player);
|
||
|
});
|
||
|
|
||
|
console.log("Elo ratings updated.");
|
||
|
}
|
||
|
|
||
|
gameEventEmitter.on('RoundEnd', handleRoundEnd);
|
||
|
|
||
|
module.exports = {
|
||
|
gameEventEmitter,
|
||
|
handleRoundEnd,
|
||
|
};
|