⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battle_ai.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 2 页
字号:
									buff, sizeof( buff)) != NULL ){		for( i = 1; i < B_AI_NORMAL_ESCAPESUBOPTIONNUM + 1; i ++ ) {			rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2));			if( rc != TRUE ) {				print( "battle_ai.c:Invarid Param [%s]\n",						CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION));				return FALSE;			}			es[i-1] = atoi( buff2);		}	}	if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION),									B_AI_NORMAL_WAZAOPTION,									buff, sizeof( buff)) != NULL ){		for( i = 1; i < B_AI_NORMAL_WAZASUBOPTIONNUM + 1; i ++ ) {			rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2));			if( rc != TRUE ) {			}else{				wa[i-1] = atoi( buff2);			}		}	}#ifdef _ENEMY_ATTACK_AI	if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION),	  								B_AI_NORMAL_RANDAOPTION,									buff, sizeof( buff))!=NULL){		for( i=1; i<B_AI_NORMAL_RANDOMOPTIONNUM+1; i++){			rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2));						if(rc!=TRUE){				print( "battle_ai.c:Invarid Param [%s]\n",						CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION));				return FALSE;			}			rn[i-1] = atoi( buff2);		}	}#endif#ifdef _BATTLENPC_WARP_PLAYER	if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_ACT_CONDITION),		"tn", buff, sizeof( buff))!=NULL){		int sTurn = atoi( buff);		if(CHAR_getWorkInt( charaindex, CHAR_WORKTURN)==0)			CHAR_setWorkInt( charaindex, CHAR_WORKTURN, 1);		else			CHAR_setWorkInt( charaindex, CHAR_WORKTURN, CHAR_getWorkInt( charaindex, CHAR_WORKTURN)+1);		if(sTurn==CHAR_getWorkInt( charaindex, CHAR_WORKTURN)){			result->command = BATTLE_COM_WARP;			return TRUE;			}	}	#endif	if( at[0] == 0 && gu[0] == 0 && ma[0] == 0 && es[0] == 0 ){		for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){			if( wa[i] != 0 )break;		}		if( i >= B_AI_NORMAL_WAZASUBOPTIONNUM ){			print( "无指定任何的攻击方式。\n" );			return FALSE;		}	}	while( !mode ) {		int work = 0;		work = at[0]+gu[0]+ma[0]+es[0];		for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){			work += wa[i];		}		r = RAND( 0, work - 1 );		if( at[0] != 0 && r < at[0] ) 						mode = B_AI_ATTACKMODE;		else if( gu[0] != 0 && r < at[0] + gu[0]) 			mode = B_AI_GURADMODE;		else if( ma[0] != 0 && r < at[0] + gu[0] + ma[0]) 	mode = B_AI_MAGICMODE;		else if( es[0] != 0 && r < at[0] + gu[0] + ma[0] + es[0] ){			mode = B_AI_ESCAPEMODE;		}		if( mode ) break;		work = at[0] + gu[0] + ma[0] + es[0];		for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){			work += wa[i];			if( wa[i] != 0 && r < work ){				mode = B_AI_WAZAMODE0+i;				break;			}		}	}	if( mode == B_AI_ATTACKMODE	|| ( B_AI_WAZAMODE0 <= mode && mode <= B_AI_WAZAMODE6 )){		while( 1 ) {			for( i = 0 ; i < BATTLE_ENTRY_MAX; i ++ ) {				target[i] = -1;			}			cnt = 0;			for( i = 0; i < BATTLE_ENTRY_MAX ; i ++ ) {				int tindex = (pEntry+i)->charaindex;				if( !CHAR_CHECKINDEX( tindex ))continue;				if( CHAR_getFlg( tindex, CHAR_ISDIE)) continue;				if( CHAR_getWorkInt( tindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_RESCUE ) continue;				switch( at[1]) {				  case B_AI_NORMAL_TARGET_PLAYER:				  	if( CHAR_getInt( tindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){				  		target[cnt++] = i;				  	}				  	break;				 case B_AI_NORMAL_TARGET_PET:				  	if( CHAR_getInt( tindex, CHAR_WHICHTYPE) == CHAR_TYPEPET){				  		target[cnt++] = i;				  	}				  	break;#ifdef _ENEMY_ATTACK_AI                 case B_AI_NORMAL_TARGET_LEADER:					 					 if( CHAR_getWorkInt( tindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER) {						 target[cnt++] = i;					 }else if(!RAND( 0, 2)) {						 target[cnt++] = i;					 }					 break;#endif				  default:					target[cnt++] = i;					break;				}			}			if( cnt == 0 && at[1] == B_AI_NORMAL_TARGET_ALL ) return FALSE;			if( cnt > 0 ) break;			at[1] = B_AI_NORMAL_TARGET_ALL;		}		result->command = BATTLE_COM_NONE;		if( at[2] == B_AI_NORMAL_SELECT_RANDOM ) {			r = RAND( 0, cnt-1);			result->command = BATTLE_COM_ATTACK;			result->target = target[r];		}else if( at[2] == B_AI_NORMAL_SELECT_HP_MAX ||	at[2] == B_AI_NORMAL_SELECT_HP_MIN ){			int top = 0;			for( i = 0; i < cnt; i ++ ) {				if( i ==0 ) top = target[i];				else {					int		tophp  = CHAR_getInt((pEntry+top)->charaindex, CHAR_HP);					int 	comphp = CHAR_getInt((pEntry+target[i])->charaindex, CHAR_HP);					if( at[2] == B_AI_NORMAL_SELECT_HP_MAX ) {						if(  comphp > tophp ) top = target[i];					}					else {						if( comphp < tophp ) top = target[i];					}				}			}#ifdef _ENEMY_ATTACK_AI						if(!RAND( 0, rn[0]))							result->target = target[RAND( 0, cnt-1)];			else				result->target  = top;            			result->command = BATTLE_COM_ATTACK;#else			result->command = BATTLE_COM_ATTACK;			result->target = top;#endif		}#ifdef _ENEMY_ATTACK_AI		else if(at[2] == B_AI_NORMAL_SELECT_STR_MAX) {			int top = 0;			for( i=0; i<cnt; i++) {				if(i==0) top = target[i];				else {					int	topstr  = CHAR_getInt( (pEntry+top)->charaindex, CHAR_STR);					int	compstr = CHAR_getInt( (pEntry+target[i])->charaindex, CHAR_STR);										if(compstr>topstr) top = target[i];									}			}			if(!RAND( 0, rn[0]))								result->target = target[RAND( 0, cnt-1)];			else				result->target  = top;            			result->command = BATTLE_COM_ATTACK;		}		else if(at[2] == B_AI_NORMAL_SELECT_DEX_MAX ||			    at[2] == B_AI_NORMAL_SELECT_DEX_MIN) {  			int top = 0;			for( i=0; i<cnt; i++) {				if(i==0) top = target[i];				else {					int	topdex  = CHAR_getInt( (pEntry+top)->charaindex, CHAR_DEX);					int	compdex = CHAR_getInt( (pEntry+target[i])->charaindex, CHAR_DEX);					if(at[2]==B_AI_NORMAL_SELECT_DEX_MAX) {						if(compdex>topdex) top = target[i];					}else {						if(compdex<topdex) top = target[i];					}				}			}			if(!RAND( 0, rn[0]))								result->target = target[RAND( 0, cnt-1)];			else				result->target  = top;            			result->command = BATTLE_COM_ATTACK;		}		else if(at[2] == B_AI_NORMAL_SELECT_ATT_SUBDUE) {			int top = 0;			for( i=0; i<cnt; i++) {				if(i==0) top = target[i];				else {										switch(GetSubdueAttribute(charaindex))					{					case AI_ATT_EARTHAT:						{							int	topatt  = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXEARTHAT);					        int	compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXEARTHAT);					        if(compatt>topatt) top = target[i];						}						break;					case AI_ATT_WATERAT:						{							int	topatt  = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXWATERAT);					        int	compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXWATERAT);					        if(compatt>topatt) top = target[i];						}						break;					case AI_ATT_FIREAT:						{							int	topatt  = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXFIREAT);					        int	compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXFIREAT);					        if(compatt>topatt) top = target[i];						}						break;					case AI_ATT_WINDAT:						{							int	topatt  = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXWINDAT);					        int	compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXWINDAT);					        if(compatt>topatt) top = target[i];						}						break;					default:						break;					}				}			}			if(!RAND( 0, rn[0]))								result->target = target[RAND( 0, cnt-1)];			else				result->target  = top;            			result->command = BATTLE_COM_ATTACK;		}#endif		else{			return FALSE;		}		if( B_AI_WAZAMODE0 <= mode && mode <= B_AI_WAZAMODE6 ){			if( PETSKILL_Use( charaindex, mode - B_AI_WAZAMODE0, result->target,NULL ) == TRUE ){				result->command = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLECOM1 );				return TRUE;			}else{				print( "此项技能尚未设定(%s):(%d)\n",					CHAR_getUseName( charaindex), mode - B_AI_WAZAMODE0 );				return FALSE;			}		}else		if( mode == B_AI_ATTACKMODE ){			result->command = BATTLE_COM_ATTACK;			return TRUE;		}	}else if( mode == B_AI_GURADMODE ) {		result->command = BATTLE_COM_GUARD;		return TRUE;	}else if( mode == B_AI_ESCAPEMODE ) {		result->command = BATTLE_COM_ESCAPE;		return TRUE;	}	return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -