/* * 称号をもってるかどうかしらべる * * 0 :もってない * 1 : もってる * 負 : Error */ BOOL NPC_Util_HaveTitle( int charindex , int titleindex ) { int i; Char *c; if( !CHAR_CHECKINDEX( charindex ) )return -1; c = CHAR_getCharPointer( charindex ); for(i=0;i<CHAR_TITLEMAXHAVE;i++){ if( c->indexOfHaveTitle[i] == titleindex ){ return TRUE; } } return FALSE; }
BOOL NPC_Util_AddOneTitle( int charindex, int titleindex ) { int i; Char *c ; if( !CHAR_CHECKINDEX( charindex ) )return FALSE; c = CHAR_getCharPointer( charindex ); // CoolFish: +1 2001/11/05 if (!c) return FALSE; for(i=0;i<CHAR_TITLEMAXHAVE;i++){ if( c->indexOfHaveTitle[i] == -1 ){ c->indexOfHaveTitle[i] = titleindex; return TRUE; } } return FALSE; }
void NPC_NPCEnemyLoop( int meindex ) { if( NowTime.tv_sec > CHAR_getWorkInt( meindex, CHAR_WORK_DIETIME) + CHAR_getWorkInt( meindex, CHAR_WORK_REVIVALTIME)){ Char *ch; CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, CHAR_WORK_BASEIMGBAK)); print("bbi---->bi11"); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX)); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ENEMY); MAP_sendAroundMapdata( CHAR_getInt( meindex, CHAR_FLOOR), CHAR_getInt( meindex, CHAR_X), CHAR_getInt( meindex, CHAR_Y)); ch = CHAR_getCharPointer( meindex); if( ch != NULL ) { strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, sizeof( ch->charfunctable[CHAR_LOOPFUNC]), ""); CHAR_constructFunctable( meindex); // CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 0); } } }
int NPC_NPCEnemy_Dying( int battleindex, int meindex ) { char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char buf[64]; int i,toindex=-1; int tmp=-1; if( !CHAR_CHECKINDEX( meindex)) { return FALSE; } argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1)); #ifdef _NEW_WARPMAN if( strstr( argstr, "NEWNPCENEMY") ) { }else { #endif /* 蠅 及陲太 */ if( NPC_Util_GetStrFromStrWithDelim( argstr, "endmsg", buf, sizeof( buf)) != NULL ) { for( i = 0; i < 5; i ++ ) { /* 爵 卞輔笛仄化中月蟈夠卞丟永本□斥 */ int toindex = BattleArray[battleindex].Side[0].Entry[i].charaindex; if( CHAR_CHECKINDEX( toindex) ) { CHAR_talkToCli( toindex, meindex ,buf , CHAR_COLORYELLOW ); } } } #ifdef _NEW_WARPMAN } #endif if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf)) != NULL ) { print("\n steal TRUE !!"); if( atoi( buf) == 1 ) { int charaindex = BattleArray[battleindex].Side[0].Entry[0].charaindex; NPC_NPCEnemy_StealItem( argstr, meindex, charaindex); } } #ifdef _ALLDOMAN // (不可開) Syu ADD 排行榜NPC if( NPC_Util_GetStrFromStrWithDelim( argstr, "herobattlefield", buf, sizeof( buf)) != NULL ) { int charaindex = BattleArray[battleindex].Side[0].Entry[0].charaindex; CHAR_setWorkInt ( charaindex , CHAR_WORKHEROFLOOR , atoi ( buf ) ) ; // Syu ADD if ( atoi ( buf ) > CHAR_getInt ( charaindex , CHAR_HEROFLOOR ) ) CHAR_setInt ( charaindex , CHAR_HEROFLOOR , atoi( buf ) ) ; } #endif tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "dieact"); if( tmp != 1 ) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_DIEACT, tmp); if( CHAR_getWorkInt( meindex, CHAR_WORK_DIEACT) == 0 ) { Char *ch; CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, 0); print("bbi---->bi10"); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX)); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ALTERRATIVE); MAP_sendAroundMapdata( CHAR_getInt( meindex, CHAR_FLOOR), CHAR_getInt( meindex, CHAR_X), CHAR_getInt( meindex, CHAR_Y)); ch = CHAR_getCharPointer( meindex); if( ch != NULL ) { strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "NPCEnemyLoop"); CHAR_constructFunctable( meindex); CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 5000); CHAR_setWorkInt( meindex, CHAR_WORK_DIETIME, NowTime.tv_sec); }else { print( "NPCENEMY:err\n"); } }else { for( i = 0; i < 5; i ++ ) { toindex = BattleArray[battleindex].Side[0].Entry[i].charaindex; if( CHAR_CHECKINDEX( toindex) ) { #ifdef _NEW_WARPMAN if( strstr( argstr, "NEWNPCENEMY") ) { BOOL Party=TRUE; if( NPC_NPCEnemy_CheckFree( meindex, toindex , &Party) == FALSE ) { continue; } if( Party == TRUE ) { }else { if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER ) { if( NPC_WarpAllMsg( meindex, toindex ) == TRUE ) { return TRUE; } } continue; } } CHAR_DischargeParty( toindex, 0); // 拆隊 CHAR_warpToSpecificPoint( toindex, CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ); #else CHAR_warpToSpecificPoint( toindex, CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ); #endif #ifdef _NPC_REPLACEMENT Check_EnemyWarpMe( meindex, argstr); #endif } } } return TRUE; }
/*#ifdef _JZ_NPCBUF CHAR_NPCBUFPOINT = CHAR_WORKEQUITFIRE, //NPC arg文件緩存指針 CHAR_NPCTIMERH32 = CHAR_WORKEQUITTHUNDER, //NPC 計時器(高32位) CHAR_NPCTIMERL32 = CHAR_WORKEQUITICE, //NPC 計時器(低32位) CHAR_NPCFILECTIMEH32 = CHAR_WORKEQUITWEAKEN, //讀NPC arg文件的時間(高32位) CHAR_NPCFILECTIMEL32 = CHAR_WORKEQUITBARRIER, //讀NPC arg文件的時間(低32位) //CHAR_NPCFILECTIME_HOUR = CHAR_WORKEQUITNOCAST, //讀NPC arg文件時的時鐘 //CHAR_NPCFILECTIME_MIN = CHAR_WORKEQUITFALLRIDE, //讀NPC arg文件時的分鐘 #endif*/ char *NPC_Util_GetArgStr( int index, char *argstr, int len) { char filename[128]; Char *ch; char *cret = NULL; struct stat buff; int fd; char opfile[128]; if( (ch = CHAR_getCharPointer( index)) == NULL ) { print("GetArgStr Not get CharPointer\n"); return NULL; //獲得NPC結構指針 } if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) { sprintf( opfile, "%s/%s", getNpcdir(),filename); if(stat(opfile,&buff)!=0) { print("NPC緩存機制 stat error:%s\n",strerror( errno )); buff.st_size = NPC_UTIL_GETARGSTR_BUFSIZE; }else{ buff.st_size++; } //if(buff.st_size > len)buff.st_size = len; cret = (char *)ch->workint[CHAR_NPCBUFPOINT]; //獲得NPC緩存指針 if( cret == NULL ) { //首先判斷NPC緩存是否已經加載數據 //未加載緩存,申請內存,並將文件內容讀到緩存中 loadarg: cret = allocateMemory((unsigned int)buff.st_size); //申請內存 memset( cret, 0,buff.st_size); if( cret == NULL ) { //判斷申請內存是否成功,如果不成功則採用舊的模式 //舊的文件即時讀取模式 //print("NPC BUF OLD LOAD FILE %d\n",buff.st_size); if( NPC_Util_MargeStrFromArgFile( opfile, argstr, len) != NULL ) { cret = argstr; } }else{ //新的NPC緩存模式 //print("NPC BUF NEW LOAD FILE %d\n",buff.st_size); if( NPC_Util_MargeStrFromArgFile( opfile, cret, buff.st_size) != NULL ) { //memcpy(cret,argstr,buff.st_size); ch->workint[CHAR_NPCBUFPOINT] = (int)cret; ch->workint[CHAR_NPCFILECTIMEH32] = (unsigned long)buff.st_mtime; }else{ freeMemory(cret); cret = NULL; } } }else { //print("NPC BUF NEW %d\n",buff.st_size); //已加載緩存,判斷是否數據被更改,如果沒被更改直接返回緩存指針,如果更改的話則GOTO到未加載緩存的代碼 //2個計時器暫時不用 //if(buff.st_size > NPC_UTIL_GETARGSTR_BUFSIZE)buff.st_size = NPC_UTIL_GETARGSTR_BUFSIZE; if((unsigned long)ch->workint[CHAR_NPCFILECTIMEH32] != (unsigned long)buff.st_mtime) { print("npc updata:%s\n",opfile); freeMemory(cret); cret = NULL; goto loadarg; } //memcpy(argstr,cret,buff.st_size); //cret = argstr; } }else { if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){ strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT)); cret = argstr; }else{ cret = NULL; } } if( cret == NULL ) print("File:%s\n", NPC_Util_CheckAssignArgFile( index, opfile)); return( cret); /* if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) { if( NPC_Util_MargeStrFromArgFile( filename, argstr, len) != NULL ) { cret = argstr; } }else { if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){ strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT)); cret = argstr; }else{ cret = NULL; } } if( cret == NULL ) print("File:%s\n", NPC_Util_CheckAssignArgFile( index, filename)); return( cret);*/ }