View Full Version : Flugkosten
Wie kann ich die Flugkosten in einem Sektor abfragen? Und falls das nicht geht:
Wie kann ich herausfinden, oder der sich Sektor im normalen, leeren oder "total leeren" Raum befindet (Verdoppelung/Verdreifachung der Flugkosten)?
lg
Elchi
HerrKoch
24-07-2012, 18:10
Willst du das Feld in dem du dich befindest abfragen, oder ein x-beliebiges nebenan?
Jedes x-beliebige, ich möchte nämlich einen Navigationssystem proggen.
HerrKoch
25-07-2012, 16:39
Also du könntest dir über den CSector die Koords nehmen und dann mit EGalaxyMapItemType das Feld ermitteln. Dann haste dir ne Liste erstellt mit den Einflugkosten und könntest das Regeln. So könntest du ggf. aufn grünen Zweig kommen. Das wäre dann dein zweiter Weg den du vorgeschlagen hast.
Deswegen meine zweite Frage:
Kann ich irgendwie einfach gucken ob ich mich im leeren Raum befinde?
HerrKoch
25-07-2012, 21:21
Schiffsobjekt heißt jetzt mal Ship.
Ship.GalaxyMapItem.Type
müsste dir eigentlich den Typ des aktuellen Feldes ausgeben. (istn Enum --> http://game.stne.net/objectexplorer?p=E ... apItemType (http://game.stne.net/objectexplorer?p=EGalaxyMapItemType) )
ansonsten
Ship.Sector.Type --> biste wieder bei dem Enum von oben.
Die würden mir auf anhieb einfallen.
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
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;
}
ja vielen Dank, meinte aber eig. die Bestimmung der Voidzonen
lg
Elchi
Var map As New CHtmlGalaxyMap(SMap.Default, SPoint.FromString("522|489"), 1, 1);
WriteLine(map.item(522, 489).HexColor);
Script gestartet.
#555555
Script beendet.
heißt wenn die farbe der umrandung #555555 ist steht man im void
im void fliegen kostet doppelte gondeln
nen normaler sektor hat #333333
da voidzonen auch andere farben haben können solltest du nur überprüfen ob es nen normaler sektor also hexcolor #333333 ist alles andere is void
ps. die CHtmlGalaxyMap kann man auch anzeigen lassen
Var map As New CHtmlGalaxyMap(SMap.Default, SPoint.FromString("522|489"), 1, 1);
if(map.item(522, 489).HexColor = "#333333") {
//normaler sektor
} else {
//void
}
Powered by vBulletin® Version 4.2.2 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.