Trophymanager: show average skill & value of first team (11 players) in last match. So you can estimate the power between teams in the league. R5 include routine sharing between positions in match.
// ==UserScript== // @name TMVN League Lineup // @namespace https://trophymanager.com // @version 6 // @description Trophymanager: show average skill & value of first team (11 players) in last match. So you can estimate the power between teams in the league. R5 include routine sharing between positions in match. // @match https://trophymanager.com/league/* // @grant none // ==/UserScript== (function () { 'use strict'; const APPLICATION_PARAM = { DEFAULT_SHOW_MODE: "10", LOCAL_STORAGE_KEY: "TMVN_LEAGUE_LINEUP_SHOW_MODE", SHOW_MODE_ARR: ["11", "10", "01"] } const APP_COLOR = { LEVEL_1: "Darkred", LEVEL_2: "Black", LEVEL_3: "Orange", LEVEL_4: "Yellow", LEVEL_5: "Blue", LEVEL_6: "Aqua", LEVEL_7: "White" }; const BP_CLASS = { LEVEL_1: 150000000, LEVEL_2: 100000000, LEVEL_3: 80000000, LEVEL_4: 60000000, LEVEL_5: 40000000, LEVEL_6: 20000000, LEVEL_7: 0 }; const WA_CLASS = { LEVEL_1: 6000000, LEVEL_2: 5000000, LEVEL_3: 4000000, LEVEL_4: 3000000, LEVEL_5: 2000000, LEVEL_6: 1000000, LEVEL_7: 0 }; const XP_CLASS = { LEVEL_1: 90, LEVEL_2: 75, LEVEL_3: 60, LEVEL_4: 45, LEVEL_5: 30, LEVEL_6: 15, LEVEL_7: 0 }; const REC_CLASS = { LEVEL_1: 5.5, LEVEL_2: 5, LEVEL_3: 4, LEVEL_4: 3, LEVEL_5: 2, LEVEL_6: 1, LEVEL_7: 0 }; const R5_CLASS = { LEVEL_1: 110, LEVEL_2: 100, LEVEL_3: 90, LEVEL_4: 80, LEVEL_5: 70, LEVEL_6: 60, LEVEL_7: 0 }; const share_bonus = 0.25; const routine_cap = 40.0; try { $('.banner_placeholder.rectangle')[0].parentNode.removeChild($('.banner_placeholder.rectangle')[0]); } catch (err) {} var matchIds = []; $('#last_round_table td').each(function () { let hrefVal = $(this).children('a').attr('href'); if (hrefVal) { let matchID = hrefVal.substr(hrefVal.lastIndexOf('matches/') + 8, hrefVal.length - 10); matchIds.push(matchID); } }); var positionMap = new Map(); var routineMap = new Map(); var clubDatas = new Map(); matchIds.forEach(function (matchId) { let xhr = new XMLHttpRequest(); let url = 'https://trophymanager.com/ajax/match.ajax.php?id=' + matchId; xhr.open('GET', url, true); xhr.send(); xhr.onreadystatechange = function () { try { if (this.readyState == 4 && this.status == 200) { let data = JSON.parse(this.responseText); let homeClubId = data.club.home.id; let awayClubId = data.club.away.id; let homeLineup = data.lineup.home; let awayLineup = data.lineup.away; let homePlayerIds = Object.getOwnPropertyNames(homeLineup); let awayPlayerIds = Object.getOwnPropertyNames(awayLineup); let homeD = []; let homeM = []; let homeF = []; let awayD = []; let awayM = []; let awayF = []; homePlayerIds.forEach((playerId, index) => { let position = homeLineup[playerId].position; if (position.indexOf("sub") > -1) return; positionMap.set(playerId, position); routineMap.set(playerId, Number(homeLineup[playerId].routine)); if (position == "gk" || position == "dl" || position == "dr" || position == "dc" || position == "dcl" || position == "dcr") { homeD.push({ "ID": playerId, "ROLE": position, "ROU": Number(homeLineup[playerId].routine) }); } else if (position == "dml" || position == "dmr" || position == "dmc" || position == "dmcl" || position == "dmcr" || position == "ml" || position == "mr" || position == "mc" || position == "mcl" || position == "mcr") { homeM.push({ "ID": playerId, "ROLE": position, "ROU": Number(homeLineup[playerId].routine) }); } else { homeF.push({ "ID": playerId, "ROLE": position, "ROU": Number(homeLineup[playerId].routine) }); } }); awayPlayerIds.forEach((playerId, index) => { let position = awayLineup[playerId].position; if (position.indexOf("sub") > -1) return; positionMap.set(playerId, position); routineMap.set(playerId, Number(awayLineup[playerId].routine)); if (position == "gk" || position == "dl" || position == "dr" || position == "dc" || position == "dcl" || position == "dcr") { awayD.push({ "ID": playerId, "ROLE": position, "ROU": Number(awayLineup[playerId].routine) }); } else if (position == "dml" || position == "dmr" || position == "dmc" || position == "dmcl" || position == "dmcr" || position == "ml" || position == "mr" || position == "mc" || position == "mcl" || position == "mcr") { awayM.push({ "ID": playerId, "ROLE": position, "ROU": Number(awayLineup[playerId].routine) }); } else { awayF.push({ "ID": playerId, "ROLE": position, "ROU": Number(awayLineup[playerId].routine) }); } }); let line_size; line_size = homeD.length; if (line_size > 1) { homeD.sort(compareByRoutineAsc); var min = homeD[0].ROU; if (min < routine_cap) { var max = homeD[line_size - 1].ROU; var min2 = homeD[1].ROU; var bonus = max * share_bonus; var new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(homeD[0].ID, new_routine); } } line_size = homeM.length; if (line_size > 1) { homeM.sort(compareByRoutineAsc); min = homeM[0].ROU; if (min < routine_cap) { max = homeM[line_size - 1].ROU; min2 = homeM[1].ROU; bonus = max * share_bonus; new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(homeM[0].ID, new_routine); } } line_size = homeF.length; if (line_size > 1) { homeF.sort(compareByRoutineAsc); min = homeF[0].ROU; if (min < routine_cap) { max = homeF[line_size - 1].ROU; min2 = homeF[1].ROU; bonus = max * share_bonus; new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(homeF[0].ID, new_routine); } } line_size = awayD.length; if (line_size > 1) { awayD.sort(compareByRoutineAsc); min = awayD[0].ROU; if (min < routine_cap) { max = awayD[line_size - 1].ROU; min2 = awayD[1].ROU; bonus = max * share_bonus; new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(awayD[0].ID, new_routine); } } line_size = awayM.length; if (line_size > 1) { awayM.sort(compareByRoutineAsc); min = awayM[0].ROU; if (min < routine_cap) { max = awayM[line_size - 1].ROU; min2 = awayM[1].ROU; bonus = max * share_bonus; new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(awayM[0].ID, new_routine); } } line_size = awayF.length; if (line_size > 1) { awayF.sort(compareByRoutineAsc); min = awayF[0].ROU; if (min < routine_cap) { max = awayF[line_size - 1].ROU; min2 = awayF[1].ROU; bonus = max * share_bonus; new_routine = min + bonus; new_routine = (new_routine < min2 ? new_routine : min2); new_routine = (new_routine < routine_cap ? new_routine : routine_cap); new_routine = parseFloat(new_routine.toFixed(1)); routineMap.set(awayF[0].ID, new_routine); } } statistic(homePlayerIds, homeLineup).then((clubStatistic) => { clubDatas.set(homeClubId, { "XP": clubStatistic.XP, "Age": clubStatistic.Age, "ASI": clubStatistic.ASI, "Wage": clubStatistic.Wage, "BP": clubStatistic.BP, "REC": clubStatistic.REC, "R5": clubStatistic.R5 }); }).catch((error) => {}); statistic(awayPlayerIds, awayLineup).then((clubStatistic) => { clubDatas.set(awayClubId, { "XP": clubStatistic.XP, "Age": clubStatistic.Age, "ASI": clubStatistic.ASI, "Wage": clubStatistic.Wage, "BP": clubStatistic.BP, "REC": clubStatistic.REC, "R5": clubStatistic.R5 }); }).catch((error) => {}); } } catch (e) { //exception with forfeit match clubDatas.set(Math.floor(Math.random() * 1000), { "XP": 0, "Age": 0, "ASI": 0, "Wage": 0, "BP": 0, "REC": 0, "R5": 0 }); clubDatas.set(Math.floor(Math.random() * 1000), { "XP": 0, "Age": 0, "ASI": 0, "Wage": 0, "BP": 0, "REC": 0, "R5": 0 }); } }; }); var clubMap = new Map(); var myInterval = setInterval(append, 1000); function getPlayerData(playerId) { return new Promise((resolve, reject) => { $.post("/ajax/tooltip.ajax.php", { "player_id": playerId }).done((responseText) => { var data = JSON.parse(responseText); if (routineMap.has(playerId)) { data.player.routine = routineMap.get(playerId).toString(); } if (positionMap.has(playerId)) { data.player.favposition = positionMap.get(playerId); } var rrValue = calculateRR(data.player); var rec; if (rrValue[0].length == 2) { rec = Number(rrValue[0][0]) >= Number(rrValue[0][1]) ? Number(rrValue[0][0]) : Number(rrValue[0][1]); } else { rec = Number(rrValue[0][0]); } var r5; if (rrValue[1].length == 2) { r5 = Number(rrValue[1][0]) >= Number(rrValue[1][1]) ? Number(rrValue[1][0]) : Number(rrValue[1][1]); } else { r5 = Number(rrValue[1][0]); } resolve({ XP: Number(data.player.routine.split(',').join('')), Age: Number(data.player.age) * 12 + Number(data.player.months), ASI: Number(data.player.skill_index.split(',').join('')), Wage: Number(data.player.wage.replace("<span class='coin'>", "").replace("<\/span>", "").split(',').join('')), BP: BP.compute(Number(data.player.skill_index.split(',').join('')), Number(data.player.age), Number(data.player.months), data.player.fp), REC: rec, R5: r5 }); }).fail((error) => { reject(error); }); }); } let BP = { compute: function (asi, age, month, position) { let pow = Math.pow; if (position === "GK") { return Math.round((asi * 500 * pow((300 / (age * 12 + month)), 2.5)) * 0.75); } else { return Math.round(asi * 500 * pow((300 / (age * 12 + month)), 2.5)); } } }; function statistic(playerIds, lineup) { return new Promise((resolve, reject) => { let clubStatistic = { XP: 0, Age: 0, ASI: 0, Wage: 0, BP: 0, REC: 0, R5: 0 }; let countLoop = 0; let countAjaxCall = 0; let countAjaxAnswer = 0; playerIds.forEach((playerId, index) => { if (lineup[playerId].position.indexOf("sub") < 0) { countAjaxCall++; countLoop++; //guarantee plus ajaxcall before getPlayerData(playerId).then((player) => { clubStatistic.XP += player.XP; clubStatistic.Age += player.Age; clubStatistic.ASI += player.ASI; clubStatistic.Wage += player.Wage; clubStatistic.BP += player.BP; clubStatistic.REC += player.REC; clubStatistic.R5 += player.R5; countAjaxAnswer++; }).catch((error) => {}); } else { countLoop++ } }); function check() { if (!(countLoop == playerIds.length && countAjaxCall == countAjaxAnswer)) { setTimeout(check, 100); } else { resolve(clubStatistic); }; } check(); }); } function append() { if (clubDatas.size < 18) { return; } clearInterval(myInterval); $('#overall_table td').each(function () { let clubId = $(this).children('a').attr('club_link'); if (clubId) { let clubName = $(this).children('a')[0].innerHTML; clubMap.set(clubId, clubName); } }); let firstSquadSkill = "<div class=\"box\">" + "<div class=\"box_head\">" + "<h2 class=\"std\">START LINEUP</h2>" + "</div>" + "<div class=\"box_body\">" + "<div class=\"box_shadow\"></div>" + "<span style='display: inline-block;'><input id='tm_script_league_lineup_input_show_mode' type='text' class='embossed' style='min-width: 100px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Show Mode'></span>" + "<span id='tm_script_league_lineup_button_show_mode_set' class='button' style='margin-left: 3px;'><span class='button_border'>Set show mode</span></span>" + "<h3>SKILL</h3>" + "<div id=\"firstSquadSkill_content\" class=\"content_menu\"></div>" + "<h3>VALUE</h3>" + "<div id=\"firstSquadValue_content\" class=\"content_menu\"></div>" + "</div>" + "<div class=\"box_footer\">" + "<div></div>" + "</div>" + "</div>"; $(".column3_a").append(firstSquadSkill); document.getElementById('tm_script_league_lineup_button_show_mode_set').addEventListener('click', (e) => { setShowMode(); }); let showMode = localStorage.getItem(APPLICATION_PARAM.LOCAL_STORAGE_KEY); if (showMode == null || showMode == "") { showMode = APPLICATION_PARAM.DEFAULT_SHOW_MODE; } $('#tm_script_league_lineup_input_show_mode').val(showMode); let invidualMode = showMode.split(""); if (invidualMode[0] == "1") { showSkill(); } if (invidualMode[1] == "1") { showValue(); } } function showSkill() { let firstSquadSkill_content = "<table>" + "<tr><th>Club</th><th align='right'>REC</th><th align='right'>XP</th><th align='right'>R5</th></tr>"; let rowCount = 0; clubMap.forEach((value, key) => { rowCount++; let classOdd = ""; if ((rowCount % 2) == 1) { classOdd = "class='odd'"; } if (clubDatas.has(key)) { let clubData = clubDatas.get(key); let recColor, xpColor, r5Color; if (clubData.REC / 11 >= REC_CLASS.LEVEL_1) { recColor = APP_COLOR.LEVEL_1; } else if (clubData.REC / 11 >= REC_CLASS.LEVEL_2) { recColor = APP_COLOR.LEVEL_2; } else if (clubData.REC / 11 >= REC_CLASS.LEVEL_3) { recColor = APP_COLOR.LEVEL_3; } else if (clubData.REC / 11 >= REC_CLASS.LEVEL_4) { recColor = APP_COLOR.LEVEL_4; } else if (clubData.REC / 11 >= REC_CLASS.LEVEL_5) { recColor = APP_COLOR.LEVEL_5; } else if (clubData.REC / 11 >= REC_CLASS.LEVEL_6) { recColor = APP_COLOR.LEVEL_6; } else { recColor = APP_COLOR.LEVEL_7; } if (clubData.XP / 11 >= XP_CLASS.LEVEL_1) { xpColor = APP_COLOR.LEVEL_1; } else if (clubData.XP / 11 >= XP_CLASS.LEVEL_2) { xpColor = APP_COLOR.LEVEL_2; } else if (clubData.XP / 11 >= XP_CLASS.LEVEL_3) { xpColor = APP_COLOR.LEVEL_3; } else if (clubData.XP / 11 >= XP_CLASS.LEVEL_4) { xpColor = APP_COLOR.LEVEL_4; } else if (clubData.XP / 11 >= XP_CLASS.LEVEL_5) { xpColor = APP_COLOR.LEVEL_5; } else if (clubData.XP / 11 >= XP_CLASS.LEVEL_6) { xpColor = APP_COLOR.LEVEL_6; } else { xpColor = APP_COLOR.LEVEL_7; } if (clubData.R5 / 11 >= R5_CLASS.LEVEL_1) { r5Color = APP_COLOR.LEVEL_1; } else if (clubData.R5 / 11 >= R5_CLASS.LEVEL_2) { r5Color = APP_COLOR.LEVEL_2; } else if (clubData.R5 / 11 >= R5_CLASS.LEVEL_3) { r5Color = APP_COLOR.LEVEL_3; } else if (clubData.R5 / 11 >= R5_CLASS.LEVEL_4) { r5Color = APP_COLOR.LEVEL_4; } else if (clubData.R5 / 11 >= R5_CLASS.LEVEL_5) { r5Color = APP_COLOR.LEVEL_5; } else if (clubData.R5 / 11 >= R5_CLASS.LEVEL_6) { r5Color = APP_COLOR.LEVEL_6; } else { r5Color = APP_COLOR.LEVEL_7; } firstSquadSkill_content += "<tr " + classOdd + "><td>" + value + "</td><td align='right' style='color: " + recColor + ";'>" + (clubData.REC / 11).toFixed(4) + "</td><td align='right' style='color: " + xpColor + ";'>" + (clubData.XP / 11).toFixed(1) + "</td><td align='right' style='color: " + r5Color + ";'>" + (clubData.R5 / 11).toFixed(2) + "</td></tr>"; } else { firstSquadSkill_content += "<tr " + classOdd + "><td>" + value + "</td><td></td><td></td><td></td></tr>"; } }); firstSquadSkill_content += "</table>"; $("#firstSquadSkill_content").append(firstSquadSkill_content); } function showValue() { let firstSquadValue_content = "<table>" + "<tr><th>Club</th><th align='right'>BP(K)</th><th align='right'>Age</th><th align='right'>WA(K)</th></tr>"; let rowCount = 0; clubMap.forEach((value, key) => { rowCount++; let classOdd = ""; if ((rowCount % 2) == 1) { classOdd = "class='odd'"; } if (clubDatas.has(key)) { let clubData = clubDatas.get(key); var bpColor, waColor; if (clubData.BP / 11 >= BP_CLASS.LEVEL_1) { bpColor = APP_COLOR.LEVEL_1; } else if (clubData.BP / 11 >= BP_CLASS.LEVEL_2) { bpColor = APP_COLOR.LEVEL_2; } else if (clubData.BP / 11 >= BP_CLASS.LEVEL_3) { bpColor = APP_COLOR.LEVEL_3; } else if (clubData.BP / 11 >= BP_CLASS.LEVEL_4) { bpColor = APP_COLOR.LEVEL_4; } else if (clubData.BP / 11 >= BP_CLASS.LEVEL_5) { bpColor = APP_COLOR.LEVEL_5; } else if (clubData.BP / 11 >= BP_CLASS.LEVEL_6) { bpColor = APP_COLOR.LEVEL_6; } else { bpColor = APP_COLOR.LEVEL_7; } if (clubData.Wage / 11 >= WA_CLASS.LEVEL_1) { waColor = APP_COLOR.LEVEL_1; } else if (clubData.Wage / 11 >= WA_CLASS.LEVEL_2) { waColor = APP_COLOR.LEVEL_2; } else if (clubData.Wage / 11 >= WA_CLASS.LEVEL_3) { waColor = APP_COLOR.LEVEL_3; } else if (clubData.Wage / 11 >= WA_CLASS.LEVEL_4) { waColor = APP_COLOR.LEVEL_4; } else if (clubData.Wage / 11 >= WA_CLASS.LEVEL_5) { waColor = APP_COLOR.LEVEL_5; } else if (clubData.Wage / 11 >= WA_CLASS.LEVEL_6) { waColor = APP_COLOR.LEVEL_6; } else { waColor = APP_COLOR.LEVEL_7; } firstSquadValue_content += "<tr " + classOdd + "><td>" + value + "</td><td align='right' style='color: " + bpColor + ";'>" + (clubData.BP / 11 / 1000).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</td><td align='right'>" + (clubData.Age / 11 / 12).toFixed(1) + "</td><td align='right' style='color: " + waColor + ";'>" + (clubData.Wage / 11 / 1000).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</td></tr>"; } else { firstSquadValue_content += "<tr " + classOdd + "><td>" + value + "</td><td></td><td></td><td></td></tr>"; } }); firstSquadValue_content += "</table>"; $("#firstSquadValue_content").append(firstSquadValue_content); } function setShowMode() { let showMode = $('#tm_script_league_lineup_input_show_mode')[0].value; if (showMode == '') { localStorage.removeItem(APPLICATION_PARAM.LOCAL_STORAGE_KEY); } else if (!APPLICATION_PARAM.SHOW_MODE_ARR.includes(showMode)) { alert('Allowable show mode values: ' + APPLICATION_PARAM.SHOW_MODE_ARR); } else { localStorage.setItem(APPLICATION_PARAM.LOCAL_STORAGE_KEY, showMode); alert('Set successful, please refresh'); } } // R5 weights // Str Sta Pac Mar Tac Wor Pos Pas Cro Tec Hea Fin Lon Set var weightR5 = [[0.41029304, 0.18048062, 0.56730138, 1.06344654, 1.02312672, 0.40831256, 0.58235457, 0.12717479, 0.05454137, 0.09089830, 0.42381693, 0.04626272, 0.02199046, 0.00000000], // DC [0.42126371, 0.18293193, 0.60567629, 0.91904794, 0.89070915, 0.40038476, 0.56146633, 0.15053902, 0.15955429, 0.15682932, 0.42109742, 0.09460329, 0.03589655, 0.00000000], // DL/R [0.23412419, 0.32032289, 0.62194779, 0.63162534, 0.63143081, 0.45218831, 0.47370658, 0.55054737, 0.17744915, 0.39932519, 0.26915814, 0.16413124, 0.07404301, 0.00000000], // DMC [0.27276905, 0.26814289, 0.61104798, 0.39865092, 0.42862643, 0.43582015, 0.46617076, 0.44931076, 0.25175412, 0.46446692, 0.29986350, 0.43843061, 0.21494592, 0.00000000], // DML/R [0.25219260, 0.25112993, 0.56090649, 0.18230261, 0.18376490, 0.45928749, 0.53498118, 0.59461481, 0.09851189, 0.61601950, 0.31243959, 0.65402884, 0.29982016, 0.00000000], // MC [0.28155678, 0.24090675, 0.60680245, 0.19068879, 0.20018012, 0.45148647, 0.48230007, 0.42982389, 0.26268609, 0.57933805, 0.31712419, 0.65824985, 0.29885649, 0.00000000], // ML/R [0.22029884, 0.29229690, 0.63248227, 0.09904394, 0.10043602, 0.47469498, 0.52919791, 0.77555880, 0.10531819, 0.71048302, 0.27667115, 0.56813972, 0.21537826, 0.00000000], // OMC [0.21151292, 0.35804710, 0.88688492, 0.14391236, 0.13769621, 0.46586605, 0.34446036, 0.51377701, 0.59723919, 0.75126119, 0.16550722, 0.2###6502, 0.12417045, 0.00000000], // OML/R [0.35479780, 0.14887553, 0.43273380, 0.00023928, 0.00021111, 0.46931131, 0.57731335, 0.41686333, 0.05607604, 0.62121195, 0.45370457, 1.03660702, 0.43205492, 0.00000000], // F [0.45462811, 0.30278232, 0.45462811, 0.90925623, 0.45462811, 0.90925623, 0.45462811, 0.45462811, 0.30278232, 0.15139116, 0.15139116]]; // GK // RECb weights Str Sta Pac Mar Tac Wor Pos Pas Cro Tec Hea Fin Lon Set var weightRb = [[0.10493615, 0.05208547, 0.07934211, 0.14448971, 0.13159554, 0.06553072, 0.07778375, 0.06669303, 0.05158306, 0.02753168, 0.12055170, 0.01350989, 0.02549169, 0.03887550], // DC [0.07715535, 0.04943315, 0.11627229, 0.11638685, 0.12893778, 0.07747251, 0.06370799, 0.03830611, 0.10361093, 0.06253997, 0.09128094, 0.01314110, 0.02449199, 0.03726305], // DL/R [0.08219824, 0.08668831, 0.07434242, 0.09661001, 0.08894242, 0.08998026, 0.09281287, 0.08868309, 0.04753574, 0.06042619, 0.05396986, 0.05059984, 0.05660203, 0.03060871], // DMC [0.06744248, 0.06641401, 0.09977251, 0.08253749, 0.09709316, 0.09241026, 0.08513703, 0.06127851, 0.10275520, 0.07985941, 0.04618960, 0.03927270, 0.05285911, 0.02697852], // DML/R [0.07304213, 0.08174111, 0.07248656, 0.08482334, 0.07078726, 0.09568392, 0.09464529, 0.09580381, 0.04746231, 0.07093008, 0.04595281, 0.05955544, 0.07161249, 0.03547345], // MC [0.06527363, 0.06410270, 0.09701305, 0.07406706, 0.08563595, 0.09648566, 0.08651209, 0.06357183, 0.10819222, 0.07386495, 0.03245554, 0.05430668, 0.06572005, 0.03279859], // ML/R [0.07842736, 0.07744888, 0.07201150, 0.06734457, 0.05002348, 0.08350204, 0.08207655, 0.11181914, 0.03756112, 0.07486004, 0.06533972, 0.07457344, 0.09781475, 0.02719742], // OMC [0.06545375, 0.06145378, 0.10503536, 0.06421508, 0.07627526, 0.09232981, 0.07763931, 0.07001035, 0.11307331, 0.07298351, 0.04248486, 0.06462713, 0.07038293, 0.02403557], // OML/R [0.07738289, 0.05022488, 0.07790481, 0.01356516, 0.01038191, 0.06495444, 0.07721954, 0.07701905, 0.02680715, 0.07759692, 0.12701687, 0.15378395, 0.12808992, 0.03805251], // F [0.07466384, 0.07466384, 0.07466384, 0.14932769, 0.10452938, 0.14932769, 0.10452938, 0.10344411, 0.07512610, 0.04492581, 0.04479831]]; // GK var posNames = ["DC", "DCL", "DCR", "DL", "DR", "DMC", "DMCL", "DMCR", "DML", "DMR", "MC", "MCL", "MCR", "ML", "MR", "OMC", "OMCL", "OMCR", "OML", "OMR", "F", "FC", "FCL", "FCR", "GK"]; var pos = [0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9]; function funFix1(i) { i = (Math.round(i * 10) / 10).toFixed(1); return i; } function funFix2(i) { i = (Math.round(i * 100) / 100).toFixed(2); return i; } function funFix3(i) { i = (Math.round(i * 1000) / 1000).toFixed(3); return i; } function calculate(weightRb, weightR5, skills, posGain, posKeep, fp, rou, remainder, allBonus) { var rec = 0; // RERECb var ratingR = 0; // RatingR5 var ratingR5 = 0; // RatingR5 + routine var ratingR5Bonus = 0; // RatingR5 + routine + bonus var remainderWeight = 0; // REREC remainder weight sum var remainderWeight2 = 0; // RatingR5 remainder weight sum var not20 = 0; // 20以外のスキル数 for (var i = 0; i < weightRb[fp].length; i++) { // weightR[fp].length = n.pesi[pos] cioè le skill: 14 o 11 rec += skills[i] * weightRb[fp][i]; ratingR += skills[i] * weightR5[fp][i]; if (skills[i] != 20) { remainderWeight += weightRb[fp][i]; remainderWeight2 += weightR5[fp][i]; not20++; } } if (remainder / not20 > 0.9 || not20 == 0) { if (fp == 9) not20 = 11; else not20 = 14; remainderWeight = 1; remainderWeight2 = 5; } rec = funFix3((rec + remainder * remainderWeight / not20 - 2) / 3); ratingR += remainder * remainderWeight2 / not20; ratingR5 = funFix2(ratingR * 1 + rou * 5); if (skills.length == 11) { ratingR5Bonus = funFix2(ratingR5 * 1 + allBonus * 1); } else { ratingR5Bonus = funFix2(ratingR5 * 1 + allBonus * 1 + posGain[fp] * 1 + posKeep[fp] * 1); } return [rec, ratingR5Bonus]; } function calculateRR(current_player_info) { var skillArray = current_player_info.skills; var STR, STA, PAC, MAR, TAC, WOR, POS, PAS, CRO, TEC, HEA, FIN, LON, SET, HAN, ONE, REF, AER, JUM, COM, KIC, THR; var skillValue; for (var i = 0; i < skillArray.length; i++) { if (skillArray[i].key == 'null') continue; skillValue = skillArray[i].value; if (isNaN(skillValue)) { if (skillValue.indexOf('19') != -1) { skillValue = 19; } else if (skillValue.indexOf('20') != -1) { skillValue = 20; } else { throw 'Error skillValue: ' + skillValue; } } switch (skillArray[i].key) { case 'strength': STR = skillValue; break; case 'stamina': STA = skillValue; break; case 'pace': PAC = skillValue; break; case 'marking': MAR = skillValue; break; case 'tackling': TAC = skillValue; break; case 'workrate': WOR = skillValue; break; case 'positioning': POS = skillValue; break; case 'passing': PAS = skillValue; break; case 'crossing': CRO = skillValue; break; case 'technique': TEC = skillValue; break; case 'heading': HEA = skillValue; break; case 'finishing': FIN = skillValue; break; case 'longshots': LON = skillValue; break; case 'set_pieces': SET = skillValue; break; case 'handling': HAN = skillValue; break; case 'one_on_ones': ONE = skillValue; break; case 'reflexes': REF = skillValue; break; case 'aerial_ability': AER = skillValue; break; case 'jumping': JUM = skillValue; break; case 'communication': COM = skillValue; break; case 'kicking': KIC = skillValue; break; case 'throwing': THR = skillValue; break; default: throw 'Error skillArray[i].key: ' + skillArray[i].key; } } var ROLE = current_player_info.favposition.toUpperCase(); var ROU = Number(current_player_info.routine.split(',').join('')); var ASI = Number(current_player_info.skill_index.split(',').join('')); var ROLE1, ROLE2; var role = ROLE.split(','); if (role.length == 2) { ROLE1 = role[0]; ROLE2 = role[1]; } else { ROLE1 = role[0]; ROLE2 = -1; } var fp, fp2 = -1; for (var i = 0; i < posNames.length; i++) { if (posNames[i] == ROLE1) fp = pos[i]; if (ROLE2 != -1 && posNames[i] == ROLE2) fp2 = pos[i]; } if (fp == 9) { var weight = 48717927500; var skills = [STR, STA, PAC, HAN, ONE, REF, AER, JUM, COM, KIC, THR]; } else { weight = 263533760000; skills = [STR, STA, PAC, MAR, TAC, WOR, POS, PAS, CRO, TEC, HEA, FIN, LON, SET]; } var goldstar = 0; var skillSum = 0; var skillsB = []; for (i = 0; i < skills.length; i++) { skillSum += parseInt(skills[i]); } var remainder = Math.round((Math.pow(2, Math.log(weight * ASI) / Math.log(Math.pow(2, 7))) - skillSum) * 10) / 10; // RatingR5 remainder for (var j = 0; j < 2; j++) { for (i = 0; i < 14; i++) { if (j == 0 && skills[i] == 20) goldstar++; if (j == 1) { if (skills[i] != 20) skillsB[i] = skills[i] * 1 + remainder / (14 - goldstar); else skillsB[i] = skills[i]; } } } var routine = (3 / 100) * (100 - (100) * Math.pow(Math.E, -ROU * 0.035)); var strRou = skillsB[0] * 1 + routine; var staRou = skillsB[1] * 1; var pacRou = skillsB[2] * 1 + routine; var marRou = skillsB[3] * 1 + routine; var tacRou = skillsB[4] * 1 + routine; var worRou = skillsB[5] * 1 + routine; var posRou = skillsB[6] * 1 + routine; var pasRou = skillsB[7] * 1 + routine; var croRou = skillsB[8] * 1 + routine; var tecRou = skillsB[9] * 1 + routine; var heaRou = skillsB[10] * 1 + routine; var finRou = skillsB[11] * 1 + routine; var lonRou = skillsB[12] * 1 + routine; var setRou = skillsB[13] * 1 + routine; var headerBonus; if (heaRou > 12) headerBonus = funFix2((Math.pow(Math.E, (heaRou - 10) ** 3 / 1584.77) - 1) * 0.8 + Math.pow(Math.E, (strRou * strRou * 0.007) / 8.73021) * 0.15 + Math.pow(Math.E, (posRou * posRou * 0.007) / 8.73021) * 0.05); else headerBonus = 0; var fkBonus = funFix2(Math.pow(Math.E, Math.pow(setRou + lonRou + tecRou * 0.5, 2) * 0.002) / 327.92526); var ckBonus = funFix2(Math.pow(Math.E, Math.pow(setRou + croRou + tecRou * 0.5, 2) * 0.002) / 983.65770); var pkBonus = funFix2(Math.pow(Math.E, Math.pow(setRou + finRou + tecRou * 0.5, 2) * 0.002) / 1967.31409); var allBonus = 0; if (skills.length == 11) allBonus = 0; else allBonus = headerBonus * 1 + fkBonus * 1 + ckBonus * 1 + pkBonus * 1; var gainBase = funFix2((strRou ** 2 + staRou ** 2 * 0.5 + pacRou ** 2 * 0.5 + marRou ** 2 + tacRou ** 2 + worRou ** 2 + posRou ** 2) / 6 / 22.9 ** 2); var keepBase = funFix2((strRou ** 2 * 0.5 + staRou ** 2 * 0.5 + pacRou ** 2 + marRou ** 2 + tacRou ** 2 + worRou ** 2 + posRou ** 2) / 6 / 22.9 ** 2); // 0:DC 1:DL/R 2:DMC 3:DML/R 4:MC 5:ML/R 6:OMC 7:OML/R 8:F var posGain = [gainBase * 0.3, gainBase * 0.3, gainBase * 0.9, gainBase * 0.6, gainBase * 1.5, gainBase * 0.9, gainBase * 0.9, gainBase * 0.6, gainBase * 0.3]; var posKeep = [keepBase * 0.3, keepBase * 0.3, keepBase * 0.9, keepBase * 0.6, keepBase * 1.5, keepBase * 0.9, keepBase * 0.9, keepBase * 0.6, keepBase * 0.3]; var valueFp = calculate(weightRb, weightR5, skills, posGain, posKeep, fp, routine, remainder, allBonus); var rec = [valueFp[0]]; var r5 = [valueFp[1]]; if (fp2 != -1 && fp2 != fp) { var valueFp2 = calculate(weightRb, weightR5, skills, posGain, posKeep, fp2, routine, remainder, allBonus); rec.push(valueFp2[0]); r5.push(valueFp2[1]); } return [rec, r5]; } function compareByRoutineAsc(a, b) { var rou_a = parseFloat(a.ROU); var rou_b = parseFloat(b.ROU); return (rou_a - rou_b); } })();