Crystals-DSA-Foren

Normale Version: Reverse Engineering der NLT
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Was genau meinst du mit systematisch? Also auf gut Glück durch den Quelltext gesprungen bin ich nicht :P;).

Ich weiß nicht, ob IDA auch einen Debugger auf Disassembler-Ebene bietet, aber allein das Potential, damit halbwegs lesbaren Quellcode zu erzeugen, ist schon enorm. Allerdings war es für mich wie gesagt etwas zuviel des Guten, ich wollte damals nur ein Programm beim Starten beobachten.

Turbodebugger klingt gar nicht schlecht, vielleicht finden sich Hinweise irgendwelcher Art in meinem "Heimatforum" ;). Aber wie gesagt: Der in DOSBox integrierte Debugger ist (zumindest im Vergleich zum OllyDbg) ziemlich gut ausgestattet. Insbesondere stehen die Debugger-Daten ja in einem eigenen Fenster, was die Übersicht enorm erhöht. Hat man sich dann mit den paar Befehlen vertraut gemacht, ist damit sehr schön zu arbeiten.

PS: Ich hatte ganz vergessen, dass Rüstungen ja auch AT/PA-Werte haben, die ich noch nicht gefunden habe. Ich hab's mal oben ergänzt, damit nicht der Eindruck entsteht, das Problem sei schon vom Tisch.
(16.07.2010, 07:27)thEClaw schrieb: [ -> ]Was genau meinst du mit systematisch? Also auf gut Glück durch den Quelltext gesprungen bin ich nicht :P;).
:lol: Nein, ich meinte, welche Geheimnisse sich noch im Quellcode verbergen, und welche davon am interessantesten sind.

(16.07.2010, 07:27)thEClaw schrieb: [ -> ]Ich weiß nicht, ob IDA auch einen Debugger auf Disassembler-Ebene bietet, aber allein das Potential, damit halbwegs lesbaren Quellcode zu erzeugen, ist schon enorm.
Ich kenne nur die Disassemblierungsfunktion. Kann sein, dass es auch ein Modul für die Ausgabe von C gibt, aber diese aus Assembler erzeugten Quellcodes sind von Natur aus bestenfalls so lesbar wie der Assemblercode. (Es sei denn, es sind Debugging-Symbole vorhanden.)
Naja, wenn man sich mit C gut auskennt und mit Assembler absolut nicht, dann ist so ein zusammengebrauter C-Code schon nett - und der von IDA war wirklich ganz gut. Aber da brauchte man glaub' ich schon irgendein Plugin oder sowas...

Was das systematische Suchen nach Geheimnissen angeht: Auf ein paar Kleinigkeiten wäre ich noch gespannt, z.B. ließen sich unverstandene Datenblöcke in den Daten zum Spiel verstehen (wie es mir bei der Suche nach den AT/PA-Werten passiert ist) oder natürlich Dinge von deutlich größerer Bedeutung erforschen. Ich werde auf jeden Fall noch tun, was nötig ist, um *meine* Fragen zu klären, darüber hinaus fällt mir auch nichts ein, das man dem Spiel noch entlocken müsste.

Ich frage mich übrigens schon eine Weile, wie ein Patch der Dosbox beim Spielen von DSA den Aufruf der Random-Funktionen offenbaren kann. Ist das ein komplett ans System gerichteter Aufruf, der einfach extern vom Spiel überwacht werden kann? Oder liegt eigentlich eine Dosbox vor, die Debug-Mittel besitzt und teilweise einsetzt? Falls mir das jemand mal kurz/grob/oberflächlich erklären kann, könnte ich wieder ruhig schlafen. :sleep:
Gute Arbeit thEClaw, :up:

