siredmar/mdcii-engine

go-cod

Opened this issue · 6 comments

stwe commented

@siredmar Wie ich sehe geht es hier im branch go-cod weiter. Das Projekt ist nicht tot. Du hast ein "clean up" durchgeführt, was mich hier zu dem Ticket veranlasst. Wohin soll die Reise gehen? Die Erfahrung mit meinen zwei Versuchen, etwas Brauchbares mit den Anno Files auf die Beine zu stellen, endete schließlich mit der Erkenntnis, dass ich das Projekt von der falschen Seite aus angegangen bin. Ich habe quasi einen Savegame-Viewer erstellt, der von der Struktur her nur sehr schwer in ein Spiel verwandelt werden kann. Das lag natürlich daran, dass ich verstehen wollte, wie der original Content benutzt werden muss. Falls Du nun ein (kleines) Spiel erstellen möchtest, würde ich Dir raten, von vornherein das Ziel zu verfolgen, so schnell wie möglich eine wie auch immer geartete Game Logic auf den Bildschirm zu bringen. Also den einfachsten Fall coden und sich über den Erfolg freuen Der Fahrplan dafür würde nun nicht so aussehen, dass wieder ein Savegame mit 6000 Grafiken geladen wird, sondern grob:

  • einfache 2D Iso Karte erstellen mit nur einer Höhe; die Karte einfach einfärben ohne Textur; das können auch nur 16x16 Tiles sein, was zunächst völlig ausreichend ist
  • die Karte sollte clickable sein, d.h. die Maus sollte ein einzelnes Tile auswählen können
  • die Karte sollte drehbar sein, wir haben 4 Möglichkeiten;
  • die Karte sollte scrollbar sein
  • ein einfaches Menu einfügen und drei oder vier Objekte zum Einfügen in die 2DKarte anbieten; z.B: Holzhütte, Fischerhütte und Strasse.
  • Die eben genannten Spielobjekte sollten nun voneinander wissen und sich gegenseitig finden - einfache Spielelogik (Inselbewohner - Strasse - Arbeitsplatz - Nahrung etc).

Damit ist man erstmal sechs Monate ausgelastet, das System ist benutzbar, ausbaufähig und man sollte sich von Anfang an nicht wieder in Animationen und drehende Fragezeichen verrennen. Schließlich wird man gezwungen, sich mal über seine Datenstrukturen bzgl. der Spielobjekte und deren Organisation Gedanken zu machen. Jedenfalls ist das mein Plan......irgendwann gehe ich die Sache genauso an, und zwar in C++. In Go kann ich Dir leider nicht helfen.

@stwe mein Scope aktuell ist alles an Spieldaten zu verstehen, zu parsen und erstmal reinzuholen was geht. Das faengt bei den COD/GAD Dateien an und hoert bei den verschiedenen Chunks und Inseldaten auf. Ich hab nicht unbedingt vor einen Savegamekompatibles spiel zu erzeugen. Es gibt da noch sehr viel zu erforschen, was noch nicht eindeutig klar ist. Wichtig ist zu identizieren was man unbedingt von den Original Files braucht und was kann mann sich erschliessen. Da ich wirklich kurz angebunden bin, ist meine Roadmap aktuell mal den COD Parser zu portieren. Kleine Schritte.

C++ ist fuer mich ein erstmal ein abgeschlossenes Thema. Wenn ich das weiter verfolge, dann in der Sprache, die ich taeglich nutze.
Mit Go hat man:

  • eine Sprache, die wirklich einfach und schnell zu lesen und zu verstehen ist
  • keine Probleme mit Dependencies und Libraries
  • keine externen Package manager wie Conan
  • keine Freaky Build Systeme
  • simple Crossbuilds
  • statische Binaries wenn man das moechte
  • genug Game Engines, die man nutzen kann*

Go ist nicht schwer. Das lernt man tatsaechlich nebenbei :-)

stwe commented

@siredmar da ergänzen wir uns gut. Ich habe Urlaub und gerade ein neues Projekt gestartet, in der Hoffnung, dass mir keiner Ärger macht wegen dem Namen MDCII. Mir ist nichts besseres eingefallen. Aber egal. Mal eine Frage zu Deinem Go Code: Nehmen wir mal an, Du erstellst tatsächlich einen COD Reader in Go. Kann man das Dingen (Libt) irgendwie in C++ nutzen/aufrufen.? Ansonsten wäre ein Projekt sehr gut, welches die CODs in json oder xml zurückgibt.

Meinen cod Parser gibt's ja schon in C++. Du kannst ihn rausnehmen und in eine Lib packen, wenn du möchtest. Er arbeitet mit protobuf. Daraus lässt sich ein json dumpen oder besser idealerweise gleich protobuf benutzen und ne eigene Klasse damit befüllen (siehe unten).
Hier der cod Parser code:
cod_parser.cpp
codhelpers.cpp
cod_parser.hpp
codhelpers.hpp

Hier ein Beispiel für die haeuser. cod

Hier das proto file

Hier ein cod-Exporter, der nen json dump macht

Ansonsten: ja klar kannst du go in C++ nutzen.
go Code compiliert zu object files, gegen die du in C++ linken kannst, als käme sie aus C.
https://stackoverflow.com/questions/62977352/using-go-in-c

stwe commented

Ich habe den Parser mal mittels eines völligen Blindflugs in mein Projekt übernommen und die Boost Abhängigkeit entfernt. Ganz zufrieden bin ich nicht mit meinem Ergebnis (deprecated methods, Probleme mit den Umlauten unter Win), aber so auf den ersten Blick läuft das Ding; er produziert mir jedenfalls eine Json von der haeuser.cod. Ich hatte Deinen Parser schon früher dazu genommen, um mir eine Json zu erstellen, aus der ich dann die Objekte erstellt habe. Mir geht es vor allem darum, dass ich diese Json nicht mit dem Repo verteilen wollte. Ziel erreicht. Wenn mal eine Version in Go fertig sein sollte, nehme ich die gerne....

Mein Ansatz wäre es ohnehin einen Importer von original Ressourcen zu bauen. z. b. "hier-sind-die-original-dateien-mach-mir-daraus-was-vernunftiges"
z. b. Grafiken in png umwandeln, cod nach z. b. json, map Format in was vernünftiges, etc.

dann kann man nämlich den Code völlig unabhängig vom eigentlichen originalkrams bauen