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

📄 cbrun.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
		if( nEnd != -1 )
			RUN_EndGame( nEnd );	// 可以结束了,0时是输了,1或2是赢了
	}

	// debug for dead lock
/*	if( nCounter%1000 == 0 )
	{
		GAME_Save( 19 );
	}
*/
	if( RUN_nCounter%RUN_SOUND_ATTACKDELAY == 0 )
	{
		RUN_SOUND_bWeAreUnderAttack = TRUE;	// 开关打开
	}

	if( RUN_nCounter%RUN_MOULUE_DELAY == 0 )
	{
		// 自动增加谋略值,一次加五,只有场上的加
		// 自动增加生命值,一次加十,只有场外的加
		RUN_MOULUE_Add();
	
		// 更新当前选中将领的谋略值
		if( CTRL_nHitCounter > 0 )
		{
			Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );
			Assert( pUnit );
			// 处于焦点状态时更新谋略值
			if( EYE_IfFocusOnUnit( pUnit )
				&& EYE_IfUnitIsGen( pUnit ) )
			{
				FACE_UpdateRuse( DATA_Lib.Gen[pUnit->Gen.nID].nMouLue );
			}
		}
	}

	RUN_nCounter++;

}

// 每隔X轮所有将领的谋略值增加五
void RUN_MOULUE_Add()
{
	int nGenFile[4]={35,31,33,29};
	for( int i=0; i<DATA_UNIT_GENERAL_MAX; i++ )
	{
		if( DATA_Lib.Gen[i].nID == 0 )	continue;
		// 将领谋略值增加一
		if( DATA_Lib.Gen[i].bOnBattle == TRUE )
		{	// 在战场上的将领才增加计谋值
			//if(	DATA_Lib.Gen[i].nMouLue < DATA_MOULUE_MAX )
			// 计谋最大值是该将领智力值乘2加15
			if(	DATA_Lib.Gen[i].nMouLue < (DATA_Lib.Gen[i].nZhiLi<<1)+15 )
			{
				DATA_Lib.Gen[i].nMouLue+=5;
			}
		}
		else
		{	// 增加将领生命值,只增加在战场以外的将领的
			if( DATA_Lib.Gen[i].dwLife 
				< DWORD(EYE_GetFullLife( -1, nGenFile[DATA_Lib.Gen[i].nType-1] )) )
			{
				DATA_Lib.Gen[i].dwLife+=10;
			}
		}
	}
}

void RUN_EndGame( int bWin )
{
	BOOL	FadeFlag = FALSE;
	FACE_SetProgramState( PROGRAM_STATE_NONE );
	MOUSE_SetState( MOUSE_STATE_NONE, TRUE );

	if( GAME_bNetwork )
		PostMessage(hwndGame, WM_COMMAND, SHOW_BATTLE_RESULT, bWin );
	else
		PostMessage( hwndGame, WM_GAME_END, GAME.nID, bWin );
}
///////////////////////////////


///////////////////////////////
#define	RUN_CLOCK_CIRCLE	20
BOOL RUN_RunUnit( int nPlayer, int nUnit )
{
	struct UNIT_STRUCT *pUnit = &GAME.Players[nPlayer].Unit[nUnit];
	if( pUnit->nType == MAP_UNIT_TYPE_NONE )	return FALSE;

	if( pUnit->bPause == TRUE )
	{
		pUnit->bPause = FALSE;	return FALSE;
	}

	switch( pUnit->Status.nTaskID )
	{
	case	YIDONG:	// 移动
		RUN_MoveUnit( pUnit );
		break;
	case	SHENGCHAN:	// 生产
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_ShengChan\n" );
#endif	//_DEBUG_OFFSET_
		RUN_CreateSoldier( pUnit );
		break;
	case	JIANZAO:	// 建造
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_JianZao\n" );
#endif	//_DEBUG_OFFSET_
		RUN_CreateBuild( pUnit );
		break;
	case	SHANCHU:	// 删除
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_ShanChu\n" );
#endif	//_DEBUG_OFFSET_
		RUN_DestroyUnit( pUnit );
		break;
	case	GONGJI:		// 攻击
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_Gongji\n" );
#endif	//_DEBUG_OFFSET_
		RUN_FightUnit( pUnit );
		break;
	case	ZUJIAN:		// 组建
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_ZuJian\n" );
#endif	//_DEBUG_OFFSET_
		RUN_GroupUnit( pUnit );
		break;
	case	JIARU:		// 加入
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_JiaRu\n" );
#endif	//_DEBUG_OFFSET_
		RUN_GroupAdd( pUnit );
		break;
	case	JIESAN:		// 解散
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_JieSan\n" );
#endif	//_DEBUG_OFFSET_
		RUN_GroupSub( pUnit );
		break;
	case	XIULI:		// 修理
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_XiuLi\n" );
#endif	//_DEBUG_OFFSET_
		RUN_RepairBuild( pUnit );
		break;
	case	QXSHENGCHAN:// 取消生产
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_QXShengChan\n" );
#endif	//_DEBUG_OFFSET_
		RUN_QXCreateSoldier( pUnit );
		break;
	case	QXJIANZAO:	// 取消建造
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_QXJianZao\n" );
#endif	//_DEBUG_OFFSET_
		RUN_QXCreateBuild( pUnit );
		break;
	case	JIANZAOZHONG:// 建造中
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_JianZaoZhong\n" );
#endif	//_DEBUG_OFFSET_
		RUN_CreatingBuild( pUnit );
		break;
	case	YUNSONG:	// 运送,采集
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_Harvest\n" );
#endif	//_DEBUG_OFFSET_
		RUN_Harvest( pUnit );
		break;	
	case	HUISONG:	// 回送,采集完毕后,回到家中
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_Harvest\n" );
#endif	//_DEBUG_OFFSET_
		RUN_ReturnOfTheJedi( pUnit );
		break;
	case	TISHENG:	// 提升
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_TiSheng\n" );
#endif	//_DEBUG_OFFSET_
		RUN_Upgrade( pUnit );
		break;
	case	QXTISHENG:	// 取消提升
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_QXTiSheng\n" );
#endif	//_DEBUG_OFFSET_
		RUN_QxUpgrade( pUnit );
		break;
	case	DUSE:		// 堵塞
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_DuSe\n" );
#endif	//_DEBUG_OFFSET_
		RUN_Blocked( pUnit );
		break;
	case	YUNZAI:		// 运载
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_YunZai\n" );
#endif	//_DEBUG_OFFSET_
		RUN_OnShip( pUnit );
		break;
	case	XIEZAI:		// 卸载
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_XieZai\n" );
#endif	//_DEBUG_OFFSET_
		RUN_OffShip( pUnit );
		break;
	case	ZHENXING:	// 阵型
		RUN_LineUp( pUnit );
		break;
	case	KAIMEN:		// 开门
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "R_Door\n" );
#endif	//_DEBUG_OFFSET_
		RUN_OpenDoor( pUnit );
		break;
	case	QUXIAO:		// 取消
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "Quxiao\n" );
#endif	//_DEBUG_OFFSET_
		break;
	case	JIMOU:		// 计谋
		// 当状态是JIMOU时调用
		RUN_Strategy( pUnit );
		break;
	case	HLUAN:		// 混乱
		RUN_HLuan( pUnit );
		break;
	case	MFU:		// 埋伏
		RUN_MFu( pUnit );
		break;
	case	DANTIAO:	// 单挑
		RUN_FightSingle( pUnit );
		break;
	case	XIUXI:
		RUN_Rest( pUnit );
		break;
	}


	//- TianYue
	// 本能策略,执行一个人的本能策略
//#define	__TY_AI__
#ifdef	__TY_AI__
	TY_InstanceAI_ForStruct( pUnit );
	GuardTowerProcess(pUnit);
#endif

	// 计谋,计谋记数器自动加一
	if( !EYE_IfUnitIsBuild( pUnit ) )
	{
		for( int i=0; i<CTRL_JIMOU_MAX; i++ )
		{
			if( pUnit->Draw.nSTG[i] == 1 )
			{
				pUnit->Draw.wSTGCounter[i]++;
				if( pUnit->Draw.wSTGCounter[i] >= RUN_TIMEDELAY_STG )
				{
					if( i == YUANSHI )
					{	// 擦去阴影
						// 只有我方才有阴影改变的问题
						if( GAME.nMe == pUnit->Draw.nPlayer )
						{
							//lwc
							// 消失
							int nVRange = EYE_GetViewRange( &pUnit->Draw );
							Assert( pUnit->nHasShadow == 1 );
							SHADOW_death (pUnit->Draw.nX,pUnit->Draw.nY,nVRange);
							//lwc
						}
						pUnit->nHasShadow--;
					}
					CTRL_SetSTG( &pUnit->Draw, (CTRL_JIMOU)i, FALSE );
					if( i == YUANSHI )
					{	// 重现阴影
						if( GAME.nMe == pUnit->Draw.nPlayer )
						{
							int nSight = EYE_GetViewRange( &pUnit->Draw );
							Assert( pUnit->nHasShadow == 0 );
							SHADOW_existent( pUnit->Draw.nX, pUnit->Draw.nY, nSight );
						}
						pUnit->nHasShadow++;
						// draw to minimap
						MINI_SetUnitData( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nPlayer, pUnit->Draw.nLocationSize );	// for minimap
					}
					else if( i == JILI 
						&& EYE_IfFocusOnUnit( pUnit )
						&& EYE_IfUnitIsGen( pUnit ) )
					{
						FACE_UpdateMorale( EYE_GetMorale( pUnit ) );
					}
				}
			}
		}
	}

//	RUN_MoveUnitTest( pUnit );
//	if( nPlayer == 3 )
//		OutputDebugString( "f" );
	// 对城门认为没有
	// July 31, 1997, Liu Gang
	if( EYE_IfUnitIsDoor( pUnit ) )
		return FALSE;
	if( EYE_IfUnitIsBuild( pUnit ) )
		return TRUE;// 只有建筑返回真值
	return FALSE;
}
///////////////////////////////

///////////////////////////////
// 当状态是YIDONG时调用
BOOL RUN_MoveUnit( struct UNIT_STRUCT *pUnit )
{
	BOOL bStep = FALSE;

#ifdef	_DEBUG
	if( pUnit->Status.nTaskID == QUXIAO )
	{
		OutputDebugString( "RUN_MoveUnit Error(1): no task but still move!\n" );
		return FALSE;
	}
#endif

	if( EYE_IfUnitIsBuild( pUnit ) 
		|| EYE_IfUnitIsSpec( pUnit ) )
	{	// 建筑或特殊
		OutputDebugString( "RUN_MoveUnit Error(2): this unit should not move!\n" );
		return FALSE;
	}

	struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;
	// move soldiers
	pUnit->nCounter++;

	// save old 1
	pDraw->nXLast = pDraw->nX;
	pDraw->nYLast = pDraw->nY;

	pDraw->ptOffLast.x = pDraw->ptOff.x;
	pDraw->ptOffLast.y = pDraw->ptOff.y;

	int nFrame = pDraw->nFrame;
	POINT ptDD[8] = {{0,-1},{2,-1},{2,0},{2,1},{0,1},{-2,1},{-2,0},{-2,-1}};
	POINT ptDDD[8] = {{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1},{-2,0},{-1,-1}};
	int nDirState[8] = {0,1,2,3,4,3,2,1};

	if( pDraw->ptOff.x == 0 && pDraw->ptOff.y == 0 )
	{
		Assert( pUnit->nID == MAP_GetUnitDataEx( pDraw->nX, pDraw->nY ) 
			|| pUnit->nHasShadow == 0 );

		// move 2
		BOOL bChangeDir = FALSE;

		int nDir;
		nDir = RUN_MOVE_IfArrived( pUnit );
		if( nDir != -1 )
		{	// 到达目的地了
			pUnit->Draw.nDir = nDir;
			if( pUnit->Status.nParam4 == DUSE )	// 预设堵塞
			{
#ifdef	_DEBUG_OFFSET_
		TestOff( pUnit, "AAA1\n" );
#endif	//_DEBUG_OFFSET_
				pUnit->Status.nTaskID = DUSE;	// 堵塞
				pUnit->nCounter = 0;
			}
			else
			{
				pUnit->Status.bDone = TRUE;
			}
			return TRUE;
		}
		else
		{
			// set dir
			int nState = pDraw->nState-pDraw->nDir;
			pDraw->nDir = pUnit->MarchTrack[pUnit->StepNum];
			// Dong Hai
			if(RUN_GetNextForward(pDraw,pUnit)==TRUE){return TRUE;}
			// Dong Hai
//			Assert(pDraw->nDir==255);
			
			pUnit->StepNum++;
			// set state
			//pDraw->nState = nDirState[pDraw->nDir];
			pDraw->nState = pDraw->nDir+nState;

			// set current position
			//BOOL bOdd = pDraw->nYLast%2;
			BOOL bOdd = pDraw->nY&1;
			pDraw->nX = (WORD)(pDraw->nX+MAP_ptSenser[bOdd][0][pDraw->nDir].x);
			pDraw->nY = (WORD)(pDraw->nY+MAP_ptSenser[bOdd][0][pDraw->nDir].y);

			// set offset
			pDraw->ptOff.x -= MAP_Lib.szItem.cx*ptDDD[pDraw->nDir].x>>1;
			pDraw->ptOff.y -= MAP_Lib.szItem.cy*ptDDD[pDraw->nDir].y>>1;

			// set move flag
			bStep = TRUE;
		}

		// move data
		if( !bChangeDir )
		{
			int bMove = CTRL_UNIT_Move( pDraw, pUnit->nType );
			if( bMove == 0 )
			{	// 被堵住
				bChangeDir = TRUE;
			}
			else if( bMove == 1 )
			{
				//pUnit->bSlow = FALSE;	
				CTRL_SetSTG( &pUnit->Draw, ZHAOZE, FALSE );
			}
			else if( bMove == 2 )
			{
				//pUnit->bSlow = TRUE;	// 遇到沼泽地
				CTRL_SetSTG( &pUnit->Draw, ZHAOZE, TRUE );
			}
			else if( bMove > 2 )
			{	// 遇到自己的城门
				// 给城门发开门的命令
				struct CTRL_TASK_STRUCT Task;
				CTRL_TASK_Clear( &Task );
				Task.nID = bMove;	// 城门的ID
				Task.nTaskID = KAIMEN;
				Task.bDone = TRUE;
				CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );

				pUnit->StepNum--;
				pDraw->nX = pDraw->nXLast;
				pDraw->nY = pDraw->nYLast;
				pDraw->ptOff.x = pDraw->ptOffLast.x;
				pDraw->ptOff.y = pDraw->ptOffLast.y;

	#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
				return FALSE;

⌨️ 快捷键说明

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