summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/map/map.c49
-rw-r--r--src/tool/mapcache.c20
3 files changed, 39 insertions, 33 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index ced81ce07..500bf2615 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/12/26
+ * Fixed the incorrect interpretation of the map-cell height information
+ stored in .gat files; this was causing an overall of 20000 cells to
+ be treated as water when officially they aren't [ultramage]
* Fixed string variables dereferencing directly to the value instead of
dereferencing to a copy of the value. (fixes bugreport:684 bugreport:641) [FlavioJS]
2007/12/23
diff --git a/src/map/map.c b/src/map/map.c
index 59eef42cc..6e8bf4775 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -2474,33 +2474,38 @@ int map_waterheight(char* mapname)
*----------------------------------*/
int map_readgat (struct map_data* m)
{
- char fn[256];
- char *gat;
- int wh,x,y,xs,ys;
- struct gat_1cell {float high[4]; int type;} *p = NULL;
+ char filename[256];
+ uint8* gat;
+ int water_height;
+ size_t xy, off, num_cells;
- sprintf(fn, "data\\%s.gat", m->name);
+ sprintf(filename, "data\\%s.gat", m->name);
- // read & convert fn
- gat = (char *) grfio_read (fn);
+ gat = (uint8 *) grfio_read(filename);
if (gat == NULL)
return 0;
- xs = m->xs = *(int*)(gat+6);
- ys = m->ys = *(int*)(gat+10);
- m->gat = (unsigned char *)aMallocA((xs * ys)*sizeof(unsigned char));
-
- wh = map_waterheight(m->name);
- for (y = 0; y < ys; y++) {
- p = (struct gat_1cell*)(gat+y*xs*20+14);
- for (x = 0; x < xs; x++) {
- if (wh != NO_WATER && p->type == 0)
- // …ê”»’è
- m->gat[x+y*xs] = (p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
- else
- m->gat[x+y*xs] = p->type;
- p++;
- }
+ m->xs = *(int32*)(gat+6);
+ m->ys = *(int32*)(gat+10);
+ num_cells = m->xs * m->ys;
+ CREATE(m->gat, uint8, num_cells);
+
+ water_height = map_waterheight(m->name);
+
+ // Set cell properties
+ off = 14;
+ for( xy = 0; xy < num_cells; ++xy )
+ {
+ // read cell data
+ float height = *(float*)( gat + off );
+ uint32 type = *(uint32*)( gat + off + 16 );
+ off += 20;
+
+ if( type == 0 && water_height != NO_WATER && height > water_height )
+ type = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
+
+ m->gat[xy] = (uint8)type;
+
}
aFree(gat);
diff --git a/src/tool/mapcache.c b/src/tool/mapcache.c
index b204cf7c7..c74484339 100644
--- a/src/tool/mapcache.c
+++ b/src/tool/mapcache.c
@@ -110,7 +110,7 @@ int read_map(char *name, struct map_data *m)
unsigned char *gat, *rsw;
int water_height;
size_t xy, off, num_cells;
- float height[4];
+ float height;
unsigned long type;
// Open map GAT
@@ -140,18 +140,16 @@ int read_map(char *name, struct map_data *m)
off = 14;
for (xy = 0; xy < num_cells; xy++)
{
- // Height of the corners
- height[0] = GetFloat( gat + off );
- height[1] = GetFloat( gat + off + 4 );
- height[2] = GetFloat( gat + off + 8 );
- height[3] = GetFloat( gat + off + 12 );
+ // Height of the bottom-left corner
+ height = GetFloat( gat + off );
// Type of cell
- type = GetULong( gat + off + 16 );
+ type = GetULong( gat + off + 16 );
off += 20;
- if (water_height != NO_WATER && type == 0 && (height[0] > water_height || height[1] > water_height || height[2] > water_height || height[3] > water_height))
- m->cells[xy] = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
- else
- m->cells[xy] = (unsigned char)type;
+
+ if (type == 0 && water_height != NO_WATER && height > water_height)
+ type = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
+
+ m->cells[xy] = (unsigned char)type;
}
free(gat);