Fix compilation of map tools. Add support for version 10 game files with power information.
git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@7905 4a71c877-e1ca-e34f-864e-861f7616d084master
parent
2f92b730ad
commit
4ff191aeea
|
@ -69,6 +69,8 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
mkdir(filename, 0777);
|
mkdir(filename, 0777);
|
||||||
strcpy(base, filename);
|
strcpy(base, filename);
|
||||||
|
strcat(filename, "/map-001");
|
||||||
|
mkdir(filename, 0777);
|
||||||
|
|
||||||
/*** Map configuration ***/
|
/*** Map configuration ***/
|
||||||
strcat(filename, "/map.ini");
|
strcat(filename, "/map.ini");
|
||||||
|
@ -93,7 +95,7 @@ int main(int argc, char **argv)
|
||||||
MADD("TileHeight = %d", TILE_WIDTH);
|
MADD("TileHeight = %d", TILE_WIDTH);
|
||||||
MADD("SeaLevel = %d", SEALEVEL);
|
MADD("SeaLevel = %d", SEALEVEL);
|
||||||
MADD("Tileset = %s", tilesetTextures[map->tileset]);
|
MADD("Tileset = %s", tilesetTextures[map->tileset]);
|
||||||
MADD("NumTiles = %d", map->width * map->height);
|
|
||||||
MADD("\n[scroll_limits]");
|
MADD("\n[scroll_limits]");
|
||||||
MADD("x1 = %d", map->scrollMinX);
|
MADD("x1 = %d", map->scrollMinX);
|
||||||
MADD("y1 = %d", map->scrollMinY);
|
MADD("y1 = %d", map->scrollMinY);
|
||||||
|
|
|
@ -46,7 +46,8 @@ int main(int argc, char **argv)
|
||||||
else { strcpy(tilesetName, "(unknown)"); }
|
else { strcpy(tilesetName, "(unknown)"); }
|
||||||
|
|
||||||
printf("Loaded map: %s\n", filename);
|
printf("Loaded map: %s\n", filename);
|
||||||
printf("\tMap version: %d\n", (int)map->version);
|
printf("\tMap version: %d\n", (int)map->mapVersion);
|
||||||
|
printf("\tGame version: %d\n", (int)map->gameVersion);
|
||||||
printf("\tWidth: %d\n", (int)map->width);
|
printf("\tWidth: %d\n", (int)map->width);
|
||||||
printf("\tHeight: %d\n", (int)map->height);
|
printf("\tHeight: %d\n", (int)map->height);
|
||||||
printf("\tGateways: %d\n", (int)map->numGateways);
|
printf("\tGateways: %d\n", (int)map->numGateways);
|
||||||
|
|
|
@ -31,8 +31,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
{
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
GAMEMAP *map = malloc(sizeof(*map));
|
GAMEMAP *map = malloc(sizeof(*map));
|
||||||
uint32_t i, j, gameTime, gameType, droidVersion, structVersion;
|
uint32_t i, j, gameTime, gameType, gwVersion;
|
||||||
uint32_t gwVersion, gameVersion, featVersion, terrainVersion;
|
|
||||||
char aFileType[4];
|
char aFileType[4];
|
||||||
bool littleEndian = true;
|
bool littleEndian = true;
|
||||||
PHYSFS_file *fp = NULL;
|
PHYSFS_file *fp = NULL;
|
||||||
|
@ -65,7 +64,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
else if (PHYSFS_read(fp, aFileType, 4, 1) != 1
|
else if (PHYSFS_read(fp, aFileType, 4, 1) != 1
|
||||||
|| !readU32(&map->version)
|
|| !readU32(&map->mapVersion)
|
||||||
|| !readU32(&map->width)
|
|| !readU32(&map->width)
|
||||||
|| !readU32(&map->height)
|
|| !readU32(&map->height)
|
||||||
|| aFileType[0] != 'm'
|
|| aFileType[0] != 'm'
|
||||||
|
@ -75,14 +74,14 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
debug(LOG_ERROR, "Bad header in %s", path);
|
debug(LOG_ERROR, "Bad header in %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
else if (map->version <= 9)
|
else if (map->mapVersion <= 9)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "%s: Unsupported save format version %u", path, map->version);
|
debug(LOG_ERROR, "%s: Unsupported save format version %u", path, map->mapVersion);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
else if (map->version > 36)
|
else if (map->mapVersion > 36)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "%s: Undefined save format version %u", path, map->version);
|
debug(LOG_ERROR, "%s: Undefined save format version %u", path, map->mapVersion);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
else if (map->width * map->height > MAP_MAXAREA)
|
else if (map->width * map->height > MAP_MAXAREA)
|
||||||
|
@ -153,12 +152,12 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
|| aFileType[1] != 'a'
|
|| aFileType[1] != 'a'
|
||||||
|| aFileType[2] != 'm'
|
|| aFileType[2] != 'm'
|
||||||
|| aFileType[3] != 'e'
|
|| aFileType[3] != 'e'
|
||||||
|| !readU32(&gameVersion))
|
|| !readU32(&map->gameVersion))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Bad header in %s", path);
|
debug(LOG_ERROR, "Bad header in %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (gameVersion > 35) // big-endian
|
if (map->gameVersion > 35) // big-endian
|
||||||
{
|
{
|
||||||
littleEndian = false;
|
littleEndian = false;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +172,23 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
debug(LOG_ERROR, "Bad data in %s", filename);
|
debug(LOG_ERROR, "Bad data in %s", filename);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (map->gameVersion >= 10)
|
||||||
|
{
|
||||||
|
uint32_t dummy; // extracted power, not used
|
||||||
|
|
||||||
|
if (!readU32(&map->power[i]) || !readU32(&dummy))
|
||||||
|
{
|
||||||
|
debug(LOG_ERROR, "Bad power data in %s", filename);
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
map->power[i] = 0; // TODO... is there a default?
|
||||||
|
}
|
||||||
|
}
|
||||||
PHYSFS_close(fp);
|
PHYSFS_close(fp);
|
||||||
|
|
||||||
|
|
||||||
|
@ -192,7 +208,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
|| aFileType[1] != 'e'
|
|| aFileType[1] != 'e'
|
||||||
|| aFileType[2] != 'a'
|
|| aFileType[2] != 'a'
|
||||||
|| aFileType[3] != 't'
|
|| aFileType[3] != 't'
|
||||||
|| !readU32(&featVersion)
|
|| !readU32(&map->featVersion)
|
||||||
|| !readU32(&map->numFeatures))
|
|| !readU32(&map->numFeatures))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Bad features header in %s", path);
|
debug(LOG_ERROR, "Bad features header in %s", path);
|
||||||
|
@ -206,7 +222,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
uint32_t dummy;
|
uint32_t dummy;
|
||||||
uint8_t visibility[8];
|
uint8_t visibility[8];
|
||||||
|
|
||||||
if (featVersion <= 19)
|
if (map->featVersion <= 19)
|
||||||
{
|
{
|
||||||
nameLength = 40;
|
nameLength = 40;
|
||||||
}
|
}
|
||||||
|
@ -223,7 +239,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
psObj->player = 0; // work around invalid feature owner
|
psObj->player = 0; // work around invalid feature owner
|
||||||
if (featVersion >= 14 && PHYSFS_read(fp, &visibility, 1, 8) != 8)
|
if (map->featVersion >= 14 && PHYSFS_read(fp, &visibility, 1, 8) != 8)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Failed to read feature visibility from %s", path);
|
debug(LOG_ERROR, "Failed to read feature visibility from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
|
@ -255,7 +271,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
|| aFileType[1] != 't'
|
|| aFileType[1] != 't'
|
||||||
|| aFileType[2] != 'y'
|
|| aFileType[2] != 'y'
|
||||||
|| aFileType[3] != 'p'
|
|| aFileType[3] != 'p'
|
||||||
|| !readU32(&terrainVersion)
|
|| !readU32(&map->terrainVersion)
|
||||||
|| !readU32(&map->numTerrainTypes))
|
|| !readU32(&map->numTerrainTypes))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Bad features header in %s", path);
|
debug(LOG_ERROR, "Bad features header in %s", path);
|
||||||
|
@ -302,7 +318,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
|| aFileType[1] != 't'
|
|| aFileType[1] != 't'
|
||||||
|| aFileType[2] != 'r'
|
|| aFileType[2] != 'r'
|
||||||
|| aFileType[3] != 'u'
|
|| aFileType[3] != 'u'
|
||||||
|| !readU32(&structVersion)
|
|| !readU32(&map->structVersion)
|
||||||
|| !readU32(&map->numStructures))
|
|| !readU32(&map->numStructures))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Bad structure header in %s", path);
|
debug(LOG_ERROR, "Bad structure header in %s", path);
|
||||||
|
@ -319,7 +335,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
int32_t dummyS32;
|
int32_t dummyS32;
|
||||||
char researchName[60];
|
char researchName[60];
|
||||||
|
|
||||||
if (structVersion <= 19)
|
if (map->structVersion <= 19)
|
||||||
{
|
{
|
||||||
nameLength = 40;
|
nameLength = 40;
|
||||||
}
|
}
|
||||||
|
@ -349,7 +365,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
debug(LOG_ERROR, "Failed to read structure from %s", path);
|
debug(LOG_ERROR, "Failed to read structure from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 12
|
if (map->structVersion >= 12
|
||||||
&& (!readU32(&dummy) // factoryInc
|
&& (!readU32(&dummy) // factoryInc
|
||||||
|| !readU8(&dummy8) // loopsPerformed - causes structure padding
|
|| !readU8(&dummy8) // loopsPerformed - causes structure padding
|
||||||
|| !readU8(&dummy8) // structure padding
|
|| !readU8(&dummy8) // structure padding
|
||||||
|
@ -364,12 +380,12 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
debug(LOG_ERROR, "Failed to read structure v12 part from %s", path);
|
debug(LOG_ERROR, "Failed to read structure v12 part from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 14 && PHYSFS_read(fp, &visibility, 1, 8) != 8)
|
if (map->structVersion >= 14 && PHYSFS_read(fp, &visibility, 1, 8) != 8)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Failed to read structure visibility from %s", path);
|
debug(LOG_ERROR, "Failed to read structure visibility from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 15 && PHYSFS_read(fp, researchName, nameLength, 1) != 1)
|
if (map->structVersion >= 15 && PHYSFS_read(fp, researchName, nameLength, 1) != 1)
|
||||||
{
|
{
|
||||||
// If version < 20, then this causes no padding, but the short below
|
// If version < 20, then this causes no padding, but the short below
|
||||||
// will still cause two bytes padding; however, if version >= 20, we
|
// will still cause two bytes padding; however, if version >= 20, we
|
||||||
|
@ -378,17 +394,17 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
debug(LOG_ERROR, "Failed to read structure v15 part from %s", path);
|
debug(LOG_ERROR, "Failed to read structure v15 part from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 17 && !readS16(&dummyS16))
|
if (map->structVersion >= 17 && !readS16(&dummyS16))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Failed to read structure v17 part from %s", path);
|
debug(LOG_ERROR, "Failed to read structure v17 part from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 15 && !readS16(&dummyS16)) // structure padding
|
if (map->structVersion >= 15 && !readS16(&dummyS16)) // structure padding
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Failed to read 16 bits of structure padding from %s", path);
|
debug(LOG_ERROR, "Failed to read 16 bits of structure padding from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
if (structVersion >= 21 && !readU32(&dummy))
|
if (map->structVersion >= 21 && !readU32(&dummy))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Failed to read structure v21 part from %s", path);
|
debug(LOG_ERROR, "Failed to read structure v21 part from %s", path);
|
||||||
goto failure;
|
goto failure;
|
||||||
|
@ -425,7 +441,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
|| aFileType[1] != 'i'
|
|| aFileType[1] != 'i'
|
||||||
|| aFileType[2] != 'n'
|
|| aFileType[2] != 'n'
|
||||||
|| aFileType[3] != 't'
|
|| aFileType[3] != 't'
|
||||||
|| !readU32(&droidVersion)
|
|| !readU32(&map->droidVersion)
|
||||||
|| !readU32(&map->numDroids))
|
|| !readU32(&map->numDroids))
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "Bad droid header in %s", path);
|
debug(LOG_ERROR, "Bad droid header in %s", path);
|
||||||
|
@ -438,7 +454,7 @@ GAMEMAP *mapLoad(char *filename)
|
||||||
int nameLength = 60;
|
int nameLength = 60;
|
||||||
uint32_t dummy;
|
uint32_t dummy;
|
||||||
|
|
||||||
if (droidVersion <= 19)
|
if (map->droidVersion <= 19)
|
||||||
{
|
{
|
||||||
nameLength = 40;
|
nameLength = 40;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "wzglobal.h"
|
||||||
#include "physfs_ext.h"
|
#include "physfs_ext.h"
|
||||||
|
|
||||||
#define MAX_LEVEL_SIZE 20
|
#define MAX_LEVEL_SIZE 20
|
||||||
|
@ -72,8 +73,8 @@ typedef struct _maptile_type
|
||||||
|
|
||||||
typedef struct _mapfile_type
|
typedef struct _mapfile_type
|
||||||
{
|
{
|
||||||
uint32_t height, width, version, numGateways, numFeatures, numTerrainTypes;
|
uint32_t height, width, mapVersion, gameVersion, numGateways, numFeatures, numTerrainTypes, power[8];
|
||||||
uint32_t numPlayers, numDroids, numStructures;
|
uint32_t numPlayers, numDroids, numStructures, droidVersion, structVersion, featVersion, terrainVersion;
|
||||||
int32_t scrollMinX;
|
int32_t scrollMinX;
|
||||||
int32_t scrollMinY;
|
int32_t scrollMinY;
|
||||||
uint32_t scrollMaxX;
|
uint32_t scrollMaxX;
|
||||||
|
|
Loading…
Reference in New Issue