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

📄 cbrunot.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		break;
	case	MUCAI1:	// 把1000木材换成钱
		GAME.Players[nPlayer].nWood += DATA_Lib.Upgrade[MUCAI1].nWood*RUN_CREATE_PAYBACK/100;
		break;
	case	MUCAI2:	// 把5000木材换成钱
		GAME.Players[nPlayer].nWood += DATA_Lib.Upgrade[MUCAI2].nWood*RUN_CREATE_PAYBACK/100;
		break;
	case	LIANGSHI1:	// 把1000粮食换成钱
		GAME.Players[nPlayer].nFood += DATA_Lib.Upgrade[LIANGSHI1].nFood*RUN_CREATE_PAYBACK/100;
		break;
	case	LIANGSHI2:	// 把5000粮食换成钱
		GAME.Players[nPlayer].nFood += DATA_Lib.Upgrade[LIANGSHI2].nFood*RUN_CREATE_PAYBACK/100;
		break;
	case	TIEKUANG1:	// 把1000铁矿石换成钱
		GAME.Players[nPlayer].nIron += DATA_Lib.Upgrade[TIEKUANG1].nIron*RUN_CREATE_PAYBACK/100;
		break;
	case	TIEKUANG2:	// 把5000铁矿石换成钱
		GAME.Players[nPlayer].nIron += DATA_Lib.Upgrade[TIEKUANG2].nIron*RUN_CREATE_PAYBACK/100;
		break;
	}
	GFWI_bUpdate = TRUE;
}
/////////////

/////////////
// 判断如果单元生命小于0,对该单元下达删除命令
// 但只有当动画显示完全后,才真正调用CTRL_UNIT_Detroy()删除它
void RUN_UNIT_ToDie( struct UNIT_STRUCT *pUnit )
{
	if( EYE_IfUnitIsDead( pUnit ) )
		return;

	int nJingYanGrade[10]={200,500,1000,1800,3000,5000,8000,12000,18000,27000};

	Assert( EYE_IfUnitIsBuild( pUnit ) 
			||	(pUnit->nHasShadow == TRUE
				&& !EYE_IfUnitIsBuild( pUnit ) ) );	// 

	// 给攻击者提升经验值和士气
	// 若没有攻击者,则可能是自己人干的
	struct UNIT_STRUCT *pU=NULL;
	if( pUnit->nIDAttackMe != MAP_DATA_NONE )
	{
		pU = MAP_GetUnit( pUnit->nIDAttackMe );
		Assert( pU );

		// 战斗记分,Nov.6.1997
	//-----------
		if( EYE_IfUnitIsGen( pUnit ) )
		{
			RUN_CountDown[pU->Draw.nPlayer].nKilledGenerals ++;
		}
		else if( EYE_IfUnitIsBuild( pUnit ) )
		{
			RUN_CountDown[pU->Draw.nPlayer].nKilledBuildings ++;
		}
		else if( EYE_IfUnitIsSoldier( pUnit ) )
		{
			RUN_CountDown[pU->Draw.nPlayer].nKilledSoldiers += EYE_GetFullLife( -1, pUnit->Draw.nFile );
		}
	//-----------
	
		pU = EYE_GetGeneral( pU );
		if( pU )	// 攻击者的将领
		{
			DATA_Lib.Gen[pU->Gen.nID].nJingYan += DATA_Lib.Unit[pUnit->Draw.nFile].nAddExp;
			// debug only
//			DATA_Lib.Gen[pU->Gen.nID].nJingYan += nJingYanGrade[DATA_Lib.Gen[pU->Gen.nID].nLevel];

			// 升级
			if( DATA_Lib.Gen[pU->Gen.nID].nLevel < 9 )
			{
				if( DATA_Lib.Gen[pU->Gen.nID].nJingYan >= nJingYanGrade[DATA_Lib.Gen[pU->Gen.nID].nLevel] )
				{
					DATA_Lib.Gen[pU->Gen.nID].nJingYan -= nJingYanGrade[DATA_Lib.Gen[pU->Gen.nID].nLevel];
					DATA_Lib.Gen[pU->Gen.nID].nLevel++;

					//我将领战斗英勇,斩获甚多,晋升一级。
					if( EYE_IfFocusOnUnit( pU ) && EYE_IfSheIsMine( pU ) )
					{
						FACE_ShowPromptInfor( 12 );
						//---- 肯定音效
						// victory.wav
						DATA_WAVE_EffectPlay( 106 );
						//---- 肯定音效
					}
				}
			}

			pU->Gen.nMorale += DATA_Lib.Unit[pUnit->Draw.nFile].nAddMorale;

			if( EYE_IfFocusOnUnit( pU ) )
			{
				//更新级别名称,经验值,士兵数
				char strLvl[32];
				EYE_GetLevelName( pU->Gen.nID, strLvl );
				FACE_UpdateOffice( strLvl );
				FACE_UpdateExperience( DATA_Lib.Gen[pU->Gen.nID].nJingYan );
				FACE_UpdateSoliderNumber( CTRL_GetFocusSoldierNumber() );
				FACE_ShowProcessBar( PROCESSBAR_POWER, EYE_GetWuLi( pU->Gen.nID )*100/120 );
				//// 更新士气
				FACE_UpdateMorale( EYE_GetMorale( pU ) ) ;
			}
		}
	}

	// 给自己减少士气
	pU = EYE_GetGeneral( pUnit );// 自己的将领
	if( pU )
	{
		pU->Gen.nMorale -= DATA_Lib.Unit[pUnit->Draw.nFile].nAddMorale;
		if( EYE_IfFocusOnUnit( pU ) )
		{	// 更新士气
			FACE_UpdateMorale( EYE_GetMorale( pU ) ) ;
		}
	}

	// 如果是大旗,则需要降低自己方所有部队的士气
	// Aug 14, 1997
	if( pUnit->Draw.nFile == 26 )
	{
		for( int i=0; i<PLAYER_GROUP_MAX; i++ )
		{
			WORD wGroup = GAME.Players[pUnit->Draw.nPlayer].wGroup[i];
			if( wGroup != MAP_DATA_NONE )
			{
				pU = MAP_GetUnit( wGroup );
				Assert( pU );
				Assert( EYE_IfUnitIsGen( pU ) );
				pU->Gen.nMorale -= 50;
				if( EYE_IfFocusOnUnit( pU ) )
				{	// 更新士气
					FACE_UpdateMorale( EYE_GetMorale( pU ) ) ;
				}
			}
		}
	}

	// 下达删除命令
	struct CTRL_TASK_STRUCT hitDest;
	CTRL_TASK_Clear( &hitDest );

	// 设置命令
	Assert( pUnit );
	Assert( pUnit->nLife <= 0 );
	pUnit->nIDAttackMe = MAP_DATA_NONE;

	hitDest.bDone = TRUE;
	hitDest.bIRQ = TRUE;		// 强行中断
	hitDest.nID = pUnit->nID;
	hitDest.nLevel = 0;			// 该命令的级别,0 is the highest, 5 is the lowest
	hitDest.nTaskID = SHANCHU;	// 任务
	hitDest.nTaskIDEx = 0;		// 被杀死

	// 下达任务到队列中
	CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &hitDest );

	// 死亡音效
	RUN_SOUND_Die( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nFile );
	// 死亡音效
}
/////////////

/////////////
BOOL RUN_MOULUE_IfEnough( struct UNIT_STRUCT *pUnit, CTRL_JIMOU nJiMou )
{
	Assert( EYE_IfUnitIsGen( pUnit ) );
	if( DATA_Lib.Gen[pUnit->Gen.nID].nMouLue < RUN_MOULUE_nConsume[nJiMou] )
	{
		if( EYE_IfSheIsMine( pUnit ) )
		{
			// 谋略值不够无法使用该计谋
			FACE_ShowPromptInfor( 9 );
			//---- 否定音效
			// noselect.wav
			DATA_WAVE_EffectPlay( 99 );
			//---- 否定音效
		}
		return FALSE;
	}
	return TRUE;
}
/////////////

/////////////
// 攻击音效
// nX, nY	:	位置
// nFile	:	单元文件号
void RUN_SOUND_Hit( int nX, int nY, int nFile )
{
	//---- 音效
	POINT pt;
	pt.x = nX, pt.y = nY;
	if( PtInRect( &DRAW_rcScreen, pt ) )
	{
		int nID=-1;

		switch( nFile )
		{
		case	31://步将
			//fight01.wav
			nID = 9;
			break;
		case	32://步兵100
		case	38://步兵200
			//fight02.wav
			nID = 10;
			break;
		case	41://步兵500
		case	43://步兵1000
			//fight03,04.wav
			nID = getrandom(11,12);
			break;
		case	35://骑将
		case	36://骑兵100
		case	37://骑兵200
		case	40://骑兵500
			nID = 10;
			break;
		case	29://文将
		case	30://工人
			//hitbody4.wav
			nID = 16;
			break;
		};
		if( nID != -1 )
		{
			DATA_WAVE_EffectPlay( nID );
		}
	}
	//---- 音效
}

// 弓箭攻击音效
// nX, nY	:	位置
// nFile	:	单元文件号
void RUN_SOUND_HitF( int nX, int nY, int nFile )
{
	//---- 音效
	// 弓箭手100-200人,弓将
	POINT pt;
	pt.x = nX, pt.y = nY;
	if( PtInRect( &DRAW_rcScreen, pt ) )
	{
		int nID=-1;
		switch( nFile )
		{
		case	18:// 箭楼
		case	19:
			//arrow07.wav
			nID = 6;	
			break;
		case	33://弓将
			//arrow01.wav
			nID = 0;
			break;
		case	45://弓兵100
		case	39://弓兵200
			//arrow02-04.wav
			nID = getrandom(1,3);
			break;
		case	42://弓兵500
		case	44://弓兵1000
			//arrow05,06.wav
			nID = getrandom(4,5);
			break;
		case	46:// 小战船
		//case	47:// 运输船
		case	48:// 大战船
		case	49:// 连船
			nID = getrandom(1,3);
			break;
		}
		if( nID != -1 )
		{
			DATA_WAVE_EffectPlay( nID );
		}
		//---- 音效
	}
}

// 死亡音效
// nX, nY	:	位置
// nFile	:	单元文件号
void RUN_SOUND_Die( int nX, int nY, int nFile )
{
	//----死亡音效
	POINT pt;
	pt.x = nX, pt.y = nY;
	if( PtInRect( &DRAW_rcScreen, pt ) )
	{
		int nID = -1;
		switch( nFile )
		{
		case	27:// 女平民
		case	28:// 难平民
			break;
		case	29:// 文将
//			break;
		case	30:// 工人
			break;
		case	31:// 步将
	//		break;
		case	32:// 步兵100
		case	38:// 步兵200
		case	41:// 步兵500
		case	43:// 步兵1000
			// died1.wav
			nID = 93;
			break;
		case	34:// 车兵
			break;
		case	35:// 骑将
//			break;
		case	36:// 骑兵100
		case	37:// 骑兵200
		case	40:// 骑兵500
			// died3.wav
			nID = 95;
			break;
		case	33:// 弓将
//			break;
		case	45:// 弓兵100
		case	39:// 弓兵200
		case	42:// 弓兵500
		case	44:// 弓兵1000
			// died2.wav
			nID = 94;
			break;
		case	52:// 水军将领
//			break;
		case	46:// 小战船
		case	47:// 运输船
		case	48:// 大战船
		case	49:// 连船
//			break;
			// boatrune.wav
			nID = 90;
			break;
		case	50:// 短云梯
		case	51:// 长云梯
			break;
		}
		if( nID != -1 )
		{
			DATA_WAVE_EffectPlay( nID );
		}
	}
	//----死亡音效
}

// 受伤音效
// nX, nY	:	位置
// nFile	:	单元文件号
void RUN_SOUND_Wounded( int nX, int nY, int nFile )
{
	//----受伤音效
	POINT pt;
	pt.x = nX, pt.y = nY;
	if( PtInRect( &DRAW_rcScreen, pt ) )
	{
		int nID = -1;
		switch( nFile )
		{
		case	27:// 女平民
		case	28:// 难平民
			break;
		case	29:// 文将
//			break;
		case	30:// 工人
			break;
		case	31:// 步将
	//		break;
		case	32:// 步兵100
		case	38:// 步兵200
		case	41:// 步兵500
		case	43:// 步兵1000
			// wounded1.wav
			nID = 107;
			break;
		case	34:// 车兵
			break;
		case	35:// 骑将
//			break;
		case	36:// 骑兵100
		case	37:// 骑兵200
		case	40:// 骑兵500
			// wounded3.wav
			nID = 109;
			break;
		case	33:// 弓将
//			break;
		case	45:// 弓兵100
		case	39:// 弓兵200
		case	42:// 弓兵500
		case	44:// 弓兵1000
			// wounded2.wav
			nID = 108;
			break;
		case	52:// 水军将领
//			break;
		case	46:// 小战船
		case	47:// 运输船
		case	48:// 大战船
		case	49:// 连船
//			break;
			break;
		case	50:// 短云梯
		case	51:// 长云梯
			break;
		}
		if( nID != -1 )
		{
			DATA_WAVE_EffectPlay( nID );
		}
	}
	//----受伤音效
}

// 用于音效,每隔一定时间该开关打开,当屏幕以外的我方单元(部队/建筑)
// 受到攻击时,由画外音提醒游戏者We are under attack!
// 注:要在函数外面判断游戏者
// nX, nY	:	被攻击单元位置坐标
// nFile	:	被攻击单元文件号
void RUN_SOUND_UnderAttack( int nX, int nY, int nFile )
{
	if( RUN_SOUND_bWeAreUnderAttack == FALSE )
		return;
	POINT pt;
	pt.x = nX, pt.y = nY;
	if( PtInRect( &DRAW_rcScreen, pt ) )
		return;	// 在屏幕内不说

	RUN_SOUND_bWeAreUnderAttack = FALSE;	// 开关关闭
	int nID = -1;
	if( nFile >= 0 && nFile < 27 )
	{	// XRe-XRg.wav
		nID = getrandom( 81,83 );
	}
	else
	{
		switch( nFile )
		{
		case	29:	//文将
			//XG4e-g.wav
			nID = getrandom(75,77);
			break;
		case	31:	//步将
			//XG1e-g.wav
			nID = getrandom(54,56);
			break;
		case	33:	//弓将
			//XG2e-g.wav
			nID = getrandom(61,63);
			break;
		case	35:	//骑将
			//XG3e-g.wav
			nID = getrandom(68,70);
			break;
		case	52:	//水将
			//XG2e-g.wav
			nID = getrandom(61,63);
			break;
		default:	// 其他士兵
			nID = getrandom(78,80);
		}
	}
	if( nID != -1 )
	{
		DATA_WAVE_EffectPlay( nID );
	}
}
/////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -