22.06.2022, 20:00
(Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2022, 20:05 von siebenstreich.)
Eigentlich steht die Erklärung in meinem letzten Beitrag. Ich versuche es nochmal alternativ an einem konkreten Fall.
Die Gruppe steht vor dem Travia-Tempel in Prem. Man drückt die Taste "vorwärts." Das Programm bereitet nun das Betreten des Tempels vor, indem nach LOCATION die Zahl 2 und nach TYPEINDEX die Zahl 47 in den Speicher geschrieben wird. LOCATION=2 bedeutet Gebäudetyp Tempel, und TYPEINDEX=47 ist die ID des Travia-Tempels in Prem. Dabei erscheint jetzt der Straßenhändler und wir wählen die Antwort 3, um seinen Laden zu besuchen. Jetzt wird das Betreten des Ladens vorbereitet. Dazu wird der Inhalt von LOCATION (also die Zahl 2) ausgelesen und an einer anderen Speicherstelle zwischengespeichert. Für TYPEINDEX passiert dies **nicht**. Nun wird die Speicherstelle LOCATION durch die Zahl 5 (=Händler) überschrieben und TYPEINDEX durch die Zahl 93 (=ID des Straßenhändlers). Danach wird der Besuch des Straßenhändlers abgespult. Nach dem Verlassen des Straßenhändlers wird die zwischengespeicherte Zahl 2 wieder nach LOCATION zurückgeschrieben. Für TYPEINDEX passiert jedoch **nichts vergleichbares**, so dass dort nach wie vor die Zahl 93 steht. Nun wird der Programmcode zum Betreten eines Tempels ausgeführt (wegen LOCATION=2 weiß das Programm, dass es sich um einen Tempel handelt). Allerdings steht unter TYPEINDEX immer noch die Zahl 93 (und nicht 47, wie es sein sollte). Der Tempel-Programmcode sucht nun in einer Art Telefonbuch nach der zur ID 93 gehörenden Gottheit, findet aber nichts (denn es ist kein Tempel der ID 93 vorgesehen) Das ganze führt wie weiter oben von anderen beschrieben dazu, dass ein Praios-Tempel erscheint.
Die Reparatur war ziemlich einfach. Einmal gefunden, ist der Fehler völlig klar und lokal scharf umgrenzt. Man kann einfach den entsprechenden, direkt daneben stehenden Programmcode für LOCATION abtippen, wo ja korrekt zwischengespeichert und rückgesetzt wird (Ironie der Geschichte: Für LOCATION wäre das eigentlich gar nicht so dringend nötig, ließe man den Inhalt von LOCATION beim zwischengeschobenen Besuch des Straßenhändlers komplett unangetastet. Denn der Straßenhändler wird direkt mit do_merchant() aufgerufen, womit der Inhalt von LOCATION gar nicht relevant ist (abgesehen von einem späteren Test, ob der Händler über einen Markt betreten wurde)).
Die Gruppe steht vor dem Travia-Tempel in Prem. Man drückt die Taste "vorwärts." Das Programm bereitet nun das Betreten des Tempels vor, indem nach LOCATION die Zahl 2 und nach TYPEINDEX die Zahl 47 in den Speicher geschrieben wird. LOCATION=2 bedeutet Gebäudetyp Tempel, und TYPEINDEX=47 ist die ID des Travia-Tempels in Prem. Dabei erscheint jetzt der Straßenhändler und wir wählen die Antwort 3, um seinen Laden zu besuchen. Jetzt wird das Betreten des Ladens vorbereitet. Dazu wird der Inhalt von LOCATION (also die Zahl 2) ausgelesen und an einer anderen Speicherstelle zwischengespeichert. Für TYPEINDEX passiert dies **nicht**. Nun wird die Speicherstelle LOCATION durch die Zahl 5 (=Händler) überschrieben und TYPEINDEX durch die Zahl 93 (=ID des Straßenhändlers). Danach wird der Besuch des Straßenhändlers abgespult. Nach dem Verlassen des Straßenhändlers wird die zwischengespeicherte Zahl 2 wieder nach LOCATION zurückgeschrieben. Für TYPEINDEX passiert jedoch **nichts vergleichbares**, so dass dort nach wie vor die Zahl 93 steht. Nun wird der Programmcode zum Betreten eines Tempels ausgeführt (wegen LOCATION=2 weiß das Programm, dass es sich um einen Tempel handelt). Allerdings steht unter TYPEINDEX immer noch die Zahl 93 (und nicht 47, wie es sein sollte). Der Tempel-Programmcode sucht nun in einer Art Telefonbuch nach der zur ID 93 gehörenden Gottheit, findet aber nichts (denn es ist kein Tempel der ID 93 vorgesehen) Das ganze führt wie weiter oben von anderen beschrieben dazu, dass ein Praios-Tempel erscheint.
Die Reparatur war ziemlich einfach. Einmal gefunden, ist der Fehler völlig klar und lokal scharf umgrenzt. Man kann einfach den entsprechenden, direkt daneben stehenden Programmcode für LOCATION abtippen, wo ja korrekt zwischengespeichert und rückgesetzt wird (Ironie der Geschichte: Für LOCATION wäre das eigentlich gar nicht so dringend nötig, ließe man den Inhalt von LOCATION beim zwischengeschobenen Besuch des Straßenhändlers komplett unangetastet. Denn der Straßenhändler wird direkt mit do_merchant() aufgerufen, womit der Inhalt von LOCATION gar nicht relevant ist (abgesehen von einem späteren Test, ob der Händler über einen Markt betreten wurde)).