TrainSimulator

对训练计划给出模拟结果 依赖插件:TMVN Players Scout (CN beta)和RatingR5 CN

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         TrainSimulator 
// @namespace    https://trophymanager.com/
// @version      1.0.5
// @description  对训练计划给出模拟结果 依赖插件:TMVN Players Scout (CN beta)和RatingR5 CN
// @author       训练器:太原FC(246770) 自动填入:提瓦特元素反应(4731723)
// @match        https://trophymanager.com/players/*
// @match        https://trophymanager.cn/training/*
// @grant        none
// @license      MIT
// ==/UserScript==

function insertAfter(newElement,targetElement){
    var parent = targetElement.parentNode;
    if(parent.lastChild == targetElement){
        parent.appendChild(newElement);
    }else{
        parent.insertBefore(newElement,targetElement.nextsibling);
    }
}

function sendInfoToUrl(url, data) {
    if(data == "") return
    const queryParams = new URLSearchParams(data);
    const fullUrl = `${url}?${queryParams.toString()}`;
    window.open(fullUrl, '_blank');
}

function extractInfoFromTable() {
    const table = document.querySelector('#R5table4');
    const tbody = table.querySelector('tbody');
    const rows = tbody.querySelectorAll('tr');

    const headers = [];
    rows[0].querySelectorAll('td').forEach(td => {
        headers.push(td.textContent.trim());
    });

    const age = rows[1].querySelector('select').value;

    const skillValue = rows[1].querySelectorAll('td')[1].textContent.trim();
    const starRating = rows[1].querySelectorAll('td')[2].textContent.trim();
    const r5Score = rows[1].querySelectorAll('td')[3].textContent.trim();

    let abilities = rows[2].querySelector('td[colspan="4"]').textContent.trim().replace("传", " 传").replace("力 :", " 力:");
    const abilityMap = {};
    abilities.split(/\s+/).forEach(pair => {
        const [key, value] = pair.split(':');
        abilityMap[key] = value;
    });

    const teamPoints = countTeamPoints();

    const swTable = document.querySelectorAll('#scoutReport_content tr');
    let adValue = "";
    let bodyValue = "";
    let tacticsValue = "";
    let techValue = "";
    console.log(swTable);
    if(swTable[5].querySelectorAll('td')[1] != null) adValue = swTable[5].querySelectorAll('td')[1].innerText;
    if(swTable[6].querySelectorAll('td')[1] != null) bodyValue = swTable[6].querySelectorAll('td')[1].innerText;
    if(swTable[7].querySelectorAll('td')[1] != null) tacticsValue = swTable[7].querySelectorAll('td')[1].innerText;
    if(swTable[8].querySelectorAll('td')[1] != null) techValue = swTable[8].querySelectorAll('td')[1].innerText;

    return {
        headers,
        age,
        skillValue,
        starRating,
        r5Score,
        teamPoints,
        adValue,
        bodyValue,
        tacticsValue,
        techValue,
        abilities: abilityMap
    };
}

function countTeamPoints() {
    const teams = {};
    for (let i = 1; i <= 6; i++) {
        const teamClass = `team${i}`;
        const teamElement = document.querySelector(`.${teamClass}`);
        if (teamElement) {
            const pointsOnCount = teamElement.querySelectorAll('.point_on').length;
            teams[teamClass] = pointsOnCount;
        } else {
            teams[teamClass] = 0;
        }
    }
    return teams;
}

function objectToQueryParams(obj) {
    if(obj.skillValue == "---"){
        let notice = document.createElement('div');
        notice.innerHTML = "<a>请先选择需要模拟的年龄</a>"
        document.querySelector('.training_custom_levels .msgbuttons').appendChild(notice);
        return ""
    }
    if(obj.skillValue == ""){
        let notice = document.createElement('div');
        notice.innerHTML = "<a>请先安装并启用依赖插件RatingR5 CN</a>"
        document.querySelector('.training_custom_levels .msgbuttons').appendChild(notice);
        return ""
    }

    const params = new URLSearchParams();

    params.append('age', obj.age);
    params.append('skillValue', obj.skillValue);
    params.append('starRating', obj.starRating);
    params.append('r5Score', obj.r5Score);
    params.append('teamPoints', obj.teamPoints);
    params.append('adValue', obj.adValue);
    params.append('bodyValue', obj.bodyValue);
    params.append('tacticsValue', obj.tacticsValue);
    params.append('techValue', obj.techValue);

    for (const [key, value] of Object.entries(obj.teamPoints)) {
        params.append(`teamPoints_${key}`, value);
    }

    for (const [key, value] of Object.entries(obj.abilities)) {
        params.append(`ability_${key}`, value);
    }

    return params.toString();
}

