diff options
-rw-r--r-- | src/map.cpp | 133 | ||||
-rw-r--r-- | src/map.h | 47 |
2 files changed, 106 insertions, 74 deletions
diff --git a/src/map.cpp b/src/map.cpp index 2b8e6dac..b913beae 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -35,25 +35,105 @@ Map tiledMap; +#define OLD_MAP_WIDTH 200 +#define OLD_MAP_HEIGHT 200 + +/** + * Old tile structure. Used for loading the old map format. + */ +struct TILE { + /** + * Data field filled at follows: + * + * <pre> + * 1st byte: [1][1][1][1][1][1][1][1] + * 2nd byte: [1][1][2][2][2][2][2][2] + * 3rd byte: [2][2][2][2][3][3][3][3] + * 4th byte: [3][3][3][3][3][3][W][A] + * </pre> + * + * Legend: + * 1 - Ground layer (grass, water, ...) + * 2 - Fringe layer (decoration on top of ground layer, but below beings) + * 3 - Over layer (roofs, tree leaves, ...) + * W - Walkability flag + * A - Animated tile flag + */ + char data[4]; + char flags; +}; + +/** + * Old map structure. Used for loading the old map format. + */ +struct MAP { + TILE tiles[OLD_MAP_WIDTH][OLD_MAP_HEIGHT]; + char tileset[20]; + char bg_music[20]; +}; + + +Tile::Tile(): + whichList(0) +{ +} + bool Map::load(char *mapFile) { FILE *file = fopen(mapFile, "r"); + if (!file) { warning(mapFile); return false; } - fread(this, sizeof(Map), 1, file); + + MAP oldMap; + fread(&oldMap, sizeof(MAP), 1, file); fclose(file); + + // Transfer tile data + int x, y; + for (y = 0; y < OLD_MAP_HEIGHT; y++) { + for (x = 0; x < OLD_MAP_WIDTH; x++) { + unsigned short id; + + // Layer 0 + id = MAKEWORD(oldMap.tiles[x][y].data[1] & 0x00c0, + oldMap.tiles[x][y].data[0]); + id >>= 6; + setTile(x, y, 0, id); + + // Layer 1 + id = MAKEWORD(oldMap.tiles[x][y].data[2] & 0x00f0, + oldMap.tiles[x][y].data[1] & 0x003f); + id >>= 4; + setTile(x, y, 1, id); + + // Layer 2 + id = MAKEWORD(oldMap.tiles[x][y].data[3] & 0x00fc, + oldMap.tiles[x][y].data[2] & 0x000f); + id >>= 2; + setTile(x, y, 2, id); + + // Walkability + setWalk(x, y, (oldMap.tiles[x][y].data[3] & 0x0002) > 0); + } + } + return true; } void Map::setWalk(int x, int y, bool walkable) { - if (walkable) tiles[x][y].data[3] |= 0x0002; - else tiles[x][y].data[3] &= 0x00fd; + if (walkable) { + tiles[x][y].flags |= TILE_WALKABLE; + } + else { + tiles[x][y].flags &= ~TILE_WALKABLE; + } } bool Map::getWalk(int x, int y) { - bool ret = (tiles[x][y].data[3] & 0x0002) > 0; + bool ret = (tiles[x][y].flags & TILE_WALKABLE) != 0; if (ret) { // Check for colliding into a being @@ -70,47 +150,14 @@ bool Map::getWalk(int x, int y) { return ret; } -void Map::setTile(int x, int y, int layer, unsigned short id) { - if (layer == 0) { - id <<= 6; - tiles[x][y].data[0] = HIBYTE(id); - tiles[x][y].data[1] &= 0x003f; - tiles[x][y].data[1] |= LOBYTE(id); - } - else if (layer == 1) { - id <<= 4; - tiles[x][y].data[1] &= 0x00c0; - tiles[x][y].data[1] |= HIBYTE(id); - tiles[x][y].data[2] &= 0x000f; - tiles[x][y].data[2] |= LOBYTE(id); - } - else if (layer == 2) { - id <<= 2; - tiles[x][y].data[2] &= 0x00f0; - tiles[x][y].data[2] |= HIBYTE(id); - tiles[x][y].data[3] &= 0x0003; - tiles[x][y].data[3] |= LOBYTE(id); - } +void Map::setTile(int x, int y, int layer, int id) +{ + tiles[x][y].layers[layer] = id; } -int Map::getTile(int x, int y, int layer) { - unsigned short id = 0; - if (layer == 0) { - id = MAKEWORD(tiles[x][y].data[1] & 0x00c0, - tiles[x][y].data[0]); - id >>= 6; - } - else if (layer == 1) { - id = MAKEWORD(tiles[x][y].data[2] & 0x00f0, - tiles[x][y].data[1] & 0x003f); - id >>= 4; - } - else if (layer == 2) { - id = MAKEWORD(tiles[x][y].data[3] & 0x00fc, - tiles[x][y].data[2] & 0x000f); - id >>= 2; - } - return id; +int Map::getTile(int x, int y, int layer) +{ + return tiles[x][y].layers[layer]; } int Map::getWidth() @@ -24,38 +24,23 @@ #ifndef _TMW_MAP_H #define _TMW_MAP_H -#define TILESET_WIDTH 30 +// Tile flags +#define TILE_WALKABLE 1 +#define TILE_ANIMATED 2 -/** Struct representing a tile. A tile is composed of 3 layers. -1st: Ground layer (used for grass, water, ...) -> bit 0-9 of data -2nd: Fringe layer (objects that are overlapped by the player) -> bit 10-19 of data -3rd: Over layer (roofs, tree leaves, ...) -> bit 20-29 -Walk flag: tells if a tile is walkable or not -> bit 30 -Animation flag: tells if a tile is animated or not -> bit 31 - -data field: -1st byte: [1][1][1][1][1][1][1][1] -2nd byte: [1][1][2][2][2][2][2][2] -3rd byte: [2][2][2][2][3][3][3][3] -4th byte: [3][3][3][3][3][3][W][A] - -Legend: -1 - First layer -2 - Second layer -3 - Third layer -W - Walkability flag -A - Animated tile flag +class Tile +{ + public: + Tile(); -flags field: -[l][l][f][f][f][f][f][f][f] + // Tile data + int layers[3]; + char flags; -Legend: -l - Animated layer -f - future use -*/ -struct TILE { - char data[4]; - char flags; + // Pathfinding members + int Fcost, Gcost, Hcost; + int whichList; + int parentX, parentY; }; class Map @@ -69,7 +54,7 @@ class Map /** * Set tile ID. */ - void setTile(int x, int y, int layer, unsigned short id); + void setTile(int x, int y, int layer, int id); /** * Get tile ID. @@ -99,7 +84,7 @@ class Map private: const static int width = 200; const static int height = 200; - TILE tiles[width][height]; + Tile tiles[width][height]; char tileset[20]; char bg_music[20]; }; |