?? cbctrl.cpp
字號:
}
}
else
{
if( nEPlayer == -1 )
{
nEPlayer = pUnit->Draw.nPlayer;
}
if( nEPlayer == pUnit->Draw.nPlayer )
{
sArrayE[nECounter] = codeUEx;
nECounter ++;
}
}
}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
}// End of if( !EYE_IfUnitIsBuild( pUnit ) )
else
{ // 如果是建筑,則記下
codeBuild = codeUEx;
}// End of if( EYE_IfUnitIsSoldier( pUnit ) )
}// End of if( MOUSE_HitTestU( pt, &hit ) )
}// End of if( IsRectEmpty( prcHit ) )
else // do with rectangle
{
for( j=DRAW_rcScreen.top; j<DRAW_rcScreen.bottom; j++ )
for( i=DRAW_rcScreen.left; i<DRAW_rcScreen.right; i++ )
{
// 數量超了
if( nYCounter >= CTRL_TASK_LIST_MAX-1 ) break;
if( nNCounter >= CTRL_TASK_LIST_MAX-1 ) break;
codeUEx = MAP_GetUnitDataEx( i, j );
if( codeUEx == MAP_DATA_NONE ) continue;
struct CTRL_FRAME_STRUCT stctCF;
if( !MAP_GetUnitFrameData( i, j, &stctCF, FALSE ) )
continue;
RECT rcUnit = MAP_GetUnitRect( DRAW_ptScreenOffset, &stctCF );
if( IntersectRect( &rcUnit, &rcUnit, prcHit ) )
{
// set source objects
Assert( codeUEx != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeUEx );
Assert( pUnit );
// 0: 如果被陰影擋住,則不算
// 1:是否是自己的單元,只有自己人才能被選中
// 2:單元還活著嗎?
if( SHADOW_IfEnabled() )
{
WORD codeR = MAP_GetRegionData( i, j );
struct MAP_REGION_CODE_STRUCT stctR;
MAP_RegionDeCode( codeR, &stctR );
if( stctR.nShadow == MAP_SHADOW_NONE || stctR.nShadowEx == 1 )
{
continue;
}
}
if( !EYE_IfUnitIsDead( pUnit ) )
{
if( !EYE_IfUnitIsBuild( pUnit ) )
{
if( wParam == 4 && pUnit->Draw.bUpdate == TRUE )
{
// shift鍵按下,而且重了,do nothing
}
// 如果是士兵,則記下
else if( EYE_IfUnitIsGen( pUnit ) )
{ // 記下將領
if( !pGen ||
(pGen && !EYE_IfSheIsMine( pGen ) ) )
{ // 原來沒有將,或不是自己的將
pGen = pUnit;
}
break;
}
else //if( EYE_IfUnitIsSoldier( pUnit ) )
{ // 記下士兵
if( EYE_IfSheIsMine( pUnit ) )
bEnemy = FALSE;
else bEnemy = TRUE;
if( bEnemy == FALSE )
{
if( pUnit->Soldier.nGenID != MAP_DATA_NONE )
{
sArrayY[nYCounter] = codeUEx;
nYCounter++;
}
else if( EYE_IfUnitIsWorker( pUnit ) )
{
sArrayNW[nNWCounter] = codeUEx;
nNWCounter++;
}
else if( EYE_IfUnitIsShip( pUnit ) )
{
sArrayNS[nNSCounter] = codeUEx;
nNSCounter++;
}
else
{
sArrayN[nNCounter] = codeUEx;
nNCounter++;
}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
}
else
{
if( nEPlayer == -1 )
{
nEPlayer = pUnit->Draw.nPlayer;
}
if( nEPlayer == pUnit->Draw.nPlayer )
{
sArrayE[nECounter] = codeUEx;
nECounter ++;
}
}
}// End of if( pUnit->nType == MAP_UNIT_TYPE_GEN )
}// End of if( !EYE_IfUnitIsBuild( pUnit ) )
else
{ // 如果是建筑,則記下
codeBuild = codeUEx;
}
}// End of if( pUnit->Draw.nPlayer == GAME.nMe
}// End of if( IntersectRect( &rcUnit, &rcUnit, prcHit ) )
}// End of for()
}// End of if( IsRectEmpty( prcHit ) )
// 熱鍵的特殊處理
if( pGen != NULL
|| nNWCounter > 0
|| nNSCounter > 0
|| nNCounter > 0
|| nYCounter > 0
|| codeBuild != MAP_DATA_NONE
|| nECounter > 0 )
{
BOOL bRefresh = TRUE;
if( wParam == 8
&& pGen == NULL
&& nNWCounter == 0
&& nNSCounter == 0
&& nNCounter == 0
&& nYCounter > 0
) // Ctrl
{ // 遇到Ctrl鍵,把該士兵所屬的整個部隊選中
Assert( sArrayY[0] != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( sArrayY[0] );
pGen = EYE_GetGeneral( pU );
Assert( pGen );
/*
Assert( sArrayY[0] != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( sArrayY[0] );
Assert( pU );
Assert( EYE_IfUnitIsSoldier( pU ) );
pU = MAP_GetUnit( pU->Soldier.nGenID );
Assert( pU );
Assert( EYE_IfUnitIsGen( pU ) );
pGen = pU;
*/
}
else if( wParam == 4
&& pGen == NULL
&& CTRL_nHitCounter > 0
) // Shift,遇到Shift鍵,把選中的部隊添加到已有的部隊中
{
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
if( EYE_IfUnitIsSoldier( pU ) )
{
if( pU->Soldier.nGenID == MAP_DATA_NONE )
{ // 散兵
if( EYE_IfUnitIsWorker( pU )
&& nNWCounter > 0 )
{ // 散工人
bRefresh = FALSE;
}
else if( nNCounter > 0 )
{ // 散士兵
nNWCounter = 0;
bRefresh = FALSE;
}
}
else if( nYCounter > 0 )
{ // 有將領的士兵
nNWCounter = 0;
nNCounter = 0;
bRefresh = FALSE;
}
}
}
// 必要時才清除命令組
if( bRefresh == TRUE )
// clear Task assembling parameters
CTRL_TASK_ClearAssembleSrc( TRUE );
}
else
{ // 沒有有效的單元被選中
CTRL_TASK_ClearAssembleDest();
return FALSE;
}
// initialize command units
// 必須把清除命令組放在這里
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_NONE;
CTRL_TASK_saveCmdUnit.Ex = 0xFFFFFFFF;
CTRL_TASK_saveCmdUnit.Busy = 0;
// 3:如果選中將領,則該將領的所有下屬士兵都被選中
// 只有自己方的將領被選中,或沒有其他我方士兵被選中時有效
if( pGen != NULL
&& ( EYE_IfSheIsMine( pGen )
|| ( !EYE_IfSheIsMine(pGen)
&& nNWCounter == 0
&& nNCounter == 0
&& nYCounter == 0 ) ) )
{
Assert( EYE_IfUnitIsGen( pGen ) );
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = pGen->nID;
CTRL_nHitCounter++;
for( i = 0; i< GENERAL_TROOP_MAX; i++ )
{
if( pGen->Gen.wTroop[i] != MAP_DATA_NONE )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = pGen->Gen.wTroop[i];
CTRL_nHitCounter++;
}
}
// 設置將領信息
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_UNIT;
DATA_GENERAL_STRUCT *pGenData = &DATA_Lib.Gen[pGen->Gen.nID];
temp.PromptBlockUnion.Unit.GeneralBitmapId=pGen->Gen.nID; // 圖片號
temp.PromptBlockUnion.Unit.GeneralPower=EYE_GetWuLi( pGen->Gen.nID )*100/120;
temp.PromptBlockUnion.Unit.GeneralBlood=
pGen->nLife*100/EYE_GetFullLife( pGen->Draw.nPlayer, pGen->Draw.nFile ); // 生命,將領生命值是200
strcpy( temp.PromptBlockUnion.Unit.GeneralName, pGenData->strName ); // 名字
// 級別
EYE_GetLevelName( pGen->Gen.nID, temp.PromptBlockUnion.Unit.Office ); // 級別
temp.PromptBlockUnion.Unit.Experience = pGenData->nJingYan; // 經驗
temp.PromptBlockUnion.Unit.Ruse = pGenData->nMouLue; // 謀略
temp.PromptBlockUnion.Unit.UnitMorale = EYE_GetMorale( pGen ); // 士氣
temp.PromptBlockUnion.Unit.UnitLineUp = pGen->Gen.nLineUp; // 陣型
// 得到士兵數
temp.PromptBlockUnion.Unit.NumberOfSolider = CTRL_GetFocusSoldierNumber();
FACE_ShowPromptBlock( temp );
if( EYE_IfSheIsMine( pGen ) )
{
// sound effect,對自己人設置音效
CTRL_SOUND_select( pGen->Draw.nFile );
// 對自己的工人部隊設置命令組
// 為取消命令組
if( pGen->Status.bIRQ == TRUE )
{
CTRL_TASK_saveCmdUnit.Busy = 2; // 臨時等于2
}
if( EYE_IfUnitIsWorkerGen( pGen ) )
{ // 根據建筑類型設置建造城內或城外建筑
if( GAME.Players[GAME.nMe].nBuildType == 0 )
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_CHAO_PEASANT;
else
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_LIU_PEASANT;
CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
}
// 對自己的戰斗部隊設置攻擊命令組
else
{
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_FIGHTUNIT;
//CTRL_TASK_saveCmdUnit.Ex = 0x00E3;
CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
}
}
}
// 判斷是否有士兵被選中
else if( nNWCounter > 0 || nNCounter > 0
|| nYCounter > 0 || nECounter > 0
|| nNSCounter > 0 )
{
// 4:如果有未整編的部隊,則只有未整編的部隊被選中
// 4.1:如果是工人,只有工人被選中
if( nNWCounter > 0 )
{
for( i=0; i< nNWCounter; i++ )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayNW[i];
// CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_WGEN; // 工人將領
CTRL_nHitCounter++;
}
// 對未整編的士兵設置命令組
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
// 不能回送
CTRL_TASK_saveCmdUnit.Ex = 0x000F;
// 設置回送命令
if( nNWCounter == 1 )
{
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pU );
if( EYE_IfUnitIsWorker( pU ) )
{
if( pU->Soldier.nResType != QXZIYUAN
&& pU->Soldier.nResource > 0 )
{ // 有回送命令
CTRL_TASK_saveCmdUnit.Ex |= 0x0010;
}
}
}
}
//4.2:如果是船,則只有船被選中
else if( nNSCounter > 0 )
{
for( i=0; i< nNSCounter; i++ )
{
CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayNS[i];
CTRL_nHitCounter++;
}
// 對未整編的船設置命令組
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
// 沒有運載命令,不能回送
CTRL_TASK_saveCmdUnit.Ex = 0x000F;
}
// 4.3:如果是一般士兵,只有士兵被選中
else if( nNCounter > 0 )
{
for( i=0; i< nNCounter; i++ )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayN[i];
// CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_GEN; // 戰斗部隊將領
CTRL_nHitCounter++;
}
// 對未整編的士兵設置命令組
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_SINGLESOLDIER;
//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
// 不能回送
CTRL_TASK_saveCmdUnit.Ex = 0x000F;
}
// 5:如果都是整編的部隊,則被選中
else if( nYCounter > 0 )
{
for( i=0; i< nYCounter; i++ )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayY[i];
// CTRL_hitSrc[CTRL_nHitCounter].nTaskIDEx = MAP_UNIT_TYPE_GEN; // 戰斗部隊將領
CTRL_nHitCounter++;
}
// 對已整編的士兵設置命令組
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_REGIMENTSOLDIER;
//CTRL_TASK_saveCmdUnit.Ex = 0xFFFF;
// 不能回送
CTRL_TASK_saveCmdUnit.Ex = 0x0007;
// 設置回送命令
if( nYCounter == 1 )
{
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pU );
if( EYE_IfUnitIsWorker( pU ) )
{
if( pU->Soldier.nResType != QXZIYUAN
&& pU->Soldier.nResource > 0 )
{ // 有回送命令
CTRL_TASK_saveCmdUnit.Ex |= 0x000F;
}
}
}
}
// 6:如果是敵人的部隊,則被選中
else if( nECounter > 0 )
{
for( i=0; i< nECounter; i++ )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = sArrayE[i];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -