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://svn.code.sf.net/p/rathena/svn/trunk@11982 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ultramage 2007-12-26 21:51:58 +00:00
parent 7906017662
commit a91d8177c6
3 changed files with 38 additions and 32 deletions

View File

@ -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

View File

@ -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));
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;
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)
// <20><EFBFBD>ê”»è
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++;
}
}
aFree(gat);

View File

@ -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);