AggregatBoerse

Aus Horizon
Wechseln zu: Navigation, Suche

Dieses GreaseMonkey Script ändert die Ansicht der Aggregat-Börse. Zunächst mal können eigene Gebote ausgeblendet werden. Dann können die Gebote von Freunden ausgeblendet werden oder es kann der Biete-Knopf entfernt werden. Als letztes wird jedes Angebot bewertet und endsprechend markiert oder auch hervorgehoben.

Konfigurationsmöglichkeiten[Bearbeiten]

Allgemeine Konfiguration. Zum Ändern einfach das "true" in ein "false" ändern, dann wird diese Option abgeschaltet.

var hideOwnBids = true;              // eigene Angebote auch ausblenden 
var hideBidSymbolIfBuddyBids = true; // Buddies haben keinen Biete-Button
var hideRowIfBuddyBids = true;       // Buddies werden zeilenweise ausgeblendet

Buddy-Liste[Bearbeiten]

Als nächstes kann/muss die Buddy-Liste definiert werden:

// Liste der Buddies. Für einen weiteren Eintrag einfach die letzte Zeile kopieren und den Namen austauschen.
var Buddies = new Array();
Buddies['Freund1'] = true;
Buddies['Freund2'] = true;

Ersetze einfach Freund1 durch deinen ersten Buddy, Freund2 durch den 2. Buddy. Wenn du keine Buddies hast lösche beide Zeilen, wenn du mehr Freunde hast dann füge noch Zeilen hinzu.

Hervorhebung von besonderen Aggregaten[Bearbeiten]

Zunächst werden die Besonderheiten definiert und es wird ein Preisfaktor angegeben. Siehe dazu auch die Beispiele und die Inline-Dokumentation. Wie oben: wenn du eine Zeile nicht brauchst lösche sie vollständig, wenn du mehr Zeilen brauchst füge welche hinzu und ändere sie entsprechend ab. Die Zeile mit "Vorlage" muss immer erhalten bleiben und der Faktor sollte auch auf 1 bleiben.

var SpecialAggSuche = new Array();
SpecialAggSuche['Vorlage']   = '1';
SpecialAggSuche["Kee'laak+Genauigkeit"] = '0+10000000';
SpecialAggSuche['Bernstein']  = '3';

Hier kann die Sondersuche abgeschaltet werden

var makeRegExpFromString = true;  // besondere Suche benutzen

Und hier kann die Farbe definiert werden, mit dem der Hintergrund der Spalte "Mindestgebot" eingefärbt wird:

var SpecialColor = "#808080";     // Farbwert für durch Sondersuche gefundene Aggregate

Preisberechnung[Bearbeiten]

Generell wird ein Preis wie folgt berechnet:
Qualität*Farbstufenfaktor*Farbwertefaktor*Rassefaktor*Typenfaktor
Zunächst werden die Preise für die Qualitäten definiert:

PriceA['Verbrauchter']     = 500000;
PriceA['Beschädigter']     = PriceA['Verbrauchter']*3;
PriceA['Einfacher']        = PriceA['Beschädigter']*3;
PriceA['Normaler']         = PriceA['Einfacher']*3;
PriceA['Guter']            = PriceA['Normaler']*3;
PriceA['Fabrikneuer']      = PriceA['Guter']*3;
PriceA['Verbesserter']     = PriceA['Fabrikneuer']*3;
PriceA['Hervorragender']   = PriceA['Verbesserter']*3;
PriceA['Perfekter']        = PriceA['Hervorragender']*3;
PriceA['Göttlicher']       = PriceA['Perfekter']*3;
PriceA['Dämonischer']      = Math.ceil(PriceA['Verbrauchter']/3);
PriceA['Verfluchter']      = Math.ceil(PriceA['Dämonischer']/3);
PriceA['Fragmentarischer'] = Math.ceil(PriceA['Verfluchter']/3);

Als Standard im Script wird für eine Qualtität "Verbrauchter" 500'000 Aktien als Wert angenommen. Jede Stufe darüber wird mit Faktor 3 multipliziert weil ja 3 gleiche Qualtitäten benötigt werden um die nächste Qualität zu erzeugen. Darunterliegende Qualitäten werden dementsprechend auf 1/3 gesetzt.
Als nächstes werden die Farbstufenfaktoren definiert:

// Faktoren für die Preise je Farbstufe (Hell, Normal, Dunkel, Perfekt)
var farbstufenfaktor = new Array(1, 2, 4, 8);

Dazu gibt es nicht viel zu sagen - ein Normaler darf doppelt soviel kosten wie ein Heller...
Anschliessend kommen noch die ganzen anderen Faktoren - tragt hier wieder jeweils einen Faktor ein. Dezimaltrennzeichen ist der Punkt: 1.56 zum Beispiel.


// Faktoren für die Preise für die Farbwerte selber
var farbwertefaktor = new Array();
farbwertefaktor['Grün']    = 1;
farbwertefaktor['Rot']     = 1;
farbwertefaktor['Blau']    = 1;
farbwertefaktor['Gelb']    = 1;
farbwertefaktor['Orange']  = 1;
farbwertefaktor['Violett'] = 1;

// Faktoren für die Preise je Rasse
var rassefaktor = new Array();
rassefaktor['Diggren']  = 1;
rassefaktor["Kee'laak"] = 1.3;
rassefaktor['Sciweens'] = 1;
rassefaktor['Quipgrex'] = 1;
rassefaktor['Nux']      = 1;

// Faktoren der Preise je Typ
var typenfaktor = new Array();
typenfaktor['Protektor']     = 1;
typenfaktor['Rekonstruktor'] = 1;
typenfaktor['Prokurator']    = 1;
typenfaktor['Interocitor']   = 1;
typenfaktor['Inkubator']     = 1;
typenfaktor['Absorbator']    = 1;
typenfaktor['Infiltrator']   = 1;
typenfaktor['Propulsor']     = 1;
typenfaktor['Konstruktor']   = 1;
typenfaktor['Stabilisator']  = 1;
typenfaktor['Deflektor']     = 1;
typenfaktor['Reaktor']       = 1;
typenfaktor['Generator']     = 1;

Als Abschluss die Farbdefinition:

// die HTML-Codes für die Farben:
var PriceAColor = "#669966";	        // grün
var AggPriceNormalColor = "#CC9933";	// gelb
var AggPriceExpensiveColor = "#CC3333";	// rot
var AggPriceNormalMultiplier = 0.75;    // ab wann soll aus grün gelb werden?

Beispiel[Bearbeiten]

1.[Bearbeiten]

Fragmentarischer Roter Nux Absorbator, Mindestgebot 20'521
Kostenberechung: Fragmentarisch (Verbraucht=500'000->Dämonischer/3=166'667->Verfluchter/3=83'333->Fragmentarischer/3=55'556
Farbstufenfaktor ist 2, da die Farbe "normal" ist
Farbwertefaktor für 'Rot' ist 1
Rassefaktor für Nux ist auch 1
Typenfaktor für Absorbator ist auch 1
Der Preis darf also sein: 55'556*2*1*1*1=111'111
Mit 20'521 von 111'111 liegen wir bei 18%.
Wegen "AggPriceNormalMultiplier = 0.75; // ab wann soll aus grün gelb werden?" ist der Preis noch grün (111'111*0.75=83'333 und 83'333>20'521).

2.[Bearbeiten]

Fragmentarischer Roter Kee'laak Absorbator, Mindestgebot 183'564
Kostenberechung: Verfluchter (Verbraucht=500'000->Dämonischer/3=166'667->Verfluchter/3=83'333
Farbstufenfaktor ist 2, da die Farbe "normal" ist
Farbwertefaktor für 'Rot' ist 1
Rassefaktor für Kee'laak ist 1.3
Typenfaktor für Absorbator ist auch 1
Der Preis darf also sein: 83'333*2*1*1.3*1=216'667
Mit 183'564 von 216'667 liegen wir bei rund 85%.
Wegen "AggPriceNormalMultiplier = 0.75; // ab wann soll aus grün gelb werden?" ist der Preis gelb (216'667*0.75=162'500 und 162'500<183'564).

3.[Bearbeiten]

Fragmentarischer Roter Kee'laak Absorbator der Genauigkeit, Mindestgebot 183'564
Kostenberechung: Verfluchter (Verbraucht=500'000->Dämonischer/3=166'667->Verfluchter/3=83'333
Farbstufenfaktor ist 2, da die Farbe "normal" ist
Farbwertefaktor für 'Rot' ist 1
Rassefaktor für Kee'laak ist 1.3
Typenfaktor für Absorbator ist auch 1
Der Preis darf also sein: 83'333*2*1*1.3*1=216'667
Weil aber die Sonderregelung SpecialAggSuche["Kee'laak+Genauigkeit"] = '0+10000000'; zutrifft liegt der Preis bei: 216'667*0+10'000'000=10'000'000
Mit 183'564 von 10'000'000 liegen wir bei rund 2%.
Wegen "AggPriceNormalMultiplier = 0.75; // ab wann soll aus grün gelb werden?" ist der Preis grün (10'000'000*0.75=7'500'000 und 7'500'000>183'564).
Zusätzlich wird das Mindestangebot dunkelgrau hinterlegt da es sich um eine Sonderregelung handelt..

Code[Bearbeiten]

// ==UserScript==
// @name           Aggregatebörse
// @namespace      Horiversum
// @description    gibt zusatzinformationen zu den Aggregaten in der Börse
// @include 	   *horiversum.org/game/main/main.php?cmd=trade*
// Version 0.2b
// ==/UserScript==

//Settings:(nur hier was verändern)
var hideOwnBids = true;         // eigene Angebote auch ausblenden 
var hideBidSymbolIfBuddyBids = true; // Buddies haben keinen Biete-Button
var hideRowIfBuddyBids = true;        // Buddies werden zeilenweise ausgeblendet
// Liste der Buddies. Für einen weiteren Eintrag einfach die letzte Zeile kopieren und den Namen austauschen.
var Buddies = new Array();
Buddies['Freund1'] = true;
Buddies['Freund2'] = true;

/**
 * Hier können Suchbegriffe für die besondere Heraushebung eingetragen werden
 * Auf Rechtschreibung muss geachtet werden, auf Groß- und Klein-Schreibung nicht
 * zur Erläuterung: "+" ist ein "und"
 * wenn ihr zB. Diggen des Überfluss Aggs besonders herausgehoben haben wollt:
 * "Diggen+Überfluss" (das "des" wird weggelassen) oder "Roter+Überfluss" - sowas geht
 * Aufpassen das keine Leerzeichen vorkommen.
 * hinter dem = kommt ein Ausdruck mit dem man den Preis berechnen kann. Dieser Ausdruck
 * wird mit * an den aktuellen errechneten Preis angehängt.
 * nimmt man also die Vorlage so wird der Preis errechnet: neuer Preis = alter Preis * 1
 * Will man den alten Preis verwerfen so schreibt man z.B. 0+300000 . Gerechnet wird dann:
 * neuer Preis = alter Preis * 0+300000
 * der neue Preis wird also 300000 sein.
 **/
var SpecialAggSuche = new Array();
SpecialAggSuche['Vorlage']   = '1';
SpecialAggSuche["Kee'laak+Genauigkeit"] = '0+10000000';
SpecialAggSuche['Bernstein']  = '3';
var makeRegExpFromString = true;  // besondere Suche benutzen
var SpecialColor = "#808080";     // Farbwert für durch Sondersuche gefundene Aggregate

// Definition der Preise pro Qualität
var PriceA = new Array();
PriceA['Verbrauchter']     = 500000;
PriceA['Beschädigter']     = PriceA['Verbrauchter']*3;
PriceA['Einfacher']        = PriceA['Beschädigter']*3;
PriceA['Normaler']         = PriceA['Einfacher']*3;
PriceA['Guter']            = PriceA['Normaler']*3;
PriceA['Fabrikneuer']      = PriceA['Guter']*3;
PriceA['Verbesserter']     = PriceA['Fabrikneuer']*3;
PriceA['Hervorragender']   = PriceA['Verbesserter']*3;
PriceA['Perfekter']        = PriceA['Hervorragender']*3;
PriceA['Göttlicher']       = PriceA['Perfekter']*3;
PriceA['Dämonischer']      = Math.ceil(PriceA['Verbrauchter']/3);
PriceA['Verfluchter']      = Math.ceil(PriceA['Dämonischer']/3);
PriceA['Fragmentarischer'] = Math.ceil(PriceA['Verfluchter']/3);

// Faktoren für die Preise je Farbstufe (Hell, Normal, Dunkel, Perfekt)
var farbstufenfaktor = new Array(1, 2, 4, 8);

// Faktoren für die Preise für die Farbwerte selber
var farbwertefaktor = new Array();
farbwertefaktor['Grün']    = 1;
farbwertefaktor['Rot']     = 1;
farbwertefaktor['Blau']    = 1;
farbwertefaktor['Gelb']    = 1;
farbwertefaktor['Orange']  = 1;
farbwertefaktor['Violett'] = 1;

// Faktoren für die Preise je Rasse
var rassefaktor = new Array();
rassefaktor['Diggren']  = 1;
rassefaktor["Kee'laak"] = 1.3;
rassefaktor['Sciweens'] = 1;
rassefaktor['Quipgrex'] = 1;
rassefaktor['Nux']      = 1;

// Faktoren der Preise je Typ
var typenfaktor = new Array();
typenfaktor['Protektor']     = 1;
typenfaktor['Rekonstruktor'] = 1;
typenfaktor['Prokurator']    = 1;
typenfaktor['Interocitor']   = 1;
typenfaktor['Inkubator']     = 1;
typenfaktor['Absorbator']    = 1;
typenfaktor['Infiltrator']   = 1;
typenfaktor['Propulsor']     = 1;
typenfaktor['Konstruktor']   = 1;
typenfaktor['Stabilisator']  = 1;
typenfaktor['Deflektor']     = 1;
typenfaktor['Reaktor']       = 1;
typenfaktor['Generator']     = 1;

// die HTML-Codes für die Farben:
var PriceAColor = "#669966";	        // grün
var AggPriceNormalColor = "#CC9933";	// gelb
var AggPriceExpensiveColor = "#CC3333";	// rot
var AggPriceNormalMultiplier = 0.75;    // ab wann soll aus grün gelb werden?

/************************************************************************
 * hier beginnt der Scriptteil - nur verändern wenn man weis was man tut.
*************************************************************************/
var farbwerte = new Array();
farbwerte['Rot']     = new Array('Hellroter', 'Roter', 'Tiefroter', 'Rubinroter');
farbwerte['Orange']  = new Array('Helloranger', 'Oranger', 'Tieforanger', 'Goldener');
farbwerte['Gelb']    = new Array('Blassgelber', 'Gelber', 'Dottergelber', 'Bernsteingelber');
farbwerte['Grün']    = new Array('Lindgrüner', 'Grüner', 'Dunkelgrüner', 'Smaragdgrüner');
farbwerte['Blau']    = new Array('Himmelblauer', 'Blauer', 'Dunkelblauer', 'Saphirblauer');
farbwerte['Violett'] = new Array('Hellvioletter', 'Violetter', 'Tiefvioletter', 'Amethystvioletter');

var farbenfaktor = new Array();
for (i in farbwerte) {  // rot, orange...
	for (j=0;j<farbstufenfaktor.length;j++) { // hell, normal, dunkel, perfekt
		farbenfaktor[farbwerte[i][j]] = farbwertefaktor[i]*farbstufenfaktor[j];
	}
}
var body = document.evaluate('//body', document, null, XPathResult.ANY_TYPE, null ).iterateNext();


// Zahlen formatieren
function format_number(number) {
	if (number.length>3) {
		var result = number.substr(number.length-3, 3);
		for (i=number.length-6; i>0; i-=3) {
			result = number.substr(i, 3)+"'"+result;
		}
		result = number.substr(0, i+3)+"'"+result;
	} else {
		var result = number;
	}
	return result;
}

// regular Expression definieren
function makeRegExp () {
  if (SpecialAggSuche) {
    var result = '(';
    for (var i in SpecialAggSuche){
      if (result != '(') result += ")|(";
	  result += i.replace(/\+/g,').*(');
   	}
	specialRegExp = new RegExp(result+')', "i");
  }
}

// Zeile ausblenden
function hideRow(nodes, index) {
	// damit die timer weiterlaufen wird am Ende ein neuer span mit der gleichen id eingefügt.
		// 7: counter <noscript>0:04:53:41s</noscript><script language="JavaScript">countDown("trade", "", 17621, "PA53868545", "Beendet");</script><div id="tagzeitPA53868545" onmouseover="return overlib('Ende: Morgen, 01:07:46', WIDTH, 160);" onmouseout="return nd()">
	var s = nodes[index].childNodes[7].innerHTML.split(",");	
	var newID = document.createElement('span');
	newID.setAttribute('id', s[3].replace(/[ "]*/g, ''));
	newID.setAttribute('type', 'hidden');
	body.appendChild(newID);

	if (typeof nodes[index].removeNode=='function') { //there is no removeNode() in Firefox
		nodes[index].removeNode(true);			
	} else {
		nodes[index].innerHTML = null;
	}
}

// wer bin ich?
var div = document.evaluate('//a[@class="ResName"]', document, null, XPathResult.ANY_TYPE, null );
var a = div.iterateNext();
if (a == null) {
	// ich konnte mich nicht finden!!
	alert('Cant find myself.');
	return;
}
var ownUserName = a.innerHTML;

// wir sammeln alle Aggregat-Zeilen in einem Array
var nodes = new Array();
var Bereich = null;
var div = document.evaluate('//div[@class="BldContainerHead"]', document, null, XPathResult.ANY_TYPE, null );
var subdiv = div.iterateNext();
//alert(subdiv.innerHTML);
if (subdiv != null) {
	while (subdiv!=null && subdiv.innerHTML.match("Aggregatb") == null) {
		subdiv = div.iterateNext();
	}
	//alert(subdiv.innerHTML);
	if (subdiv == null) {
		return;
	}
	if (subdiv.innerHTML.match("Aggregatb") != null) {
		Bereich = "Aggs";
		var tbl = document.evaluate('//table[@class="BldTable"]/tbody/tr', subdiv, null, XPathResult.ANY_TYPE, null );
		var tr = tbl.iterateNext(); // skip table header
		while (tr != null) {
		  nodes.push(tr);
		  tr = tbl.iterateNext();
		}
	}
}

// falls wir Aggregate gefunden haben
if (Bereich == "Aggs" && nodes != null) {
	if (makeRegExpFromString) makeRegExp();  // regulären Ausdruck basteln
	for (var j = 0; j < nodes.length; j++) { // Schleife über die Aggregate 
		if (nodes[j].childNodes.length < 15) {
			if (nodes[j].childNodes.length > 5) {
				nodes[j].childNodes[9].setAttribute("colspan", "2"); // expand table header
			}
			continue;
		}
		
		if ((nodes[j].childNodes[11].innerHTML  != "UNKNOWN") && 
			(nodes[j].childNodes[11].innerHTML  != " ") &&
			(nodes[j].childNodes[11].innerHTML  != false)) {
			if ((nodes[j].childNodes[11].innerHTML == ownUserName) && hideOwnBids) {
				hideRow(nodes, j);
				continue;
			} else if (Buddies[nodes[j].childNodes[11].innerHTML]) {
				if (hideRowIfBuddyBids) {		
					hideRow(nodes, j); 
					continue;
				} else if (hideBidSymbolIfBuddyBids) { 	
					nodes[j].childNodes[15].innerHTML = null;
				}
			}
		}
      
		var color = null;

		var a = nodes[j].childNodes[1].childNodes[0].getAttribute('alt').split(' ');
		var price = PriceA[a[0]]*farbenfaktor[a[1]]*rassefaktor[a[2]]*typenfaktor[a[3]];
		var s = farbenfaktor[a[1]];
		if (s=='Undefined') {
			alert('Undefined color: ' + a[1]);
		}
		if (isNaN(PriceA[a[0]])) alert('typ: '+a[0]);
		var mouseover = format_number(PriceA[a[0]].toString())+' * '+farbenfaktor[a[1]]+' * '+rassefaktor[a[2]]+' * '+typenfaktor[a[3]];
		var aktPreis = nodes[j].childNodes[13].innerHTML.replace(/\'/g,""); 
		
		if (makeRegExpFromString) {
			var special = nodes[j].childNodes[3].innerHTML.match(specialRegExp);
			if (special != null) {
				nodes[j].childNodes[13].setAttribute("style", "background-color:" + SpecialColor + ";");
				
				var s = ''+special;
				var sp = s.split(',');
				s='';
				for (i=1; i<sp.length; i++) {
					if (sp[i]!='') {
						if (s=='') {
							s = sp[i];
						} else {
							s += '+'+sp[i];
						}
					}
				}
				if (SpecialAggSuche[s]==null) {
					alert('Regular Expression not found: '+s);
				} else {
					price = eval(price+'*'+SpecialAggSuche[s]);
					mouseover = mouseover + ' * ' + SpecialAggSuche[s];
				}
			}
		}
		
		if (aktPreis <= price*AggPriceNormalMultiplier){
			color = PriceAColor;
		} else if (aktPreis <= price){
			color = AggPriceNormalColor;
			
		} else { 
			color = AggPriceExpensiveColor;
		}
		mouseover = format_number(Math.ceil(price).toString())+' = '+ mouseover;
		var newNode = nodes[j].childNodes[13].cloneNode(false);
		nodes[j].childNodes[13].setAttribute('width','85');
		newNode.setAttribute('width', '17');
		newNode.setAttribute('title', mouseover);
		newNode.innerHTML = Math.ceil(aktPreis*100/price)+'%';
		nodes[j].insertBefore(newNode, nodes[j].childNodes[15]);
		nodes[j].childNodes[15].setAttribute("style", "background-color:" + color + ";");  
	}
}
nodes = null;