?? cbeyes.cpp
字號:
struct UNIT_STRUCT *pUG = EYE_GetGeneral( pU );
if( pUG && pUG != pU )
{
// nDefend = int(nDefend*(
// 1+(DATA_Lib.Gen[pUG->Gen.nID].nWuLi*
// DATA_Lib.Unit[pUG->Draw.nFile].nNearDefend/100.0
// -70)/70.0+(EYE_GetMorale(pUG)-70)/300.0
// ));
nDefend = int(nDefend*(
1+(DATA_Lib.Gen[pUG->Gen.nID].nWuLi
-70)/70.0+(EYE_GetMorale(pUG)-70)/200.0
));
if( nDefend == 0 ) nDefend = 1;
}
return nDefend;
}
// 得到遠程防御力
inline int EYE_GetFarDefend( struct UNIT_STRUCT *pUnit )
{
int nDefend;
if( EYE_IfUnitIsGen( pUnit ) )
{
nDefend = DATA_Lib.Gen[pUnit->Gen.nID].nWuLi*DATA_Lib.Unit[pUnit->Draw.nFile].nFarDefend/100;
}
else if( EYE_IfUnitIsBattleShip( pUnit ) )
{
int nPerson = EYE_GetUnitPerson( pUnit );
Assert( nPerson < 2 );
nDefend = DATA_Lib.Unit[pUnit->Draw.nFile].nFarDefend
+GAME.Players[pUnit->Draw.nPlayer].nAddWaterDefend[nPerson]; // 戰船的附加防御力
}
else
{
int nPerson = EYE_GetUnitPerson( pUnit );
nDefend = DATA_Lib.Unit[pUnit->Draw.nFile].nFarDefend;
if( nDefend != -1 )
{
nDefend += GAME.Players[pUnit->Draw.nPlayer].nAddFarDefend[nPerson];// 遠程士兵的附加防御力
}
}
// 將領能力修正
struct UNIT_STRUCT *pUG = EYE_GetGeneral( pUnit );
if( pUG && pUG != pUnit )
{
// nDefend = int(nDefend*(
// 1+(DATA_Lib.Gen[pUG->Gen.nID].nWuLi*
// DATA_Lib.Unit[pUG->Draw.nFile].nFarDefend/100.0
// -70)/70.0+(EYE_GetMorale(pUG)-70)/300.0
// ));
nDefend = int(nDefend*(
1+(DATA_Lib.Gen[pUG->Gen.nID].nWuLi
-70)/70.0+(EYE_GetMorale(pUG)-70)/200.0
));
if( nDefend == 0 ) nDefend = 1;
}
return nDefend;
}
// test if there is the bank of the water around the unit
// nLayer : layer of the unit
// nStartX, nStartY : position of the unit
// nLocationSize : location size of the unit
// return : TRUE if there is bank
BOOL EYE_IfNearBank( int nLayer, int nStartX, int nStartY, int nLocationSize )
{
WORD codeG;
struct MAP_GROUND_CODE_STRUCT stctG;
BOOL bOdd = nStartY&1;
BOOL bOdd2;
int nX, nY, nX2, nY2;
BOOL bBank = FALSE;
for( int j=0; j<MAP_nLocationNum[nLocationSize]; j++ )
{
nX = nStartX+MAP_ptLocation[bOdd][j].x,
nY = nStartY+MAP_ptLocation[bOdd][j].y;
if( EYE_IfOutOfRange( nX, nY ) )
continue;
bOdd2 = nY&1;
for( int i=0; i< 8; i++ )
{
nX2 = nX + MAP_ptSenser[bOdd2][0][i].x;
nY2 = nY + MAP_ptSenser[bOdd2][0][i].y;
if( EYE_IfOutOfRange( nX2, nY2 ) )
continue;
codeG = MAP_GetGroundData( nLayer, nX2, nY2 );
Assert( codeG != MAP_DATA_NONE );
MAP_GroundDeCode( codeG, &stctG );
// 就在岸邊
if( stctG.nFile == 3 && stctG.nCol != 12 )
{
bBank = TRUE;
break;
}
}
if( bBank == TRUE ) break;
}
return bBank;
}
// 檢測該部隊是否中計
// pU : 被檢測的單元
// nJiMou : 被檢測的計謀
inline BOOL EYE_IfInSTG( struct UNIT_STRUCT *pU, CTRL_JIMOU nJiMou )
{
if( pU->Draw.nSTG[nJiMou] == 1 )
return TRUE;
return FALSE;
}
// 得到士氣
#define EYE_MORALE_ADD 50
inline BYTE EYE_GetMorale( struct UNIT_STRUCT *pU )
{
Assert( EYE_IfUnitIsGen( pU ) );
Assert( pU->Gen.nMorale>= 0 && pU->Gen.nMorale< 300 );
if( pU != NULL && EYE_IfInSTG( pU, JILI ) )
return pU->Gen.nMorale+EYE_MORALE_ADD;
return pU->Gen.nMorale;
}
// 得到視野
inline int EYE_GetViewRange( struct CTRL_FRAME_STRUCT *pDraw )
{
int nRange;
if( pDraw->nSTG[YUANSHI] == 1 )
nRange = 10;
else
nRange = DATA_Lib.Unit[pDraw->nFile].nViewRange;
return nRange;
}
// 判斷此地是否被火燒
// nX, nY : 坐標
inline BOOL EYE_IfBurned( int nX, int nY )
{
WORD codeR = MAP_GetRegionData( nX, nY );
struct MAP_REGION_CODE_STRUCT stctR;
MAP_RegionDeCode( codeR, &stctR );
if( stctR.nPlayer == 1 )
return TRUE;
return FALSE;
}
// 判斷糧食是否不能存儲了——糧倉不夠
// 游戲君主ID
inline BOOL EYE_IfFoodExceeded( int nPlayer )
{
if( GAME.Players[nPlayer].nFood >=
GAME.Players[nPlayer].nFoodStore*RUN_FOODSTORE_MAX )
{ // 如果糧食超過可以儲存的數量,退出
return TRUE;
}
return FALSE;
}
inline int EYE_GetNewLevel( int nGenID )
{
int nLevel = DATA_Lib.Gen[nGenID].nLevel;
int nType = DATA_Lib.Gen[nGenID].nType-1;
// 將領類型的偏移量
int nGenOff[4]={1,0,2,3};// 騎,步,弓,文
// 每一級將領級別名稱的開始位置
int nStart[10] = {0, 4, 8, 10, 12, 14, 16, 20, 24, 28};
// 每一級將領級別名稱的個數
int nRange[10] = {4,4,2,2,2,2,4,4,4,1};
int nNewLevel;
if( nRange[nLevel] == 4 )
{
nNewLevel = nStart[nLevel]+nGenOff[nType];
}
else
{
nNewLevel = nStart[nLevel]+nType%nRange[nLevel];
}
return nNewLevel;
}
// 得到將領的級別名稱
// nGenID : 被確定的將領單元的將領ID
// strLvlName : 級別名稱
// return : 名稱的ID號
inline int EYE_GetLevelName( int nGenID, LPSTR strLvlName )
{
int nNewLevel = EYE_GetNewLevel( nGenID );
strcpy( strLvlName, DATA_Lib.Grade[nNewLevel].strName );
return nNewLevel;
}
// 得到武力
// nGenID : 將領ID
// return : 武力值
inline int EYE_GetWuLi( int nGenID )
{
int nNewLevel = EYE_GetNewLevel( nGenID );
return DATA_Lib.Gen[nGenID].nWuLi+DATA_Lib.Grade[nNewLevel].nAddWuLi;
}
// 得到智力
// nGenID : 將領ID
// return : 武力值
inline int EYE_GetZhiLi( int nGenID )
{
int nNewLevel = EYE_GetNewLevel( nGenID );
return DATA_Lib.Gen[nGenID].nZhiLi+DATA_Lib.Grade[nNewLevel].nAddZhiLi;
}
// 判斷該將領是否可以使用某個計謀
inline BOOL EYE_IfJiMou( int nGenID, CTRL_JIMOU JiMou )
{
int nStrategy[10] = {0x00, 0x01, 0x0181, 0x01C1, 0x01C9, 0x01CF, 0x01EF, 0x01FF, 0x01FF, 0x01FF};
int comp = 1<<DATA_Lib.Gen[nGenID].nLevel;
if( (comp & nStrategy[DATA_Lib.Gen[nGenID].nLevel]) == comp )
return TRUE;
return FALSE;
}
// 判斷該將領是否可以單挑
inline BOOL EYE_IfFight( int nBlood1, int nPower1, int nBlood2, int nPower2 )
{
int nHit1 = (int)(nBlood1*nPower1*(1+(nPower1-nPower2)*4/60.0)*6/1000.0);
if( nHit1 >= nBlood2 )
{ // 敵方武將要死
int i = getrandom(1,5);
// 仍然有五分之一的可能同意單挑
if( i == 3 )
return TRUE;
return FALSE;
}
return TRUE;
}
// 判斷某游戲者是否已經完蛋
// nPlayer : 被判定的游戲者
// nRun : 能移動的人數
// return : 為真時表示已經完蛋
inline BOOL EYE_IfPlayerIsOver( int nPlayer, int nRun )
{
if( (GAME.Players[nPlayer].nGold==0 || nRun==0 )
&& GAME.Players[nPlayer].wGroupCounter == 0 )
return TRUE;
return FALSE;
}
/////////////
/////////////
//add by tian yue
//尋找最近的特定物體
//傳入參數:
//nPlayer :游戲者的ID號
//nFile :要查尋物體的文件名
//X :本物體的X
//Y :本物體的Y
//傳出參數:
//失?。篗AP_DATA_NONE
//成功:要查尋物體的ID號
WORD TY_FindNearObject(WORD nPlayer,WORD nFile,WORD X,WORD Y)
{
WORD i;
WORD j=0;
WORD Pau0=0,Pau1=0;
WORD IDarrays[15][2];
WORD num=0;
WORD nID=MAP_DATA_NONE;
for (i=0;i<15;i++)
{
IDarrays[i][0]=MAP_DATA_NONE;
IDarrays[i][1]=MAP_DATA_NONE;
}
for (i=0;i<PLAYER_UNIT_MAX;i++)
{ if ((GAME.Players[nPlayer].Unit[i].Draw.nFile == nFile)
&&(GAME.Players[nPlayer].Unit[i].Task.nTaskID != SHANCHU)
&&(GAME.Players[nPlayer].Unit[i].nType != MAP_UNIT_TYPE_NONE))
{
IDarrays[num][0]=i;
IDarrays[num][1]=(WORD)sqrtl((((X-GAME.Players[nPlayer].Unit[i].Draw.nX)*
(X-GAME.Players[nPlayer].Unit[i].Draw.nX))+
((Y-GAME.Players[nPlayer].Unit[i].Draw.nY)*
(Y-GAME.Players[nPlayer].Unit[i].Draw.nY))));
num++;
if (num >= 15)
break;
}
}
if (num == 0)
return (MAP_DATA_NONE);
else
{
for (i=1;i<num;i++)
{
if (IDarrays[0][1] > IDarrays[i][1])
{
Pau0=IDarrays[i][0];
Pau1=IDarrays[i][1];
IDarrays[i][1]=IDarrays[0][1];
IDarrays[i][0]=IDarrays[0][0];
IDarrays[0][1]=Pau1;
IDarrays[0][0]=Pau0;
}
}
return (GAME.Players[nPlayer].Unit[IDarrays[0][0]].nID);
}
}
WORD TY_FindNearHome(WORD player,WORD X,WORD Y,WORD TYPE)
{
WORD Num=0,i;
WORD Arrays[15][2];
WORD Pau0=0,Pau1=0;
for (i=0;i<5;i++)
{
Arrays[i][0]=MAP_DATA_NONE;
Arrays[i][1]=MAP_DATA_NONE;
}
switch(TYPE)
{
//樹木
case 0:
for (i=0;i<PLAYER_UNIT_MAX;i++)
{
if (GAME.Players[player].Unit[i].Draw.nFile == 0
||GAME.Players[player].Unit[i].Draw.nFile == 1
||GAME.Players[player].Unit[i].Draw.nFile == 4
||GAME.Players[player].Unit[i].Draw.nFile == 5)
{
if (GAME.Players[player].Unit[i].nType != MAP_UNIT_TYPE_BUILDING
||GAME.Players[player].Unit[i].nLife <= 0
||GAME.Players[player].Unit[i].Task.nTaskID == JIANZAOZHONG
||GAME.Players[player].Unit[i].Task.nTaskID == SHANCHU)
continue;
Arrays[Num][0]=i;
Arrays[Num][1]=(WORD)sqrtl((((X-GAME.Players[player].Unit[i].Draw.nX)*
(X-GAME.Players[player].Unit[i].Draw.nX))+
((Y-GAME.Players[player].Unit[i].Draw.nY)*
(Y-GAME.Players[player].Unit[i].Draw.nY))));
Num++;
//if (Num >= 4 )
if (Num >= 15 )
break;
}
}
break;
//麥田
case 1:
//敵人的糧倉
case 4:
for (i=0;i<PLAYER_UNIT_MAX;i++)
{
if (GAME.Players[player].Unit[i].nType != MAP_UNIT_TYPE_BUILDING
||GAME.Players[player].Unit[i].nLife <= 0
||GAME.Players[player].Unit[i].Task.nTaskID == JIANZAOZHONG
||GAME.Players[player].Unit[i].Task.nTaskID == SHANCHU)
continue;
if (GAME.Players[player].Unit[i].Draw.nFile == 0
||GAME.Players[player].Unit[i].Draw.nFile == 1
||GAME.Players[player].Unit[i].Draw.nFile == 10
||GAME.Players[player].Unit[i].Draw.nFile == 11)
{
Arrays[Num][0]=i;
Arrays[Num][1]=(WORD)sqrtl((((X-GAME.Players[player].Unit[i].Draw.nX)*
(X-GAME.Players[player].Unit[i].Draw.nX))+
((Y-GAME.Players[player].Unit[i].Draw.nY)*
(Y-GAME.Players[player].Unit[i].Draw.nY))));
Num++;
//if (Num >= 4 )
if (Num >= 15 )
break;
}
}
break;
//鐵礦
case 2:
for (i=0;i<PLAYER_UNIT_MAX;i++)
{
if (GAME.Players[player].Unit[i].nType != MAP_UNIT_TYPE_BUILDING
||GAME.Players[player].Unit[i].nLife <= 0
||GAME.Players[player].Unit[i].Task.nTaskID == JIANZAOZHONG
||GAME.Players[player].Unit[i].Task.nTaskID == SHANCHU)
continue;
if (GAME.Players[player].Unit[i].Draw.nFile == 0
||GAME.Players[player].Unit[i].Draw.nFile == 1
||GAME.Players[player].Unit[i].Draw.nFile == 2
||GAME.Players[player].Unit[i].Draw.nFile == 3)
{
Arrays[Num][0]=i;
Arrays[Num][1]=(WORD)sqrtl((((X-GAME.Players[player].Unit[i].Draw.nX)*
(X-GAME.Players[player].Unit[i].Draw.nX))+
((Y-GAME.Players[player].Unit[i].Draw.nY)*
(Y-GAME.Players[player].Unit[i].Draw.nY))));
Num++;
//if (Num >= 4 )
if (Num >= 15 )
break;
}
}
break;
//民居
case 3:
for (i=0;i<PLAYER_UNIT_MAX;i++)
{
if (GAME.Players[player].Unit[i].nType != MAP_UNIT_TYPE_BUILDING
||GAME.Players[player].Unit[i].nLife <= 0
||GAME.Players[player].Unit[i].Task.nTaskID == JIANZAOZHONG
||GAME.Players[player].Unit[i].Task.nTaskID == SHANCHU)
continue;
if (GAME.Players[player].Unit[i].Draw.nFile == 0
||GAME.Players[player].Unit[i].Draw.nFile == 1
||GAME.Players[player].Unit[i].Draw.nFile == 23)
{
Arrays[Num][0]=i;
Arrays[Num][1]=(WORD)sqrtl((((X-GAME.Players[player].Unit[i].Draw.nX)*
(X-GAME.Players[player].Unit[i].Draw.nX))+
((Y-GAME.Players[player].Unit[i].Draw.nY)*
(Y-GAME.Players[player].Unit[i].Draw.nY))));
Num++;
//if (Num >= 4 )
if (Num >= 15 )
break;
}
}
break;
}
if (Num == 0)
return (MAP_DATA_NONE);
else
{
for (i=1;i<Num;i++)
{
if (Arrays[0][1] > Arrays[i][1])
{
Pau0=Arrays[i][0];
Pau1=Arrays[i][1];
Arrays[i][1]=Arrays[0][1];
Arrays[i][0]=Arrays[0][0];
Arrays[0][1]=Pau1;
Arrays[0][0]=Pau0;
}
}
return (GAME.Players[player].Unit[Arrays[0][0]].nID);
}
}
/////////////
// defined in CBRun.cpp
extern int RUN_nCounter;
// 隨機數的產生
// min : 最小值
// max : 最大值
inline int getrandom( int min, int max )
{
if( GAME_bNetwork == FALSE )
{
return rand() % (max + 1 - min) + min;
}
else
{
return RUN_nCounter % (max + 1 - min) + min;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -