QuestScript liest GameDaysPassed nicht mehr aus (Erklärungen ?!)

Andy1967

Reisender
Eins meiner Quest Scripts scheint im Moment völlig zu streiken, nachdem es anfänglich gut lief. Das Script besteht (neben weniger Kleinigkeiten) rein aus einer Serie von Timern die jeweils weitere Quest Stages schalten. Anfangs lief das gut durch, aber irgendwann versagte das plötzlich völlig. Die Quest Stages kann ich in der Console noch problemlos schalten, aber ansonsten läuft da gar nichts mehr wie es soll. Mein ganz (ganz!) starker Verdacht ist, daß das Script die GameDaysPassed nicht mehr ausliest, u.a. weil eine der nicht Stage-abhängigen "Kleinigkeiten" ein Script Block ist der eigentlich einmal am Tag ein Zufallsereignis produzieren sollte, da aber auch tagelang das selbe Ergebnis herauskommt, als ob der Zufallsgenerator nicht mehr täglich ausgelöst würde. Andere zeitabhängige Ereignisse im Spiel (z.B. das wöchentliche Beutellehen aus ODD) greifen wie sie sollen.

Hat irgendjemand von euch eine Erklärung wie so etwas auftreten kann? Im Moment bin ich grad etwas frustriert. Das mal ein Timer nicht sauber ausgelöst wird hab ich schon erlebt. Das lies sich in der Vergangenheit mit neu laden und noch mal versuchen lösen. Hatte ich schon mal an einer Stelle meiner Spieltests in Silberstein. Aber so massiv hab ich das bislang noch nicht erlebt.

Ich werd auch noch mal einen noch viel älteren Spielstand laden und es noch mal versuchen, aber in der Art hab ich es schon einige male versucht und ich mach mir da wenig Hoffnung.
 
Ohne das skript zu kennen würde ich vermuten das du an irgend einer Stelle den timer ungewollt auf null zurückstellst oder die Schleifen so gelegt sind das das timerscript nicht mehr abgefragt wird.
 
Das Script ist eigentlich nur ein Abfolge von Timer Abfragen ohne große Schleifen, also:
Code:
If GetStage A67DCAllesWeitere == 10
   If GameDaysPassed >= (Timer +3)
      setStage A67DCAllesWeitere 20
   endif
endif

If GetStage... == 20
   If GameDaysPassed >= (Timer +6)
      setStage ...
...
Timer setz ich einmalig wenn ich die Queste mit Stage 5 starte und danach nicht wieder. Für eine Weile hat das auch funktioniert, aber ich werd mir das auf jeden Fall noch mal anschauen.

Was mich viel mehr irritiert ist der Teil in dem ich einmal täglich am Anfang des Scripts einen Zufallswert generiere den ich zur Steuerung von NSC Packages verwende, denn der ist völlig unabhängig von meiner Timer Variablen:

Code:
short Zufallstag
short Zufall

Begin GameMode

If GetStage A67DCAllesweitere >= 5
   If Zufallstag != GameDaysPassed
      set Zufallstag to GameDaysPassed
      set Zufall to GetRandomPercent
   endif
endif

;; danach kommen die ganzen Stage-abhängigen Timer

End

Den Wert "Zufall" frag ich als Condition in den Packages ab um mit jeweils 1/3 Wahrscheinlichkeit (bis einschl. 33, 34-66, über 66) eines von drei Packages auszulösen. Das funktioniert ganz gut - bis es nicht mehr funktioniert. Wenn zweimal hintereinander das selbe Package ausgelöst wird kann das Zufall sein. Dreimal gibt einem zu denken. Fünfmal hintereinander sagt mir es liegt was im argen. Wenn es bei zwei Spieltests passiert das sich das Spiel in eine "Zufallsvariable" verrennt und diese offensichtlich jeden Tag aufs neue heranzieht kann ich mir das nur mit einem Fehler im GameDaysPassed erklären, zumal meine beiden Test jeweils ein anderes Ergebnis für "Zufall" zu produzieren schienen, dieses dann aber irgendwie hängenblieb. Wenn dieser Block irgendwo scheitert dann kan es m.E. nur im "If Zufallstag ..." sein, denn die Stage Bedingung ist auf jeden Fall erfüllt.
 
Ich erinnere mich das wir das Problem bei meinem Sitzskript bei Rotfels und später in meinem Baumhaus gelöst haben. Du erinnerst dich; die vier weiblichen Sitzpositionen, die zufällig auf den Kissen ausgelöst wurden. Die Lösung, die wir seinerzeit gefunden haben steht nicht in den Skripten, sondern in den Bedingungen mit denen die Animationen ausgelöst werden.

GetrandomPercent arbeitet nicht immer sicher https://cs.elderscrolls.com/index.php?title=GetRandomPercent

Kontrolliere bitte ob immer das letzte Package in der Reihenfolge ausgelöst wird und versuche dir den Wert der ausgeworfen wird in einer Messagebox anzeigen zu lassen:

Message "Zufall: %.0f " Zufall

Der Punkt ist bei deiner Lösung, dass du 33 zufällige Zahlen hast die ein und das selbe Package auslösen und da sind 5 Wiederholungen zwar eher selten, aber durchaus nicht unwahrscheinlich.

Versuche mal

float Zufall
set Zufall to 2.0/99 * Getrandompercent ; und generiere so Zufallszahlen zwischen 0 und 2 und du hast deine drei Werte die du zur Steuerung brauchst.
 
Zuletzt bearbeitet:
Also so wie ich das ich in der CS Wiki sehe ist, daß RandomPercent in einem OnLoad nicht immer wie gewünscht funktioniert. Das dürfte eigentlich in einem GameMode Block in einem Quest Script nicht relevant sein. Aber, desungeachtet: Ich hab das Script bei der Zufallserzeugung um den vorgeschlagenen Message Teil ergänzt. Resultat:

1) Bei keinem meiner Spielstände bei denen die Quest schon lief wurde die Message angezeigt wenn ich Mitternacht überschritten hab, also da wo die "Zufallstag != GameDaysPassed" Bedingung greifen sollte, egal ob ich in-game Mitternacht verstreichen lasse oder mit der Wartefunktion in den nächsten Tag gehe.

2) Einen noch älteren Spielstand geladen bei dem die Queste noch nicht gestartet war und gewartet bis die Queste einsetzt (geschieht per SetStage im Script einer Stage der vorherigen Queste). Resultat: Keine Message, NSC Verhalten wird nicht zufällig verändert, Timer-gesteuerte Ereignisse greifen nicht.

3) Aus reiner Experimentierfreude im CS die Priorität der Queste geändert (von 90 auf 70) und wieder die Queste neu gestartet. Resultat: Wunder über Wunder kam die Message mit dem Wert meiner Zufall Variablen - aber nur einmal und nie wieder. Kein Fortschritt bei den Timern, keine Änderung im NSC Verhalten, der ganze Müll wie vorher.

Ich hab mich jetzt mal mit SetStage an einen Punkt gebracht an dem als Topic Result einer Konversation ein zweiter Timer im selben Script ausgelöst werden sollte der nur gebraucht wird um ein einziges Ereignis am nächsten Tag auszulösen. Auch das passiert nicht, obwohl das eben an einer anderen Variablen hängt (Timer02 statt Timer).


Andere Variablen die ich anderweitig in dem Script setze und außerhalb des Scripts abfrage funktionieren tadellos, wie z.B. die Steuerung von NSC Packages die an Variablen in diesem Quest Script hängen. Es sind immer nur die Script Teile die auf GameDaysPassed zugreifen sollten die nicht funktionieren. Und da bin ich leider langsam mit meinem Latein am Ende.

Das einzig gute ist, daß ich mich hier wirklich eisern an meine Regel gehalten habe alles, aber auch wirklich alles was nur geht in Stage Results auszulösen. Voranbringen kann ich die Queste auf jeden Fall, zu mal ich hier nur ein paar "Umbauten" am Setting vornehme. Aber nervig ist es halt schon immer wieder SetStage in der Konsole zu benutzen.

Ich schau mir das Script jetzt mal ein oder zwei Tage gar nicht an und versuche etwas geistigen Abstand zu gewinnen. Im Moment bin ich so sehr davon überzeugt keinen Fehler gemacht zu haben, daß mein Hirn selbst einen ganz offensichtlichen Fehler ausblenden würde weil das mit meinem Weltbild kollidieren würde.
 
Was machst du denn damit?
If Zufallstag != GameDaysPassed
set Zufallstag to GameDaysPassed
Wenn ich das als Laie lese lese ich: Wenn Zufallstag ! = GameDaysPassed ist, dann setze Zufallstag auf GameDaysPassed. Oo
Dann wäre das kein Zufallstag mehr, sondern ein GameDaysPassed-Tag (kopfkratz)
Und dann funzt das Skript? (kopfschiefleg)
Wie gesagt, ich hab zwar keine Ahnung, aber irgendwie hat mich das rein vom Lesen her stutzig gemacht...
 
Und dann funzt das Skript? (kopfschiefleg)
Wie gesagt, ich hab zwar keine Ahnung, aber irgendwie hat mich das rein vom Lesen her stutzig gemacht...

Ja, auf den ersten Blick wirkt das erst mal etwas komisch, aber es funktioniert und zwar so:

Zufallstag ist eine Variable die ich im Script setze. Wie alle variablen denen noch kein Wert zugewiesen wurde steht sie zunächst auf 0. GameDaysPassed (GDP) wird jeden Tag um 1 erhöht. Sagen wir jetzt mal es ist im Spiel Tag 100 wenn dieses Script zum ersten mal ausgelöst wird.

Damit ist Zufallstag 0 und GDP 100. Damit ist die Ungleich (!=) Bedingung erfüllt, denn 0 ist ja nicht 100.

Da die Bedingung erfüllt ist greift alles was ich als tägliches Ereignis in diesem Block auslösen will. Aber ich will das dies nur einmal am Tag passiert und nicht bei jedem Durchlauf des Scripts, also so alle 5 Sekunden oder so, wieder und wieder ausgelöst wird. Also muß ich das Script irgendwie abfangen und dafür sorgen, daß es erst am nächsten Tag einmalig wieder ausgelöst wird.

Das macht "set Zufallstag to GameDaysPassed". Damit setze ich in meinem Beispiel Zufallstag von 0 auf den gegenwärtigen Wert von GDP (in diesem Fall 100). Damit sind Zufallstag und GDP gleich. Also ist die Bedingung "Ungleich" nicht mehr erfüllt und der Block kann an diesem Tag kein zweites mal durchlaufen.

Am nächsten Tag wird GDP automatisch von Spiel um 1 erhöhrt, also auf 101, während Zufallstag weiterhin bei 100 steht, da der Wert noch nicht überschrieben wurde. Also besteht wieder eine Ungleichheit die meine einmaligen täglichen Ereignisse auslöst. Danach wird Zufallstag auf 101 gesetzt, beide Werte sind für diesen Tag wieder gleich, und am nächsten Tag geht das Spiel wieder von vorne los.

(Das hab ich mir übrigens nicht selbst ausgedacht sonder von einem Script in Orden Des Drachen abgekupfert. Ehre wem Ehre gebührt.)
 
  • Like
Reaktionen: Moorkopp
Also damit das hier nicht völlig ohne Abschluß bleibt: Ich versteh Oblivion manchmal wirklich nicht. An sich kann ich in dem grundsätzlichen Prinzip keine Probleme erkennen, aber es funktioniert einfach nicht wie es soll. Ich hab ein ähnliches Script in einer weiteren Queste eingebaut und auch da macht es nicht was es soll.

Inzwischen hab ich das in der Rubrik "F- Oblivion" abgeschrieben.

Vielleicht ist es wirklich das RandomPercent das hier Schwierigkeiten macht, aber ganz sicher bin ich mir da nicht. Wenn ich so was noch mal versuche bastel mir einen Workaround wie ich es bei Silberstein mit den Wetteränderungen gemacht habe oder sowas. Aber an sich ist das eh nur Spielerei für den Privatgebrauch also erwartet da keinen definitiven Lösungsansatz von mir. :)