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

📄 cbrun.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			else
			{
				OutputDebugString( "c" );
			}

			if( EYE_IfFocusOnUnit( pUnit ) )
			{	// 设置撤消命令组
				if( EYE_IfSheIsMine( pUnit ) )
				{
					CTRL_TASK_ClearAssembleSrc( TRUE );
					CTRL_TASK_ClearAssembleDest();

					// 取消建造图像
					if( BUILD_IfEnable() )
					{
						BUILD_Enable( FALSE );
					}

					// 清除命令组
					FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
				}
				// 清除信息栏,敌我都要
				struct	PROMPT_BLOCK	temp;
				temp.PromptBlockId = PROMPT_NONE;	
				FACE_ShowPromptBlock( temp );
			}
		}
		else
		{
			Assert( pUnit->Draw.nLocationSize == 0 );
			Assert( pUnit->Status.nTaskIDEx == 2 );
			Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
			Assert( pUnit->Status.nParam1 != 0 );
			pU = MAP_GetUnit( pUnit->Status.nParam1 );
			Assert( pU );
			if( EYE_IfUnitIsDead( pU ) )
			{	// 建筑已经被毁
				if( pUnit->nHasShadow == 0 )
				{
					//---
					// 走出建筑
					if( CTRL_UNIT_OutUnit( pUnit ) )
					{
						pUnit->Status.bIRQ = FALSE;
					//---
						pUnit->Status.bDone = TRUE;
						return;
					}
				}
			}
			//	1.1.2,是,判断是否已经在该建筑内部了
			// 工人部队(士兵和将领)在建造建筑时,要把自己的位置设置到系统外面,隐藏起来
			// 假设工人只占一个格子
			// 如果已经在建筑里面了,则不进行此操作
			//if( pUnit->Status.bIRQ == FALSE )
			if( pUnit->nHasShadow == 1 )	// 在建筑外
			{

#ifdef	_DEBUG_OFFSET_
				TestOff( pUnit, "Build\n" );
#endif	//_DEBUG_OFFSET_
				//---
				// 走进建筑
				//CTRL_UNIT_InUnit( pUnit, TRUE );	
				CTRL_UNIT_InUnit( pUnit );	
				// 设置自己的任务为不可中断
				pUnit->Status.bIRQ = TRUE;
				//---
				Assert(pUnit->Task.bIRQ == FALSE );	
			}
			else
			{
				Assert(pUnit->Status.bIRQ == TRUE );	
			}
		}
	}	// End of if( pUnit->nCounter == 0 )
	else if( (pUnit->nCounter%4) == 0 )
	{
		//	2,给建筑增加血点
		// 以后则每次增加该单元的血点
		Assert( pUnit->Draw.nLocationSize == 0 );
		Assert( pUnit->Status.nParam1  != MAP_DATA_NONE );
		Assert( pUnit->Status.nParam1  != 0 );
		struct UNIT_STRUCT *pCreated = MAP_GetUnit( pUnit->Status.nParam1 );
		Assert( pCreated );

		//	3,该建筑的血格是否已满
		// 血格满了,结束
		BOOL bDead = EYE_IfUnitIsDead( pCreated );
		if( bDead	// 该建筑已经被摧毁
			|| pCreated->Status.nTaskID != JIANZAOZHONG )
		{
			// 对于工人部队,要把坐标设置回去
			Assert( pUnit->Draw.nLocationSize == 0 );

			//---
			// 走出建筑
			if( CTRL_UNIT_OutUnit( pUnit ) )
			{
				// 可中断
				pUnit->Status.bIRQ = FALSE;
				Assert( pUnit->nHasShadow == 1 );
				//---
				pUnit->Status.bDone = TRUE;
			}

			//added by tian yue .
			if( bDead == TRUE
				|| pCreated->Status.nTaskID == QXJIANZAO )
			{
			}
			else
			{	// 建成了
				pUnit->Task.nParam4 = JZFINISH;
				if( EYE_IfUnitIsWorkerGen( pUnit ) )
				{
					TY_IDProcess(pCreated->nID,pUnit->Task.nParam4,CBNULL);
					// Nov.6.1997
					// 战斗记分
					RUN_CountDown[pCreated->Draw.nPlayer].nBuildings ++;

					// 经验值增加
					DATA_Lib.Gen[pUnit->Gen.nID].nJingYan += 
					DATA_Lib.Unit[pCreated->Draw.nFile].nAddExp;

					//added by tian yue.
					// 升级
					if( DATA_Lib.Gen[pUnit->Gen.nID].nLevel < 9 )
					{
						if( DATA_Lib.Gen[pUnit->Gen.nID].nJingYan >= nJingYanGrade[DATA_Lib.Gen[pUnit->Gen.nID].nLevel] )
						{
							DATA_Lib.Gen[pUnit->Gen.nID].nJingYan -= nJingYanGrade[DATA_Lib.Gen[pUnit->Gen.nID].nLevel];
							DATA_Lib.Gen[pUnit->Gen.nID].nLevel++;

							//我将领战斗英勇,斩获甚多,晋升一级。
							if( EYE_IfFocusOnUnit( pUnit ) && EYE_IfSheIsMine( pUnit ) )
							{
								FACE_ShowPromptInfor( 12 );
								//---- 肯定音效
								// victory.wav
								DATA_WAVE_EffectPlay( 106 );
								//---- 肯定音效
							}
						}
					}
				}
			}

#ifdef	_DEBUG
			int nXNext, nYNext;
			int bOdd = pCreated->Draw.nY&1;
			for( i=0; i< MAP_nLocationNum[pCreated->Draw.nLocationSize]; i++ )
			{
				nXNext = pCreated->Draw.nX + MAP_ptLocation[bOdd][i].x;
				nYNext = pCreated->Draw.nY + MAP_ptLocation[bOdd][i].y;
				Assert( (!EYE_IfUnitIsDead( pCreated )
					&&(pUnit->Draw.nX != nXNext || pUnit->Draw.nY != nYNext))
					|| EYE_IfUnitIsDead( pCreated ) );
			}
			OutputDebugString( "RUN_CreateUnit Status(0): Unit created!\n" );
#endif
		}
		else
		{	// 增加建筑的血格
			pCreated->nLife += RUN_CREATE_VALUE;
		}
	}

	//	4,计数器增加1
	pUnit->nCounter++;
	return;

CREATE_FAILED:

	// 创建失败,退出
	// 失败的话,将领要把他手下的士兵的bDone都设置为真,结束他们的操作
	for( i=0; i<nTrp; i++ )
	{
		pU = MAP_GetUnit( arTroop[i] );
		Assert( pU );
		Assert( EYE_IfUnitIsSoldier( pU ) );
		if( pU->Task.nTaskID == JIANZAO )
		{
			if( pU->nHasShadow == 0 )
			{	
				// 对应于 AAA
				Assert( pU->Status.nTaskID != JIANZAO 
					|| pU == pUnit );

				//---
				// 走出建筑
				if( CTRL_UNIT_OutUnit( pU ) )
					pU->Status.bIRQ = FALSE;
				//---
			}

#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "BuildFail\n" );
#endif	//_DEBUG_OFFSET_
			Assert( pU->Status.bIRQ == FALSE );
			pU->bPause = 1;
//			pU->Status.nTaskID = DUSE;
//			pU->nCounter = 0;

			//pU->Status.nTaskID = JIANZAO;
			//pU->Status.bDone = TRUE;	// 结束当前任务
			//Assert( pU->Status.bIRQ == FALSE );
			struct CTRL_TASK_STRUCT Task;
			CTRL_TASK_Clear( &Task );
			Task.nID = pU->nID;
			Task.nTaskID = JIESHU;
			Task.bDone = TRUE;
			CTRL_TASK_DeployByComputer( pU->Draw.nPlayer, &Task );
		}
	}
	
	// 对于士兵要设置他的将领
	pU = EYE_GetGeneral( pUnit );
	if( pU )
	{
		Assert( EYE_IfUnitIsWorkerGen( pU ) );
		if( pU->Task.nTaskID == JIANZAO )
		{
			if( pU->nHasShadow == 0 )
			{
				// 对应于 AAA
				Assert( pU->Status.nTaskID != JIANZAO );
				//---
				// 走出建筑
				if( CTRL_UNIT_OutUnit( pU ) )
					pU->Status.bIRQ = FALSE;
				//---
			}

			Assert( pU->Status.bIRQ == FALSE );
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "BuildFail2\n" );
#endif	//_DEBUG_OFFSET_
			pU->bPause = 1;
//			pU->Status.nTaskID = DUSE;
//			pU->nCounter = 0;

			//pU->Status.nTaskID = JIANZAO;
			//pU->Status.bDone = TRUE;	// 结束当前任务
			//Assert( pU->Status.bIRQ == FALSE );
			struct CTRL_TASK_STRUCT Task;
			CTRL_TASK_Clear( &Task );
			Task.nID = pU->nID;
			Task.nTaskID = JIESHU;
			Task.bDone = TRUE;
			CTRL_TASK_DeployByComputer( pU->Draw.nPlayer, &Task );
		}
	}
	OutputDebugString( "RUN_CreateUnit Error(0): Cannot create unit!\n" );

	//added by tian yue
	TY_IDProcess(CBNULL,BUILDDESTROY,CBNULL);

	return;
}

// 当状态是SHENGCHAN时调用
// 建筑生产士兵
//具体步骤:
//	1,是否是第一次进入建造函数
//	2,给士兵增加血点
//	3,该士兵的血格是否已满
//	4,计数器增加1

