Hey,
ein super Thema! Programieren ist zwar nicht mein Ding, aber wenn Du/Ihr vielleicht noch Unterstüzung gebrauchen könnt, z.b. Beta Testen oder so, gerne melden.
Viel Erfolg, das Ergebnis würde mich sehr interessieren.
Schönen Gruß
Hey,
ein super Thema! Programieren ist zwar nicht mein Ding, aber wenn Du/Ihr vielleicht noch Unterstüzung gebrauchen könnt, z.b. Beta Testen oder so, gerne melden.
Viel Erfolg, das Ergebnis würde mich sehr interessieren.
Schönen Gruß
Am Wochenende hatte ich wieder ein bisschen Zeit mit HL rumzuprobieren. Also, die Reihenfolge der Gebäude in der .shp Datei scheint einfach ganz stumpf dem Aufbau der Karte zu folgen.
Das erste Feld in den Kartendaten ist ja die linke ober Ecke der Karte, das zweite ein Feld weiter rechts usw. und so ergibt sich auch die Reihenfolge der Gebäude. Ausnahme sind nur die beiden HQs die meist als erste Gebäude gespeichert sind. Bei Fabriken/Depots scheint das Spiel einfach, wenn es beim Einlesen der Karte auf ein Feld mit einem entsprechenden Gebäudeeingang stößt, den jeweils nächsten Gebäudedatensatz aus der .shp einzulesen.
Habe jetzt mit einem Hex-Editor mehere mini-Karten mit vielen Gebäuden erstellt und so funktioniert die Zuweisung der Datensätze in der .shp zu den Gebäuden reibungslos.
Damit sind jetzt eigentlich alle wichtigen Punkte zum Aufbau der Kartendateien geklärt
Jetzt müssen wir nur noch die Gelände- und Einheitengrafiken aus den Spieldateien bekommen und dann kann es losgehen mit dem Editor.
Vielleicht sind das keine echten IFF Dateien, sondern nur die ILBM Chunks aneinandergereiht?
So scheint es zu sein und das macht ja auch Sinn. Für einen Haufen identischer Grafiken braucht es ja nicht jedes Mal Header und Palette.
Ich habe mir schon etwas Code zum Anzeigen von LBM/IFF Dateien zusammengesucht und werde bei nächster Gelegenheit damit mal ein bisschen rumprobieren.
die HL.EXE ist auf jeden Fall (laut IDA) ein ungepacktes Borland (Turbo) C++ Kompilat mit 123 Segmenten - also Medium-Memory model oder höher
der Copyright string "Borland C++ - Copyright 1991" in der Exe weisst auf auf Borland C++ 3.x hin
Ja, die EXE scheint unproblematisch zu sein. Vielleicht hat ja jemand von euch etwas Zeit übrig und einen Dissassember/Debugger zur Hand und findet die Stelle, wo die .lib Dateien eingelesen werden?
Wäre es denkbar auch Grafiken und Werte der Einheiten anzupassen?
Wäre es denkbar auch Grafiken und Werte der Einheiten anzupassen?
Ich versuche ja gerade rauszubekommen, wie genau die Bibliotheksdateien mit den Grafiken aufgebaut sind. Wenn wir das wissen, sollte es kein Problem sein, Grafiken auch austauschen/verändern zu können.
Gespeichert sind die Grafiken der Einheiten wohl in der UNIT.LIB im Unterverzeichnis LIB vom Spiel. Die Datei ist auch mit dem Turbo Packer gepackt, ich stelle nachher mal eine angepasste Version von meinem Entpacker hier ein, mit dem man auch so große Dateien entpacken kann. Die Grafiken vom Spiel scheinen alle mit Deluxe Paint am Amiga erstellt worden zu sein, bzw. liegen in dem Format vor.
Die Schwierigkeit liegt darin, dass in der LIB Datei nur die relevanten Bildinformationen und nicht komplette Grafikdateien abgelegt sind. Man müsste sich also ein Tool schreiben, dass aus den Daten in den LIB-Dateien wieder komplette Bilddateien erstellt, die in einem Grafikprogramm (unter DOS z.B. Deluxe Paint IIe) bearbeitet werden können und das aus den gespeicherten Bilddateien dann auch wieder .LIB Dateien für History Line zusammenstellen kann. Das sollte machbar sein, aber erstmal der Leveleditor
Wo die Werte der Einheiten abgelegt sind, weiß ich nicht. Da habe ich auch noch nicht nach gesucht. Vielleicht gibt es dafür sogar eine Datei, die (nach dem Entpacken) einfach mit einem Hexeditor angepasst werden kann. Oder die stehen als Konstanten in der EXE, könnte auch sein.
Falls bei den Bildern immer die selben Bytes "fehlen" könnte man das ggf. anpassen. Ja eins nach dem anderen.
Ich träume ja immer noch von einem Nachfolger.
Same here. Ich würde HL39-45 ja fast schon alleine kickstartern.
Same here. Ich würde HL39-45 ja fast schon alleine kickstartern.
typisch, neutrale Schweizer
Auf ein HL39-45 habe ich auch immer gewartet, aber selbst wenn die Reihe von Blue Byte fortgesetzt worden wäre, hätte es das wohl nie gegeben.
Im Handbuch zu HL 14-18 ist ja schon ein ganzer Abschnitt dazu, ob es vertretbar ist, dass ein deutsches Entwicklerstudio ein Spiel zum ersten Weltkrieg veröffentlicht und wo sie immer wieder betonen, wie sehr sie sich von Krieg und Gewalt distanzieren. Die hätten daher wohl nie das Thema zweiter Weltkrieg angefasst!
Ich erinnere mich dazu auch an ein Interview mit Thomas Hertzler (Gründer von Blue Byte), das ich vor Jahren mal gelesen habe, wo er sagte, dass die darüber nachdachten die Reihe History Line mit den Kriegen Napoleons oder dem Dreißigjährigen Krieg fortzusetzen. Also mit Themen/Konflikten, die die großen amerikanischen Studios nicht so auf dem Schirm hatten und wo Blue Byte hätte eine Nische besetzen können. Hat man dann alles zu Gunsten von Battle Isle 2 verworfen, da das bessere Verkaufszahlen versprach.
Kleiner Funfact als Edit hinterher:
Bei TRSI war man sich anscheinend auch sehr sicher, dass ein zweites History Line kommt. Da wurde schon mal ein Cracktro vorbereitet
Hier eine schnelle quick'n dirty Version des Entpackers, um auch Dateien über 64 KB (z.B. die LIB-Dateien) entpacken zu können.
Da ich zu faul war mit mehreren Buffern zu hantieren oder gar xms zu beanspruchen, läuft das Entpacken direkt in eine Ausgabedatei. Nicht komfortabel, verdammt langsam mit hohem Laufwerkszugriff, aber es funktioniert und zum Testen in DOSBox reichte es mir jetzt erstmal.
//Kleiner Entpacker für Dateien, die mit dem Turbo Packer von Wolfgang Meyerle
//gepackt wurden.
//Autor: Jan Knipperts (Dragonsphere / DOSReloaded)
//Version: 1.1 vom 30.01.23 für beliebig große Dateien.
//Sehr langsam mit hohem Laufwerkszugriff.... sollte dringend noch optimiert werden
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <dos.h>
FILE *f;
FILE *f1;
long psize;
long upsize;
char* inbuf;
char* outbuf;
size_t result;
unsigned char status = 1;
int ReadingError()
{
printf("Fehler beim Lesen der Datei! \n");
fclose(f);
fclose(f1);
exit(1);
return 0;
}
int WritingError()
{
printf("Fehler beim Schreiben der Datei! \n");
fclose(f);
fclose(f1);
exit(1);
return 0;
}
int getbit(char n, int bitwanted)
{
int thebit = (n & (1 << bitwanted)) >> bitwanted;
return thebit;
}
int update_status()
{
char status_char[4] = {0x2D,0x5C,0xB3,0x2F};
gotoxy(2,5);
printf("Entpacke %c",status_char[status]);
if (status < 4)
status++;
else
status = 1;
return 0;
}
int Decrunch()
{
unsigned char b1;
unsigned char b2;
unsigned char packbyte;
char bit;
unsigned int i;
unsigned int distance;
unsigned int length;
while (ftell(f1) < upsize)
{
update_status();
fread(&packbyte,1,1,f);
for (bit = 7; bit >= 0; bit--)
{
if (getbit(packbyte,bit) > 0)
{
fread(&b1,1,1,f);
fread(&b2,1,1,f);
distance = (unsigned int) ((b1 & 0xF0) << 4) | b2;
length = (unsigned int) (b1 & 0x0F)+3;
for (i = 0; i <= (length-1); i++)
{
if (ftell(f1) > distance) fseek(f1,(ftell(f1)-distance),SEEK_SET);
fread(&b1,1,1,f1);
fseek(f1,0,SEEK_END);
fwrite(&b1,1,1,f1);
if (ftell(f1) >= upsize) break;
}
}
else
{
fread(&b1,1,1,f);
fwrite(&b1,1,1,f1);
}
}
}
if (ftell(f1) < upsize)
return 1;
else
return 0;
}
int main(int argc, char**argv)
{
unsigned long ID;
clrscr();
printf("TPWM-Entpacker v1.1 by DragonSphere / DosReloaded \n");
printf("\n");
if (argc != 3)
{
printf("Bitte Namen der zu entpackenden Datei angeben!\n");
printf("Syntax: UNPACK.EXE <gepackte Datei> <Ausgabedatei>\n");
return 0;
}
f = fopen(argv[1],"rb");
if (!f)
{
printf("Fehler! Kann Datei %s",argv[1]);
printf(" nicht ffnen! \n");
exit(1);
}
f1 = fopen(argv[2],"w+");
if (!f1)
{
printf("Fehler! Kann Datei %s",argv[2]);
printf(" nicht anlegen! \n");
exit(1);
}
fseek(f,0,SEEK_END);
psize = (ftell(f)-8);
rewind(f);
result = fread(&ID,sizeof(ID),1,f);
if (result != 1) ReadingError();
if (ID != 0x4D575054) //"TPWM" ID-String
{
printf(" Datei wurde nicht mit Turbo Packer gepackt! \n");
exit(1);
}
result = fread(&upsize,sizeof(upsize),1,f);
if (result != 1) ReadingError();
printf(" Gráe gepackt: %ld\n",psize);
printf(" Gráe entpackt: %ld\n",upsize);
printf("\n");
int presult = Decrunch();
gotoxy(2,5);
if (presult == 0)
{
printf(" Daten wurden erfolgreich entpackt. \n");
}
else
{
printf(" Fehler beim Entpacken! \n");
}
fclose(f);
fclose(f1);
return 0;
}
Alles anzeigen
ZitatHier eine schnelle quick'n dirty Version des Entpackers, um auch Dateien über 64 KB (z.B. die LIB-Dateien) entpacken zu können.
Da ich zu faul war mit mehreren Buffern zu hantieren oder gar xms zu beanspruchen,
warum keine native Win(Linux) Variante? muss die Entwicklung durch DOS Einschränkungen zusätzlich erschwert werden?
ZitatHier eine schnelle quick'n dirty Version des Entpackers, um auch Dateien über 64 KB (z.B. die LIB-Dateien) entpacken zu können.
Da ich zu faul war mit mehreren Buffern zu hantieren oder gar xms zu beanspruchen,
warum keine native Win(Linux) Variante? muss die Entwicklung durch DOS Einschränkungen zusätzlich erschwert werden?
Hmm.. Eigentlich einfach nur weil ich unter DOS angefangen habe, mir die Spieldateien anzusehen, damit rumzuprobieren und mir Tools dafür zu schreiben. Ich bin dann gedanklich irgendwie unter DOS geblieben.
Bringt mich auch zu der Frage: Soll der Leveleditor ein DOS- oder Windowsprogramm werden? Also quasi als Tool, dass man auch auf 'nem 386er unter echtem DOS und direkt mit dem Spiel nutzen kann, oder als Windowsprogramm, was sich dann (auch für große Karten) natürlich sehr schön übersichtlich gestalten ließe?
Wie seht ihr das?
Ich würde empfehlen es portabel zu halten, wenn möglich. So dass es auch unter Linux und macOS laufen KÖNNTE.
Da würden sich ja verschiedene Sprachen anbieten.
Selbst .net geht, da es ja auch runtimes für andere OS gibt...
Ehrlich? Ein Hack der Spielebedienung wäre nice. Sieht aus wie das Spiel, ist aber der Level Editor. Space+Cursortaste greift halt nicht an, sondern verändert terrain, erstellt Gebäude oder placiert Einheiten.
DOS Forum, DOS Spiel, DOS Anwendung. Klingt für mich rund. Wenn die Quellen offen sind steht einer späteren Portierung nichts im Wege.
ich wäre gedanklich auch bei Dos - allerdings beim Ergebnis, also die Karten.
Wenn der Editor unter Windows läuft, wäre auch ok für mich.
Bringt mich auch zu der Frage: Soll der Leveleditor ein DOS- oder Windowsprogramm werden? Also quasi als Tool, dass man auch auf 'nem 386er unter echtem DOS und direkt mit dem Spiel nutzen kann, oder als Windowsprogramm, was sich dann (auch für große Karten) natürlich sehr schön übersichtlich gestalten ließe?
Übliche Methode, wenn man keine spezifischen Systemfunktionen benutzt: Ein Kommandozeilenprogramm mit den Standard-Libraryfunktionen, das man sowohl unter Unix, AmigaOS, DOS oder Windows kompilieren kann – wozu künstliche Abhängigkeit.
Retro-Tip: Eine lustige altmodische Hilfe beim Portieren ist die Microsoft C Bible, die vergleicht die stdlibs von MS C, Turbo C unter DOS und altmodischen Unix-Compilern. Und sagt auch, wenn es etwas nicht gibt.
Ehrlich? Ein Hack der Spielebedienung wäre nice. Sieht aus wie das Spiel, ist aber der Level Editor. Space+Cursortaste greift halt nicht an, sondern verändert terrain, erstellt Gebäude oder placiert Einheiten.
Das war in etwa mein usprünglicher Gedanke. Den Split-Screen vom Spiel nehmen, auf der rechten Seite können die Felder/Einheiten gewählt und dann links platziert werden. Und miit F1 wird nicht der Spielmodus, sondern zwischen Gelände une Einheiten umgeschaltet
Da kommen dann nur so Fragen auf, wie denn der Wechsel von der Karte zur Feldauswahl gehen soll, wie man die Eigenschaften von Gebäuden festlegt und das ganze wird halt bei großen Karten mit dem kleinen Bildausschnitt schnell sehr mühsam.
Ich fände ein Windows Tool super. Aber als DOS Programm geht es natürlich auch.
So, habe gestern Abend schnell den Code noch ein klein bisschen angepasst und nun kompiliert auch alles ganz wunderbar mit Microsoft Visual Studio Community 2022
Anbei noch eine ZIP mit dem TPWM Entpacker als Konsoleanwendung für Windows (64 und 32 Bit) und den beiden Versionen für DOS. Quellcode ist natürlich auch mit dabei.
Klasse. Ich hoffe bald die Zeit zum Testen zu haben.
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!