ich kann zwar bei der Temperatur nicht alles Gedanklich erfassen, aber das wird auch wieder besser. :angry:
Bedenke bei den Waffenwerten auch den Bruchfaktor, den KK-Zuschlag und dass der Schaden wahrscheinlich Würfelwerte sind (nicht Min- und Max-Werte).
Siehe Würfelwerte der Kampfgegner.
Ja, ich hätte für den Schaden sowas wie 0x16 erwartet (was dann 1W6+6 entspräche) oder irgendetwas durchschaubares (ich bin deinem Link mal gefolgt, aber auch dieses Format kann ich nicht entdecken). Wenn ich mir so die sieben Byte des Zauberstabes/Hexenbesens anschaue (00 00 ff 00 00 00 00 - AT=PA=0), dann weiß ich nicht, was ich davon halten soll (Vgl.: Schwert - 00 00 01 01 0e 06 ff). Das bedeutet vermutlich etwas völlig anderes, ein Breakpoint bei Speicherzugriff wäre nützlich...
Ich mache mich mal auf die Suche nach den restlichen Werten für die Rüstungen, da muss irgendwo noch ein Geheimnis schlummern.

EDIT: Ich habe die besagte Funktion nochmal genauer unter die Lupe genommen und leider festgestellt, dass dort nichts mit AT/PA-Werten von Rüstungen gemacht wird. Nun stehe ich erstmal im Wald, da ich noch keinen Ansatz zum Weitermachen habe.
In der Funktion (28EA:038D call 1626:0025) werden also RS und BE von Rüstungen sowie AT/PA von Waffen aus dem Speicher geholt. Außerdem folgen am Ende noch Abfragen auf alle magischen Gegenstände, die man am Körper tragen kann (angeblich kann eine Kristallkugel den Gefahrensinn um 2 Punkte erhöhen? :-?). Auch letzteres finde ich halbwegs interessant, weshalb die Mühe jetzt nicht ganz umsonst war ;).

Gehe ich übrigens richtig in der Annahme, dass Waffen die Behinderung nicht erhöhen, also keinen BE-Wert haben? Wenn doch, muss ich was übersehen haben...

EDIT2: Als Gegenstände, die vom Rucksack aus den Charakter beeinflussen können, habe ich nur die Sichel (Pflanzenkunde +3) und das Amulett (MR +5) gefunden. Passt das so oder spricht etwas dagegen?
Noch ein EDIT: Laut Kunars Liste sind das alle magischen Gegenstände des Spiels, es ist also alles in Ordnung. Allerdings erwähnt Kunar auch, dass der Bonus durch die Kristallkugel erst ab DSA2 wirkt - was ja dem Code widerspricht. Entweder gibt es also auch hier noch einen Bug oder die Dinger wirken auch schon in DSA1.

Noch mehr neue Erkenntnisse :):
Ich habe mal schnell die AT/PA- und RS/BE-Werte von DSA2 ausgelesen, hier liegen erstere sogar in 8-Byte-Folgen vor. Bei DSA3 habe ich allerdings Probleme, da hängt sich Spiel oder Debugger auf, wenn ich irgendetwas machen will (z.B. den Charakter-Bildschirm öffnen). Kann mir da jemand helfen?
Ich fange mal einen frischen Post an, damit nichts verloren geht :):
Ich habe die Daten aus DSA3 schließlich ohne größere Disassemblierungen bekommen, einfach nur den Speicher ausgelesen und nach den Werten gesucht, die ich von DSA2 her kannte. Das klappte erstaunlich gut, womit ich jetzt über die AT/PA-Werte aller Waffen und die RS/BE-Werte aller Rüstungen aus allen drei Spielen verfüge. Während für jede Waffe in DSA1 7 Bytes zur Verfügung standen, sind es in DSA2 8 und in DSA3 10. Die 5 (bzw. 6 oder 8) zusätzlichen Byte müssen wohl andere Informationen enthalten...z.B. muss ja auch irgendwo eine "Maske" existieren, die gewisse Waffen gewissen Professionen zugänglich macht.
Auffällig ist auch, dass es Bytefolgen gibt, die gleichen AT/PA-Wert besitzen, sich aber nur im Rest unterscheiden. Das sind z.B. das Wurfbeil, der Morgenstern, der Dreizack, der Knüppel und der Belegnagel (alles DSA3, es gibt auch noch weitere).
Wurfbeil____- ff fd 05 ff ff 01 01 63 00 00
Morgenstern_- ff fd 01 ff ff 01 00 10 06 ff
Knüppel_____- ff fd 01 ff ff 01 03 0f 02 ff
Belegnagel__- ff fd 01 ff ff 01 03 0f 02 ff
Dreizack____- ff fd 01 ff ff 01 02 0d 06 ff

Offensichtlich gibt es Unterschiede bei diesen Gegenständen, vielleicht sieht ja jemand was, der sich damit besser auskennt.

Auf meiner ToDo-Liste stehen noch: AT/PA-Werte von Rüstungen (da bin ich kein Stück vorangekommen) und die attributsverändernden Gegenstände aus DSA2+3 (bei letzterem werde ich am Debugger scheitern, bei DSA2 bin ich noch nicht durchgestiegen). Mal schauen, ob ich das demnächst hinbekomme :).
Könnte das siebte Byte die Waffengattung sein?
Darüber habe ich auch schon nachgedacht - passt aber leider nicht.
Das wäre auch ziemlich redundant, die Info ist ja schon in der ITEMS.DAT zu finden.

Nachtrag:
Hier mal eine kleine Übersicht (nur DSA1), Bruchfaktor und KK-Zuschlag sind auch ausgeschlossen. Die erste "01" entspricht nicht der Anzahl der Würfel, der Zauberstab hat hier z.B. ein "ff" stehen, manch andere Waffe sogar eine Null.
Name____________| AT/PA/.._____________| HEX-Code | Professionen | Schaden |
----------------------------------------------------------------------------
Knüppel_________| ff fd 01 03 0f 02 ff | 02_______| GJKSTZ__DAFW_| 1W+1____|
Wurfbeil________| ff fd 01 01 63 00 00 | 10_______| GJKSTZ___AFW_| 1W+3____|
Morgenstern_____| ff fd 01 00 10 06 ff | 14_______| __K__Z_______| 1W+5____|
Bastardschwert__| ff fd 01 02 0d 06 ff | 71_______| __K__Z_______| 1W+5____|
Rabenschnabel___| ff fd 01 05 0e 01 ff | 73_______| GJKSTZ___AFW_| 1W+4____|
Doppelkunchomer_| ff fd 01 02 63 00 01 | 77_______| __K__________| 1W+6____|
Orknase_________| ff fd 01 04 63 00 ff | 88_______| GJKSTZ___AFW_| 1W+5____|


EDIT:
Ich war gerade kurz im Debugger, um mal dem Zusammenhang zwischen Profession und erlaubten Gegenständen auf den Zahn zu fühlen. Hennes Tipp mit den Realmode-Zeigern hat sich mal wieder als unbezahlbar erwiesen und ich habe jetzt die "Professions-Blacklist" im Arbeitsspeicher gefunden. Eine Probe auf Übereinstimmung mit der von Kunar erstellten Liste war ein voller Erfolg.
Mir fehlt nur noch die Analyse der Funktionen, die in DSA2 und 3 für die Anwendung attributsverändernder Objekte verantwortlich sind, dann kann ich die Weltherrschaft an mich reißen :silly:.
Ich weiß leider noch immer nicht, wie ich einen "richtigen" Debugger mit DSA verwende, weshalb ich auch mit den IDA-Projekt-Dateien nichts anfangen kann (es sei denn, die Infos darin sind in Klartext vorhanden und auch ohne IDA nutzbar).

Ein paar Anmerkungen: Hier gibt es ja eine Übersicht über den Inhalt der ITEMS.DAT. Kann es sein, dass bei "Itemtyp" Bits fünf und sechs vertauscht sind?
Ich habe noch nie etwas an einem Wiki verändert, aber ich will zumindest darauf hinweisen, dass die Bedeutung des 5. Bytes der Item-Daten zumindest für Waffen und Rüstungen jetzt geklärt ist (für DSA1: 7*(Byte 5) = Offset für zusätzliche Item-Informationen, die im RAM - und vermutlich auch in irgendeiner Datei - zu finden sind). Vielleicht trägt es ja mal wer ein :).
Meine bisher gesammelten Informationen (die ganzen Daten aus dem RAM, ein Teil der Assembler-Kommentare zu DSA1, Erklärungen, ein paar Excel-Tabellen mit Item-Infos) hänge ich mal in einem Archiv an - wie schonmal gesagt: Vielleicht braucht es mal wer, dann muss er sich nicht mit dem Debugger rumärgern :yes:.

Ursache für den ganzen Wind war übrigens, dass ich an meinem seit einiger Zeit auf Eis liegenden Spielstandskonverter weiterbasteln wollte und nichts weniger als Perfektion anstrebe ;). Jetzt kann man damit beliebig viele Spielstände beliebiger Spiele in das Format eines beliebigen Spieles konvertieren. Klingt dämlich :lol:, funktioniert aber für die gesamte NLT (einige Ecken und Kanten können natürlich noch drin sein). Nebenher ist auch noch ein Programm entstanden, mit dem man Portraits für DSA1 erstellen kann, dabei kann der Nutzer eine Reihe von Verfahren wählen, um das Ergebnis zu optimieren.
Ich werde im entsprechenden Thread mal ein kleines Update einfügen, falls jemand ein paar Minuten zum Testen entbehren kann, würde mich das freuen.

Falls es noch spannende, ungeklärte Fragen bezüglich der NLT gibt, die sich mit Hilfe eines Debuggers klären lassen, bin ich auch gern bei der Arbeit, das hat nämlich Spaß gemacht :).
(18.07.2010, 02:06)thEClaw schrieb: [ -> ]Nachtrag:
Hier mal eine kleine Übersicht (nur DSA1), Bruchfaktor und KK-Zuschlag sind auch ausgeschlossen. Die erste "01" entspricht nicht der Anzahl der Würfel, der Zauberstab hat hier z.B. ein "ff" stehen, manch andere Waffe sogar eine Null.
Name____________| AT/PA/.._____________| HEX-Code | Professionen | Schaden |
----------------------------------------------------------------------------
Knüppel_________| ff fd 01 03 0f 02 ff | 02_______| GJKSTZ__DAFW_| 1W+1____|
Wurfbeil________| ff fd 01 01 63 00 00 | 10_______| GJKSTZ___AFW_| 1W+3____|
Morgenstern_____| ff fd 01 00 10 06 ff | 14_______| __K__Z_______| 1W+5____|
Bastardschwert__| ff fd 01 02 0d 06 ff | 71_______| __K__Z_______| 1W+5____|
Rabenschnabel___| ff fd 01 05 0e 01 ff | 73_______| GJKSTZ___AFW_| 1W+4____|
Doppelkunchomer_| ff fd 01 02 63 00 01 | 77_______| __K__________| 1W+6____|
Orknase_________| ff fd 01 04 63 00 ff | 88_______| GJKSTZ___AFW_| 1W+5____|
Die Zugehörige Datei hierzu ist SCHICKM.EXE: Offset 0x17A7C (Knüppel) und Offset 0x17BCC (Orknase).
Ja, die kompletten Daten befinden sich in der SCHICKM.EXE. Offset 0x17a75 bis 0x17c34 - das sind 64x7 Byte, für jede "Waffenklasse" ein Block.
Die Rüstungswerte befinden sich bei 0x17c37 bis 0x17c66 (24x2 Byte). Dazwischen ist vermutlich zur Terminierung eine Doppelnull eingefügt.
Und wenn ich schonmal dabei bin :): Die "Professions-Blacklist" befindet sich bei 0x1776a bis 0x179f7. Hier gibt es 12 Blöcke (für jede Profession einer), die jeweils mit einem 0xffff abgeschlossen sind und keine feste Länge besitzen.

Das wirft natürlich die Frage auf, was sich zwischen 0x179f8 und 0x17a74 befindet ;). Der Bereich von 0x179f8 bis 0x17a27 sieht nach weiteren Realmode-Pointern aus (0x14fc:0xYYYY), danach folgen 77 Byte, denen ich auf die Schnelle keinen Sinn zuordnen kann.
(18.07.2010, 23:08)thEClaw schrieb: [ -> ]Ja, die kompletten Daten befinden sich in der SCHICKM.EXE. Offset 0x17a75 bis 0x17c34 - das sind 64x7 Byte, für jede "Waffenklasse" ein Block.
Ich hab jetzt man reingeschaut: die Waffendaten beginnen am Offset 0x17A70:
Code:
1 byte Trefferpunkte Würfelwurf: Anzahl sechsseitiger Würfel
1 byte Trefferpunkte Würfelwurf: Modifikator
1 byte Trefferpunkte Malus des Körperkraftzuschlag (d.h KK - Malus = Körperkraftzuschlag [wenn > 0])
1 byte Bruchfaktor
1 byte unbekannt
1 byte Attackemalus
1 byte Parademalus
Ist schon lange her, und daher kann mir meine Erinnerung einen Streich spielen, aber war nicht das Byte nach dem Bruchfaktor das Gift?:think:
(19.07.2010, 11:26)Asgrimm schrieb: [ -> ]Ist schon lange her, und daher kann mir meine Erinnerung einen Streich spielen, aber war nicht das Byte nach dem Bruchfaktor das Gift?:think:
Nein das ist es nicht, es hat wohl eher was mit den Fernkampfwaffen zu tun:

Code:
#,Name,Wert in des unbekannten Bytes
5,SPEER,1
9,KURZBOGEN,3
12,ARMBRUST,5
16,WURFBEIL,2
17,WURFSTERN,0
19,LANGBOGEN,4
33,WURFAXT,2
98,WURFMESSER,0
120,SCHLEUDER,1
216,SPEER,6
218,WURFDOLCH,7
Alle anderen Waffen haben einen Wert von 0xFF (signed -1). Obwohl die beiden Speere eigentlich keine Fernkampfwaffen sind...
(19.07.2010, 10:44)Borbaradwurm schrieb: [ -> ]
(18.07.2010, 23:08)thEClaw schrieb: [ -> ]Ja, die kompletten Daten befinden sich in der SCHICKM.EXE. Offset 0x17a75 bis 0x17c34 - das sind 64x7 Byte, für jede "Waffenklasse" ein Block.
Ich hab jetzt man reingeschaut: die Waffendaten beginnen am Offset 0x17A70:
Code:
1 byte Trefferpunkte Würfelwurf: Anzahl sechsseitiger Würfel
1 byte Trefferpunkte Würfelwurf: Modifikator
1 byte Trefferpunkte Malus des Körperkraftzuschlag (d.h KK - Malus = Körperkraftzuschlag [wenn > 0])
1 byte Bruchfaktor
1 byte unbekannt
1 byte Attackemalus
1 byte Parademalus
Wie ich weiter oben schon geschrieben habe: Dem Code nach beginnen die Daten erst 5 Byte später. Da wurde vielleicht beim Programmieren oder Kompilieren einfach ein Offset zu einem anderen addiert und ich habe mich blindlinks darauf verlassen, dass der sonst saubere Stil (entspräche hier dann 0x17a70 + 0x5) fortgesetzt würde.
Auf jeden Fall gibt dieser Ansatz Sinn für den Morgenstern, mehr habe ich jetzt nicht geprüft.

Hier nochmal die ersten Waffenwerte, wie ich sie aneinanderreihen würde:
Nach deinem Schema würden die gleichen Waffen jetzt folgenermaßen aussehen:
(19.07.2010, 11:26)Asgrimm schrieb: [ -> ]Ist schon lange her, und daher kann mir meine Erinnerung einen Streich spielen, aber war nicht das Byte nach dem Bruchfaktor das Gift?:think:
Hier geht es nicht um die Items im Inventar, sondern um die Quelle der allgemeinen Item-Eigenschaften (die in einem Array irgendwo im Quellcode versteckt sind). Gifte werden ja auf ein einzelnes Item angewendet - an dieser Stelle hätte höchstens eine "Gift-Maske" etwas zu suchen.
(19.07.2010, 12:21)thEClaw schrieb: [ -> ]
Code:
00 00 01 01 0e 06 ff - Hand
...
Nach deinem Schema würden die gleichen Waffen jetzt folgenermaßen aussehen:
Code:
01 04 0e 02 ff 00 00 - Hand
...
Bei mir ist das nicht die Bloße Hand, sondern das Schwert (TP: 1W6+4, TP+: KK-14, BF: 2, ?: -1, AT: ±0, PA: ±0).
Ups, du hast natürlich Recht - alle anderen habe ich nachgeschlagen, aber die Hand (bzw. das Schwert) nicht :pfeif:.

