📄 cbrun.cpp
字号:
{
Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( CTRL_hitSrc[i].nID );
Assert( pU );
pU->Draw.bUpdate = FALSE;
CTRL_hitSrc[i].nID = MAP_DATA_NONE;
CTRL_nHitCounter--;
}
Assert( CTRL_nHitCounter == 0 );
}
else
// 把自己从鼠标选中数组中删除
{
for( int i=0; i< CTRL_nHitCounter; i++ )
{
if( CTRL_hitSrc[i].nID == pUnit->nID )
{ // 把它后面的单元向前挪
for( int j=i;j<CTRL_nHitCounter-1; j++ )
{
CTRL_hitSrc[j].nID = CTRL_hitSrc[j+1].nID;
}
CTRL_nHitCounter--;
break;
}
}
}
} // End of if( EYE_IfFocusOnUnit( pUnit ) )
// 取消焦点状态
// pDraw->bUpdate = FALSE;
// it is time to destroy
Assert( pUnit->Status.nTaskID == SHANCHU ) ;
if( pUnit->nCounter == 0 )
{
pUnit->Draw.nFrame = 0;
}
// 如果达到最后一帧,或者只是删除,不是死亡,马上删除该单元
else if( pUnit->nCounter == RUN_TIMEDELAY_DESTROY )
{
// 设置死后的图像,船不设
if( !EYE_IfUnitIsShip( pUnit ) )
{
RUN_DESTROY_SetAfterLife( pUnit );
}
// 是建筑,要去掉火
if( EYE_IfUnitIsBuild( pUnit ) )
{
for( int i=0; i<pUnit->Build.nFireLvl; i++ )
{
OTHER_DestroyData( pUnit->Build.nFireID[i] );
}
//added by tian yue
TY_DestroyUnit(pUnit);
}
// 删除
if( EYE_IfUnitIsGen( pUnit ) )
{
// 解散手下所有士兵
CTRL_GROUP_ToSubAll( pUnit );
CTRL_GROUP_Destroy( pUnit );
}
else
{
if( EYE_IfUnitIsSoldier( pUnit )
&& pUnit->Soldier.nGenID != MAP_DATA_NONE )
CTRL_GROUP_Sub( pUnit ); // 把该士兵从将领手下解放出来
CTRL_UNIT_Destroy( pUnit );
}
// 任务结束
pUnit->Status.bDone = TRUE;
OutputDebugString( "RUN_CreateUnit Status(0): Unit destroyed!\n" );
return;
}
if( !EYE_IfUnitIsBuild( pUnit ) )
{ // 部队
// 对于删除命令设置相应的状态
int nMaxFrame;
if( pDraw->nFile >= 37 && pDraw->nFile <= 44 ) // 有自己的死亡画面
nMaxFrame = 6;
else nMaxFrame = MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
if( MAP_Lib.AniSeq[pDraw->nFile].nDeadDir == 8 )
{ // 死亡是8个方向的
pUnit->Draw.nState = pUnit->Draw.nDir+MAP_Lib.AniSeq[pUnit->Draw.nFile].nEventBegin[1];
// change frame
//if( pDraw->nFrame < MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState]-1 )
if( pDraw->nFrame < nMaxFrame )
{
int nDelay = 3;
if( EYE_IfUnitIsShip( pUnit ) )
nDelay = 15;
if( (pUnit->nCounter&nDelay) == nDelay )
{
pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
pDraw->nRow = 0;
pDraw->nFrame = pDraw->nFrame+1;
}
pUnit->nCounter++;
}
else pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
}
else
{ // 需要调整死亡的方向
if( (pDraw->nDir+8-MAP_Lib.AniSeq[pDraw->nFile].nDeadDir)%8 >0 )// 逆时针转
{
pDraw->nDir = (pDraw->nDir + 7)%8;
pDraw->nState = pDraw->nDir;
}
else if ( (pDraw->nDir+8-MAP_Lib.AniSeq[pDraw->nFile].nDeadDir)%8 <0 )// 顺时针转
{
pDraw->nDir = (pDraw->nDir + 1)%8;
pDraw->nState = pDraw->nDir;
}
else
{ // 转对方向了
pDraw->nState = MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[1];
// change frame
//if( pDraw->nFrame < MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState]-1 )
Assert( nMaxFrame > 0 );
if( pDraw->nFrame < nMaxFrame )
{
int nDelay = 3;
if( (pUnit->nCounter&nDelay) == nDelay )
{
pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
pDraw->nRow = 0;
pDraw->nFrame = pDraw->nFrame+1;
}
pUnit->nCounter++;
}
else pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
}
}
}
else
{ // 建筑
pUnit->nCounter = RUN_TIMEDELAY_DESTROY;
}
}
///////////////////////////////
///////////////////////////////
// 当前状态是GONGJI时调用
void RUN_FightUnit( struct UNIT_STRUCT *pUnit )
{
Assert( pUnit );
Assert( pUnit->Status.nTaskID == GONGJI );
struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
struct UNIT_STRUCT *pU = MAP_GetUnit( pUnit->Status.nParam1 );
Assert( pU );
if( EYE_IfUnitIsDead( pU ) )
{ // 发现敌人已经死了
pUnit->Status.bDone = TRUE;
return;
}
// 修改Bug, 极个别情况,敌人不死
// July.16.1997, Liu Gang
if( pU->nLife <= 0
&& pU->Task.nTaskID == SHANCHU
&& pU->Task.bDone == FALSE )
{
pU->Status.nTaskID = SHANCHU;
while( pU->Status.bDone == FALSE )
RUN_DestroyUnit( pU );
// WriteLogFile( "Bad.log", "Destroy!\n" );
}
// 设置动画帧和状态
// 攻击动作是2
//pDraw->nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[2];
// 攻击效果,挥刀一下,计算攻击效果一次
Assert( DATA_Lib.Unit[pUnit->Draw.nFile].nFightSpeed != 0 );
int nSpeed = DATA_Lib.Unit[pUnit->Draw.nFile].nFightSpeed;
if( CTRL_GetSTG( &pUnit->Draw, JIASU ) == TRUE )
nSpeed *= 2;
else if( CTRL_GetSTG( &pUnit->Draw, JIANSU ) == TRUE )
nSpeed /= 2;
if( pUnit->nCounter == 0 )
{
// 动画帧,把刀放下
pDraw->nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[0];
pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+
MAP_Lib.AniSeq[pDraw->nFile].nOffset;
pDraw->nRow = 0;
}
else if( pUnit->nCounter == RUN_TIMEDELAY_FIGHT/nSpeed )
{
// change frame
if( !EYE_IfUnitIsBuild( pUnit ) )
{
// 挥刀一次
if( CTRL_GetSTG( &pUnit->Draw, GUNMU ) == TRUE
&& (pUnit->Draw.nFile == 32 || pUnit->Draw.nFile == 45) )
{
if( pUnit->Draw.nFile == 32 ) // 石头
pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[4];
else // 木头
pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[3];
}
else
{
pUnit->Draw.nState = pDraw->nDir+MAP_Lib.AniSeq[pDraw->nFile].nEventBegin[2];
}
pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
pDraw->nRow = 0;
if( MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState] != 0 )
pDraw->nFrame = ( pDraw->nFrame+1 )%MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
if( pDraw->nFrame != 2 )
return; // 动画没放完
}
else
{
Assert( EYE_IfUnitIsTower( pUnit ) );
}
// 一轮攻击
pUnit->nCounter = 0;
// 敌人逃出攻击范围,追击
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
int nDir = EYE_IfUnitIsInRange( pUnit->nID, pUnit->Status.nParam1 );
if( nDir == -1 )
{
if( EYE_IfUnitIsBuild( pUnit ) )
pUnit->Status.bDone = TRUE; // 箭楼不追击
else
{ // 追击
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
Task.nID = pUnit->nID;
Task.nTaskID = GONGJI;
Task.nTaskIDEx = 2;
Task.nParam1 = pUnit->Status.nParam1;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
}
return;
}
else if( nDir == -2 )
{ // 敌人躲进建筑内
pUnit->Status.bDone = TRUE;
return;
}
else if( nDir != pUnit->Draw.nDir )
{ // 转向敌人
Assert( pUnit->Draw.ptOff.x == 0 && pUnit->Draw.ptOff.y == 0 );
Assert( nDir >= 0 && nDir < 8 );
int nState = pUnit->Draw.nState-pUnit->Draw.nDir;
pUnit->Draw.nDir = nDir;
pUnit->Draw.nState = pUnit->Draw.nDir+nState;
}
if( CTRL_GetSTG( &pUnit->Draw, GUNMU ) == TRUE
&& (pUnit->Draw.nFile == 32 || pUnit->Draw.nFile == 45) )
{
// 是100人的步兵和弓兵,而且正使用的计谋是滚木
RUN_FIGHT_SetGunMu( pUnit, pU );
}
else if( EYE_IfUnitIsArcher( pUnit )
|| EYE_IfUnitIsTower( pUnit )
|| EYE_IfUnitIsBattleShip( pUnit ) )
{// 弓箭手,射箭
RUN_FIGHT_SetArrow( pUnit , pU );
}
else if( EYE_IfUnitIsCatapult( pUnit ) )
{// 投石车,投石
RUN_FIGHT_SetStone( pUnit, pU );
}
else if( RUN_FIGHT_CalcResult( pUnit, pU ) )
{// 非弓箭手
// 敌人已经死了
return;
}
// 被攻击者
if( EYE_IfUnitIsBuild( pU ) )
{
// 对于建筑,要放火
RUN_FIGHT_SetFire( pU );
}
return;
} // End of if( pUnit->nCounter ==
pUnit->nCounter++;//等待记数一次
}
// 当前状态是ZUJIAN时调用
void RUN_GroupUnit( struct UNIT_STRUCT *pUnit )
{
int nGenID;
Assert( EYE_IfUnitIsSoldier( pUnit ) );
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
nGenID = CTRL_GROUP_Find( pUnit->Draw.nPlayer, pUnit->Status.nParam1 );
if( nGenID == MAP_DATA_NONE )
{
int nType;// 部队的类型
if( EYE_IfUnitIsWorker( pUnit ) )
nType = MAP_UNIT_TYPE_WGEN; // 工人
else if( EYE_IfUnitIsShip( pUnit ) )
nType = MAP_UNIT_TYPE_SGEN; // 水军
else
nType = MAP_UNIT_TYPE_GEN; // 陆军
// Assert( nType == (int)pUnit->Status.nTaskIDEx );
nGenID = CTRL_GROUP_Create( pUnit->Draw.nLayer, pUnit->Draw.nX,
pUnit->Draw.nY, pUnit->Status.nParam1, pUnit->Draw.nPlayer, nType );
}
if( nGenID != MAP_DATA_NONE )
{
// to soldier
pUnit->Status.nParam1 = nGenID;
RUN_GroupAdd( pUnit );
// 送回定单,将领的ID
//add by tian yue
TY_IDProcess(nGenID,pUnit->Status.nParam2,pUnit->Status.nParam3);
}
pUnit->Status.bDone = TRUE;
}
void RUN_GroupAdd( struct UNIT_STRUCT *pUnit )
{
// to soldier
Assert( pUnit );
Assert( EYE_IfUnitIsSoldier( pUnit ) );
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnitG = MAP_GetUnit( pUnit->Status.nParam1 );
Assert( pUnitG );
Assert( EYE_IfUnitIsGen( pUnitG ) );
if( (EYE_IfUnitIsWorkerGen( pUnitG )
&& !EYE_IfUnitIsWorker( pUnit ))
||(!EYE_IfUnitIsWorkerGen( pUnitG )
&& EYE_IfUnitIsWorker( pUnit )) )
{
OutputDebugString( "RUN_GroupAdd Warning: cannot combine troops with different types!\n" );
pUnit->Status.bDone = TRUE;
return;
}
if( CTRL_GROUP_Add( pUnitG, pUnit ) )
{
// 对新加入的士兵下达将领正在执行的任务
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
CTRL_TASK_Copy( &Task, &pUnitG->Task );
Task.nID = pUnit->nID;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
if( EYE_IfFocusOnUnit( pUnit )
&&EYE_IfSheIsMine( pUnit )
&& !EYE_IfFocusOnUnit( pUnitG ) )
{
// 把将领加到鼠标检测数组中,必须为第一个
Assert(CTRL_nHitCounter < PLAYER_UNIT_MAX );
for( int i=CTRL_nHitCounter; i>0; i-- )
{ // 把其它单元向后挪
CTRL_hitSrc[i].nID = CTRL_hitSrc[i-1].nID;
}
// CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_hitSrc[0].nID = pUnitG->nID;
CTRL_nHitCounter++;
pUnitG->Draw.bUpdate = TRUE; // 给将领加上焦点
// 把该将领手下的士兵加上焦点
for( int j=0; j< GENERAL_TROOP_MAX; j++ )
{
if( pUnitG->Gen.wTroop[j] == MAP_DATA_NONE ) continue;
struct UNIT_STRUCT *pU = MAP_GetUnit( pUnitG->Gen.wTroop[j] );
Assert( pU );
Assert( EYE_IfUnitIsSoldier( pU ) );
if( !EYE_IfFocusOnUnit( pU ) )
{
CTRL_hitSrc[CTRL_nHitCounter].nID = pUnitG->Gen.wTroop[j];
// CTRL_hitSrc[CTRL_nHitCounter].nLevel = 0;
CTRL_nHitCounter++;
pU->Draw.bUpdate = TRUE; // 给士兵加上焦点
}
}
Assert( CTRL_nHitCounter <= PLAYER_UNIT_MAX );
// 重新设置信息栏
// 设置将领信息
struct PROMPT_BLOCK temp;
temp.PromptBlockId = PROMPT_UNIT;
DATA_GENERAL_STRUCT *pUnitGData = &DATA_Lib.Gen[pUnitG->Gen.nID];
temp.PromptBlockUnion.Unit.GeneralBitmapId = pUnitG->Gen.nID; // 图片号
temp.PromptBlockUnion.Unit.GeneralPower = EYE_GetWuLi( pUnitG->Gen.nID )*100/120;
//pUnitGData->nHealth; // 将领体力,单挑用
temp.PromptBlockUnion.Unit.GeneralBlood =
//pUnitG->nLife/2; // 生命,将领生命值是200
pUnitG->nLife*100/EYE_GetFullLife( pUnitG->Draw.nPlayer, pUnitG->Draw.nFile ); // 将领体力,单挑用
strcpy( temp.PromptBlockUnion.Unit.GeneralName, pUnitGData->strName ); // 名字
// 级别
EYE_GetLevelName( pUnitG->Gen.nID, temp.PromptBlockUnion.Unit.Office ); // 级别
temp.PromptBlockUnion.Unit.Experience = pUnitGData->nJingYan; // 经验
temp.PromptBlockUnion.Unit.Ruse = pUnitGData->nMouLue; // 谋略
temp.PromptBlockUnion.Unit.UnitMorale = EYE_GetMorale(pUnitG); // 士气
temp.PromptBlockUnion.Unit.UnitLineUp = pUnitG->Gen.nLineUp; // 阵型
// 得到士兵数
temp.PromptBlockUnion.Unit.NumberOfSolider = CTRL_GetFocusSoldierNumber();
FACE_ShowPromptBlock( temp );
Assert( CTRL_nHitCounter >= 1 );
// 设置命令组为工人部队
if( EYE_IfUnitIsWorker( pUnit ) )
{
//if( (GAME.nMe&1) == 1 )
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 = 0xFFFF;
}
FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd,
CTRL_TASK_saveCmdUnit.Ex );
}
}
else
{
if( EYE_IfFocusOnUnit( pUnit ) )
{
if( EYE_IfSheIsMine( pUnit ) )
{
// 从鼠标选中数组中删除
for( int i=0; i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -