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

📄 cbctrl.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				CTRL_TASK_saveCmdUnit.Ex = 0x0005;
			}
			//else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 2
			else if( pUnit->Build.dwUpgrade[0] == 2
				&& GAME.Players[GAME.nMe].nTechLvl >= 4 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] >= 2 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] >= 2 )
			{	// 木材场3级,武器场3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0009;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	1:	// 帅帐2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_LIU_MAINBUILDING;
			// 基本配置
			CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			//if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 0
			if( pUnit->Build.dwUpgrade[0] == 0
				&& GAME.Players[GAME.nMe].nTechLvl >= 2 
				&& BuildPoint[GAME.nMe][MUCAICHANG].hPos == CBTRUE 
				&& BuildPoint[GAME.nMe][WUQICHANG].hPos == CBTRUE )
			{	// 当前等级是0,最高等级大于1,有木材场,有武器场
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;	//0011
			}
			//else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1
			else if( pUnit->Build.dwUpgrade[0] == 1
				&& GAME.Players[GAME.nMe].nTechLvl >= 3 
				&& BuildPoint[GAME.nMe][QIBINGSUO].hPos == CBTRUE 
				&& BuildPoint[GAME.nMe][CHEBINGSUO].hPos == CBTRUE )
			{	// 当前等级是1,最高等级大于2,有骑兵所,有车兵所
				CTRL_TASK_saveCmdUnit.Ex = 0x0005;
			}
			//else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 2
			else if( pUnit->Build.dwUpgrade[0] == 2
				&& GAME.Players[GAME.nMe].nTechLvl >= 4 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] >= 2 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] >= 2 )
			{	// 木材场3级,武器场3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0009;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	2:	// 武器库1
		case	3:	// 武器库2
			//GAME.Players[GAME.nMe].
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_WEAPONFACTORY;
			// 无作用
			CTRL_TASK_saveCmdUnit.Ex = 0x0000;
			if( GAME.Players[GAME.nMe].nTechLvl >= 4 
				&& BuildPoint[GAME.nMe][DOGFACE].hPos == CBTRUE )
			{	// 最高等级大于3,武器场3级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 0 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0001;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 1 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0002;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 2 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0004;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 1 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0010;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 2 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0020;
			}
			else if( GAME.Players[GAME.nMe].nTechLvl >= 3 
				&& BuildPoint[GAME.nMe][DOGFACE].hPos == CBTRUE )
			{	// 最高等级大于2,武器场2级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 0 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0001;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 1 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0002;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 1 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0010;
			}
			else if( GAME.Players[GAME.nMe].nTechLvl >= 2 
				&& BuildPoint[GAME.nMe][DOGFACE].hPos == CBTRUE )
			{	// 最高等级大于1,有步兵所
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 0 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0001;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_HUJIA] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	4:	// 木材场1
		case	5:	// 木材场2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_LUMBER;
			// 无作用
			CTRL_TASK_saveCmdUnit.Ex = 0x0000;
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] == 0
				&& GAME.Players[GAME.nMe].nTechLvl >= 2 
				&& BuildPoint[GAME.nMe][BOW].hPos == CBTRUE )
			{	// 当前等级是0,最高等级大于1,有弓兵所
				CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] == 1 
				&& GAME.Players[GAME.nMe].nTechLvl >= 3 )
			{	// 当前等级是1,最高等级大于2,木材场2级
				CTRL_TASK_saveCmdUnit.Ex = 0x0002;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] == 2 
				&& GAME.Players[GAME.nMe].nTechLvl >= 4 )
			{	// 当前等级是2,最高等级大于3,木材场3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0004;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	6:	// 骑兵所1
		case	7:	// 骑兵所2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_KNIGHTSCHOOL;
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 0 )
			{	// 无作用
				CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1 )
			{	// 主帅帐2级
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 2 )
			{	// 主帅帐3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0007;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	8:	// 车兵所1
		case	9:	// 车兵所2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_VEHICLEMANSCHOOL;
			// 主帅帐1级
			CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 2 )
			{	// 主帅帐3级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_TOUSHICHE] == 0 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0003;
				else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_TOUSHICHE] == 1 )
					CTRL_TASK_saveCmdUnit.Ex = 0x0005;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 1
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_TOUSHICHE] == 0 )
			{	// 主帅帐2级
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	10:	// 粮仓1
		case	11: // 粮仓1
			break;
		case	12:	// 步兵所1
		case	13: // 步兵所2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_FOOTMANSCHOOL;
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 0 )
			{	// 无作用
				CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1 )
			{	// 主帅帐2级
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 2 )
			{	// 主帅帐3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0007;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 3 )
			{	// 主帅帐4级
				CTRL_TASK_saveCmdUnit.Ex = 0x000F;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	14:	// 弓兵所1
		case	15: // 弓兵所2
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_BOWMANSCHOOL;
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 0 )
			{	// 无作用
				CTRL_TASK_saveCmdUnit.Ex = 0x0001;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1 )
			{	// 主帅帐2级
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 2 )
			{	// 主帅帐3级
				CTRL_TASK_saveCmdUnit.Ex = 0x0007;
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 3 )
			{	// 主帅帐4级
				CTRL_TASK_saveCmdUnit.Ex = 0x000F;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	16: // 城门1
		case	17:	// 城门2
		case	18: // 箭楼1
		case	19:	// 箭楼2
			break;
		case	20: // 船坞
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SHIPYARD;
			// 主帅帐1级
			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 2 )
				CTRL_TASK_saveCmdUnit.Ex = 0x0007;
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1 )
				CTRL_TASK_saveCmdUnit.Ex = 0x0003;
			else
				CTRL_TASK_saveCmdUnit.Ex = 0x0001;

			if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 2 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] == 3 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] == 3 )
			{	// 主帅帐3级,木材场3级,武器场3级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN1] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN2] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0010;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN3] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0020;
				if( GAME.nID > 17 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0040;	// 是曹操,有连船
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 2 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] >= 2 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] >= 2 )
			{	// 主帅帐3级,木材场2级,武器场2级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN1] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN3] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0020;
				if( GAME.nID > 17 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0040;	// 是曹操,有连船
			}
			else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] >= 1
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_GONGJIAN] >= 1 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_BINGQI] >= 1 
				&& GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN1] >= 0 )
			{	// 主帅帐2级,木材场2级,武器场2级
				if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_CHUAN1] == 0 )
					CTRL_TASK_saveCmdUnit.Ex |= 0x0008;
			}
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	21: // 特殊
			break;
		case	22: // 铁矿
			break;
		case	23: // 钱庄
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SHOP;
			CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			break;
		case	24: // 大旗
			break;
	}
}

/*
// 寻找某个单元是否已经在在焦点选中数组中了
BOOL CTRL_AssembleFindDuplicate( WORD nID )
{
	for ( int i=0; i<CTRL_nHitCouner; i++ )
	{
		if( CTRL_hitSrc[i].nID == nID )
			return TRUE;
	}
	return FALSE;
}
*/

// 检测鼠标拖出的框内是否包含单元(命令主体)
// 只设置CTRL_hitSrc的内容nID, nLevel
// 检测步骤:
// 1:是否是自己的部队
// 2:该部队是否还活着
// 3:如果选中将领,则该将领的所有下属士兵都被选中
// 4:如果有未整编的部队,则只有未整编的部队被选中
//		4.1:如果是工人,只有工人被选中
//		4.2:如果是船,则只有船被选中
//		4.3:如果是一般士兵,只有士兵被选中
// 5:如果都是整编的部队,则被选中
// 6:如果是敌人的部队,则被选中
// 7:如果是建筑,则最后一个建筑被选中
// detect if mouse dragging rectangle contains units
// prcHit		:	rectangle mouse dragging
// wParam		:	当响应时,用来查看是否Ctrl或Shift键被按下了
// return value	:	TRUE if hit something
BOOL CTRL_TASK_AssembleSrc( CONST RECT *prcHit, WORD wParam )
{
	int i, j;
	WORD codeUEx;
	MOUSE_HITRESULT_STRUCT hit;

	// 当检测到将领时,此指针有效,保留该将领的指针
	struct UNIT_STRUCT *pGen = NULL;

	// 当检测到第一个建筑时,保存该建筑
	WORD codeBuild = MAP_DATA_NONE;

	// 当检测到某个士兵属于某个将领时,保存该将领的ID
	WORD codeGen = MAP_DATA_NONE;
	// 当检测到某个士兵属于某个将领时,保存该士兵自己的ID
	WORD sArrayY[CTRL_TASK_LIST_MAX-1];
	// 有归属的士兵计数器
	int nYCounter = 0;

	// 当检测到某个士兵不属于任何将领时,保存该士兵自己的ID
	WORD sArrayN[CTRL_TASK_LIST_MAX-1];
	// 无归属的士兵计数器
	int nNCounter = 0;

	// 当检测到某个工人不属于任何将领时,保存该工人自己的ID
	WORD sArrayNW[CTRL_TASK_LIST_MAX-1];
	// 无归属的士兵计数器
	int nNWCounter = 0;

	// 当检测到我方船只时,保存该船只的ID
	WORD sArrayNS[CTRL_TASK_LIST_MAX-1];
	// 船只计数器
	int nNSCounter = 0;

	// 当选中敌人的单元时,为真
	BOOL bEnemy = FALSE;
	// 只能有一方敌人被选中
	int	nEPlayer = -1;
	// 当选中敌人的士兵时,保存该士兵ID
	WORD sArrayE[CTRL_TASK_LIST_MAX-1];
	// 敌人士兵的计数器
	int nECounter = 0;

	if( IsRectEmpty( prcHit ) && prcHit->left == 0 )
		return FALSE;
	
	// if no rectangle, do it with point
	// 检测鼠标点击某一点的效果
	if( IsRectEmpty( prcHit ) )
	{
		POINT pt;
		pt.x = prcHit->left;
		pt.y = prcHit->top;
		
		if( MOUSE_HitTestU( pt, &hit ) )
		{
			// set single source object
			Assert( hit.nType == MOUSE_HITRESULT_UNIT );

			// set source objects
			codeUEx = hit.wCode;
			Assert( codeUEx != MAP_DATA_NONE );
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );

			Assert( pUnit );
			// 1:是否是自己的单元,只有自己人才能被选中
			// 2:单元还活着吗?因为使用了MOUSE_HitTestU(),单元一定活着
			// 在MOUSE_HitTestU()中,对此进行了判定
			if( !EYE_IfUnitIsBuild( pUnit ) )
			{	// 如果是士兵,则记下
				if( wParam == 4 && pUnit->Draw.bUpdate == TRUE )
				{
					// shift键按下,而且重了,do nothing
				}
				else if( EYE_IfUnitIsGen( pUnit ) )
				{	// 记下将领
					pGen = pUnit;	//break;
				}
				else //if( EYE_IfUnitIsSoldier( pUnit ) )
				{	// 记下士兵
					if( EYE_IfSheIsMine( pUnit ) )
							bEnemy = FALSE;
					else	bEnemy = TRUE;
					if( bEnemy == FALSE )
					{
						if( pUnit->Soldier.nGenID != MAP_DATA_NONE )
						{
							sArrayY[nYCounter] = codeUEx;
							nYCounter++;
						}
						else if( EYE_IfUnitIsWorker( pUnit ) )
						{
							sArrayNW[nNWCounter] = codeUEx;
							nNWCounter++;
						}
						else if( EYE_IfUnitIsShip( pUnit ) )
						{
							sArrayNS[nNSCounter] = codeUEx;
							nNSCounter++;
						}
						else
						{
							sArrayN[nNCounter] = codeUEx;
							nNCounter++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -