reverted back from 1081 npc.c

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@739 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ajarn 2004-12-22 20:50:54 +00:00
parent dcee19fe89
commit bfb196770e

View File

@ -1586,10 +1586,10 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
{ {
int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov
char mapname[24]; char mapname[24];
char *srcbuf=NULL,*script=NULL; unsigned char *srcbuf=NULL,*script;
int srcsize=65536; int srcsize=65536;
int startline=0; int startline=0;
char line[1024]; unsigned char line[1024];
int i; int i;
struct npc_data *nd; struct npc_data *nd;
int evflag=0; int evflag=0;
@ -1602,99 +1602,50 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
if(strcmp(w1,"-")==0){ if(strcmp(w1,"-")==0){
x=0;y=0;m=-1; x=0;y=0;m=-1;
}else{ }else{
// 引数の個数チェック // ˆø<CB86>ÌŒÂ<C592>”ƒ`ƒFƒbƒN
if (sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 || if (sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ||
( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) { ( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) {
if (strlen(current_file)) { printf("bad script line : %s\n",w3);
printf("\n"); return 1;
sprintf(tmp_output,"Bad script on line '"CL_WHITE"%s"CL_RESET"' fro" }
"m file '"CL_WHITE"%s"CL_RESET"'.\n",w3,current_file); m = map_mapname2mapid(mapname);
ShowError(tmp_output);
}
return 1;
}
m = map_mapname2mapid(mapname);
} }
if(strcmp(w2,"script")==0){ if(strcmp(w2,"script")==0){
// ƒXƒNƒŠƒvƒg̉ð<E280B0>Í // ƒXƒNƒŠƒvƒg̉ð<E280B0>Í
// { , } の入れ子許したらこっちでも簡易解析しないといけなくなったりもする
int curly_count = 0;
int string_flag = 0;
int j;
srcbuf=(char *)aCalloc(srcsize,sizeof(char)); srcbuf=(char *)aCalloc(srcsize,sizeof(char));
if (strchr(first_line,'{')) { if (strchr(first_line,'{')) {
strcpy(srcbuf,strchr(first_line,'{')); strcpy(srcbuf,strchr(first_line,'{'));
startline=*lines; startline=*lines;
} else } else
srcbuf[0]=0; srcbuf[0]=0;
while(1) { while(1) {
fgets(line,1020,fp); for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
(*lines)++; if (i>=0 && srcbuf[i]=='}')
if (feof(fp)) break;
break; fgets(line,1020,fp);
(*lines)++;
// line の中に文字列 , {} が含まれているか調査 if (feof(fp))
i = strlen(line); break;
for(j = 0; j < i ; j++) { if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
if(string_flag) { srcsize += 65536;
if(line[j] == '\"' && (j <= 0 || line[j-1] != '\\')) {
string_flag = 0;
}
} else {
if(line[j] == '\"') {
string_flag = 1;
} else if(line[j] == '}') {
if(curly_count == 0) {
// 抜けるのはfor だけ
break;
} else {
curly_count--;
}
} else if(line[j] == '{') {
curly_count++;
} else if(line[j] == '/' && line[j+1] == '/') {
// コメント
break;
} else if(*(unsigned char*)(line + j) >= 0x80) {
// 全角文字
j++;
}
}
}
if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
srcsize += 65536;
srcbuf = (char *)aRealloc(srcbuf, srcsize); srcbuf = (char *)aRealloc(srcbuf, srcsize);
memset(srcbuf + srcsize - 65536, '\0', 65536); memset(srcbuf + srcsize - 65536, '\0', 65536);
}
if (srcbuf[0]!='{') {
if (strchr(line,'{')) {
strcpy(srcbuf,strchr(line,'{'));
startline=*lines;
} }
if (srcbuf[0]!='{') { } else
if (strchr(line,'{')) { strcat(srcbuf,line);
strcpy(srcbuf,strchr(line,'{')); }
startline=*lines; script=parse_script(srcbuf,startline);
} if (script==NULL) {
} else // script parse error?
strcat(srcbuf,line); free(srcbuf);
if(!string_flag && line[j] == '}' && curly_count == 0) { return 1;
break; }
}
}
if(curly_count > 0) {
printf("\n");
snprintf(tmp_output,sizeof(tmp_output),"Missing rig"
"ht curly brace at line '"CL_WHITE"%d"CL_RESET"' of file \n\t'"
CL_WHITE"%s"CL_RESET"'.\n",*lines,current_file);
ShowWarning(tmp_output);
//script=NULL; // Let's load it anyway I guess :p
//exit(1); //Wtf? We do we exit?
} else {
// printf("Ok line %d\n",*lines);
script=parse_script(srcbuf,startline);
}
if (script==NULL) {
// script parse error?
free(srcbuf);
return 1;
}
}else{ }else{
// duplicate·é // duplicate·é
@ -1702,9 +1653,7 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
char srcname[128]; char srcname[128];
struct npc_data *nd2; struct npc_data *nd2;
if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){ if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){
printf("\n"); printf("bad duplicate name! : %s",w2);
snprintf(tmp_output,sizeof(tmp_output),"Bad duplicate name! : %s",w2);
ShowWarning(tmp_output);
return 0; return 0;
} }
if( (nd2=npc_name2id(srcname))==NULL ){ if( (nd2=npc_name2id(srcname))==NULL ){
@ -1979,6 +1928,16 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
for(i=0;i<num;i++) { for(i=0;i<num;i++) {
md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
if(class>4000) { // large/tiny mobs [Valaris]
md->size=2;
class-=4000;
}
else if(class>2000) {
md->size=1;
class-=2000;
}
md->bl.prev=NULL; md->bl.prev=NULL;
md->bl.next=NULL; md->bl.next=NULL;
md->bl.m=m; md->bl.m=m;
@ -1997,18 +1956,7 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
memcpy(md->name,w3,24); memcpy(md->name,w3,24);
md->n = i; md->n = i;
md->base_class = md->class = class;
if(class>4000) { // large/tiny mobs [Valaris]
md->size=2;
md->base_class = md->class = class-4000;
}
else if(class>2000) {
md->size=1;
md->base_class = md->class = class-2000;
} else {
md->base_class = md->class = class;
}
md->bl.id=npc_get_new_npc_id(); md->bl.id=npc_get_new_npc_id();
md->m =m; md->m =m;
md->x0=x; md->x0=x;
@ -2022,9 +1970,9 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
md->timer = -1; md->timer = -1;
md->target_id=0; md->target_id=0;
md->attacked_id=0; md->attacked_id=0;
md->speed=mob_db[md->base_class].speed; md->speed=mob_db[class].speed;
if (mob_db[md->base_class].mode&0x02) if (mob_db[class].mode&0x02)
md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
else else
md->lootitem=NULL; md->lootitem=NULL;
@ -2314,8 +2262,7 @@ int do_init_npc(void)
char c = '-'; char c = '-';
// indoorrswtable.txt and etcinfo.txt [Celest] // indoorrswtable.txt and etcinfo.txt [Celest]
if (battle_config.indoors_override_grffile) npc_read_indoors();
npc_read_indoors();
//npc_read_weather(); //npc_read_weather();
ev_db=strdb_init(24); ev_db=strdb_init(24);
@ -2330,7 +2277,6 @@ int do_init_npc(void)
free(nsl->prev); free(nsl->prev);
nsl->prev = NULL; nsl->prev = NULL;
} }
strcpy(current_file,nsl->name);
fp=fopen(nsl->name,"r"); fp=fopen(nsl->name,"r");
if (fp==NULL) { if (fp==NULL) {
printf("file not found : %s\n",nsl->name); printf("file not found : %s\n",nsl->name);
@ -2377,8 +2323,8 @@ int do_init_npc(void)
} else if (strcmpi(w2,"script")==0 && count > 3) { } else if (strcmpi(w2,"script")==0 && count > 3) {
if( strcmpi(w1,"function")==0 ){ if( strcmpi(w1,"function")==0 ){
npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines); npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines);
} else { }else{
npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines); npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
} }
} else if ( (i=0,sscanf(w2,"duplicate%n",&i), (i>0 && w2[i]=='(')) && count > 3) { } else if ( (i=0,sscanf(w2,"duplicate%n",&i), (i>0 && w2[i]=='(')) && count > 3) {
npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines); npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
@ -2418,7 +2364,7 @@ int do_init_npc(void)
add_timer_func_list(npc_event_timer,"npc_event_timer"); add_timer_func_list(npc_event_timer,"npc_event_timer");
add_timer_func_list(npc_event_do_clock,"npc_event_do_clock"); add_timer_func_list(npc_event_do_clock,"npc_event_do_clock");
add_timer_func_list(npc_timerevent,"npc_timerevent"); add_timer_func_list(npc_timerevent,"npc_timerevent");
memset(current_file,'\0',sizeof(current_file));
//exit(1); //exit(1);
return 0; return 0;