Taller
>> Taller >> Formato de los archivos WLD de DIV 2 by Er_Makina

Actualizado el 10/7/2000.

Saludos a todos los DIVeros que día a día se pelean con el Modo 8. Esta información la saqué a base de examinar ficheros WLD con un editor hexadecimal, y a partir de archivos de fuentes del VPE (Virtual Presence Engine). Con el formato WLD que explico aquí es posible crear herramientas externas a DIV, que puedan leer, modificar, guardar, crear, etc. este tipo de archivos, sin necesidad de entrar en el entorno DIV. A continuación explico un poco la utilización de este documento.

Los archivos WLD están divididos en tres partes: la cabecera, la sección que describe el mapa para el editor de DIV (a la que he llamado 1ª sección) y la sección que describe el mapa directamente para los juegos (a la que he llamado 2ª sección). Esta última tiene un formato muy similar a los ficheros ZON del VPE y es la zona del fichero interpretada a la hora de visualizar el mapa en 3D.

He expresado el formato al estilo C, para que pueda ser adaptado rápidamente a los programas. En las primeras secciones he utilizado expresiones como Uint32 que posiblemente no sea el sistema original utilizado pero sirven para indicar el tipo de datos que son. Podría haber utilizado otros como unsigned long, dword, etc. pero los que he usado me parecen más descriptivos y abreviados. No obstante he respetado los tipos utilizados en la 2ª sección, sacados del VPE, aunque naturalmente tuve que hacer algunas modificaciones para adaptarlo a DIV, como cambiar Eff[9] por Eff[10], o añadir la nueva estructura ZON_Flag, inexistente en el VPE.

Indico otros detalles en las notas al final de este fichero.

La mayoría de la información mostrada aquí fue obtenida a base de prueba y error, por lo que no garantizo el perfecto funcionamiento del formato al adaptarlo a C u otros lenguajes.

Finalmente, quiero expresar mi agradecimiento a Víctor Roman, que me proporcionó valiosa información, a todos los que me han apoyado con el WLD y el M8Designer, y naturalmente a todos los miembros de la comunidad DIVera.

Más información sobre el VPE: http://www.ii.uib.no/~alexey/vpe.

 

---------------------------------------------------------------
  CABECERA
char magic[8] = "wld\x1a\x0d\x0a\x01\0"
Uint32 datpos = offset comienzo "2ª sección" - 12 (*)
char selfpath[256] = ruta y nombre de archivo del WLD
char filename[12] = nombre de archivo del WLD
char nada1[8] = "\0\0\0\0\x01\0\0\0"
char fpgpath[256] = ruta y nombre de archivo del FPG
char fpgname[12] = nombre de archivo del FPG
Uint32 nada2 = 0
---------------------------------------------------------------

---------------------------------------------------------------
  1ª SECCIÓN - Descripción del mapa para el editor de DIV

- Vértices

Uint32 NumVertices = número de vértices

struct vertice {
  Uint32 nada = 0
  Uint32 x = coordenada X
  Uint32 y = coordenada Y
  Uint32 links = número de líneas a las que pertenece
}

- Paredes

Uint32 NumParedes = número de paredes (líneas)

struct pared {
  Uint32 nada = 0
  Uint32 nada2 = cualquier cosa
  Uint32 v1 = vértice 1
  Uint32 v2 = vértice 2
  Uint32 nada3 = 0
  Sint32 nada4 = -1
  Uint32 textura = textura
  Uint64 nada5 = cualquier cosa
  Uint32 luz = luminosidad (**)
}

- Sectores

Uint32 NumSectores = número de sectores

struct sector {
  Uint32 nada = 0
  Uint32 nada2 = 1
  Uint32 FloorH = altura del suelo
  Uint32 CeilH = altura del techo
  Uint32 FloorTex = textura del suelo
  Uint32 CeilTex = textura del techo
  Uint32 luz = luminosidad (**)
}

- Banderas

 Uint32 NumBanderas = número de banderas
 Uint32 nada3 = 0

struct bandera {
  Uint32 x = coordenada X
  Uint32 y = coordenada Y
  Uint32 numero = número de la bandera
  Uint32 nada = 1
}
---------------------------------------------------------------

---------------------------------------------------------------
  2ª SECCIÓN - Descripción del mapa para el VPE, en formato ZON

- Cabecera

struct ZON_Header {
  char IDStr[4] = "DAT\0"
  SHORT NumPoints = número de puntos
  SHORT NumRegions = número de sectores
  SHORT NumWalls = número de paredes
  SHORT NumFlags = número de banderas
}

- Vértices

struct ZON_Point {
  DWORD Type = tipo (0) (***)
  LONG x = coordenada X
  LONG y = coordenada Y
  SHORT path = índice de ruta (-1) (***)
  SHORT link = índice del siguiente punto en el enlace (0) (***)
}

- Sectores

struct ZON_Region {
  DWORD Type = tipo (0) (***)
  SHORT FloorH = altura del suelo
  SHORT CeilH = altura del techo
  SHORT Below = sector inferior (-1) (***)
  SHORT Above = sector superior (-1) (***)
  int FloorTex = textura del suelo
  int CeilTex = textura del techo
  char Eff[10] = Eff program ("NO_NAME\0") (***)
  SHORT Fade = luminosidad (**)
  DWORD Tag = Tag ID (0) (***)
}

- Paredes

struct ZON_Wall {
  DWORD Type = tipo (1) (***)
  SHORT p1 = vértice 1
  SHORT p2 = vértice 2
  SHORT Front = sector frontal
  SHORT Back = sector trasero (-1 si es pared exterior)
  int TopTex = textura (=BotTex)
  int MidTex = 0 (***)
  int BotTex = textura (=TopTex)
  char Eff[10]; = Eff program ("NO_NAME\0") (***)
  SHORT Fade = luminosidad (**)
  SHORT TexX = ajuste de textura X (0) (***)
  SHORT TexY = ajuste de textura Y (0) (***)
  SHORT Mass = masa (0) (***)
  SHORT Tag = Tag ID (0) (***)
}

- Banderas

struct ZON_Flag {
  LONG x = coordenada X
  LONG y = coordenada Y
  int numero = número de la bandera
}

- Datos generales

struct ZON_General {
  char Title[24] = nombre del mapa 3D (***)
  char Palette[12] = nombre de la paleta (***)
  int ScrTex = Name of screen texture (0) (***)
  int BackTex = textura de fondo (cielo)
  char BackEff[10] = Background Eff program ("NO_NAME\0") (***)
  SHORT BackAngle = 120
  SHORT ActView; = Index of view which gets kbd input (0) (***)
  struct ZON_Move {
    SHORT x = 200 (***)
    SHORT y = 200 (***)
    SHORT z = 400 (***)
    SHORT t = 100 (***)
  }
}
---------------------------------------------------------------

NOTAS:

(*)      Aquí se debe indicar la posición del fichero 12 bytes antes de que comience la 2ª sección (12 bytes antes de la cadena "DAT").

(**)   En el fichero WLD, la luminosidad se indica al revés que en el entorno de DIV, es decir, restado de 15 (ya que hay 16 gradientes de luz). Por ejemplo, si leemos un valor de luz 6, tendremos que restarlo de 15: 15-6=9. 9 es el valor equivalente que se usa en el lenguaje y en el entorno de DIV.

(***) Estos datos no son utilizados por DIV, sin embargo son leídos por el VPE, por tanto lo más aconsejable es poner el valor que se indica entre paréntesis, si lo hay.