Transfer List

You can use this script to see rating R4, REC and TI on TL.

目前为 2021-01-28 提交的版本。查看 最新版本

// ==UserScript==
// @name           Transfer List
// @version        1.0.5
// @author         Shomi
// @description    You can use this script to see rating R4, REC and TI on TL.
// @include	   https://trophymanager.com/transfer/
// @namespace https://gf.qytechs.cn/users/721529
// @grant       function
// ==/UserScript==

let wage_rate = 15.808;

let weightR4 = [
	[0.51872935, 0.29081119, 0.57222393, 0.89735816, 0.84487852, 0.50887940, 0.50887940, 0.13637928, 0.05248024, 0.09388931, 0.57549122, 0.00000000, 0.00000000, 0.0],	// DC
	[0.45240063, 0.31762087, 0.68150374, 0.77724031, 0.74690951, 0.50072196, 0.45947168, 0.17663123, 0.23886264, 0.18410349, 0.46453393, 0.00000000, 0.00000000, 0.0],	// DL/R
	[0.43789335, 0.31844356, 0.53515723, 0.63671706, 0.59109742, 0.51311701, 0.53184426, 0.32421168, 0.06318165, 0.27931537, 0.50093723, 0.19317517, 0.07490902, 0.0],	// DMC
	[0.42311032, 0.32315966, 0.62271745, 0.53932111, 0.51442838, 0.49835997, 0.47896659, 0.26434782, 0.22586124, 0.32182902, 0.45537227, 0.23961054, 0.09291562, 0.0],	// DML/R
	[0.31849880, 0.36581214, 0.50091016, 0.31726444, 0.28029020, 0.52022170, 0.55763723, 0.60199246, 0.10044356, 0.51811057, 0.38320838, 0.38594825, 0.14966211, 0.0],	// MC
	[0.35409971, 0.34443972, 0.64417234, 0.30427501, 0.27956082, 0.49925481, 0.46093655, 0.32887111, 0.38695101, 0.47884837, 0.37465446, 0.39194758, 0.15198852, 0.0],	// ML/R
	[0.32272636, 0.35024067, 0.48762872, 0.22888914, 0.19049636, 0.52620414, 0.57842512, 0.53330409, 0.07523792, 0.55942740, 0.39986691, 0.53866926, 0.20888391, 0.0],	// OMC
	[0.36311066, 0.33106245, 0.61831416, 0.19830147, 0.17415753, 0.50049575, 0.47737842, 0.28937553, 0.34729042, 0.52834210, 0.39939218, 0.55684664, 0.21593269, 0.0],	// OML/R
	[0.40622753, 0.29744114, 0.39446722, 0.09952139, 0.07503885, 0.50402399, 0.58505850, 0.36932466, 0.05210389, 0.53677990, 0.51998862, 0.83588627, 0.32413803, 0.0],	// F
	[0.37313433, 0.37313433, 0.37313433, 0.74626866, 0.52238806, 0.74626866, 0.52238806, 0.52238806, 0.37313433, 0.22388060, 0.22388060]
];	// GK
// RECb weights		Str				Sta				Pac				Mar				Tac				Wor				Pos				Pas				Cro				Tec				Hea				Fin				Lon				Set
let 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
// REC weights Str				   Sta				  Pac				 Mar				 Tac				 Wor				Pos				   Pas				  Cro				 Tec				Hea				   Fin				  Lon				 Set
let weightR = [
	[0.653962303361921, 0.330014238020285, 0.562994547223387, 0.891800163983125, 0.871069095865164, 0.454514672470839, 0.555697278549252, 0.42777598627972, 0.338218821750765, 0.134348455965202, 0.796916786677566, 0.048831870932616, 0.116363443378865, 0.282347752982916],	//DC
	[0.565605120229193, 0.430973382039533, 0.917125432457378, 0.815702528287723, 0.99022325015212, 0.547995876625372, 0.522203232914265, 0.309928898819518, 0.837365352274204, 0.483822472259513, 0.656901420858592, 0.137582588344562, 0.163658117596413, 0.303915447383549],	//DL/R
	[0.55838825558912, 0.603683502357502, 0.563792314670998, 0.770425088563048, 0.641965853834719, 0.675495235675077, 0.683863478201805, 0.757342915150728, 0.473070797767482, 0.494107823556837, 0.397547163237438, 0.429660916538242, 0.56364174077388, 0.224791093448809],	//DMC
	[0.582074038075056, 0.420032202680124, 0.7887541874616, 0.726221389774063, 0.722972329840151, 0.737617252827595, 0.62234458453736, 0.466946909655194, 0.814382915598981, 0.561877829393632, 0.367446981999576, 0.360623408340649, 0.390057769678583, 0.249517737311268],	//DML/R
	[0.578431939417021, 0.778134685048085, 0.574726322388294, 0.71400292078636, 0.635403391007978, 0.822308254446722, 0.877857040588335, 0.864265671245476, 0.433450219618618, 0.697164252367046, 0.412568516841575, 0.586627586272733, 0.617905053049757, 0.308426814834866],	//MC
	[0.497429376361348, 0.545347364699553, 0.788280917110089, 0.578724574327427, 0.663235306043286, 0.772537143243647, 0.638706135095199, 0.538453108494387, 0.887935381275257, 0.572515970409641, 0.290549550901104, 0.476180499897665, 0.526149424898544, 0.287001645266184],	//ML/R
	[0.656437768926678, 0.617260722143117, 0.656569986958435, 0.63741054520629, 0.55148452726771, 0.922379789905246, 0.790553566121791, 0.999688557334153, 0.426203575603164, 0.778770912265944, 0.652374065121788, 0.662264393455567, 0.73120100926333, 0.274563618133769],	//OMC
	[0.483341947292063, 0.494773052635464, 0.799434804259974, 0.628789194186491, 0.633847969631333, 0.681354437033551, 0.671233869875345, 0.536121458625519, 0.849389745477645, 0.684067723274814, 0.389732973354501, 0.499972692291964, 0.577231818355874, 0.272773352088982],	//OML/R
	[0.493917051093473, 0.370423904816088, 0.532148929996192, 0.0629206658586336, 0.0904950078155216, 0.415494774080483, 0.54106107545574, 0.468181146095801, 0.158106484131194, 0.461125738338018, 0.83399612271067, 0.999828328674183, 0.827171977606305, 0.253225855459207],	//F
//			   For  Rez    Vit  Ind  One  Ref Aer  Sar  Com    Deg    Aru
	[0.5, 0.333, 0.5, 1, 0.5, 1, 0.5, 0.5, 0.333, 0.333, 0.333]
]; //GK
let i = 0;
let minRec = 0;
let minTI = null;
let firstParse = true;

