roybaer / mdcii-engine

Plattformunabhängiger Nachbau der Grafikengine von Anno 1602 – Platform independent remake of the graphics engine of Anno 1602/1602 AD
GNU General Public License v2.0
25 stars 5 forks source link

Hilfe bzgl. einiger Datensaetze #12

Closed siredmar closed 5 years ago

siredmar commented 5 years ago

Hi! Ich versuche gerade die geparsten Daten im Code einzubauen. Quasi die alten Objekte Bebauung und Grafiken durch die aus dem COD zu ersetzen. Ich hab zumindest schon einen Stand, der die Inseln anzeigt, und nicht abstuerzt. Das ist schomal gut (siehe branch https://github.com/siredmar/mdcii-engine/tree/cod-parser-data) Aber ich hab noch einige Probleme mit den Ansichten der Teile und mit den Animationen. Seht selbst:

image

Die Animationen zappeln auch wild umher, das Bild scheint nicht statisch zu sein. D.h. die Animation scheint grundlegend nach wievor zu funktionieren, offenbar springt er nur falsche Indizes an.

Es gibt nun einige Unterschiede zwischen den Daten aus der COD und der Daten, die in bebauung.txt stehen (was ja nicht weiter verwunderlich ist) :-)

Was ich bereits mappen kann ist:

Id <-> Id ani_schritte <-> AnimAnz hoehe <-> Size[1] breite <-> Size[0]

Wo ich mir noch schwer tue:

grundhoehe <-> Posoffs (wobei, ich mir da nicht 100% sicher bin) lagerstaende <-> Haus_Prodtyp.Rohmenge oder Haus_Prodtyp.Prodmenge oder Haus_Prodtyp.Maxlager (bin mir nicht 100% sicher, wird aber im Code noch nicht verwendet)

kategorie <-> Kind und Haus_Prodtyp.Kind. Hier wird unterschieden zwischen grundsaetzlichem Typ in Kind (z.B. Fels, Gebaeude, Wald, Bruecke, Turm, uvm.) und einer Verfeinerung fuer die Haeuser Haus_Prodtyp.Kind (z.B. Brunnen, Kontor, Hochschule, Jagdhaus, ...)

Was ich nicht mappen kann:

bauhoehe: nicht so schlimm, wird offenbar im Code nirgends verwendet richtungen: Hier koennte vielleicht Rotate passen, aber die nimmt verschiedene Werte zwischen Objekten an, z.B. 0, 1, 6, 11, 36, 9, 16...

Kann mir da jemand weiterhelfen?

Green-Sky commented 5 years ago

Ich mein mich grob zu erinner, dass lagersaende im animations Fortschritt gespeichert war.

roybaer commented 5 years ago

richtungen: Hier koennte vielleicht Rotate passen, aber die nimmt verschiedene Werte zwischen Objekten an, z.B. 0, 1, 6, 11, 36, 9, 16...

Könnte es sein, dass Rotate schon mit Size[0] und Size[1] vormultipliziert ist, um bei der Bestimmung der Grafiken Berechnungen zu sparen?

Green-Sky commented 5 years ago

Mein alter Code sagt:

uint16_t anim_num;
if (*(t->anim)) {
    assert(t->anim_time != 0);
    anim_num = SDL_GetTicks() % (t->anim_time * t->anim_count);
    anim_num /= t->anim_time;
    anim_num -= (x + pos_x);
    anim_num %= t->anim_count;
    anim_num *= t->anim_add;
} else {
    anim_num = *t->anim_num;
}

SDL_Texture* tex = Banks::tb_buildings.fetchSDL_Texture2(
    t->gfx
    + (((t->ori + ori) % 4) * t->rotate)
    + anim_num
    + t->tile_id
    , ren);

Also is die Grafik gfx + (((tile_orientierung + betrachtungs_orientierung) % 4) * jenes_rotate_aus_haeuser) + animations_anzahl? + tile_id?

Ich bin mir leider nicht mehr ganz sicher was ich da damals fabriziert habe. :sweat:

edit: anim_time = AnimTime anim_count = AnimAnz anim_add = AnimAdd

roybaer commented 5 years ago

Ach, dann ist also Rotate die Anzahl an Grafiken pro Drehung und ob es eine oder vier Drehungen gibt, wird daraus gefolgert ob Rotate null oder etwas anderes ist, oder wie läuft das dann?

roybaer commented 5 years ago

Guck mal, was ich im „Försterhaus“ gefunden habe:

      Maxlager:   10
      LagAniFlg:  1
    EndObj;

Das dürfte bedeuten, dass die unterschiedlichen Grafiken nicht für Bewegungen, sondern für den Lagerstand sind. Das wäre damit geklärt.