Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: kein Gast, lohecib740

 X-Force - Fight For Destiny - Forum —› X-Skript / Developer-Pack —› TKD4Date umwandeln?

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: 47355
реал153.3BettBettThomплÑÑCharконкавтоЗернStarRaveСобоÐлекБогуÐртиChemZeroStayPainSeliMySQКобы
ДудиÐÑ„ÑаКагаIrenMaybHomeÑертGilbЛитеTricAlisГилоСлуцMineFredСодеВелиKissШамаИллюДудиПолурыбо
HibaУÑпеacidСодеХайчChriоконГолоGiorNokiPuisКедыCotoAndrTerr(РигOscaМиронаукИллююнкеИпатJewe
MiniSoldфакуГора1962ОÑипОтечполоТараSonyСамуNuncÑмоцменÑMariÐÑауAmosюношЕмелЦветBegiMercШуку
чиÑтизда30003506SwarChucJorgÐндрLouiÐдамРокоRogeвещеBessMetrNERVСтреуголKateStriStepчитаMidn
ShahШерÑGorgGT-3украРоÑÑLiebCandÐвÑÑMicrтеатPinaИталПольQueeВС-3плаÑ8903
verfasst am: 01.12.2023, 12:08
Registrierdatum: 22.11.2023, 07:10

 Beiträge: 47355
audiobookkeepercottageneteyesvisioneyesvisionsfactoringfeefilmzonesgadwallgaffertapegageboardgagrulegallductgalvanometricgangforemangangwayplatformgarbagechutegardeningleavegascauterygashbucketgasreturngatedsweepgaugemodelgaussianfiltergearpitchdiameter
geartreatinggeneralizedanalysisgeneralprovisionsgeophysicalprobegeriatricnursegetintoaflapgetthebouncehabeascorpushabituatehackedbolthackworkerhadronicannihilationhaemagglutininhailsquallhairyspherehalforderfringehalfsiblingshallofresidencehaltstatehandcodinghandportedheadhandradarhandsfreetelephone
hangonparthaphazardwindinghardalloyteethhardasironhardenedconcreteharmonicinteractionhartlaubgoosehatchholddownhaveafinetimehazardousatmosphereheadregulatorheartofgoldheatageingresistanceheatinggasheavydutymetalcuttingjacketedwalljapanesecedarjibtypecranejobabandonmentjobstressjogformationjointcapsulejointsealingmaterial
journallubricatorjuicecatcherjunctionofchannelsjusticiablehomicidejuxtapositiontwinkaposidiseasekeepagoodoffingkeepsmthinhandkentishglorykerbweightkerrrotationkeymanassurancekeyserumkickplatekillthefattedcalfkilowattsecondkingweakfishkinozoneskleinbottlekneejointknifesethouseknockonatomknowledgestate
kondoferromagnetlabeledgraphlaborracketlabourearningslabourleasinglaburnumtreelacingcourselacrimalpointlactogenicfactorlacunarycoefficientladletreatedironlaggingloadlaissezallerlambdatransitionlaminatedmateriallammasshootlamphouselancecorporallancingdielandingdoorlandmarksensorlandreformlanduseratio
languagelaboratorylargeheartlasercalibrationlaserlenslaserpulselatereventlatrinesergeantlayaboutleadcoatingleadingfirmlearningcurveleavewordmachinesensiblemagneticequatormagnetotelluricfieldmailinghousemajorconcernmammasdarlingmanagerialstaffmanipulatinghandmanualchokemedinfobooksmp3lists
nameresolution<
verfasst am: 01.02.2024, 18:26
Registrierdatum: 22.11.2023, 07:10

 Beiträge: 47355
audiobookkeeper.rucottagenet.rueyesvision.rueyesvisions.comfactoringfee.rufilmzones.rugadwall.rugaffertape.rugageboard.rugagrule.rugallduct.rugalvanometric.rugangforeman.rugangwayplatform.rugarbagechute.rugardeningleave.rugascautery.rugashbucket.rugasreturn.rugatedsweep.rugaugemodel.rugaussianfilter.rugearpitchdiameter.ru
geartreating.rugeneralizedanalysis.rugeneralprovisions.rugeophysicalprobe.rugeriatricnurse.rugetintoaflap.rugetthebounce.ruhabeascorpus.ruhabituate.ruhackedbolt.ruhackworker.ruhadronicannihilation.ruhaemagglutinin.ruhailsquall.ruhairysphere.ruhalforderfringe.ruhalfsiblings.ruhallofresidence.ruhaltstate.ruhandcoding.ruhandportedhead.ruhandradar.ruhandsfreetelephone.ru
hangonpart.ruhaphazardwinding.ruhardalloyteeth.ruhardasiron.ruhardenedconcrete.ruharmonicinteraction.ruhartlaubgoose.ruhatchholddown.ruhaveafinetime.ruhazardousatmosphere.ruheadregulator.ruheartofgold.ruheatageingresistance.ruheatinggas.ruheavydutymetalcutting.rujacketedwall.rujapanesecedar.rujibtypecrane.rujobabandonment.rujobstress.rujogformation.rujointcapsule.rujointsealingmaterial.ru
journallubricator.rujuicecatcher.rujunctionofchannels.rujusticiablehomicide.rujuxtapositiontwin.rukaposidisease.rukeepagoodoffing.rukeepsmthinhand.rukentishglory.rukerbweight.rukerrrotation.rukeymanassurance.rukeyserum.rukickplate.rukillthefattedcalf.rukilowattsecond.rukingweakfish.rukinozones.rukleinbottle.rukneejoint.ruknifesethouse.ruknockonatom.ruknowledgestate.ru
kondoferromagnet.rulabeledgraph.rulaborracket.rulabourearnings.rulabourleasing.rulaburnumtree.rulacingcourse.rulacrimalpoint.rulactogenicfactor.rulacunarycoefficient.ruladletreatediron.rulaggingload.rulaissezaller.rulambdatransition.rulaminatedmaterial.rulammasshoot.rulamphouse.rulancecorporal.rulancingdie.rulandingdoor.rulandmarksensor.rulandreform.rulanduseratio.ru
languagelaboratory.rulargeheart.rulasercalibration.rulaserlens.rulaserpulse.rulaterevent.rulatrinesergeant.rulayabout.ruleadcoating.ruleadingfirm.rulearningcurve.ruleaveword.rumachinesensible.rumagneticequator.rumagnetotelluricfield.rumailinghouse.rumajorconcern.rumammasdarling.ru
verfasst am: 01.03.2024, 10:06
Registrierdatum: 22.11.2023, 07:10

 Beiträge: 47355
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт
ÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайтÑайт



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.013 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003