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

📄 cbctrls.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					if( nEndZ == 0 && codeG == MAP_DATA_NONE )
					{
						Assert(0);
						break;
					}
					nEndZ--;
				}
			}
			int	MARCH_Status;
			Assert( nEndZ>=0&&nEndZ<3 );

			MARCH_Status=March_Interface( pUnit->Draw.nX, pUnit->Draw.nY,pUnit->Draw.nLayer, nEndx, nEndy, nEndZ );

			if( bShouldDuSe == TRUE&& MARCH_Status==MARCH_ERROR_MARCH_TRACK )
			{
				if(MARCH_TrackForward[0]==255)
				{	// 应该堵塞,而且没找到路,则马上堵塞
					OutputDebugString( "CTRL_TASK : Find no way there!\n" );
					pUnit->Status.nTaskID = DUSE;	// 直接堵塞
					return;
				}
				else
				{	// 应该堵塞,而且路不完整,则预设堵塞
					OutputDebugString( "not reached!\n" );	
					pUnit->Status.nParam4 = DUSE;	// 预设堵塞
				}
			}
			else if( bShouldDuSe == TRUE )
			{
				if(MARCH_TrackForward[128]!=255)
				{	// 路线超界了,预设堵塞
					OutputDebugString( "not reached!\n" );	
					pUnit->Status.nParam4 = DUSE;	// 预设堵塞
				}
			}
			else if( bShouldDuSe == FALSE && MARCH_TrackForward[0]==255 )
			{	// 不应该堵塞,但是没找到路,则马上堵塞
				OutputDebugString( "CTRL_TASK : Find no way there!\n" );
				pUnit->Status.nTaskID = DUSE;	// 直接堵塞
				return;
			}
			memcpy( &pUnit->MarchTrack, &MARCH_TrackForward, sizeof(pUnit->MarchTrack) );
			pUnit->StepNum=0;
		}
	}


	// 状态结束,Status的nTaskID为QUXIAO,bDone为TRUE
	// 自动设置下一状态
	if( pUnit->Status.nTaskID != QUXIAO && pUnit->Status.bDone )
	{
		Assert( pUnit->Draw.ptOff.x == 0 || pUnit->Draw.ptOff.y == 0 );

#ifdef	_DEBUG_OFFSET_
		if( pUnit->Draw.ptOff.x != 0 || pUnit->Draw.ptOff.y != 0 )
		{
//			WriteLogFile( "off.log", "change\n" );
		}
#endif //_DEBUGS_OFFSET_

		// 注意:接受不到堵塞状态
		// 设置动画帧状态
		if( EYE_IfUnitIsWorker( pUnit ) 
			&& pUnit->Soldier.nResource != 0 )
		{
			if( pUnit->Soldier.nResType == SHULIN )	// 树林
			{
				pUnit->Draw.nState = pUnit->Draw.nDir+
					MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[3];
			}
			else if( pUnit->Soldier.nResType == MAITIAN		// 麦田
				|| pUnit->Soldier.nResType == LIANGCANG )	// 粮仓
			{
				pUnit->Draw.nState = pUnit->Draw.nDir+
					MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[5];
			}
			else if( pUnit->Soldier.nResType == TIEKUANG )	// 铁矿
			{
				pUnit->Draw.nState = pUnit->Draw.nDir+
					MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[4];
			}
			else	// 一般状态
			{
				pUnit->Draw.nState = pUnit->Draw.nDir;	
			}
		}
		else	pUnit->Draw.nState = pUnit->Draw.nDir;
		if( !EYE_IfUnitIsBuild( pUnit ) )
		{
			pUnit->Draw.nFrame = 1;
			pUnit->Draw.nCol = MAP_Lib.AniSeq[pUnit->Draw.nFile].nAniSeq[pUnit->Draw.nState][pUnit->Draw.nFrame]+
				MAP_Lib.AniSeq[pUnit->Draw.nFile].nOffset;
			pUnit->Draw.nRow = 0;
		}

		if( pUnit->Status.nTaskID == pUnit->Task.nTaskID )
		{	// 对于单状态任务的状态或多状态的任务的第二个状态,
			// 结束后设置任务结束
			Assert( pUnit->nHasShadow == 1 );
			pUnit->Status.nTaskID = QUXIAO;
			pUnit->Task.nTaskID = QUXIAO;
			pUnit->Task.bDone = FALSE;
			pUnit->Task.bIRQ = FALSE;
			pUnit->nCounter = 0;

/*
			pUnit->Draw.nState = pUnit->Draw.nDir+MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[0];
			pUnit->Draw.nCol = MAP_Lib.AniSeq[pUnit->Draw.nFile].nAniSeq[pUnit->Draw.nState][pUnit->Draw.nFrame]+
				MAP_Lib.AniSeq[pUnit->Draw.nFile].nOffset;
			pUnit->Draw.nRow = 0;
*/
//			OutputDebugString( "CTRL_TASK : Done!\n" );
		}
		else
		{	// 对于多状态任务的第一个状态,结束后设置下一个状态
			CTRL_TASK_Copy( &pUnit->Status, &pUnit->Task );
			pUnit->Status.bDone = FALSE;
			pUnit->nCounter = 0;
		}
	}
}
//////////////////////

//////////////////////
// basic functions
// 基本函数

// 产生单元,对阴影有特殊处理
// 产生单元时,调用SHADOW_Draw()同时产生阴影.
// codeU		:	unit code to identifies the type of the unit
// nZ, nX, nY	:	position to locate,产生的位置
// return		:	unit ID extended code if successful,
//					MAP_DATA_NONE if failed
WORD CTRL_UNIT_Create( int nZ, int nX, int nY, DWORD codeU, BOOL bFind/*=TRUE*/ )
{
	// 寻找附近一个合适的地方放置单元
	if( bFind )
	{
		POINT pt;
		pt = MAP_FindRegion( nZ, nX, nY, codeU );
		if( pt.x == -1 )
		{
			OutputDebugString( "CTRL_UNIT_Create Error(0): Cannot find a place to set general!\n" );
			return MAP_DATA_NONE;
		}
		nX = pt.x, nY = pt.y;
	}

	// 创建单元
	WORD codeUEx = MAP_SetUnitData( nZ, nX, nY, codeU );
	if( codeUEx == MAP_DATA_NONE )
	{
		OutputDebugString( "CTRL_UNIT_Create Error(1): Cannot create unit!\n" );
		//	战场上的物体过多,不能增加了
		FACE_ShowPromptInfor( 18 );
		return codeUEx;
	}

	// 设置单元其它信息
	struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
	Assert( pUnit->nType != MAP_UNIT_TYPE_NONE );
	Assert( nX == pUnit->Draw.nX && nY == pUnit->Draw.nY );

	// 生命值
	pUnit->nLife = EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile );

	pUnit->nIDAttackMe = MAP_DATA_NONE;

	if( !EYE_IfUnitIsBuild( pUnit ) )
	{
		pUnit->Draw.nFrame = 1;
#ifdef	_MAP_COMPRESS_
		pUnit->Draw.nCol = MAP_Lib.AniSeq[pUnit->Draw.nFile].nAniSeq[pUnit->Draw.nState][pUnit->Draw.nFrame]+MAP_Lib.AniSeq[pUnit->Draw.nFile].nOffset;
		pUnit->Draw.nRow = 0;
#else
		pUnit->Draw.nRow = stct.nRow;
		pUnit->Draw.nCol = stct.nCol;
#endif
	}


	// 是主帅帐或粮仓,增加本君主的FoodStore数量
	if( pUnit->Draw.nFile == 0
		|| pUnit->Draw.nFile == 1
		|| pUnit->Draw.nFile == 10
		|| pUnit->Draw.nFile == 11 )
	{
		GAME.Players[pUnit->Draw.nPlayer].nFoodStore++;
	}

	if( EYE_IfUnitIsSoldier( pUnit ) )
	{
		pUnit->Soldier.nGenID = MAP_DATA_NONE;
		pUnit->Soldier.nResType = QXZIYUAN;	// 初始化工人的资源类型为空
	}
	else if( EYE_IfUnitIsGen( pUnit ) )
	{
		// 清空将领手下的士兵数组
		memset( pUnit->Gen.wTroop, MAP_DATA_NONE, sizeof(WORD)*GENERAL_TROOP_MAX );
	}

// draw shadow
	// 只有我方才有阴影改变的问题
	if( GAME.nMe == pUnit->Draw.nPlayer )
	{
		// 视野
		int nVRange = EYE_GetViewRange( &pUnit->Draw );
		SHADOW_Draw0( pUnit->Draw.nX, pUnit->Draw.nY, 
			pUnit->Draw.nXLast, pUnit->Draw.nYLast, nVRange );// Draw solid shadow

		//lwc
		//存在
		Assert( pUnit->nHasShadow == 0 );
        SHADOW_existent(pUnit->Draw.nX,pUnit->Draw.nY,nVRange);
		//lwc
	}
	pUnit->nHasShadow++;
	// draw to minimap
	MINI_SetUnitData( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nPlayer, pUnit->Draw.nLocationSize );	// for minimap

	return codeUEx;
}

// 删除单元,对阴影有特殊处理
// pUnit	:	unit pointer to be destroyed
// return	:	TRUE if successful
BOOL CTRL_UNIT_Destroy( struct UNIT_STRUCT *pUnit )
{
	WORD codeUEx;

	// draw shadow
#ifdef	_DEBUG
	if( !pUnit )	
	{
		OutputDebugString( "CTRL_UNIT_Create Error(2): Cannot find unit!\n" );
		return FALSE;
	}
#endif

	// 是主帅帐或粮仓,减少本君主的FoodStore数量
	if( pUnit->Draw.nFile == 0
		|| pUnit->Draw.nFile == 1
		|| pUnit->Draw.nFile == 10
		|| pUnit->Draw.nFile == 11 )
	{
		GAME.Players[pUnit->Draw.nPlayer].nFoodStore--;
	}

	if( pUnit->nHasShadow > 0 )
	{	// 如果不在建筑中,要删除阴影
		// erase from minimap
		MINI_SetGroundData( pUnit->Draw.nXLast, pUnit->Draw.nYLast, pUnit->Draw.nLocationSize );	// for minimap

		// 只有我方才有阴影改变的问题
		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--;
		codeUEx = MAP_SetUnitData( pUnit->Draw.nLayer, pUnit->Draw.nX, pUnit->Draw.nY, MAP_DATA_NONE );
	}
	else
	{
		GAME.Players[pUnit->Draw.nPlayer].wUnitCounter--;
		pUnit->nType = MAP_UNIT_TYPE_NONE;
	}

	// 在没找到错误之前,用来修正错误
	Assert( pUnit->nType == MAP_UNIT_TYPE_NONE );
#ifndef	_DEBUG
	pUnit->nType = 0;
#endif

	if( codeUEx != MAP_DATA_NONE )
	{
		OutputDebugString( "CTRL_UNIT_Destroy Error(1): Error when destroying unit!\n" );
		return FALSE;
	}
	return TRUE;
}
///////////////////

//////////////////
// only used by CTRL_UNIT_Move()
void CTRL_UNIT_MoveShadow( struct CTRL_FRAME_STRUCT *pDraw );

// 移动单元,每当移动一个格子后,修改阴影数组的内容
// pDraw	:	unit to be moved
// nType	:	type of unit
// 返回	0,被堵住;1,可以走;2,沼泽;>2,遇到城门,返回城门的ID
int CTRL_UNIT_Move( struct CTRL_FRAME_STRUCT *pDraw, int nType )
{
	BOOL ret;
	
	ret = MAP_MoveUnit( pDraw, nType );
	if( ret == FALSE )	
	{
		int nNum = MAP_nLocationNum[pDraw->nLocationSize];
		int nX[16], nY[16];
		BOOL bOdd = pDraw->nY&1;
		for( int i=0; i<nNum; i++ )
		{
			nX[i] = pDraw->nX+MAP_ptLocation[bOdd][i].x;
			nY[i] = pDraw->nY+MAP_ptLocation[bOdd][i].y;
			Assert( !EYE_IfOutOfRange( nX[i], nY[i] ) );
			struct UNIT_STRUCT *pU = MAP_GetUnit( nX[i], nY[i] );
			if( pU != NULL )
			{
				if( EYE_IfUnitIsDoor( pU )
					&& pU->Draw.nPlayer == pDraw->nPlayer )	// 是自己的城门
				{
					return pU->nID;
				}
			}
		}
		return 0;
	}

	// 移动阴影
	CTRL_UNIT_MoveShadow( pDraw );

	// 检测是否该地形是沼泽
	WORD codeG = MAP_GetGroundData( pDraw->nLayer, pDraw->nX, pDraw->nY );
	Assert( codeG != MAP_DATA_NONE );
	struct MAP_GROUND_CODE_STRUCT stctG;
	MAP_GroundDeCode( codeG, &stctG );
	if( stctG.nFile == 4 )	// 沼泽
		return 2;
	return 1;
}

void CTRL_UNIT_MoveShadow( struct CTRL_FRAME_STRUCT *pDraw )
{
	// 只有我方才有阴影改变的问题
	if( GAME.nMe == pDraw->nPlayer )
	{
		// 视野
		int nVRange = EYE_GetViewRange( pDraw );
		SHADOW_Draw( pDraw->nX, pDraw->nY, 
			pDraw->nXLast, pDraw->nYLast,
			nVRange );	// Draw solid shadow
	}

	// 敌人也画
	// erase from minimap
	MINI_SetGroundData( pDraw->nXLast, pDraw->nYLast, pDraw->nLocationSize );	// for minimap
	// draw to minimap
	MINI_SetUnitData( pDraw->nX, pDraw->nY, pDraw->nPlayer, pDraw->nLocationSize );	// for minimap
}
///////////////////

///////////////////
/*
// 判断是否该将领应该撤离战场,在解散部队后发生
BOOL CTRL_UNIT_ToDisapear( struct UNIT_STRUCT *pUnitG )
{
	int i;

	Assert( EYE_IfUnitIsGen( pUnitG ) );

	// 不能直接删除,必须下达命令
	// 查看是否可以删除将领(当将领所带领的士兵为0时)
	int bYes = TRUE;
	for( i=0; i<GENERAL_TROOP_MAX; i++ )
	{
		if( pUnitG->Gen.wTroop[i] != MAP_DATA_NONE )
		{
			bYes = FALSE; break;
		}
	}

	if( bYes )
	{
		struct CTRL_TASK_STRUCT Task;
		CTRL_TASK_Clear( &Task );
		Task.nLevel = 0;		// 该命令的级别,0 is the highest, 5 is the lowest
		Task.nID = pUnitG->nID;
		Task.nTaskID = SHANCHU;	// 任务
		Task.nTaskIDEx = 1;		// 只是删除部队
		Task.bDone = TRUE;

		// 下达任务到队列中
		CTRL_TASK_DeployByComputer( pUnitG->Draw.nPlayer, &Task );
		return TRUE;
	}
	return FALSE;
}
*/
//////////////////////

⌨️ 快捷键说明

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