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

📄 cbrun.cpp

📁 经典游戏赤壁的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{
				Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
				struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[i].nID );
				Assert( pU );
				pU->Draw.bUpdate = FALSE;
				CTRL_hitSrc[i].nID = MAP_DATA_NONE;
				CTRL_nHitCounter--;
			}
			Assert( CTRL_nHitCounter == 0 );
		}
		else
		// 把自己从鼠标选中数组中删除
		{
			for( int i=0; i< CTRL_nHitCounter; i++ )
			{
				if( CTRL_hitSrc[i].nID == pUnit->nID )
				{	// 把它后面的单元向前挪
					for( int j=i;j<CTRL_nHitCounter-1; j++ )
					{
						CTRL_hitSrc[j].nID = CTRL_hitSrc[j+1].nID;
					}
					CTRL_nHitCounter--;
					break;
				}
			}
		}
	}	// End of if( EYE_IfFocusOnUnit( pUnit ) )

	// 取消焦点状态
	// pDraw->bUpdate = FALSE;

	// it is time to destroy
	Assert( pUnit->Status.nTaskID == SHANCHU ) ;

	if( pUnit->nCounter == 0 )
	{
		pUnit->Draw.nFrame = 0;
	}
	// 如果达到最后一帧,或者只是删除,不是死亡,马上删除该单元
	else if( pUnit->nCounter == RUN_TIMEDELAY_DESTROY )
	{
		// 设置死后的图像,船不设
		if( !EYE_IfUnitIsShip( pUnit ) )
		{
			RUN_DESTROY_SetAfterLife( pUnit );
		}

		// 是建筑,要去掉火
		if( EYE_IfUnitIsBuild( pUnit ) )
		{
			for( int i=0; i<pUnit->Build.nFireLvl; i++ )
			{
				OTHER_DestroyData( pUnit->Build.nFireID[i] );
			}
			//added by tian yue
			TY_DestroyUnit(pUnit); 
		}

		// 删除
		if( EYE_IfUnitIsGen( pUnit ) )
		{
			// 解散手下所有士兵
			CTRL_GROUP_ToSubAll( pUnit );
			CTRL_GROUP_Destroy( pUnit );
		}
		else
		{
			if( EYE_IfUnitIsSoldier( pUnit ) 
				&& pUnit->Soldier.nGenID != MAP_DATA_NONE )
				CTRL_GROUP_Sub( pUnit );	// 把该士兵从将领手下解放出来
			CTRL_UNIT_Destroy( pUnit );
		}
		// 任务结束
		pUnit->Status.bDone = TRUE;
		OutputDebugString( "RUN_CreateUnit Status(0): Unit destroyed!\n" );
		return;
	}

	if( !EYE_IfUnitIsBuild( pUnit ) )
	{	// 部队

		// 对于删除命令设置相应的状态
		int nMaxFrame;
		if( pDraw->nFile >= 37 && pDraw->nFile <= 44 )	// 有自己的死亡画面
				nMaxFrame = 6;
		else	nMaxFrame = MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
		if( MAP_Lib.AniSeq[pDraw->nFile].nDeadDir == 8 )
		{	// 死亡是8个方向的
			pUnit->Draw.nState = pUnit->Draw.nDir+MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[1];
			// change frame
			//if( pDraw->nFrame < MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState]-1 )
			if( pDraw->nFrame < nMaxFrame )
			{
				int nDelay = 3;
				if( EYE_IfUnitIsShip( pUnit ) )
					nDelay 	= 15;
				if( (pUnit->nCounter&nDelay) == nDelay )
				{
					pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
					pDraw->nRow = 0;
					pDraw->nFrame = pDraw->nFrame+1;
				}
				pUnit->nCounter++;
			}
			else	pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
		}
		else
		{	// 需要调整死亡的方向
			if( (pDraw->nDir+8-MAP_Lib.AniSeq[pDraw->nFile].nDeadDir)%8 >0 )// 逆时针转
			{
				pDraw->nDir = (pDraw->nDir + 7)%8;
				pDraw->nState = pDraw->nDir;
			}
			else if ( (pDraw->nDir+8-MAP_Lib.AniSeq[pDraw->nFile].nDeadDir)%8 <0 )// 顺时针转
			{
				pDraw->nDir = (pDraw->nDir + 1)%8;
				pDraw->nState = pDraw->nDir;
			}
			else
			{	// 转对方向了
				pDraw->nState = MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[1];
				// change frame
				//if( pDraw->nFrame < MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState]-1 )
				Assert( nMaxFrame > 0 );
				if( pDraw->nFrame < nMaxFrame )
				{
					int nDelay = 3;
					if( (pUnit->nCounter&nDelay) == nDelay )
					{
						pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
						pDraw->nRow = 0;
						pDraw->nFrame = pDraw->nFrame+1;
					}
					pUnit->nCounter++;
				}
				else	pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
			}
		}
	}
	else
	{	// 建筑
		pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
	}
}
///////////////////////////////
///////////////////////////////
// 当前状态是GONGJI时调用
void RUN_FightUnit( struct UNIT_STRUCT *pUnit )
{
	Assert( pUnit );
	Assert( pUnit->Status.nTaskID == GONGJI );
	struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;

	Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
	struct UNIT_STRUCT *pU = MAP_GetUnit( pUnit->Status.nParam1 );
	Assert( pU );
	if( EYE_IfUnitIsDead( pU ) )
	{	// 发现敌人已经死了
		pUnit->Status.bDone = TRUE;
		return;
	}

	// 修改Bug, 极个别情况,敌人不死
	// July.16.1997, Liu Gang
	if( pU->nLife <= 0 
		&& pU->Task.nTaskID == SHANCHU 
		&& pU->Task.bDone == FALSE )
	{
		pU->Status.nTaskID = SHANCHU;
		while( pU->Status.bDone == FALSE )
			RUN_DestroyUnit( pU );
//		WriteLogFile( "Bad.log", "Destroy!\n" );
	}

	// 设置动画帧和状态
	// 攻击动作是2
	//pDraw->nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[2];
	// 攻击效果,挥刀一下,计算攻击效果一次
	Assert( DATA_Lib.Unit[pUnit->Draw.nFile].nFightSpeed != 0 );
	int nSpeed = DATA_Lib.Unit[pUnit->Draw.nFile].nFightSpeed;
	if( CTRL_GetSTG( &pUnit->Draw, JIASU ) == TRUE )
		nSpeed *= 2;
	else if( CTRL_GetSTG( &pUnit->Draw, JIANSU ) == TRUE )
		nSpeed /= 2;
	if( pUnit->nCounter == 0 )
	{
		// 动画帧,把刀放下
		pDraw->nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[0];
		pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+
			MAP_Lib.AniSeq[pDraw->nFile].nOffset;
		pDraw->nRow = 0;
	}
	else if( pUnit->nCounter == RUN_TIMEDELAY_FIGHT/nSpeed )
	{
		// change frame
		if( !EYE_IfUnitIsBuild( pUnit ) )
		{
			// 挥刀一次
			if( CTRL_GetSTG( &pUnit->Draw, GUNMU ) == TRUE 
				&& (pUnit->Draw.nFile == 32 || pUnit->Draw.nFile == 45) )
			{
				if( pUnit->Draw.nFile == 32 )	// 石头
					pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[4];
				else							// 木头
					pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[3];
			}
			else
			{
				pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[2];
			}
			pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
			pDraw->nRow = 0;
			if( MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState] != 0 )
				pDraw->nFrame = ( pDraw->nFrame+1 )%MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
			if( pDraw->nFrame != 2 )
				return;	// 动画没放完
		}
		else
		{
			Assert( EYE_IfUnitIsTower( pUnit ) );
		}
		
	// 一轮攻击
		pUnit->nCounter = 0;
		// 敌人逃出攻击范围,追击
		Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
		int nDir = EYE_IfUnitIsInRange( pUnit->nID, pUnit->Status.nParam1 );
		if( nDir == -1 )
		{	
			if( EYE_IfUnitIsBuild( pUnit ) )
				pUnit->Status.bDone = TRUE;	// 箭楼不追击
			else
			{	// 追击
				struct CTRL_TASK_STRUCT Task;
				CTRL_TASK_Clear( &Task );
				Task.nID = pUnit->nID;
				Task.nTaskID = GONGJI;
				Task.nTaskIDEx = 2;
				Task.nParam1 = pUnit->Status.nParam1;
				Task.bDone = TRUE;
				CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
			}
			return;
		}
		else if( nDir == -2 )
		{	// 敌人躲进建筑内
			pUnit->Status.bDone = TRUE;
			return;
		}
		else if( nDir != pUnit->Draw.nDir )
		{	// 转向敌人
			Assert( pUnit->Draw.ptOff.x == 0 && pUnit->Draw.ptOff.y == 0 );
			Assert( nDir >= 0 && nDir < 8 );
			int nState = pUnit->Draw.nState-pUnit->Draw.nDir;
			pUnit->Draw.nDir = nDir;
			pUnit->Draw.nState = pUnit->Draw.nDir+nState;
		}

		if( CTRL_GetSTG( &pUnit->Draw, GUNMU ) == TRUE 
			&& (pUnit->Draw.nFile == 32 || pUnit->Draw.nFile == 45) )
		{
			// 是100人的步兵和弓兵,而且正使用的计谋是滚木
			RUN_FIGHT_SetGunMu( pUnit, pU );
		}
		else if( EYE_IfUnitIsArcher( pUnit ) 
			|| EYE_IfUnitIsTower( pUnit ) 
			|| EYE_IfUnitIsBattleShip( pUnit ) )
		{// 弓箭手,射箭
			RUN_FIGHT_SetArrow( pUnit , pU );
		}
		else if( EYE_IfUnitIsCatapult( pUnit ) )
		{// 投石车,投石
			RUN_FIGHT_SetStone( pUnit, pU );
		}
		else if( RUN_FIGHT_CalcResult( pUnit, pU ) )
		{// 非弓箭手
			// 敌人已经死了
			return;
		}

		// 被攻击者
		if( EYE_IfUnitIsBuild( pU ) )
		{
			// 对于建筑,要放火
			RUN_FIGHT_SetFire( pU );
		}
		return;
	} // End of if( pUnit->nCounter == 
	pUnit->nCounter++;//等待记数一次
}

