?? battle_ai.c
字號:
#include "version.h"#include <stdio.h>#include "common.h"#include "char.h"#include "char_base.h"#include "battle.h"#include "npcutil.h"#include "pet_skill.h"struct B_AI_RESULT { BATTLE_COM command; /* 窒毛允月井 */ int target; /* 簿卞 */};static int BATTLE_ai_normal( int, int, BATTLE_ENTRY *,struct B_AI_RESULT *);static int (*functbl[])( int, int, BATTLE_ENTRY *,struct B_AI_RESULT *) = { NULL, BATTLE_ai_normal,};int BATTLE_ai_all( int battleindex, int side, int turn){ int i; int rc = FALSE; BATTLE_ENTRY *pEntry; struct B_AI_RESULT result; if( BATTLE_CHECKINDEX( battleindex ) == FALSE )return BATTLE_ERR_BATTLEINDEX; if( BATTLE_CHECKSIDE( side ) == FALSE )return BATTLE_ERR_PARAM; if( BATTLE_CHECKSIDE( side ^1) == FALSE )return BATTLE_ERR_PARAM; if( BattleArray[battleindex].Side[side].type != BATTLE_S_TYPE_ENEMY ) return FALSE; pEntry = BattleArray[battleindex].Side[side^1].Entry; for( i = 0; i < BATTLE_ENTRY_MAX; i ++ ){ int charaindex = BattleArray[battleindex].Side[side].Entry[i].charaindex; int mode; if( CHAR_CHECKINDEX( charaindex ) == FALSE )continue; mode = CHAR_getWorkInt( charaindex, CHAR_WORKTACTICS); if( mode < 0 || mode >= arraysizeof( functbl)){ print( "BATTLE_ai_all 中,戰斗邏輯模式很奇怪(%s)(%d)\n", CHAR_getUseName( charaindex ), mode ); mode = 1; } if( BATTLE_IsCharge( charaindex ) == TRUE ){ CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); continue; } if( BattleArray[battleindex].Side[side].flg & BSIDE_FLG_SURPRISE) { CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, BATTLE_COM_NONE ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); }else { if( functbl[mode] != NULL ) { rc = functbl[mode]( turn, charaindex, pEntry, &result); if( BATTLE_CanMoveCheck( charaindex ) == FALSE ){ result.command = BATTLE_COM_NONE; } } if( rc ) {#ifdef _BATTLENPC_WARP_PLAYER if(result.command==BATTLE_COM_WARP){ 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; if( CHAR_getInt( tindex, CHAR_WHICHTYPE)==CHAR_TYPEPLAYER){ char sBuff[1024]="", sBuff1[1024]=""; int ss[3]; int sii; int rc = 1; if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_ACT_CONDITION), "wp", sBuff, sizeof( sBuff))!=NULL){ for( sii=1; sii<=3; sii++){ if(getStringFromIndexWithDelim( sBuff, ";", sii, sBuff1, sizeof( sBuff1))) {ss[sii-1]=atoi(sBuff1);} else {rc=0;} } if(rc){ CHAR_warpToSpecificPoint( tindex, ss[0], ss[1], ss[2]); BATTLE_WatchStop( tindex); } } } } }#endif CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, result.command ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM2, result.target + (side^1)*SIDE_OFFSET); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); //CHAR_SETWORKINT_LOW( charaindex, CHAR_WORKBATTLECOM3, array); } } } return TRUE;}int BATTLE_ai_one( int charaindex, int battleindex, int side, int turn){ int rc = FALSE; BATTLE_ENTRY *pEntry; struct B_AI_RESULT result; int mode; /* 由仿丟□正民尼永弁 */ if( BATTLE_CHECKINDEX( battleindex ) == FALSE )return BATTLE_ERR_BATTLEINDEX; if( BATTLE_CHECKSIDE( side ) == FALSE )return BATTLE_ERR_PARAM; if( BATTLE_CHECKSIDE( side ^1) == FALSE )return BATTLE_ERR_PARAM; /* 及扔奶玉隋墊丹 */ /* 襯平乓仿動陸反 仃月 */ if( BattleArray[battleindex].Side[side].type != BATTLE_S_TYPE_ENEMY ) return 0; /* 覆礎扔奶玉 */ pEntry = BattleArray[battleindex].Side[side^1].Entry; mode = CHAR_getWorkInt( charaindex, CHAR_WORKTACTICS); /* 質 毛蕊曰坌仃月 */ if( mode < 0 || mode >= arraysizeof( functbl)) return FALSE; /* 質 毛蕊曰坌仃月 */ if( functbl[mode] != NULL ) { rc = functbl[mode]( turn, charaindex, pEntry, &result); } if( rc ) { CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, result.command ); if( result.command == BATTLE_COM_ATTACK) { CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM2, result.target + (side^1)*SIDE_OFFSET); } CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); } return TRUE;}/* 騷卞鍬澎毛瑁戶月 */#define B_AI_NORMAL_ATTACKOPTION "at" /* 猾左皿撲亦件 */#define B_AI_NORMAL_GUARDOPTION "gu" /* 豢左皿撲亦件 */#define B_AI_NORMAL_MAGICOPTION "ma" /* 熱諸左皿撲亦件 */#define B_AI_NORMAL_ESCAPEOPTION "es" /* 仆月左皿撲亦件 */#define B_AI_NORMAL_WAZAOPTION "wa" /* 左皿撲亦件 */#ifdef _ENEMY_ATTACK_AI#define B_AI_NORMAL_RANDAOPTION "rn"#define B_AI_NORMAL_RANDOMOPTIONNUM 1#endif#define B_AI_NORMAL_ATTACKSUBOPTIONNUM 3#define B_AI_NORMAL_GUARDSUBOPTIONNUM 1#define B_AI_NORMAL_MAGICSUBOPTIONNUM 1#define B_AI_NORMAL_ESCAPESUBOPTIONNUM 1#define B_AI_NORMAL_WAZASUBOPTIONNUM 7/* 左皿撲亦件婁醒及 儂及爛聒 */#define B_AI_NORMAL_TARGET_ALL 1#define B_AI_NORMAL_TARGET_PLAYER 2#define B_AI_NORMAL_TARGET_PET 3#ifdef _ENEMY_ATTACK_AI#define B_AI_NORMAL_TARGET_LEADER 4#endif#define B_AI_NORMAL_SELECT_RANDOM 1#define B_AI_NORMAL_SELECT_HP_MAX 2#define B_AI_NORMAL_SELECT_HP_MIN 3#ifdef _ENEMY_ATTACK_AI#define B_AI_NORMAL_SELECT_STR_MAX 4#define B_AI_NORMAL_SELECT_DEX_MAX 5#define B_AI_NORMAL_SELECT_DEX_MIN 6#define B_AI_NORMAL_SELECT_ATT_SUBDUE 7enum{ AI_ATT_EARTHAT = 1, AI_ATT_WATERAT, AI_ATT_FIREAT, AI_ATT_WINDAT};int GetSubdueAttribute(int index){ int s_a = CHAR_getWorkInt( index, CHAR_WORKFIXEARTHAT); int s_b = CHAR_getWorkInt( index, CHAR_WORKFIXWATERAT); int s_c = CHAR_getWorkInt( index, CHAR_WORKFIXFIREAT); int s_d = CHAR_getWorkInt( index, CHAR_WORKFIXWINDAT); return ((s_a>s_c)?((s_b>s_d)?((s_a>s_b)?(2):(3)):((s_a>s_d)?(2):(1))):((s_b>s_d)?((s_c>s_b)?(4):(3)):((s_c>s_d)?(4):(1))));}#endiftypedef enum { B_AI_ATTACKMODE = 1, B_AI_GURADMODE, B_AI_MAGICMODE, B_AI_ESCAPEMODE, B_AI_WAZAMODE0, B_AI_WAZAMODE1, B_AI_WAZAMODE2, B_AI_WAZAMODE3, B_AI_WAZAMODE4, B_AI_WAZAMODE5, B_AI_WAZAMODE6,}B_AI_MODE;static int BATTLE_ai_normal( int turn, int charaindex, BATTLE_ENTRY *pEntry, struct B_AI_RESULT *result){ int at[B_AI_NORMAL_ATTACKSUBOPTIONNUM] = { 0,0,0}; /* 猾左皿撲亦件 */ int gu[B_AI_NORMAL_GUARDSUBOPTIONNUM] = {0}; /* 左皿撲亦件 */ int ma[B_AI_NORMAL_MAGICSUBOPTIONNUM] = {0}; /* 左皿撲亦件 */ int es[B_AI_NORMAL_ESCAPESUBOPTIONNUM] = {0}; /* 左皿撲亦件 */ int wa[B_AI_NORMAL_WAZASUBOPTIONNUM] = {0,0,0,0, 0,0,0};/* 左皿撲亦件 */#ifdef _ENEMY_ATTACK_AI int rn[B_AI_NORMAL_RANDOMOPTIONNUM] = {1};#endif int target[BATTLE_ENTRY_MAX]; int cnt; int i; int r; int rc; int mode=0; char buff[256]; char buff2[256]; if( turn == 1 ) { print( "應該沒這回事。\n" ); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_ATTACKOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_ATTACKSUBOPTIONNUM + 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; } at[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_GUARDOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_GUARDSUBOPTIONNUM + 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; } gu[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_MAGICOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_MAGICSUBOPTIONNUM + 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; } ma[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_ESCAPEOPTION,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -