OS2.training: Unterschied zwischen den Versionen

Aus Online-Soccer-Wiki
Zur Navigation springen Zur Suche springen
(Version 020 - Geeignet für Greasemonkey 4.0/Firefox 57.0 Quantum, Header, @include-Pattern, VERSIONSSCHRITT! (MERGE SLC))
(Installations- und Ansichtslink auf GitHub)
 
Zeile 26: Zeile 26:
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
|}
|}
== [https://github.com/Eselce/OS2.scripts/blob/master/OS2.training.user.js Quellcode] [https://eselce.github.io/OS2.scripts/OS2.training.user.js INSTALLATION] ==
<pre>
<pre>
// ==UserScript==
// ==UserScript==

Aktuelle Version vom 19. November 2017, 14:21 Uhr

OS2.training
Dateiname os2.training.user.js
Version 0.20beta (WebExtensions)
Autor Andreas Eckes, Strindheim BK
Sven Loges (SLC), Choromonets Odessa
Beschreibung Trainings-Wahrscheinlichkeiten für verschiedene Einsatzarten
Webseiten training.php
Training
Funktionalität Ergänzung der Spalten "Bankeinsatz", "Teilweise", "Durchgehend"
Letzte Änderung 19.11.2017

Quellcode INSTALLATION[Bearbeiten]

// ==UserScript==
// @name         OS2.training
// @namespace    http://os.ongapo.com/
// @version      0.20+WE
// @copyright    2013+
// @author       Sven Loges (SLC) / Andreas Eckes (Strindheim BK)
// @description  OS 2.0 - Berechnet die Trainingswahrscheinlichkeiten abhaengig von der Art des Einsatzes
// @include      /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/training\.php$/
// @grant        none
// ==/UserScript==

// Konstante 0.99 ^ 99
const __099HOCH99 = 0.36972963764972677265718790562881;

const __FACTORS = [ 1.00, 1.10, 1.25, 1.35 ];	// Tribuene, Bank, teilweise, durchgehend

var trainingTable = document.getElementsByTagName("table")[2];
var titleProb1 = "Bankeinsatz";
var titleProb2 = "Teilweise";
var titleProb3 = "Durchgehend";
var titlePS = "Primary";
var titleValue = "EW";
var titleWS0 = "WS";
var titleMin0 = "min.";
var titleMin3 = "max.";

var colIdxSkill = 5;
var colIdxChance = 7;

var colIdxAlter = 2;
var colIdxTSkill = 4;
var colIdxPSkill = 6;

var sum = 0.0;

procTraining();
addWarning();

// Fuegt einen Hinweis zur maximalen Trainingswahrscheinlichkeit in den Textbereich ueber der Tabelle hinzu
function addWarning() {
	var warning1 = "Die in den Spalten \"" + titleProb1 + "\", \"" + titleProb2 + "\" und \"" + titleProb3 +
			           "\" angegebenen Wahrscheinlichkeiten dienen nur zur Orientierung!";
	var warning2 = "Die maximale Wahrscheinlichkeit einer Aufwertung ist immer 99.00 %! Zu erwartende Aufwertungen = " + sum.toFixed(2).toString();

	var table = document.getElementsByTagName("table")[1];
	var newCell1 = table.insertRow(-1).insertCell(-1);
	newCell1.setAttribute("colspan", 4, false);
	newCell1.textContent = warning1;
	//newCell1.style.color = "#FFFF00";
	var newCell2 = table.insertRow(-1).insertCell(-1);
	newCell2.setAttribute("colspan", 3, false);
	newCell2.textContent = warning2;
}

// Verarbeitet die Trainings-Seite
function procTraining() {
	var colWidth = 80;
	var colWidth2 = 40;

	// Ueberschriften hinzufuegen
	var titleRow = trainingTable.rows[0];

	var orgLength = titleRow.cells.length;
	appendCell(titleRow, titleProb1);
	appendCell(titleRow, titleProb2);
	appendCell(titleRow, titleProb3);

	var col2 = titleRow.cells.length;
	appendCell(titleRow, titlePS);
	appendCell(titleRow, titleValue);
	appendCell(titleRow, titleWS0);
	appendCell(titleRow, titleMin0);
	appendCell(titleRow, titleMin3);

	// Breite der neuen Spalten festlegen
	for (var i = orgLength + 1; i < titleRow.cells.length; i++) {
		titleRow.cells[i].setAttribute("width", (i < col2) ? colWidth : colWidth2, false);
	}

	// Wahrscheinlichkeiten eintragen
	var currentRow;
	var color;
	var pos;
	var skill;
	var practice;
	var practicePS;
	var value;
	var valueStr;
	var probStr;
	sum = 0.0;
	for (i = 1; i < trainingTable.rows.length; i++) {
		currentRow = trainingTable.rows[i];
		pos = getPos(currentRow);
		skill = getSkill(currentRow);
		color = getColor(pos);
		probString = getProbString(currentRow);
		practice = (getProbability(probString, 0) !== "");
		practicePS = practice && isPrimarySkill(pos, skill);
		if (practice) {
			value = parseFloat(probString) * (practicePS ? 5 : 1) / 100.0;
			sum += value;
		} else {
			value = 0.0;
		}
		valueStr = value.toFixed(2).toString();
		probStr0 = calcProbPercent(getAlter(currentRow), getPSkill(currentRow), getTSkill(currentRow));
		minStr0 = calcMinPSkill(getAlter(currentRow), getTSkill(currentRow));
		minStr3 = calcMinPSkill(getAlter(currentRow), getTSkill(currentRow), 3);
		for (var j = 1; j <= 3; j++) {
			appendCell(currentRow, getProbability(probString, j), color);
		}
		appendCell(currentRow, practicePS ? skill : "", color);
		appendCell(currentRow, valueStr, color);
		appendCell(currentRow, probStr0.toFixed(2), color);
		appendCell(currentRow, value ? minStr0.toFixed(0) : "", color);
		appendCell(currentRow, value ? minStr3.toFixed(0) : "", color);
/*		if (practicePS) {
			for (var j = 0; j < currentRow.length; j++) {
				currentRow.cells[j].style.color = "#FFFFFF";
				currentRow.cells[j].style.fontWeight = "bold";
			}
		}*/
	}
}

// Fuegt eine Zelle ans Ende der uebergebenen Zeile hinzu und fuellt sie
// row: Zeile, die verlaengert wird
// content: Textinhalt der neuen Zelle
// color: Schriftfarbe der neuen Zelle (z.B. "#FFFFFF" fuer weiss)
// Bei Aufruf ohne Farbe wird die Standardfarbe benutzt
function appendCell(row, content, color) {
	row.insertCell(-1);
	var colIdx = row.cells.length - 1;
	row.cells[colIdx].textContent = content;
	row.cells[colIdx].style.color = color;
}

// Gibt die Trainingswahrscheinlichkeit zurueck
// Format der Rueckgabe: "aaa.bb %", "aa.bb %" bzw. "a.bb %" (keine Deckelung bei 99.00 %)
// probString: Basis-Wahrscheinlichkeit (= Tribuene) als Prozent-String
// mode: Art des Einsatzes: 0 - Tribuene, 1 - Bank, 2 - Teilweiser Einsatz, 3 - Volleinsatz
function getProbability(probString, mode) {
	if ((probString == "0.00 %") || (probString == "Trainerskill zu niedrig!")) {
		return "";
	}

	var returnValue = parseFloat(probString) * __FACTORS[mode];

	return returnValue.toFixed(2).toString() + " %";
}

// Gibt die zur Position gehoerige Farbe zurueck
function getColor(pos) {
	switch (pos) {
		case "TOR": return "#FFFF00";
		case "ABW": return "#00FF00";
		case "DMI": return "#3366FF";
		case "MIT": return "#66FFFF";
		case "OMI": return "#FF66FF";
		case "STU": return "#FF0000";
		case "LEI": return "#FFFFFF";
		default:	return "";
	}
}

// Gibt die zur Position gehoerigen Primaerskills zurueck
function getPrimarySkills(pos) {
	switch (pos) {
		case "TOR": return "FAN,STB,SPL,REF";
		case "ABW": return "KOB,ZWK,DEC,ZUV";
		case "DMI": return "BAK,DEC,PAS,UEB";
		case "MIT": return "BAK,ZWK,PAS,UEB";
		case "OMI": return "BAK,GES,PAS,UEB";
		case "STU": return "SCH,KOB,ZWK,GES";
		case "LEI": return "";
		default:	return "";
	}
}

// Gibt zurueck, ob der Skill ein zur Position gehoeriger Primaerskill ist
function isPrimarySkill(pos, skill) {
	var primarySkills = getPrimarySkills(pos);
	return (primarySkills.indexOf(skill) > -1);
}

// Gibt die Position dieser Zeile zurueck
function getPos(row) {
	pos = row.cells[colIdxChance].className;
	return pos;
}

// Gibt den Skill dieser Zeile zurueck
function getSkill(row) {
	HTML = row.cells[colIdxSkill].innerHTML;
	//skill = HTML.substr(HTML.indexOf("\"selected\"") + 11, 3);
	skill = HTML.substr(HTML.indexOf("selected=\"\"") + 12, 3);
	return skill;
}

// Gibt die Wahrscheinlichkeit fuer eine Aufwertung zurueck
function getProbString(row) {
	probString = row.cells[colIdxChance].textContent;
	return probString;
}

// Gibt das Alter des Spielers dieser Zeile zurueck
function getAlter(row) {
	alterStr = row.cells[colIdxAlter].textContent;
	return parseInt(alterStr, 10);
}

// Gibt den Skillwert des trainierten Skills des Spielers dieser Zeile zurueck
function getPSkill(row) {
	pSkillStr = row.cells[colIdxPSkill].textContent;
	return ((pSkillStr.length === 0) ? undefined : parseInt(pSkillStr, 10));
}

// Gibt den Trainer-Skill dieser Zeile zurueck
function getTSkill(row) {
	HTML = row.cells[colIdxTSkill].innerHTML;
	//tSkillStr = HTML.substr(HTML.indexOf("\"selected\"") + 15);
	tSkillStr = HTML.substr(HTML.indexOf("selected=\"\"") + 16);
	tSkill = ((tSkillStr.substr(0, 1) === '/') ? undefined : parseFloat(tSkillStr.substr(0, tSkillStr.indexOf('<'))));
	return tSkill;
}

// Gibt die Wahrscheinlichkeit fuer ein Training zurueck
// alter: Alter des Spielers
// pSkill: Derzeitiger Wert des zu trainierenden Spieler-Skills
// tSkill: Trainer-Skill (60, 62.5, ..., 97.5, 99.5)
// mode: Einsatztyp (0: Tribuene/Basis, 1: Bank, 2: teilweise, 3: durchgehend)
// limit: Obere Grenze (99), Default ist unbegrenzt (undefined)
// return Trainingswahrscheinlichkeit
function calcProbPercent(alter, pSkill = 100, tSkill = 99.5, mode = 0, limit = undefined) {
    const __SKILLDIFF = tSkill - pSkill;
    const __SKILLPLUS = Math.max(0, __SKILLDIFF + 0.5);
    const __SKILLFACT = __SKILLPLUS / (101 - __SKILLPLUS);
    const __ALTERFACT = Math.pow((100 - alter) / 37, 7);
    const __PROB = __099HOCH99 * __SKILLFACT * __ALTERFACT * __FACTORS[mode];

    return ((limit === undefined) ? __PROB : Math.min(limit, __PROB));
}

// Gibt die Wahrscheinlichkeit fuer ein Training zurueck
// alter: Alter des Spielers
// tSkill: Trainer-Skill (60, 62.5, ..., 97.5, 99.5)
// mode: Einsatztyp (0: Tribuene/Basis, 1: Bank, 2: teilweise, 3: durchgehend)
// prob: Gewuenschte Wahrscheinlichkeit (Default ist 99)
// return Spieler-Skill eines zu trainierenden Spielers, der optimal trainiert wird
function calcMinPSkill(alter, tSkill = 99.5, mode = 0, prob = 99) {
    const __ALTERFACT = Math.pow((100 - alter) / 37, 7);
    const __SKILLFACT = prob / (__099HOCH99 * __ALTERFACT * __FACTORS[mode]);
    const __SKILLPLUS = 101 * __SKILLFACT / (__SKILLFACT + 1);
    const __SKILLDIFF = Math.max(0, __SKILLPLUS) - 0.5;
    const __PSKILL = tSkill - __SKILLDIFF;

    return Math.max(0, __PSKILL);
}