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

📄 logbook.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if( _tcscmp( Pwd, Pilot.Password) )
	{
		EncryptPwd();
		return FALSE;
	}
	else
	{
		EncryptPwd();
		return TRUE;
	}
}

int LogBookData::SetPassword(_TCHAR *Password)
{
	if(_tcslen(Password) <= PASSWORD_LEN) 
	{
		_tcscpy(Pilot.Password,Password);
		EncryptPwd();
		return TRUE;
	}

	return FALSE;
}

int LogBookData::GetPassword(_TCHAR *Pwd)
{
	if(Pilot.Password[0] == 0)
		return FALSE;

	EncryptPwd();
	_tcscpy( Pwd, Pilot.Password );
	EncryptPwd();
	return TRUE;
}

_TCHAR nameWrank[MAX_PATH];

_TCHAR *LogBookData::NameWRank(void)
{
	if(gStringMgr)
	{
		_TCHAR *rank = gStringMgr->GetString(gRanksTxt[Rank()]);
		_stprintf(nameWrank,"%s %s",rank,Pilot.Name);
		return nameWrank;
	}
	return Name();
}

void LogBookData::UpdateDogfight(short MatchWon, float Hours, short VsHuman ,short Kills, short Killed, short HumanKills, short KilledByHuman )
{
	MissionResult = 0;

	UpdateFlightHours(Hours);

	if(VsHuman)
	{
		if(MatchWon >= 1)
			Pilot.Dogfight.MatchesWonVHum++;
		else if(MatchWon <= -1)
			Pilot.Dogfight.MatchesLostVHum++;
	}
	
	if(MatchWon >= 1)
		Pilot.Dogfight.MatchesWon ++;
	else if(MatchWon <= -1)
		Pilot.Dogfight.MatchesLost++;

	if(Kills > 0)
		Pilot.Dogfight.Kills += Kills;
	if(Killed > 0)
		Pilot.Dogfight.Killed += Killed;
	if(HumanKills > 0)
		Pilot.Dogfight.HumanKills += HumanKills;
	if(KilledByHuman > 0)
		Pilot.Dogfight.KilledByHuman += KilledByHuman;
	
	SaveData();
}

