Crystals-DSA-Foren

Normale Version: Reverse Engineering der NLT
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Release again:

Ersetzte Funktionen (Segmente sind komplett identisch)
  • seg025: Locations, Optionsmenu
  • seg061: Tempel (jetzt komplett aktiv), Helden (aufnehmen, entlassen, löschen), Wunder-Hilfsfunktionen
  • seg062: Wunder

Bugfixes:
  • Falscher Wert auf DOSBox-CPU Stack geschrieben. (Harmlos)
  • Endlosschleife beim vertauschen der Plätze von zwei Helden mit der Maus (Ärgerlich)
  • Zwei Bugs beim Verlassen eines beliebigen Dungeons. (Keine Ahnung!)

Dokumentation:
  • Rabenaas Kommentare und Ausgaben zur Mine in Oberorken

Was kommt als Nächstes?
  • Dialogcode
  • Location: Händler
  • Location: Stadtcamp
  • Location: Wildniscamp
  • Dungeon: Spinnenhöhle
  • Stadt: Zufallsbegegnungen
  • Check: Skripte zum Vergleichen der Binärdateien (erfordert eigenen Borland C++ 3.1 Compiler)
  • mehr Dungeon-Handler nachbauen

Statistik:
  • Es sind 816 von 1236 Funktionen sind nachgebaut (66,02%).
  • Davon sind 773 identisch mit dem Originalcode.
  • Nach Byte-Metrik sind schon 80,97% fertig

Viele Grüße,
HenneNWH

EDIT:
Noch ein paar kleine Infos zu den Wundern:
  • Alle Götter wirken Wunder ab einem Ansehen von 100, ausser PHEX, welcher erst ab 500 wirksam wird. (Wiedererweckung ausgenommen)
  • Je höher das Ansehen, desto wahrscheinlicher ist es dass ein Wunder gewirkt wird.
  • Das Auferwecken Toter Helden ist in allen Tempel möglich, unabhängig von der Entität.
  • Swafnir wirkt keine Wunder. (Hiermit bestatigt!)
  • Die Seite Aventurische Götter und ihre Wunder kann jetzt mit den genauen Werten aus Schick (seg062.cpp) ergänzt werden.
Neue Version vom 12.06.2015!

Zusätzlich hier noch die Version mit VS2102: [attachment=4208]

Beide Bugs treten bei mir nicht mehr auf.
(12.06.2015, 11:21)Obi-Wahn schrieb: [ -> ]Beide Bugs treten bei mir nicht mehr auf.

Der Helden-Vertausche-Bug war für mich leicht zu finden.
Den ersten von dir genannten Bug habe ich soeben gefunden.
Er trat auf, wenn ein Held per Wunder geheilt wurde.
Mit dem Einbinden der Wunderfunktion ask_miracle() hatte der Fehler keine Wirkung mehr gezeigt.

Danke nochmal fürs melden.

Henne
(10.06.2015, 20:21)Jandor schrieb: [ -> ]Lippens, ein kleines Geschenk ganz besonders für Dich (und natürlich auch alle anderen ;))

Du hast Dich doch wiederholt erkundigt, ob jemand weiss, wo die Zaubertypen der Gegner definiert sind. Ich habe sie soeben in der schweif.exe aufgestöbert. Wie gehabt hier der erste Block, welcher dem Zauberrepertoire 00 aus der Monster.dat entspricht: 01 07 08 FF FF, danach folgen ohne Unterbrechung die restlichen 12 Zauberklassen.

Die IDs sind im einzelnen: 01 - normaler Angriff, 02 - Sanftmut, 03 - Böser Blick, 04 - Horriphobus, 05 - normaler Angriff, 06 - normaler Angriff, 07 - Blitz, 08 - Eisenrost, 09 - Fulminictus, 0a - Igni, 0b - Plumbum, 0c - normaler Angriff, 0d - Armatrutz, 0e - Paralü.

Da ich die dazugehörigen Zauberdefinitionen der Gegner gleich mit gefunden habe, hier noch eine kleiner Änderungsvorschlag für die, denen es noch nicht kompliziert genug ist:

00 0d 03 00 05 02 06 01 00 92 - AE-Kosten / Ziel / von fern / Probe

Das ist der Paralü. Setzt man das von-fern byte auf 01, was dem 'ja' entspricht, sind die Gegner gleich wieder ein wenig garstiger...

Gruss, Jandor

gut, die Definition der Magierklassen habe ich nun, demnach ist es so, dass offensichtlich eine Reihe von Zaubern für die Gegner definiert sind, die aber nicht mit den IDs der Heldenzauber korrespondieren, womit mein Traum, durch hexen an ebendieser Stelle den Gegnern einen komplett neuen Zauber beibringen zu können wohl einer bleiben wird, weil es nicht im Spiel integriert ist. Ich hätte zu gerne gesehen, dass einer der Namenlosenpriester etwa einen Dämonen beschört oder ein Zauberer meinen Zwerg in einen Fliegenpilz verwandelt hätte. Schade, aber trotzdem vielen Dank, dass du diese Stelle aufgespürt hast, Jandor. Vielleicht geht es ja in HD? Da kommt man ganz leicht ran an die magierklassen und den Code kapiert auch jeder Depp, wenn er ein bisschen englisch kann.

Die NLT ist nicht gerade das Moddingfreundlichste Computerspiel.

Eine kleine Hoffnung habe ich noch: wenn du bitte in Riva suchen könntest? irgendwo muss da die Stelle definiert sein, wo Pergor als Magier seine Helfer beschwören kann (neben diversen anderen Zaubern). Vielleicht kann man das auch anderen Magiebegabten Gegnern beibringen.
(12.06.2015, 15:38)Lippens die Ente schrieb: [ -> ]Eine kleine Hoffnung habe ich noch: wenn du bitte in Riva suchen könntest? irgendwo muss da die Stelle definiert sein, wo Pergor als Magier seine Helfer beschwören kann (neben diversen anderen Zaubern). Vielleicht kann man das auch anderen Magiebegabten Gegnern beibringen.

Wenn es weiter nichts ist ;) Ich bin was Riva angeht ja eher sehr bescheiden gut sortiert, aber da in der .alf und .exe hinreichend viele Dinge sehr ähnlich sind, die für dein Anliegen wichtig gewesen sind, war das schnell gefunden. Genug der Vorrede, in Riva ist also ein weiterer Zauber für Feinde definiert, dessen Wirkung die Beschwörung von Helferlein ist. Er wird im Spruchrepertoire der Gegner mit 0F dargestellt.

Aber noch etwas in eigener Sache: es gibt ein paar Dinge, die ich schon länger erfolglos suche, vielleicht könnt Ihr mir da weiterhelfen:

1) Ist bekannt, wo die Immunität der Skelette und Skelettkrieger gegen Beherrschungen versteckt ist? Sie ist ja ganz offenbar mit dem im Kampfbildschirm verwendeten Modell verbunden. Das Feuergeister (bzw genauer: Gegner, die das Feuergeistmodell verwenden) den RS ignorieren, ist ja ein ähnliches Ding...

2) Gibt es eine Idee, wo die Tragkraftberechnung stattfindet? Ich würde da gerne ein wenig herumpfuschen, um die übergewichtige Bedeutung der KK im ganzen Spiel zu verringern.

3) Stufenanstieg: wo sind die verflixten W6, die das Steigern von LE und AE auswürfeln? Wo sind die 2W6/3W6, die über das Gelingen oder Misslingen eines Steigerungsversuches entscheiden?

Gruss, Jandor.
Hallo Jandor,

ich kann dir leider nur sagen wie es in SCHICK gehandhabt wird. Es ist aber anzunehmen, dass es in den anderen beiden Teilen ähnlich ist.

1) Die Wirksamkeit gegen Skelette wird anhand der Spriteset-ID des Gegners bei den entsprechenden Zaubern geprüft.
Verschiedene Arten von Skeletten haben zwar unterschiedliche Gegner-IDs, aber das gleiche Spriteset.
Z.B. Band und Fessel ist nicht gegen Skelette wirksam.
In Zeile 206 in seg099.cpp wird die Spriteset-ID auf Skelette geprüft und der Zauber abgebrochen.

Somit existiert kein Immunitätsflag in der Gegnerbeschreibung.

2) Das kann ich auf die Schnelle auch nicht genau sagen.

3) Die Funktion fürs Würfeln befindet sich in Zeile 65 in
seg007.cpp.
Ich habe ihr den Namen dice_roll() gegeben.
  • n = Anzahl der Würfel
  • m = Art der Würfel (W6, W20, etc.)
  • x = Bonus/ Malus

Ein Wurf auf 1W6+3 wäre mit dice_roll(1, 6, 3) zu realisieren.
Gibt's noch was mit niedriger Priorität, das man erledigen könnte?
(11.06.2015, 15:47)HenneNWH schrieb: [ -> ][...]
Hallo Jandor,
[...]
Die IDs der Zauber in SCHICK sind relativ ähnlich.
Ich vermute, dass Du mit "normaler Angriff" die gezeigte Animation und nicht die Wirkung im Spiel meinst.

Hierzu noch ein kleiner Link ins Bright-Eyes Repo:
seg102.cpp/Zauber der Gegner

Hallo und ein spätes Dankeschön für Deine sehr umfangreichen Antworten! Ich meinte tatsächlich, dass nichts passiert, auch wenn ich schon eine Vermutung hatte, welcher Zauber eigentlich hätte gewirkt werden sollen. Dank Deinem Link weiss ich nun, das ich (fast) richtig gelegen habe, und was noch viel besser ist: Lippens hat mich eben durch seine andererorts veröffentlichte Analyse der Schick-HD-KI darauf gebracht, warum ein paar Zauber nicht funktionieren: wenigstens in meiner Spielversion verwenden Saft-Kraft, Balsam, Axxeleratus und Verwandlung beenden alle eine Definition für das erlaubte Zauberziel, die wohl mal 'self/friend' bedeuten sollte, mit der offenbar aber nix angefangen wird. Mit dieser Erkenntnis war das Problem schnell durch die alternative Zielzuweisung 'self' behoben: jetzt funktioniert alles fast so, wie es soll. Nun ja, wenigstens bis auf den Verwandlung beenden, versteht sich...

Dafür vielen Dank an Dich Henne und den (versehentlich) beteiligten Lippens.

Aber vielleicht eine Frage der Neugier wegen: funktionieren denn die eben erwähnten Zauber in der alten Schicksalsklinge bzw. Riva? Mir ist das nie aufgefallen, aber ich bin dem zugegebenermassen auch nie nachgegangen...

Gruss, Jandor.
(16.06.2015, 11:51)Jandor schrieb: [ -> ]Dafür vielen Dank an Dich Henne und den (versehentlich) beteiligten Lippens.
Aber gerne doch. :D

(16.06.2015, 11:51)Jandor schrieb: [ -> ]Aber vielleicht eine Frage der Neugier wegen: funktionieren denn die eben erwähnten Zauber in der alten Schicksalsklinge bzw. Riva? Mir ist das nie aufgefallen, aber ich bin dem zugegebenermassen auch nie nachgegangen...

Diese Antwort betrifft wieder einmal nur SCHICK:

Es gibt unterschiedliche Funktionen für Helden- und Gegnerzauber.
Der obengenannte Link ist zur CPP-Datei der Gegnerzauber, hier sind die Links für die Heldenzauber:

seg099.cpp/Zauber der Helden I
seg100.cpp/Zauber der Helden II
seg101.cpp/Zauber der Helden III

Zu den Heldenzaubern:
Ja, diese Zauber funktionieren alle.
Es gibt eine Zauberbeschreibungstabelle, in welcher u.A. steht,
welche Sprüche nicht auf Gegner oder nicht auf Helden angewand werden können.

Die Zauber Saft-Kraft, Balsam, Axxeleratus und Verwandlung beenden sind ausschließlich für Helden gedacht,
d.h. es wird nicht innerhalb der Zauberfunktion geprüft ob der Zauber auf einen Gegner angewandt wurde,
sondern anhand der Tabelle.

Btw, den Zauber Verwandlung beenden kann ein Held schon auf sich anwenden.
Wenn er Versteinert ist, dann kann er ja sowieso nicht zaubern.
Als Erstes wird die Versteinerung aufgehoben.
Ist der Held nicht Versteinert wird eine Transformation (alle positiven Eigenschaften -1) aufgehoben.
Hat der Held beides, so muss der Zauber zweimal hintereinander ausgeführt werden.

Die AE-Kosten für das Aufheben der Versteinerung sind 5*W10.
Das mit den unterschiedlichen Definitionen für Gegner- und Heldenzauber war mir bekannt, meine Frage hatte auf die Gegnerzauber-Entsprechung von Axxeleratus & Co abgezielt. Ich habe dann doch noch schnell selbst in schick nachgesehen, wo ich aber meine Erwartung bestätigt fand: sie funktionieren auch da nicht ohne die Veränderung des zulässigen Ziels - wenigstens bei mir nicht.

Als ich die von Dir gepostete -sehr aufschlussreiche- Liste der Heldenzauber überflogen habe, ist mir aufgefallen, dass der Illusion ja als Kampfzauber implementiert ist und auf ein bestimmtes Flag (?) prüft. Wo und welches ist das denn? (Wie) Kann man Monstern die Eigenschaft 'illusionär' verleihen?
Hier ist ein Patch, der die Zauber testweise über Lua laufen lässt. FlimFlam ist als Lua-Funktion implementiert. Man muss noch spells.lua in das Verzeichnis kopieren, von dem aus man BrightEyes startet.
Wo findet man denn die Gegner-KI? :think:
@Lua: Geilo! Das ist ja prickelnd :)
Sehr schön gemacht. Bin gespannt, wie das weitergeht!
:D Ich habe das etwas aufgeräumt und noch einen weiteren Zauber umgesetzt. (Dunkelheit funktioniert genau wie FlimFlam. :lol: )

Wir benötigen eine API, welche die ganzen Innereien kapselt, und die von LUA aus aufgerufen werden kann.
Ah, besser noch. Magst du da noch was zu sagen? Die Timer in schick.lua bekommen nur eine ID oder was bedeutet die Zahl?

lua_spells::claudibus ist dann z.B. noch eine cfunc(), die aber dennoch für Lua registriert wird, um dann vom Lua-Spellhandler aufgerufen zu werden (mit direkter Weiterleitung an das
Segment m302::..)? Da du ja Flimflam und Dunkelheit dort auskommentiert hast, gehe ich davon aus, dass diese Funktionen nur Platzhalter sind, solange der Spell nicht in Lua nachgebaut wurde, ja?

Und wofür ist der Aufruf von copyMessage() in spells.lua? Wird damit der eigentliche Zaubereffekt ausgelöst? Also z.B. die Helligkeit erhöht/reduziert?
Lua soll im Normalfall eine Art durchsichtige Zwischenschicht sein. Statt den Zauber direkt aufzurufen, wird Lua cast_spell(n) aufgerufen, das dann den Zauber aufruft. Ist aber ein Zauber dieses Namens in spells.lua vorhanden, wird dieser statt der C-Funktion aufgerufen. lua_spells::claudibus usw. sind nur Stubs fur M302de::spell_claudibus usw., weil Lua die nicht direkt aufrufen kann.

Die Nummer des Timers ist die interne ID (genauer gesagt ein Speicheroffset) von Schick. CopyMessage gibt eine bestimmte Stringkonstante (sind ebenfalls durchnummeriert) als Textbox auf dem Bildschirm aus. Die Zauberwirkung erfolgt in diesem Fall indirekt durch den Timer. Solange der läuft, ist es hell.
Das klingt interessant. Da ja bei cast_spell das Skript die benötigten Modifier ausliest, ist das Ziel also, möglichst viel in Lua zu machen.
Würde natürlich auch die Entwicklung neuer, eigener Spells stark vereinfachen... ;)

Der Weg über den Timer ist aber noch sehr dreckig. Schöner wäre, wenn der Timer ein Lua-Objekt wäre, das von der Engine aktualisiert wird (z.B. update_lua_timers...), und die Modifikation der Helligkeit selbst im Lua-Skript laufen würde. Aber ich glaube, da hat (noch) keiner Lust, die benötigten Funktionen der Engine für Lua zu registrieren :D
Es gibt jetzt eine rudimentäre C++ Schick-API. Diese wird automatisch durch SWIG in Lua umgesetzt. Ich habe auch einen Hook in die Schrittfunktion eingefügt, der die Koordinaten ausgibt. Allerdings funktioniert der nur in Dungeons. Ist die entsprechende Funktion für Städte noch nicht reversed, oder finde ich sie nur nicht? :think:
Hm, ich habe das in move() eingehängt und so das Problem (eher unelegant) umschifft. Aber wie kann man eine Nachricht im Spiel ausgeben? Mit GUI_output() schon mal nicht. Zumindest nicht an dieser Stelle im Programm.

EDIT: Klappt doch ganz wunderbar. Mein Fehler :shy: Wäs könnte man wohl als nächstes einbauen? :think:
Es gibt eine neue Bright-Eyes Version:

Ersetzte Funktionen (Segmente sind komplett identisch)
  • seg030: TLK-Logik, Datumsausgabe
  • seg031: Tavernen-Informanten Hilfsfunktionen
  • seg052: Stadtcamp
  • seg054: Herberge
  • seg055: Händler
  • seg056: Handler: Kaufbildschirm
  • seg057: Händler: Verkaufbildschirm
  • seg058: Schmied
  • seg067: Zufallsbegegnungen in den Städten

Bugfixes: Keine

Dokumentation: Keine

TODO-Liste:
  • Location: Wildniscamp
  • Location: Taverne
  • Location: Hafen
  • Dungeon: Spinnenhöhle
  • mehr Dungeon-Handler nachbauen
  • Animationssequenzen
  • Städte: Besondere Gebäude in Thorwal
  • Städtefunktionen
  • Schatzkistenlogik
  • Reiseevents
  • Check: Skripte zum Vergleichen der Binärdateien (erfordert eigenen Borland C++ 3.1 Compiler)

Statistik:
  • Es sind 854 von 1236 Funktionen sind nachgebaut (69,09%).
  • Davon sind 818 identisch mit dem Originalcode.
  • Nach Byte-Metrik sind schon 86,70% fertig

Viele Spaß beim Testen,
HenneNWH