Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [34] [35] >> |
Autor |
Mitteilung |
|
verfasst am: 31.03.2010, 00:20 · Edited by: Imperator Orbis
|
Registrierdatum: 28.03.2010, 19:14
Beiträge: 9
|
Guten Abend zusammen,
ich wollte mal fragen, ob es eine Funktion gibt, die einen Wert des Typs TKD4Date in einen LongWord- oder Double-Wert konvertiert.
Sinn der Sache: Ich würde gerne Erfahren, wie viele Minuten (oder auch Tage) ich bereits laut der spielinternen Zeit verbracht habe.
Sicherlich könnte ich auch "ganz einfach" eine solche Funktion selbst schreiben, jedoch wird es etwas komplex, wenn man die einzelnen Tage im Monat, und auch die Schaltjahre (gibt es die überhaupt in X-Force?) miteinbezieht. Da wäre es doch sicher einfacher, eine vorgefertigte Funktion zu nutzen.
Mit freundlichen Grüßen
Imperator Orbis |
|
verfasst am: 31.03.2010, 13:42
|
Registrierdatum: 28.03.2010, 19:14
Beiträge: 9
|
Da ich weiterhin vergeblich nach einer solchen Funktion gesucht habe, habe ich nun selber eine geschrieben:
function TKD4DateToInt(DateTime : TKD4Date) : LongWord;
var
played_y, played_mon, played_d, played_h, played_min, i : Integer;
minutes : LongWord;
daysOfMonths : Array[0..11] of Integer;
begin
// Tage im Monat ins Array einbinden
daysOfMonths[0] := 31;
daysOfMonths[1] := 28;
daysOfMonths[2] := 31;
daysOfMonths[3] := 30;
daysOfMonths[4] := 31;
daysOfMonths[5] := 30;
daysOfMonths[6] := 31;
daysOfMonths[7] := 31;
daysOfMonths[8] := 30;
daysOfMonths[9] := 31;
daysOfMonths[10] := 30;
daysOfMonths[11] := 31;
// Gespielte Jahre/Monate/Tage berechnen
played_y := DateTime.Year - 2042;
played_mon := DateTime.Month - 1;
played_d := DateTime.Day - 1;
played_h := DateTime.Hour;
played_min := DateTime.Minute;
minutes := 0;
// Für jedes vollendete Jahr die Minuten zählen und addieren
i := 0;
while i < played_y do
begin
// Prüfen, ob gerade ein Schaltjahr berechnet wird
if ((i+2) mod 4 = 0) then
minutes := minutes + (366 * 1440)
else
minutes := minutes + (365 * 1440);
inc(i);
end;
// Prüfen, ob es sich aktuell um ein Schaltjahr handelt
if ((played_y + 2) mod 4 = 0) then
daysOfMonths[1] := 29
// Für jeden vollendeten Monat die Minuten zählen
i := 0;
while i < played_mon do
begin
minutes := minutes + (daysOfMonths[i] * 1440);
inc(i);
end;
// Die Minuten der beendeten Tage des Monats berechnen
minutes := minutes + (played_d * 1440) ;
// Die Minuten der beendeten Stunden des Tages berechnen
minutes := minutes + (played_h * 60);
// Die aktuellen Minuten des Tages addieren
minutes := minutes + played_min;
// Da das Spiel erst am 06.01.2042 beginnt, werden nochmal 5 Tage abgezogen
minutes := minutes - 7200;
Result := minutes;
end;
Vielleicht könnte man diese Funktion ja serienmäßig in die nächste Version des Editors einbinden. ;-)
Mit freundlichen Grüßen
Imperator Orbis |
|
verfasst am: 31.03.2010, 17:01
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Von mir aus gerne, aber bitte nicht so. Mindestens so clever sollte sie schon sein ;)
function TKD4DateToTimestamp(DateTime : TKD4Date) : LongWord;
var
y, mon, min, i: LongWord;
daysPerMonth: Array[0..11] of byte;
begin
daysPerMonth:= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
min := DateTime.Minute;
// Für jedes vollendete Jahr die Minuten zählen und addieren
for i:=0 to (DateTime.Year-2042) do
begin
min:= min + 365 * 1440;
// wenn Schaltjahr, +1 Tag für 29.2.
if (i mod 4 = 0) then
begin
min:= min + 1440;
end;
end;
// Für jeden vollendeten Monat die Minuten zählen
for i:=0 to (DateTime.Month - 1) do
begin
min:= min + (daysPerMonth[i] * 1440);
end;
// wenn Monat Februar vorbei und Schaltjahr, + 1 Tag wg. 29.2.
if (DateTime.Month > 2 and (DateTime.Year-2042) mod 4 = 0) then
begin
min:= mind + 1440;
end;
// Minuten der beendeten Tage des Monats
min:= min + (DateTime.Day - 1) * 1440;
// Minuten der beendeten Stunden des Tages
min:= min + DateTime.Hour * 60;
// Da das Spiel erst am 06.01.2042 beginnt, werden nochmal 5 Tage abgezogen
min:= min - 7200;
Result := min;
end;
Variablen, die nur ein-, zweimal verwendet werden, habe ich eliminiert. Bei den Schaltjahren war ein Fehler drin, glaube ich - Schaltjahr ist doch, wenn Jahr mod 4 = 0 statt Jahr+2 mod 4 = 0? Außerdem habe ich die verbleibenden Variablen umbenannt, played_min und minutes vereinigt und einige überflüssige Klammern eliminiert (Punkt vor Strich). Und daysPerMonth wird jetzt in eine Schritt gesetzt und nicht verändert, stattdessen wird +1 Tag gerechnet, wenn Schaltjahr. |
|
verfasst am: 31.03.2010, 19:12
|
Registrierdatum: 28.03.2010, 19:14
Beiträge: 9
|
In Ordnung, das Füllen des Arrays ist ein Anfängerfehler, sehe ich ein. Die überflüssigen Variablen kommen von meinem Tick, übergebene Variablen nicht direkt zu verwenden, sondern erstmal in andere Variablen zwischenzuspeichern, auch wenn es, wie in diesem Beispiel, wenig Sinn macht. Und Klammern habe ich aus Übersichtsgründen behalten.
Aber beim Schaltjahr war definitiv kein Fehler drin. Ja, [Jahr mod 4 = 0] -> Schaltjahr, A-Bär:
[(Jahr-2042 +2) mod 4 = 0] -> Schaltjahr, weil [2042 mod 4 = 2] -> kein Schaltjahr ist.
Also entweder nimmt man das [(Jahr-2042+2) mod 4] oder direkt [Jahr mod 4].
Da ich mich oben aber für unnötige Variablen entschieden habe, nahm ich (played_y + 2) mod 4 = 0.
Abgesehen davon habe ich den Array bewusst als Integer deklariert, da es sonst zu einem kuriosen Rechenfehler kommt. Der rechnet nämlich bei mir:
minutes := 0 + (31 * 1440);
minutes = 96
Also im Prinzip die 44640 mod 256.
Mit freundlichen Grüßen
Imperator Orbis |
|
verfasst am: 31.03.2010, 20:33
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Es gibt eine globale Variable DaysPlayed. |
|
verfasst am: 01.04.2010, 00:46
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Zitat: Imperator Orbis Und Klammern habe ich aus Übersichtsgründen behalten.
Sorry, aber mMn sollte die Operatorrangfolge zur Allgemeinbildung gehören, grade wo's so einen kurzen Merksatz gib.
Zitat: Imperator Orbis Aber beim Schaltjahr war definitiv kein Fehler drin. Ja, [Jahr mod 4 = 0] -> Schaltjahr, A-Bär:
[(Jahr-2042 +2) mod 4 = 0] -> Schaltjahr, weil [2042 mod 4 = 2] -> kein Schaltjahr ist.
Ah, ich bin doof. Danke für die Erleuchtung. Also Jahr ± 2.
Zitat: Imperator Orbis Abgesehen davon habe ich den Array bewusst als Integer deklariert, da es sonst zu einem kuriosen Rechenfehler kommt. Der rechnet nämlich bei mir:
minutes := 0 + (31 * 1440);
minutes = 96
Also im Prinzip die 44640 mod 256.
Ne, oder? Natter, bitte sag mir, das XSkript nicht so doof ist, beim verrechnen von verschiedenen Integer-Typen den größeren Operanden zum kleineren zu casten statt andersherum. Selbst C ist in der Hinsicht cleverer...
Wenn doch, muss der Array zu nem Array of LongWord werden. Damn.
Aber das ist ja alles redunant. DaysPlayed hab ich total vergessen -.-' |
|
verfasst am: 01.04.2010, 01:59
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: sujin
Ne, oder? Natter, bitte sag mir, das XSkript nicht so doof ist, beim verrechnen von verschiedenen Integer-Typen den größeren Operanden zum kleineren zu casten statt andersherum. Selbst C ist in der Hinsicht cleverer...
Wenn doch, muss der Array zu nem Array of LongWord werden. Damn.
Sollte es eigentlich nicht. Wenn doch, bitte vollständiges Beispielskript erstellen. |
|
verfasst am: 01.04.2010, 03:04
|
Registrierdatum: 28.03.2010, 19:14
Beiträge: 9
|
Hier das gewünschte Beispielskript:
program Beispielskript;
procedure StartMission;
var
x : LongWord;
y : Byte;
begin
y := 31;
x := 0;
game_api_MessageBox('x = '+IntToStr(x)+' + '+IntToStr(y)+' * 1440;');
x := x + y * 1440;
game_api_MessageBox('x = '+IntToStr(x));
mission_win;
end;
begin
MissionName := 'Beispielskript';
MissionType := mzUser;
end.
Aufgefallen ist mir, dass wenn ich Zeile 12 x := x + y * 1440; verkürze auf x := y * 1440; dass dann alles richtig berechnet wird.
Ebenfalls aufgefallen ist mir, dass so ein Fehler auftritt, wenn
Variable X vom Typ Integer, LongInt, Word oder LongWord und
Variable Y vom Typ Byte, ShortInt oder SmallInt ist,
wobei die Kombination von Word und SmallInt eine Ausnahme darstellt.
Ich hoffe, ich konnte hier weiterhelfen.
Mit freundlichen Grüßen
Imp Orbis |
|
verfasst am: 01.04.2010, 19:58 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Hmm, scheint so, als würde er immer den Datentyp der ersten Variable bei binären Operatoren nutzen. |
|
verfasst am: 22.11.2023, 10:31
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 01.02.2024, 18:26
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 01.03.2024, 10:06
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:40
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:41
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:42
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:43
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:44
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:45
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 02:46
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [34] [35] >> |