?? cbctrls.cpp
字號:
//////////////////////
// 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 + -