Crystals-DSA-Foren

Normale Version: Reverse Engineering der NLT
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
ich suche schon seit einiger Zeit die Stelle, wo in Schick die Truheninhalte definiert sind, kann aber nichts finden. Sind die hardgecodet oder bin ich zu blöd?
(04.02.2014, 14:36)Lippens die Ente schrieb: [ -> ]ich suche schon seit einiger Zeit die Stelle, wo in Schick die Truheninhalte definiert sind, kann aber nichts finden. Sind die hardgecodet oder bin ich zu blöd?
Die Truheninhalte sind Teil des Spielstatus, woher das Programm die Daten zur Initialisierung bei einem neugestartenen Spiel hernimmt wurde noch nicht aufgedeckt. Falls das hardgecodet ist könnte man versuchen in SCHICKM.EXE nach den Ausgangswerten, der im Savegame bereits identifizierten Truheninhalten, eines neuen Spielstands gespeichert sind zu suchen.
Hallo zusammen,

die Truheninhalte stehen hardgecodet im Datensegment des Spiels und werden beim Speichern in den Spielstand hineinkopiert und
beim Laden wird er überschrieben.
Das ist einer der Gründe, warum man Schick neustarten muss um ein ganz neues Spiel zu beginnen.
wusste ich es doch. Kann ich sie dann überhaupt ändern? werden da die Gegnstände auch in Form des Hexcodes angezeigt? ist die gam oder die Schickm.exe die entscheidende Datei? Wenn es nicht geht, begrabe ich diese Idee endgültig. Insofern unterscheiden sich Schick und Schweif himmelweit, denn in Schweif kann ich jeden beliebigen Gegenstand in die Truhen legen und auch die Regale und andere Behältnisse lassen sich bestücken.

Apropos chest.dat: ich habe bei den Truhen in den Blutzinnen drei völlig leere entdeckt. Was hat es mit denen auf sich?
Ändern kannst Du die Truheninhalte schon.
Wenn du sie in allen Spiele geändert haben willst, dann musst du im Datensegment der SCHICKM.EXE herumhexen.
Wenn es nur einen Spielstand betrifft, dann natürlich im Spielstand.

Schau dir mal unsere rudimentäre Dekodierung des Spielstands an.
Am geeignetsten ist "Eine verlassene Miene/Prem".


Erklärung

Im Spielstand gibt es verschiedene Bereiche für Dungeons.
Innerhalb eines Dungeonbereichs sind die ausgelösten Events und die Truheninhalte gespeichert.

In Schick werden zwei Arten von Truhen (oder Regale, Leichen, etc... Ich nenne es weiterhin Truhe. :D) unterschieden:
  1. Truhen mit gestapelten Gegenständen
  2. Truhen mit Einzelgegenständen
Im Spielstand (und im Datensegment) stehen zuerst die Truhen mit gestapelten Gegenständen.

Dort benötigt ein gestapelter Gegenstand zwei Bytes.
Das Erste ist der Identifier (ID) des Gegenstands und das Zweite die Anzahl.
Das Ende wird durch ID = 0xff gekennzeichnet.

Bei den Einzelgegenständen ist es einfacher:
Dort wird nur die ID gespeichert, da die Anzahl klar ist. (=1)
Auch hier wird das Ende mit ID = 0xff gekennzeichnet.


Anleitung zum Ändern eines Gegenstandes und seiner Anzahl in einer gefüllten Truhe

Wenn Du also im Gegenstandslager in der premer Mine "DAS SCHWERT GRIMRING" (ID=0xb5) zweimal finden möchtest, dann brauchst Du das Offset im Spielstand.

Der Header vom Spielstand ist 0x14 Bytes lang.
Addiere hier das Offset vom dem ID des ersten Gegenstands aus der Truhe des entsprechenden Dungeons (0x124f) dazu
und erhalte 0x1263. Das ist die Position im Spielstand, an der Du deine Änderungen durchführen musst.
Beim Spielstart ist an dieser Position eine Spitzhacke (ID=0x5d) drei Mal (Anzahl = 0x03) abgelegt.
Ändere die ID von 0x5d in 0xb5 und im folgenden Byte die 0x03 in 0x02 und speichere den Spielstand.

Danach startest Du das Spiel mit dem geänderten Spielstand, gehst nach Prem und findest zweimal "DAS SCHWERT GRIMRING". :)
Du solltest Dietriche mitnehmen, die Tür ist ziemlich schwer zu öffnen:
  • Aufbrechen: KK >= 40
  • Knacken: Schlösser +14
  • Aufzaubern: Foramen +25
Aber, HE, es ist ja auch "DAS SCHWERT GRIMRING". :D

P.S.: Bei schon geplünderten Truhen musst Du noch darauf achten, das das Ende ordentlich mit 0xff abgeschlossen ist.

Viel Spaß,
Henne
super, das war die Information die ich noch gebraucht habe. Dann kann es jetzt losgehen. Ich habe besagtes ausprobiert: und es funktioniert! ich habe ganz leicht die Stelle in der schickm.exe gefunden, indem ich einfach nach der Stelle gesucht habe, an der die Lagerteile der Premer Mine hintereinander vorkamen, habe einen Gegenstand davon geändert und diesen dann im Lager gefunden. Mit der Hexliste (offensichtlich wird für die Gegenstands ID nur ein byte gebraucht, bei Schweif sind es 2) sowie der Crystals-NLT-Hilfeseite ist das hexen ein Kinderspiel.

in diesem Sinne möchte ich euch, Henne, Hendrik, Obi-Wahn und allen anderen von ganzem Herzen danken, dass ihr Bright Eyes auf die Beine gestellt habt. So kann sich mein Traum einer ganz individuellen NLT in Kürze erfüllen. Wenn ich Zeit habe, werde ich auch versuchen, einige der noch unbekannten bytes zu entziffern. Eines habe ich ja schon geknackt, das macht Lust auf mehr...

ich habe gerade herausgefunden, dass es streng verboten ist, in die Schickm.exe bytes einzufügen. Das Spiel lässt sich dann nicht mehr starten, weil offensichtlich die Syntax nicht mehr stimmt.

welche Kämpfe in der Fight.LST sind denn implementiert?
Es gibt ja seit zwei Wochen ein paar Änderungen im git-Repo und daher wollte ich unter Linux einen neuen Build erstellen. Leider ohne Erfolg:

Code:
making all in schweif
make[2]: Entering directory `/home/obi-wahn/Dokumente/Spiele/Bright-Eyes/src/custom/schweif'
Making all in rewrite_c102de
make[3]: Entering directory `/home/obi-wahn/Dokumente/Spiele/Bright-Eyes/src/custom/schweif/rewrite_c102de'
g++ -DHAVE_CONFIG_H -I. -I../../../..  -I../../../../include -I../ -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT  -g -O2  -MT c102de_seg000.o -MD -MP -MF .deps/c102de_seg000.Tpo -c -o c102de_seg000.o c102de_seg000.cpp
g++ -DHAVE_CONFIG_H -I. -I../../../..  -I../../../../include -I../ -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT  -g -O2  -MT c102de_seg013.o -MD -MP -MF .deps/c102de_seg013.Tpo -c -o c102de_seg013.o c102de_seg013.cpp
g++ -DHAVE_CONFIG_H -I. -I../../../..  -I../../../../include -I../ -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT  -g -O2  -MT c102de_seg024.o -MD -MP -MF .deps/c102de_seg024.Tpo -c -o c102de_seg024.o c102de_seg024.cpp
g++ -DHAVE_CONFIG_H -I. -I../../../..  -I../../../../include -I../ -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT  -g -O2  -MT c102de_seg029.o -MD -MP -MF .deps/c102de_seg029.Tpo -c -o c102de_seg029.o c102de_seg029.cpp
In file included from c102de_seg013.cpp:8:0:
../schweif.h:9:20: fatal error: common.h: Datei oder Verzeichnis nicht gefunden
#include "common.h"
                    ^