const funFix2 = i => {
	i = (Math.round(i * 100) / 100).toFixed(2);
	return i;
}

const funFix3 = i => {
	i = (Math.round(i * 1000) / 1000).toFixed(3);
	return i;
}

const seasonTI = (player, SI, positionIndex) => {
		var wage = Number(player.wage.split("<span class='coin'>")[1].split('</span>')[0].replace(/,/g, ""))
		var today = new Date();
		var SS = new Date("07 10 2017 08:00:00 GMT");				// s50 start
		var training1 = new Date("07 10 2017 23:00:00 GMT");				// first training
		var day = (today.getTime() - training1.getTime()) / 1000 / 3600 / 24;
		while (day > 84 - 16 / 24) day -= 84;
		var session = Math.floor(day / 7) + 1;							// training sessions
		var ageMax = 20.1 + session / 12;							// max new player age

		var age = Number(player.age) * 1 + Number(player.months) / 12;
		var check = today.getTime() - SS.getTime();
		var season = 84 * 24 * 3600 * 1000;
		var count = 0;
		var Result = 0;


		while (check > season) {
			check -= season;
			count++;
		}
        let weight = 263533760000;
	    if (positionIndex === 9) weight = 48717927500;

		if (!(wage == 30000 || (Number(player.player_id) > 120359295 && count == 0))) {	// s50 youth player ID
			var TI1 = Math.pow(2, Math.log(weight * SI) / Math.log(Math.pow(2, 7))) - Math.pow(2, Math.log(weight * wage / (wage_rate)) / Math.log(Math.pow(2, 7)));
			TI1 = Math.round(TI1 * 10);
			return funFix2(TI1 / session)
		}
		Result = TI1 / session;
		if (Number(player.player_id) > 124048574 && age < ageMax) {		// s55 BOT player ID
			wage_rate = 23.75;
			var TI2 = Math.pow(2, Math.log(weight * SI) / Math.log(Math.pow(2, 7))) - Math.pow(2, Math.log(weight * wage / (wage_rate)) / Math.log(Math.pow(2, 7)));
			return funFix2(TI2 / session)
		}
		return null
	}

