From 49ea67bae1d2969c21005c06bb764f3c6b479e9c Mon Sep 17 00:00:00 2001
From: Bjørn Lindeijer <bjorn@lindeijer.nl>
Date: Sun, 6 Feb 2005 16:51:22 +0000
Subject: Some preparational changes to the map format.

---
 src/map.cpp | 133 ++++++++++++++++++++++++++++++++++++++++--------------------
 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()
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];
 };
-- 
cgit v1.2.3-70-g09d2