Hallo nochmal;
sorry wegen "Double-Post" und Ausbuddelns eines alten Threads. Inzwischen habe ich mich nochmal etwas mit dem Thema beschäftigt (beschäftigen müssen) und kann mit den neuen Informationen den Verdacht etwas zurücknehmen. Einen neuen Thread war mir das allerdings nicht wert.
Der RTC-Chip ist in der Lage, komplette Zeit- und Datumsinformationen zu speichern. Es gibt Felder für Jahr, Monat und Tag. 1.1.2000 00:00 Uhr ist möglich; laut Datenblatt gibt es zwei Ziffern für das Jahr - damit geht das bis zum 31.12.2099 23:59.
Es könnte also auch bei einer Edition mit einer niemals endenden Batterie Probleme geben, wenn man das Spiel vor hundert echten Jahren begonnen hat. Möglicherweise müssen die Ur-Ur-Urenkel dann doch mal einen neuen Spielstand beginnen.
Quelle: Datenblatt des Chips; Tool zum direkten Stellen des RTC-Chips.
Somit wäre das Spiel in der Lage, ständig die "echte" Uhrzeit griffbereit zu haben. Das tut es aber nicht. Wenn ein neues Spiel begonnen wird, dann wird die Uhr auf 0 gesetzt. Alles ab da ist dann nur noch die "Zeit, seitdem der Spielstand gestartet wurde". Das wird noch mit einem Zeit-Offset aus dem Spielstand verheiratet; dieser ist aber nicht ganz so wichtig (< 1 Tag). Offen gesprochen: Ich habe ihn auch nicht komplett verstanden und nach einer kurzen Testreihe (n=3) hatte ich auch keine Lust mehr dazu.
Quelle: Eigene Experimente
Grundsätzlich scheint es zwei Typen von Zeitabhängigkeit im Spiel zu geben: Ich nenne sie mal "Uhrzeit" und "Timeout".
"Uhrzeit"-Sachen sind abhängig von der "echten" (bzw. berechneten) Uhrzeit. "Von x bis y ist Ebbe, von y bis x ist Flut. Von x bis y heißt Psiana, von y bis x heißt Nachtara." Diese Uhrzeit wird auch in den Kinderzimmern angezeigt.
"Timeout"-Sachen sind davon abhängig, dass Zeit abläuft. "In n Stunden sind die Beeren zur nächsten Stufe gewachen. In n Stunden wird die nächste Beere gratis herausgegeben." Stellenweise mag der Timeout so gesetzt sein, dass er um Mitternacht eines Tages abläuft, dennoch wird nicht auf den Tag geprüft, sondern auf abgelaufene Zeit.
Die Küstenhöhle ist in der Hinsicht witzig, dass sie beide Typen vereinbart: Die Gezeiten sind von "Uhrzeit" abhängig, die Schalen und Salze werden über "Timeout" wieder aufgefüllt.
Eigene Erfahrung: Manchmal ist es nötig, alle (leeren) Positionen abzulaufen und mit dem alten Mann zu sprechen, um diesen Timeout wieder in Betrieb zu setzen.
Ein Problem hier ist: Nach einem Batteriewechsel funktionieren "Timeouts" meist (?) nicht mehr. Die Uhr im Zimmer läuft weiter - aber Beeren wachsen nicht.
Das liegt darin, dass der Spielstand sich die zuletzt gesehene RTC-Zeit speichert (wieder: plusminus ein wenig Offset-Magie) und abgelaufene Zeit nur registriert, wenn die gespeicherte Zeit *kleiner* ist als die aus dem Chip gelesene.
Das ist kein Problem, wenn die Uhr regulär läuft.
Beispiel:
* Ich habe 5 Jahre gespielt. Die interne Uhr sagt also "5 Jahre" (wurde zum Spielstandstart auf null gesetzt). Ich pflanze eine Beere und speichere. Der Spielstand merkt sich "5 Jahre".
* Ich lasse das Spiel 3 Stunden lang liegen. Die interne Uhr sagt also "5 Jahre und 3 Stunden".
* Ich lade den Spielstand. Das Spiel sieht "5 Jahre und 3 Stunden" in der Uhr und "5 Jahre" im Spielstand und weiß somit: "3 Stunden sind vergangen" - und lässt die Beeren entsprechend wachsen.
Das ist aber ein Problem, wenn die Uhr zwischenzeitlich mal auf Null gesetzt wurde. Selbiges passiert leider, wenn die Batterie leer ist: Der Speicher im RTC-Chip kann nicht mehr gehalten werden. Nach Einlegen einer neuen Batterie geht es bei Null los.
* Ich lade den Spielstand. Das Spiel sieht "Null Jahre und ein paar Minuten" in der Uhr und "5 Jahre" im Spielstand - und weiß somit, dass etwas schief gelaufen ist. Technisch könnte es jetzt noch vermuten, dass "100 Jahre und ein paar Minuten" der echte Fall ist - aber die Entwickler haben sich wohl dafür entschieden, das als "null" zu werten. Die Timeout-Events werden nicht aktualisiert: Beeren wachsen nicht. Leider wird beim Speichern auch nicht das Feld im Spielstand auf "Null Jahre und ein paar Minuten" gesetzt - sonst wäre das Problem mit dem nächsten Start behoben.
Startet man einen neuen Spielstand, so werden die Felder wieder auf Null gesetzt. Legt man nach einem Batteriewechsel also nicht viel Wert auf den Spielstand, sondern eher auf die Beeren, so kann man einen neuen Spielstand starten und alles sollte wieder funktionieren.
Komplizierter wird das, wenn man den Spielstand gerne behalten *und* mit Timeout-Events arbeiten möchte.
* Wenn man direkten Schreibzugriff auf den Spielstand hat, kann man die Felder natürlich editieren und dem Spiel vorgeben, man hätte das Spiel tatsächlich bei "Null Jahre und ein paar Minuten" gespeichert. Hierfür müsste man einen bösen Savegame-Editor verwenden.
* Wenn man die Möglichkeit der Speichermanipulation hat (Stichwort: "Cheatmodul"), könnte man auch hier schauen, ob man das Feld vor dem Speichern erfasst und korrigieren kann. Wer allergisch gegen Speichermanipulationsmodule ist, wird die Option auch nicht mögen.
* Es gibt Homebrew-Software, mit dem man den RTC direkt auf eine Wunsch-Uhrzeit setzen kann. Das habe ich inzwischen bei meinen Modulen gemacht. Hierbei ist das praktisch, eine Beere einzupflangen und dann verschiedene Zeiten auszuprobieren. Wenn sich die Beere nicht verändert hat, muss man ein späteres Datum ausprobieren. Wenn die Beere schon wieder verschwunden ist, ist man in der Zeit zu weit nach vorne gereist. Man könnte noch versuchen, die "richtige" Zeit einzupendeln, aber auch bei "zu weit nach vorne gereist" sollten alle zukünftigen Timeout-Events wieder funktionieren.
Auch diese Methode kann man zu unlauteren Zwecken nutzen. Ersetzt man "Ich lasse das Spiel 3 Stunden liegen" gegen "Ich schreibe 5 Jahre 3 Stunden in den RTC", ist die Beere gewachsen, obwohl ich nichtmal fünf Minuten Arbeit investiert habe. Somit könnte auch diese Methode ungern gesehen werden.
Der Vollständigkeit halber: Wenn man irgendwann einmal einen Spielstand auf einem Medium gespielt hat, bei dem die "echte" Systemzeit als RTC-Zeit gemeldet wird, dann wird auch beim Speichern das Feld im Spielstand sehr weit nach oben gesetzt und man wird so bald mit dem Spielemodul nicht mehr daran kommen.
Wer nicht zwischen den Zeilen lesen möchte: Das betrifft Emulatoren.
* Ich speichere das Spiel auf dem VBA. Das Spiel sieht "14 Jahre, 8 Monate, 26 Tage, 18 Stunden" und speichert das im Spielstand.
* Ich übertrage den Spielstand auf das Modul. Ich lade das Spiel auf dem Modul
* Das Spiel sieht "5 Jahre 3 Stunden" im RTC und "14 Jahre plus" im Spielstand - irgendwas ist komisch: keine Beeren wachsen.
"Beheben" lässt sich das Problem, indem man im RTC eine Datum aus der "realen" Zukunft einstellt. Das heißt natürlich, dass das gleiche Problem nun beim Einladen auf dem VBA entsteht.
Fazit:
Nach dem Auswechseln der Batterie ist es gut möglich, dass Beeren immer noch nicht wachsen - obwohl die Uhr sich bewegt. Einfach lässt sich das Problem nur durch Löschen des alten Spielstand und Starten eines neuen Spielstands beheben.
Grüße,
TCC