(function() {
    'use strict';
    let added = false;

    function ShowCalButton()
    {
        if(!trainTypeIsLoaded())return;
        const calButton = document.createElement('span');
        const playerCountElement = document.querySelector('#player_training_new .msgbuttons');
        console.log(playerCountElement);
        if (playerCountElement && playerCountElement.firstChild) {
            calButton.setAttribute("class", "button");
            let innerSpan = document.createElement('span');
            innerSpan.setAttribute("class", "button_border");
            innerSpan.textContent = "模拟训练";
            calButton.appendChild(innerSpan);
            calButton.href = '#';
            calButton.addEventListener('click', function(event) {
                event.preventDefault();
                //console.log(extractInfoFromTable());
                sendInfoToUrl('https://trophymanager.cn/training/', objectToQueryParams(extractInfoFromTable()));
            })
            insertAfter(calButton, document.querySelector('#player_training_new .msgbuttons').firstChild);
        }
    }


    function trainTypeIsLoaded()
    {
        if(added) return false;
        let trainList=document.querySelector("#player_training_new .msgbuttons");
        if(trainList===null)return false;
        added = true;
        return true;
    }

    setInterval(ShowCalButton,500);
})();


(function() {
    'use strict';

    if (!(window.location.pathname === '/training/' || window.location.pathname === '/training')) {
        return;
    }

    function getQueryParams() {
        const params = {};
        const search = window.location.search.substring(1);
        if (search.length > 0) {
            const pairs = search.split("&");
            pairs.forEach(pair => {
                const [key, value] = pair.split("=");
                params[decodeURIComponent(key)] = decodeURIComponent(value || "");
            });
        }
        return params;
    }

    function fillInputs(params) {
        console.log(params);
        const [years, months] = params.age ? params.age.split(".") : [null, null];
        const ageSelect = document.getElementById("years");
        const monthSelect = document.getElementById("month");

        if (ageSelect && years) {
            ageSelect.value = parseInt(years);
        }

        if (monthSelect && months) {
            monthSelect.value = parseInt(months);
        }

        // 填入技能评值信息
        const skillInput = document.getElementsByName("si")[0];
        if (skillInput && params.skillValue) {
            skillInput.value = params.skillValue.replace(/,/g,"");
        }

        // 填入其他属性信息
        const abilityMapping = {
            "Str": "力",
            "Sta": "耐",
            "Pac": "速",
            "Mar": "盯",
            "Tac": "抢",
            "Wor": "工",
            "Pos": "位",
            "Pas": "传",
            "Cro": "中",
            "Tec": "技",
            "Hea": "头",
            "Fin": "射",
            "Lon": "远",
            "Set": "定"
        };

        for (const [key, field] of Object.entries(abilityMapping)) {
            const input = document.getElementsByName(key)[0];
            if (input && params[`ability_${field}`]) {
                input.value = params[`ability_${field}`];
            }
        }


        // 填入 teamPoints
        for (let i = 1; i <= 6; i++) {
            const selectElement = document.querySelector(`#t${i}`);
            if (selectElement && params[`teamPoints_team${i}`]) {
                selectElement.value = params[`teamPoints_team${i}`];
            }
        }

        // 填入三维
        document.querySelector(`#sp`).value = {"力量": "0", "耐力": "1", "速度": "2", "盯人": "3", "抢断": "4", "工投": "5", "站位": "6", "传球": "7", "传中": "8", "技术": "9", "头球": "10", "射门": "11", "远射": "12", "定位球": "13"}[params.adValue];
        document.querySelector(`#phy3`).value = ["0.55", "0.68", "0.80", "0.94"][parseInt(params.bodyValue) - 1];
        document.querySelector(`#tac3`).value = ["0.55", "0.68", "0.80", "0.94"][parseInt(params.tacticsValue) - 1];
        document.querySelector(`#tec3`).value = ["0.55", "0.68", "0.80", "0.94"][parseInt(params.techValue) - 1];
    }

    const queryParams = getQueryParams();
    fillInputs(queryParams);
})();