96 lines
2.8 KiB
JavaScript
96 lines
2.8 KiB
JavaScript
const UserTool = require('../users/users.tool');
|
|
const config = require('../config.js');
|
|
const ladderService = require('../ladder/ladder.service');
|
|
const ladderModel = require('../ladder/ladder.model');
|
|
|
|
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;
|
|
// Add ladder info to player data
|
|
data.rankId = player.rankId;
|
|
data.stars = player.stars;
|
|
data.rankScore = player.rankScore;
|
|
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;
|
|
|
|
// Handle ladder system
|
|
if (won) {
|
|
await ladderService.handleWin(player, opponent);
|
|
} else if (lost) {
|
|
await ladderService.handleLoss(player, opponent);
|
|
}
|
|
|
|
// Save last win deck for leaderboard
|
|
if (won && player.decks && player.decks.length > 0) {
|
|
// For simplicity, we'll use the first deck as the last win deck
|
|
// In a real implementation, this would be the actual deck used in the match
|
|
player.lastWinDeck = player.decks[0];
|
|
}
|
|
|
|
//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;
|
|
|
|
// Save player changes
|
|
await player.save();
|
|
|
|
var reward = {
|
|
elo: player.elo,
|
|
xp: xp,
|
|
coins: coins,
|
|
// Add ladder info to reward
|
|
rankId: player.rankId,
|
|
stars: player.stars,
|
|
rankScore: player.rankScore
|
|
};
|
|
|
|
return reward;
|
|
};
|
|
|
|
module.exports = MatchTool; |