// 注意:修改了Status的nParam4的内容作为该士兵的最大血点
//		修改了Status的nTaskIDEx2的内容作为该士兵的压缩代码
void RUN_CreateSoldier( struct UNIT_STRUCT *pUnit )
{
	int ret;
	Assert( pUnit );
	Assert( EYE_IfUnitIsBuild( pUnit ) );

	//	1,是否是第一次进入建造函数
	if( pUnit->nCounter == 0 )
	{	// 第一次时,要创建该单元

		// set player
		// 给要被建造的建筑设置游戏君主
		DWORD codeU = MAP_Lib.Unit[pUnit->Status.nTaskIDEx].nItems[0];
		struct MAP_UNIT_CODE_STRUCT stctU;
		MAP_UnitDeCode( codeU, &stctU );
		stctU.nPlayer = pUnit->Draw.nPlayer;
		codeU = MAP_UnitEnCode( stctU );

		// 花钱
		if( !RUN_CREATE_Consume( stctU.nPlayer, stctU.nFile ) )
		{
			pUnit->Status.bDone = TRUE;
			return;
		}

		// 得到最大血点数
		pUnit->Status.nTaskIDEx2 = codeU;
		pUnit->Status.nParam4 = EYE_GetFullLife( stctU.nPlayer, stctU.nFile );
		//	4,计数器增加1
		pUnit->nCounter++;

		pUnit->Status.bIRQ = TRUE;
		if( EYE_IfSheIsMine( pUnit ) 
			&& EYE_IfFocusOnUnit( pUnit ) )
		{
			// 设置信息栏,建筑在生产中
			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 );

			// 设置命令组
			CTRL_TASK_saveCmdUnit.Busy = 1;	// 设置取消键
			FACE_ShowCommandUnit( COMMANDUNIT_CANCEL, 0xFFFF ); // clear command sets
			//CTRL_TASK_ClearAssembleDest();
		}
	}	// End of if( pUnit->nCounter == 0 )
	else
	{
		// 以后则每次增加该单元的血点
		//	2,给士兵增加血点;	4,计数器增加1
		pUnit->nCounter++;
		if( EYE_IfFocusOnUnit( pUnit ) 
			&& EYE_IfSheIsMine( pUnit ) )
		{
			// 更新血格条
			FACE_ShowProcessBar( PROCESSBAR_PROCESS, pUnit->nCounter*100/pUnit->Status.nParam4 );
		}

		//	3,该士兵的血格是否已满
		// 血格满了,结束
		if( pUnit->nCounter >= pUnit->Status.nParam4 )
		{
			pUnit->Status.bIRQ = FALSE;
			Assert( pUnit->nHasShadow == 1 );
			
			if( EYE_IfSheIsMine( pUnit ) )
			{
				//------------音效
				// XRj.wav, 训练完成
				int nID = 87;
				DATA_WAVE_EffectPlay( nID );
				//------------音效
				//------------提示
				FACE_ShowPromptInfor( nID-82 ) ;
				//------------提示
			}


			if( EYE_IfFocusOnUnit( pUnit ) 
				&& EYE_IfSheIsMine( pUnit ) )
			{
				// 重新设置信息栏,建筑空闲
				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 );

				// 设置命令组
				CTRL_TASK_saveCmdUnit.Busy = 0;// 恢复原来的命令组
				FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
				//CTRL_TASK_ClearAssembleDest();
			}
			pUnit->Status.bDone = TRUE;
			OutputDebugString( "RUN_CreateUnit Status(0): Unit created!\n" );

			// create
			// 创建单元
			ret = CTRL_UNIT_Create( pUnit->Draw.nLayer, pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Status.nTaskIDEx2 );
			if( ret == MAP_DATA_NONE )
			{
				//创建失败,退出
				OutputDebugString( "RUN_CreateUnit Error(11): Cannot create unit!\n" );
				return;
			}
			// 战斗记分,Nov.6.1997
			UNIT_STRUCT *pU = MAP_GetUnit( ret );
			RUN_CountDown[pU->Draw.nPlayer].nSoldiers += EYE_GetFullLife( -1, pU->Draw.nFile );

			//add by tian yue
			TY_IDProcess(ret,pUnit->Status.nParam2,pUnit->Status.nParam3);
		}
	}
	return;
}
///////////////////////////////

///////////////////////////////
// 当状态是SHANCHU时调用
void RUN_DestroyUnit( struct UNIT_STRUCT *pUnit )
{
	Assert( pUnit );
	struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;
	Assert( pUnit->nType != MAP_UNIT_TYPE_NONE );

	if( EYE_IfFocusOnUnit( pUnit ) )
	{
		if( CTRL_nHitCounter == 1
			|| EYE_IfUnitIsGen( pUnit ) )
		{
			if( EYE_IfSheIsMine( pUnit ) )
			{
				Assert( CTRL_nHitCounter>0 );
	//			if( CTRL_hitSrc[0].nID == pUnit->nID )
	//			{
					// 设置命令组
					CTRL_TASK_ClearAssembleSrc( TRUE );
					CTRL_TASK_ClearAssembleDest();
					FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
	//			}

				// 取消建造图像
				if( BUILD_IfEnable() )
				{
					BUILD_Enable( FALSE );
				}
			}

			// 清除信息栏,敌我都要
			struct	PROMPT_BLOCK	temp;
			temp.PromptBlockId = PROMPT_NONE;	
			FACE_ShowPromptBlock( temp );
		
			// 把所有的焦点都去掉
			// 修正一个Bug
			int nCounter = CTRL_nHitCounter;
			for( int i=0; i<nCounter; i++ )

⌨️ 快捷键说明

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