📄 cbother.cpp
字号:
nDefend = EYE_GetFarDefend( pUnit );
nHit = pOther->nHit-nDefend;
if( nHit <= 0 ) nHit = 1;
// 调试不死状态
// July.17.1997, Liu Gang
if( CTRL_bDebugDie == TRUE
&& GAME.nMe == pUnit->Draw.nPlayer )
nHit = 0;
// 如果被攻击方的血格在被攻击前多于满值一半,而被攻击后少于满值一半,
// 则发出受伤声音。
BOOL bWounded = FALSE;
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1) )
bWounded = TRUE;
// 被攻击方生命减少
pUnit->nLife -= nHit;
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1)
|| bWounded == FALSE )
bWounded = FALSE;
if( bWounded == TRUE )
// 受伤音效
RUN_SOUND_Wounded( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
// 受伤音效
//--------------------攻击计算--------------------
// 给被攻击者设置是谁打了他,如果是自己人则不设
// 得到投石的单元
Assert( pOther->nOwnerID != MAP_DATA_NONE );
pU = MAP_GetUnit( pOther->nOwnerID );
Assert( pU );
if( !EYE_IfUnitIsDead( pU )
&& pU->Draw.nPlayer != pUnit->Draw.nPlayer )
{
Assert( EYE_IfUnitIsCatapult( pU )
|| pU->Draw.nFile == 32 || pU->Draw.nFile == 45 );
pUnit->nIDAttackMe = pOther->nOwnerID; // 所有者ID
if( pUnit->Draw.nPlayer == GAME.nMe ) // 被攻击方是游戏者
{
MINI_SetBlink( pUnit->Draw.nDrawX, pUnit->Draw.nDrawY );
RUN_SOUND_UnderAttack( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
}
}
//--音效
// 24: obreak04.wav,爆炸声
POINT pt;
pt.x = pUnit->Draw.nX, pt.y = pUnit->Draw.nY;
if( PtInRect( &DRAW_rcScreen, pt ) )
{
DATA_WAVE_EffectPlay( 24 );
}
//--音效
// 如果该死了
if( pUnit->nLife <= 0 )
{
RUN_UNIT_ToDie( pUnit );
return TRUE;
}
// 更新血格
if( EYE_IfFocusOnUnit( pUnit ) )
{
// 更新血格条
if( EYE_IfUnitIsGen( pUnit ) )
{
FACE_ShowProcessBar( PROCESSBAR_BLOOD, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
else if( CTRL_nHitCounter == 1 )
FACE_ShowProcessBar( PROCESSBAR_STONE, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
return TRUE;
}
return FALSE;
}
// 到达目的地后,对目标单元造成损失
// nIndex : index in array
// return : TRUE if hit someone
BOOL OTHER_HitArrow( int nIndex )
{
struct OTHER_STRUCT *pOther;
struct UNIT_STRUCT *pUnit, *pU; //分别是中箭的人和射箭的人
#ifdef _DEBUG
if( nIndex < 0 )
{
OutputDebugString( "OTHER_HitArrow Error: index is less than 0!\n" );
return FALSE;
}
#endif
pOther = &OTHER[nIndex];
Assert( pOther->nTargetID != MAP_DATA_NONE );
pUnit = MAP_GetUnit( pOther->nTargetID );
Assert( pUnit );
// July 31. 1997, Liu Gang
if( EYE_IfUnitIsDead( pUnit ) ) return FALSE;
//--------------
// 如果被攻击方的血格在被攻击前多于满值一半,而被攻击后少于满值一半,
// 则发出受伤声音。
BOOL bWounded = FALSE;
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1) )
bWounded = TRUE;
// 被攻击方生命减少
// 是建筑或可中断时,减血
if( pUnit->Status.bIRQ == FALSE
|| EYE_IfUnitIsBuild( pUnit ) )
pUnit->nLife -= pOther->nHit;
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1)
|| bWounded == FALSE )
bWounded = FALSE;
if( bWounded == TRUE )
// 受伤音效
RUN_SOUND_Wounded( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
// 受伤音效
//--------------
// pU->bHasStone = FALSE; // 清除投石标志
// 给被攻击者设置是谁打了他,如果是自己人则不设
Assert( pOther->nOwnerID != MAP_DATA_NONE );
pU = MAP_GetUnit( pOther->nOwnerID );
Assert( pU );
if( !EYE_IfUnitIsDead( pU )// 攻击者还没死
&& pU->Draw.nPlayer != pUnit->Draw.nPlayer )
{
pUnit->nIDAttackMe = pOther->nOwnerID; // 所有者ID
if( pUnit->Draw.nPlayer == GAME.nMe ) // 被攻击方是游戏者
{
MINI_SetBlink( pUnit->Draw.nDrawX, pUnit->Draw.nDrawY );
RUN_SOUND_UnderAttack( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
}
}
Assert( EYE_IfUnitIsDead( pU )
|| EYE_IfUnitIsArcher( pU )
|| EYE_IfUnitIsTower( pU )
|| EYE_IfUnitIsBattleShip( pU ) );
// 如果该死了
if( pUnit->nLife <= 0 )
{
RUN_UNIT_ToDie( pUnit );
return TRUE;
}
// 更新血格
if( EYE_IfFocusOnUnit( pUnit ) )
//&& EYE_IfSheIsMine( pU )
{
// 更新血格条
if( EYE_IfUnitIsGen( pUnit ) )
{
FACE_ShowProcessBar( PROCESSBAR_BLOOD, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
else if( CTRL_nHitCounter == 1 )
FACE_ShowProcessBar( PROCESSBAR_STONE, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
return TRUE;
}
// CBRun.cpp
extern RUN_nCounter; // 运行计数器
// 生产火攻的火
// nX, nY : 放火的位置(格子)
// nLife : 存活时间(轮)
// nDai : 生产的代数,为0时不生产
// nNum : 生产的个数,1到9个
inline void OTHER_HUOGONG_Set( int nX, int nY, int nLife, int nDai, int nNum )
{
if( nDai <= 0 ) return;
int DIR8[8]={0, 1, 7, 2, 6, 3, 5, 4};
int DIR4[4]={0, 2, 4, 6};
if( nNum > 1 )
{
if( nNum == 4 )
{
for( int i=0; i<nNum; i++ )
{
BOOL bOdd = nY&1;
int nXNext = nX+MAP_ptSenser[bOdd][0][DIR4[i]].x;
int nYNext = nY+MAP_ptSenser[bOdd][0][DIR4[i]].y;
OTHER_HUOGONG_Set( nXNext, nYNext, nLife, nDai, 1 );
}
}
else if( nNum == 8 )
{
for( int i=0; i<nNum; i++ )
{
BOOL bOdd = nY&1;
int nXNext = nX+MAP_ptSenser[bOdd][0][DIR8[i]].x;
int nYNext = nY+MAP_ptSenser[bOdd][0][DIR8[i]].y;
OTHER_HUOGONG_Set( nXNext, nYNext, nLife, nDai, 1 );
}
}
return;
}
struct OTHER_STRUCT other;
OTHER_ClearData( &other );
other.nType = OTHER_TYPE_HUOGONG;
other.nFile = 3;
other.nCol[0] = 0;
other.nCol[1] = 1;
other.nCol[2] = 2;
other.nCol[3] = 3;
other.nMaxFrame = 4;
other.nDelay = 4;
other.szItem.cx = MAP_Lib.Other[other.nFile].szItem.cx;
other.szItem.cy = MAP_Lib.Other[other.nFile].szItem.cy;
RECT rect = MAP_GetGroundRect( DRAW_ptScreenOffset, 0, nX, nY, 0 );
other.ptBegin.x = (rect.right+rect.left)/2 - other.szItem.cx/2+DRAW_ptScreenOffset.x;
other.ptBegin.y = rect.bottom+DRAW_ptScreenOffset.y-other.szItem.cy;
other.nHit = 10; // 攻击力
other.ptEnd.x = nX; // 所在格子位置
other.ptEnd.y = nY;
other.nOwnerID = nDai; // 生产的代数
other.nTargetID = nLife; // 生命值
// Dec.6.1997, Liu Gang
other.nFrame = RUN_nCounter %other.nMaxFrame; // 当前帧
WORD codeG = MAP_GetGroundData( 0, nX, nY );
if( codeG != MAP_DATA_NONE )
{
struct MAP_GROUND_CODE_STRUCT stctG;
MAP_GroundDeCode( codeG, &stctG );
switch( stctG.nFile )
{
case 0:
case 5:
break;
case 1:
case 2:
if( other.nOwnerID >= 1 )
other.nOwnerID -= 1; // 生产的代数
else
other.nOwnerID = 0;
break;
case 3:
case 4:
if( other.nOwnerID >= 2 )
other.nOwnerID -= 2; // 生产的代数
else
other.nOwnerID = 0;
break;
}
}
// 判断是否已经有火了,如果有,则退出
WORD codeR = MAP_GetRegionData( nX, nY );
struct MAP_REGION_CODE_STRUCT stctR;
MAP_RegionDeCode( codeR, &stctR );
if( stctR.nPlayer == 1 )
return;
// 否则,在该点设置着火的标志,着火
stctR.nPlayer = 1;
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( nX, nY, codeR );
OTHER_CreateData( &other );
}
// 火烧效果
// nIndex : index in array
// return : TRUE if hit someone
BOOL OTHER_HUOGONG_Hit( int nIndex )
{
OTHER_STRUCT *pOther = &OTHER[nIndex];
struct UNIT_STRUCT *pUnit = NULL;
WORD codeUEx = MAP_GetUnitDataEx( pOther->ptEnd.x, pOther->ptEnd.y );
if( codeUEx == MAP_DATA_NONE )
return FALSE;
pUnit = MAP_GetUnit( codeUEx );
Assert( pUnit );
if( pUnit->nLife < 0 ) return FALSE;
//--------------
// 如果被攻击方的血格在被攻击前多于满值一半,而被攻击后少于满值一半,
// 则发出受伤声音。
BOOL bWounded = FALSE;
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1) )
bWounded = TRUE;
// 被攻击方生命减少
// 是建筑或可中断时,减血
if( pUnit->Status.bIRQ == FALSE
|| EYE_IfUnitIsBuild( pUnit ) )
{
pUnit->nLife -= pOther->nHit;
pUnit->nBloodPos=1;;
}
if( pUnit->nLife>=(EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile )>>1)
|| bWounded == FALSE )
bWounded = FALSE;
if( bWounded == TRUE )
// 受伤音效
RUN_SOUND_Wounded( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
// 受伤音效
//--------------
// pU->bHasStone = FALSE; // 清除投石标志
// 设置受到攻击的标志
if( pUnit->Draw.nPlayer == GAME.nMe ) // 被攻击方是游戏者
{
MINI_SetBlink( pUnit->Draw.nDrawX, pUnit->Draw.nDrawY );
RUN_SOUND_UnderAttack( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
}
// 如果该死了
if( pUnit->nLife <= 0 )
{
/*
char temp[128];
wsprintf( temp, "//-----------%d--------------//\n", CB_Counter );
WriteLogFile( "NetErr.log", temp );
WriteErrorFile( "NetErr.log", pUnit->nID );
*/
RUN_UNIT_ToDie( pUnit );
return TRUE;
}
// 更新血格
if( EYE_IfFocusOnUnit( pUnit ) )
{
// 更新血格条
if( EYE_IfUnitIsGen( pUnit ) )
{
FACE_ShowProcessBar( PROCESSBAR_BLOOD, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
else if( CTRL_nHitCounter == 1 )
FACE_ShowProcessBar( PROCESSBAR_STONE, pUnit->nLife*100/EYE_GetFullLife( pUnit->Draw.nPlayer, pUnit->Draw.nFile ) );
}
return TRUE;
}
// defined in CBDrawOT.cpp
// 当资源状态改变时(被砍伐,收割后),要更新该区域
// nZ,nX,nY : 格子坐标
extern void DRAW_OTHER_UpdateResource( int nZ, int nX, int nY );
// 删除火攻效果,如果遇到地形型资源,则该资源被使用掉
void OTHER_HUOGONG_Die( int nIndex )
{
// 如果是资源,则该资源被使用掉
struct OTHER_STRUCT *pOther = &OTHER[nIndex];
WORD codeG = MAP_GetGroundData( 0, pOther->ptEnd.x, pOther->ptEnd.y );
if( codeG != MAP_DATA_NONE )
{
struct MAP_GROUND_CODE_STRUCT stctG;
MAP_GroundDeCode( codeG, &stctG );
if( stctG.nAttr != MAP_SPECIAL_NONE && stctG.nAttr < 4 )
{
stctG.nAttr += 8; // 砍伐掉
codeG = MAP_GroundEnCode( stctG );
MAP_SetGroundData( 0, pOther->ptEnd.x, pOther->ptEnd.y, codeG );
DRAW_OTHER_UpdateResource( 0, pOther->ptEnd.x, pOther->ptEnd.y );
}
}
// 把着火标志清空
WORD codeR = MAP_GetRegionData( pOther->ptEnd.x, pOther->ptEnd.y );
struct MAP_REGION_CODE_STRUCT stctR;
MAP_RegionDeCode( codeR, &stctR );
Assert( stctR.nPlayer == 1 );
stctR.nPlayer = 0x0F;
codeR = MAP_RegionEnCode( stctR );
MAP_SetRegionData( pOther->ptEnd.x, pOther->ptEnd.y, codeR );
}
/////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -