Level-/Karteneditor für Historyline 1914-18

  • als Beipiel meine Dosbox Staging Fork für das DOS game "Alpha Waves" : https://github.com/LowLevelMah…es_tests/src/_alpha_waves


    in https://github.com/LowLevelMah…ha_waves/_alpha_waves.cpp

    hänge ich mich an Code-Ausführungs-Stellen und near/far Calls, printe teilweise nur die Parameter vom Aufruf oder ersetze z.B. die Game-Data Dekomprimierungs-Routine durch meinen eigenen Code


    oder ein Branch mit Spezialisierungen für das DOS game Stunts: https://github.com/LowLevelMah…s/src/_stunts/_stunts.cpp

    da hänge ich mich in die Sound-Plugin Aufrufe rein und trace alle Daten die da hin und her gereicht werden


    alles relativ einfach wenn man ein IDA(oder Listing-Datei von IDA hat) - man braucht nur den Start-Offset aus der Exe, auf das Exe-Image laden warten, ein paar Code-Stellen mit der Distanz

    zu dem Startpunkt adressieren und schon kann man relativ viel mit dem Code anstellen - am besten z.B. Beobachten/Tracen oder Code ersetzen (zum Portierungen im echten Code testen oder nur als prüfung)


    zum selberbauen braucht man nur vcpkg und VS2019 mehr nicht (vcpkg sorg für alle dependencies), alles ordentlich beschrieben unter: https://github.com/dosbox-staging/dosbox-staging

    mein Fork/Branches lassen sich identisch bauen


    ich bevorzuge Dosbox Staging weil da fixes im Debugger enthalten sind die ich nicht in Dosbox SVN einbringen durfte

    z.B. break-point Erreichung wird mit dem 32bit linear-offset und nicht mit seg=brkpoint.seg, ofs=brkpoint.ofs geprüft (=> breakpoints werden nicht ausgelöst wenn seg und ofs nicht exakt passen)

    2 Mal editiert, zuletzt von llm ()

  • Das Spiel wurde sicherlich zuerst auf dem Amiga entwickelt/programmiert (darum sicherlich auch das Grafikformat) und auf der Basis dann die PC -Version entwickelt, da würde das Sinn machen, mit den word-sized Routinen (16 Bit).

    Ich hätte da auch noch ein paar Indizien für im Angebot: ;)

    1. Die Offset-Angaben in den LIB-Dateien und die Größe der Karte in den FIN-Dateien sind in big-endian gespeichert.

    Die größten Karten im Spiel sind 64x48 (oder auch 48x64) Hexfelder groß. Hier hätten zwei Byte also locker ausgereicht, gespeichert sind aber zwei Word und das in big-endian.


    2. Die Titelgrafiken (HLLOGO.IFF, GAME.IFF usw.) sind von einer Amiga Version von Deluxe Paint erstellte IFF-Dateien. Erkennbar daran, dass die Grafikdaten nicht als Interleaved Bitmap (ILBM), sondern als Planar Bitmap (PBM) gespeichert sind. Auf dem PC wurde dieses Format erst mit Deluxe Paint II enhanced ab Version 2.0 unterstützt und das erschien erst 1993, ein Jahr nach HL 1914-1918. Von den Amiga Versionen von Deluxe Paint aber schon deutlich früher.


    3. Und ein sehr deutlicher Hinweis ist ja auch, dass von dem TPWM-Packer nie eine PC-Version erschienen ist. Die Dateien wurden also ziemlich sicher auf einem Atari oder Amiga gepackt.... :D


    Also für @Fratzengeballer s These spricht einiges :)


    Wäre interessant, ob die Amiga-Version auch vor der DOS Version erschienen ist. Dazu habe ich aber nur gefunden, dass Amiga und DOS Version 1992 erschienen, leider keine Monatsangabe.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • llm danke! Sehr interessante Projekte hast du da! In deinen Gits werde ich bei Gelegenheit mal in Ruhe stöbern.

    Ein Dosbox-Fork für HL wäre hier wirklich sehr hilfreich. Ich habe mich leider nie intensiver mit den einzelnen Dosbox builds befasst und auch den Debugger hatte ich nicht so richtig auf dem Schirm. Sollte ich mich wohl mal mit befassen. Zuletzt war ich unter DOS noch mit Soft Ice und später dem w32dasm in Programmcode unterwegs... Da muss ich mich erst mal wieder mit moderneren Tools befassen.


    Und der von dir gefundene Code ja schon sehr vielversprechend. Die Routine, die nach den Grafik Tags/Ids in einem Puffer sucht scheint aber für "normale" Deluxe Paint LBM/IFF Dateien, also im Spiel für Hintergründe und Logos zu sein. LBM oder IFF Dateien gibt es im ILBM oder PBM Format mit entprechenden Tags in der Datei und es folgen CMAP (Palette) und BODY (die Bitmapdaten) Chunks.

    Super wäre, wenn man einmal abfangen und auswerten könnte, was für Code zwischen dem Klick auf Spiel starten im Hauptmenü bis zum Aufbau der Karte so ausgeführt wird. Da dürfte alles für uns wichtige bei sein. Wenn eine relevante Datei fehlt, merkt das Spiel es auch erst an dieser Stelle. Vorher scheint also kein Dateizugriff, keine Prüfung der Spieldateien zu erfolgen.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • llm danke! Sehr interessante Projekte hast du da! In deinen Gits werde ich bei Gelegenheit mal in Ruhe stöbern.

    Ein Dosbox-Fork für HL wäre hier wirklich sehr hilfreich. Ich habe mich leider nie intensiver mit den einzelnen Dosbox builds befasst und auch den Debugger hatte ich nicht so richtig auf dem Schirm. Sollte ich mich wohl mal mit befassen. Zuletzt war ich unter DOS noch mit Soft Ice und später dem w32dasm in Programmcode unterwegs... Da muss ich mich erst mal wieder mit moderneren Tools befassen.

    ich hatte auch viele Jahre keinen Kontakt zu "aktuellen" Tools und hab mich dann angefangen mit Dosbox als Reverse Engineering Tool zu beschäftigen, bin dann aber auf Staging gewechselt weil die einfach aktiver sind und notwendige Fixes auch (nach Diskussion) akzeptieren


    ich finde die Kombination aus IDA Disassembler-Listing, Dosbox-Debugger oder meinen Dosbox-Erweiterungen sehr angenehm - irgendwelche BIOS,DOS API Aufrufe zu tracen ist trivial - printf an die richtige Stelle und selbst so Code-Eingriffe sind mehr oder minder recht einfach möglich - so lange man sich nur im Realmode bewegt :)

    für meine Alpha Waves Tools habe ich auch einen kleine "Emulator" für Assembler-Befehle gebaut damit ich disassemblierten Code schneller in die Visual Studio IDE/Debugger Welt heben kann und dann dort durchsteppen und portieren: Die Datendekompression als fake Assembler, voll funktionsfähig als Ersatz für den Original code im laufenden Spiel :) https://github.com/LowLevelMah…ves/_alpha_waves.cpp#L856

    hier der emulator (nutzt einfach inline asm):

    dosbox-staging/emu.hpp at main_alpha_waves_tests · LowLevelMahn/dosbox-staging
    DOSBox Staging is a fork of the DOSBox project that focuses on ease of use, modern technology and best practices. - dosbox-staging/emu.hpp at…
    github.com

    dosbox-staging/emu.cpp at main_alpha_waves_tests · LowLevelMahn/dosbox-staging
    DOSBox Staging is a fork of the DOSBox project that focuses on ease of use, modern technology and best practices. - dosbox-staging/emu.cpp at…
    github.com


    zum entwicklen nutze ich den OpenWatcom V2: https://github.com/open-watcom/open-watcom-v2 der ist gut gepflegt, läuft unter Win64 und Linux und Bugs-Reports werden zügig behandelt

    als Assembler den UASM: https://github.com/Terraspace/UASM - der ist MASM kompatible, Win64, Linux (bessere Fehlerprüfung als MASM, und besser als WASM oder TASM)
    als Linker meistens UniLinker (http://unilinker.com/.ftp-UniLink/ - der kann einfach alles) oder WLink vom OpenWatcom V2 Project
    nur selten die alten 16Bit Tools aus grauer Vorzeit direkt - also von Microsoft C 5.x, Borland 2,3.x usw.

    Einmal editiert, zuletzt von llm ()

  • Ich bereite einen Dosbox Staging Branch für die HL.EXE vor - Erkennung das HL gestartet wurde usw. - basierende auf dem Floppy Images von archive.org (keine Ahnung ob es noch weitere Varianten gibt)

  • hier der neue Historyline-Branch: https://github.com/LowLevelMah…ing/tree/main_historyline


    Ich hab DOS-Datei Zugriffs print eingebaut und ich printe die ersten 1000 bytes aus es:di mit der die ILBM_USE1_sub_3AF32 proc aufgerufen wird


    siehe out.zip im Anhang - ein HL start bis zur Karte


    hier kann man sehen das der code für den ILBM_USE1_sub_3AF32 input dump nicht wirklich viel Code ist

    dosbox-staging/_historyline.cpp at 3b623027b1be00d8815c013296fe0844a6df79c0 · LowLevelMahn/dosbox-staging
    DOSBox Staging is a fork of the DOSBox project that focuses on ease of use, modern technology and best practices. - dosbox-staging/_historyline.cpp at…
    github.com


    und hier ein Beispiel für DOS-API tracing

    dosbox-staging/dos.cpp at 3b623027b1be00d8815c013296fe0844a6df79c0 · LowLevelMahn/dosbox-staging
    DOSBox Staging is a fork of the DOSBox project that focuses on ease of use, modern technology and best practices. - dosbox-staging/dos.cpp at…
    github.com


    wenn man selber Kompiliern will:


    Ziel-Verzeichnis Struktur


    historyline_dev

       vcpkg

       dosbox-staging


    1. eine Ordner historyline_dev anlegen (der name ist nicht wichtig aber der ordnung halber)

    2. git clone von https://github.com/microsoft/vcpkg

    3. cd vcpkg

    4. in dem vcpkg verzeichnis bootstrap-vcpkg.bat aufrufen (dauert ein bisschen) und dann .\vcpkg.exe integrate install

    5. git clone von https://github.com/LowLevelMahn/dosbox-staging

    6. cd dosbox-staging

    7. checkout branch main_historyline

    8. \vs\dosbox.sln in einem aktuellen VS2019 oder VS2022 öffnen

    9. auf x86, Debug Stellen - mein emulator (der noch nicht gebraucht wird) baut sonst nicht

    10. bauen - kann wegen den vcpkg dependencies recht lange dauert (so 20-30min...) - aber nur einmalig dann nur noch ein paar sekunden

    11. dosbox mit F5 starten

    12. mount c d:/temp/hl oder sowas
    13. c:

    14: hl.exe


    ich empfehle git-extensions als git-client

    mit meinen Dosbox einstellungen in dem Branch wird der Dosbox Debugger mit gebaut und ist aktiv

  • @Dragonsphere

    wenn man die PARTS.LIB mit deinem Tool entpackt kommt man bis zum Start-Menü aber dann passiert nix mehr - ist das bei dir auch so?


    wenn ich die MNUCHR18.LIB (die erste mit INFOILBM) entpacke sehe ich im Spiel anstatt dem Startmenü nur Icons - sonst läuft es aber scheinbar

    also scheinen entpackte Dateien HL doch nicht so ganz zu schmecken


    oder vielleicht ein Fehler im unpacking? wäre wohl sinnvoll noch einen packer zu schreiben um das auszuschließen, oder?

    2 Mal editiert, zuletzt von llm ()

  • Hallo llm,

    ich habe bisher gar nicht ausprobiert, dass Spiel mit den entpackten Lib-Dateien zu starten (die hatte ich mir in ein anderes Verzeichnis kopiert, um sie zu sezieren :D) Das Spiel akzeptiert problemlos entpackte Karten und Fullscreen-Grafiken als Einzeldateien (also *.fin, *.shp, *.lbm, *.iff Dateien), aber es kann natürlich gut sein, dass es die großen Bibliotheks-Dateien in gepacktem Zustand voraussetzt.

    Ich prüfe zur Sicherheit natürlich gerne auch noch mal meinen Code, kann aber etwas dauern, da ich diese Woche beruflich unterwegs bin.

    Und super, dass du ein HL-Fork erstellt hast. Bin schon sehr gespannt, was du da noch herausfindest. Danke dafür! :)

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Zitat

    Ich prüfe zur Sicherheit natürlich gerne auch noch mal meinen Code

    im normalfall baut man auch ein packing mit ein dann kann man gepackt -> ungepackt -> gepackt tests machen


    Zitat

    Und super, dass du ein HL-Fork erstellt hast. Bin schon sehr gespannt, was du da noch herausfindest. Danke dafür

    ein bisschen habe ich schon rausgefunden - ich weiss auf jeden Fall welche procs an dem Dateiladen beteiligt sind - mir ist nur noch nicht klar in welchen Variable dann die entpackten Daten laden -

    damit ich da weiterverfolgen kann wo(wie) die verarbeitet werden - möglicherweise machen ich so eine häppchenweise Port der beteiligten Routinen in meinen Emulator

  • im normalfall baut man auch ein packing mit ein dann kann man gepackt -> ungepackt -> gepackt tests machen


    Einen Packer zu schreiben, der wirklich die Datei nach den geeigneten Sequenzen zum Komprimieren durchgeht, war mir zu Aufwändig, zumal ja auch für einen Mapeditor nicht nötig. Ich habe ein kleines Programm geschrieben, dass eine Komprimierung vortäuscht, also den TPWM-Header schreibt und Codebytes einfügt, die der Entpackroutine sagen, dass die folgenden Bytes 1:1 übernommen werden sollen. Das funktioniert mit meinem Entpacker.

    Meine Entpacktroutine entpackt ja aber auch die LBM und IFF Bilddateien und die Karten korrekt. Gerade bei den Grafiken würde es ja sehr deutlich auffallen, wenn da etwas falsch läuft und falsche Bytefolgen geschrieben würden. Das war mir jetzt erstmal Test genug und ich gehe erstmal davon aus, dass da alles korrekt läuft.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Zitat

    Meine Entpacktroutine entpackt ja aber auch die LBM und IFF Bilddateien und die Karten korrekt. Gerade bei den Grafiken würde es ja sehr deutlich auffallen, wenn da etwas falsch läuft und falsche Bytefolgen geschrieben würden. Das war mir jetzt erstmal Test genug und ich gehe erstmal davon aus, dass da alles korrekt läuft.

    du hast recht, der Entpacker ist ja auch nicht wirklich kompliziert

  • Hallo in die Gruppe,


    bin neu hier im Forum, da ich bei der Suche nach einem HL Map Editor hier gelandet bin. Ich spiele die Amiga Version ab und an unter WINUAE und wollte schon lange mal Karten editieren/erstellen.


    Für den Amiga gibt es einen unvollendeten Editor den ich mal probiert habe. Grundsätzlich funktioniert er, hat aber einige Fehler und noch fehlende Funktionalitäten (z.B. kann man manche Einheiten nicht auf der Karte platzieren, nur in den Fabriken oder Depots etc.).


    Leider bin ich programmiertechnisch nicht sehr versiert um hier produktiv mitwirken zu können, werde das Projekt aber beobachten und wenn ich kann meinen Senf dazugeben.


    Großen Respekt so ein Thema anzugehen!

  • Aber da könnte man sicherlich testen, was wie wo was setzten bewegt. Ich habe aktuell leider zu viel um die Ohren, aber habe mein Amiga Original auch zur Hand.

  • ich hab jetzt die Stelle gefunden wo die MNUCHR18.LIB geladen wird

    Hast du da schon mehr rausbekommen? Die Datei enthält ja (entpackt) ja auch mehrere kleine Grafiken mit der "INFOILBM" ID. Wenn wir da den Code nachvollziehen können, sollte es damit hoffentlich auch bei den Einheiten und beim Gelände klappen :)

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • ich hab jetzt die Stelle gefunden wo die MNUCHR18.LIB geladen wird

    Hast du da schon mehr rausbekommen? Die Datei enthält ja (entpackt) ja auch mehrere kleine Grafiken mit der "INFOILBM" ID. Wenn wir da den Code nachvollziehen können, sollte es damit hoffentlich auch bei den Einheiten und beim Gelände klappen :)

    aus Mangel an Freizeit leider noch nicht weiter gekommen


    ich hab mal den disassemblierten Code angehängt - ist nur kurz durch den IDA gejagt worden d.h. das ganze laesst sich so nicht re-assemblieren und meine Analyse hat sich bisher auf die Dateilade-Operationen beschränkt, bisher noch nix auf die schnelle gefunden wo INFOILBM verwendet (als String, oder Word-Werte etc.) wird


    und die Stelle wo die Datei geladen (möglicherweise auch verarbeitet) wird

    ich denke die beiden

    ADD_FILE_EXTENSION_AND_MORE_sub_258E2

    SOMETHING_WITH_FILENAME_OPEN_ETC_sub_1C56E


    sollte man eingehender analysieren (z.B. auf meinem Emulator portieren und das ganze direkt selbst in dem Dosbox C++ code machen) - dann sieht man vielleicht leichter was da alles dran hängt

  • hab hab noch mein dosbox fork um tracing für die beiden Routinen erweitert (pushed auf github)


    alt ILBM_USE1_sub_3AF32

    neu SOMETHING_WITH_FILENAME_OPEN_ETC_sub_1C56E

    neu ADD_FILE_EXTENSION_AND_MORE_sub_258E2


    im Anhang die Ausgabe von meinem dosbox fork - da kann man schön sehen was da so für Daten durchfließen



  • Neue Version des TPWM-Entpackers für DOS


    Da llm ja vermutet hatte, dass etwas mit meinem Entpacker nicht stimmt, habe ich mir den Code nochmal angesehen und tatsächlich einen ganz blöden Fehler gefunden..

    Ich hatte vergessen den Modus beim Öffnen der Datei zum Schreiben auf "wb", als binär Modus, zu setzen. Der stand noch auf "w+", also Lese- und Schreibzugriff. Je nach System wurde die Datei dadurch aber als Textdatei betrachtet und immer nachdem ein Block Daten geschrieben wurde, wird dann automatisch ein Zeilenendzeichen eingefügt. Kein Wunder das HL die damit entpackten Dateien nicht mochte!

    Und das fiese ist, dass das nicht jedes System macht. Bei mir funktionierte unter DOSBox alles einwandfrei, auf meinem 486er fand ich dann aber den Fehler. Die Windows Konsolenversion funktioniert auch richtig mit diesem Dateimodus. Also wirklich fies!


    Da mich aber meine schnell gestrickte DOS Version des Entpackers für große Dateien eh störte, habe ich mich am Wochenede noch mal hingestzt und nun doch eine Lösung mit mehreren Buffern umgestzt.

    Diese neue DOS Version kann jetzt Dateien bis 256 KB gepackt / 320 KB entpackt verarbeiten. Sofern genug konventioneller Speicher frei ist. :D

    Und ich habe die Möglichkeit von Wildcards als Parameter ergänzt. Ihr könnt damit also nun auch per *.fin alle Karten auf einen Schlag entpacken.


    Daneben gibt es noch einige kleine Optimierungen.


    And for Duplode and other non german speaking members this is an english version.

    Dateien

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Zitat

    Da llm ja vermutet hatte, dass etwas mit meinem Entpacker nicht stimmt, habe ich mir den Code nochmal angesehen und tatsächlich einen ganz blöden Fehler gefunden..

    Ich hatte vergessen den Modus beim Öffnen der Datei zum Schreiben auf "wb", als binär Modus, zu setzen. Der stand noch auf "w+"

    mit der Korrektur auf "wb+" in deinem Windows-Konsolenprogram funktioniert auch das laden der entpackten MNUCHR18.LIB


    ergibt sich dadurch ein anderes Bild bei deiner Analyse - irgendwelche unbekannten Bytes die nach deinem Fix nicht mehr vorhanden sind?



    jetzt kann man auch schön sehen das der 2. Parameter der SOMETHING_WITH_FILENAME_OPEN_ETC_sub_1C56E von mir liebevoll "some_buffer" getauft

    der Puffer ist für den ungepackten Dateiinhalt, der file_read_buffer ist dann wohl nur der Zwischenspeicher zum entpacken

    Code
    SOMETHING_WITH_FILENAME_OPEN_ETC_sub_1C56E("MNUCHR18.LIB",some_buffer(0x7147:0x000A) => 0x0007147A),...
    ...
    DOS_ReadFile: name: BLUEBYTE\HL\MNUCHR18.LIB, handle: 5, toread: 65526, at-pos: 0 => ds:dx(0x7147:0x000A) => 0x0007147A

    2 Mal editiert, zuletzt von H.EXE () aus folgendem Grund: Ein Beitrag von llm mit diesem Beitrag zusammengefügt.

  • und beim Programstart werden x Dateien in der Routine LOAD_SOME_FILES_ALSO_MNUCHR18_LIB_ETC_sub_26599 geladen und alle nacheinander in den some_buffer gesteckt der ganz am Anfang einmal mit 280.000 bytes allokiert wird


Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!