void LogBookData::UpdateCampaign(CAMP_MISS_STRUCT *MissStats )
{
	MissionResult = 0;

	UpdateFlightHours(MissStats->FlightHours);

	if(MissStats->Flags & CRASH_UNDAMAGED)
	{
		Pilot.Campaign.TotalScore -= 25;
		MissionResult |= CM_CRASH|COURT_MARTIAL;
	}

	if(MissStats->Flags & EJECT_UNDAMAGED)
	{
		Pilot.Campaign.TotalScore -= 50;
		MissionResult |= CM_EJECT|COURT_MARTIAL;
	}

	short FrKills = static_cast<short>(MissStats->FriendlyFireKills);
	
	while(FrKills)
	{
		if(Pilot.Campaign.FriendliesKilled == 0)
		{
			Pilot.Campaign.TotalScore -= 100;
			MissionResult |= CM_FR_FIRE1|COURT_MARTIAL;
		}
		else if(Pilot.Campaign.FriendliesKilled == 1)
		{
			Pilot.Campaign.TotalScore -= 200;
			MissionResult |= CM_FR_FIRE2|COURT_MARTIAL;
		}
		else
		{
			Pilot.Campaign.TotalScore -= 200;
			if(MissStats->Flags & FR_HUMAN_KILLED)
			{
				Pilot.Campaign.TotalScore = 0;
				Pilot.Rank = SEC_LT;
				MissionResult |= CM_FR_FIRE3|COURT_MARTIAL;
			}
			else
				MissionResult |= CM_FR_FIRE2|COURT_MARTIAL;
		}
		Pilot.Campaign.FriendliesKilled++;
		FrKills--;
	}
	
	//calculate new score using complexity, no mission pts if you get court martialed!
	if(!(MissionResult & COURT_MARTIAL))
		Pilot.Campaign.TotalScore += FloatToInt32(MissStats->Score * MissionComplexity(MissStats) * CampaignDifficulty() *
										PlayerOptions.Realism/30.0F + MissStats->FlightHours);

	if(Pilot.Campaign.TotalScore < 0)
		Pilot.Campaign.TotalScore = 0;

	if (!(MissStats->Flags & DONT_SCORE_MISSION))
		{
		Pilot.Campaign.Missions++;

		ShiAssert(MissStats->Score >= 0);
		Pilot.Campaign.TotalMissionScore += MissStats->Score;

		Pilot.Campaign.TotalScore -= MissStats->WingmenLost * 5;

		ShiAssert(MissStats->Kills >= 0);
		if(MissStats->Kills > 0)
			Pilot.Campaign.Kills += MissStats->Kills;
		if(Pilot.Campaign.Kills < 0)
			Pilot.Campaign.Kills = 0;

		ShiAssert(MissStats->Killed >= 0);
		if(MissStats->Killed > 0)
			Pilot.Campaign.Killed += MissStats->Killed;
		if(Pilot.Campaign.Killed < 0)
			Pilot.Campaign.Killed = 0;

		ShiAssert(MissStats->HumanKills >= 0);
		if(MissStats->HumanKills > 0)
			Pilot.Campaign.HumanKills += MissStats->HumanKills;
		if(Pilot.Campaign.HumanKills < 0)
			Pilot.Campaign.HumanKills = 0;

		ShiAssert(MissStats->KilledByHuman >= 0);
		if(MissStats->KilledByHuman > 0)
			Pilot.Campaign.KilledByHuman += MissStats->KilledByHuman;
		if(Pilot.Campaign.KilledByHuman < 0)
			Pilot.Campaign.KilledByHuman = 0;

		ShiAssert(MissStats->KilledBySelf >= 0);
		if(MissStats->KilledBySelf > 0)
			Pilot.Campaign.KilledBySelf += MissStats->KilledBySelf;
		if(Pilot.Campaign.KilledBySelf < 0)
			Pilot.Campaign.KilledBySelf = 0;

		ShiAssert(MissStats->GroundUnitsKilled >= 0);
		if(MissStats->GroundUnitsKilled > 0)
			Pilot.Campaign.AirToGround += MissStats->GroundUnitsKilled;
		if(Pilot.Campaign.AirToGround < 0)
			Pilot.Campaign.AirToGround = 0;

		ShiAssert(MissStats->FeaturesDestroyed >= 0);
		if(MissStats->FeaturesDestroyed > 0)
			Pilot.Campaign.Static += MissStats->FeaturesDestroyed;
		if(Pilot.Campaign.Static < 0)
			Pilot.Campaign.Static = 0;

		ShiAssert(MissStats->NavalUnitsKilled >= 0);
		if( MissStats->NavalUnitsKilled > 0)
			Pilot.Campaign.Naval += MissStats->NavalUnitsKilled;
		if(Pilot.Campaign.Naval < 0)
			Pilot.Campaign.Naval = 0;

		if(!(MissionResult & COURT_MARTIAL))
			AwardMedals(MissStats);
		}

	CalcRank();

	SaveData();
}

void LogBookData::CalcRank(void)
{
	LB_RANK NewRank = SEC_LT;

	if((Pilot.Campaign.TotalScore > 3200) && Pilot.Campaign.GamesWon)
	{
		NewRank = COLONEL;
	}
	else if( (Pilot.Campaign.TotalScore > 1600) &&	\
				( Pilot.Campaign.GamesWon|| Pilot.Campaign.GamesTied) )
	{
		NewRank = LT_COL;
	}
	else if( (Pilot.Campaign.TotalScore > 800) &&	\
				( Pilot.Campaign.GamesWon|| Pilot.Campaign.GamesTied || Pilot.Campaign.GamesLost) )
	{
		NewRank = MAJOR;
	}
	else if(Pilot.Campaign.TotalScore > 300)
	{
		NewRank = CAPTAIN;
	}
	else if(Pilot.Campaign.TotalScore > 150)
	{
		NewRank = LEIUTENANT;
	}
	else 
	{
		NewRank = SEC_LT;
	}

	if(NewRank > Pilot.Rank )
	{
		MissionResult |= PROMOTION;
		Pilot.Rank = NewRank;
	}
}

//returns value from 4 to 6
float LogBookData::MissionComplexity(CAMP_MISS_STRUCT *MissStats)
{
	float Duration;
	float WeapExpended,ShotsAt,AircrftInPkg;

	//determine mission complexity
	if(MissStats->FlightHours > 1.5f)
		Duration = 1.5f;
	else
		Duration = MissStats->FlightHours;

	if(MissStats->WeaponsExpended > 6)
		WeapExpended = 6;
	else
		WeapExpended = static_cast<float>(MissStats->WeaponsExpended);

	if(MissStats->ShotsAtPlayer > 10)
		ShotsAt = 10;
	else
		ShotsAt = static_cast<float>(MissStats->ShotsAtPlayer);

	if(MissStats->AircraftInPackage > 8)
		AircrftInPkg = 8;
	else
		AircrftInPkg = static_cast<float>(MissStats->AircraftInPackage);

	
	return (Duration/3.0F + WeapExpended/6.0F + ShotsAt/10.0F + AircrftInPkg/16.0F + 3.0F);
}

//returns value from 16 to 20
float	LogBookData::CampaignDifficulty(void)
{
	return (	(13.0F - TheCampaign.GroundRatio - TheCampaign.AirRatio -
						TheCampaign.AirDefenseRatio - TheCampaign.NavalRatio/4.0F)/39.0F  +
						(TheCampaign.EnemyAirExp + TheCampaign.EnemyADExp)/12.0F)*5.0F + 15.0F;
}

void LogBookData::AwardMedals(CAMP_MISS_STRUCT *MissStats)
{
	if(MissStats->Score >= 3)
	{
		int MedalPts =0;

		if(MissStats->Flags & DESTROYED_PRIMARY)
			MedalPts+= 2;

		if(MissStats->Flags & LANDED_AIRCRAFT)
			MedalPts++;

		if(!MissStats->WingmenLost)
			MedalPts++;
		
		MedalPts +=	MissStats->NavalUnitsKilled + MissStats->Kills + 
						min(10,MissStats->FeaturesDestroyed/2) + min(10,MissStats->GroundUnitsKilled/2);

		MedalPts = FloatToInt32(PlayerOptions.Realism * MedalPts * CampaignDifficulty() * MissStats->Score * MissionComplexity(MissStats));

		if( (MedalPts > 9600) && (PlayerOptions.Realism > 0.9f) && MissStats->Score >= 4 )
		{
			MissionResult |= AWARD_MEDAL|MDL_AFCROSS;
			Pilot.Medals[AIR_FORCE_CROSS]++;
			Pilot.Campaign.TotalScore += 20;
		}
		else if( (MedalPts > 7800) && (PlayerOptions.Realism > 0.7f))
		{
			MissionResult |= AWARD_MEDAL|MDL_SILVERSTAR;
			Pilot.Medals[SILVER_STAR]++;
			Pilot.Campaign.TotalScore += 15;
		}
		else if(MedalPts > 6000 && (PlayerOptions.Realism > 0.5f))
		{
			MissionResult |= AWARD_MEDAL|MDL_DIST_FLY;
			Pilot.Medals[DIST_FLY_CROSS]++;
			Pilot.Campaign.TotalScore += 10;
		}
		else if(MedalPts > 4800)
		{
			MissionResult |= AWARD_MEDAL|MDL_AIR_MDL;
			Pilot.Medals[AIR_MEDAL]++;
			Pilot.Campaign.TotalScore += 5;
		}
}


	if(MissStats->Killed || MissStats->KilledByHuman || MissStats->KilledBySelf)
	{
		Pilot.Campaign.ConsecMissions = 0;
	}
	else
	{
		if(!PlayerOptions.InvulnerableOn())
			Pilot.Campaign.ConsecMissions++;
	}

	if(Pilot.Campaign.ConsecMissions >= 100)
	{
		MissionResult |= AWARD_MEDAL|MDL_LONGEVITY;
		Pilot.Campaign.ConsecMissions = 0;
		Pilot.Medals[LONGEVITY]++;
	}
}

void LogBookData::FinishCampaign(short WonLostTied)
{
	Pilot.Campaign.TotalScore += 10;

	if(WonLostTied > 0)
	{
		Pilot.Campaign.GamesWon++;
		Pilot.Campaign.TotalScore += 10;
		Pilot.Medals[KOREA_CAMPAIGN]++;
		MissionResult |= AWARD_MEDAL|MDL_KOR_CAMP;
	}
	else if(WonLostTied < 0)
	{
		Pilot.Campaign.GamesLost++;
	}
	else
		Pilot.Campaign.GamesTied++;

	SaveData();
}

⌨️ 快捷键说明

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