// Reads a map from GRF's GAT and RSW files int read_map(char *name, struct map_data *m) { char filename[256]; unsigned char *gat, *rsw; int water_height; size_t xy, off, num_cells; float height; uint32 type; // Open map GAT sprintf(filename,"data\\%s.gat", name); gat = (unsigned char *)grfio_read(filename); if (gat == NULL) return 0; // Open map RSW sprintf(filename,"data\\%s.rsw", name); rsw = (unsigned char *)grfio_read(filename); // Read water height if (rsw) { water_height = (int)GetFloat(rsw+166); aFree(rsw); } else water_height = NO_WATER; // Read map size and allocate needed memory m->xs = (int16)GetULong(gat+6); m->ys = (int16)GetULong(gat+10); if (m->xs <= 0 || m->ys <= 0) { aFree(gat); return 0; } num_cells = (size_t)m->xs*(size_t)m->ys; m->cells = (unsigned char *)aMalloc(num_cells); // Set cell properties off = 14; for (xy = 0; xy < num_cells; xy++) { // Height of the bottom-left corner height = GetFloat( gat + off ); // Type of cell type = GetULong( 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->cells[xy] = (unsigned char)type; } aFree(gat); return 1; }
/*========================================== * *------------------------------------------ */ static int itemdb_read_itemslottable(void) { char *buf,*p; int s; buf = (char *)grfio_read("data\\itemslottable.txt"); if(buf == NULL) return -1; s = grfio_size("data\\itemslottable.txt"); buf[s] = 0; for(p=buf; p-buf<s; ) { int nameid,equip; sscanf(p,"%d#%d#",&nameid,&equip); itemdb_search(nameid)->equip = equip; p=strchr(p,'\n'); if(!p) break; p++; p=strchr(p,'\n'); if(!p) break; p++; } aFree(buf); return 0; }
/*========================================== * マップ1枚読み込み *------------------------------------------ */ static int map_readmap(int m,char *fn) { unsigned char *gat; int s; int x,y,xs,ys; struct gat_1cell {float high[4]; int type;} *p; int wh; // read & convert fn gat=grfio_read(fn); if(gat==NULL) return -1; map[m].m=m; xs=map[m].xs=*(int*)(gat+6); ys=map[m].ys=*(int*)(gat+10); map[m].gat=malloc(s=map[m].xs*map[m].ys); if(map[m].gat==NULL){ printf("out of memory : map_readmap gat\n"); exit(1); } map[m].npc_num=0; map[m].users=0; memset(&map[m].flag,0,sizeof(map[m].flag)); wh=map_waterheight(map[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){ // 水場判定 map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0; } else { map[m].gat[x+y*xs]=p->type; } p++; } } free(gat); map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE; map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE; map[m].block=malloc(map[m].bxs*map[m].bys*sizeof(struct block_list*)); if(map[m].block==NULL){ printf("out of memory : map_readmap block\n"); exit(1); } memset(map[m].block,0,map[m].bxs*map[m].bys*sizeof(struct block_list*)); map[m].block_mob=malloc(map[m].bxs*map[m].bys*sizeof(struct block_list*)); if(map[m].block_mob==NULL){ printf("out of memory : map_readmap block_mob\n"); exit(1); } memset(map[m].block_mob,0,map[m].bxs*map[m].bys*sizeof(struct block_list*)); map[m].block_count=malloc(map[m].bxs*map[m].bys*sizeof(int)); if(map[m].block_count==NULL){ printf("out of memory : map_readmap block\n"); exit(1); } memset(map[m].block_count,0,map[m].bxs*map[m].bys*sizeof(int)); map[m].block_mob_count=malloc(map[m].bxs*map[m].bys*sizeof(int)); if(map[m].block_mob_count==NULL){ printf("out of memory : map_readmap block_mob\n"); exit(1); } memset(map[m].block_mob_count,0,map[m].bxs*map[m].bys*sizeof(int)); strdb_insert(map_db,map[m].name,&map[m]); printf("%s read done\n",fn); return 0; }