Themabewertung:
  • 4 Bewertung(en) - 3.5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Reverse Engineering der NLT II
In meinem Fork habe ich jetzt mal die enum's vobereitet. Ich hoffe, Henne übernimmt das bald.
Zitieren
(14.12.2025, 23:46)siebenstreich schrieb: In meinem Fork habe ich jetzt mal die enum's vobereitet. Ich hoffe, Henne übernimmt das bald.

sieht gut aus

fehlt nur noch GRAMMAR_PACK
Zitieren
GRAMMAR_PACK ist abgewählt.

Der Vorschlag von Llm ist in Ordnung, nur mit enums, GRAMMAR_PREFIX, viestelligen HEX-Werten und nur in schick.
Zitieren
ich hab ein Linkerproblem mit MSVC

in seg005.cpp

wird g_str_temp_xx_ptr mit einem ptr auf g_str_temp_xx gesetzt
wird aber etwas weiter unten nur definiert wenn #if defined(__BORLANDC__)

ich finde keine andere g_str_temp_xx definition im Source - unter Linux bauts

hab das mal für MSVC gefixt - aber bin mir nicht sicher was da gewollt ist: https://github.com/Henne/BrightEyes/pull/57

Code:
signed int g_delay_factor = 4; // ds:0x4b66
extern const char g_str_temp_xx[]; <<<<<<<<<<<<<<<<<<<<<<<<
static const char *g_str_temp_xx_ptr = &g_str_temp_xx[0]; // ds:0x4b68, to STR_TEMP_XX; uint8_t* <<<<<<<<<<<<<<<<<<<<<<<<
static const signed char g_fig_star_colors[12] = { 0x03, 0x03, 0x0c, 0x0c, 0x04, 0x0b, 0x0d, 0x01, 0x07, 0x0e, 0x02, 0x07 }; // ds:0x4b6c
static signed char g_fig_star_counter = 0; // ds:0x4b78
signed int g_fig_star_timer = 0; // ds:0x4b79
static signed char g_fig_star_last_count = -1; // ds:0x4b7b
static const signed int g_fig_msg_dtps[12] = { 0x36, 0x37, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x00, 0x00, 0x3b, 0x00 }; // ds:0x4b7c
signed char g_fig_star_printed = 0; // ds:0x4b94

#if defined(__BORLANDC__)
const char g_str_temp_xx[] = "TEMP\\XX"; // ds:0x4b95  <<<<<<<<<<<<<<<<<<<<<<<<
#else
uint8_t *g_buffer_xx = NULL;
#endif
Zitieren
(16.12.2025, 10:05)HenneNWH schrieb: GRAMMAR_PACK ist abgewählt.

Der Vorschlag von Llm ist in Ordnung, nur mit enums, GRAMMAR_PREFIX, viestelligen HEX-Werten und nur in schick.

Welche Laus ist dir denn über die Leber gelaufen?

Ich bin etwas irritiert über den Kommunikationsstil, hier und auch dort.

So macht mir das Projekt eher keinen Spass mehr.
Zitieren
Ich hab mir die seg096.cpp jetzt genauer angeschaut und bin von meiner GRAMMAR_PACK-Funktion auch nicht mehr überzeugt, weil diese Status-Zahl flexibler verwendet wird als ich es mir vorgestellt hatte. Ich bin dabei, was zu bauen...
Zitieren
(18.12.2025, 13:56)siebenstreich schrieb: Ich hab mir die seg096.cpp jetzt genauer angeschaut und bin von meiner GRAMMAR_PACK-Funktion auch nicht mehr überzeugt, weil diese Status-Zahl flexibler verwendet wird als ich es mir vorgestellt hatte. Ich bin dabei, was zu bauen...

ich hatte mir alle Stellen angeschaut wie/was kombiniert wird und daraus dann die #defines (jetzt dann enums) abgeleitet
Zitieren
(18.12.2025, 13:56)siebenstreich schrieb: Ich hab mir die seg096.cpp jetzt genauer angeschaut und bin von meiner GRAMMAR_PACK-Funktion auch nicht mehr überzeugt, weil diese Status-Zahl flexibler verwendet wird als ich es mir vorgestellt hatte. Ich bin dabei, was zu bauen...

@siebenstreich:
Zu der Überzeugung bin ich auch gelangt. Den Grund für meine Entscheidung: Deine Lösung ist zwar gut, passt aber nicht zum Problem und ist eine Abstraktionsstufe zu hoch.
Bei schick ist es eine gute Idee, die Magic-Numbers durch enums zu ersetzten.
Bei schick_dos wird es für mich perspektivisch schwieriger, weil ich dann mehr Arbeit habe als nötig.
Das nimmt mir dann den Spaß.

@Llm:
Linkerproblem ist gefixt und meine Anmerkungen an deinen Commit sollten jetzt auch funktionieren.

Ich sehe ein, dass die Restriktionen der Binäräquivalenz Ultra-brutal wirken, aber es muss ja auch zur Schicksalsklinge passen. ;-)

Aktuell geht schon Einiges bei mir und wenn Llm's Commit integriert ist sollte es auch auf anderen Systemen soweit laufen.
* Import von CHR-Dateien
* rudimentäre Tastatursteuerung
* Rumlaufen in Thorwal (ohne Abstürze)
* Statusansicht, Spielstand/Tagebuch, Karte
* Talente/Zauber anwenden

* Betreten der Zwingfeste
* Fliehen aus begonnenen Kämpfen

Die Liste von Dingen die noch gar nicht funktionieren, noch nicht sichtbar sind oder falsch dargestellt werden, ist lang und unvollständig.
* Dialogsystem
* Spielstand laden/speichern
* Reisen
* Kampfsystem
* Kaufen/Verkaufen
* Timer
* ...

Bugreports könnt ihr euch vorerst sparen, aber wer Interesse hat kann mal bauen, die SCHICK.DAT der CD-Version, die GAMES.NAM ein paar CHR-Dateien nach src/schick kopieren
und Thorwal unsicher machen.
Zitieren
Allgemein: ich weiss gerade nicht wo ich Fragen rein stellen soll - wenn ich welche Stelle werden die 50% hier, 50% auf github oder gar nicht beantwortet :(
gibt es da einen besseren Kanal/Chatgruppe oder so was? oder kann ich [Question] Issues auf github erstellen?

Ich hab hier eine Frage:
https://github.com/Henne/BrightEyes/pull...3675192267

Inhalt:

mir würde es gefallen wenn wir das Dateisuchen ein wenig entkoppeln z.B. mit einer Find-Funktion und einem Callback zur Entkopplung
- Dateinamen suchen und Dateien verarbeiten sind zwei paar Stiefel - das muss nicht alles in einem Code-Bobbel zusammengezimmert werden

z.B. könnte man diese find_files Routine an 4-9 Stellen verwenden - anstatt alles inline zu implementieren

Code:
static bool valid_filename(const char* filename, const char* ext)
{
    return (filename[0] != '.') && strstr(filename, ext);
}

void find_files(const char* search_path, const char* ext, void (*file_found_callback)(const char* filename))
{
#if defined(__BORLANDC__)
// ...
#elif defined(_WIN32)
    char path[_MAX_PATH];
    snprintf(path, sizeof(path), "%s/*", search_path);
    struct _finddata_t fileinfo;
    intptr_t handle = _findfirst(path, &fileinfo);
    while (handle != -1) {
        if (valid_filename(fileinfo.name, ext)) {
            file_found_callback(fileinfo.name);
        }
        if (_findnext(handle, &fileinfo) != 0)
        {
            break;
        }
    }
    _findclose(handle);
#else
    DIR* dir = opendir(search_path);
    if (dir != NULL) {
        const struct dirent* ent = readdir(dir);
        while (ent != NULL) {
            if (valid_filename(fileinfo.name, ext)) {
                file_found_callback(fileinfo.name);
            }
            ent = readdir(dir);
        }
        closedir(dir);
    }
#endif
}

// wird aufgerufen wenn find_files eine passende Datei gefunden hat
// hier kann man auch kopieren, loeschen etc.
void print_file_name(const char* filename)
{
printf("filename: %s\n", filename);
}

int main(int argc, char** argv)
{
printf("find all *.chr\n");
find_files("./",".CHR", print_file_name);
printf("find all *.*\n");
find_files("./","", print_file_name);
}

dabei kommt das Ergebnis raus

Code:
find all *.chr
filename: ARBOSH.CHR
filename: HJALDIS.CHR
filename: RHENAYA.CHR
filename: TALIMEE.CHR
filename: TAMION.CHR
filename: YARANO.CHR
find all *.*
filename: ARBOSH.CHR
filename: GAMES.NAM
filename: HJALDIS.CHR
filename: RHENAYA.CHR
filename: SCHICK.DAT
filename: schick_MSVC.exe
filename: schick_MSVC.pdb
filename: SDL2d.dll
filename: TALIMEE.CHR
filename: TAMION.CHR
filename: TEMP
filename: YARANO.CHR

ich weiss nicht ob die grosse Menge an Code-Duplikation gerade einfach akzeptiert wird, gewünscht ist oder ob das erst irgendwann in der Zukunft behandelt werden soll
Zitieren
Ich bin fertig, puh. Das war eine größere Geschichte. Viele Umbenennungen und Kommentare in der seg096.cpp (es gab auch noch nicht richtig benannte bzw. irreführend benannte Funktionen). Alles mit enums aufgezogen und in die zahlreichen Funktionsaufrufe eingebaut.

Aber es hat sich rentiert: Wieder ein paar Codestellen besser lesbar gemacht und magic numbers aufgelöst. Wieder eine Facette aus dem Rohdiamanten rausgeschliffen.

Es gibt eine sehr merkwürdige Stelle im Code: Dort würde ich gerne die Zahl 4 durch INFLECT_PLURAL ersetzen. Damit macht der BCC aber nicht mehr denselben Code, obwohl INFLECT_PLURAL den Wert 4 hat. Henne, kannst du was dazu sagen? Dein Kommentar "TODO: this field access produces other code" 2 Zeilen weiter oben lässt darauf schließen, dass du hier auch schonmal angeeckt bist.

(18.12.2025, 17:42)llm schrieb:
(18.12.2025, 13:56)siebenstreich schrieb: Ich hab mir die seg096.cpp jetzt genauer angeschaut und bin von meiner GRAMMAR_PACK-Funktion auch nicht mehr überzeugt, weil diese Status-Zahl flexibler verwendet wird als ich es mir vorgestellt hatte. Ich bin dabei, was zu bauen...

ich hatte mir alle Stellen angeschaut wie/was kombiniert wird und daraus dann die #defines (jetzt dann enums) abgeleitet

Ja, das war ein guter Ausgangspunkt für mich! Das mit der VON_FORM hat nicht gestimmt. Bit 0 und 1 gehören zusammen. Dort wird der Genus abgelegt (bemerkenswerterweise in der Reihenfolge 1ter, 2ter, 4ter, 3ter Fall).
Singular = 2 war auch nicht richtig. Es ist Singular = 0 und Plural = 4. (also Bit 2 nicht gesetzt / gesetzt)

Die von-Form wird nur für den Genitiv (und Dativ) von Singular-Wörtern (also von Wörtern, die keinen Plural haben) angewendet. Beispiel: Lakritze.
Ich finde es ziemlich wild, was für diese Wörter passiert: Es wird das Plural-Bit gesetzt (irgendwie widersinnig) und außerdem das Anfügen eines Artikels unterbunden, auch wenn die Funktion ursprünglich mit dem Wunsch nach einem bestimmten oder unbestimmten Artikel aufgerufen worden war. Also nicht "der Geruch der Lakrize" sondern "der Geruch von Lakritze".

Zum Thema Geruch: Diese Codestelle stinkt für mich nach Bugs. Das mit dem Dativ ist vermutlich nur deswegen kein richtiger Bug, weil ich glaube, dass diese Funktion nie mit dem Dativ aufgerufen wird.

Ein Bug in diesem Zusammenhang ist übrigens die Textausgabe "<HELD> gelingt das Brauen eines Zaubertrank (stark)s" nach erfolgreicher Alchimieanwendung. Der Gegenstandsname ist "Zaubertrank (stark)", und die Grammatik-Maschinerie macht daraus nach ihren Standardregeln den Genitiv.
Allerdings fällt mir keine einfache Lösung ein. Den Gegenstand in "starker Zaubertrank" umzubenennen bringt nichts, denn das Adjektiv "stark" wird bei der Bildung des Genitivs nicht mit einbezogen, das ist nicht vorgesehen. Hier hätte man "<HELD> gelingt das Brauen eines starker Zaubertranks", wieder nicht richtig.
Zitieren
(Vor 8 Stunden)llm schrieb: Allgemein: ich weiss gerade nicht wo ich Fragen rein stellen soll - wenn ich welche Stelle werden die 50% hier, 50% auf github oder gar nicht beantwortet :(

In erster Linie gehen die Fragen ja an Henne, denke ich.

Wenn ich mir einbilde, was konstruktives beitragen zu können, sage ich was dazu, andernfalls eher nicht. Mich interessiert die interne Logik des Spiels. Von etlichen Dingen habe ich aber keine rechte Ahnung, z.B. hardware- oder betriebssystem-nahe Sachen.
Zitieren




Benutzer, die gerade dieses Thema anschauen: 6 Gast/Gäste