Textur-IDs Descent1-Files

Allgemeine Themen rund um Descent und D2X-XL

Moderator: Frustikus

joeydee
Posts: 5
Joined: Tue Apr 26, 2011 9:26 pm

Textur-IDs Descent1-Files

Postby joeydee » Tue Apr 26, 2011 9:43 pm

Hi, ich hoffe ich darf die Frage hier überhaupt stellen, aber es scheint, als könnte sich hier jemand mit den Levelformaten auskennen.
Ich bin dabei, einen Viewer für Descent1-Levels zu schreiben (keine Sorge, ich mache hier keine Konkurrenz ;-)). Klappt alles prima (inklusive UV und Lighting alles hinbekommen), bis auf die Textur-IDs.
Wenn ich z.B. die Wände Cube 1 aus Level 1 (Lunar Outpost, D1) lade, bekomme ich folgende IDs (1st/2nd) aus der Datei:
left: 0/-1
top: 13/281
right: 0/-1
bottom: 271/-1
back: 0/399
front: no wall.

(-1 ist mein eigener Platzhalter für "keine zweite Textur")
Es scheint ja, dass "0" zu "rock001" zeigen müsste, 13 zu einer Decke, 281 zu einem eckigen Licht, 271 zu Fliesen und 399 zur Eingangstür. In sich scheint das alles im gesamten File konsistent zu sein.

Nun habe ich auch einen funktionierenden PIG-Viewer geschrieben. Erst kommen ein paar Robot-Texturen, dann etliche Sprite-Animationen und irgendwann (ab 773) die Rock-Texturen. Aber ich finde einfach keinen Weg, die Textur-IDs passend auf die PIG-Nummer zu mappen. Es scheint, als würden im PIG-File ein paar Texturen gar nicht mitgezählt, aber die Animationsframes sind es nicht. Aus den Original-Quellcodes und aus den Spezifikationen die ich fand konnte ich nichts dergleichen rauslesen.

Hat hier jemand einen Tip für mich? Wäre prima, danke schonmal für's Lesen.

Gruß
jo
User avatar
karx11erx
D2X-XL Master
D2X-XL Master
Posts: 8111
Joined: Mon Sep 24, 2007 8:48 pm
Location: Wilferdingen, Germany
Contact:

Re: Textur-IDs Descent1-Files

Postby karx11erx » Tue Apr 26, 2011 11:12 pm

Ich glaube nicht, dass hier jemand Angst vor Konkurrenz hat. Selbst (besser: erst recht) wenn Du ein besseres D2X-XL schreiben würdest, wäre ich der erste, der es benutzen würde. ;)

Warum nimmst Du für so was nicht einfach DLE-XP? Am besten siehst Du Dir die Quellen von D2X-XL an, dann verstehst Du die Level-Struktur am schnellsten.
joeydee
Posts: 5
Joined: Tue Apr 26, 2011 9:26 pm

Re: Textur-IDs Descent1-Files

Postby joeydee » Wed Apr 27, 2011 7:06 am

Ok, da werd ich mich mal durchwühlen und schauen ob ich einen Hinweis finde. Danke schonmal.

Zum Hintergrund:
Nein, ein neuer Descent-Klon wirds (für dich: leider ;-) ) nicht, eher der Versuch einer Erweiterung für einen Spaceshooter-Prototyp um möglichst einfache Indoor-(Raumstation-)Levels (zur Zeit mehr eine Testumgebung als ein Spiel). Was auch schon ganz gut klappt, da bin ich eigentlich auch nicht auf das Levelformat und Texturen von D1 angewiesen.
Aber da es zahlreiche fertige Levels gibt und ich gerade meine Asset- und Texturverwaltung neu schreibe, bietet es sich an mit vorhandenem Material zu arbeiten, vor allem auch da sich die D1-Levels sehr leicht in mein Levelformat einlesen lassen und ich so das Umschalten vieler Texturen und das massive Laden und Freigeben von Daten testen möchte. Mit "richtigen" Levels macht das halt mehr Spaß :-)