compilation terminated.
In file included from c102de_seg024.cpp:8:0:
../schweif.h:9:20: fatal error: common.h: Datei oder Verzeichnis nicht gefunden
#include "common.h"
                    ^
compilation terminated.
make[3]: *** [c102de_seg013.o] Fehler 1
make[3]: *** Warte auf noch nicht beendete Prozesse...
In file included from c102de_seg029.cpp:8:0:
../schweif.h:9:20: fatal error: common.h: Datei oder Verzeichnis nicht gefunden
#include "common.h"
                    ^
compilation terminated.
make[3]: *** [c102de_seg024.o] Fehler 1
make[3]: *** [c102de_seg029.o] Fehler 1
In file included from c102de_seg000.cpp:5:0:
../schweif.h:9:20: fatal error: common.h: Datei oder Verzeichnis nicht gefunden
#include "common.h"
                    ^
compilation terminated.
make[3]: *** [c102de_seg000.o] Fehler 1
make[3]: Leaving directory `/home/obi-wahn/Dokumente/Spiele/Bright-Eyes/src/custom/schweif/rewrite_c102de'
make[2]: *** [all-recursive] Fehler 1
make[2]: Leaving directory `/home/obi-wahn/Dokumente/Spiele/Bright-Eyes/src/custom/schweif'
make[1]: *** [all-recursive] Fehler 1
make[1]: Leaving directory `/home/obi-wahn/Dokumente/Spiele/Bright-Eyes/src/custom'
make: *** [all-recursive] Fehler 1
obi-wahn@Linux-Obi-Wahn:~/Dokumente/Spiele/Bright-Eyes/src>
@Obi: Versuchs jetzt nochmal. :)

@Lippens:
Vielen Dank.

Das mit den Kämpfen kann ich leider nicht so einfach sagen,
da die Aufrufe (ca. 90 Stück) in der SCHICKM.EXE wild verstreut sind.
Manche haben noch irgendwelche Nebenbedingungen.
Danke, jetzt gehts (hatte auch o.g. fehler)
Soo,

heute ist es mir gelungen, den Heiler 1:1 nachzubauen. Der Code ist schon online. :D

Gibt es eigentlich in der NLT Namen für die Vergiftungen?
Der Heiler in Schick nennt bei Krankheiten die Krankheit, aber bei Gift schweigt er sich aus.
(11.03.2014, 14:57)HenneNWH schrieb: [ -> ]Gibt es eigentlich in der NLT Namen für die Vergiftungen?

Im Spiel wird nur vermerkt, dass der Held vergiftet sei. Wovon, bekommt man aber nicht mitgeteilt.
Zumindest die Smytome werden ab Schweif genannt. Aber Namen haben die Gifte nicht.
Da meine Commit-Nachrichten immer kryptischer werden möchte ich euch, in menschlicher Sprache,
einen kleinen Statusbericht zukommen lassen:

Da bei meiner bisherigen Vorgehensweise nie so ganz klar war ob den Code richtig verstanden habe
oder aus versehen Tippfehler eingebaut habe, war es notwendig meine Arbeit überprüfbar zu machen.

Das habe ich bisher mit händischem Vergleich des Originals mit den Binärdaten, welche der Borland Compiler
aus meinem Code erzeugt gemacht. Eine zeit- und nervenaufreibende Arbeit.
Jetzt ist es mir gelungen ein paar Tools zu schreiben, die mir diese nervige Arbeit sehr erleichtern, indem
sie mir zeigen wo es Unterschiede zum Original gibt.
Als Resultat steht in den Commit-Nachrichten ständig etwas von "Borlandification".
Das bedeutet, ich behebe Fehler oder nehme nur kleine Änderungen vor die an der Funktionalität nichts Ändern.

Desshalb: "Borlandification" ist immer ein Schritt in die richtige Richtung!

In den letzten beiden Tagen habe ich die comsume()-Funktion (seg108) überarbeitet,
welche sich darum kümmert, dass das Essen und Trinken die Wirkung zeigt,
die die Programmierer ihnen zugedacht hatten.
Dort hatten sich einige von mir verursachte Fehler eingeschlichen,
die ich nun behoben habe.

Ausserdem habe ich die Wirkungen der Verwandlungs- und Veränderungszauber (seg101) überarbeitet,
bei denen allerdings keine nennenswerten Unterschiede zu erkennen waren.
(13.03.2014, 12:24)HenneNWH schrieb: [ -> ]Da meine Commit-Nachrichten immer kryptischer werden möchte ich euch, in menschlicher Sprache,
einen kleinen Statusbericht zukommen lassen:

Da bei meiner bisherigen Vorgehensweise nie so ganz klar war ob den Code richtig verstanden habe
oder aus versehen Tippfehler eingebaut habe, war es notwendig meine Arbeit überprüfbar zu machen.

Das habe ich bisher mit händischem Vergleich des Originals mit den Binärdaten, welche der Borland Compiler
aus meinem Code erzeugt gemacht. Eine zeit- und nervenaufreibende Arbeit.
Jetzt ist es mir gelungen ein paar Tools zu schreiben, die mir diese nervige Arbeit sehr erleichtern, indem
sie mir zeigen wo es Unterschiede zum Original gibt.
Als Resultat steht in den Commit-Nachrichten ständig etwas von "Borlandification".
Das bedeutet, ich behebe Fehler oder nehme nur kleine Änderungen vor die an der Funktionalität nichts Ändern.

Desshalb: "Borlandification" ist immer ein Schritt in die richtige Richtung!

Danke für diesen klärenden Eintrag, HenneNWH! Wie sieht deine Toolchain eigentlich genau aus? Diese Borlandification wäre ja auch für Schweif sehr nützlich, wäre es möglich, dass du diese Tools in das Repository steckst?
Danke für die Erklärungen. Ich war zum Teil recht ratlos, was genau du eigentlich gemacht hattest...
Eine Frage, die mir jetzt beim Testen aufgefallen ist: Wird der Hunger oder Durst eigentlich auch abgespeichert, bzw. könnte man den auslesen? Ich habe gerade versuchsweise etwas gegessen und getrunken, aber im Ausgabefenster gab es keine Meldung á la "Hunger hat sich verringert um X".
Ja, Hunger und Durst werden für jeden Charakter abgespeichert und man kann sie auslesen.

Solche Meldungen kann ich gerne ausgeben, wobei ich es persönlich nicht ganz so interessant finde,
aber wer du diesen Teil des Spieles besser beobachten möchtest, Bittesehr. :ok:

An dieser Stelle möchte ich noch anmerken, dass das Essen und Trinken in Tavernen und Herbergen
nicht über diese Funktion abgearbeitet wird.

Was interessiert dich denn?
Als sinnvolle Werte habe ich im Angebot:
  • Name des Konsumenten
  • Hunger-/Durstwerte (vorher/nacher)
  • Nährwert
  • Name des Konsumgutes

@all: Falls ihr noch mehr solcher Detail wissen möchtet, dann äußert bitte eure Wünsche hier und ich sage ob es geht
oder setze es um.

EDIT: Guck mal ob es deinen Wünschen entspricht.
Danke! :) Mich hat es einfach interessiert und dann gewundert, dass es nicht angezeigt wird. Denn eigentlich wird ja fast alles angezeigt! ;) Aber da es ja nur eine Sorte Essen und Trinken gibt (oder doch?) ist die Ausgabe wirklich nicht so interessant.

Leider scheint es nicht zu funktionieren. Im Ausgabefenster ist nix zu sehen...

Anbei der Log vom Build. [attachment=3818]