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; } } }