📄 cbctrl.cpp
字号:
CTRL_nHitCounter++;
}
}
// 设置显示信息栏
if( CTRL_nHitCounter == 1 )
{
// 单人
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pUnit );
Assert( EYE_IfUnitIsSoldier( pUnit ) );
struct DATA_UNIT_STRUCT *pUnitData = &DATA_Lib.Unit[pUnit->Draw.nFile];
// sound effect
if( nECounter == 0 ) // 不是敌人
CTRL_SOUND_select( pUnit->Draw.nFile );
// 如果是运输船,更改命令组
if( nECounter == 0 && EYE_IfUnitIsTransport( pUnit ) )
{
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_TRANSPORTSHIP;
if( pUnit->Soldier.bOnBoard == TRUE )
{ // 有卸载命令
CTRL_TASK_saveCmdUnit.Ex = 0x0003;
}
else
{
CTRL_TASK_saveCmdUnit.Ex = 0x0001;
}
// 设置信息栏,运输船
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_TRANSPORT_SHIP;
temp.PromptBlockUnion.Transport_Ship.SoldierBitmapId = pUnit->Draw.nFile;
strcpy( temp.PromptBlockUnion.Transport_Ship.SoldierKind, DATA_Lib.Unit[pUnit->Draw.nFile].strName); // the kind of this soldier
temp.PromptBlockUnion.Transport_Ship.SoldierPower =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile); // power -->体力
temp.PromptBlockUnion.Transport_Ship.NumberOfUnit = pUnit->Soldier.nOnBoard;
temp.PromptBlockUnion.Transport_Ship.NumberOfSolider = pUnit->Soldier.nOnBoardSoldier;
FACE_ShowPromptBlock( temp );
}
else
{
// 设置信息栏,单人
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_SOLDIER_SINGLE;
temp.PromptBlockUnion.Soldier_Single.SoldierBitmapId = pUnit->Draw.nFile;
strcpy( temp.PromptBlockUnion.Soldier_Single.SoldierKind, pUnitData->strName ); // the kind of this soldier
temp.PromptBlockUnion.Soldier_Single.SoldierPower =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile); // power -->体力
if( EYE_IfUnitIsSoldier( pUnit )
&& pUnit->Soldier.nGenID != MAP_DATA_NONE )
{
struct UNIT_STRUCT *pUG = MAP_GetUnit( pUnit->Soldier.nGenID );
Assert( pUG );
Assert( EYE_IfUnitIsGen( pUG ) );
strcpy( temp.PromptBlockUnion.Soldier_Single.SoldierAscroption, DATA_Lib.Gen[pUG->Gen.nID].strName ); // ascroption --> 归属
}
else temp.PromptBlockUnion.Soldier_Single.SoldierAscroption[0] = 0;
if( pUnitData->nFightRange == 1 )
{
// temp.PromptBlockUnion.Soldier_Single.SoldierAttack = pUnitData->nNearAttack; // attack -->攻击力
// temp.PromptBlockUnion.Soldier_Single.SoldierDefence = pUnitData->nNearDefend; // defence -->防御力
temp.PromptBlockUnion.Soldier_Single.SoldierAttack = EYE_GetNearAttack( pUnit ); // attack -->攻击力
temp.PromptBlockUnion.Soldier_Single.SoldierDefence = EYE_GetNearDefend( pUnit ); // defence -->防御力
}
else
{
// temp.PromptBlockUnion.Soldier_Single.SoldierAttack = pUnitData->nFarAttack; // attack -->攻击力
// temp.PromptBlockUnion.Soldier_Single.SoldierDefence = pUnitData->nFarDefend; // defence -->防御力
temp.PromptBlockUnion.Soldier_Single.SoldierAttack = EYE_GetFarAttack( pUnit ); // attack -->攻击力
temp.PromptBlockUnion.Soldier_Single.SoldierDefence = EYE_GetFarDefend( pUnit ); // defence -->防御力
}
temp.PromptBlockUnion.Soldier_Single.SoldierCarry = pUnitData->nFightRange; // carry -->射程
//temp.PromptBlockUnion.Soldier_Single.SoldierEyesight = pUnitData->nViewRange; // eyesight -->视野
temp.PromptBlockUnion.Soldier_Single.SoldierEyesight = EYE_GetViewRange( &pUnit->Draw ); // eyesight -->视野
FACE_ShowPromptBlock( temp );
}
}
else
{ // 多人
// 设置信息栏,多人
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_SOLDIER_MORE;
temp.PromptBlockUnion.Soldier_More.UnitNumber = CTRL_nHitCounter; // 一共有几个单位
// 得到士兵数
temp.PromptBlockUnion.Soldier_More.Amount = CTRL_GetFocusSoldierNumber(); // 几个单位的总人数
FACE_ShowPromptBlock( temp );
}
}
// 7:如果是建筑,则最后一个建筑被选中
else if( codeBuild != MAP_DATA_NONE )
{
//CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[CTRL_nHitCounter].nID = codeBuild;
CTRL_nHitCounter++;
// 给建筑设置命令组
Assert( codeBuild != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( codeBuild );
Assert( pUnit );
Assert( EYE_IfUnitIsBuild( pUnit ) );
if( EYE_IfSheIsMine( pUnit ) // 自己的建筑
|| pUnit->Draw.nFile == 22 ) // 或铁矿
{
// sound effect
CTRL_SOUND_select( pUnit->Draw.nFile );
}
if( EYE_IfSheIsMine( pUnit ) )
{
// 为取消命令组
if( pUnit->Status.bIRQ == TRUE )
{
CTRL_TASK_saveCmdUnit.Busy = 1;
}
// 设置建筑命令组
// 更新CTRL_TASK_saveCmdUnit.Cmd和CTRL_TASK_saveCmdUnit.Ex
//CTRL_TASK_BuildCommand( pUnit->Draw.nFile );
CTRL_TASK_BuildCommand( pUnit );
// 设置信息
if( CTRL_TASK_saveCmdUnit.Busy != 1)
{ // 建筑闲置
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_CONSTRUCTION_IDLESS;
temp.PromptBlockUnion.Construction_Idless.ConstructionBitmapId = pUnit->Draw.nFile; // 自己的文件号
strcpy( temp.PromptBlockUnion.Construction_Idless.ConstructionName,
DATA_Lib.Unit[pUnit->Draw.nFile].strName ); // 自己的名字
if( pUnit->Draw.nFile == 22 ) // 铁矿
temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.nResource; // 资源的储量
else
temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.dwUpgrade[0]; // 自己的级别
temp.PromptBlockUnion.Construction_Idless.Stone =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ); // 自己的生命值
FACE_ShowPromptBlock( temp );
}
else
{
if( pUnit->Status.nTaskID == JIANZAOZHONG ) // 建造中
{
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_CONSTRUCTION_BUILDING;
temp.PromptBlockUnion.Construction_Building.ConstructionBitmapId = pUnit->Draw.nFile;
strcpy( temp.PromptBlockUnion.Construction_Building.ConstructionName,
DATA_Lib.Unit[pUnit->Draw.nFile].strName );
temp.PromptBlockUnion.Construction_Building.ConstructionGrade = pUnit->Build.dwUpgrade[0];
temp.PromptBlockUnion.Construction_Building.Stone =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);
FACE_ShowPromptBlock( temp );
}
else if( pUnit->Status.nTaskID == SHENGCHAN ) // 生产中
{
struct PROMPT_BLOCK temp; // 建筑状态是工作
temp.PromptBlockId = PROMPT_CONSTRUCTION_WORKING;
temp.PromptBlockUnion.Construction_Working.ConstructionBitmapId = pUnit->Draw.nFile; // 自己的文件号
temp.PromptBlockUnion.Construction_Working.ConstructionGrade = pUnit->Build.dwUpgrade[0]; //???升级的级别
temp.PromptBlockUnion.Construction_Working.Stone =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile); // 自己的生命值
struct MAP_UNIT_CODE_STRUCT stctU;
MAP_UnitDeCode( pUnit->Status.nTaskIDEx2, &stctU );
temp.PromptBlockUnion.Construction_Working.ProductBitmapId = stctU.nFile; // 被生产的士兵的文件号
strcpy( temp.PromptBlockUnion.Construction_Working.ConstructionName,
DATA_Lib.Unit[pUnit->Draw.nFile].strName ); // 自己的名字
temp.PromptBlockUnion.Construction_Working.Percent = pUnit->nCounter*100/pUnit->Status.nParam4; // 完成度
FACE_ShowPromptBlock( temp );
}
else if( pUnit->Status.nTaskID == TISHENG ) // 提升中,升级中
{
struct PROMPT_BLOCK temp; // 建筑状态是工作
temp.PromptBlockId = PROMPT_CONSTRUCTION_WORKING;
temp.PromptBlockUnion.Construction_Working.ConstructionBitmapId = pUnit->Draw.nFile; // 自己的文件号
temp.PromptBlockUnion.Construction_Working.ConstructionGrade = pUnit->Build.dwUpgrade[0]; //???升级的级别
temp.PromptBlockUnion.Construction_Working.Stone =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile);; // 自己的生命值
struct MAP_UNIT_CODE_STRUCT stctU;
MAP_UnitDeCode( pUnit->Status.nTaskIDEx2, &stctU );
temp.PromptBlockUnion.Construction_Working.ProductBitmapId = pUnit->Status.nTaskIDEx2; // 升级的消息ID
strcpy( temp.PromptBlockUnion.Construction_Working.ConstructionName,
DATA_Lib.Unit[pUnit->Draw.nFile].strName ); // 自己的名字
temp.PromptBlockUnion.Construction_Working.Percent = pUnit->nCounter*100/RUN_TIMEDELAY_UPGRADE; // 完成度
FACE_ShowPromptBlock( temp );
}
}
}// End of if( EYE_IfSheIsMine( pUnit ) )
else
{ // 给敌人单元设置信息栏,总是空闲
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_CONSTRUCTION_IDLESS;
temp.PromptBlockUnion.Construction_Idless.ConstructionBitmapId = pUnit->Draw.nFile; // 自己的文件号
strcpy( temp.PromptBlockUnion.Construction_Idless.ConstructionName,
DATA_Lib.Unit[pUnit->Draw.nFile].strName ); // 自己的名字
if( pUnit->Draw.nFile == 22 ) // 铁矿
temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.nResource; // 资源的储量
else
temp.PromptBlockUnion.Construction_Idless.ConstructionGrade = pUnit->Build.dwUpgrade[0]; // 自己的级别
temp.PromptBlockUnion.Construction_Idless.Stone =
pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ); // 自己的生命值
FACE_ShowPromptBlock( temp );
}
}
// 设置命令组
// 一定选中了某个单元,更新命令组
if( CTRL_bDebugCommand == TRUE )
CTRL_TASK_saveCmdUnit.Ex = 0xFFFF; // 调试用
if( CTRL_TASK_saveCmdUnit.Busy == 1 )
{
FACE_ShowCommandUnit( COMMANDUNIT_CANCEL, 0xFFFF ); // clear command sets
}
else if( CTRL_TASK_saveCmdUnit.Busy == 2 ) // 临时等于2
{
CTRL_TASK_saveCmdUnit.Busy = 1;
FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
}
else
{
FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
}
// if( CTRL_TASK_saveCmdUnit.Cmd != COMMANDUNIT_NONE
// || CTRL_TASK_saveCmdUnit.Busy == 1)
// 清除CTRL_hitDest的内容,设置命令组
CTRL_TASK_ClearAssembleDest();
// else
// { // 有的单元没有命令
// FACE_ClearCommandUnitArea();
// }
// set focus to units
// 给被选中的单元设置焦点状态
if( DRAW_BLINK_nID != MAP_DATA_NONE )
{
struct UNIT_STRUCT *pU = MAP_GetUnit( DRAW_BLINK_nID );
Assert( pU );
pU->Draw.bUpdate = FALSE; // 取消原来的闪烁
}
DRAW_BLINK_nID = MAP_DATA_NONE; // 屏蔽闪烁效果
for( i=0; i< CTRL_nHitCounter; i++ )
{
Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[i].nID );
Assert( pUnit );
if( EYE_IfSheIsMine( pUnit ) )
pUnit->Draw.bUpdate = 1;
else if( EYE_PlayerIsAllied( GAME.nMe, pUnit->Draw.nPlayer ) )
{
pUnit->Draw.bUpdate = 3; // 同盟,黄色
}
else
{
pUnit->Draw.bUpdate = 2; // 敌人,红色
}
}
return TRUE;
}
void CTRL_TASK_WorkerCommand( DWORD *pnEx, DWORD *pnExx )
{
// 初始为所有的
DWORD EX=0xFFFF, EXX=0xFFFF;
if( BuildPoint[GAME.nMe][MAINBATTALION].hPos == CBNULL )
{ // 没有主帅帐,不能造钱庄
EX &= (~0x0010);
}
if( BuildPoint[GAME.nMe][LIANGCANG].hPos == CBNULL )
{ // 没有粮仓,不能造步兵所,弓兵所,车兵所,船坞,骑兵所
EX &= (~0x0020);
EX &= (~0x0080);
EXX &= (~0x0001);
EXX &= (~0x0002);
EXX &= (~0x0004);
}
if( BuildPoint[GAME.nMe][MUCAICHANG].hPos == CBNULL )
{ // 没有木材场,不能造箭楼,弓兵所,车兵所,船坞,城门
EX &= (~0x0040);
EX &= (~0x0080);
EXX &= (~0x0001);
EXX &= (~0x0002);
EXX &= (~0x0010);
}
if( BuildPoint[GAME.nMe][WUQICHANG].hPos == CBNULL )
{ // 没有武器场,不能造车兵所,骑兵所
EXX &= (~0x0001);
EXX &= (~0x0004);
}
if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] < 1 )
{ // 主帅帐没有2级,不能造车兵所,船坞
EXX &= (~0x0001);
EXX &= (~0x0002);
}
// 附加:永远不能建造城门,不要取消键
EXX &= (~0x0010);
EXX &= (~0x0040);
// Debug赋值
if( CTRL_bDebugCommand == TRUE )
{
EX = 0xFFFF; EXX = 0xFFFF;
}
*pnEx = EX, *pnExx = EXX;
}
// 得到阵型命令组
void CTRL_TASK_LineUpCommand( DWORD *pnEx, DWORD *pnExx )
{
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pU );
Assert( EYE_IfUnitIsGen( pU ) );
Assert( DATA_Lib.Gen[pU->Gen.nID].nLevel<10 );
int nLineUp[10] = {0x07, 0x07, 0x07, 0x3F, 0x3F, 0xFF, 0x01FF, 0x01FF, 0x01FF, 0x01FF};
int nLineUpEx[10] = {0,0,0,0,0,0,0x103, 0x103, 0x103, 0x103};
// debug
// DATA_Lib.Gen[pU->Gen.nID].nLevel=9;
*pnEx = nLineUp[DATA_Lib.Gen[pU->Gen.nID].nLevel];
*pnExx = nLineUpEx[DATA_Lib.Gen[pU->Gen.nID].nLevel];
// Debug赋值
if( CTRL_bDebugCommand == TRUE )
{
*pnEx = 0xFFFF; *pnExx = 0xFFFF;
}
}
// 得到计谋组
void CTRL_TASK_StrategemCommand( DWORD *pnEx, DWORD *pnExx )
{
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pU );
Assert( EYE_IfUnitIsGen( pU ) );
Assert( DATA_Lib.Gen[pU->Gen.nID].nLevel<10 );
int nStrategy[10] = {0x00, 0x01, 0x0181, 0x01C1, 0x01C9, 0x01CF, 0x01EF, 0x01FF, 0x01FF, 0x01FF};
// debug
// DATA_Lib.Gen[pU->Gen.nID].nLevel = 6;
*pnEx = nStrategy[DATA_Lib.Gen[pU->Gen.nID].nLevel];
*pnExx = 0;
// Debug赋值
if( CTRL_bDebugCommand == TRUE )
{
*pnEx = 0xFFFF; *pnExx = 0xFFFF;
}
}
// 检测鼠标发出的命令
// 只设置CTRL_hitDest的内容nTaskID, nTaskIDEx, (nParam1)
// detect command message, set it and its attributes
// dwMessage : message ID
// return value : TRUE if detect it, and it is valid
BOOL CTRL_TASK_AssembleCmd( DWORD dwMessage, UINT lParam )
{
// if no source object of TASK exists, exit
if( CTRL_nHitCounter == 0 ) return FALSE;
CTRL_TASK_ClearAssembleDest();
// only for control command message
if( dwMessage == BUTTON_CANCEL )
{ // 取消
if( BUILD_IfEnable() )
{ // 寻找建造位置的时候
// reset command unit array
FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
BUILD_Enable( FALSE );
}
else if( CTRL_nHitCounter > 1 )
{// 临时使用
}
else
{
Assert( CTRL_nHitCounter == 1 );
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -