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

📄 cbctrl.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				CTRL_nHitCounter++;
			}
		}

		// 设置显示信息栏
		if( CTRL_nHitCounter == 1 )
		{	
			// 单人
			Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );
			Assert( pUnit );
			Assert( EYE_IfUnitIsSoldier( pUnit ) );
			struct DATA_UNIT_STRUCT *pUnitData = &DATA_Lib.Unit[pUnit->Draw.nFile];
			
			// sound effect
			if( nECounter == 0 )	// 不是敌人
				CTRL_SOUND_select( pUnit->Draw.nFile );
		
			// 如果是运输船,更改命令组
			if( nECounter == 0 && EYE_IfUnitIsTransport( pUnit ) )
			{
				CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_TRANSPORTSHIP;
				if( pUnit->Soldier.bOnBoard == TRUE )
				{	// 有卸载命令
					CTRL_TASK_saveCmdUnit.Ex = 0x0003;
				}
				else
				{
					CTRL_TASK_saveCmdUnit.Ex = 0x0001;
				}

				// 设置信息栏,运输船
				struct	PROMPT_BLOCK	temp;
				temp.PromptBlockId = PROMPT_TRANSPORT_SHIP;
				temp.PromptBlockUnion.Transport_Ship.SoldierBitmapId = pUnit->Draw.nFile;
				strcpy( temp.PromptBlockUnion.Transport_Ship.SoldierKind, DATA_Lib.Unit[pUnit->Draw.nFile].strName);			// the kind of this soldier
				temp.PromptBlockUnion.Transport_Ship.SoldierPower = 
					pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);				// power -->体力
				temp.PromptBlockUnion.Transport_Ship.NumberOfUnit = pUnit->Soldier.nOnBoard;
				temp.PromptBlockUnion.Transport_Ship.NumberOfSolider = pUnit->Soldier.nOnBoardSoldier;
				FACE_ShowPromptBlock( temp );
			}
			else
			{
				// 设置信息栏,单人
				struct	PROMPT_BLOCK	temp;
				temp.PromptBlockId = PROMPT_SOLDIER_SINGLE;
				temp.PromptBlockUnion.Soldier_Single.SoldierBitmapId = pUnit->Draw.nFile;
				strcpy( temp.PromptBlockUnion.Soldier_Single.SoldierKind, pUnitData->strName );			// the kind of this soldier
				temp.PromptBlockUnion.Soldier_Single.SoldierPower = 
					pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);				// power -->体力
				if( EYE_IfUnitIsSoldier( pUnit ) 
					&& pUnit->Soldier.nGenID != MAP_DATA_NONE )
				{
					struct UNIT_STRUCT *pUG = MAP_GetUnit( pUnit->Soldier.nGenID );
					Assert( pUG );
					Assert( EYE_IfUnitIsGen( pUG ) );
					strcpy( temp.PromptBlockUnion.Soldier_Single.SoldierAscroption, DATA_Lib.Gen[pUG->Gen.nID].strName );		// ascroption --> 归属
				}
				else temp.PromptBlockUnion.Soldier_Single.SoldierAscroption[0] = 0;
				if( pUnitData->nFightRange == 1 )
				{
//					temp.PromptBlockUnion.Soldier_Single.SoldierAttack = pUnitData->nNearAttack;				// attack -->攻击力
//					temp.PromptBlockUnion.Soldier_Single.SoldierDefence = pUnitData->nNearDefend;				// defence -->防御力
					temp.PromptBlockUnion.Soldier_Single.SoldierAttack = EYE_GetNearAttack( pUnit );				// attack -->攻击力
					temp.PromptBlockUnion.Soldier_Single.SoldierDefence = EYE_GetNearDefend( pUnit );				// defence -->防御力
				}
				else
				{
//					temp.PromptBlockUnion.Soldier_Single.SoldierAttack = pUnitData->nFarAttack;				// attack -->攻击力
//					temp.PromptBlockUnion.Soldier_Single.SoldierDefence = pUnitData->nFarDefend;			// defence -->防御力
					temp.PromptBlockUnion.Soldier_Single.SoldierAttack = EYE_GetFarAttack( pUnit );				// attack -->攻击力
					temp.PromptBlockUnion.Soldier_Single.SoldierDefence = EYE_GetFarDefend( pUnit );			// defence -->防御力
				}
				temp.PromptBlockUnion.Soldier_Single.SoldierCarry = pUnitData->nFightRange;					// carry -->射程
				//temp.PromptBlockUnion.Soldier_Single.SoldierEyesight = pUnitData->nViewRange;				// eyesight -->视野
				temp.PromptBlockUnion.Soldier_Single.SoldierEyesight = EYE_GetViewRange( &pUnit->Draw );	// eyesight -->视野
				FACE_ShowPromptBlock( temp );
			}
		}
		else
		{	// 多人
			// 设置信息栏,多人
			struct	PROMPT_BLOCK	temp;
			temp.PromptBlockId = PROMPT_SOLDIER_MORE;
			temp.PromptBlockUnion.Soldier_More.UnitNumber = CTRL_nHitCounter;		// 一共有几个单位
			// 得到士兵数
			temp.PromptBlockUnion.Soldier_More.Amount = CTRL_GetFocusSoldierNumber();			// 几个单位的总人数

			FACE_ShowPromptBlock( temp );
		}
	}
	// 7:如果是建筑,则最后一个建筑被选中
	else if( codeBuild != MAP_DATA_NONE )
	{
		//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
		CTRL_hitSrc[CTRL_nHitCounter].nID = codeBuild;
		CTRL_nHitCounter++;

		// 给建筑设置命令组
		Assert( codeBuild != MAP_DATA_NONE );
		struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeBuild );
		Assert( pUnit );
		Assert( EYE_IfUnitIsBuild( pUnit ) );
		if( EYE_IfSheIsMine( pUnit )		// 自己的建筑
			|| pUnit->Draw.nFile == 22 )	// 或铁矿
		{
			// sound effect
			CTRL_SOUND_select( pUnit->Draw.nFile );
		}

		if( EYE_IfSheIsMine( pUnit ) )
		{
			// 为取消命令组
			if( pUnit->Status.bIRQ == TRUE )
			{
				CTRL_TASK_saveCmdUnit.Busy = 1;
			}

			// 设置建筑命令组
			// 更新CTRL_TASK_saveCmdUnit.Cmd和CTRL_TASK_saveCmdUnit.Ex
			//CTRL_TASK_BuildCommand( pUnit->Draw.nFile );
			CTRL_TASK_BuildCommand( pUnit );
		
			// 设置信息
			if( CTRL_TASK_saveCmdUnit.Busy != 1)
			{	// 建筑闲置
				struct	PROMPT_BLOCK	temp;
				temp.PromptBlockId = PROMPT_CONSTRUCTION_IDLESS;	
				temp.PromptBlockUnion.Construction_Idless.ConstructionBitmapId = pUnit->Draw.nFile;	// 自己的文件号
				strcpy( temp.PromptBlockUnion.Construction_Idless.ConstructionName, 
						DATA_Lib.Unit[pUnit->Draw.nFile].strName );		// 自己的名字
				if( pUnit->Draw.nFile == 22 )	// 铁矿
					temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.nResource;	// 资源的储量
				else
					temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.dwUpgrade[0];	// 自己的级别
				temp.PromptBlockUnion.Construction_Idless.Stone = 
					pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile );	// 自己的生命值
				FACE_ShowPromptBlock( temp );
			}
			else
			{
				if( pUnit->Status.nTaskID == JIANZAOZHONG )	// 建造中
				{
					struct	PROMPT_BLOCK	temp;
					temp.PromptBlockId = PROMPT_CONSTRUCTION_BUILDING;
					temp.PromptBlockUnion.Construction_Building.ConstructionBitmapId = pUnit->Draw.nFile;
					strcpy( temp.PromptBlockUnion.Construction_Building.ConstructionName, 
							DATA_Lib.Unit[pUnit->Draw.nFile].strName );
					temp.PromptBlockUnion.Construction_Building.ConstructionGrade = pUnit->Build.dwUpgrade[0];
					temp.PromptBlockUnion.Construction_Building.Stone = 
						pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);
					FACE_ShowPromptBlock( temp );
				}
				else if( pUnit->Status.nTaskID == SHENGCHAN )	// 生产中
				{
					struct	PROMPT_BLOCK	temp;	// 建筑状态是工作
					temp.PromptBlockId = PROMPT_CONSTRUCTION_WORKING;
					temp.PromptBlockUnion.Construction_Working.ConstructionBitmapId = pUnit->Draw.nFile;	// 自己的文件号
					temp.PromptBlockUnion.Construction_Working.ConstructionGrade = pUnit->Build.dwUpgrade[0];	//???升级的级别
					temp.PromptBlockUnion.Construction_Working.Stone = 
						pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);	// 自己的生命值
					struct MAP_UNIT_CODE_STRUCT stctU;
					MAP_UnitDeCode( pUnit->Status.nTaskIDEx2, &stctU ); 
					temp.PromptBlockUnion.Construction_Working.ProductBitmapId = stctU.nFile;	// 被生产的士兵的文件号
					strcpy( temp.PromptBlockUnion.Construction_Working.ConstructionName, 
						DATA_Lib.Unit[pUnit->Draw.nFile].strName );						// 自己的名字
					temp.PromptBlockUnion.Construction_Working.Percent = pUnit->nCounter*100/pUnit->Status.nParam4;	// 完成度
					FACE_ShowPromptBlock( temp );
				}
				else if( pUnit->Status.nTaskID == TISHENG )	// 提升中,升级中
				{
					struct	PROMPT_BLOCK	temp;	// 建筑状态是工作
					temp.PromptBlockId = PROMPT_CONSTRUCTION_WORKING;
					temp.PromptBlockUnion.Construction_Working.ConstructionBitmapId = pUnit->Draw.nFile;	// 自己的文件号
					temp.PromptBlockUnion.Construction_Working.ConstructionGrade = pUnit->Build.dwUpgrade[0];	//???升级的级别
					temp.PromptBlockUnion.Construction_Working.Stone = 
						pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);;	// 自己的生命值
					struct MAP_UNIT_CODE_STRUCT stctU;
					MAP_UnitDeCode( pUnit->Status.nTaskIDEx2, &stctU ); 
					temp.PromptBlockUnion.Construction_Working.ProductBitmapId = pUnit->Status.nTaskIDEx2;	// 升级的消息ID
					strcpy( temp.PromptBlockUnion.Construction_Working.ConstructionName, 
						DATA_Lib.Unit[pUnit->Draw.nFile].strName );						// 自己的名字
					temp.PromptBlockUnion.Construction_Working.Percent = pUnit->nCounter*100/RUN_TIMEDELAY_UPGRADE;	// 完成度
					FACE_ShowPromptBlock( temp );
				}
			}
		}// End of if( EYE_IfSheIsMine( pUnit ) )
		else
		{	// 给敌人单元设置信息栏,总是空闲
			struct	PROMPT_BLOCK	temp;
			temp.PromptBlockId = PROMPT_CONSTRUCTION_IDLESS;	
			temp.PromptBlockUnion.Construction_Idless.ConstructionBitmapId = pUnit->Draw.nFile;	// 自己的文件号
			strcpy( temp.PromptBlockUnion.Construction_Idless.ConstructionName, 
					DATA_Lib.Unit[pUnit->Draw.nFile].strName );		// 自己的名字
			if( pUnit->Draw.nFile == 22 )	// 铁矿
				temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.nResource;	// 资源的储量
			else
				temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.dwUpgrade[0];	// 自己的级别
			temp.PromptBlockUnion.Construction_Idless.Stone = 
				pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile );	// 自己的生命值
			FACE_ShowPromptBlock( temp );
		}
	}

	// 设置命令组
	// 一定选中了某个单元,更新命令组
	if( CTRL_bDebugCommand == TRUE )
		CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;	// 调试用
	if( CTRL_TASK_saveCmdUnit.Busy == 1 )
	{
		FACE_ShowCommandUnit( COMMANDUNIT_CANCEL, 0xFFFF ); // clear command sets
	}
	else if( CTRL_TASK_saveCmdUnit.Busy == 2 )	// 临时等于2
	{
		CTRL_TASK_saveCmdUnit.Busy = 1;
		FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
	}
	else
	{
		FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
	}

//	if( CTRL_TASK_saveCmdUnit.Cmd != COMMANDUNIT_NONE
//		|| CTRL_TASK_saveCmdUnit.Busy == 1)
		// 清除CTRL_hitDest的内容,设置命令组
	CTRL_TASK_ClearAssembleDest();
//	else
//	{	// 有的单元没有命令
//		FACE_ClearCommandUnitArea();
//	}

	// set focus to units
	// 给被选中的单元设置焦点状态
	if( DRAW_BLINK_nID != MAP_DATA_NONE )
	{
		struct UNIT_STRUCT *pU = MAP_GetUnit( DRAW_BLINK_nID );
		Assert( pU );
		pU->Draw.bUpdate = FALSE;	// 取消原来的闪烁
	}
	DRAW_BLINK_nID = MAP_DATA_NONE;	// 屏蔽闪烁效果
	for( i=0; i< CTRL_nHitCounter; i++ )
	{
		Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
		struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[i].nID );
		Assert( pUnit );
		if( EYE_IfSheIsMine( pUnit ) )
			pUnit->Draw.bUpdate = 1;
		else if( EYE_PlayerIsAllied( GAME.nMe, pUnit->Draw.nPlayer ) )
		{
			pUnit->Draw.bUpdate = 3;	// 同盟,黄色
		}
		else
		{
			pUnit->Draw.bUpdate = 2;	// 敌人,红色
		}
	}

	return TRUE;
}

void CTRL_TASK_WorkerCommand( DWORD *pnEx, DWORD *pnExx )
{
	// 初始为所有的
	DWORD EX=0xFFFF, EXX=0xFFFF;
	if( BuildPoint[GAME.nMe][MAINBATTALION].hPos == CBNULL )
	{	// 没有主帅帐,不能造钱庄
		EX &= (~0x0010);	
	}
	if( BuildPoint[GAME.nMe][LIANGCANG].hPos == CBNULL )
	{	// 没有粮仓,不能造步兵所,弓兵所,车兵所,船坞,骑兵所
		EX &= (~0x0020);
		EX &= (~0x0080);
		EXX &= (~0x0001);
		EXX &= (~0x0002);
		EXX &= (~0x0004);
	}
	if( BuildPoint[GAME.nMe][MUCAICHANG].hPos == CBNULL )
	{	// 没有木材场,不能造箭楼,弓兵所,车兵所,船坞,城门
		EX &= (~0x0040);
		EX &= (~0x0080);
		EXX &= (~0x0001);
		EXX &= (~0x0002);
		EXX &= (~0x0010);
	}
	if( BuildPoint[GAME.nMe][WUQICHANG].hPos == CBNULL )
	{	// 没有武器场,不能造车兵所,骑兵所
		EXX &= (~0x0001);
		EXX &= (~0x0004);
	}
	if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] < 1 )
	{	// 主帅帐没有2级,不能造车兵所,船坞
		EXX &= (~0x0001);
		EXX &= (~0x0002);
	}

	// 附加:永远不能建造城门,不要取消键
	EXX &= (~0x0010);
	EXX &= (~0x0040);
	
	// Debug赋值
	if( CTRL_bDebugCommand == TRUE )
	{
		EX = 0xFFFF; EXX = 0xFFFF;
	}
	*pnEx = EX, *pnExx = EXX;
}

// 得到阵型命令组
void CTRL_TASK_LineUpCommand( DWORD *pnEx, DWORD *pnExx )
{
	Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
	struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
	Assert( pU );
	Assert( EYE_IfUnitIsGen( pU ) );
	Assert( DATA_Lib.Gen[pU->Gen.nID].nLevel<10 );

	int nLineUp[10] = {0x07, 0x07, 0x07, 0x3F, 0x3F, 0xFF, 0x01FF, 0x01FF, 0x01FF, 0x01FF};
	int nLineUpEx[10] = {0,0,0,0,0,0,0x103, 0x103, 0x103, 0x103};

	// debug
//	DATA_Lib.Gen[pU->Gen.nID].nLevel=9;

	*pnEx = nLineUp[DATA_Lib.Gen[pU->Gen.nID].nLevel];
	*pnExx = nLineUpEx[DATA_Lib.Gen[pU->Gen.nID].nLevel];

	// Debug赋值
	if( CTRL_bDebugCommand == TRUE )
	{
		*pnEx = 0xFFFF; *pnExx = 0xFFFF;
	}
}

// 得到计谋组
void CTRL_TASK_StrategemCommand( DWORD *pnEx, DWORD *pnExx )
{
	Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
	struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
	Assert( pU );
	Assert( EYE_IfUnitIsGen( pU ) );
	Assert( DATA_Lib.Gen[pU->Gen.nID].nLevel<10 );

	int nStrategy[10] = {0x00, 0x01, 0x0181, 0x01C1, 0x01C9, 0x01CF, 0x01EF, 0x01FF, 0x01FF, 0x01FF};

	// debug
//	DATA_Lib.Gen[pU->Gen.nID].nLevel = 6;

	*pnEx = nStrategy[DATA_Lib.Gen[pU->Gen.nID].nLevel];
	*pnExx = 0;

	// Debug赋值
	if( CTRL_bDebugCommand == TRUE )
	{
		*pnEx = 0xFFFF; *pnExx = 0xFFFF;
	}
}

// 检测鼠标发出的命令
// 只设置CTRL_hitDest的内容nTaskID, nTaskIDEx, (nParam1)
// detect command message, set it and its attributes
// dwMessage	:	message ID
// return value	:	TRUE if detect it, and it is valid
BOOL CTRL_TASK_AssembleCmd( DWORD dwMessage, UINT lParam )
{
	// if no source object of TASK exists, exit
	if( CTRL_nHitCounter == 0 )	return FALSE;

	CTRL_TASK_ClearAssembleDest();

// only for control command message
	if( dwMessage == BUTTON_CANCEL )
	{	// 取消
		if( BUILD_IfEnable() )
		{	// 寻找建造位置的时候
			// reset command unit array
			FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
			BUILD_Enable( FALSE );
		}
		else if( CTRL_nHitCounter > 1 )
		{// 临时使用
		}
		else
		{
			Assert( CTRL_nHitCounter == 1 );
			Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );

⌨️ 快捷键说明

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