NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name RZ-Rechner
// @namespace RZRechner
// @description RZ-Rechner
// @include http://world.virtual-galopp-se.de/*
// @include http://www.virtual-galopp-se.de/*
// @version 1
// @grant none
// ==/UserScript==
// Funktion um alle childeNodes von DunkelT zu verbinden
function Verbinden (indexT, alleDunkelT) {
var index2;
var txt2 = "";
if (typeof alleDunkelT[indexT] == "undefined") {
return txt2;
}
for (index2 = 0; index2 < alleDunkelT[indexT].childNodes.length; ++index2) {
txt2 = txt2 + alleDunkelT[indexT].childNodes[index2].nodeValue;
}
return txt2;
}
// alle Elemente mit Klasse Dunkel
var alleDunkel = document.getElementsByClassName("dunkel");
// falls ich mal was in den Background schreiben will (warum ich das sollte, weiß ich noch nicht)
var toBackground = {};
// Zähler für for-Schleife
var index;
// Grundgewicht ist 50 kg
var grundgewicht = 50;
// Boni für Zwei- und Dreijährige
var bonus = 0;
// Variablen für Pferdedetails
var alter;
var zeit;
var endzeit;
var sieglos3j;
var gewicht;
// Variablen für Kilogrammeinfluss
var ausgangsSteigung = 0.083333333333333333;
var steigungSteigung = 0.000247395833333333;
// Hilfsvariabeln
var temp;
var temp2;
var txt;
var i;
// Starttermin der Edition (bestimmt durch URL)
var startdatum = new Date(2006,5,9);
if (document.URL.indexOf("world")>-1) {
startdatum = new Date(2009,7,4);
}
var startzeit = startdatum.getTime();
// heutiger Tag
var heute = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
var heute2 = heute.getTime();
// wochen enthält die Differenz vom heutigen Tag bis zum letzten Jahreswechsel
var wochen = Math.floor((((heute2-startzeit)/86400000)/48-Math.floor(((heute2-startzeit)/86400000)/48))*48*86400000);
// Variablen für den Renntermin
var renndatum;
var difftage;
// Stall nur ermitteln, wenn man nicht zu schnell geklickt hat
if (document.body.innerText!="So schnell wie du klickst, kannst du garnicht lesen.") {
// Rennstall ermitteln
var stall = $("td")[6].childNodes[0].nodeValue;
}
// Berechnung der RZ im Rennprofil eines eigenen Pferdes
if (document.URL.indexOf("pferdprofil")>-1) {
// alle Elemente mit Klasse Dunkel2
var alleDunkel2 = document.getElementsByClassName("dunkel2");
// falls auf der Seite in zweiten Element mit KLasse Dunkel2 "Leistung" steht
if (alleDunkel2[1] = "Leistung") {
// Durchwandern aller Elemente mit Klasse Dunkel
for (index = 0; index <= alleDunkel.length; ++index) {
// enthält Inhalt von Dunkel
txt = Verbinden (index, alleDunkel);
// liest das Geschlecht aus und ändert das Grundgewicht, so nötig
if (txt.indexOf("Stute")>-1) {
grundgewicht = 48;
}
// liest das aktuelle Alter aus
if (txt.indexOf("j.")>-1) {
alter = parseFloat(txt.substr(txt.indexOf("j.")-2,2));
}
// wertet die Rennen aus (Erkennung, wenn es das Wort "Starter" enthält)
if (txt.indexOf("Starter")>-1) {
/* mehrere Zeilen */
// aktueller Renntermin
renndatum = new Date(txt.substr(14,4),parseFloat(txt.substr(11,2)-1), txt.substr(8,2));
// Differenz in Jahren vom Renntermin bis zum aktuellen Alter (wochen wird abgezogen um das Geburtsdatum auf den Jahreswechsel zu legen)
diffjahre = Math.floor((((renndatum.getTime()-(heute2-wochen))/86400000)/48));
// Errechnung des Rennalters (diffjahre ist ein negativer Wert, deshalb Addition)
rennalter = alter + diffjahre;
// wenn das Rennalter 2 oder 3 ist, wird der Bonus entsprechend festgeschrieben
if (rennalter == 2) {
bonus = 2;
} else if (rennalter == 3) {
bonus = 0.5;
} else {
bonus = 0;
}
// nächste Zelle
++index;
txt = Verbinden (index, alleDunkel);
// Wenn es das Wort Dotation enthält, kann ausgelesen werden, ob es sich um ein Sieglosenrennen für 3-jährige handelt = Bug im Spiel umgehen)
if (txt.indexOf("Dotation")>-1) {
sieglos3j = alleDunkel[index].childNodes[0].childNodes[0].childNodes[0].nodeValue.indexOf("Sieglose 3j.");
}
// übernächste Zelle auswählen
index = index + 2;
// Auslesen der Zelle
txt = Verbinden (index, alleDunkel);
// Das Gewicht auslesen
gewicht = parseFloat(txt.substr(txt.indexOf("kg")-4, 4));
// nächste Zelle
++index;
txt = Verbinden (index, alleDunkel);
// Falls das Pferd dis war, wird das Rennen ignoriert und zum nächsten gesprungen
// Since NaN is the only JavaScript value that is treated as unequal to itself, you can always test if a value is NaN by checking it for equality to itself:
// ermittelt die Rennzeit pro 1000m (nur die Sekunden)
zeit = parseFloat(txt.substr(txt.indexOf("(")+3, 5).replace(",","."));
if (isNaN(zeit)) {
continue;
}
// vorsichtshalber wird die Endzeit auf 0 gesetzt
endzeit = 0;
// Wenn es ein Sieglosenrennen für 3-jährige ist, wird der Bonus ignoriert
if (sieglos3j>-1) {
endzeit = zeit - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
} else {
// Bei der Berechnnug wird berücksichtigt, dass sich die Steigung scheinbar ändert, je mehr Gewicht das Pferd trägt (steigungSteigung)
endzeit = zeit - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
}
// Runden der endzeit auf zwei Kommastellen
endzeit = Math.round(endzeit*100)/100;
// Eintragen der Endzeit in roter Farbe
temp = ": </b><b style ='color:#DD0000'> 1:";
if (endzeit < 10) {
temp = temp + "0" + endzeit.toString();
} else {
temp = temp + endzeit.toString();
}
if (endzeit == Math.floor(endzeit)) {
temp = temp + ",00";
} else if (endzeit*10 == Math.floor(endzeit*10)) {
temp = temp + "0";
}
temp = temp + "/km";
// Punkt durch Komma ersetzen
temp = temp.replace(".",",");
// temp2 enthält die aktuelle Zelle und davon das erste Kindelement (erste Zeile = Platzierung)
temp2 = $("td.dunkel")[index].childNodes[0];
// Eintragen der RZ hinter die Platzierung
$(temp2).append(temp);
}
}
}
} else if (document.URL.indexOf("rennprofil")>-1) { // falls ein Rennen betrachtet wird, wird die RZ für jedes Pferd im Rennen berechnet
// alle Elemente mit Klasse Kalender
//var re = new RegExp('kalender?[2]');
var alleKalender = document.querySelectorAll(".kalender, .kalender2"); // "kalender kalender2");
// Variablen fürs Rennen
var gelaufen;
var distanz;
var erster;
var laengen = 0.47;
var laenge = 0.32;
var halb = 0.16;
var viertel = 0.13;
var hals = 0.1;
var kopf = 0.07;
var kurz = 0.04;
var nase = 0;
var art;
var abstando;
var abstandu;
var endzeito;
var endzeitu;
var cName;
var index1 = -1;
var index2 = -1;
var tempIndex;
var indexDunkel = 0;
var bool = false;
var farbe;
var platzierung;
// Minutengenaue Uhrzeit
var heuteGenau = new Date().getTime();
if (alleDunkel.length === 0) {
alleDunkel = document.getElementsByClassName("dunkel2sponsor");
indexDunkel = 1;
}
txt = alleDunkel[indexDunkel].childNodes[3].nodeValue;
if (txt.indexOf("Renntermin")>-1) {
// Renntermin bestimmen
renndatum = new Date(txt.substr(txt.indexOf("Renntermin")+17,4),parseFloat(txt.substr(txt.indexOf("Renntermin")+14,2)-1),txt.substr(txt.indexOf("Renntermin")+11,2),txt.substr(txt.indexOf("Renntermin")+22,2), txt.substr(txt.indexOf("Renntermin")+25,2));
// wenn das Rennen bereits seit zwei Minuten vorbei ist werden die Zeiten errechnet
gelaufen = (renndatum.getTime() + 120000 < heuteGenau) ? true : false;
if (gelaufen) {
// Wenn es das Wort Dotation enthält, kann ausgelesen werden, ob es sich um ein Sieglosenrennen für 3-jährige handelt = Bug im Spiel umgehen)´
if (alleDunkel[indexDunkel+1].childNodes[2].nodeValue.indexOf("Dotation")>-1) {
sieglos3j = alleDunkel[indexDunkel+1].childNodes[1].childNodes[0].nodeValue.indexOf("Sieglose 3j.");
maiden = alleDunkel[indexDunkel+1].childNodes[1].childNodes[0].nodeValue.indexOf("2j.");
}
// Renndistanz ermitteln
txt = alleDunkel[indexDunkel+2].childNodes[0].nodeValue;
distanz = parseFloat(txt.substr(txt.indexOf("Distanz")+8,4))/1000;
// alle Kalenderelemente durchlaufen
for (index = 0; index < alleKalender.length; index = index + 6) {
// falls das Pferd distanziert ist, wird es ausgelassen
txt = alleKalender[index].childNodes[1].childNodes[0].nodeValue;
if (txt.indexOf("dis.")>-1) {
continue;
} else {
platzierung = txt;
}
// Zelle mit Pferddetails
txt = Verbinden(index + 1,alleKalender);
// anderes Mindestgewicht bei Stuten
if (txt.indexOf("Stute")>-1) {
grundgewicht = 48;
} else {
grundgewicht = 50;
}
// Alter ermitteln
alter = parseFloat(txt.substr(txt.indexOf("j.")-2,2));
// Differenz in Jahren vom Renntermin bis zum aktuellen Alter (wochen wird abgezogen um das Geburtsdatum auf den Jahreswechsel zu legen)
diffjahre = Math.floor((((renndatum.getTime()-(heute2-wochen))/86400000)/48));
// Errechnung des Rennalters (diffjahre ist ein negativer Wert, deshalb Addition)
rennalter = alter + diffjahre;
if (!rennalter && !bool) {
$(alleDunkel[indexDunkel+1]).append("<br><b style ='color:#DD0000'>Rennzeiten werden eventuell falsch berechnet, weil Pferde tot sind.</b>");
bool = true;
}
// wenn das Rennalter 2 oder 3 ist, wird der Bonus entsprechend festgeschrieben
if (rennalter == 2 || maiden>-1) {
bonus = 2;
} else if (rennalter == 3) {
bonus = 0.5;
} else {
bonus = 0;
}
// Das Gewicht auslesen
gewicht = parseFloat(alleKalender[index + 1].childNodes[3].childNodes[0].childNodes[0].nodeValue);
// Zelle mit Rennzeit
txt = Verbinden(index + 5,alleKalender);
// Abstand ist standardmäßig 0
abstando = 0;
abstandu = 0;
// beim ersten Pferd die Rennzeit auslesen
if (index === 0) {
zeit = parseFloat(txt.substr(txt.indexOf(":")-1,1))*60+parseFloat(txt.substr(txt.indexOf(":")+1,5).replace(",","."));
oben = zeit;
unten = zeit;
} else { // bei allen anderen, den Abstand ermitteln
if (txt.indexOf("Längen")>-1) { // bei mehreren Längen Unterschied
abstandu = laengen+0.01+((parseFloat(txt.substr(txt.indexOf("Längen")-3,2))-2)*laengen);
abstando = abstandu+laengen-0.01;
} else if (txt.indexOf("Länge")>-1) { // bei einer oder weniger als einer Länge Unterschied
// Art der Länge ermitteln (1, 1/2, 1/4)
art = parseFloat(txt.substr(txt.indexOf("Länge")-2,1));
switch (art) {
case 1:
abstandu = laenge;
abstando = laengen;
break;
case 2:
abstandu = halb;
abstando = laenge-0.01;
break;
case 4:
abstandu = viertel;
abstando = halb-0.01;
break;
}
} else if (txt.indexOf("Hals")>-1) { // bei einem Hals Unterschied
abstandu = hals;
abstando = viertel-0.01;
} else if (txt.indexOf("kurzer Kopf")>-1) { // beim kurzem Kopf
abstandu = kurz;
abstando = kopf-0.01;
} else if (txt.indexOf("Kopf")>-1) { // bei einem Kopf
abstandu = kopf;
abstando = hals-0.01;
} else if (txt.indexOf("Nase")>-1) { // bei einer Nasenlänge
abstandu = nase;
abstando = kurz-0.01;
}
}
oben = oben + abstando;
unten = unten + abstandu;
// vorsichtshalber wird die Endzeit auf 0 gesetzt
endzeito = 0;
endzeitu = 0;
// Wenn es ein Sieglosenrennen für 3-jährige ist, wird der Bonus ignoriert
if (sieglos3j>-1) {
endzeito = (oben/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
endzeitu = (unten/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
}
else {
// Bei der Berechnnug wird berücksichtigt, dass sich die Steigung scheinbar ändert, je mehr Gewicht das Pferd trägt (steigungSteigung)
endzeito = (oben/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
endzeitu = (unten/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
}
endzeito = Math.round(endzeito*100)/100;
endzeitu = Math.round(endzeitu*100)/100;
// Eintragen der Endzeit
farbe = (!rennalter) ? "; color:#DD0000" : "";
temp = "<br></b><b style ='font-size: 12px" + farbe + "'> 1:";
if (endzeitu < 10) {
temp = temp + "0" + endzeitu.toString();
} else {
temp = temp + endzeitu.toString();
}
if (endzeitu == Math.floor(endzeitu)) {
temp = temp + ",00";
} else if (endzeitu*10 == Math.floor(endzeitu*10)) {
temp = temp + "0";
}
// temp = temp.replace(".",",");
if (endzeitu != endzeito) {
temp = temp + "/km -<br>1:";
if (endzeito < 10) {
temp = temp + "0" + endzeito.toString();
} else {
temp = temp + endzeito.toString();
}
if (endzeito == Math.floor(endzeito)) {
temp = temp + ",00";
} else if (endzeito*10 == Math.floor(endzeito*10)) {
temp = temp + "0";
}
}
temp = temp + "/km";
// Punkte durch Kommas ersetzen
temp = temp.replace(/\./g,",");
// temp2 enthält die aktuelle Zelle und davon das erste Kindelement (erste Zeile = Platzierung)
cName = (alleKalender[index].className === "kalender") ? "kalender" : "kalender2";
tempIndex = (alleKalender[index].className === "kalender") ? index1=index1+6 : index2=index2+6;
temp2 = $("td." + cName)[tempIndex];
// Eintragen der RZ hinter die Platzierung
$(temp2).append(temp);
// eigene Pferde einfärben;
if (stall.indexOf(alleKalender[index+3].childNodes[5].childNodes[0].nodeValue)>-1) {
for (i = tempIndex-5; i <= tempIndex; ++i) {
temp2 = $("td." + cName)[i];
$(temp2).css("backgroundColor", "#FFFFFF");
}
}
}
}
}
}
// alle Elemente mit Klasse Dunkel
var alleDunkel = document.getElementsByClassName("dunkel");
// falls ich mal was in den Background schreiben will (warum ich das sollte, weiß ich noch nicht)
var toBackground = {};
// Zähler für for-Schleife
var index;
// Hilfsvariabeln
var temp;
var temp2;
var txt;
var i;
// Stall nur ermitteln, wenn man nicht zu schnell geklickt hat
if (document.body.innerText!="So schnell wie du klickst, kannst du garnicht lesen.") {
// Rennstall ermitteln
var stall = $("td")[6].childNodes[0].nodeValue;
}
if (document.URL.indexOf("ranking")>-1) { // falls das Ranking betrachtet wird
var anfang = 1;
var ende = 4;
i = (document.URL.indexOf("p2=pferde")>-1) ? 1 : 3;
for (index = i; index <= alleDunkel.length; ++index) {
// enthält Inhalt von Dunkel
if (typeof alleDunkel[index] == "undefined") {
continue;
}
txt = (!alleDunkel[index].childNodes[0].nodeValue) ? alleDunkel[index].childNodes[0].childNodes[0].nodeValue : "";
if (document.URL.indexOf("p2=pferde")==-1) { // wenn es nicht das Pferderanking ist
if (txt != "" && stall.indexOf(txt)>-1) { // wenn txt der Stallname ist
if (document.URL.indexOf("personal")>-1) { // wenn es das Personal-Ranking ist
anfang = 3; // fange beim dritten Element an
ende = (document.URL.indexOf("reiter")>-1) ? 2 : 1; // Ende entweder 2 später (Reitersieg/-platz) oder 1 später (Jockey/ Trainer)
} else if (document.URL.indexOf("gestuet")>-1) { // fürs Gestütsranking
ende = 1;
if (document.URL.indexOf("pferdewert")>-1 || document.URL.indexOf("wertdurch")>-1) { // falls es nicht die Zuchtwertung ist
ende = 2;
}
} else if (document.URL.indexOf("p2=spieler&liga=1")>-1) { // für die Jahreswertung
ende = 5;
}
temp = index;
for (index = index-anfang; index <= temp+ende; index++) { // durchlaufen aller Dunkel-Elmente der Zeile und verdunkeln, wenn es der Stall ist
temp2 = $("td.dunkel")[index];
$(temp2).css("backgroundColor", "#F1E6C7");
}
}
} else { // wenn es das Pferderanking ist
if (!(alleDunkel[index].childNodes[3]==null)) {
besitzer = (!(alleDunkel[index].childNodes[14]==null)) ? alleDunkel[index].childNodes[14].text : ""; // besitzer festlegen, wenn nicht unbekannt
züchter = (!(alleDunkel[index].childNodes[18]==null)) ? alleDunkel[index].childNodes[18].text : ""; // züchter festlegen, wenn nicht unbekannt
temp = index;
for (index = index-anfang; index <= temp; index++) { // dunkel-Elemente durchlaufen
temp2 = $("td.dunkel")[index];
if (stall.indexOf(besitzer)>-1 && besitzer!=="") { // falls man der Besitzer ist verdunkeln
$(temp2).css("backgroundColor", "#F1E6C7");
} else if (stall.indexOf(züchter)>-1 && züchter!=="") { // falls man der Züchter ist verdunkeln
$(temp2).css("backgroundColor", "#F1E6C7");
}
}
}
}
}
}
// Variablen definieren
var i;
var j;
var txt;
var color;
var bool=false;
var anzahlGebaeude = 0;
var maschinen = 0;
var hausmeister;
var aGehalt;
var loyalität;
var gehalt;
if (document.URL.indexOf("gebaeude")>-1) {
// alle Bilder auswerten
var alleBilder = $("img").map(function() {
return $(this).attr("src");
});
// alle Bilder checken, ob sie gebaute Gebäude sind
for (i=0; i<alleBilder.length; i++) {
if (alleBilder[i].indexOf("voll")>-1) {
anzahlGebaeude++;
}
}
// alle tds auswerten
var alleTds = $("td").map(function() {
return $(this).attr("align");
});
// checken ob ts das Attribut center hat
for (i=0; i<alleTds.length; i++) {
if (alleTds[i]=="center") {
// Linktext der Gebäudekategorie rausschreiben, wenn nicht undefiniert
linktext = (!($("td")[i].childNodes[1]==null)) ? $("td")[i].childNodes[1].text : "";
// Wenn es Kategorie Maschinen ist
if (linktext=="Maschinen") {
// alle drei möglichen Maschinen durchlaufen
for (j=0; j<3; j++) {
// Wenn gebaut, dann maschinen hochzählen
if ($("td:eq("+i+") img").eq(0).attr("src").indexOf("voll")>-1) {
maschinen++;
}
}
}
}
}
// Anzahl benötigter Hausmeister errechnen
hausmeister = Math.ceil(anzahlGebaeude/10)-maschinen*2
// benötigte Anzahl reinschreiben
$("tbody:eq(5)").append("<tr align='center'><td colspan='4' style='font-size: 10pt; text-align: center;'><br>Du benötigst <u><b>"+hausmeister+" Hausmeister</b></u> um keine Renovierungskosten zu haben.</td></tr><tr><td><br></td></tr>");
} else if (document.URL.indexOf("personalprofil")>-1) { // Gehalt des Personals errechnen
// alle Elemente mit Klasse Dunkel
var alleDunkel = document.getElementsByClassName("dunkel");
// alle tds bezüglich Attribut Weite auswerten
var alleTds = $("td").map(function() {
return $(this).attr("width");
});
// alle td-Elemente durchlaufen
for (i=0; i<alleTds.length; i++) {
// alle td-Elemente, die eine Weite von 10% haben
if (alleTds[i]=="10%"&&!bool) {
// Loyalität ermitteln, wenn vorhanden
loyalität = (!($("td")[i].childNodes[0]==null)) ? parseFloat($("td")[i].childNodes[0].nodeValue) : "";
// Spalte mit Personalinformationen auswerten (Alter, Dabei seit/ Arbeitgeber, Lohn)
aGehalt = Verbinden(1,alleDunkel);
// falls es kein eigener Jockey ist, wird die Schleife beendet
if (aGehalt.indexOf("Arbeitgeber")>-1) {
break;
}
// Gehalt aus dem Text ermitteln (beachten, dass der Punkt bei mehr als 1.000 Gehalt ersetzt werden muss - zur Sicherheit auch das Komma durch einen Punkt => JS ist englisch)
aGehalt = parseFloat(aGehalt.substring(aGehalt.indexOf("Lohn")+5,aGehalt.length-7).replace(".","").replace(",","."));
// optimales Gehalt errechnen
gehalt = Math.ceil(aGehalt/loyalität*100);
// Farbe des Textes festlegen
if (aGehalt<gehalt) {
// Rot, falls zu wenig Gehalt
color="#DD0000";
} else if (aGehalt==gehalt) {
// Schwarz für perfekt
color="#000000";
} else if (aGehalt>gehalt) {
// Grün, wenn zu viel
color="#228B22";
}
// eintragen des Textes in die Zelle für Personalinformationen
txt = "<br><b style='color:"+color+"'>Das optimale Gehalt beträgt "+gehalt+"€.</b>"
$(alleDunkel[1]).append(txt);
// verhindern, dass weitere TDs ausgewertet werden
bool=true;
}
}
}