So sieht's gerade "innen" aus:
http://zfx.info/download/file.php?id=1077&mode=view
http://zfx.info/download/file.php?id=1076&mode=view
http://zfx.info/download/file.php?id=1075&mode=view

Alles übrigens in Flash; zur Zeit allerdings noch im Molehill Incubator Program, eine Art public Alpha für die kommende 3D-Hardwareunterstützung in Flash.

Alles hat problemlos geklappt, bis eben auf die Textur-IDs ^^
User avatar
karx11erx
D2X-XL Master
D2X-XL Master
Posts: 8111
Joined: Mon Sep 24, 2007 8:48 pm
Location: Wilferdingen, Germany
Contact:

Re: Textur-IDs Descent1-Files

Postby karx11erx » Wed Apr 27, 2011 11:12 am

Cool!

Hier habe ich was aus den Quellen von DLE-XP für Dich (die sind etwas kompakter als die von D2X-XL). Ich habe die Funktionen ziemlich aufgedröselt und sie verarbeiten D1, D2 und D2X-XL-Level; Du musst Dich also etwas durchwühlen, aber für D1-Level ist nur der Pfad "DLE.LevelType () == 0" interessant. Um die Texturen geht es in CSide::Read().

Code: Select all

typedef struct tSegment {
   ushort   verts [MAX_VERTICES_PER_SEGMENT];   // vertex ids of 4 front and 4 back vertices
   byte      function;         // general function (robot maker, energy center, ... - mutually exclusive)
   byte      props;         // special property of a segment (such as damaging, trigger, etc.)
   char      nMatCen;         // which center segment is associated with, high bit set
   char      value;         // matcens: bitmask of producable robots, fuelcenters: energy given? --MK, 3/15/95
   byte      flags;         // internally used
   short      damage [2];
   int      staticLight;      // average static light in segment
   byte      childFlags;         // bit0 to 5: children, bit6: unused, bit7: special
   byte      wallFlags;         // bit0 to 5: door/walls, bit6: deleted, bit7: marked segment
   short      mapBitmask;      // which lines are drawn when displaying wireframe
   byte      bTunnel;         // part of a tunnel?
   char      owner;
   char      group;
} tSegment;

Allerdings sind nicht alle diese Felder in der Leveldatei abgespeichert - einige dienen zur internen Verwaltung des Segments, oder werden aus Performancegründen aus anderen Daten abgeleitet.

Segment lesen:

Code: Select all

void CSegment::Read (CFileManager* fp)
{
   int   i;

if (DLE.LevelType () == 2) { //D2X-XL only
   m_info.owner = fp->ReadSByte ();
   m_info.group = fp->ReadSByte ();
   }
else {
   m_info.owner = -1;
   m_info.group = -1;
   }
// read in child mask (1 byte) - bit (1 << i) set if segment has connected neighbouring segment at side "i"
m_info.childFlags = byte (fp->ReadSByte ());
// read 0 to 6 children (0 to 12 bytes)
for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++) // read segment list indices of neighbouring segments (-1 -> no neighbour, solid wall)
   m_sides [i].m_info.nChild = (m_info.childFlags & (1 << i)) ? fp->ReadInt16 () : -1;
// read indices of vertices in vertex list (16 bytes)
for (i = 0; i < MAX_VERTICES_PER_SEGMENT; i++)
   m_info.verts [i] = fp->ReadInt16 ();
if (DLE.LevelType () == 0) // Descent 1
   ReadExtras (fp, (m_info.childFlags & (1 << MAX_SIDES_PER_SEGMENT)) != 0);
// read the wall bit mask - bit (1 << i) set if there is a dynamic wall at side "i"
m_info.wallFlags = byte (fp->ReadSByte ());
// read in wall numbers (0 to 6 bytes)
for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++)
   m_sides [i].m_info.nWall =
      ((m_info.wallFlags & (1 << i)) == 0)
         ? NO_WALL
         : (DLE.LevelVersion () < 13) // old levels have a 1 byte wall type
            ? (ushort) fp->ReadByte ()
            : fp->ReadUInt16 ();
// read in textures and uvls (0 to 60 bytes)
for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++) 
   m_sides [i].Read (fp, (Child (i) == -1) || ((m_info.wallFlags & (1 << i)) != 0));
}


Einzelne Seite eines Segments (Cubes) einlesen:

Code: Select all

void CSide::Read (CFileManager* fp, bool bTextured)
{
if (bTextured) {
   m_info.nBaseTex = fp->ReadInt16 ();
   if (m_info.nBaseTex & 0x8000) { // -> side has a 2nd (overlay) texture
      m_info.nOvlTex = fp->ReadInt16 ();
      if ((m_info.nOvlTex & 0x1FFF) == 0) // upper 3 bits contain overlay orientation (rotation in 90 degree steps)
         m_info.nOvlTex = 0;                     // so mask off orientation to get texture index; index == 0 => no texture
      }
   else
      m_info.nOvlTex = 0;
   m_info.nBaseTex &= 0x1FFF;
   for (int i = 0; i < 4; i++)
      m_info.uvls [i].Read (fp); // uvl contains uv texture coordinates and brightness value l ("light) per corner
   }
else {
   m_info.nBaseTex = 0;
   m_info.nOvlTex = 0;
   for (int i = 0; i < 4; i++)
      m_info.uvls [i].Clear ();
      }
   }


Veränderbare Zwischenwand einlesen:

Code: Select all

byte CSegment::ReadWalls (CFileManager* fp)
{
   byte wallFlags = byte (fp->ReadSByte ());
   int i;

for (i = 0; i < MAX_SIDES_PER_SEGMENT; i++)
   if (m_info.wallFlags & (1 << i))
      m_sides [i].m_info.nWall = (DLE.LevelVersion () >= 13) ? fp->ReadUInt16 () : (ushort) fp->ReadByte ();
return wallFlags;
}


Zusatzdaten einlesen:

Code: Select all

void CSegment::ReadExtras (CFileManager* fp, bool bExtras)
{
if (bExtras) {
   m_info.function = fp->ReadSByte ();
   m_info.nMatCen = fp->ReadSByte ();
   m_info.value = fp->ReadSByte ();
   fp->ReadSByte ();
   }
else {
   m_info.function = 0;
   m_info.nMatCen = -1;
   m_info.value = 0;
   }
if (DLE.LevelType ()) { // D2, D2X-XL
   if (DLE.LevelVersion () < 20)
      Upgrade ();
   else {
      m_info.props = fp->ReadSByte ();
      m_info.damage [0] = fp->ReadInt16 ();
      m_info.damage [1] = fp->ReadInt16 ();
      }
   }
m_info.staticLight = (DLE.LevelType () == 0) ? (int) fp->ReadInt16 () : fp->ReadInt32 ();
}
joeydee
Posts: 5
Joined: Tue Apr 26, 2011 9:26 pm

Re: Textur-IDs Descent1-Files

Postby joeydee » Thu Apr 28, 2011 7:49 am

Danke für's raussuchen :-)
Ich bin das mal Stück für Stück durchgegangen, es scheint aber da mache ich alles richtig.

Hier ein paar markante Textur-IDs aus D1, Level1, wie sie bei mir ausgelesen werden:
graue Felswand im ersten Raum: 0 ("rock001")
Eingangstür des Levels: 399 (vermutl. "door05", Frame 1)
Gefängnistür: 419 ("door24")
Alpha-Zeichen: 321 ("misc058")
Weißes Türlicht seitlich: 250 ("metl126")

Ich weiß nicht wie groß der Aufwand für dich wäre diese Werte mal mit eurem Projekt zu vergleichen?
Selbst compilieren kann ich euer Projekt leider nicht, sonst würde ich das natürlich selbst ausprobieren.

