System Variables - Day of the Week

Welcome to the OMSI-WebDisk!
As guest you can only see content in your selected language! Registered users can choose the visibility of other languages in their control panel, more informations here. All topics are marked with a language flag inside the forums: = English [EN], = German [DE], = French [FR].
If you're not able to speak the topic language than write in English!
  • Advertisement
    • Helpful

    Kalenderwoche und Wochentag - Scriptprogrammierung - Marcels OMSI-Forum


    You can find out the day of the week using an algorithm: Determination of the day of the week - Wikipedia. The user faaabiiii has implemented a proof-of-concept:

    This returns the day of the week from 0 (Sunday) to 6 (Saturday). With an additional Macro you can get a String representation:

    You can use this snippet as the following:

    Code
    (M.L.WochentagString) (S.$.Text)

    (Make sure you don't use the variables s0/l0, s1/l1, s2/l2 already, since they would be overwritten.)

  • Isn't there also a string variable for the day of the week? How does OMSI calculate that?

  • Isn't there also a string variable for the day of the week? How does OMSI calculate that?

    You may try it out :D

  • Ich würde gerne das DayOfWeek Macro zur Freischaltung von Einstiegspfaden nutzen, um beispielsweise Sonntags ganztägig Einstieg vorne zu realisieren, Wochentags aber tagsüber auch Einstieg hinten (vereinfacht gesagt... Soll dann noch je nach Karte unterschiedlich laufen;-D). Mir ist nur etwas unklar nach was ich dann abfragen muss... Mit dem String-Macro würd ich den String abfragen, das ist aber in meinem Fall unnötig. Und: kann ich die s0/l0 - s2/l2 durch eine allgemeine variable ersetzen um nicht jedes Mal nachzuschauen ob diese schon benutzt werden? Sprich dass ich das Macro dann einfach in jedes Door-Script reinkopieren kann wo ich diese Abfrage haben will.

  • kann ich die s0/l0 - s2/l2 durch eine allgemeine variable ersetzen um nicht jedes Mal nachzuschauen ob diese schon benutzt werden?

    Klar. Nach der Operation befindet sich das Ergebnis der Rechnung ganz oben auf dem Stack, damit kannst du dann alles machen, quasi wenn du einfach eine Zahl schreibst: Direkt weiterrechnen (Beispiel nachfolgender Wochentag: (M.L.dayOfWeek) 1 + 7 %), sie in die s-Variablen speichern (Beispiel: (M.L.dayOfWeek) s2) oder mittels (M.L.dayOfWeek) (S.L.cacheDayOfWeek) in eine definierte Variable speichern. Letzteres könnte noch wie folgt erweitert werden: Du könntest den Tag, an dem das Makro das letzte Mal durchgelaufen ist, cachen, sodass du das dayOfWeek-Makro nur dann ausführst und speicherstwenn sich der Tag geändert hat.

    Mir ist nur etwas unklar nach was ich dann abfragen muss

    Möglich ist beides. Stringvergleiche sind ja auch mit $= möglich. Aus Performancegründen würde ich aber eher empfehlen, das Zahl-Makro zu verwenden. Beispiel:

    Code
    (M.L.dayOfWeek) 6 = {if} ... {endif}

    Innerhalb des if-Blocks steht dann das, was ausgeführt wird, wenn es Sonntag ist. In diesem Block könntest du dann z.B. Einstiegsvariablen setzen, in einem else-Block dann den Rest behandeln, ähnlich wie beim String-Makro.

  • Achso, also weil die Stacks s0/l0 ...s2/l2 innerhalb des Macros verwendet werden, stören die nicht wenn das anderweitetig im Door-Script verwendet wird? Ich müsste also prinizipiel. in Deinen Code nur eine weitere Zeite einfügen, was den Stackwert in einen Cache schreibt, also dann (M.L.dayOfWeek) (S.L.cacheDayOfWeek) und nach (L.L.cacheDayOfWeek) dann abfragen ob es den Wert 0 bis 6 hat? (L.L.cacheDayOfWeek) wäre ja gleich (M.L.dayOfWeek)... Hmm eigentlich bräuchte ich nicht zu cachen, ich hab ja dann mit (M.L.dayOfWeek) den Wert. Miot dem müsste ich auch nicht weiterrechnen, da nur der aktuelle Wochentag abgefragt werden soll. Das allerdings wohl bei jedem öffnen der Türen, also definitiv lieber direkt abfragen als den Umweg über den String.

  • weil die Stacks s0/l0 ...s2/l2 innerhalb des Macros verwendet werden, stören die nicht wenn das anderweitetig im Door-Script verwendet wird?

    Das weiß ich gerade nicht, ich meine mich zu erinnern, dass die Register von 0-7 global sind, allerdings werden die in den meisten Fällen nur kurzzeitig innerhalb eines Makros o.ä. genutzt. Da hilft nur suchen, ob das mit einem anderen Skript kollidiert.

    Ich müsste also prinizipiel. in Deinen Code nur eine weitere Zeite einfügen, was den Stackwert in einen Cache schreibt, also dann (M.L.dayOfWeek) (S.L.cacheDayOfWeek) und nach (L.L.cacheDayOfWeek) dann abfragen ob es den Wert 0 bis 6 hat?

    Genau so.

    Hmm eigentlich bräuchte ich nicht zu cachen, ich hab ja dann mit (M.L.dayOfWeek) den Wert. Miot dem müsste ich auch nicht weiterrechnen, da nur der aktuelle Wochentag abgefragt werden soll.

    Wenn du nur eine Abfrage hast, genügt das natürlich auch ohne Caching, siehe der letzte Codeschnipsel meines vorherigen Beitrags.