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;