亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cbctrls.cpp

?? 赤壁之戰的游戲源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/////////////////
// CBCtrlS.cpp	:	<< chibi >> global contral data structure
// v0014		:	Feb.16.1997,devided from CBCTRL.cpp
// v0020		:	Mar.29.1997,add most controls
// written by	:	Liu Gang
// Compiler		:	Visual C++ 4.2
// Copyright	:	WayAhead Co.Ltd.		1996-1997
/////////////////
// 此文件包含游戲對控制結構(命令,狀態,步,幀)的處理
#include "stdafx.h"
#include "Assert.h"

#include "CBCTRL.h"
#include "CBShadow.h"
#include "CBMini.h"
#include "CBDATA.h"

#include "CBEyes.h"
//////////////////////
// Dong hai, 行軍算法
#include "March_n.h"
extern	BYTE		MARCH_TrackForward[NUMBER_OF_TRACK];//此數組為用來存儲最后由行軍軌跡求出的行軍路線的方向變化
extern short		MARCH_Track[NUMBER_OF_TRACK][3];//此數組為用來存儲最后的行軍軌跡的數組

//////////////////////
// LHJ
#include "marco.h"		// BUTTON_UP BUTTON_DISABLE
#include "interfac.h"	// FACE_SetNumberButtonState(int number, int state);
#include "cbprompt.h"	// FACE_UpdateExperience(), FACE_UpdateSoldierNumber()
// LHJ
//////////////////////

//////////////////////
// externals
extern int MAP_nLocationNum[4];						// defined in CBMap.cpp
extern POINT MAP_ptLocation[2][MAP_LOCATION_MAX];	// defined in CBMap.cpp
extern int MAP_nDrawNum[4];							// defined in CBMap.cpp
//////////////////////

//////////////////////
// local functions
// 在剛剛創建單元后,使用此函數對該單元賦給屬性值
void CTRL_SetUnitAttribute( struct UNIT_STRUCT *pUnit );
//////////////////////

//////////////////////
// 狀態處理
// Status
//////////////////////
// check each unit if should change Status
void CTRL_STATUS_Main()
{
	for( int i=0; i<GAME_PLAYER_MAX; i++ )
	{
#ifdef	_DEBUG
		int nCounter=0;
#endif
		for( int j=0; j<PLAYER_UNIT_MAX; j++ )
		{
			if( GAME.Players[i].Unit[j].nType != MAP_UNIT_TYPE_NONE )
			{
				CTRL_STATUS_Change( &GAME.Players[i].Unit[j] );
#ifdef	_DEBUG
				nCounter++;
#endif
			}
		}
#ifdef	_DEBUG
		if( GAME.Players[i].wUnitCounter!= nCounter )
			OutputDebugString( "CTRL_STATUS_Main Error(0): Unit number check error!\n" );
#endif
	}
}

// change the Status of the unit
// pUnit	:	the unit to be changed to
inline void CTRL_STATUS_Change( struct UNIT_STRUCT *pUnit )
{
	Assert( pUnit->nType != MAP_UNIT_TYPE_NONE );

	// 死亡時不響應任何命令
	if( EYE_IfUnitIsDead( pUnit ) )	return;	// has dead

#ifdef	_DEBUG
		// 是否要從建筑里出來
		if( pUnit->nHasShadow == 0 )
		{
			Assert( pUnit->Status.bIRQ == TRUE );
			pUnit->Status.bIRQ = TRUE;
		}
#endif

	if( pUnit->Task.nTaskID == QUXIAO )	return;	// no command at all

////////////////////////////
	// 清除Bug!!!
	// 必須當單元完成一個“步”操作后,才能接收新的命令
	if( pUnit->Draw.ptOff.x != 0 || pUnit->Draw.ptOff.y != 0 )
		return;
////////////////////////////

	// new command
	// 新命令,TASK的nTaskID不為QUXIAO,bDone為TRUE
	if( pUnit->Task.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", "change0\n" );
		}
#endif //_DEBUG_OFFSET_

		// 對某些舊命令要有一些結束的操作
		if( pUnit->Status.nTaskID == GONGJI )
		{
			Assert( pUnit->Status.nTaskIDEx == 2 );
			Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
			struct UNIT_STRUCT *pU = MAP_GetUnit( pUnit->Status.nParam1 );
			Assert( pU );
			pU->nIDAttackMe = MAP_DATA_NONE;
		}
		pUnit->nIDAttackMe = MAP_DATA_NONE;

		if( pUnit->Status.nTaskID == YUNSONG
			&& pUnit->Status.nTaskIDEx == 1
			&& EYE_IfUnitIsWorker( pUnit ) 
			&& pUnit->Status.bDone == FALSE )
		{
			int nDir;
			nDir = pUnit->Draw.nDir;
			int bOdd = pUnit->Draw.nY&1;
			int nX = pUnit->Draw.nX + MAP_ptSenser[bOdd][0][nDir].x;
			int nY = pUnit->Draw.nY + MAP_ptSenser[bOdd][0][nDir].y;
			WORD codeG = MAP_GetGroundData( pUnit->Draw.nLayer, nX, nY );
			if( codeG != MAP_DATA_NONE )
			{
				struct MAP_GROUND_CODE_STRUCT stctG;
				MAP_GroundDeCode( codeG, &stctG );
				Assert( stctG.nAttr != MAP_SPECIAL_NONE );
				Assert( stctG.nAttr == pUnit->Soldier.nResType+4 );	// 碰巧
				stctG.nAttr -= 4;	// 設置為采集完
				codeG = MAP_GroundEnCode( stctG );
				MAP_SetGroundData( pUnit->Draw.nLayer, nX, nY, codeG );
			}
		}

		if( pUnit->Status.nTaskID == MFU )
		{
			CTRL_SetSTG( &pUnit->Draw, MAIFU, FALSE );
		}

		// 對于已經打開的門,則不再執行此命令
		// Aug.8, 1997, Liu Gang
		if( pUnit->Status.nTaskID == KAIMEN 
			&& pUnit->nCounter != 0 )
		{
			pUnit->Task.bDone = FALSE;
			// 計數器不能為0
			//pUnit->nCounter = 0;
			return;
		}

//		OutputDebugString( "CTRL_TASK : New Command: " );
//		OutputString( pUnit->Task.nID, "," );
//		OutputString( pUnit->Task.nTaskID, "," );
//		OutputString( pUnit->Task.nTaskIDEx, "\n" );
		// set TASK to "doing"
		// 設置完畢狀態后,bDone為FALSE
		pUnit->Task.bDone = FALSE;
		pUnit->nCounter = 0;

		// 運送任務,但是此時該單元已經攜帶有資源了
		if( pUnit->Task.nTaskID == YUNSONG
			&& EYE_IfUnitIsWorker( pUnit ) 
			&& pUnit->Soldier.nResource > 0 )
		{
			// 設置該士兵為回送的任務
			struct CTRL_TASK_STRUCT Task;
			CTRL_TASK_Clear( &Task );
			Task.nID = pUnit->nID;
			// 目的地是所帶資源的家
			Task.nParam1 = TY_FindNearHome(pUnit->Draw.nPlayer,pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Soldier.nResType);
			if( Task.nParam1 == MAP_DATA_NONE )
			{	// 如果沒有老家,則結束命令
				Task.nTaskID = JIESHU;
			}
			else
			{
				Task.nTaskID = HUISONG;
				Task.nTaskIDEx = 2;	// MOUSE_HITRESULT_UNIT
				Task.nTaskIDEx2 = pUnit->Task.nTaskIDEx2;	// 保存資源類型
				if( pUnit->Task.nTaskIDEx == 1 )	// MOUSE_HITRESULT_GROUND
				{
					Task.nParam2 = pUnit->Task.nParam1;		// 原來資源的位置Z
					Task.nParam3 = pUnit->Task.nParam2;		// 原來資源的位置X
					Task.nParam4 = pUnit->Task.nParam3;		// 原來資源的位置Y
				}
				else
				{
					Task.nParam4 = pUnit->Task.nParam1;		// 保存原來的資源建筑ID
				}
				Assert( Task.nParam1 != MAP_DATA_NONE );
			}
			Task.bDone = TRUE;
			CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
			return;
		}

		if( (pUnit->Task.nTaskID == XIULI
			|| (pUnit->Task.nTaskID == YIDONG && pUnit->Task.nTaskIDEx == 2) )
			&& EYE_IfUnitIsWorker( pUnit ) 
			&& pUnit->Soldier.nResType != QXZIYUAN
			&& pUnit->Soldier.nResource > 0 )
		{	// 把工人任務變為回送
			struct UNIT_STRUCT *pU = MAP_GetUnit( pUnit->Task.nParam1 );
			Assert( pU );
			if( !EYE_IfUnitIsDead( pU ) 
				&& EYE_IfUnitIsBuild( pU ) && (pU->Draw.nPlayer == pUnit->Draw.nPlayer) )
			{
				int nRes = EYE_GetUResHome( pU );
				if( nRes == pUnit->Soldier.nResType || nRes == SUOYOUZY 
					|| (nRes == MAITIAN && pUnit->Soldier.nResType == LIANGCANG) ) 
				{
					struct CTRL_TASK_STRUCT Task;
					CTRL_TASK_Clear( &Task );
					Task.nID = pUnit->nID;
					Task.nTaskID = HUISONG;
					Task.nTaskIDEx = 2;
					Task.nTaskIDEx2 = pUnit->Soldier.nResType;	// 保存資源類型
					if( pUnit->Soldier.nResType == 0 
						|| pUnit->Soldier.nResType == 1 )
					{	// 地形類型資源
						Task.nParam2 = pUnit->Draw.nLayer;
						Task.nParam3 = pUnit->Draw.nX;
						Task.nParam4 = pUnit->Draw.nY;
					}
					else
					{	// 建筑類型資源
						Task.nParam4 = MAP_DATA_NONE;
					}
					Task.nParam1 = pUnit->Task.nParam1;		// 目的單元ID
					Assert( Task.nParam1 != MAP_DATA_NONE );
					Task.bDone = TRUE;

					// 發送
					CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
					return;
				}
			}
		}

		// set status to unit
		CTRL_TASK_Copy( &pUnit->Status, &pUnit->Task );

		// change status if needed
		// 對于多狀態任務,設置其第一狀態為移動
//		if( pUnit->Status.nTaskID == JIANZAO )	// 建造
//			pUnit->Status.nTaskIDEx = 1; //MOUSE_HITRESULT_GROUND,設置目的地類型

		if( pUnit->Status.nTaskID == XIULI )	// 修理
			Assert( pUnit->Status.nTaskIDEx == 2 );
//			pUnit->Status.nTaskIDEx = 2; //MOUSE_HITRESULT_GROUND,設置目的地類型

		// 卸載,當nTaskIDEx2為0時,要先移動后卸載
		if( pUnit->Status.nTaskID == XIEZAI 
			&& pUnit->Status.nTaskIDEx2 == 0 )
		{
			pUnit->Status.nTaskID = YIDONG;
		}
		if( pUnit->Status.nTaskID == YUNZAI
			&& !(EYE_IfUnitIsTransport( pUnit ) 
				&& pUnit->Status.nTaskIDEx2 == 1) )
		{
			pUnit->Status.nTaskID = YIDONG;
		}

		if( !EYE_IfUnitIsBuild( pUnit ) )
		{
			switch( pUnit->Status.nTaskID )
			{
			case	JIANZAO:	// 建造
			case	GONGJI:		// 攻擊
			case	YUNSONG:	// 運送
			case	XIULI:		// 修理
			//case	ZHENXING:	// 陣型
			//case	DANTIAO:	// 單挑
			case	HUISONG:	// 回送
				pUnit->Status.nTaskID = YIDONG;
				break;
			}
		}

		// 設置動畫幀狀態
		if( pUnit->Status.nTaskID == YIDONG
			&& 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 == YIDONG )
		{
			int nEndx, nEndy, nEndZ;
			WORD codeG;

			Assert( pUnit->Status.nParam2 <= MAP_Lib.szNum.cx );	// 層號
			Assert( pUnit->Status.nParam3 <= MAP_Lib.szNum.cy );	// 層號

			// 如果目的地和出發點一樣,則狀態結束,不結構化
			if( pUnit->Draw.nX == pUnit->Status.nParam2 && pUnit->Draw.nY == pUnit->Status.nParam3 )
			{
				pUnit->Status.bDone = TRUE;
				return;
			}

			BOOL bShouldDuSe = TRUE;	// 當目的地到達不了時是否設置堵塞標志
			if( pUnit->Status.nTaskIDEx == 1 )	// hit ground
			{
				POINT ptNew = MAP_FindRegion( pUnit->Status.nParam1, pUnit->Status.nParam2,pUnit->Status.nParam3, MAP_Lib.Unit[pUnit->Draw.nFile].nItems[0], pUnit->nID );
				//Assert( ptNew.x!=-1 && ptNew.y!=-1 );
				if( ptNew.x == -1 || ptNew.y == -1 )
				{
					ptNew.x = pUnit->Status.nParam2,
					ptNew.y = pUnit->Status.nParam3;
					bShouldDuSe = FALSE;// 如果沒在附近找到可以到達的目的地,則不設置預堵塞
				}
				nEndZ = pUnit->Status.nParam1;
				nEndx = ptNew.x,
				nEndy = ptNew.y;

				// 修改層號
				for(;;)
				{	

					codeG = MAP_GetGroundData( nEndZ, nEndx, nEndy );
					if( codeG != MAP_DATA_NONE )
						break;
					if( nEndZ == 0 && codeG == MAP_DATA_NONE )
					{
						Assert(0);
						break;
					}
					nEndZ--;
				}
			}
			else if( pUnit->Status.nTaskIDEx == 2 )	//hit unit
			{
				Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
				struct UNIT_STRUCT *pUnitE = MAP_GetUnit( pUnit->Status.nParam1 );
				POINT ptNew = MAP_FindRegion( pUnitE->Draw.nLayer, pUnitE->Draw.nX, pUnitE->Draw.nY, MAP_Lib.Unit[pUnit->Draw.nFile].nItems[0], pUnit->nID );
				//Assert( ptNew.x!=-1 && ptNew.y!=-1 );
				if( ptNew.x == -1 )
				{
					ptNew.x = pUnit->Status.nParam2,
					ptNew.y = pUnit->Status.nParam3;
					bShouldDuSe = FALSE;// 如果沒在附近找到可以到達的目的地,則不設置預堵塞
				}
				nEndZ = pUnitE->Draw.nLayer;
				nEndx = ptNew.x, 
				nEndy = ptNew.y;

				// 修改層號
				for(;;)
				{	
					codeG = MAP_GetGroundData( nEndZ, nEndx, nEndy );
					if( codeG != MAP_DATA_NONE )
						break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
wwwwww.欧美系列| 日韩一区二区三| 成人av一区二区三区| 国产精品自在在线| 激情综合一区二区三区| 美女国产一区二区三区| 男男视频亚洲欧美| 黄色成人免费在线| 国产在线精品一区二区不卡了| 精品亚洲免费视频| 国产成人精品亚洲午夜麻豆| 91视频在线看| 欧美精品 国产精品| 日韩欧美国产一二三区| 久久久国际精品| 亚洲免费伊人电影| 免费观看30秒视频久久| 国产高清在线观看免费不卡| 97久久精品人人做人人爽50路| 色国产综合视频| 日韩欧美中文字幕制服| 久久久国产精品麻豆| 亚洲欧美日韩一区| 日韩在线一区二区三区| 国产v综合v亚洲欧| 在线观看日产精品| 精品少妇一区二区三区在线播放 | 综合电影一区二区三区 | 成人激情校园春色| www.激情成人| 欧洲激情一区二区| 成人免费观看av| 久久精品视频在线免费观看| 精品理论电影在线观看| 久久久九九九九| 中文字幕二三区不卡| 中文字幕在线不卡视频| 亚洲综合色区另类av| 午夜激情综合网| 国内成人免费视频| 97se亚洲国产综合自在线不卡| 欧美亚洲动漫制服丝袜| 制服丝袜亚洲播放| 欧美精品一区在线观看| 中文字幕亚洲一区二区va在线| 亚洲激情图片一区| 免费人成在线不卡| 99国产精品一区| 日韩一区二区三区在线观看| 国产午夜精品在线观看| 一区二区三区精品在线| 国产在线视频精品一区| av毛片久久久久**hd| 欧美另类一区二区三区| 欧美国产综合一区二区| 亚洲国产美女搞黄色| 国产经典欧美精品| 久久99国产乱子伦精品免费| 国产成人午夜99999| 色综合久久中文综合久久97| 不卡av免费在线观看| 国产亚洲制服色| 喷水一区二区三区| 色哟哟国产精品| 久久久蜜桃精品| 麻豆久久久久久久| 91麻豆视频网站| 精品国产乱码久久久久久影片| 一区二区三区欧美视频| 国产传媒一区在线| 欧美一区二区三区在线| 亚洲成人三级小说| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美大片日本大片免费观看| 亚瑟在线精品视频| 91蜜桃免费观看视频| 久久久久久久久久久久久女国产乱| 亚洲成人在线观看视频| 一本色道久久加勒比精品 | 中文字幕在线不卡国产视频| 久久99精品国产麻豆不卡| 欧美午夜电影网| 伊人婷婷欧美激情| 97精品电影院| 国产精品久久久久久久裸模| 久久成人久久鬼色| 欧美一区二区三区人| 亚洲成a人片在线观看中文| 99国产精品久久久久久久久久| 欧美激情一二三区| 国产a久久麻豆| 精品欧美一区二区在线观看| 麻豆精品一区二区综合av| 欧美日韩国产大片| 日韩黄色片在线观看| 色999日韩国产欧美一区二区| 国产精品美女久久久久av爽李琼| 国产精品一区二区视频| 国产女主播在线一区二区| 成人午夜免费视频| 亚洲图片欧美激情| 在线视频综合导航| 视频在线在亚洲| 欧美不卡123| 国产精品一区二区久激情瑜伽| 久久亚洲综合色| 成人激情文学综合网| 中文字幕视频一区二区三区久| 91网站在线观看视频| 亚洲国产欧美在线人成| 日韩三级视频中文字幕| 国产一区二区三区美女| 国产精品乱人伦| 日本精品视频一区二区| 午夜欧美大尺度福利影院在线看| 5566中文字幕一区二区电影| 久久se这里有精品| 国产精品久久久久毛片软件| 欧美无砖砖区免费| 韩国理伦片一区二区三区在线播放| 久久午夜国产精品| 在线视频一区二区三区| 一区二区三区在线免费视频| 欧美综合亚洲图片综合区| 日本在线不卡一区| 中文字幕中文字幕一区| 欧美日韩视频在线观看一区二区三区| 激情欧美一区二区| 国产精品久久夜| 91精品国产乱码| 不卡av免费在线观看| 亚洲福利电影网| 欧美精彩视频一区二区三区| 欧美日韩一区二区三区四区 | av福利精品导航| 午夜精品爽啪视频| 中文在线资源观看网站视频免费不卡| 欧日韩精品视频| 国产高清不卡一区| 琪琪久久久久日韩精品| 国产精品成人免费精品自在线观看| 制服视频三区第一页精品| av一区二区三区黑人| 久久国产综合精品| 亚洲国产色一区| 2020国产精品自拍| 91成人免费在线视频| 精品夜夜嗨av一区二区三区| 日韩va欧美va亚洲va久久| 亚洲黄色尤物视频| 国产精品视频一二三区| 欧美mv日韩mv亚洲| 欧美乱熟臀69xxxxxx| 欧洲精品一区二区| 91黄色小视频| 91丝袜高跟美女视频| 国产99久久久精品| 久久精工是国产品牌吗| 日韩av中文字幕一区二区三区| 亚洲第一激情av| 亚洲精品日韩综合观看成人91| 中文字幕成人在线观看| 26uuu国产一区二区三区| 欧美一级片免费看| 在线电影一区二区三区| 欧美无乱码久久久免费午夜一区| jlzzjlzz国产精品久久| 国产不卡在线视频| 日韩av网站在线观看| 一区二区三区自拍| 亚洲欧美色综合| 一区二区三区不卡视频在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 久久精品一区四区| 国产欧美一区二区三区沐欲 | 91精品国产欧美一区二区成人 | 亚洲成a人片综合在线| 亚洲va欧美va国产va天堂影院| 亚洲综合av网| 首页欧美精品中文字幕| 男男成人高潮片免费网站| 亚洲伊人伊色伊影伊综合网| 一区二区三区小说| 亚洲gay无套男同| 麻豆精品一区二区综合av| 国产在线观看一区二区| 国产精品影视在线观看| www.久久久久久久久| 欧美亚洲综合色| 在线一区二区三区四区五区| 日韩精品影音先锋| 国产精品天美传媒| 亚洲精品欧美在线| 美国av一区二区| 成人黄色电影在线 | 亚洲一区在线观看视频| 日韩一区精品字幕| 高清在线成人网| 欧美日韩亚洲不卡| 精品国产伦一区二区三区免费|