diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/grfio.c | 6 | ||||
-rw-r--r-- | src/map/atcommand.c | 14 | ||||
-rw-r--r-- | src/map/map.c | 403 | ||||
-rw-r--r-- | src/map/map.h | 40 | ||||
-rw-r--r-- | src/map/mob.c | 33 | ||||
-rw-r--r-- | src/map/npc.c | 20 | ||||
-rw-r--r-- | src/map/path.c | 16 | ||||
-rw-r--r-- | src/map/pc.c | 27 | ||||
-rw-r--r-- | src/map/pet.c | 7 | ||||
-rw-r--r-- | src/map/skill.c | 26 |
10 files changed, 449 insertions, 143 deletions
diff --git a/src/common/grfio.c b/src/common/grfio.c index c8c021b8d..f9d99bd70 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -586,7 +586,7 @@ errret: if (buf!=NULL) free(buf); if (buf2!=NULL) free(buf2); if (in!=NULL) fclose(in); - exit(1); //return NULL; + return NULL; } /*========================================== @@ -964,9 +964,9 @@ void grfio_init(char *fname) if (strcmp(data_dir, "") == 0) // Id data_dir doesn't exist result4 = 1; // Data directory - +/* if (result != 0 && result2 != 0 && result3 != 0 && result4 != 0) { printf("not grf file readed exit!!\n"); exit(1); // It ends, if a resource cannot read one. - } + }*/ } diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 4e40ea2ce..95744e653 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -953,9 +953,7 @@ int atcommand_send( WBUFW(buf,0)=0x18f; case 4: WBUFW(buf,0)=0x190; - } - - + } } return 0; } @@ -3604,11 +3602,11 @@ int atcommand_gat( for (y = 2; y >= -2; y--) { sprintf(output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X", map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y, - map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y)); + map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y,CELL_CHKTYPE), + map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y,CELL_CHKTYPE), + map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y,CELL_CHKTYPE), + map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y,CELL_CHKTYPE), + map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y,CELL_CHKTYPE)); clif_displaymessage(fd, output); } diff --git a/src/map/map.c b/src/map/map.c index 55718a37d..46705dc8d 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -150,6 +150,25 @@ struct charid2nick { int req_id; }; +//各マップごとの最小限情報を入れるもの、READ_FROM_BITMAP用 +/*typedef struct{ + char fn[32];//ファイル名 + int xs,ys; //幅と高さ + int sizeinint;//intでの大きさ、1intに32セルの情報が入てる + int celltype[MAX_CELL_TYPE];//マップごとにそのタイプのセルがあれば対応する数字が入る、なければ1 + //(タイプ1そのものは0と同じ配列gat_fileused[0]に + long pos[MAX_CELL_TYPE];//ビットマップファイルでの場所、読み出す時に使う +} CELL_INFO;*/ + +//#define READ_FROM_GAT 0 //gatファイルから +//#define READ_FROM_BITMAP 1 //ビットマップファイルから +int map_read_flag = READ_FROM_GAT;//上の判定フラグ,どっちを使うかはmap_athana.conf内のread_map_from_bitmapで指定 + //0ならばREAD_FROM_GAT,1ならばREAD_FROM_BITMAP +int map_getcell(int,int x,int y,CELL_CHK cellchk); +int map_getcellp(struct map_data* m,int x,int y,CELL_CHK cellchk); + +char map_bitmap_filename[256]="db/map.info";//ビットマップファイルのデフォルトパス + char motd_txt[256] = "conf/motd.txt"; char help_txt[256] = "conf/help.txt"; @@ -769,7 +788,7 @@ int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) { *------------------------------------------ */ int map_searchrandfreecell(int m,int x,int y,int range) { - int free_cell,i,j,c; + int free_cell,i,j; for(free_cell=0,i=-range;i<=range;i++){ if(i+y<0 || i+y>=map[m].ys) @@ -777,7 +796,7 @@ int map_searchrandfreecell(int m,int x,int y,int range) { for(j=-range;j<=range;j++){ if(j+x<0 || j+x>=map[m].xs) continue; - if((c=read_gat(m,j+x,i+y))==1 || c==5) + if(map_getcell(m,j+x,i+y,CELL_CHKNOPASS)) continue; free_cell++; } @@ -791,7 +810,7 @@ int map_searchrandfreecell(int m,int x,int y,int range) { for(j=-range;j<=range;j++){ if(j+x<0 || j+x>=map[m].xs) continue; - if((c=read_gat(m,j+x,i+y))==1 || c==5) + if(map_getcell(m,j+x,i+y,CELL_CHKNOPASS)) continue; if(free_cell==0){ x+=j; @@ -1340,23 +1359,77 @@ int map_calc_dir( struct block_list *src,int x,int y) { // gat系 /*========================================== - * (m,x,y)の?態を調べる + * (m,x,y)の状態を調べる *------------------------------------------ */ -int map_getcell(int m,int x,int y) { - if(x<0 || x>=map[m].xs-1 || y<0 || y>=map[m].ys-1) - return 1; - return map[m].gat[x+y*map[m].xs]; + +int map_getcell(int m,int x,int y,CELL_CHK cellchk) +{ + return (m < 0 || m > MAX_MAP_PER_SERVER) ? 0 : map_getcellp(&map[m],x,y,cellchk); +} + +int map_getcellp(struct map_data* m,int x,int y,CELL_CHK cellchk) +{ + int j; + nullpo_ret(m); + if(x<0 || x>=m->xs-1 || y<0 || y>=m->ys-1) + { + if(cellchk==CELL_CHKNOPASS) return 1; + return 0; + } + j=x+y*m->xs; + + switch(cellchk) + { + case CELL_CHKTOUCH: + if(m->gat[j]&0x80) return 1;return 0; + case CELL_CHKWATER: + if(m->gat[j]==3) return 1;return 0; + case CELL_CHKHIGH: + if(m->gat[j]==5) return 1;return 0; + case CELL_CHKPASS: + if(m->gat[j]!=1&&m->gat[j]!=5) return 1; return 0; + case CELL_CHKNOPASS: + if(m->gat[j]==1||m->gat[j]==5) return 1; return 0; + case CELL_CHKTYPE: + return m->gat[j]; + default: return 0; + } + return 0; } /*========================================== - * (m,x,y)の?態をtにする + * (m,x,y)の状態を設定する *------------------------------------------ */ -int map_setcell(int m,int x,int y,int t) { +int map_setcell(int m,int x,int y,CELL_SET cellset) +{ + int i,j; + if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys) - return t; - return map[m].gat[x+y*map[m].xs]=t; + return 0; + j=x+y*map[m].xs; + switch(cellset) + { + case CELL_SETTOUCH: + return map[m].gat[j]|=0x80; + break; + case CELL_SETWATER://3 + i=3;break; + case CELL_SETPASS://0 + i=0;break; + case CELL_SETNOPASS://gat_fileused[0](READ_FROM_BITMAP)か1(READ_FROM_GAT) + i=1;break; + case CELL_SETHIGH://5 + i=5;break; + case CELL_SETNOHIGH://5 + i=5;break; + default: + return 0; + } + map[m].gat[j]=i; + + return 1; } /*========================================== @@ -1440,6 +1513,178 @@ static void map_readwater(char *watertxt) { } fclose(fp); } +/*========================================== +* マップキャッシュに追加する +*===========================================*/ + +// マップキャッシュの最大値 +#define MAX_CAHCE_MAX 768 + +//各マップごとの最小限情報を入れるもの、READ_FROM_BITMAP用 +struct MAP_CACHE_INFO { + char fn[32];//ファイル名 + int xs,ys; //幅と高さ + int water_height; + int pos; // データが入れてある場所 + int compressed; // zilb通せるようにする為の予約 + int compressed_len; // zilb通せるようにする為の予約 +}; // 56 byte + +struct { + struct MAP_CACHE_HEAD { + int sizeof_header; + int sizeof_map; + // 上の2つ改変不可 + int nmaps; // マップの個数 + int filesize; + } head; + struct MAP_CACHE_INFO *map; + FILE *fp; + int dirty; +} map_cache; + +static int map_cache_open(char *fn); +static void map_cache_close(void); +static int map_cache_read(struct map_data *m); +static int map_cache_write(struct map_data *m); + +static int map_cache_open(char *fn) { + atexit(map_cache_close); + if(map_cache.fp) { + map_cache_close(); + } + map_cache.fp = fopen(fn,"r+b"); + if(map_cache.fp) { + fread(&map_cache.head,1,sizeof(struct MAP_CACHE_HEAD),map_cache.fp); + fseek(map_cache.fp,0,SEEK_END); + if( + map_cache.head.sizeof_header == sizeof(struct MAP_CACHE_HEAD) && + map_cache.head.sizeof_map == sizeof(struct MAP_CACHE_INFO) && + map_cache.head.filesize == ftell(map_cache.fp) + ) { + // キャッシュ読み込み成功 + map_cache.map = aMalloc(sizeof(struct MAP_CACHE_INFO) * map_cache.head.nmaps); + fseek(map_cache.fp,sizeof(struct MAP_CACHE_HEAD),SEEK_SET); + fread(map_cache.map,sizeof(struct MAP_CACHE_INFO),map_cache.head.nmaps,map_cache.fp); + return 1; + } + fclose(map_cache.fp); + } else { + map_read_flag = CREATE_BITMAP; + } + // 読み込みに失敗したので新規に作成する + map_cache.fp = fopen(fn,"wb"); + if(map_cache.fp) { + memset(&map_cache.head,0,sizeof(struct MAP_CACHE_HEAD)); + map_cache.map = aCalloc(sizeof(struct MAP_CACHE_INFO),MAX_CAHCE_MAX); + map_cache.head.nmaps = MAX_CAHCE_MAX; + map_cache.head.sizeof_header = sizeof(struct MAP_CACHE_HEAD); + map_cache.head.sizeof_map = sizeof(struct MAP_CACHE_INFO); + + map_cache.head.filesize = sizeof(struct MAP_CACHE_HEAD); + map_cache.head.filesize += sizeof(struct MAP_CACHE_INFO) * map_cache.head.nmaps; + + map_cache.dirty = 1; + return 1; + } + return 0; +} + +static void map_cache_close(void) { + if(!map_cache.fp) { return; } + if(map_cache.dirty) { + fseek(map_cache.fp,0,SEEK_SET); + fwrite(&map_cache.head,1,sizeof(struct MAP_CACHE_HEAD),map_cache.fp); + fwrite(map_cache.map,map_cache.head.nmaps,sizeof(struct MAP_CACHE_INFO),map_cache.fp); + } + fclose(map_cache.fp); + free(map_cache.map); + map_cache.fp = NULL; + return; +} + +int map_cache_read(struct map_data *m) { + int i; + if(!map_cache.fp) { return 0; } + for(i = 0;i < map_cache.head.nmaps ; i++) { + if(!strcmp(m->name,map_cache.map[i].fn)) { + if(map_cache.map[i].water_height != map_waterheight(m->name)) { + // 水場の高さが違うので読み直し + return 0; + } else if(map_cache.map[i].compressed) { + // 圧縮ファイルは未対応 + return 0; + } else { + int size = map_cache.map[i].xs * map_cache.map[i].ys; + m->xs = map_cache.map[i].xs; + m->ys = map_cache.map[i].ys; + m->gat = (unsigned char *)aCalloc(m->xs * m->ys,sizeof(unsigned char)); + fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET); + if(fread(m->gat,1,size,map_cache.fp) == size) { + // 成功 + return 1; + } else { + // なぜかファイル後半が欠けてるので読み直し + m->xs = 0; + m->ys = 0; + free(m->gat); + m->gat = NULL; + return 0; + } + } + } + } + return 0; +} + +static int map_cache_write(struct map_data *m) { + int i; + if(!map_cache.fp) { return 0; } + for(i = 0;i < map_cache.head.nmaps ; i++) { + if(!strcmp(m->name,map_cache.map[i].fn)) { + // 同じエントリーがあれば上書き + if( + map_cache.map[i].xs == m->xs && map_cache.map[i].ys == m->ys && + !map_cache.map[i].compressed + ) { + // 幅と高さ同じで圧縮してないなら場所は変わらない + fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET); + fwrite(m->gat,m->xs,m->ys,map_cache.fp); + } else { + // 幅と高さが違うなら新しい場所に登録 + int size = m->xs * m->ys; + fseek(map_cache.fp,map_cache.head.filesize,SEEK_SET); + fwrite(m->gat,1,size,map_cache.fp); + map_cache.map[i].pos = map_cache.head.filesize; + map_cache.map[i].xs = m->xs; + map_cache.map[i].ys = m->ys; + map_cache.head.filesize += size; + } + map_cache.map[i].water_height = map_waterheight(m->name); + map_cache.dirty = 1; + return 0; + } + } + // 同じエントリが無ければ書き込める場所を探す + for(i = 0;i < map_cache.head.nmaps ; i++) { + if(map_cache.map[i].fn[0] == 0) { + // 新しい場所に登録 + int size = m->xs * m->ys; + strncpy(map_cache.map[i].fn,m->name,sizeof(map_cache.map[0].fn)); + fseek(map_cache.fp,map_cache.head.filesize,SEEK_SET); + fwrite(m->gat,1,size,map_cache.fp); + map_cache.map[i].pos = map_cache.head.filesize; + map_cache.map[i].xs = m->xs; + map_cache.map[i].ys = m->ys; + map_cache.map[i].water_height = map_waterheight(m->name); + map_cache.head.filesize += size; + map_cache.dirty = 1; + return 0; + } + } + // 書き込めなかった + return 1; +} #ifdef USE_AFM static int map_readafm(int m,char *fn) { @@ -1587,28 +1832,20 @@ static int map_readafm(int m,char *fn) { #endif /*========================================== - * マップ1枚?み?み - *------------------------------------------ - */ -static int map_readmap(int m,char *fn, char *alias) { + * マップ1枚読み込み + * ===================================================*/ +static int map_readmap(int m,char *fn, char *alias, int *map_cache) { unsigned char *gat=""; - int s; - int x,y,xs,ys; - struct gat_1cell {float high[4]; int type;} *p=NULL; - int wh; + size_t size; + int i; int e = 0; - - size_t size; char progress[21] = " "; - // read & convert fn - gat=grfio_read(fn); - if(gat==NULL) - return -1; + //printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn); if (map_num) { //avoid map-server crashing if there are 0 maps - printf("\r"); - ShowStatus("Progress: "); + printf("\r"); + ShowStatus("Progress: "); i=m*20/420; printf("["); for (e=0;e<i;e++) progress[e] = '#'; @@ -1616,32 +1853,52 @@ static int map_readmap(int m,char *fn, char *alias) { printf("] Working: ["); fflush(stdout); } + + if(map_cache_read(&map[m])) { + // キャッシュから読み込めた + (*map_cache)++; + } else { + int s; + int wh; + int x,y,xs,ys; + struct gat_1cell {float high[4]; int type;} *p=NULL; + // read & convert fn + gat=grfio_read(fn); + if(gat==NULL) { + return -1; + // さすがにマップが読めないのはまずいので終了する + //printf("Can't load map %s\n",fn); + //exit(1); + } + + xs=map[m].xs=*(int*)(gat+6); + ys=map[m].ys=*(int*)(gat+10); + map[m].gat = (unsigned char *)aCalloc(s = map[m].xs * map[m].ys,sizeof(unsigned char)); + 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++; + } + } + map_cache_write(&map[m]); + free(gat); + } + map[m].m=m; - xs=map[m].xs=*(int*)(gat+6); - ys=map[m].ys=*(int*)(gat+10); - map[m].gat = (unsigned char *)aCalloc(s = map[m].xs * map[m].ys,sizeof(unsigned char)); map[m].npc_num=0; map[m].users=0; memset(&map[m].flag,0,sizeof(map[m].flag)); if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris] - 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].bxs=(map[m].xs+BLOCK_SIZE-1)/BLOCK_SIZE; + map[m].bys=(map[m].ys+BLOCK_SIZE-1)/BLOCK_SIZE; size = map[m].bxs * map[m].bys * sizeof(struct block_list*); map[m].block = (struct block_list **)aCalloc(1,size); map[m].block_mob = (struct block_list **)aCalloc(1,size); @@ -1671,18 +1928,31 @@ int map_readallmap(void) { #ifdef USE_AFM FILE *afm_file; #endif + int map_cache = 0; + + // マップキャッシュを開く + if(map_read_flag == READ_FROM_BITMAP) { + map_cache_open(map_bitmap_filename); + } - ShowStatus("Loading Maps...\n"); + sprintf(tmp_output, "Loading Maps%s...\n", + (map_read_flag == CREATE_BITMAP ? " (Generating Map Cache)" : + map_read_flag == READ_FROM_BITMAP ? " (w/ Map Cache)" : + map_read_flag == READ_FROM_AFM ? " (w/ AFM)" : "")); + ShowStatus(tmp_output); // 先に全部のャbプの存在を確認 for(i=0;i<map_num;i++){ + #ifdef USE_AFM char afm_name[256] = ""; char *p; - strncpy(afm_name, map[i].name, strlen(map[i].name) - 4); - strcat(afm_name, ".afm"); + if(!strstr(map[i].name,".afm")) { + // check if it's necessary to replace the extension - speeds up loading abit + strncpy(afm_name, map[i].name, strlen(map[i].name) - 4); + strcat(afm_name, ".afm"); + } map[i].alias = NULL; - sprintf(fn,"%s\\%s",afm_dir,afm_name); for(p=&fn[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix @@ -1705,7 +1975,7 @@ int map_readallmap(void) { map[i].alias = NULL; sprintf(fn,"data\\%s",map[i].name); - if(map_readmap(i,fn, p) == -1) { + if(map_readmap(i,fn, p, &map_cache) == -1) { map_delmap(map[i].name); maps_removed++; i--; @@ -1729,6 +1999,12 @@ int map_readallmap(void) { printf("\r"); snprintf(tmp_output,sizeof(tmp_output),"Successfully loaded '"CL_WHITE"%d"CL_RESET"' maps.%30s\n",map_num,""); ShowInfo(tmp_output); + + map_cache_close(); + if(map_read_flag == CREATE_BITMAP) { + map_read_flag = READ_FROM_BITMAP; + } + if (maps_removed) { snprintf(tmp_output,sizeof(tmp_output),"Maps Removed: '"CL_WHITE"%d"CL_RESET"'\n",maps_removed); ShowNotice(tmp_output); @@ -1937,6 +2213,11 @@ int map_config_read(char *cfgName) { strcpy(help_txt, w2); } else if (strcmpi(w1, "mapreg_txt") == 0) { strcpy(mapreg_txt, w2); + }else if(strcmpi(w1,"read_map_from_bitmap")==0){ + if (atoi(w2) == 1) + map_read_flag = READ_FROM_BITMAP; + else + map_read_flag = READ_FROM_GAT; } else if (strcmpi(w1, "import") == 0) { map_config_read(w2); } else if (strcmpi(w1, "console") == 0) { @@ -2125,6 +2406,13 @@ int sql_config_read(char *cfgName) strcpy(log_db_pw, w2); } else if(strcmpi(w1,"log_db_port")==0) { log_db_port = atoi(w2); + }else if(strcmpi(w1,"read_map_from_bitmap")==0){ + if (atoi(w2) == 1) + map_read_flag = READ_FROM_BITMAP; + else + map_read_flag = READ_FROM_GAT; + }else if(strcmpi(w1,"map_bitmap_path")==0){ + strncpy(map_bitmap_filename,w2,255); //support the import command, just like any other config } else if(strcmpi(w1,"import")==0){ sql_config_read(w2); @@ -2250,7 +2538,10 @@ void do_final(void) { numdb_final(charid_db, charid_db_final); for(i=0;i<=map_num;i++){ - if(map[i].gat) free(map[i].gat); + if(map[i].gat) { + free(map[i].gat); + map[i].gat=NULL; + } if(map[i].block) free(map[i].block); if(map[i].block_mob) free(map[i].block_mob); if(map[i].block_count) free(map[i].block_count); @@ -2350,8 +2641,10 @@ int do_init(int argc, char *argv[]) { else if (strcmp(argv[i],"--sql_config") == 0 || strcmp(argv[i],"--sql-config") == 0) SQL_CONF_NAME = argv[i+1]; else if (strcmp(argv[i],"--log_config") == 0 || strcmp(argv[i],"--log-config") == 0) - LOG_CONF_NAME = argv[i+1]; + LOG_CONF_NAME = argv[i+1]; #endif /* not TXT_ONLY */ + else if (strcmp(argv[i],"--run_once") == 0) // close the map-server as soon as its done.. for testing [Celest] + runflag = 0; } map_config_read(MAP_CONF_NAME); diff --git a/src/map/map.h b/src/map/map.h index 9d8a0b194..2b976fe6c 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -500,10 +500,15 @@ enum { EQP_HELM = 0x0100, // 頭上段 }; +#define MAX_CELL_TYPE 7 //今ではセルのタイプは数字的に6が最大なので7にした、 + //MAX_CELL_TYPE+1はワープポイントなどのタッチ系に + struct map_data { char name[24]; unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う - char *alias; // [MouseJstr] + char *alias; // [MouseJstr] + int *gat_fileused[MAX_CELL_TYPE+1+1]; //もしビットマップを使うならこちらを使う、 + //上のgatはキャストされてgat_fileused[0]に指す struct block_list **block; struct block_list **block_mob; int *block_count,*block_mob_count; @@ -557,8 +562,8 @@ struct map_data_other_server { unsigned long ip; unsigned int port; }; -#define read_gat(m,x,y) (map[m].gat[(x)+(y)*map[m].xs]) -#define read_gatp(m,x,y) (m->gat[(x)+(y)*m->xs]) +#define read_gat(m,x,y) (map_getcell(m,x,y,CELL_CHKTYPE)) //ビットマップ使う場合結構CPUに負担かかるので、消極的に使おう +#define read_gatp(m,x,y) (map_getcellp(m,x,y,CELL_CHKTYPE)) //同上 struct flooritem_data { struct block_list bl; @@ -617,6 +622,25 @@ enum { LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES }; +/*-------CELL_CHK*---------------- + * CELL_CHKPASS: セルは0,3,6のどっちかの場合は1を返す、以外は0 + * CELL_CHKNOPASS: セルは1、5のどっちかの場合は1を返す、以外は0 + * CELL_CHKWATER: セルは3の場合は1を返す、以外は0 + * CELL_CHKHIGH: セルは5の場合は1を返す、以外は0 + * CHELL_CHKTOUCH:セルはタッチ系の場合は1を返す、以外は0 + * CELL_CHKTYPE: セルのタイプを知りたい場合は1を返す、以外は0 +*/ +typedef enum { + CELL_CHKPASS,CELL_CHKNOPASS,CELL_CHKWATER=3,CELL_CHKHIGH=5,CELL_CHKTOUCH,CELL_CHKTYPE +} CELL_CHK; + +/*-------CELL_SET*--------------- + * ほとんどは上と対応、設定用 + */ +typedef enum { + CELL_SETPASS,CELL_SETNOPASS,CELL_SETWATER=3,CELL_SETHIGH=5,CELL_SETNOHIGH,CELL_SETTOUCH +} CELL_SET; + struct chat_data { struct block_list bl; @@ -638,6 +662,13 @@ extern int autosave_interval; extern int agit_flag; extern int night_flag; // 0=day, 1=night [Yor] +//------bitmap使用とgrfファイル使用両方対応できるために追加、また、 +//セルの取得や設定は列挙型CELL_CHK*とCELL_SET*を使った方が意図がわかりやすいので変更してみた +int map_getcell(int,int,int,CELL_CHK); +int map_getcellp(struct map_data*,int,int,CELL_CHK); +extern int map_read_flag; //セル情報のソース判定フラグ、0ならgrfファイル、1ならビットマップファイル +enum { READ_FROM_GAT, READ_FROM_AFM, READ_FROM_BITMAP, CREATE_BITMAP }; + extern char motd_txt[]; extern char help_txt[]; @@ -698,8 +729,7 @@ struct map_session_data * map_nick2sd(char*); int compare_item(struct item *a, struct item *b); // gat関連 -int map_getcell(int,int,int); -int map_setcell(int,int,int,int); +int map_setcell(int,int,int,CELL_SET); // その他 int map_check_dir(int s_dir,int t_dir); diff --git a/src/map/mob.c b/src/map/mob.c index 40bf4d1b0..7fa39b7ca 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -216,7 +216,7 @@ int mob_once_spawn_area(struct map_session_data *sd,char *mapname, int x0,int y0,int x1,int y1, const char *mobname,int class,int amount,const char *event) { - int x,y,i,c,max,lx=-1,ly=-1,id=0; + int x,y,i,max,lx=-1,ly=-1,id=0; int m; if(strcmp(mapname,"this")==0) @@ -235,7 +235,7 @@ int mob_once_spawn_area(struct map_session_data *sd,char *mapname, do{ x=rand()%(x1-x0+1)+x0; y=rand()%(y1-y0+1)+y0; - }while( ( (c=map_getcell(m,x,y))==1 || c==5)&& (++j)<max ); + } while (map_getcell(m,x,y,CELL_CHKNOPASS) && (++j)<max); if(j>=max){ if(lx>=0){ // 検索に失敗したので以前に沸いた場所を使う x=lx; @@ -243,6 +243,7 @@ int mob_once_spawn_area(struct map_session_data *sd,char *mapname, }else return 0; // 最初に沸く場所の検索を失敗したのでやめる } + if(x==0||y==0) printf("xory=0, x=%d,y=%d,x0=%d,y0=%d\n",x,y,x0,y0); id=mob_once_spawn(sd,mapname,x,y,mobname,class,1,event); lx=x; ly=y; @@ -461,7 +462,7 @@ static int mob_walktoxy_sub(struct mob_data *md); static int mob_walk(struct mob_data *md,unsigned int tick,int data) { int moveblock; - int i,ctype; + int i; static int dirx[8]={0,-1,-1,-1,0,1,1,1}; static int diry[8]={1,1,0,-1,-1,-1,0,1}; int x,y,dx,dy; @@ -486,8 +487,7 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data) x = md->bl.x; y = md->bl.y; - ctype = map_getcell(md->bl.m,x,y); - if(ctype == 1 || ctype == 5) { + if(map_getcell(md->bl.m,x,y,CELL_CHKNOPASS)) { mob_stop_walking(md,1); return 0; } @@ -495,8 +495,7 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data) dx = dirx[md->dir]; dy = diry[md->dir]; - ctype = map_getcell(md->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { + if(map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) { mob_walktoxy_sub(md); return 0; } @@ -925,7 +924,7 @@ int mob_spawn(int id) y=md->y0+rand()%(md->ys+1)-md->ys/2; } i++; - } while(((c=map_getcell(md->bl.m,x,y))==1 || c==5) && i<50); + } while(map_getcell(md->bl.m,x,y,CELL_CHKNOPASS) && i<50); if(i>=50){ // if(battle_config.error_log==1) @@ -1517,7 +1516,7 @@ static int mob_randomwalk(struct mob_data *md,int tick) x+=md->bl.x; y+=md->bl.y; - if((c=map_getcell(md->bl.m,x,y))!=1 && c!=5 && mob_walktoxy(md,x,y,1)==0){ + if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && mob_walktoxy(md,x,y,1)==0){ md->move_fail_count=0; break; } @@ -2782,7 +2781,7 @@ int mob_warpslave(struct mob_data *md,int x, int y) */ int mob_warp(struct mob_data *md,int m,int x,int y,int type) { - int i=0,c,xs=0,ys=0,bx=x,by=y; + int i=0,xs=0,ys=0,bx=x,by=y; nullpo_retr(0, md); @@ -2803,7 +2802,7 @@ int mob_warp(struct mob_data *md,int m,int x,int y,int type) xs=ys=9; } - while( ( x<0 || y<0 || ((c=read_gat(m,x,y))==1 || c==5) ) && (i++)<1000 ){ + while( ( x<0 || y<0 || map_getcell(m,x,y,CELL_CHKNOPASS)) && (i++)<1000 ){ if( xs>0 && ys>0 && i<250 ){ // 指定位置付近の探索 x=bx+rand()%xs-xs/2; y=by+rand()%ys-ys/2; @@ -2906,14 +2905,14 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag) class = value[k]; if(class<=1000 || class>MAX_MOB_DB) continue; for(;amount>0;amount--){ - int x=0,y=0,c=0,i=0; + int x=0,y=0,i=0; md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); if(mob_db[class].mode&0x02) md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); else md->lootitem=NULL; - while((x<=0 || y<=0 || (c=map_getcell(m,x,y))==1 || c==5 ) && (i++)<100){ + while((x<=0 || y<=0 || map_getcell(m,x,y,CELL_CHKNOPASS)) && (i++)<100){ x=rand()%9-4+bx; y=rand()%9-4+by; } @@ -3611,24 +3610,24 @@ int mobskill_use(struct mob_data *md,unsigned int tick,int event) continue; // 自分の周囲 if( ms[i].target>=MST_AROUND1 ){ - int bx=x, by=y, i=0, c, m=bl->m, r=ms[i].target-MST_AROUND1; + int bx=x, by=y, i=0, m=bl->m, r=ms[i].target-MST_AROUND1; do{ bx=x + rand()%(r*2+3) - r; by=y + rand()%(r*2+3) - r; }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys || - ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000); + map_getcell(m,bx,by,CELL_CHKNOPASS)) && (i++)<1000); if(i<1000){ x=bx; y=by; } } // 相手の周囲 if( ms[i].target>=MST_AROUND5 ){ - int bx=x, by=y, i=0, c, m=bl->m, r=(ms[i].target-MST_AROUND5)+1; + int bx=x, by=y, i=0,m=bl->m, r=(ms[i].target-MST_AROUND5)+1; do{ bx=x + rand()%(r*2+1) - r; by=y + rand()%(r*2+1) - r; }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys || - ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000); + map_getcell(m,bx,by,CELL_CHKNOPASS)) && (i++)<1000); if(i<1000){ x=bx; y=by; } diff --git a/src/map/npc.c b/src/map/npc.c index 728e76a9c..9068909ea 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1126,7 +1126,7 @@ static int calc_next_walk_step(struct npc_data *nd) static int npc_walk(struct npc_data *nd,unsigned int tick,int data) { int moveblock; - int i,ctype; + int i; static int dirx[8]={0,-1,-1,-1,0,1,1,1}; static int diry[8]={1,1,0,-1,-1,-1,0,1}; int x,y,dx,dy; @@ -1151,8 +1151,7 @@ static int npc_walk(struct npc_data *nd,unsigned int tick,int data) x = nd->bl.x; y = nd->bl.y; - ctype = map_getcell(nd->bl.m,x,y); - if(ctype == 1 || ctype == 5) { + if(map_getcell(nd->bl.m,x,y,CELL_CHKNOPASS)) { npc_stop_walking(nd,1); return 0; } @@ -1160,8 +1159,7 @@ static int npc_walk(struct npc_data *nd,unsigned int tick,int data) dx = dirx[nd->dir]; dy = diry[nd->dir]; - ctype = map_getcell(nd->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { + if(map_getcell(nd->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) { npc_walktoxy_sub(nd); return 0; } @@ -1468,11 +1466,9 @@ int npc_parse_warp(char *w1,char *w2,char *w3,char *w4) for(i=0;i<ys;i++) { for(j=0;j<xs;j++) { - int t; - t=map_getcell(m,x-xs/2+j,y-ys/2+i); - if (t==1 || t==5) + if(map_getcell(m,x-xs/2+j,y-ys/2+i,CELL_CHKNOPASS)) continue; - map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80); + map_setcell(m,x-xs/2+j,y-ys/2+i,CELL_SETTOUCH); } } @@ -1698,11 +1694,9 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line for(i=0;i<ys;i++) { for(j=0;j<xs;j++) { - int t; - t=map_getcell(m,x-xs/2+j,y-ys/2+i); - if (t==1 || t==5) + if(map_getcell(m,x-xs/2+j,y-ys/2+i,CELL_CHKNOPASS)) continue; - map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80); + map_setcell(m,x-xs/2+j,y-ys/2+i,CELL_SETTOUCH); } } } diff --git a/src/map/path.c b/src/map/path.c index b2e0a78a8..9fb0ab1b7 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -168,17 +168,13 @@ static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,i */ static int can_place(struct map_data *m,int x,int y,int flag) { - int c; - nullpo_retr(0, m); - c=read_gatp(m,x,y); - - if(c==1) - return 0; - if(!(flag&0x10000) && c==5) - return 0; - return 1; + if(map_getcellp(m,x,y,CELL_CHKPASS)) + return 1; + else if((flag&0x10000)&&map_getcellp(m,x,y,CELL_CHKHIGH)) + return 1; + return 0; } /*========================================== @@ -262,7 +258,7 @@ int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int if(!map[m].gat) return -1; md=&map[m]; - if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || (i=read_gatp(md,x1,y1))==1 || i==5) + if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || map_getcellp(md,x1,y1,CELL_CHKNOPASS)) return -1; // easy diff --git a/src/map/pc.c b/src/map/pc.c index 376efb313..d314d2e30 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3822,7 +3822,7 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *bl) int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype) { char mapname[24]; - int m=0,c=0,disguise=0; + int m=0,disguise=0; nullpo_retr(0, sd); @@ -3935,7 +3935,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt if(x <0 || x >= map[m].xs || y <0 || y >= map[m].ys) x=y=0; - if((x==0 && y==0) || (c=read_gat(m,x,y))==1 || c==5){ + if((x==0 && y==0) || map_getcell(m,x,y,CELL_CHKNOPASS)){ if(x||y) { if(battle_config.error_log) printf("stacked (%d,%d)\n",x,y); @@ -3943,7 +3943,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt do { x=rand()%(map[m].xs-2)+1; y=rand()%(map[m].ys-2)+1; - } while((c=read_gat(m,x,y))==1 || c==5); + } while(map_getcell(m,x,y,CELL_CHKNOPASS)); } if(sd->mapname[0] && sd->bl.prev != NULL){ @@ -4011,7 +4011,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt *------------------------------------------ */ int pc_randomwarp(struct map_session_data *sd, int type) { - int x,y,c,i=0; + int x,y,i=0; int m; nullpo_retr(0, sd); @@ -4024,7 +4024,7 @@ int pc_randomwarp(struct map_session_data *sd, int type) { do{ x=rand()%(map[m].xs-2)+1; y=rand()%(map[m].ys-2)+1; - } while (((c=read_gat(m,x,y)) == 1 || c == 5) && (i++) < 1000); + }while(map_getcell(m,x,y,CELL_CHKNOPASS) && (i++)<1000 ); if (i < 1000) pc_setpos(sd,map[m].name,x,y,type); @@ -4129,7 +4129,7 @@ static int calc_next_walk_step(struct map_session_data *sd) static int pc_walk(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd; - int i,ctype; + int i; int moveblock; int x,y,dx,dy; @@ -4162,16 +4162,14 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) x = sd->bl.x; y = sd->bl.y; - ctype = map_getcell(sd->bl.m,x,y); - if(ctype == 1 || ctype == 5) { + if(map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS)) { pc_stop_walking(sd,1); return 0; } sd->dir=sd->head_dir=sd->walkpath.path[sd->walkpath.path_pos]; dx = dirx[(int)sd->dir]; dy = diry[(int)sd->dir]; - ctype = map_getcell(sd->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { + if(map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS)) { pc_walktoxy_sub(sd); return 0; } @@ -4252,7 +4250,7 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) skill_unit_move(&sd->bl,tick,1); // スキルユニットの?査 - if(map_getcell(sd->bl.m,x,y)&0x80) + if(map_getcell(sd->bl.m,x,y,CELL_CHKTOUCH)) npc_touch_areanpc(sd,sd->bl.m,x,y); else sd->areanpc_id=0; @@ -4378,15 +4376,14 @@ int pc_randomwalk(struct map_session_data *sd,int tick) nullpo_retr(0, sd); if(DIFF_TICK(sd->next_walktime,tick)<0){ - int i,x,y,c,d; + int i,x,y,d; d = rand()%7+5; for(i=0;i<retrycount;i++){ // Search of a movable place int r=rand(); x=sd->bl.x+r%(d*2+1)-d; y=sd->bl.y+r/(d*2+1)%(d*2+1)-d; - if((c=map_getcell(sd->bl.m,x,y))!=1 && c!=5 && pc_walktoxy(sd,x,y)==0){ + if((map_getcell(sd->bl.m,x,y,CELL_CHKPASS)) && pc_walktoxy(sd,x,y)==0) break; - } } // Working on this part later [celest] /*for(i=c=0;i<sd->walkpath.path_len;i++){ // The next walk start time is calculated. @@ -4450,7 +4447,7 @@ int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) skill_unit_move(&sd->bl,gettick(),dist+7); // スキルユニットの?査 - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)&0x80) + if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKTOUCH)) npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y); else sd->areanpc_id=0; diff --git a/src/map/pet.c b/src/map/pet.c index c07fbc179..be077b84e 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -203,7 +203,7 @@ static int pet_attack(struct pet_data *pd,unsigned int tick,int data) static int pet_walk(struct pet_data *pd,unsigned int tick,int data) { int moveblock; - int i,ctype; + int i; int x,y,dx,dy; nullpo_retr(0, pd); @@ -235,8 +235,7 @@ static int pet_walk(struct pet_data *pd,unsigned int tick,int data) dx = dirx[pd->dir]; dy = diry[pd->dir]; - ctype = map_getcell(pd->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { + if(map_getcell(pd->bl.m,x+dx,y+dy,CELL_CHKNOPASS)){ pet_walktoxy_sub(pd); return 0; } @@ -1058,7 +1057,7 @@ static int pet_randomwalk(struct pet_data *pd,int tick) int r=rand(); x=pd->bl.x+r%(d*2+1)-d; y=pd->bl.y+r/(d*2+1)%(d*2+1)-d; - if((c=map_getcell(pd->bl.m,x,y))!=1 && c!=5 && pet_walktoxy(pd,x,y)==0){ + if((map_getcell(pd->bl.m,x,y,CELL_CHKPASS))&&( pet_walktoxy(pd,x,y)==0)){ pd->move_fail_count=0; break; } diff --git a/src/map/skill.c b/src/map/skill.c index 3ede9313d..794059e82 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2069,13 +2069,13 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data ) break; case RG_INTIMIDATE: if(sd && !map[src->m].flag.noteleport) { - int x,y,i,j,c; + int x,y,i,j; pc_randomwarp(sd,3); for(i=0;i<16;i++) { j = rand()%8; x = sd->bl.x + dirx[j]; y = sd->bl.y + diry[j]; - if((c=map_getcell(sd->bl.m,x,y)) != 1 && c != 5) + if(map_getcell(sd->bl.m,x,y,CELL_CHKPASS)) break; } if(i >= 16) { @@ -2090,13 +2090,13 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data ) } } else if(md && !map[src->m].flag.monster_noteleport) { - int x,y,i,j,c; + int x,y,i,j; mob_warp(md,-1,-1,-1,3); for(i=0;i<16;i++) { j = rand()%8; x = md->bl.x + dirx[j]; y = md->bl.y + diry[j]; - if((c=map_getcell(md->bl.m,x,y)) != 1 && c != 5) + if(map_getcell(md->bl.m,x,y,CELL_CHKPASS)) break; } if(i >= 16) { @@ -5002,7 +5002,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil { int flag=0; for(i=0;i<2+(skilllv>>1);i++) { - int j=0, c; + int j=0; do { tmpx = x + (rand()%7 - 3); tmpy = y + (rand()%7 - 3); @@ -5015,7 +5015,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil else if(tmpy >= map[src->m].ys) tmpy = map[src->m].ys - 1; j++; - } while(((c=map_getcell(src->m,tmpx,tmpy))==1 || c==5) && j<100); + } while((map_getcell(src->m,tmpx,tmpy,CELL_CHKNOPASS)) && j<100); if(j >= 100) continue; if(flag==0){ @@ -5810,11 +5810,11 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, map_foreachinarea(skill_landprotector,src->m,ux,uy,ux,uy,BL_SKILL,skillid,&alive); if(skillid==WZ_ICEWALL && alive){ - val2=map_getcell(src->m,ux,uy); + val2=map_getcell(src->m,ux,uy,CELL_CHKTYPE); if(val2==5 || val2==1) alive=0; else { - map_setcell(src->m,ux,uy,5); + map_setcell(src->m,ux,uy,CELL_SETNOPASS); clif_changemapcell(src->m,ux,uy,5,0); } } @@ -6558,6 +6558,8 @@ int skill_unit_onlimit(struct skill_unit *src,unsigned int tick) break; case 0x8d: /* アイスウォ?ル */ + if(map_read_flag == READ_FROM_BITMAP) + map_setcell(src->bl.m,src->bl.x,src->bl.y,CELL_SETPASS); map_setcell(src->bl.m,src->bl.x,src->bl.y,src->val2); clif_changemapcell(src->bl.m,src->bl.x,src->bl.y,src->val2,1); break; @@ -7290,7 +7292,7 @@ int skill_check_condition(struct map_session_data *sd,int type) } break; case ST_WATER: - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y) != 3 && (sd->sc_data[SC_DELUGE].timer==-1)){ //水場判定 + if((!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKWATER))&& (sd->sc_data[SC_DELUGE].timer==-1)){ //水場判定 clif_skill_fail(sd,skill,0,0); return 0; } @@ -10422,8 +10424,7 @@ int skill_check_cloaking(struct block_list *bl) else if(bl->type == BL_MOB && !battle_config.monster_cloak_check_type) return 0; for(i=0;i<sizeof(dx)/sizeof(dx[0]);i++){ - int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]); - if(c==1 || c==5) { + if(map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i],CELL_CHKNOPASS)) { end=0; break; } @@ -10460,8 +10461,7 @@ int skill_type_cloaking(struct block_list *bl) return 0; for(i=0; i<sizeof(dx)/sizeof(dx[0]); i++) { - int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]); - if(c==1 || c==5) + if(map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i],CELL_CHKNOPASS)) return 0; } return 1; |