System Variables - Day of the Week

Willkommen in der OMSI-WebDisk!
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet: = Englisch [EN], = Deutsch [DE], = Französisch [FR]. Wenn du die angegebene Sprache nicht beherrschst, schreibe auf Englisch!
  • Anzeige
    • Hilfreichster Beitrag

    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.)

    Mit freundlichen Grüßen

    Lµkas

    Seit Februar 2023 stehe ich nicht mehr als Administrator und Experte zur Verfügung.

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

  • 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.

    Mit freundlichen Grüßen

    Lµkas

    Seit Februar 2023 stehe ich nicht mehr als Administrator und Experte zur Verfügung.

  • 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.

    Mit freundlichen Grüßen

    Lµkas

    Seit Februar 2023 stehe ich nicht mehr als Administrator und Experte zur Verfügung.