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

📄 cbctrl.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						}
					}
					else
					{
						if( nEPlayer == -1 )
						{
							nEPlayer = pUnit->Draw.nPlayer;
						}
						if( nEPlayer == pUnit->Draw.nPlayer )
						{
							sArrayE[nECounter] = codeUEx;
							nECounter ++;
						}
					}
				}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
			}// End of if( !EYE_IfUnitIsBuild( pUnit ) )
			else
			{	// 如果是建筑,则记下
				codeBuild = codeUEx;
			}// End of if( EYE_IfUnitIsSoldier( pUnit ) )
		}// End of if( MOUSE_HitTestU( pt, &hit ) )
	}// End of if( IsRectEmpty( prcHit ) )
	else	// do with rectangle
	{
		for( j=DRAW_rcScreen.top; j<DRAW_rcScreen.bottom; j++ )
		for( i=DRAW_rcScreen.left; i<DRAW_rcScreen.right; i++ )
		{
			// 数量超了
			if( nYCounter >= CTRL_TASK_LIST_MAX-1 ) break;
			if( nNCounter >= CTRL_TASK_LIST_MAX-1 ) break;

			codeUEx = MAP_GetUnitDataEx( i, j );
			if( codeUEx == MAP_DATA_NONE )	continue;
			struct CTRL_FRAME_STRUCT stctCF;
			if( !MAP_GetUnitFrameData( i, j, &stctCF, FALSE ) )
				continue;
			RECT rcUnit = MAP_GetUnitRect( DRAW_ptScreenOffset, &stctCF );
			if( IntersectRect( &rcUnit, &rcUnit, prcHit ) )
			{
				// set source objects
				Assert( codeUEx != MAP_DATA_NONE );
				struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
				Assert( pUnit );
				// 0: 如果被阴影挡住,则不算
				// 1:是否是自己的单元,只有自己人才能被选中
				// 2:单元还活着吗?
				if( SHADOW_IfEnabled() )
				{
					WORD codeR = MAP_GetRegionData( i, j );
					struct MAP_REGION_CODE_STRUCT stctR;
					MAP_RegionDeCode( codeR, &stctR );
					if( stctR.nShadow == MAP_SHADOW_NONE || stctR.nShadowEx == 1 )
					{
						continue;
					}
				}
				if( !EYE_IfUnitIsDead( pUnit ) )
				{	
					if( !EYE_IfUnitIsBuild( pUnit ) )
					{	
						if( wParam == 4 && pUnit->Draw.bUpdate == TRUE )
						{
							// shift键按下,而且重了,do nothing
						}
						// 如果是士兵,则记下
						else if( EYE_IfUnitIsGen( pUnit ) )
						{	// 记下将领
							if( !pGen || 
								(pGen && !EYE_IfSheIsMine( pGen ) ) )
							{	// 原来没有将,或不是自己的将
								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++;
								}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
							}
							else
							{
								if( nEPlayer == -1 )
								{
									nEPlayer = pUnit->Draw.nPlayer;
								}
								if( nEPlayer == pUnit->Draw.nPlayer )
								{
									sArrayE[nECounter] = codeUEx;
									nECounter ++;
								}
							}
						}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
					}// End of if( !EYE_IfUnitIsBuild( pUnit ) )
					else
					{	// 如果是建筑,则记下
						codeBuild = codeUEx;
					}
				}// End of if( pUnit->Draw.nPlayer == GAME.nMe 
			}// End of if( IntersectRect( &rcUnit, &rcUnit, prcHit ) )
		}// End of for()
	}// End of if( IsRectEmpty( prcHit ) )

	// 热键的特殊处理
	if( pGen != NULL 
		|| nNWCounter > 0
		|| nNSCounter > 0
		|| nNCounter > 0
		|| nYCounter > 0
		|| codeBuild != MAP_DATA_NONE
		|| nECounter > 0 )
	{
		BOOL bRefresh = TRUE;
		if( wParam == 8
			&& pGen == NULL 
			&& nNWCounter == 0 
			&& nNSCounter == 0
			&& nNCounter == 0
			&& nYCounter > 0 
			)	// Ctrl
		{	// 遇到Ctrl键,把该士兵所属的整个部队选中
			Assert( sArrayY[0] != MAP_DATA_NONE );
			struct UNIT_STRUCT *pU = MAP_GetUnit( sArrayY[0] );
			pGen = EYE_GetGeneral( pU );
			Assert( pGen );
			/*
			Assert( sArrayY[0] != MAP_DATA_NONE );
			struct UNIT_STRUCT *pU = MAP_GetUnit( sArrayY[0] );
			Assert( pU );
			Assert( EYE_IfUnitIsSoldier( pU ) );
			pU = MAP_GetUnit( pU->Soldier.nGenID );
			Assert( pU );
			Assert( EYE_IfUnitIsGen( pU ) );
			pGen = pU;
			*/
		}
		else if( wParam == 4
			&& pGen == NULL 
			&& CTRL_nHitCounter > 0
			)	// Shift,遇到Shift键,把选中的部队添加到已有的部队中
		{
			Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
			struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
			if( EYE_IfUnitIsSoldier( pU ) )
			{
				if( pU->Soldier.nGenID == MAP_DATA_NONE )
				{	// 散兵
					if( EYE_IfUnitIsWorker( pU ) 
						&& nNWCounter > 0 )
					{	// 散工人
						bRefresh = FALSE;
					}
					else if( nNCounter > 0 )
					{	// 散士兵
						nNWCounter = 0;
						bRefresh = FALSE;
					}
				}
				else if( nYCounter > 0 )
				{	// 有将领的士兵
					nNWCounter = 0;
					nNCounter = 0;
					bRefresh = FALSE;
				}
			}
		}

		// 必要时才清除命令组
		if( bRefresh == TRUE )
			// clear Task assembling parameters
			CTRL_TASK_ClearAssembleSrc( TRUE );
	}
	else
	{	// 没有有效的单元被选中
		CTRL_TASK_ClearAssembleDest();
		return FALSE;
	}

	// initialize command units
	// 必须把清除命令组放在这里
	CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_NONE;
	CTRL_TASK_saveCmdUnit.Ex = 0xFFFFFFFF;
	CTRL_TASK_saveCmdUnit.Busy = 0;

	// 3:如果选中将领,则该将领的所有下属士兵都被选中
	// 只有自己方的将领被选中,或没有其他我方士兵被选中时有效
	if( pGen != NULL 
		&& ( EYE_IfSheIsMine( pGen )
			|| ( !EYE_IfSheIsMine(pGen) 
				&& nNWCounter == 0 
				&& nNCounter == 0 
				&& nYCounter == 0 ) ) )
	{
		Assert( EYE_IfUnitIsGen( pGen ) );
		//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
		CTRL_hitSrc[CTRL_nHitCounter].nID = pGen->nID;
		CTRL_nHitCounter++;
		for( i = 0; i< GENERAL_TROOP_MAX; i++ )
		{
			if( pGen->Gen.wTroop[i] != MAP_DATA_NONE )
			{
				//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
				CTRL_hitSrc[CTRL_nHitCounter].nID = pGen->Gen.wTroop[i];
				CTRL_nHitCounter++;
			}
		}

		// 设置将领信息
		struct	PROMPT_BLOCK	temp;
		temp.PromptBlockId = PROMPT_UNIT;
		DATA_GENERAL_STRUCT *pGenData = &DATA_Lib.Gen[pGen->Gen.nID];
		temp.PromptBlockUnion.Unit.GeneralBitmapId=pGen->Gen.nID;				// 图片号
		temp.PromptBlockUnion.Unit.GeneralPower=EYE_GetWuLi( pGen->Gen.nID )*100/120;
		temp.PromptBlockUnion.Unit.GeneralBlood=
			pGen->nLife*100/EYE_GetFullLife( pGen->Draw.nPlayer, pGen->Draw.nFile );			// 生命,将领生命值是200
		strcpy( temp.PromptBlockUnion.Unit.GeneralName, pGenData->strName );	// 名字

		// 级别
		EYE_GetLevelName( pGen->Gen.nID, temp.PromptBlockUnion.Unit.Office ); // 级别

		temp.PromptBlockUnion.Unit.Experience = pGenData->nJingYan;		// 经验
		temp.PromptBlockUnion.Unit.Ruse = pGenData->nMouLue;			// 谋略
		temp.PromptBlockUnion.Unit.UnitMorale = EYE_GetMorale( pGen );		// 士气
		temp.PromptBlockUnion.Unit.UnitLineUp = pGen->Gen.nLineUp;		// 阵型
		// 得到士兵数
		temp.PromptBlockUnion.Unit.NumberOfSolider = CTRL_GetFocusSoldierNumber();

		FACE_ShowPromptBlock( temp );

		if( EYE_IfSheIsMine( pGen ) )
		{
			// sound effect,对自己人设置音效
			CTRL_SOUND_select( pGen->Draw.nFile );

			// 对自己的工人部队设置命令组
			// 为取消命令组
			if( pGen->Status.bIRQ == TRUE )
			{
				CTRL_TASK_saveCmdUnit.Busy = 2;	// 临时等于2
			}
			if( EYE_IfUnitIsWorkerGen( pGen ) )
			{	// 根据建筑类型设置建造城内或城外建筑
				if( GAME.Players[GAME.nMe].nBuildType == 0 )
					CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_CHAO_PEASANT;
				else
					CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_LIU_PEASANT;
				CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			}
			// 对自己的战斗部队设置攻击命令组
			else
			{
				CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_FIGHTUNIT;
				//CTRL_TASK_saveCmdUnit.Ex = 0x00E3;
				CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			}
		}
	}
	// 判断是否有士兵被选中
	else if( nNWCounter > 0 || nNCounter > 0 
		|| nYCounter > 0 || nECounter > 0 
		|| nNSCounter > 0 )
	{
		// 4:如果有未整编的部队,则只有未整编的部队被选中
		// 4.1:如果是工人,只有工人被选中
		if( nNWCounter > 0 )
		{
			for( i=0; i< nNWCounter; i++ )
			{
				//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
				CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayNW[i];
//				CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_WGEN;	// 工人将领
				CTRL_nHitCounter++;
			}
			// 对未整编的士兵设置命令组
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
			// 不能回送
			CTRL_TASK_saveCmdUnit.Ex = 0x000F;

			// 设置回送命令
			if( nNWCounter == 1 )
			{
				struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
				Assert( pU );
				if( EYE_IfUnitIsWorker( pU ) )
				{
					if( pU->Soldier.nResType != QXZIYUAN 
						&& pU->Soldier.nResource > 0 )
					{	// 有回送命令
						CTRL_TASK_saveCmdUnit.Ex |= 0x0010;
					}
				}
			}
		}
		//4.2:如果是船,则只有船被选中
		else if( nNSCounter > 0 )
		{
			for( i=0; i< nNSCounter; i++ )
			{
				CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayNS[i];
				CTRL_nHitCounter++;
			}

			// 对未整编的船设置命令组
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;

			// 没有运载命令,不能回送
			CTRL_TASK_saveCmdUnit.Ex = 0x000F;
		}
		// 4.3:如果是一般士兵,只有士兵被选中
		else if( nNCounter > 0 )
		{
			for( i=0; i< nNCounter; i++ )
			{
				//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
				CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayN[i];
//				CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_GEN;	// 战斗部队将领
				CTRL_nHitCounter++;
			}
			// 对未整编的士兵设置命令组
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			// 不能回送
			CTRL_TASK_saveCmdUnit.Ex = 0x000F;
		}
		// 5:如果都是整编的部队,则被选中
		else if( nYCounter > 0 )
		{
			for( i=0; i< nYCounter; i++ )
			{
				//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
				CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayY[i];
//				CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_GEN;	// 战斗部队将领
				CTRL_nHitCounter++;
			}

			// 对已整编的士兵设置命令组
			CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_REGIMENTSOLDIER;
			//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
			// 不能回送
			CTRL_TASK_saveCmdUnit.Ex = 0x0007;

			// 设置回送命令
			if( nYCounter == 1 )
			{
				struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
				Assert( pU );
				if( EYE_IfUnitIsWorker( pU ) )
				{
					if( pU->Soldier.nResType != QXZIYUAN 
						&& pU->Soldier.nResource > 0 )
					{	// 有回送命令
						CTRL_TASK_saveCmdUnit.Ex |= 0x000F;
					}
				}
			}
		}
		// 6:如果是敌人的部队,则被选中
		else if( nECounter > 0 )
		{
			for( i=0; i< nECounter; i++ )
			{
				//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
				CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayE[i];

⌨️ 快捷键说明

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