Ich schätze aber der Hund liegt woanders begraben, nämlich das richtige Zuweisen der ID aus dem RDL-File zum entsprechenden Bild im PIG-File. Ihr habt da Methoden drin wie "CTextureManager::LoadNames (int nVersion)" und auch eine "TEXTURE_STRING_TABLE_D1".
Wie ist da das generelle Handling, gibt es da Tabellen die von der ID zum Namen oder Offset im PIG verweisen? Denn das alleinige sequentielle Durchnummerieren der PIG-Bilder scheint nicht viel mit den IDs zu tun zu haben?
User avatar
karx11erx
D2X-XL Master
D2X-XL Master
Posts: 8111
Joined: Mon Sep 24, 2007 8:48 pm
Location: Wilferdingen, Germany
Contact:

Re: Textur-IDs Descent1-Files

Postby karx11erx » Thu Apr 28, 2011 8:18 am

Ja, da gibt es Tabellen.
joeydee
Posts: 5
Joined: Tue Apr 26, 2011 9:26 pm

Re: Textur-IDs Descent1-Files

Postby joeydee » Fri Apr 29, 2011 8:35 am

Ja, schön für die Tabellen ;-)

Wie ich sehe sprengt das Finden/Erstellen einer Tabelle in der Form
399 --> door005
419 --> door24
...
vermutlich meinen Rahmen, jedenfalls konnte ich aus den Quellen bis jetzt keinen einfachen direkten Weg herauslesen.
Ich werde wohl mit automatisch generierten dummys weiterarbeiten, das erfüllt auch seinen Zweck, wenn natürlich auch nicht so nostalgisch-hübsch ;-)

Danke jedenfalls für deine Zeit und noch viel Spaß in den Minen! :-)
User avatar
karx11erx
D2X-XL Master
D2X-XL Master
Posts: 8111
Joined: Mon Sep 24, 2007 8:48 pm
Location: Wilferdingen, Germany
Contact:

Re: Textur-IDs Descent1-Files

Postby karx11erx » Fri Apr 29, 2011 9:43 am

Diese Tabellen stehen in den Originalspieldaten. Wenn Du das genauer wissen willst, musst Du Dich z.B. durch die Quellen von D2X-XL durchwühlen. Die Datei gameio/loadgamedata.cpp sollte Dir weiterhelfen. Sorry, aber da musst Du selber durch. D2X-XL kannst Du z.B. mit Visual C++ 2010 Express übersetzen und debuggen, dann siehst Du vielleicht am schnellsten, wie das funktioniert.
joeydee
Posts: 5
Joined: Tue Apr 26, 2011 9:26 pm

Re: Textur-IDs Descent1-Files

Postby joeydee » Fri Apr 29, 2011 10:09 am

Wie gesagt, danke auf jeden Fall für deine Mühe, das war schon mehr als ich überhaupt zu finden gehofft hatte. Schön dass sich diese Tage immer noch Fans so intensiv mit Descent befassen :-)

Was die Texturen betrifft: ich bin anfangs davon ausgegangen, dass die Nummern irgendwie mehr oder weniger direkt auf die PIG-Bitmaps verweisen müssen, da ja bei diesem Spiel sowieso ein festes Texturset benutzt wird, und ich daher nur einen kleinen Fehler mache der einfach zu beheben ist, wie z.B. ein übersehener Offset oder Flag.
Jetzt den ganzen Weg nachzuvollziehen nur für ein Wiedersehen der alten Texturen hält mich inzwischen zu sehr von meinen anderen Zielen ab, daher werde ich das vorerst kippen, aber sicher bei Gelegenheit darauf zurückkommen.
User avatar
karx11erx
D2X-XL Master
D2X-XL Master
Posts: 8111
Joined: Mon Sep 24, 2007 8:48 pm
Location: Wilferdingen, Germany
Contact:

Re: Textur-IDs Descent1-Files

Postby karx11erx » Fri Apr 29, 2011 10:20 am

Tja, der Descent-Code ist in mehr als einer Hinsicht ziemlich Panne. Descent war halt ein Erstlingswerk und in meinen Augen ziemlich zusammengepfuscht. Sieh Dir vergleichsweise mal den Code einer alten Quake-Engine an, und Du wirst sehen, was ich meine.

Return to “Allgemein”

Who is online

Users browsing this forum: No registered users and 1 guest