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

📄 cbrun.cpp

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

		}

		if( bChangeDir )
		{	// 方向改变了
			pUnit->StepNum--;
			pDraw->nX = pDraw->nXLast;
			pDraw->nY = pDraw->nYLast;
			pDraw->ptOff.x = pDraw->ptOffLast.x;
			pDraw->ptOff.y = pDraw->ptOffLast.y;

			// Dong Hai
			if(pUnit->MarchTrack[pUnit->StepNum-1]==8)
				{
					pUnit->StepNum--;
					pDraw->nLayer--;
				}
			if(pUnit->MarchTrack[pUnit->StepNum-1]==9)
				{
					pUnit->StepNum--;
					pDraw->nLayer++;
				}
			// Dong Hai

#ifdef	_MAP_COMPRESS_
			pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
			pDraw->nRow = 0;//(WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
#else
			pDraw->nCol = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].x;
			pDraw->nRow = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
#endif
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "AAA2\n" );
#endif	//_DEBUG_OFFSET_
			pUnit->Status.nTaskID = DUSE;	// 被档住了,堵塞
			pUnit->nCounter = 0;
			return TRUE;
		}
	}

#ifdef	_DEBUG
	if( pUnit->StepNum > 0 )
	{
		Assert( pUnit->MarchTrack[pUnit->StepNum-1] == pDraw->nDir );
		if( pUnit->MarchTrack[pUnit->StepNum-1] != pDraw->nDir )
		{
			pDraw->nDir = pUnit->MarchTrack[pUnit->StepNum-1];
//			WriteLogFile( "off.log", "Dir\n" );
		}
	}
#endif
	Assert( abs(pDraw->ptOff.x)==abs(pDraw->ptOff.y)*2
		|| pDraw->ptOff.x==0 || pDraw->ptOff.y==0  );

#ifdef	_DEBUG_OFFSET_
	if(	!(abs(pDraw->ptOff.x)==abs(pDraw->ptOff.y)*2
		|| pDraw->ptOff.x==0 || pDraw->ptOff.y==0) )
	{
//		WriteLogFile( "off.log", "abs\n" );
	}
#endif // _DEBUG_OFFSET_
	// move 1
//	if( pUnit->bSlow == FALSE 
	int bFast = -1;
	if( EYE_IfUnitIsCavalry( pUnit ) )
		bFast = 2;
	else
		bFast = 1;
	if( CTRL_GetSTG( &pUnit->Draw, ZHAOZE ) == TRUE )
	{
		bFast--;
	}
	if( CTRL_GetSTG( &pUnit->Draw, JIANSU ) == TRUE )
		bFast = 0;
	else if( CTRL_GetSTG( &pUnit->Draw, JIASU ) == TRUE )
		bFast = 2;

	if( bFast != 0 || ((pUnit->nCounter&1) == 1 && bFast == 0) )
	{
		if( bFast == 2 )
		{
			if( pDraw->ptOff.x == 2 || pDraw->ptOff.x == -2 
				|| pDraw->ptOff.y == 1 || pDraw->ptOff.y == -1 )
			{
				pDraw->ptOff.x = 0, pDraw->ptOff.y = 0;
			}
			else
			{
				pDraw->ptOff.x += ptDD[pDraw->nDir].x<<1;
				pDraw->ptOff.y += ptDD[pDraw->nDir].y<<1;
			}
		}
		else
		{
			pDraw->ptOff.x += ptDD[pDraw->nDir].x;
			pDraw->ptOff.y += ptDD[pDraw->nDir].y;
		}

		// Dong Hai
		RUN_DrawUpAndDown(pDraw);
		// Dong Hai

		// change frame
		if( MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState] != 0 
			&& (pUnit->nCounter&1) == 1 )
			pDraw->nFrame = ( nFrame+1 )%MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
	#ifdef	_MAP_COMPRESS_
		pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
		pDraw->nRow = 0;//(WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
	#else
		pDraw->nCol = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].x;
		pDraw->nRow = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
	#endif

	}
	Assert( pDraw->ptOff.x >= -44 && pDraw->ptOff.y <= 44 
		&& pDraw->ptOff.y >= -22 && pDraw->ptOff.y <= 22 );

#ifdef	_DEBUG_OFFSET_
	if( !(pDraw->ptOff.x >= -44 && pDraw->ptOff.y <= 44
		&& pDraw->ptOff.y >= -22 && pDraw->ptOff.y <= 22) )
	{
		pUnit->Draw.ptOff.x = pUnit->Draw.ptOff.y = 0;
//		WriteLogFile( "off.log", "Move\n" );
	}
#endif //_DEBUG_OFFSET_
	return bStep;
}


void RUN_MoveUnitTest( struct UNIT_STRUCT *pUnit )
{
}
///////////////////////////////

///////////////////////////////
// 当状态是JIANZAO时调用
// 主要步骤:
//	1,是否是第一次进入建造函数
//	1.1,判断是否有人已经建造该建筑了
//	1.1.1,否,建造该建筑,并将同部队的所有士兵(将领)都置位
//	1.1.2,是,判断是否已经在该建筑内部了
//	1.1.2.1,否,隐藏自己
//	2,给建筑增加血点
//	3,该建筑的血格是否已满
//	3.1,是,则结束状态
//	4,计数器增加1

// 注意:1.1.1修改了本部队所有士兵和将领的任务及其参数
void RUN_CreateBuild( struct UNIT_STRUCT *pUnit )
{
	WORD arTroop[GENERAL_TROOP_MAX];
	int nTrp;
	struct UNIT_STRUCT *pU=NULL;	// 被建造的建筑的指针,本部队其他士兵的指针,将领指针
	int i, j;

	//added by tian yue
	int nJingYanGrade[10]={200,500,1000,1800,3000,5000,8000,12000,18000,27000};

	Assert( EYE_IfUnitIsWorker( pUnit ) 
		|| EYE_IfUnitIsWorkerGen( pUnit ) );

	//	1,是否是第一次进入建造函数
	if( pUnit->nCounter == 0 )
	{	// 第一次时,要创建该单元
		// 对于工人部队,只有第一个到达目的地的人才能创建该单元

		//	1.1,判断是否有人已经建造该建筑了
		if( pUnit->Task.nTaskIDEx == 1 )
 		{
			if( !RUN_CREATE_IfEnoughMoney( pUnit->Draw.nPlayer, pUnit->Status.nTaskIDEx2 ) )
			{	// 钱不够了,结束
				pUnit->Status.bDone = TRUE;
				return;
			}

			if( EYE_GetGeneral( pUnit ) == NULL )
			{	// 没有将领带着了,结束
				pUnit->Status.bDone = TRUE;
				return;
			}

			if( pUnit->Status.nParam2 != pUnit->Draw.nX
				|| pUnit->Status.nParam3 != pUnit->Draw.nY )
			{
#ifdef	_DEBUG
				for( int x=0; x<PLAYER_UNIT_MAX; x++ )
				{
					struct UNIT_STRUCT *pUB = &GAME.Players[pUnit->Draw.nPlayer].Unit[x];
					Assert( pUB->Draw.nFile != pUnit->Task.nTaskIDEx2 
						|| pUB->Status.nTaskID != JIANZAOZHONG 
						|| pUnit->Status.nParam2 != pUB->Draw.nX 
						|| pUnit->Status.nParam3 != pUB->Draw.nY );
				}
#endif
				//pUnit->Status.bDone = TRUE;
				// 设置堵塞
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "Build\n" );
#endif	//_DEBUG_OFFSET_
				pUnit->Status.nTaskID = DUSE;	// 堵塞
				pUnit->nCounter = 0;
				return;
			}
			//	1.1.1,否,建造该建筑,并将同部队的所有士兵(将领)都置位
			// 真正走到了目的地,表示还没有人抢先
			// set player
			// 给要被建造的建筑设置游戏君主

			DWORD codeU = MAP_Lib.Unit[pUnit->Status.nTaskIDEx2].nItems[0];
			struct MAP_UNIT_CODE_STRUCT stctU;
			MAP_UnitDeCode( codeU, &stctU );
			stctU.nPlayer = pUnit->Draw.nPlayer;
			codeU = MAP_UnitEnCode( stctU );

			if( EYE_IfUnitIsSoldier( pUnit ) )
			{
				pU = MAP_GetUnit( pUnit->Soldier.nGenID );
				if( pU == NULL || EYE_IfUnitIsDead( pU ) )	// 没将了,结束
				{
					pUnit->Status.bDone = TRUE;
					return;
				}
			}
			// 得到与同一个部队的其他单元
			nTrp = GENERAL_TROOP_MAX;
			EYE_GetUnitInGroup( 1, pUnit->nID, arTroop, &nTrp );
			Assert( nTrp >= 0 );

			// 检测此处是否能够建造建筑
			int  nXNext, nYNext;
			BOOL bOdd = pUnit->Draw.nY&1;
			BOOL bSame = TRUE;
			WORD codeUEx;
			for( i=0; i< MAP_nLocationNum[MAP_Lib.Unit[stctU.nFile].nLocationSize]; i++ )
			{
				nXNext = pUnit->Draw.nX + MAP_ptLocation[bOdd][i].x;
				nYNext = pUnit->Draw.nY + MAP_ptLocation[bOdd][i].y;
				codeUEx = MAP_GetUnitDataEx( nXNext, nYNext );
				if( codeUEx != MAP_DATA_NONE )
				{	// 发现在应该建造建筑的位置上有其它单元
					bSame = FALSE;
					if( codeUEx == pUnit->nID )
					{
						bSame = TRUE;	// 是自己
					}
					// 得到将领
					else if( EYE_IfUnitIsSoldier( pUnit ) 
						&& codeUEx == pUnit->Soldier.nGenID )
					{	// 这个单元是本部队的将领
						bSame = TRUE;	// 是自己的将领
					}
					else
					{
						for( j=0; j<nTrp; j++ )
						{
							if( codeUEx == arTroop[j] )
							{	// 这个单元是本部队的,可以忽略
								bSame = TRUE;	break;
							}
						}
					}
					if( !bSame )	break;
					// 如果本部队的其他士兵走到建筑区域里来了,
					// 则强行命令其终止移动,进入建造状态
					pU = MAP_GetUnit( codeUEx );
					Assert( pU );
					Assert( !EYE_IfUnitIsDead( pU ) );
					if( pU->Task.nTaskID != JIANZAO )
					{
						bSame = FALSE;
						break;	// 不是建造任务,则不算
					}

					// 在这里不包括自己
					if( pU->Status.nTaskID != JIANZAO )
					{	
						Assert( pU->Task.bIRQ == FALSE );
						Assert( pU->Status.bIRQ == FALSE );
						//pU->Status.bDone = TRUE;

						// 必须这样设置才行
//						pU->Task.bIRQ = TRUE;	// 给未来的状态设置不可中断
						pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;

						// 对应于 AAA
						//---
						// 走进建筑
						CTRL_UNIT_InUnit( pU );	
						// 不可中断
						pU->Status.bIRQ = TRUE;
						//---
					}
				}
			}
			if( !bSame )
			{	// 在应该建造建筑的位置上有非本部队的其它单元,建造失败
				OutputDebugString( "RUN_CreateUnit Error(5): cannot build here!\n" );
				pUnit->Status.bDone = TRUE;
				goto CREATE_FAILED;
			}

			pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
			//---
			// 自己走进建筑
			CTRL_UNIT_InUnit( pUnit );
			// 设置自己的任务为不可中断
			pUnit->Status.bIRQ = TRUE;
			//---

			// create
			// 创建单元
			Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
			int ret = CTRL_UNIT_Create( pUnit->Status.nParam1, pUnit->Status.nParam2, pUnit->Status.nParam3, codeU, FALSE );
			//BOOL ret = CTRL_UNIT_Create( pUnit->Draw.nLayer, pUnit->Draw.nX, pUnit->Draw.nY, codeU, FALSE );
			if( ret == MAP_DATA_NONE )	goto CREATE_FAILED;	// 创建失败

			// 花钱
			if( !RUN_CREATE_Consume( stctU.nPlayer, stctU.nFile ) )
			{
				Assert( 1==0 );	// 不可能没钱
				goto CREATE_FAILED;		// 没钱了
			}

			// 重新设置该建筑单元的血格
			// Warning : 在这里定义一个与外部同名的变量,有错。
			//			起码看起来是这样。
			//struct UNIT_STRUCT *pU = MAP_GetUnit( ret );
			pU = MAP_GetUnit( ret );
			Assert( pU );
			Assert( EYE_IfUnitIsBuild( pU ) );
			pU->nLife = 0;
			pU->Draw.nCol = 1 + MAP_Lib.AniSeq[26].nOffset;	// 设置初始动画帧
			pU->Draw.nRow = 0;

			// 设置该建筑的任务
			struct CTRL_TASK_STRUCT Task;
			CTRL_TASK_Clear( &Task );
			Task.nID = pU->nID;
			Task.nTaskID = JIANZAOZHONG;
			Task.nTaskIDEx = pUnit->nID;
			Task.bIRQ = TRUE;
			Task.bDone = TRUE;
			CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
			// Aug.8, 先暂停一轮,为了修改一个提前完工的Bug
			pU->bPause = TRUE;

			// 成功的话,将领要把他手下的士兵的nTaskIDEx都设置为该单元的ID
			// 非常不结构化的地方,不应该在此处修改单元的任务结构
			// 士兵则要先找到将领,在将部队内所有士兵的nTaskIDEx设置为该单元的ID
			for( i=0; i<nTrp; i++ )
			{
				pU = MAP_GetUnit( arTroop[i] );
				Assert( pU );
				Assert( EYE_IfUnitIsSoldier( pU ) );
				// 对尚未到达目的地的单元设置新的命令
				// nTaskIDEx中存放的是移动方式,目的地是单元,
				// nParam1中存放的是新建的建筑ID
				//		如果本单元的状态是移动,可以判断出是否走到新建的建筑附近,结束移动状态
				//		如果状态已经是建造了,则nTaskIDEx无用,而根据nParam1可以直接知道新建的建筑,为其加血点

				// 注意:
				// 只有该单元也是建造任务,而且尚未进入建筑时有效,否则有Bug
				if( pU->Task.nTaskID == JIANZAO )
				{
					if( pU->Status.bIRQ == FALSE )
					{	
						//pU->Status.nTaskID = DUSE;
						//pU->nCounter = 0;
						pU->bPause = 1;	// 本轮暂停
						//pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
						//pU->Status.nTaskID = JIANZAO;
						//pU->Status.bDone = TRUE;	// 结束当前任务
						struct CTRL_TASK_STRUCT task;
						CTRL_TASK_Clear( &task );
						task.nID = pU->nID;
						task.nTaskID = JIANZAO;
						task.nTaskIDEx = 2;	// MOUSE_HITRESULT_UNIT
						task.nParam1 = ret;
						task.bDone = TRUE;
						CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &task );
					}
					else if( pU->Status.nTaskIDEx == 1 )	// 已经在建筑内部的
					{// 包括自己
						pU->Status.nTaskID = JIANZAO;
						pU->Task.nTaskIDEx = 2;
						pU->Status.nTaskIDEx = 2;
						pU->Task.nParam1 = ret;
						pU->Status.nParam1 = ret;
						pU->nCounter = 0;
						pU->Task.bDone = 0;
						Assert( pU->Status.bDone == FALSE );
					}
				}
				else
				{
					OutputDebugString( "c" );
				}
			}

			// 得到本单元的将领
			pU = EYE_GetGeneral( pUnit );
			Assert( pU );
			Assert( EYE_IfUnitIsWorkerGen( pU ) );
			// 在创建建筑之后,nTaskIDEx的内容存放该单元的ID
			// 非常不结构化的地方,不应该在此处修改单元的任务结构
			// nTaskIDEx中存放的是移动方式,目的地是单元,
			// nParam1中存放的是新建的建筑ID
			//		如果本单元的状态是移动,可以判断出是否走到新建的建筑附近,结束移动状态
			//		如果状态已经是建造了,则nTaskIDEx无用,而根据nParam1可以直接知道新建的建筑,为其加血点

			// 注意:
			// 只有该单元也是建造任务,而且尚未进入建筑时有效,否则有Bug
			if( pU->Task.nTaskID == JIANZAO )
			{
				if( pU->Status.bIRQ == FALSE )
				{
					//pU->Status.nTaskID = DUSE;
					//pU->nCounter = 0;
					pU->bPause = 1;	// 本轮暂停
					//pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
					//pU->Status.nTaskID = JIANZAO;
					//pU->Status.bDone = TRUE;	// 结束当前任务
					struct CTRL_TASK_STRUCT task;
					CTRL_TASK_Clear( &task );
					task.nID = pU->nID;
					task.nTaskID = JIANZAO;
					task.nTaskIDEx = 2;	// MOUSE_HITRESULT_UNIT
					task.nParam1 = ret;
					task.bDone = TRUE;
					CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &task );
				}
				else if( pU->Status.nTaskIDEx == 1 )	// 已经在建筑内部的
				{	// 包括自己
					pU->Status.nTaskID = JIANZAO;
					pU->Task.nTaskIDEx = 2;
					pU->Status.nTaskIDEx = 2;
					pU->Task.nParam1 = ret;
					pU->Status.nParam1 = ret;
					pU->nCounter = 0;
					pU->Task.bDone = 0;
					Assert( pU->Status.bDone == FALSE );
				}
			}

⌨️ 快捷键说明

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