Files
tcg-server/matches/matches.tool.js
yaoyanwei 4b2bb35c20 init
2025-08-04 16:25:38 +08:00

71 lines
1.8 KiB
JavaScript

const UserTool = require('../users/users.tool');
const config = require('../config.js');
var MatchTool = {};
MatchTool.calculateELO = (player_elo, opponent_elo, progress, won, lost) =>
{
var p_elo = player_elo || 1000;
var o_elo = opponent_elo || 1000;
var p_elo_log = Math.pow(10.0, p_elo / 400.0);
var o_elo_log = Math.pow(10.0, o_elo / 400.0);
var p_expected = p_elo_log / (p_elo_log + o_elo_log);
var p_score = won ? 1.0 : (lost ? 0.0 : 0.5);
progress = Math.min(Math.max(progress, 0.0), 1.0);
var elo_k = progress * config.elo_k + (1.0 - progress) * config.elo_ini_k;
var new_elo = Math.round(p_elo + elo_k * (p_score - p_expected));
return new_elo;
}
MatchTool.GetPlayerData = (player) =>
{
var data = {};
data.username = player.username;
data.elo = player.elo;
data.reward = {};
return data;
}
MatchTool.GainMatchReward = async(player, opponent, winner_username) => {
var player_elo = player.elo;
var opponent_elo = opponent.elo;
var won = winner_username == player.username;
var lost = winner_username == opponent.username;
//Rewards
var xp = won ? config.xp_victory : config.xp_defeat;
var coins = won ? config.coins_victory : config.coins_defeat;
player.xp += xp;
player.coins += coins;
//Match winrate
player.matches +=1;
if(won)
player.victories += 1;
else if (lost)
player.defeats += 1;
//Calculate elo
var match_count = player.matches || 0;
var match_progress = Math.min(Math.max(match_count / config.elo_ini_match, 0.0), 1.0);
var new_elo = MatchTool.calculateELO(player_elo, opponent_elo, match_progress, won, lost);
player.elo = new_elo;
player.save();
var reward = {
elo: player.elo,
xp: xp,
coins: coins
};
return reward;
};
module.exports = MatchTool;