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.