📄 cbrun.cpp
字号:
else
{
OutputDebugString( "c" );
}
if( EYE_IfFocusOnUnit( pUnit ) )
{ // 设置撤消命令组
if( EYE_IfSheIsMine( pUnit ) )
{
CTRL_TASK_ClearAssembleSrc( TRUE );
CTRL_TASK_ClearAssembleDest();
// 取消建造图像
if( BUILD_IfEnable() )
{
BUILD_Enable( FALSE );
}
// 清除命令组
FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
}
// 清除信息栏,敌我都要
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_NONE;
FACE_ShowPromptBlock( temp );
}
}
else
{
Assert( pUnit->Draw.nLocationSize == 0 );
Assert( pUnit->Status.nTaskIDEx == 2 );
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
Assert( pUnit->Status.nParam1 != 0 );
pU = MAP_GetUnit( pUnit->Status.nParam1 );
Assert( pU );
if( EYE_IfUnitIsDead( pU ) )
{ // 建筑已经被毁
if( pUnit->nHasShadow == 0 )
{
//---
// 走出建筑
if( CTRL_UNIT_OutUnit( pUnit ) )
{
pUnit->Status.bIRQ = FALSE;
//---
pUnit->Status.bDone = TRUE;
return;
}
}
}
// 1.1.2,是,判断是否已经在该建筑内部了
// 工人部队(士兵和将领)在建造建筑时,要把自己的位置设置到系统外面,隐藏起来
// 假设工人只占一个格子
// 如果已经在建筑里面了,则不进行此操作
//if( pUnit->Status.bIRQ == FALSE )
if( pUnit->nHasShadow == 1 ) // 在建筑外
{
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "Build\n" );
#endif //_DEBUG_OFFSET_
//---
// 走进建筑
//CTRL_UNIT_InUnit( pUnit, TRUE );
CTRL_UNIT_InUnit( pUnit );
// 设置自己的任务为不可中断
pUnit->Status.bIRQ = TRUE;
//---
Assert(pUnit->Task.bIRQ == FALSE );
}
else
{
Assert(pUnit->Status.bIRQ == TRUE );
}
}
} // End of if( pUnit->nCounter == 0 )
else if( (pUnit->nCounter%4) == 0 )
{
// 2,给建筑增加血点
// 以后则每次增加该单元的血点
Assert( pUnit->Draw.nLocationSize == 0 );
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
Assert( pUnit->Status.nParam1 != 0 );
struct UNIT_STRUCT *pCreated = MAP_GetUnit( pUnit->Status.nParam1 );
Assert( pCreated );
// 3,该建筑的血格是否已满
// 血格满了,结束
BOOL bDead = EYE_IfUnitIsDead( pCreated );
if( bDead // 该建筑已经被摧毁
|| pCreated->Status.nTaskID != JIANZAOZHONG )
{
// 对于工人部队,要把坐标设置回去
Assert( pUnit->Draw.nLocationSize == 0 );
//---
// 走出建筑
if( CTRL_UNIT_OutUnit( pUnit ) )
{
// 可中断
pUnit->Status.bIRQ = FALSE;
Assert( pUnit->nHasShadow == 1 );
//---
pUnit->Status.bDone = TRUE;
}
//added by tian yue .
if( bDead == TRUE
|| pCreated->Status.nTaskID == QXJIANZAO )
{
}
else
{ // 建成了
pUnit->Task.nParam4 = JZFINISH;
if( EYE_IfUnitIsWorkerGen( pUnit ) )
{
TY_IDProcess(pCreated->nID,pUnit->Task.nParam4,CBNULL);
// Nov.6.1997
// 战斗记分
RUN_CountDown[pCreated->Draw.nPlayer].nBuildings ++;
// 经验值增加
DATA_Lib.Gen[pUnit->Gen.nID].nJingYan +=
DATA_Lib.Unit[pCreated->Draw.nFile].nAddExp;
//added by tian yue.
// 升级
if( DATA_Lib.Gen[pUnit->Gen.nID].nLevel < 9 )
{
if( DATA_Lib.Gen[pUnit->Gen.nID].nJingYan >= nJingYanGrade[DATA_Lib.Gen[pUnit->Gen.nID].nLevel] )
{
DATA_Lib.Gen[pUnit->Gen.nID].nJingYan -= nJingYanGrade[DATA_Lib.Gen[pUnit->Gen.nID].nLevel];
DATA_Lib.Gen[pUnit->Gen.nID].nLevel++;
//我将领战斗英勇,斩获甚多,晋升一级。
if( EYE_IfFocusOnUnit( pUnit ) && EYE_IfSheIsMine( pUnit ) )
{
FACE_ShowPromptInfor( 12 );
//---- 肯定音效
// victory.wav
DATA_WAVE_EffectPlay( 106 );
//---- 肯定音效
}
}
}
}
}
#ifdef _DEBUG
int nXNext, nYNext;
int bOdd = pCreated->Draw.nY&1;
for( i=0; i< MAP_nLocationNum[pCreated->Draw.nLocationSize]; i++ )
{
nXNext = pCreated->Draw.nX + MAP_ptLocation[bOdd][i].x;
nYNext = pCreated->Draw.nY + MAP_ptLocation[bOdd][i].y;
Assert( (!EYE_IfUnitIsDead( pCreated )
&&(pUnit->Draw.nX != nXNext || pUnit->Draw.nY != nYNext))
|| EYE_IfUnitIsDead( pCreated ) );
}
OutputDebugString( "RUN_CreateUnit Status(0): Unit created!\n" );
#endif
}
else
{ // 增加建筑的血格
pCreated->nLife += RUN_CREATE_VALUE;
}
}
// 4,计数器增加1
pUnit->nCounter++;
return;
CREATE_FAILED:
// 创建失败,退出
// 失败的话,将领要把他手下的士兵的bDone都设置为真,结束他们的操作
for( i=0; i<nTrp; i++ )
{
pU = MAP_GetUnit( arTroop[i] );
Assert( pU );
Assert( EYE_IfUnitIsSoldier( pU ) );
if( pU->Task.nTaskID == JIANZAO )
{
if( pU->nHasShadow == 0 )
{
// 对应于 AAA
Assert( pU->Status.nTaskID != JIANZAO
|| pU == pUnit );
//---
// 走出建筑
if( CTRL_UNIT_OutUnit( pU ) )
pU->Status.bIRQ = FALSE;
//---
}
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "BuildFail\n" );
#endif //_DEBUG_OFFSET_
Assert( pU->Status.bIRQ == FALSE );
pU->bPause = 1;
// pU->Status.nTaskID = DUSE;
// pU->nCounter = 0;
//pU->Status.nTaskID = JIANZAO;
//pU->Status.bDone = TRUE; // 结束当前任务
//Assert( pU->Status.bIRQ == FALSE );
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
Task.nID = pU->nID;
Task.nTaskID = JIESHU;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pU->Draw.nPlayer, &Task );
}
}
// 对于士兵要设置他的将领
pU = EYE_GetGeneral( pUnit );
if( pU )
{
Assert( EYE_IfUnitIsWorkerGen( pU ) );
if( pU->Task.nTaskID == JIANZAO )
{
if( pU->nHasShadow == 0 )
{
// 对应于 AAA
Assert( pU->Status.nTaskID != JIANZAO );
//---
// 走出建筑
if( CTRL_UNIT_OutUnit( pU ) )
pU->Status.bIRQ = FALSE;
//---
}
Assert( pU->Status.bIRQ == FALSE );
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "BuildFail2\n" );
#endif //_DEBUG_OFFSET_
pU->bPause = 1;
// pU->Status.nTaskID = DUSE;
// pU->nCounter = 0;
//pU->Status.nTaskID = JIANZAO;
//pU->Status.bDone = TRUE; // 结束当前任务
//Assert( pU->Status.bIRQ == FALSE );
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
Task.nID = pU->nID;
Task.nTaskID = JIESHU;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pU->Draw.nPlayer, &Task );
}
}
OutputDebugString( "RUN_CreateUnit Error(0): Cannot create unit!\n" );
//added by tian yue
TY_IDProcess(CBNULL,BUILDDESTROY,CBNULL);
return;
}
// 当状态是SHENGCHAN时调用
// 建筑生产士兵
//具体步骤:
// 1,是否是第一次进入建造函数
// 2,给士兵增加血点
// 3,该士兵的血格是否已满
// 4,计数器增加1
// 注意:修改了Status的nParam4的内容作为该士兵的最大血点
// 修改了Status的nTaskIDEx2的内容作为该士兵的压缩代码
void RUN_CreateSoldier( struct UNIT_STRUCT *pUnit )
{
int ret;
Assert( pUnit );
Assert( EYE_IfUnitIsBuild( pUnit ) );
// 1,是否是第一次进入建造函数
if( pUnit->nCounter == 0 )
{ // 第一次时,要创建该单元
// set player
// 给要被建造的建筑设置游戏君主
DWORD codeU = MAP_Lib.Unit[pUnit->Status.nTaskIDEx].nItems[0];
struct MAP_UNIT_CODE_STRUCT stctU;
MAP_UnitDeCode( codeU, &stctU );
stctU.nPlayer = pUnit->Draw.nPlayer;
codeU = MAP_UnitEnCode( stctU );
// 花钱
if( !RUN_CREATE_Consume( stctU.nPlayer, stctU.nFile ) )
{
pUnit->Status.bDone = TRUE;
return;
}
// 得到最大血点数
pUnit->Status.nTaskIDEx2 = codeU;
pUnit->Status.nParam4 = EYE_GetFullLife( stctU.nPlayer, stctU.nFile );
// 4,计数器增加1
pUnit->nCounter++;
pUnit->Status.bIRQ = TRUE;
if( EYE_IfSheIsMine( pUnit )
&& EYE_IfFocusOnUnit( pUnit ) )
{
// 设置信息栏,建筑在生产中
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 );
// 设置命令组
CTRL_TASK_saveCmdUnit.Busy = 1; // 设置取消键
FACE_ShowCommandUnit( COMMANDUNIT_CANCEL, 0xFFFF ); // clear command sets
//CTRL_TASK_ClearAssembleDest();
}
} // End of if( pUnit->nCounter == 0 )
else
{
// 以后则每次增加该单元的血点
// 2,给士兵增加血点; 4,计数器增加1
pUnit->nCounter++;
if( EYE_IfFocusOnUnit( pUnit )
&& EYE_IfSheIsMine( pUnit ) )
{
// 更新血格条
FACE_ShowProcessBar( PROCESSBAR_PROCESS, pUnit->nCounter*100/pUnit->Status.nParam4 );
}
// 3,该士兵的血格是否已满
// 血格满了,结束
if( pUnit->nCounter >= pUnit->Status.nParam4 )
{
pUnit->Status.bIRQ = FALSE;
Assert( pUnit->nHasShadow == 1 );
if( EYE_IfSheIsMine( pUnit ) )
{
//------------音效
// XRj.wav, 训练完成
int nID = 87;
DATA_WAVE_EffectPlay( nID );
//------------音效
//------------提示
FACE_ShowPromptInfor( nID-82 ) ;
//------------提示
}
if( EYE_IfFocusOnUnit( pUnit )
&& EYE_IfSheIsMine( pUnit ) )
{
// 重新设置信息栏,建筑空闲
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 );
// 设置命令组
CTRL_TASK_saveCmdUnit.Busy = 0;// 恢复原来的命令组
FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
//CTRL_TASK_ClearAssembleDest();
}
pUnit->Status.bDone = TRUE;
OutputDebugString( "RUN_CreateUnit Status(0): Unit created!\n" );
// create
// 创建单元
ret = CTRL_UNIT_Create( pUnit->Draw.nLayer, pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Status.nTaskIDEx2 );
if( ret == MAP_DATA_NONE )
{
//创建失败,退出
OutputDebugString( "RUN_CreateUnit Error(11): Cannot create unit!\n" );
return;
}
// 战斗记分,Nov.6.1997
UNIT_STRUCT *pU = MAP_GetUnit( ret );
RUN_CountDown[pU->Draw.nPlayer].nSoldiers += EYE_GetFullLife( -1, pU->Draw.nFile );
//add by tian yue
TY_IDProcess(ret,pUnit->Status.nParam2,pUnit->Status.nParam3);
}
}
return;
}
///////////////////////////////
///////////////////////////////
// 当状态是SHANCHU时调用
void RUN_DestroyUnit( struct UNIT_STRUCT *pUnit )
{
Assert( pUnit );
struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;
Assert( pUnit->nType != MAP_UNIT_TYPE_NONE );
if( EYE_IfFocusOnUnit( pUnit ) )
{
if( CTRL_nHitCounter == 1
|| EYE_IfUnitIsGen( pUnit ) )
{
if( EYE_IfSheIsMine( pUnit ) )
{
Assert( CTRL_nHitCounter>0 );
// if( CTRL_hitSrc[0].nID == pUnit->nID )
// {
// 设置命令组
CTRL_TASK_ClearAssembleSrc( TRUE );
CTRL_TASK_ClearAssembleDest();
FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF ); // clear command sets
// }
// 取消建造图像
if( BUILD_IfEnable() )
{
BUILD_Enable( FALSE );
}
}
// 清除信息栏,敌我都要
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_NONE;
FACE_ShowPromptBlock( temp );
// 把所有的焦点都去掉
// 修正一个Bug
int nCounter = CTRL_nHitCounter;
for( int i=0; i<nCounter; i++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -