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

📄 cbeyes.cpp

📁 这是一个游戏程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -