/*------------------------------------------------------------ * NPC_getRandomValue Î缰¦ÐѼ°Ñ¯¾§Áë¼°Ð×»§¼°èúÐÑ * ¦ÐÑ * string char* Ù¯ * unuse int* Òø´õئÖÐ£Û * ߯Ի°À * ·Â¼þĸة¼° ìµ¼°°À ã༰ɬÀ÷´£ý2 ¼°Â¦ÐѱåâçÐåÔÊÔÂ£Û ------------------------------------------------------------*/ static int NPC_seekGraphicNumberFromString( char* string, int* unuse ) { return CHAR_seekGraphicNumberFromString( string ); }
static int NPC_readCreateFile( char* filename ) { FILE* f; char line[512]; int linenum=0; int start=OFF; NPC_Create cr; int enemyreadindex=0; typedef struct tagPOINT { int x,y; }POINT; typedef struct tagREC { int w,h; }REC; POINT center[2]={{0,0},{0,0}}; /* born が 0 で move が 1 */ REC wh[2] ={{0,0},{0,0}}; /* born が 0 で move が 1 */ POINT lu[2] ={{0,0},{0,0}}; /* born が 0 で move が 1 */ POINT rd[2] ={{0,0},{0,0}}; /* born が 0 で move が 1 */ int defborn=FALSE; /* born を設定したかどうか */ int defmove=FALSE; /* move を設定したかどうか */ int deflurd[2]={FALSE,FALSE}; /* lu,rd で設定したかどうか */ char* ret; if( NPC_create_readindex >= NPC_createnum ){ print("Create Exceed configured buffer\n" ); print("configured createnumber is %d\n",NPC_createnum); print("Unread File:%s\n",filename); return FALSE; } NPC_setDefaultNPCCreate( &cr ); f= fopen( filename ,"r"); if( f == NULL )return FALSE; ret = fgets( line, sizeof( line ), f ); if( ret == NULL )goto FCLOSERETURNFALSE; if( strcmp( NPC_CREATEFILEMAGIC, line ) != 0 ){ print( "This file is not a create file.\n" ); goto FCLOSERETURNFALSE; } linenum = 1; while( fgets( line , sizeof( line ) , f ) ){ linenum++; if( line[0] == '#' )continue; /* comment */ if( line[0] == '\n' )continue; /* none */ chomp( line ); switch( line[0] ){ case '{': if( start == ON ){ fprint( "Find {. But already START state. %s:%d\n", filename, linenum); fprint( "exit\n" ); goto FCLOSERETURNFALSE; }else{ NPC_setDefaultNPCCreate( &cr ); start = ON; } break; case '}': if( start == ON ){ int err = FALSE; if( enemyreadindex == 0 ){ err = TRUE; print( "There is no enemydata %s:%d\n", filename,linenum); }else if( MAP_IsThereSpecificFloorid( cr.intdata[NPC_CREATEFLOORID]) == FALSE ){ err = TRUE; print( "Invalid Floor ID arround %s:%d-floor:%d\n", filename,linenum, cr.intdata[NPC_CREATEFLOORID]); }else if( defborn == FALSE ){ err = TRUE; print( "There is no born setting %s:%d\n", filename,linenum); } if( err == FALSE ){ cr.intdata[NPC_CREATEENEMYNUM] = enemyreadindex; if( deflurd[0] ){ cr.intdata[NPC_CREATEBORNLEFTUPX] = min(lu[0].x,rd[0].x); cr.intdata[NPC_CREATEBORNRIGHTDOWNX] = max(lu[0].x,rd[0].x); cr.intdata[NPC_CREATEBORNLEFTUPY] = min(lu[0].y,rd[0].y); cr.intdata[NPC_CREATEBORNRIGHTDOWNY] = max(lu[0].y,rd[0].y); }else{ cr.intdata[NPC_CREATEBORNLEFTUPX] = center[0].x-wh[0].w/2; cr.intdata[NPC_CREATEBORNRIGHTDOWNX] = center[0].x+wh[0].w/2; cr.intdata[NPC_CREATEBORNLEFTUPY] = center[0].y-wh[0].h/2; cr.intdata[NPC_CREATEBORNRIGHTDOWNY] = center[0].y+wh[0].h/2; } /* 99/01/21 河田 [0]-->[1]に修正 */ if( defmove ){ if( deflurd[0] ){ cr.intdata[NPC_CREATEMOVELEFTUPX] = min(lu[1].x,rd[1].x); cr.intdata[NPC_CREATEMOVERIGHTDOWNX] = max(lu[1].x,rd[1].x); cr.intdata[NPC_CREATEMOVELEFTUPY] = min(lu[1].y,rd[1].y); cr.intdata[NPC_CREATEMOVERIGHTDOWNY] = max(lu[1].y,rd[1].y); }else{ cr.intdata[NPC_CREATEMOVELEFTUPX] = center[1].x-wh[1].w/2; cr.intdata[NPC_CREATEMOVERIGHTDOWNX] = center[1].x+wh[1].w/2; cr.intdata[NPC_CREATEMOVELEFTUPY] = center[1].y-wh[1].h/2; cr.intdata[NPC_CREATEMOVERIGHTDOWNY] = center[1].y+wh[1].h/2; } }else{ /* born をコピーする */ cr.intdata[NPC_CREATEMOVELEFTUPX] = cr.intdata[NPC_CREATEBORNLEFTUPX]; cr.intdata[NPC_CREATEMOVERIGHTDOWNX] = cr.intdata[NPC_CREATEBORNRIGHTDOWNX]; cr.intdata[NPC_CREATEMOVELEFTUPY] = cr.intdata[NPC_CREATEBORNLEFTUPY]; cr.intdata[NPC_CREATEMOVERIGHTDOWNY] = cr.intdata[NPC_CREATEBORNRIGHTDOWNY]; } memcpy( &NPC_create[NPC_create_readindex], &cr, sizeof( NPC_Create ) ); NPC_create_readindex++; if( NPC_create_readindex >= NPC_createnum ){ print("Create Exceed configured buffer\n" ); print("configured createnumber is %d\n", NPC_createnum); print("Unread File:%s\n",filename); goto FCLOSERETURNFALSE; } } /* 初期値に戻しておく */ NPC_setDefaultNPCCreate( &cr ); enemyreadindex=0; defborn=FALSE; defmove=FALSE; deflurd[0]=FALSE; deflurd[1]=FALSE; start = OFF; }else{ fprint( "Unresolved '}' at %s:%d\n",filename,linenum); goto FCLOSERETURNFALSE; } break; default: { char firstToken[256]; char secondToken[256]; int ret; ret = getStringFromIndexWithDelim( line, "=", 1, firstToken, sizeof( firstToken ) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); break; } ret = getStringFromIndexWithDelim( line, "=", 2, secondToken, sizeof( secondToken ) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); break; } if( strcasecmp("floorid",firstToken) == 0 ){ cr.intdata[NPC_CREATEFLOORID] = atoi(secondToken); }else if( strcasecmp("borncenter", firstToken) == 0 ){ getFourIntsFromString(secondToken,¢er[0].x, ¢er[0].y,&wh[0].w,&wh[0].h ); defborn = TRUE; }else if( strcasecmp("borncorner", firstToken) == 0 ){ getFourIntsFromString(secondToken,&lu[0].x,&lu[0].y, &rd[0].x,&rd[0].y ); defborn = TRUE; deflurd[0]=TRUE; }else if( strcasecmp("movecenter", firstToken) == 0 ){ getFourIntsFromString(secondToken,¢er[1].x, ¢er[1].y,&wh[1].w,&wh[1].h ); defmove = TRUE; }else if( strcasecmp("movecorner", firstToken) == 0 ){ getFourIntsFromString(secondToken,&lu[1].x,&lu[1].y, &rd[1].x,&rd[1].y ); defmove = TRUE; deflurd[1]=TRUE; }else if( strcasecmp("dir",firstToken) == 0 ){ cr.intdata[NPC_CREATEDIR] = atoi( secondToken ); }else if( strcasecmp("graphicname",firstToken) == 0 ){ cr.intdata[NPC_CREATEBASEIMAGENUMBER] = CHAR_seekGraphicNumberFromString(secondToken); }else if( strcasecmp("name",firstToken) == 0 ){ strcpysafe( cr.chardata[NPC_CREATENAME].string, sizeof(cr.chardata[NPC_CREATENAME].string), secondToken ); }else if( strcasecmp("time",firstToken) == 0 ){ cr.intdata[NPC_CREATETIME] = atoi( secondToken ); }else if( strcasecmp("date",firstToken) == 0 ){ cr.intdata[NPC_CREATEDATE] = atoi( secondToken ); }else if( strcasecmp("createnum",firstToken) == 0 ){ cr.intdata[NPC_CREATEBORNNUM] = atoi( secondToken ); }else if( strcasecmp( "boundary", firstToken) == 0 ){ cr.intdata[NPC_CREATEBOUNDARY] = atoi( secondToken ); }else if( strcasecmp( "ignoreinvincible", firstToken) == 0 ){ cr.intdata[NPC_CREATEIGNOREINVINCIBLE] = atoi( secondToken ); //jeffrey 1231 #ifdef _ADD_ACTION }else if( strcasecmp( "action", firstToken) == 0 ){ cr.intdata[NPC_CREATEACTION] = atoi( secondToken ); #endif // Robin 0731 }else if( strcasecmp( "family", firstToken) == 0 ){ cr.intdata[NPC_CREATEFAMILY] = atoi( secondToken ); }else if( strcasecmp("enemy", firstToken) == 0 ){ /* 引数を渡せるようにする */ int templateindex; char enemyname[64]; /* 境界線チェック */ if( enemyreadindex <= arraysizeof(cr.templateindex) ) /* OK */ ; else break; /* secondToken を文字列に分解する */ getStringFromIndexWithDelim(secondToken,"|",1,enemyname, sizeof(enemyname) ); templateindex= NPC_templateGetTemplateIndex(enemyname); if( templateindex != -1 ){ cr.templateindex[enemyreadindex] = templateindex; { /* 引数を処理する */ char tmp[2]; int ret; ret = getStringFromIndexWithDelim( secondToken, "|",2,tmp, sizeof(tmp) ); if( ret == FALSE ) cr.arg[enemyreadindex].string[0] = '\0'; else strcpysafe( cr.arg[enemyreadindex].string, sizeof( cr.arg[enemyreadindex]. string ), secondToken+strlen(enemyname)+1 ); } enemyreadindex++; }else fprint( "No such template:\n[%s(%d)%s] enemy:%s\n", filename ,linenum,secondToken, enemyname); }else{ fprint( "No such entry %s %s:%d\n",firstToken,filename, linenum ); } } } } fclose(f); return TRUE; FCLOSERETURNFALSE: fclose(f); return FALSE; }