PDA

View Full Version : Flugkosten



Elchi
24-07-2012, 13:39
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?

Elchi
25-07-2012, 16:02
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.

Elchi
25-07-2012, 17:06
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.

four
08-11-2012, 04:01
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;
}

Elchi
09-11-2012, 18:00
ja vielen Dank, meinte aber eig. die Bestimmung der Voidzonen

lg
Elchi

four
09-11-2012, 20:07
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
}

Elchi
10-11-2012, 15:45
stimmt, danke

lg
Elchi