FMP Player Stats Summary (Accurate Placement)

Add total and average row to correct stats table

2025-05-31 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

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

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         FMP Player Stats Summary (Accurate Placement)
// @namespace    https://osama.dev
// @version      1.2
// @description  Add total and average row to correct stats table
// @match        https://footballmanagerproject.com/Team/Player?id=*
// @grant        none
// ==/UserScript==

(function () {
    function parseNum(txt) {
        const n = parseFloat(txt);
        return isNaN(n) ? 0 : n;
    }

    function getCorrectTable() {
        const tables = document.querySelectorAll('table');
        for (let table of tables) {
            const headers = Array.from(table.querySelectorAll('th')).map(th => th.innerText.trim().toLowerCase());
            if (headers.includes('matches') && headers.includes('goals') && headers.includes('rating')) {
                return table;
            }
        }
        return null;
    }

    function addStatsSummary() {
        const table = getCorrectTable();
        if (!table) return;

        const rows = Array.from(table.querySelectorAll('tbody tr')).filter(r => r.children.length >= 9);
        if (!rows.length) return;

        let totals = { matches: 0, goals: 0, assists: 0, yellow: 0, red: 0, rating: 0 };
        let ratingCount = 0;

        rows.forEach(row => {
            const cells = row.querySelectorAll('td');
            totals.matches += parseNum(cells[3].innerText);
            totals.goals += parseNum(cells[4].innerText);
            totals.assists += parseNum(cells[5].innerText);
            totals.yellow += parseNum(cells[6].innerText);
            totals.red += parseNum(cells[7].innerText);
            const rate = parseNum(cells[8].innerText);
            if (rate > 0) {
                totals.rating += rate;
                ratingCount++;
            }
        });

        const avgRating = ratingCount ? (totals.rating / ratingCount).toFixed(2) : '0.00';

        const summaryRow = document.createElement('tr');
        summaryRow.style.backgroundColor = '#334400';
        summaryRow.style.color = 'yellow';
        summaryRow.style.fontWeight = 'bold';

        summaryRow.innerHTML = `
            <td colspan="3">📊 Summary</td>
            <td>${totals.matches}</td>
            <td>${totals.goals}</td>
            <td>${totals.assists}</td>
            <td>${totals.yellow}</td>
            <td>${totals.red}</td>
            <td>${avgRating}</td>
            <td></td>
        `;

        table.querySelector('tbody').appendChild(summaryRow);
    }

    window.addEventListener('load', () => {
        setTimeout(addStatsSummary, 1000);
    });
})();