const calculateREREC = (player, positionIndex, skills, SI, rou) => {
	let rou2 = (3 / 100) * (100 - (100) * Math.pow(Math.E, -rou * 0.035));
	let weight = 263533760000;
	if (positionIndex === 9) weight = 48717927500;
	let rec = 0;
	let ratingR = 0;
	let ratingR4 = 0;
	let skillSum = 0;
	let ti = seasonTI(player, SI, positionIndex);

	for (let i = 0; i < skills.length; i++) {
		skillSum += parseInt(skills[i]);
	}

	let remainder = Math.round((Math.pow(2, Math.log(weight * SI) / Math.log(Math.pow(2, 7))) - skillSum) * 10) / 10;		// RatingR4 remainder
	let remainderWeight = 0;
	let remainderWeight2 = 0;
	let not20 = 0;

	weightR[positionIndex].forEach((value, index) => {
		rec += skills[index] * weightRb[positionIndex][index];
		ratingR += skills[index] * weightR4[positionIndex][index];
		if (skills[index] != 20) {
			remainderWeight += weightRb[positionIndex][index];
			remainderWeight2 += weightR4[positionIndex][index];
			not20++;
		}
	})
	if (remainder / not20 > 0.9 || !not20) {
		if (positionIndex === 9) not20 = 11;
		else not20 = 14;
		remainderWeight = 1;
		remainderWeight2 = 5;
	}

	rec = funFix2((rec + remainder * remainderWeight / not20 - 2) / 3);
	ratingR += remainder * remainderWeight2 / not20;
	ratingR4 = funFix2(ratingR + rou2 * 5);
	ratingR = funFix2(ratingR);

	return [rec, ratingR, ratingR4, ti];
};

const getPosition = pos => {
	switch (pos) {
		case 'gk':
			return 9;
		case 'dc':
			return 0;
		case 'dr':
		case 'dl':
			return 1;
		case 'dmr':
		case 'dml':
			return 3;
		case 'dmc':
			return 2;
		case 'mr':
		case 'ml':
			return 5;
		case 'mc':
			return 4;
		case 'omr':
		case 'oml':
			return 7;
		case 'omc':
			return 6;
		case 'fc':
			return 8;
	}
}

const GetPlayerData = (playerID) => {
	return new Promise((resolve, reject) => {
		$.post("/ajax/tooltip.ajax.php", {"player_id": playerID, minigame: undefined})
		.done((data) => {
			let player = JSON.parse(data).player;
			player.asi = Number(player.skill_index.split(',').join(''));
			player.xp = Number(player.routine.split(',').join(''));
			player.rec = [];
			player.rating = [];
			player.ti = null;
			let positions = player.favposition.split(',');
			positions.forEach(pos => {
				let position = getPosition(pos);
				let skills = [];
				const checkSkills = player.skills.filter(skill => skill.value)
				if (position === 9) {
					skills = [checkSkills[0].value, checkSkills[2].value, checkSkills[4].value, checkSkills[1].value, checkSkills[3].value, checkSkills[5].value, checkSkills[6].value, checkSkills[7].value, checkSkills[8].value, checkSkills[9].value, checkSkills[10].value]
				} else {
					for (let i = 0; i <= checkSkills.length; i = i + 2) {
						if (checkSkills[i]) {
							skills.push(checkSkills[i].value)
						}
					}
					for (let i = 1; i <= checkSkills.length; i = i + 2) {
						if (checkSkills[i]) {
							skills.push(checkSkills[i].value)
						}
					}
				}
				skills.forEach((skill, index) => {
					if (typeof (skill) === 'string') {
						if (skill.includes('silver')) skills[index] = 19
						else skills[index] = 20
					}
				})
				const playerRating = calculateREREC(player, position, skills, player.asi, player.xp)
				player.rating.push(playerRating[2]);
				player.rec.push(playerRating[0]);
				player.ti = playerRating[3];
			})
			const {rec, rating, ti} = player;
			resolve({rec, rating, ti});
		}).fail((error) => {
			reject(error);
		});
	});
}

const addColumn = (row, text, color = '#000') => {
	let el = document.createElement('td');
	el.style.color = color;
	el.style.fontWeight = 'bold';
	el.classList.add('align_center');
	el.innerText = text;
	row.appendChild(el);
}

const updateRow = (player, index) => {
	let row = document.querySelectorAll('div#transfer_list table tr[id]')[index];
	if (!row) return;
	console.log(Number(player.ti), Number(minTI))
	if ((!player.rating.find(skill => Number(skill) >= Number(minRec))) || (minTI && Number(player.ti) < Number(minTI))) {
		row.style.display = 'none';
	} else {
		row.style.display = 'table-row';
		if(firstParse) {
			row.lastChild.remove();
			row.lastChild.remove();
		} else {
			row.lastChild.remove();
			row.lastChild.remove();
			row.lastChild.remove();
		}

		addColumn(row, player.rating.join(' - '));
		addColumn(row, player.rec.join(' - '));
		addColumn(row, player.ti, '#fff');
	}
}

const resizeTable = () => {
	const thead = document.querySelectorAll('div#transfer_list tr')[0];
	if(firstParse) {
		thead.lastChild.remove();
		thead.lastChild.remove();
		addColumn(thead, 'R4', '#fff');
		addColumn(thead, 'REC', '#fff');
		addColumn(thead, 'TI', '#fff');
	}

	[...document.querySelectorAll('.main_center')].forEach(el => {
		el.style.width = '1210px'
	})
	document.querySelectorAll('.column1_d')[0].style.width = '1200px';
	document.querySelectorAll('.transfer_list_outer')[0].style.width = '936px';
}

(function () {
	'use strict';
	const addFilters = () => {
		document.getElementById('search_btn').remove();

		const filtersEl = document.getElementById('filters');
		const el = document.createElement('div');

		const div1 = document.createElement('div');
		div1.classList.add('align_center', 'padding');

		const inputEl = document.createElement('input');
		inputEl.id = 'min_r4';
		inputEl.type = 'number';
		inputEl.classList.add('embossed')
		const labelEl = document.createElement('label');
		labelEl.innerText = 'Min R4'
		const breakEl = document.createElement('br');
		const breakEl2 = document.createElement('br');
		div1.appendChild(labelEl);
		div1.appendChild(breakEl);
		div1.appendChild(inputEl);
		div1.appendChild(breakEl2);

		const inputTIEl = document.createElement('input');
		inputTIEl.id = 'min_ti';
		inputTIEl.type = 'number';
		inputTIEl.classList.add('embossed')
		const labelTiEl = document.createElement('label');
		labelTiEl.innerText = 'Min TI'
		const breakTiEl = document.createElement('br');
		div1.appendChild(labelTiEl);
		div1.appendChild(breakTiEl);
		div1.appendChild(inputTIEl);

		const div2 = document.createElement('div');
		div2.classList.add('align_center', 'padding');

		const buttonEl = document.createElement('button');
		buttonEl.style.padding = '4px 60px'
		buttonEl.style.marginTop = '4px'
		buttonEl.classList.add('button', 'button_icon');
		buttonEl.textContent = 'Filter';
		buttonEl.addEventListener('click', () => {
			minRec = inputEl.value;
			minTI = inputTIEl.value;
			firstParse = false;
			init();
		})
		div2.appendChild(buttonEl);

		el.appendChild(div1);
		el.appendChild(div2);
		filtersEl.appendChild(el);
	}

	addFilters();

	function init(mutationRecords) {
		if (document.querySelector('div#transfer_list table') === null) return;
		resizeTable();
		let playersIDs = [];
		[...document.querySelectorAll('div#transfer_list tr[id^=player_row]')].forEach(el => {
			playersIDs.push(el.id.split('_')[2]);
		})
		playersIDs.map(GetPlayerData).map((promise, index) => {
			promise.then(player => updateRow(player, index))
		});
	}

	let observer = new MutationObserver(init);
	observer.observe(document.querySelector('div#transfer_list'), {childList: true});
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址