From dfe4ede046db94e2e6e580d2efa13bb9a773ce15 Mon Sep 17 00:00:00 2001 From: ultramage Date: Wed, 26 Dec 2007 21:51:58 +0000 Subject: 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. A full mapcache rebuild is needed to apply this change. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11982 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 3 +++ src/map/map.c | 49 +++++++++++++++++++++++++++---------------------- src/tool/mapcache.c | 20 +++++++++----------- 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); -- cgit v1.2.3-70-g09d2