EDIT: Übrigens ist mir gerade eingefallen, wo ich einen Teil der 77 Byte zwischen Professions-Blacklist und Waffen-Werten schonmal gesehen habe:
Die Bytes 0x179f8 bis 0x17a26 sind Pointer, die während des Programm-Ablaufs auf die Anfänge der einzelnen Professions-Blacklists zeigen. Der erste Wert (14fc:03aa) zeigt also auf die dem Gaukler verbotenen Gegenstände usw.
Danach folgt in einer Lücke nur noch dieser Datenblock, der mir wiederum nicht bekannt vorkommt:

01 00 00 ff 9d 9d 9d 06
01 01 00 00 ff 9d 9d 06
02 01 00 00 00 9d 9d 07
01 01 00 00 00 ff 9d 04
02 02 01 00 00 ff fe 04
02 02 01 00 ff fe fd 03
02 02 01 01 00 00 ff 04
09 09 09 09 09 09 09 02
ff 00 00 00 00 00 00 00


Noch ein Nachtrag:
Der von mir weiter oben gepostete Datenblock nimmt in DSA3 bereits folgende Form an - Ideen bezüglich der zusätzlichen Bytes? ;)

01 04 0e 02 ff 00 00 02 ff ff - Schwert
01 01 0e 06 ff ff fd 01 ff ff
01 03 0f 02 ff 00 00 02 ff ff
01 00 10 04 ff fd fc 00 ff ff
01 03 63 05 01 00 fd 06 ff ff
01 02 0f 01 ff 00 ff 02 ff ff
01 04 0e 05 ff 00 fd 03 ff ff
01 03 63 00 03 00 00 04 0a 00
02 04 0e 03 ff ff fc 03 ff ff
01 06 63 00 05 00 00 04 0d 00
01 01 0f 03 ff fe fd 00 ff ff
01 03 63 04 02 ff fd 05 ff ff
01 01 63 00 00 00 00 05 ff ff
02 04 0e 03 ff fe fd 02 ff ff
01 04 63 00 04 00 00 04 0a 00
01 05 0f 05 ff ff fd 01 ff ff - Morgenstern
Den Zwölfen zum Gruße!

(16.07.2010, 16:51)thEClaw schrieb: [ -> ]Laut Kunars Liste sind das alle magischen Gegenstände des Spiels, es ist also alles in Ordnung. Allerdings erwähnt Kunar auch, dass der Bonus durch die Kristallkugel erst ab DSA2 wirkt - was ja dem Code widerspricht. Entweder gibt es also auch hier noch einen Bug oder die Dinger wirken auch schon in DSA1.

Welche Liste ist gemeint? Magisches und Besonderes stammt nicht von mir.
Puh, die von dir verlinkte Liste habe ich nicht genommen - kann ich aber gut gebrauchen :P. Allerdings weiß ich jetzt wirklich nicht mehr, wo ich die Liste mit den Gegenständen her hatte...eventuell habe ich da was verwechselt, deine Excel-Tabelle schwirrt nämlich auf meiner Festplatte rum und wird auch recht oft aufgerufen.
EDIT: Scheinbar habe ich mich vor längerer Zeit doch mal bei der verlinkten Liste bedient, zumindest einige der Beschreibungen sind enthalten. Dann ist da ein kleiner Fehler drin (wegen der Kristallkugeln), Kunar hat natürlich keine Fehler gemacht. ;)
Wird an diesem Projekt eigentlich noch gearbeitet?