Explorar el Código

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
ajarn hace 20 años
padre
commit
bfb196770e
Se han modificado 1 ficheros con 58 adiciones y 112 borrados
  1. 58 112
      src/map/npc.c

+ 58 - 112
src/map/npc.c

@@ -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
 	char mapname[24];
-	char *srcbuf=NULL,*script=NULL;
+	unsigned char *srcbuf=NULL,*script;
 	int srcsize=65536;
 	int startline=0;
-	char line[1024];
+	unsigned char line[1024];
 	int i;
 	struct npc_data *nd;
 	int evflag=0;
@@ -1602,109 +1602,58 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
 	if(strcmp(w1,"-")==0){
 		x=0;y=0;m=-1;
 	}else{
-		// 引数の個数チェック
-		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) ) {
-			if (strlen(current_file)) {
-			printf("\n");
-			sprintf(tmp_output,"Bad script on line '"CL_WHITE"%s"CL_RESET"' fro"
-				"m file '"CL_WHITE"%s"CL_RESET"'.\n",w3,current_file);
-			ShowError(tmp_output);
-			}
-			return 1;
-		}
-		m = map_mapname2mapid(mapname);
+		printf("bad script line : %s\n",w3);
+		return 1;
 	}
-	
+	m = map_mapname2mapid(mapname);
+	}
+
 	if(strcmp(w2,"script")==0){
 		// スクリプトの解析
-		// { , } の入れ子許したらこっちでも簡易解析しないといけなくなったりもする
-		int curly_count = 0;
-		int string_flag = 0;
-		int j;
 		srcbuf=(char *)aCalloc(srcsize,sizeof(char));
-		if (strchr(first_line,'{')) {
-			strcpy(srcbuf,strchr(first_line,'{'));
-			startline=*lines;
-		} else
-			srcbuf[0]=0;
-		while(1) {
-			fgets(line,1020,fp);
-			(*lines)++;
-			if (feof(fp))
-				break;
-
-			// line の中に文字列 , {} が含まれているか調査
-			i = strlen(line);
-			for(j = 0; j < i ; j++) {
-				if(string_flag) {
-					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;
+	if (strchr(first_line,'{')) {
+		strcpy(srcbuf,strchr(first_line,'{'));
+		startline=*lines;
+	} else
+		srcbuf[0]=0;
+	while(1) {
+		for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
+		if (i>=0 && srcbuf[i]=='}')
+			break;
+		fgets(line,1020,fp);
+		(*lines)++;
+		if (feof(fp))
+			break;
+		if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
+			srcsize += 65536;
 				srcbuf = (char *)aRealloc(srcbuf, srcsize);
-				memset(srcbuf + srcsize - 65536, '\0', 65536);
-			}
-			if (srcbuf[0]!='{') {
-				if (strchr(line,'{')) {
-					strcpy(srcbuf,strchr(line,'{'));
-					startline=*lines;
-				}
-			} else
-				strcat(srcbuf,line);
-			if(!string_flag && line[j] == '}' && curly_count == 0) {
-				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;
+			memset(srcbuf + srcsize - 65536, '\0', 65536);
 		}
-		
+		if (srcbuf[0]!='{') {
+			if (strchr(line,'{')) {
+				strcpy(srcbuf,strchr(line,'{'));
+				startline=*lines;
+			}
+		} else
+			strcat(srcbuf,line);
+	}
+	script=parse_script(srcbuf,startline);
+	if (script==NULL) {
+		// script parse error?
+		free(srcbuf);
+		return 1;
+	}
+
 	}else{
 		// duplicateする
 		
 		char srcname[128];
 		struct npc_data *nd2;
 		if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){
-			printf("\n");
-			snprintf(tmp_output,sizeof(tmp_output),"Bad duplicate name! : %s",w2);
-			ShowWarning(tmp_output);
+			printf("bad duplicate name! : %s",w2);
 			return 0;
 		}
 		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++) {
 		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.next=NULL;
 		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);
 
 		md->n = i;
-
-		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->base_class = md->class = class;
 		md->bl.id=npc_get_new_npc_id();
 		md->m =m;
 		md->x0=x;
@@ -2022,9 +1970,9 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
 		md->timer = -1;
 		md->target_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));
 		else
 			md->lootitem=NULL;
@@ -2314,8 +2262,7 @@ int do_init_npc(void)
 	char c = '-';
 
 	// indoorrswtable.txt and etcinfo.txt [Celest]
-	if (battle_config.indoors_override_grffile)
-		npc_read_indoors();
+	npc_read_indoors();
 	//npc_read_weather();
 
 	ev_db=strdb_init(24);
@@ -2330,7 +2277,6 @@ int do_init_npc(void)
 			free(nsl->prev);
 			nsl->prev = NULL;
 		}
-		strcpy(current_file,nsl->name);
 		fp=fopen(nsl->name,"r");
 		if (fp==NULL) {
 			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) {
 				if( strcmpi(w1,"function")==0 ){
 					npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines);
-				} else {
-					npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
+				}else{
+				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) {
 				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_do_clock,"npc_event_do_clock");
 	add_timer_func_list(npc_timerevent,"npc_timerevent");
-	memset(current_file,'\0',sizeof(current_file));
+
 	//exit(1);
 
 	return 0;