summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map.cpp133
-rw-r--r--src/map.h47
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()
diff --git a/src/map.h b/src/map.h
index 64ac06fd..dc4ec5e2 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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];
};