Reverse Engineering der NLT - Druckversion +- Crystals-DSA-Foren (https://www.crystals-dsa-foren.de) +-- Forum: Allgemeines zur Nordlandtrilogie DOS (https://www.crystals-dsa-foren.de/forumdisplay.php?fid=20) +--- Forum: Technische Werkstatt (https://www.crystals-dsa-foren.de/forumdisplay.php?fid=34) +--- Thema: Reverse Engineering der NLT (/showthread.php?tid=700) |
RE: Reverse Engineering der NLT - HenneNWH - 03.06.2012 Es gibt 164 Stellen im Spiel die die Zeit etwas nach vorn Spulen. Ich möchte zu Zurgrimms Liste noch folgendes hinzufügen:
RE: Reverse Engineering der NLT - tommy - 03.06.2012 Ich hoffe du schreibst dir die ganzen Informationen auch immer schön auf, dass du sie irgendwann mal in geballter Form präsentieren kannst RE: Reverse Engineering der NLT - HenneNWH - 03.06.2012 Natürlich... ...als Sourcecode. RE: Reverse Engineering der NLT - tommy - 03.06.2012 (03.06.2012, 18:53)HenneNWH schrieb: Natürlich... Das sollte ja schon ausreichen RE: Reverse Engineering der NLT - HenneNWH - 03.06.2012 Hey Obi, bau bitte nochmal eine neue Version. Ich hatte noch einen Fehler, der bewirkt, dass man nur noch eine Nacht in der Herberge schlafen kann. Der ist jetzt behoben. Außerdem habe ich das Vorspulen etwas gedrosselt. RE: Reverse Engineering der NLT - Obi-Wahn - 03.06.2012 Et voilí . Danke für die zusätzlichen Infos über die "Zeitsprünge". Läuft also irgendwo ein sekundengenauer Spielzeit- oder Aventurienzeit-Timer mit? RE: Reverse Engineering der NLT - HenneNWH - 04.06.2012 Ja es gibt so einen Spielzeittimer. Das Spiel hat eine Hauptschleife, welche i.d.R. verlassen wird wenn der Spieler das Spiel beendet. Würde man bei jedem Schleifendurchlauf die Ingame-Zeit erhöhen wäre sie von der Dauer eines Schleifendurchlaufs abhängig. Diese Dauer wird meistens durch die Taktfrequenz der CPU bestimmt, was bedeuten würde: Je schneller die CPU desto schneller die Ingame-Zeit. Das wäre katrastophal! Schick wurde für den 80286 geschrieben welchen es u.A. mit 4MHz und 25MHz gab. Hätte man für die 4MHz Variante entwickelt, wäre die Ingame-Zeit auf dem 25MHz Modell etwas mehr als sechs mal so schnell vergangen. Mein Prozessor hat 2400MHz, das 600-fache vom 4MHz-Modell. Die bessere Lösung wäre soetwas wie ein Metronom mit einer festen Frequenz, die auf jedem Rechner gleich ist. Soetwas gibt es. Der Intel 8253 PIT mit einer Frequenz von 18.2Hz unterbricht ca. alle 55ms den Prozessor und ein Unterprogramm für das aktualisieren der Menschen-Uhrzeit wird aufgerufen. Die Programmier haben beim Spielstart dieses Unterprogramm auf ein Eigenes umgeleitet und erhöhen bei Ausführung die Ingame-Zeit um einen Tick. Außerdem führen sie auch das alte Unterprogramm aus, damit beim Beenden des Spiels die Menschen-Uhrzeit nocht stimmt. Eine Ingame-Stunde besteht aus 5400 Ticks. Daraus folgt: 1 Ingame Stunde = 5400 Ticks / (18.2 Hz * 60s) = 5 min in Menschen-Zeit. Frage: In wieviel Menschen-Zeit würde eine Ingame-Stunde auf meinem Prozessor vergehen, wenn die Ingame-Zeit in der Hauptschleife aktualisiert werden würde? Schick wäre für die 4MHz Variante entwickelt worden. Die Ingame-Zeit läuft also auch wenn man nichts tut. Möchte der Spieler das verhindern, so kann er mit STRG+P die Pause aktivieren. Die Ingame Zeit läuft dann nicht weiter. Dadurch, dass das Spiel vom diesem Unterprogramm an jeder beleibigen Stelle unterbrochen werden kann ergeben sich Nebenläufigkeiten. Das Unterprogramm ist nämlich nicht nur für die Zeit zuständig, sondern aktualisiert auch die Animationsbilder, z.B. im Tempel. Vielleicht ist ist euch beim Start von Schick manchmal aufgefallen, dass die Augen des Priesters im Tempel im Slot des NPC erscheinen. Das ist das Resultat von nicht ordentlich behandelten Nebenläufigkeiten und tritt auch nicht immer auf. Diese Art von Fehlern zu debuggen ist nochmal eine Kunst für sich. Mal sehen ob ich das auch noch lerne. RE: Reverse Engineering der NLT - Zurgrimm - 04.06.2012 (03.06.2012, 18:08)HenneNWH schrieb: (04.06.2012, 09:05)HenneNWH schrieb: Die Ingame-Zeit läuft also auch wenn man nichts tut.Im Grunde ist das keine ganz neue Erkenntnis, auch wenn sie noch nicht so genau analysiert war. Die Beobachtung, daß die Zeit schneller vergeht, wenn man herumläuft und langsamer, wenn man untätig herumsteht, haben schon viele gemacht. Daß bei jedem Schritt die Zeit quasi einige Sekunden oder Minuten vorgespult wird, war so konkret aber noch nicht klar. Die Tatsache an sich wurde jedoch bereits zur Grundlage von TeraBlights Terminologie der Ingame-Inaktivitäts-Stunden. Im Rahmen der Erklärung der Einhorn-Mechanik hat er dabei auch einen Zusammenhang zwischen Verhältnis von Ingame- und Realzeit und Spiellaufgeschwindigkeit erkannt. RE: Reverse Engineering der NLT - Reg Schuh - 04.06.2012 (04.06.2012, 09:05)HenneNWH schrieb: Vielleicht ist ist euch beim Start von Schick manchmal aufgefallen, dass die Augen des Priesters im Tempel Ach, daher kommt das. Beim ersten Mal habe ich das in einem Phex-Tempel (!) gesehn und habe es für einen versteckten Hinweis gehalten, heimlich spähende Augen oder so - war natürlich nichts weiter zu rauszubekommen. Nachdem die Augen immer mal wieder zu sehen waren, habe ich an NPCs gedacht, die im Tempel warten. Ist natürlich auch kein NPC, der in Rybon im Tempel wartet. ;-) Andere kurze Frage zu meiner "Speer-Hoffnung": (02.06.2012, 21:54)HenneNWH schrieb: Da kann ich leider auch erstmal nicht helfen, Wo beginnt das Datensegment in der SCHICKM.EXE? Die Zahlen zu den Waffen ab #17A70 habe ich dank der früheren Einträge hier schon gefunden. Und: Ist die SCHWEIF.EXE grundsätzlich ähnlich aufgebaut? Schon mal da reingeschaut gehabt? RE: Reverse Engineering der NLT - HenneNWH - 04.06.2012 (04.06.2012, 09:34)Zurgrimm schrieb:(03.06.2012, 18:08)HenneNWH schrieb: TeraBlight's Aussage kann ich soweit bestätigen, bis auf die Tatsache, dass die Ingame-Zeit nicht von der CPU-Geschwindigkeit (oder den DOSBox-Cycles) abhängt. (04.06.2012, 09:47)Reg Schuh schrieb:(04.06.2012, 09:05)HenneNWH schrieb: Vielleicht ist ist euch beim Start von Schick manchmal aufgefallen, dass die Augen des Priesters im Tempel Ich finde es bemerkenswert, dass die Fehler in diesem Spiel von Vielen für geheimnisvolle Features gehalten werden und es noch mehr aufwerten. Vielleicht ist es doch keine so gute Idee das Spiel zu sehr demystifizieren. (04.06.2012, 09:47)Reg Schuh schrieb: Andere kurze Frage zu meiner "Speer-Hoffnung": Bei der SCHICKM.EXE (v3.02de) beginnt das Datensegment an Offset 0x173c0. Bei EXE-Dateien die mit dem Borland-C++ Compiler übersetzt wurden erkennt man das an 4 Nullen (0x00) und der Zeichenkette "Borland C++". Die von dir genannte Adresse hat schon etwas mit den Waffen zu tun, aber die Bedeutung habe ich leider noch nicht erschlossen. (31.05.2012, 18:37)Reg Schuh schrieb: -Auch nach einen Neustart mit neuer Gruppe arbeitet ein Speer wie eine Wurfwaffe. Achja, in der Generierung haben die Helden noch keine Gegenstände. Die bekommen sie erst wenn sie in die Gruppe aufgenommen werden. RE: Reverse Engineering der NLT - Arbosh - 09.06.2012 Hatte heute mal was ganz exotisches: Die Dosbox fror mit komplett ein und im Logfenster erschien viel zu viele Meldungen das dieser und jener Held etwas gegessen hätte: Zitat:Aktuelles Gruppenvermoegen = 1056D 3S 6H Das Szenario war dabei, dass ich aus der Piratenhöhle auf Manrek rauskam und ich dabei (wie immer) automatisch nach Brendhil weiterwanderte (ich kam aus Manrin). Das Bild fror dann aber noch auf dem Kartenbildschirm ein. Geistesgegenwärtig habe ich noch den GDB mal einen Backtrace machen lassen, vielleicht hilfts: Zitat:#0 0x08322988 in M302de::get_item_pos (hero=0xb55508b6 "HJALDA", item=23) at seg002.cpp:3132Ich weiß nicht obs etwas damit zu tun hat, da ich schon öfter folgendes beobachtet habe (und ich nicht weiß ob es eventuell ein Originalbug ist): Im manuellen Kampf kommt es manchmal vor, das wenn man "Alte Optionen" wählt, dieser Eintrag verschwindet und das Menü immernoch dasteht. RE: Reverse Engineering der NLT - HenneNWH - 09.06.2012 Puh, da habe ich sicher in der herokeeping() - Funktion eine Bedingung falsch interpretiert. Das werde ich umgehend beheben. Danke fürs reporten. Mir wird langsam klar, dass ich eine Möglichkeit brauche, den von mir erstellten Code mit dem Original zu vergleichen damit solche Bugs nicht mehr so oft auftreten. Zu deiner Frage mit dem "Alte Option"-Menüeintrag: Beim Auswählen dieses Eintrages wird die letzte Handlung nochmal ausgeführt (z.B. Angriff). Kann die Handlung nicht mehr ausgeführt werden, weil der Gegner geflohen ist, wird das Kampfmenü nochmal ohne diese Option angeboten. Deckt sich das mit dem was Du meinst? Ich halte das für Absicht, aber man hätte auch noch eine Meldung wie "Das geht leider nicht mehr." ausgeben können. RE: Reverse Engineering der NLT - Rabenaas - 09.06.2012 Back-to-back-Tests wären theoretisch einer Möglichkeit, die sich gut in den Aufruf Deiner externen Funktionen einbauen ließe. Allerdings besteht das Problem der Seiteffekte, also Zugriffe auf Heap und globale Variablen. Die müsste man irgendwie loggen. RE: Reverse Engineering der NLT - HenneNWH - 09.06.2012 Ich hätte eher an eine statischere Testmethode gedacht. Grob: Da ich den passenden Kompiler "Borland C++ 3.1" da habe, kann ich mir von meinem Code OBJ-Dateien bauen lassen. Der Code in den OBJ-Dateien muss dann in der SCHICKM.EXE zu finden sein. Details: In den OBJ-Dateien sind viele Informationen noch nicht in den Code eingetragen, z.B. die Adresse von externen Funktionen bei CALLS oder die Adressen im Datensegment. Es müssten die OP-Codes einer Funktion verglichen werden, Adressen von Sprungbefehlen und globalen Variablen müssten ignoriert werden. Wenn das auf diese Art gemacht werden würde, wäre es sogar möglich aus meinem Code wieder eine DOS-Version von Schick zu bauen, die 1:1 den gleichen Code enthält. Das wäre imho der eindeutige Beweis, das ich alles richtig gemacht habe. RE: Reverse Engineering der NLT - Rabenaas - 09.06.2012 Das wäre natürlich die fast perfekte Dekompilierung. (Abgesehen von Formatierung und Bezeichnern.) Allerdings veränderst Du ja die Quellen, behebst Fehler, verbesserst vllt auch Algos. Außerdem macht der Vergleich auch wieder Mühe. Ich würde eine weniger perfekte, aber dafür automatisierbare Möglichkeit vorziehen. EDIT: Und ist eigentlich bei Schick die Compileroptimierung ausgeschaltet? Sonst müsste man die auch noch reproduzieren. RE: Reverse Engineering der NLT - Arbosh - 09.06.2012 (09.06.2012, 09:19)HenneNWH schrieb: Zu deiner Frage mit dem "Alte Option"-Menüeintrag: Deckt sich leider nicht, der Gegner war in diesen Fällen immer noch da. Bei toten Gegnern kommt ja korrekterweise auch die Meldung "Hier brauchst du keine Kraft mehr zu verschwenden". RE: Reverse Engineering der NLT - HenneNWH - 09.06.2012 Das Verändern und Fehlerbeheben habe ich _fast_ immer in PreProzessor-Bedingungen gepackt, damit man meine Änderungen auch abschalten und ich sie schneller wiederfinden kann. Mit etwas Brainpower ist diese Variante auch automatisierbar. Eines Vorweg: Was ich jetzt schreibe ist nicht wirklich fundiert, da ich Compilerbau noch nicht hatte. Die Optimierung von "BC++3.1" hat 13 Schalter mit 2 Zuständen und 2 Schalter mit 3 Zuständen, also ca 72.000 verschiedene Möglichkeiten, die für jede C-Datei gesetzt werden können. Wenn ich BC-Code mit dem von Schick, per Auge vergleiche kann ich aber schon gut abschätzen an welchem der Knöpfe ich drehen muss. Das ist noch etwas Handarbeit, aber machbar. Mittlerweile weis ich ja ganz gut was der BC so ausspuckt. RE: Reverse Engineering der NLT - HenneNWH - 09.06.2012 Soo, es ist sehr wahrscheinlich, dass der Bug jetzt gefixt ist. Anbei ein paar neue Funktionen:
RE: Reverse Engineering der NLT - Obi-Wahn - 10.06.2012 Und eine neue Version für die Windows-Nutzer. Ich versuche jetzt auch mal wieder ein bisschen öfters mit BrightEyes zu spielen und ich bin bisher noch auf keine Bugs gestoßen. (Bin aber noch nicht sonderlich weit) RE: Reverse Engineering der NLT - Arbosh - 12.06.2012 (09.06.2012, 10:49)Arbosh schrieb:(09.06.2012, 09:19)HenneNWH schrieb: Zu deiner Frage mit dem "Alte Option"-Menüeintrag: Habe es gerade mit dem Original-DSA auch gehabt: In der letzten Runde hat jeder Held den Gegner angegriffen und dieser lebte anschließend noch. Beim x-ten Auswählen von "Alte Optionen" verschwand der Eintrag einfach und ich blieb im Menü und ging über "Angriff" weiter. Das passierte der Reihe nach bei allen Helden. Anschließend wiederholte sich das Spielchen, d.h. nachdem es einmal auftritt das "Alte Optionen" einfach verschwindet kann man es nicht mehr sinnvoll verwenden. Werde das mal noch in den Bug-Thread verlinken. |