📄 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
//传出参数:
//失败:MAP_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 + -