für jeden der wissen will wie die flugkosten unter 0 und die flugreichweite berechnet werden
falls du oder jeder andere die flugkosten auch im negativen gondelbereich(mit overdrive) berechnen willst hier sind die funktionen so wie sie auch in stne verwendet werden
hab sie nur etwas verändert, sodass sie direkt im scriptsystem verwendet werden können
kleine Info zur CMyShip-Klasse
CMyShip.Gondola sind die aktuellen Gondeln
CMyShip.FlightRange is die max Reichweite in abhängigkeit der energie/eps
CMyShip.Definition.FlightRange sind die max Gondeln
man kann ganz einfach überprüfen ob der overdrive aktiviert bzw nutzbar ist
und zwar wenn die reichweite größer ist als die aktuellen Gondeln
mit dieser funtkion können die flugkosten berechnet werden wenn man x gondeln bei y gondeln übrig verwendet werden, dies funtkioniert sowohl mit als auch ohne overdrive
Funktion wird so verwendet:
var kosten as double = calcGondelnBenutzenFlugkostenFaktor(gondel, gondelnBenutzen, gondelMax) * flugkostenDesSchiffs;
- gondel sind die aktuellen gondeln
- gondelnBenutzen sind die anzahl der gondeln die du benutzen willst (wenn du zb 5 normale felder fliegst muss da 5 rein und wenn du zb durch 2 normale und ein dünnen deut fliegst kommt da 4 rein)
achtung in orbit ein-/ausfliegen kosten nur noch nen 20stel der gondelkosten also normaler plani 0.05 , klasti 0.10 und grasti 0.15
wieviele gondeln man insgesamt verwenden kann kriegt man ganz einfach durch die max reichweite raus also CMyShip.FlightRange
- gondelMax sind die max gondeln
falls man ein schiff im traktor hat:
var kosten as double = calcGondelnBenutzenFlugkostenFaktor(gondel, gondelnBenutzen * gondelnVerbrauchPerFeld , gondelMax) * (flugkostenDesSchiffs + flukostenSchiffimTraktor) / gondelnVerbrauchPerFeld;
- gondelnVerbrauchPerFeld = (slotsSchiff + slotSchifimTraktor) / slotsSchiff
auch wenn man normal sieht das man weniger gondeln/max gonden mit traktor hat, dies ist in wahrheit nicht so sondern es werden einfach mehr gondeln pro feld verbraucht
Beispiel 1:
Schiff mit 10/60 gondeln soll 20 gondeln verbrauchen und hat 0.6 e flugkosten (sind werte von nem koloschiff falls jemand das mit nem schiff nachprüfen will)
var kosten as double = calcGondelnBenutzenFlugkostenFaktor(10, 20, 60) * 0.6;
WriteLine(kosten);//<- da wird genau 19,4202815282965 rauskommen
Beispiel 2:
Schiff mit 60/60 gondeln soll 115 gondeln verbrauchen und hat 0.6 e flugkosten (115 is max reichweite eines normalen vollem koloschiffs)
var kosten as double = calcGondelnBenutzenFlugkostenFaktor(60, 115, 60) * 0.6;
WriteLine(kosten);//<- da wird genau 148,312338408503 rauskommen
Beispiel 3:
Schiff mit 50/60 gondeln soll 6 gondeln verbrauchen und hat 0.6 e flugkosten (um mal nen beispiel ohne overdrive zu zeigen)
var kosten as double = calcGondelnBenutzenFlugkostenFaktor(50, 6, 60) * 0.6;
WriteLine(kosten);//<- da wird genau 3,6 rauskommen
als letztes is da noch eine funktion zur berechnung der max flugreichweite die brauchst du hier aber nicht, die is für die leute die zb ausrechnen wollen wie weit reicht ihr schiff mit tritkit oder bestimmten item/avatar was schiffswerte verändert ohne diese zu installieren oder um auszurechnen wie weit ihr shiff mit x energie/eps noch kommen wird
verwendung:
var reichweite as double = calcMaxRange(gondeln, gondelnVerbrauchPerFeld, energie, flugkosten, gondelMax);
- gondeln sind die aktuellen gondeln
- gondelnVerbrauchPerFeld dies wird für den traktorstrahl verwendet um die reichweite mit aktiviertem traktor zu berechnen (sonst immer 1)
wenn mit traktor is gondelnVerbrauchPerFeld = (slotsSchiff + slotSchifimTraktor) / slotsSchiff und die flugkosten sind dann die flugkosten der beiden schiffe zusammen
- energie eps/energie je nachdem wovon weniger vorhanden ist
- flugkosten flugkosten des shiffs
- gondelMax sind die max gondeln
Code:
Var KA As Double = 0.25;//konstanten
Var KC As Double = 0.25;
Var KB As Double = 1 - (KA + KC);
Var N As Double = 2;
Function calcGondelnBenutzenFlugkostenFaktor(gondel As Double, gondelnBenutzen As Double, gondelMax As Double) As Double
{
If (gondel > 0)
{
If (gondelnBenutzen > gondel)
{
Return gondel + calcGondelnBenutzenFlugkostenFaktorAlt(0, gondelnBenutzen - gondel, gondelMax);
}
Else
{
Return gondelnBenutzen;
}
}
Else
{
Return calcGondelnBenutzenFlugkostenFaktorAlt(gondel, gondelnBenutzen, gondelMax);
}
}
Function calcGondelnBenutzenFlugkostenFaktorAlt(gondel As Double, gondelnBenutzen As Double, gondelMax As Double) As Double
{
Var x As Double = Math.Max(N, gondelMax) - gondel + gondelnBenutzen;
Var y As Double = (x - 1) / Math.Max(1, gondelMax - 1);
Var faktor As Double = KA * y * y * x + KB * y * x + KC * x;
x = Math.Max(N, gondelMax) - gondel;
y = (x - 1) / Math.Max(1, gondelMax - 1);
faktor = faktor - (KA * y * y * x + KB * y * x + KC * x);
Return faktor;
}
Function calcMaxRange(gondeln As Double, gondelnVerbrauchPerFeld As Double, energie As Double, flugkosten As Double, gondelMax As Double) As Double
{
Var x As Double = 0;
Var xn As Double = 1;
Var b As Double;
Var c As Double;
Var d As Double;
Var g As Double;
Var y As Double;
Var gondel As Double = gondeln;
Var gondelverbrauch As Double = gondelnVerbrauchPerFeld;
Var energiefaktor As Double = energie / (flugkosten / gondelverbrauch);
Var i As Integer;
//if (overdrive) <- man kann per script nicht abrufen ob overdrive aktiviert/erforscht ist
If(True)
{
g = Math.Max(1, gondelMax - 1);
y = energiefaktor;
If(gondel > 0)
{
y = y - gondel;
}
If(gondel < 0)
{
y = y + calcGondelnBenutzenFlugkostenFaktorAlt(Math.Max(N, gondelMax), Math.Max(N, gondelMax) - gondel, gondelMax);
} Else {
y = y + calcGondelnBenutzenFlugkostenFaktorAlt(Math.Max(N, gondelMax), Math.Max(N, gondelMax), gondelMax);
}
b = (KB / KA) * g - 2;
c = (KC / KA) * g * g - (KB / KA) * g + 1;
d = (0 - g) * g * (y / KA);
x = (0 - 50);//<- der scriptparser erkennt keine negativen zahlen
For (i = 0 To 50)
{
xn = x - (x * x * x + b * x * x + c * x + d) / (3 * x * x + b * x + c);
If (Math.Abs(x - xn) < 0.00005)
{
x = xn;
Exit For;
}
x = xn;
}
If(gondel < 0)
{
x = (x - (Math.Max(N, gondelMax) - gondel)) / gondelverbrauch;
} Else {
x = (x - Math.Max(N, gondelMax)) / gondelverbrauch;
}
}
If (gondel > 0)
{
If (energiefaktor > gondel)
{
x = x + (gondel / gondelverbrauch);
}
Else
{
x = energiefaktor / gondelverbrauch;
}
}
Return x;
}