// 当前状态是ZUJIAN时调用
void RUN_GroupUnit( struct UNIT_STRUCT *pUnit )
{
	int nGenID;

	Assert( EYE_IfUnitIsSoldier( pUnit ) );

	Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
	nGenID = CTRL_GROUP_Find( pUnit->Draw.nPlayer, pUnit->Status.nParam1 );
	if( nGenID == MAP_DATA_NONE )
	{
		int nType;// 部队的类型
		if( EYE_IfUnitIsWorker( pUnit ) )
			nType = MAP_UNIT_TYPE_WGEN;	// 工人
		else if( EYE_IfUnitIsShip( pUnit ) )
			nType = MAP_UNIT_TYPE_SGEN;	// 水军
		else
			nType = MAP_UNIT_TYPE_GEN;	// 陆军
//		Assert( nType == (int)pUnit->Status.nTaskIDEx );
		nGenID = CTRL_GROUP_Create( pUnit->Draw.nLayer, pUnit->Draw.nX, 
			pUnit->Draw.nY, pUnit->Status.nParam1, pUnit->Draw.nPlayer, nType );
	}
	if( nGenID != MAP_DATA_NONE )
	{
		// to soldier
		pUnit->Status.nParam1 = nGenID;
		RUN_GroupAdd( pUnit );

		// 送回定单,将领的ID
		//add by tian yue
		TY_IDProcess(nGenID,pUnit->Status.nParam2,pUnit->Status.nParam3);
	}
	pUnit->Status.bDone = TRUE;

}

void RUN_GroupAdd( struct UNIT_STRUCT *pUnit )
{
	// to soldier
	Assert( pUnit );
	Assert( EYE_IfUnitIsSoldier( pUnit ) );
	Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
	struct UNIT_STRUCT *pUnitG = MAP_GetUnit( pUnit->Status.nParam1 );
	Assert( pUnitG );
	Assert( EYE_IfUnitIsGen( pUnitG ) );
	if( (EYE_IfUnitIsWorkerGen( pUnitG )
		&& !EYE_IfUnitIsWorker( pUnit ))
		||(!EYE_IfUnitIsWorkerGen( pUnitG )
		&& EYE_IfUnitIsWorker( pUnit )) )
	{
		OutputDebugString( "RUN_GroupAdd Warning:  cannot combine troops with different types!\n" );
		pUnit->Status.bDone = TRUE;
		return;
	}

	if( CTRL_GROUP_Add( pUnitG, pUnit ) )
	{
		// 对新加入的士兵下达将领正在执行的任务
		struct CTRL_TASK_STRUCT Task;
		CTRL_TASK_Clear( &Task );
		CTRL_TASK_Copy( &Task, &pUnitG->Task );
		Task.nID = pUnit->nID;
		Task.bDone = TRUE;
		CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );

		if( EYE_IfFocusOnUnit( pUnit ) 
			&&EYE_IfSheIsMine( pUnit ) 
			&& !EYE_IfFocusOnUnit( pUnitG ) )
		{
			// 把将领加到鼠标检测数组中,必须为第一个
			Assert(CTRL_nHitCounter < PLAYER_UNIT_MAX );
			for( int i=CTRL_nHitCounter; i>0; i-- )
			{	// 把其它单元向后挪
				CTRL_hitSrc[i].nID = CTRL_hitSrc[i-1].nID;
			}
//			CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
			CTRL_hitSrc[0].nID = pUnitG->nID;
			CTRL_nHitCounter++;
			pUnitG->Draw.bUpdate = TRUE;	// 给将领加上焦点

			// 把该将领手下的士兵加上焦点
			for( int j=0; j< GENERAL_TROOP_MAX; j++ )
			{
				if( pUnitG->Gen.wTroop[j] == MAP_DATA_NONE ) continue;
				struct UNIT_STRUCT *pU = MAP_GetUnit( pUnitG->Gen.wTroop[j] );
				Assert( pU );
				Assert( EYE_IfUnitIsSoldier( pU ) );
				if( !EYE_IfFocusOnUnit( pU ) )
				{
					CTRL_hitSrc[CTRL_nHitCounter].nID = pUnitG->Gen.wTroop[j];
//					CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
					CTRL_nHitCounter++;
					pU->Draw.bUpdate = TRUE;	// 给士兵加上焦点
				}
			}
			Assert( CTRL_nHitCounter <= PLAYER_UNIT_MAX );

			// 重新设置信息栏
			// 设置将领信息
			struct	PROMPT_BLOCK	temp;
			temp.PromptBlockId = PROMPT_UNIT;
			DATA_GENERAL_STRUCT *pUnitGData = &DATA_Lib.Gen[pUnitG->Gen.nID];
			temp.PromptBlockUnion.Unit.GeneralBitmapId = pUnitG->Gen.nID;	// 图片号
			temp.PromptBlockUnion.Unit.GeneralPower = EYE_GetWuLi( pUnitG->Gen.nID )*100/120;
				//pUnitGData->nHealth;	// 将领体力,单挑用
			temp.PromptBlockUnion.Unit.GeneralBlood =
				//pUnitG->nLife/2;		// 生命,将领生命值是200
				pUnitG->nLife*100/EYE_GetFullLife( pUnitG->Draw.nPlayer, pUnitG->Draw.nFile );	// 将领体力,单挑用
			strcpy( temp.PromptBlockUnion.Unit.GeneralName, pUnitGData->strName );	// 名字

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

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

			FACE_ShowPromptBlock( temp );

			Assert( CTRL_nHitCounter >= 1 );
			// 设置命令组为工人部队
			if( EYE_IfUnitIsWorker( pUnit ) )
			{
				//if( (GAME.nMe&1) == 1 )
				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 = 0xFFFF;
			}
			FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, 
				CTRL_TASK_saveCmdUnit.Ex );
		}
	}
	else
	{
		if( EYE_IfFocusOnUnit( pUnit ) )
		{
			if( EYE_IfSheIsMine( pUnit ) )
			{
				// 从鼠标选中数组中删除
				for( int i=0; i

⌨️ 快捷键说明

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