📄 battle_ai.c
字号:
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 + -