📄 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 + -