⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbother.cpp

📁 经典游戏赤壁的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -