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

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

?? cbctrls.cpp

?? 赤壁之戰的游戲源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//////////////////////
// local functions
// 在剛剛創建單元后,使用此函數對該單元賦給屬性值
void CTRL_SetUnitAttribute( struct UNIT_STRUCT *pUnit )
{
	//switch( pUnit->nType 
}
//////////////////////

// 部隊
//////////////////////
// 根據將領的編號產生部隊
// nZ, nX, nY	:	position to locate,產生的位置
// nGenNum		:	general index number in DATA_Lib
// nPlayer		:	player to be added to
// nType		:	troop type
// return		:	general ID extended code if successful,
//					MAP_DATA_NONE if failed
WORD CTRL_GROUP_Create( int nZ, int nX, int nY, DWORD nGenNum, int nPlayer, int nType )
{
	// 從將領的類型得到單元種類編號
	int nGenFile[4]={35,31,33,29};
	if( nGenNum <= 0 || nGenNum > 118 )	return MAP_DATA_NONE;	// 超過范圍
	DWORD codeU = MAP_Lib.Unit[nGenFile[DATA_Lib.Gen[nGenNum].nType-1]].nItems[0];

	// 設置游戲者
	struct MAP_UNIT_CODE_STRUCT stctU;
	MAP_UnitDeCode( codeU, &stctU );
	stctU.nPlayer = nPlayer;
	if( nType == MAP_UNIT_TYPE_SGEN )
		stctU.nFile = 52;	// 如果是水軍將領,則變為大戰船
	codeU = MAP_UnitEnCode( stctU );

	// 創建單元
	WORD codeUEx = CTRL_UNIT_Create( nZ, nX, nY, codeU );
	if( codeUEx == MAP_DATA_NONE )
	{
		OutputDebugString( "CTRL_GROUP_Create Error(1): Cannot create unit!\n" );
		return codeUEx;
	}
	struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
	Assert( pUnit );

	// 把該將領添加在將領數組中
	BOOL bSuccess = FALSE;
	for( int i=0; i< PLAYER_GROUP_MAX; i++ )
	{
		if( GAME.Players[nPlayer].wGroup[i] == MAP_DATA_NONE )
		{
			GAME.Players[nPlayer].wGroup[i] = codeUEx;
			GAME.Players[nPlayer].wGroupCounter++;
			bSuccess = TRUE;
			break;
		}
	}
	if( !bSuccess )	
	{
		CTRL_UNIT_Destroy( pUnit );
		//部隊數不能超過20個,無法組建部隊
		FACE_ShowPromptInfor( 19 ) ;
		return MAP_DATA_NONE;
	}

	// 設置其它屬性
	//pUnit->nType = MAP_UNIT_TYPE_GEN;
	pUnit->nType = nType;
	pUnit->Gen.nID = (WORD)nGenNum;
	pUnit->Gen.nType = DATA_Lib.Gen[nGenNum].nType;		// 將領的類型
	DATA_Lib.Gen[nGenNum].bOnBattle = TRUE;				// 在戰場上了

	// 生命值
	pUnit->nLife = DATA_Lib.Gen[nGenNum].dwLife;		// 重設置生命值
	
	// 個人屬性
//	pUnit->Gen.nHealth = DATA_Lib.Gen[nGenNum].nHealth;	// 將領的體力
	pUnit->Gen.nMorale = 70;	// 將領的初始士氣
	pUnit->Gen.nLineUp = 0;	//陣型
//	pUnit->Gen.nTactic = 0;	// 謀略
//	pUnit->Gen.nLevel = DATA_Lib.Gen[nGenNum].nLevel;	// 將領的級別

	// 如果是自己人,設置焦點狀態
//	if( EYE_IfSheIsMine( pUnit ) )
//		pUnit->Draw.bUpdate = TRUE;

	// 手下士兵數組,在CTRL_UNIT_Create()中做過了
	// memset( pUnit->Gen.wTroop, MAP_DATA_NONE, sizeof( WORD )*GENERAL_TROOP_MAX );

	if( GAME.nMe == nPlayer )
	{
		// 設置部隊按鈕,打開
		// LHJ
		FACE_SetNumberButtonState( i, BUTTON_UP, TRUE );
		// LHJ
	}

	return codeUEx;
}

// 刪除部隊:解散部隊,并刪除將領單元
// pUnit	:	unit pointer to be destroyed
// return	:	TRUE if successful
BOOL CTRL_GROUP_Destroy( struct UNIT_STRUCT *pUnit )
{
	int nPlayer;
	WORD codeUEx;
	
#ifdef	_DEBUG
	{
		Assert( pUnit );
		Assert( EYE_IfUnitIsGen( pUnit ) );
		for( int i=0; i<GENERAL_TROOP_MAX; i++ )
		{
			if( pUnit->Gen.wTroop[i] != MAP_DATA_NONE )
			{
				OutputDebugString( "CTRL_DestroyGrup Warning: Destroy general before release troops!\n" );
			}
		}
	}
#endif

	// 把將領從將領數據數組里永遠刪除
	if( pUnit->nLife <= 0 )
		DATA_Lib.Gen[pUnit->Gen.nID].nID = 0;
	DATA_Lib.Gen[pUnit->Gen.nID].bOnBattle = FALSE;	// 設置返回后臺的標志
	if( pUnit->nLife < 0 )	pUnit->nLife = 0;

	// 生命值
	DATA_Lib.Gen[pUnit->Gen.nID].dwLife = pUnit->nLife;	// 保存生命值

	nPlayer = pUnit->Draw.nPlayer;
	codeUEx = pUnit->nID;

	// changed on July 31, 1997
	// 從將領數組中刪除該將領
	BOOL bSuccess = FALSE;
	for( int i=0; i< PLAYER_GROUP_MAX; i++ )
	{
		if( GAME.Players[nPlayer].wGroup[i] == codeUEx )
		{
			GAME.Players[nPlayer].wGroup[i] = MAP_DATA_NONE;
			GAME.Players[nPlayer].wGroupCounter--;
			bSuccess = TRUE;
			break;
		}
	}

	if( !bSuccess )
	{
		OutputDebugString( "Cannot find general in general list!\n" );
	}
	else if( GAME.nMe == nPlayer )
	{
		// 設置部隊按鈕,關閉
		// LHJ
		FACE_SetNumberButtonState( i, BUTTON_DISABLE, TRUE );
		// LHJ
	}

	// 直接刪除
	if( !CTRL_UNIT_Destroy( pUnit ) )
		return FALSE;

	return TRUE;
}

// 通過將領的編號尋找將領的ID
// nPlayer	:	player to search in
// nGenNum	:	Index number of general in DATA_Lib,將領的編號
// return	:	general ID extended code if successful,
//				MAP_DATA_NONE if failed
WORD CTRL_GROUP_Find( int nPlayer, WORD nGenNum )
{
	for( int i=0; i<PLAYER_GROUP_MAX; i++ )
	{
		WORD codeUEx = GAME.Players[nPlayer].wGroup[i];
		if( codeUEx != MAP_DATA_NONE )
		{
			struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
			Assert( pUnit );
			if( pUnit->Gen.nID == nGenNum )
			{
				return codeUEx;
			}
		}
	}
	return MAP_DATA_NONE;
}

// 把單元直接加入到部隊中
// pUnitG	:	pointer of the general to be added to
// pUnit	:	unit pointer to be added
// return	:	TRUE if successful
BOOL CTRL_GROUP_Add( struct UNIT_STRUCT *pUnitG, struct UNIT_STRUCT *pUnit )
{
	for( int i=0; i<GENERAL_TROOP_MAX; i++ )
	{
		if( pUnitG->Gen.wTroop[i] == MAP_DATA_NONE )
		{	// set relationship
			// 把將領標識加到士兵里
			pUnit->Soldier.nGenID = pUnitG->nID;
			// 把士兵ID加到將領的士兵數組里
			pUnitG->Gen.wTroop[i] = pUnit->nID;
			return TRUE;
		}
	}
	OutputDebugString( "CTRL_GROUP_Add Warning(10): Troop list is full!\n" );
	return FALSE;
}

// 從部隊中直接解散單元
// pUnit	:	unit pointer to be subed,將要被解散的部隊
// return	:	TRUE if successful
BOOL CTRL_GROUP_Sub( struct UNIT_STRUCT *pUnit )
{
	struct UNIT_STRUCT *pUnitG;
	BOOL bDone = FALSE;

	// 從將領的士兵數組中刪除該士兵的標識
	Assert( pUnit->Soldier.nGenID != MAP_DATA_NONE );

	pUnitG = MAP_GetUnit( pUnit->Soldier.nGenID );
	Assert( pUnitG );
	Assert( EYE_IfUnitIsGen( pUnitG ) );
	for( int i=0; i<GENERAL_TROOP_MAX; i++ )
	{
		if( pUnitG->Gen.wTroop[i] == pUnit->nID )
		{
			// 從士兵中刪除將領的標識
			pUnit->Soldier.nGenID = MAP_DATA_NONE;
			// 將領的士兵數組中刪除該士兵
			pUnitG->Gen.wTroop[i] = MAP_DATA_NONE;
			bDone = TRUE;
			break;
		}
	}

	if( !bDone )
	{
		OutputDebugString( "CTRL_GROUP_Sub Error(10): Not found itself in its general list!\n" );
		return FALSE;// 刪除失敗,在自己的部隊中沒有找到自己
	}
	return TRUE;
}

// 從部隊中解散手下的所有士兵
// pUnit	:	general pointer to sub soldiers from
// return	:	TRUE if successful
void CTRL_GROUP_ToSubAll( struct UNIT_STRUCT *pUnit )
{
	struct UNIT_STRUCT *pU;
	Assert( pUnit );
	Assert( EYE_IfUnitIsGen( pUnit ) );

	// 把將領是否在戰場上的標志設置回來
	DATA_Lib.Gen[pUnit->Gen.nID].bOnBattle = FALSE;

	for( int i=0; i<GENERAL_TROOP_MAX; i++ )
	{
		if( pUnit->Gen.wTroop[i] != MAP_DATA_NONE )
		{
			pU = MAP_GetUnit( pUnit->Gen.wTroop[i] );
			Assert( pU );
			Assert( EYE_IfUnitIsSoldier( pU ) );
			pU->Soldier.nGenID = MAP_DATA_NONE;
			pUnit->Gen.wTroop[i] = MAP_DATA_NONE;
		}
	}
}
//////////////////////

// 其它
//////////////////////
// 一個單元走進建筑或上船
// bCheck	:	為真時,要檢測地面上是否有自己,如果是,把自己從地面清干凈
void CTRL_UNIT_InUnit( struct UNIT_STRUCT *pUnit, BOOL bCheck/* = FALSE*/ )
{

	Assert( pUnit->Status.bIRQ == FALSE );
	Assert( pUnit->nHasShadow == 1 );
	Assert( pUnit->Draw.ptOff.x == 0 && pUnit->Draw.ptOff.y == 0 );

	// 把是誰攻擊我去掉
	pUnit->nIDAttackMe = MAP_DATA_NONE;

	int bOdd = pUnit->Draw.nY&1;
	int nXNext, nYNext;
	if( bCheck )
	{
		for( int i=0; i<MAP_nLocationNum[pUnit->Draw.nLocationSize]; i++ )
		{
			nXNext = pUnit->Draw.nX + MAP_ptLocation[bOdd][i].x;
			nYNext = pUnit->Draw.nY + MAP_ptLocation[bOdd][i].y;
			if( MAP_GetUnitDataEx( nXNext, nYNext ) == pUnit->nID )
				MAP_SetUnitDataEx( nXNext, nYNext, MAP_DATA_NONE );
		}
	}
	else
	{
		for( int i=0; i<MAP_nLocationNum[pUnit->Draw.nLocationSize]; i++ )
		{
			nXNext = pUnit->Draw.nX + MAP_ptLocation[bOdd][i].x;
			nYNext = pUnit->Draw.nY + MAP_ptLocation[bOdd][i].y;
			Assert( MAP_GetUnitDataEx( nXNext, nYNext ) == pUnit->nID );
			MAP_SetUnitDataEx( nXNext, nYNext, MAP_DATA_NONE );
		}
	}

	// 擦掉陰影
	if( GAME.nMe == pUnit->Draw.nPlayer )
	{
		int nSight = EYE_GetViewRange( &pUnit->Draw );
		Assert( pUnit->nHasShadow == 1 );
		SHADOW_death( pUnit->Draw.nX, pUnit->Draw.nY, nSight );
	}
	pUnit->nHasShadow--;

	// erase from minimap
	MINI_SetGroundData( pUnit->Draw.nXLast, pUnit->Draw.nYLast, pUnit->Draw.nLocationSize );	// for minimap
}

// 一個單元從建筑或船中走出來
// return	:	TRUE if successful
BOOL CTRL_UNIT_OutUnit( struct UNIT_STRUCT *pUnit )
{
	Assert( pUnit->Status.bIRQ == TRUE );
	Assert( pUnit->nHasShadow == 0 );
	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) )
	{
		pUnit->Draw.ptOff.x = pUnit->Draw.ptOff.y = 0;
//		WriteLogFile( "off.log", "outunit\n" );
	}
#endif	//_DEBUG_OFFSET_

	POINT ptNew = MAP_FindRegion( 0, pUnit->Draw.nX, pUnit->Draw.nY, MAP_Lib.Unit[pUnit->Draw.nFile].nItems[0] );
	Assert( MAP_GetUnitDataEx( ptNew.x, ptNew.y ) == MAP_DATA_NONE );
//	Assert( ptNew.x != -1 && ptNew.y != -1 );
	if( ptNew.x==-1 || ptNew.y==-1 )
		return FALSE;
	pUnit->Draw.nXLast = pUnit->Draw.nX, 
	pUnit->Draw.nYLast = pUnit->Draw.nY;
	pUnit->Draw.nX = (WORD)ptNew.x, pUnit->Draw.nY = (WORD)ptNew.y;
	// set display position
	int bOdd = pUnit->Draw.nY&1;
	pUnit->Draw.nDrawX = pUnit->Draw.nX + (WORD)MAP_ptLocation[bOdd][MAP_nDrawNum[pUnit->Draw.nLocationSize]].x;
	pUnit->Draw.nDrawY = pUnit->Draw.nY + (WORD)MAP_ptLocation[bOdd][MAP_nDrawNum[pUnit->Draw.nLocationSize]].y;

	int nXNext, nYNext;
	for( int i=0; i<MAP_nLocationNum[pUnit->Draw.nLocationSize]; i++ )
	{
		nXNext = pUnit->Draw.nX + MAP_ptLocation[bOdd][i].x;
		nYNext = pUnit->Draw.nY + MAP_ptLocation[bOdd][i].y;
		Assert( MAP_GetUnitDataEx( nXNext, nYNext ) == MAP_DATA_NONE );
		MAP_SetUnitDataEx( nXNext, nYNext, pUnit->nID );
	}

	// 重現陰影
	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
	return TRUE;
}
//////////////////////

//////////////////////
// 計謀用
// 對某個單元設置計謀值,使該單元中計
// pDraw	:	單元的控制結構
// JiMou	:	計謀ID
inline void CTRL_SetSTG( CTRL_FRAME_STRUCT *pDraw, CTRL_JIMOU JiMou, BOOL bSet/*=TRUE*/ )
{
	Assert( pDraw );
	pDraw->nSTG[JiMou] = bSet;
	pDraw->wSTGCounter[JiMou] = 0;
}

// 取得某個單元是否中某個計謀
// pDraw	:	單元的控制結構
// JiMou	:	計謀ID
inline BOOL CTRL_GetSTG( CTRL_FRAME_STRUCT *pDraw, CTRL_JIMOU JiMou )
{
	Assert( pDraw );
	return pDraw->nSTG[JiMou];
}
//////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品情趣视频| 国产在线播放一区二区三区| 蜜臀久久99精品久久久久宅男 | 一本一道久久a久久精品| 欧美羞羞免费网站| 国产欧美日产一区| 毛片基地黄久久久久久天堂| 色女孩综合影院| 久久久久国产精品麻豆ai换脸| 亚洲高清在线精品| 99久久综合国产精品| 久久久久九九视频| 日本aⅴ免费视频一区二区三区| 91色九色蝌蚪| 国产精品每日更新| 国产九色sp调教91| 精品国产网站在线观看| 丝袜亚洲另类丝袜在线| 91福利小视频| 自拍偷拍国产精品| 成人免费观看视频| 国产校园另类小说区| 狠狠色丁香久久婷婷综合_中| 91超碰这里只有精品国产| 亚洲一区二区欧美激情| 91麻豆国产福利在线观看| 国产欧美一区二区三区在线看蜜臀| 老司机午夜精品99久久| 91精品黄色片免费大全| 日韩成人一级片| 欧美一区二视频| 麻豆一区二区三区| 亚洲精品在线观看视频| 精品一区二区在线视频| 久久久久久久一区| 成人高清免费观看| 亚洲色图都市小说| 在线免费视频一区二区| 同产精品九九九| 欧美一级黄色录像| 久久不见久久见免费视频1| 日韩三级.com| 国产成人小视频| 亚洲三级在线看| 欧美在线播放高清精品| 日韩福利视频导航| 欧美成人免费网站| 国产精品自拍毛片| 亚洲精品国产一区二区精华液| 在线观看欧美日本| 蜜桃av一区二区在线观看| 久久久久久久精| 色哟哟在线观看一区二区三区| 亚洲国产精品久久人人爱| 日韩欧美一区二区三区在线| 国产精品亚洲一区二区三区在线| 国产精品国产三级国产aⅴ原创 | 亚洲欧美另类久久久精品| 91极品视觉盛宴| 久久精品国内一区二区三区| 国产农村妇女精品| 欧美日韩午夜影院| 国产suv一区二区三区88区| ●精品国产综合乱码久久久久| 欧美另类久久久品| 成人午夜免费电影| 偷拍自拍另类欧美| 最新热久久免费视频| 日韩欧美国产综合在线一区二区三区| 国产成人免费网站| 五月婷婷激情综合| 国产精品不卡在线观看| 91麻豆精品国产91久久久使用方法 | 午夜精品久久久久久| 国产日韩欧美电影| 91麻豆精品国产91久久久使用方法 | 91电影在线观看| 韩国女主播成人在线| 一区二区三区国产精华| 久久久久亚洲综合| 3d动漫精品啪啪| 色综合久久综合| 国产精品一区二区黑丝| 婷婷综合久久一区二区三区| 国产精品成人网| 2024国产精品| 51精品久久久久久久蜜臀| 91免费国产在线| 大胆亚洲人体视频| 精品一区二区日韩| 丝袜a∨在线一区二区三区不卡| 国产精品毛片久久久久久久| 亚洲精品一区二区三区精华液 | 91小视频在线免费看| 国产毛片一区二区| 免费一级片91| 香蕉加勒比综合久久| 亚洲精品免费在线播放| 中文字幕va一区二区三区| 久久夜色精品一区| 日韩午夜在线播放| 欧美人妇做爰xxxⅹ性高电影| 99久久伊人网影院| av午夜精品一区二区三区| 国产精品夜夜嗨| 狠狠久久亚洲欧美| 免费视频最近日韩| 五月激情综合婷婷| 午夜精品福利在线| 亚洲成人精品一区| 偷拍与自拍一区| 日韩电影在线免费观看| 偷窥国产亚洲免费视频| 日韩精品一级中文字幕精品视频免费观看| 日韩理论在线观看| 亚洲免费在线观看视频| 亚洲色图欧美偷拍| 亚洲一区二区在线观看视频| 亚洲一线二线三线久久久| 亚洲一区二三区| 午夜精品福利一区二区三区av| 一区二区三区中文字幕在线观看| 亚洲蜜桃精久久久久久久| 亚洲精品欧美综合四区| 亚洲午夜久久久久久久久电影院 | 欧美绝品在线观看成人午夜影视| 91免费在线播放| 欧美午夜免费电影| 91精品久久久久久蜜臀| 91精品久久久久久久久99蜜臂| 精品久久久久久久久久久久久久久| 欧美v亚洲v综合ⅴ国产v| 26uuu亚洲综合色| 国产精品色在线| 亚洲午夜精品久久久久久久久| 日韩专区在线视频| 国产美女精品一区二区三区| 91小视频在线观看| 欧美一区二区三区免费在线看| 久久这里都是精品| 亚洲视频一区二区在线观看| 亚洲1区2区3区4区| 国产一区二区美女诱惑| 色综合久久六月婷婷中文字幕| 欧美挠脚心视频网站| 久久久久国产精品免费免费搜索| 亚洲日本欧美天堂| 日韩精品亚洲专区| 成人va在线观看| 欧美福利一区二区| 欧美—级在线免费片| 亚洲bt欧美bt精品| 国v精品久久久网| 欧美女孩性生活视频| 欧美激情在线看| 亚洲成人动漫av| 不卡在线视频中文字幕| 欧美一区二区视频免费观看| 中文字幕不卡在线| 日本欧美肥老太交大片| 成人国产精品视频| 日韩三级av在线播放| 亚洲综合免费观看高清完整版| 久久精品国产99| 欧美专区亚洲专区| 欧美韩日一区二区三区| 六月丁香婷婷色狠狠久久| 一本久久a久久精品亚洲 | 日韩欧美一区二区视频| 亚洲色欲色欲www| 国产乱色国产精品免费视频| 欧美精品在线一区二区| 一区二区中文视频| 床上的激情91.| 久久综合久久综合九色| 偷拍一区二区三区四区| 色婷婷久久一区二区三区麻豆| 久久综合九色综合97婷婷| 天堂一区二区在线免费观看| 色94色欧美sute亚洲13| 中文字幕一区二区三区在线不卡| 国产真实乱对白精彩久久| 欧美一区二区三区在线看| 亚洲一区二区视频在线| 色屁屁一区二区| 亚洲人成网站色在线观看| 国产成人精品亚洲777人妖| 久久久美女艺术照精彩视频福利播放| 日韩一区精品字幕| 欧美一区二区精品在线| 日韩精品每日更新| 欧美久久久一区| 爽好久久久欧美精品| 在线观看中文字幕不卡| 一区二区三区在线免费视频| 色屁屁一区二区| 亚洲成人www| 91精品免费在线观看| 日本三级亚洲精品| 日韩视频免费观看高清完整版在线观看|