976 lines
32 KiB
C++
976 lines
32 KiB
C++
#include "cbase.h"
|
|
#include "asw_campaign_save.h"
|
|
#include "asw_campaign_info.h"
|
|
#include "asw_gamerules.h"
|
|
#include "asw_game_resource.h"
|
|
#include "asw_marine_resource.h"
|
|
#include "asw_marine_profile.h"
|
|
#include "asw_marine.h"
|
|
#include "filesystem.h"
|
|
#include "asw_medals.h"
|
|
#include "asw_medals_shared.h"
|
|
#include "asw_player.h"
|
|
#include "asw_equipment_list.h"
|
|
#include "world.h"
|
|
#include "asw_achievements.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
ConVar asw_medal_explosive_kills("asw_medal_explosive_kills", "6", 0, "How many aliens have to be killed from one explosion to get the explosives merit medal");
|
|
ConVar asw_medal_reckless_explosive_kills("asw_medal_reckless_explosive_kills", "1", 0, "How many aliens have to be killed from kicked grenades to get the reckless explosive merit");
|
|
ConVar asw_medal_lifesaver_dist("asw_medal_lifesaver_dist", "100", 0, "How close an alien has to be a fellow marine to count for the lifesaver medal");
|
|
ConVar asw_medal_lifesaver_kills("asw_medal_lifesaver_kills", "1", 0, "How many aliens you have to kill that were close to a teammate to get the lifesaver medal");
|
|
ConVar asw_medal_blood_heal_amount("asw_medal_blood_heal_amount", "150", 0, "How much health must be healed to win the blood halo medal");
|
|
ConVar asw_medal_silver_heal_amount("asw_medal_silver_heal_amount", "200", 0, "How much health must be healed to win the silver halo medal");
|
|
ConVar asw_medal_mine_burns("asw_medal_mine_burns", "60", 0, "How many mine kills needed to get the mine medal");
|
|
ConVar asw_medal_accuracy("asw_medal_accuracy", "0.9", 0, "Minimum accuracy needed to win the accuracy medal");
|
|
ConVar asw_medal_sentry_kills("asw_medal_sentry_kills", "60", 0, "Minimum kills needed to win the sentry medal");
|
|
ConVar asw_medal_grub_kills("asw_medal_grub_kills", "10", 0, "Minimum kills needed to get the grub medal, if the team has wiped out all grubs in the map");
|
|
ConVar asw_medal_egg_kills("asw_medal_egg_kills", "10", 0, "Minimum kills needed to get the eggs medal, if the team has wiped out all grubs in the map");
|
|
ConVar asw_medal_parasite_kills("asw_medal_parasite_kills", "50", 0, "Minimum kills needed to get the parasite medal");
|
|
ConVar asw_medal_firefighter("asw_medal_firefighter", "10", 0, "Minimum fires needed to put out to get the firefighter medal");
|
|
//ConVar asw_medal_last_stand_kills("asw_medal_last_stand_kills", "10", 0, "Minimum kills needed to get the last stand medal");
|
|
ConVar asw_medal_melee_hits("asw_medal_melee_hits", "20", 0, "Minimum kicks needed to get the iron fist medal");
|
|
ConVar asw_medal_barrel_kills("asw_medal_barrel_kills", "5", 0, "Minimum aliens killed with barrels to get the Collateral damage medal");
|
|
|
|
ConVar asw_debug_medals("asw_debug_medals", "0", 0, "Print debug info about medals");
|
|
|
|
// counts needed for persistent stats medals
|
|
//#define ASW_MISSIONS_MEDAL_1 100
|
|
//#define ASW_MISSIONS_MEDAL_2 1000
|
|
//#define ASW_CAMPAIGNS_MEDAL_1 10
|
|
//#define ASW_CAMPAIGNS_MEDAL_2 100
|
|
//#define ASW_KILLS_MEDAL_1 5000
|
|
//#define ASW_KILLS_MEDAL_2 10000
|
|
//#define ASW_KILLS_MEDAL_3 50000
|
|
//#define ASW_KILLS_MEDAL_4 100000
|
|
|
|
int s_nRepeatableMedals[] =
|
|
{
|
|
MEDAL_CLEAR_FIRING,
|
|
MEDAL_SHIELDBUG_ASSASSIN,
|
|
MEDAL_EXPLOSIVES_MERIT,
|
|
MEDAL_SHARPSHOOTER,
|
|
MEDAL_PERFECT,
|
|
//MEDAL_STATIC_DEFENSE,
|
|
MEDAL_ALL_SURVIVE_A_MISSION,
|
|
MEDAL_IRON_FIST,
|
|
MEDAL_COLLATERAL_DAMAGE,
|
|
MEDAL_GOLDEN_HALO,
|
|
MEDAL_BLOOD_HALO,
|
|
MEDAL_PEST_CONTROL,
|
|
MEDAL_EXTERMINATOR,
|
|
MEDAL_ELECTRICAL_SYSTEMS_EXPERT,
|
|
MEDAL_SMALL_ARMS_SPECIALIST,
|
|
MEDAL_GUNFIGHTER,
|
|
MEDAL_BUGSTOMPER,
|
|
MEDAL_RECKLESS_EXPLOSIVES_MERIT,
|
|
MEDAL_LIFESAVER,
|
|
MEDAL_HUNTER,
|
|
MEDAL_SPEED_RUN_LANDING_BAY,
|
|
MEDAL_SPEED_RUN_OUTSIDE,
|
|
MEDAL_SPEED_RUN_PLANT,
|
|
MEDAL_SPEED_RUN_OFFICE,
|
|
MEDAL_SPEED_RUN_DESCENT,
|
|
MEDAL_SPEED_RUN_SEWERS,
|
|
MEDAL_SPEED_RUN_MINE,
|
|
|
|
};
|
|
|
|
// testing version
|
|
//#define ASW_MISSIONS_MEDAL_1 3
|
|
//#define ASW_MISSIONS_MEDAL_2 6
|
|
//#define ASW_CAMPAIGNS_MEDAL_1 1
|
|
//#define ASW_CAMPAIGNS_MEDAL_2 3
|
|
//#define ASW_KILLS_MEDAL_1 50
|
|
//#define ASW_KILLS_MEDAL_2 100
|
|
//#define ASW_KILLS_MEDAL_3 150
|
|
//#define ASW_KILLS_MEDAL_4 200
|
|
|
|
void CASW_Medals::OnStartMission()
|
|
{
|
|
// count how many eggs there are
|
|
CBaseEntity* pEntity = NULL;
|
|
m_iNumEggs = 0;
|
|
m_bAwardEggMedal = false;
|
|
m_bAllSurvived = false;
|
|
while ((pEntity = gEntList.FindEntityByClassname( pEntity, "asw_egg" )) != NULL)
|
|
{
|
|
m_iNumEggs++;
|
|
}
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("Medals: %d eggs in the mission\n", m_iNumEggs);
|
|
|
|
// count how many grubs there are in the mission at the start
|
|
pEntity = NULL;
|
|
ASWGameRules()->m_iNumGrubs = 0;
|
|
m_bAwardGrubMedal = false;
|
|
while ((pEntity = gEntList.FindEntityByClassname( pEntity, "asw_grub" )) != NULL)
|
|
{
|
|
ASWGameRules()->m_iNumGrubs++; // note: this var will get increased when grub sacs spawn grubs too
|
|
}
|
|
m_fStartMissionTime = gpGlobals->curtime;
|
|
}
|
|
|
|
void CASW_Medals::AwardMedals()
|
|
{
|
|
if (!ASWGameRules() || !ASWGameResource())
|
|
return;
|
|
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
|
|
// did the marines kill all the eggs?
|
|
int iNumEggsKilled = 0;
|
|
int iNumGrubsKilled = 0;
|
|
m_bAllSurvived = true;
|
|
int nMarineResources = 0;
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR)
|
|
{
|
|
iNumEggsKilled += pMR->m_iEggKills;
|
|
iNumGrubsKilled += pMR->m_iGrubKills;
|
|
|
|
if ( pMR->GetHealthPercent() <= 0.0f )
|
|
{
|
|
m_bAllSurvived = false;
|
|
}
|
|
nMarineResources++;
|
|
}
|
|
}
|
|
m_bAwardEggMedal = iNumEggsKilled >= m_iNumEggs;
|
|
m_bAwardGrubMedal = iNumGrubsKilled >= ASWGameRules()->m_iNumGrubs;
|
|
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("Marines killed %d out of %d eggs\n", iNumEggsKilled, m_iNumEggs);
|
|
|
|
// go through each marine
|
|
bool bTechAlive = false;
|
|
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if ( pMR )
|
|
{
|
|
AwardMedalsTo( pMR );
|
|
|
|
if ( pMR->GetProfile() && pMR->IsAlive() && pMR->GetHealthPercent() > 0.0f )
|
|
{
|
|
if ( pMR->GetProfile()->GetMarineClass() == MARINE_CLASS_TECH )
|
|
{
|
|
bTechAlive = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// award player medals to each player
|
|
for ( int i = 1; i <= gpGlobals->maxClients; i++ )
|
|
{
|
|
CASW_Player* pPlayer = dynamic_cast<CASW_Player*>(UTIL_PlayerByIndex(i));
|
|
|
|
if ( pPlayer && pPlayer->IsConnected() )
|
|
{
|
|
#ifdef USE_MEDAL_STORE
|
|
AwardPlayerMedalsTo(pPlayer);
|
|
#endif
|
|
|
|
if ( pPlayer->GetMarine() )
|
|
{
|
|
if ( ASWGameRules()->GetMissionSuccess() )
|
|
{
|
|
if ( bTechAlive )
|
|
{
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_TECH_SURVIVES );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CASW_Medals::AwardMedalsTo(CASW_Marine_Resource *pMR)
|
|
{
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
|
|
if ( !pMR || !pGameResource )
|
|
return;
|
|
|
|
if ( pGameResource->IsOfflineGame() )
|
|
return;
|
|
|
|
if ( !pMR->IsInhabited() )
|
|
return;
|
|
|
|
CASW_Player *pPlayer = pMR->GetCommander();
|
|
if ( !pPlayer )
|
|
return;
|
|
|
|
pMR->m_bAwardedMedals = true;
|
|
|
|
//CASW_Marine *pMarine = pMR->GetMarineEntity();
|
|
//DebugMedals(pMR);
|
|
if (asw_debug_medals.GetBool() && pMR->GetProfile())
|
|
Msg("Awarding medals to %s\n", pMR->GetProfile()->m_ShortName);
|
|
|
|
if ( asw_debug_medals.GetInt() == 2 )
|
|
{
|
|
for ( int i = 0; i < 4; i++ )
|
|
{
|
|
AwardSingleMedalTo( s_nRepeatableMedals[ RandomInt( 0, NELEMS( s_nRepeatableMedals ) - 1 ) ], pMR );
|
|
}
|
|
//AwardSingleMedalTo( RandomInt( MEDAL_BLOOD_HEART, MEDAL_OUTSTANDING_EXECUTION_QUEEN_LAIR ), pMR );
|
|
return;
|
|
}
|
|
|
|
// add achievements to the medal string
|
|
char achievement_buffer[ 255 ];
|
|
achievement_buffer[0] = 0;
|
|
for ( int i = 0; i < pMR->m_aAchievementsEarned.Count(); i++ )
|
|
{
|
|
if ( i > 0 )
|
|
{
|
|
Q_strncat( achievement_buffer, UTIL_VarArgs( " %d", -pMR->m_aAchievementsEarned[i] ), sizeof( achievement_buffer ), COPY_ALL_CHARACTERS );
|
|
}
|
|
else
|
|
{
|
|
Q_strncat( achievement_buffer, UTIL_VarArgs( "%d", -pMR->m_aAchievementsEarned[i] ), sizeof( achievement_buffer ), COPY_ALL_CHARACTERS );
|
|
}
|
|
}
|
|
Q_snprintf( pMR->m_MedalsAwarded.GetForModify(), 255, "%s", achievement_buffer );
|
|
|
|
// todo: some of these medals should only be awarded if all marines are alive by the end?
|
|
|
|
// award campaign completion medals?
|
|
if ( ASWGameRules()->IsCampaignGame() && ASWGameRules()->GetMissionSuccess() &&
|
|
ASWGameRules()->CampaignMissionsLeft() <= 1 ) // 1 mission left, because medals get awarded before the save is updated with the last mission complete
|
|
{
|
|
int iSkill = ASWGameRules()->GetLowestSkillLevelPlayed();
|
|
if ( ASWGameRules()->GetSkillLevel() < iSkill ) // check they didn't just complete the last mission on a low skill
|
|
iSkill = ASWGameRules()->GetSkillLevel();
|
|
|
|
if ( iSkill >= 2 && ASWGameRules()->GetCampaignSave() && ASWGameRules()->GetCampaignSave()->m_iNumDeaths <= 0 && ASWGameRules()->GetCampaignSave()->m_iInitialNumMissionsComplete == 0 )
|
|
{
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_CAMPAIGN_NO_DEATHS );
|
|
}
|
|
}
|
|
|
|
if ( ASWGameRules()->GetSkillLevel() >= 2 && ASWGameRules()->GetMissionSuccess() )
|
|
{
|
|
if ( m_bAllSurvived && pGameResource->GetNumMarines( NULL, true ) >= 4 )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_ALL_SURVIVE_A_MISSION, pMR );
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_MISSION_NO_DEATHS );
|
|
}
|
|
}
|
|
|
|
// Clear Firing - awarded for having no friendly fire incidents
|
|
if (pMR->m_fFriendlyFireDamageDealt <= 0 && ASWGameRules()->GetMissionSuccess() && pMR->m_iAliensKilled >= 25
|
|
&& pMR->m_iPlayerShotsFired >= 25 )
|
|
{
|
|
if (ASWGameResource() && ASWGameResource()->GetNumMarines(NULL) >= 4)
|
|
{
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_NO_FRIENDLY_FIRE );
|
|
AwardSingleMedalTo(MEDAL_CLEAR_FIRING, pMR);
|
|
}
|
|
}
|
|
|
|
// Shieldbug Assassin - awarded for killing a shieldbug
|
|
if (pMR->m_iShieldbugsKilled > 0)
|
|
AwardSingleMedalTo(MEDAL_SHIELDBUG_ASSASSIN, pMR);
|
|
|
|
// Explosives Merit - awarded for killing a number of aliens in one explosion
|
|
if (pMR->m_iSingleGrenadeKills >= asw_medal_explosive_kills.GetInt())
|
|
AwardSingleMedalTo(MEDAL_EXPLOSIVES_MERIT, pMR);
|
|
|
|
// Perfect - awarded for finishing a mission taking no damage
|
|
if ( !pMR->m_bHurt && pMR->m_iAliensKilled >= 25 && ASWGameRules()->GetSkillLevel() >= 2 && ASWGameRules()->GetMissionSuccess() )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_PERFECT, pMR );
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_NO_DAMAGE_TAKEN );
|
|
}
|
|
|
|
/////
|
|
// Old medals! To reinable you'll need to uncomment this code as well as adding them to the repeatable list, s_nRepeatableMedals!
|
|
/////
|
|
|
|
// Blood heart - awarded when a marine is wounded in a mission
|
|
/*if (pMR->m_bTakenWoundDamage)
|
|
AwardSingleMedalTo(MEDAL_BLOOD_HEART, pMR);*/
|
|
|
|
// Reckless Explosives Merit - awarded for kicking a grenade into an alien
|
|
/*if (pMR->m_iKickedGrenadeKills >= asw_medal_reckless_explosive_kills.GetInt())
|
|
AwardSingleMedalTo(MEDAL_RECKLESS_EXPLOSIVES_MERIT, pMR);*/
|
|
|
|
// Lifesaver - awarded for killing a bug that was close to a teammate
|
|
/*if (pMR->m_iSavedLife >= asw_medal_lifesaver_kills.GetInt())
|
|
AwardSingleMedalTo(MEDAL_LIFESAVER, pMR);*/
|
|
|
|
// Killing spree - awarded for killing x bugs in y seconds (i.e. doing the mad firing speech)
|
|
/*if (pMR->m_iMadFiring > 0)
|
|
AwardSingleMedalTo(MEDAL_KILLING_SPREE, pMR);*/
|
|
|
|
// Swarm Suppression - awarded for killing x bugs in y seconds with the autogun (i.e. doing the mad firing speech holding an autogun)
|
|
/*if (pMR->m_iMadFiringAutogun > 0)
|
|
AwardSingleMedalTo(MEDAL_SWARM_SUPPRESSION, pMR);*/
|
|
|
|
// mine medal awarded for killing X bugs with incendiary mines
|
|
/*if (pMR->m_iMineKills >= asw_medal_mine_burns.GetInt())
|
|
AwardSingleMedalTo(MEDAL_INCENDIARY_DEFENCE, pMR);*/
|
|
|
|
// sentry medal awarded for killing X bugs with a sentry gun
|
|
/*if (pMR->m_iSentryKills >= asw_medal_sentry_kills.GetInt())
|
|
AwardSingleMedalTo(MEDAL_STATIC_DEFENSE, pMR);*/
|
|
|
|
// awarded for putting out a number of fires
|
|
/*if (pMR->m_iFiresPutOut >= asw_medal_firefighter.GetInt() && ASWGameRules()->GetMissionSuccess())
|
|
AwardSingleMedalTo(MEDAL_FIREFIGHTER, pMR);*/
|
|
|
|
// awarded for killing aliens during the last stand time
|
|
/*if ( pMR->m_iLastStandKills >= asw_medal_last_stand_kills.GetInt() && pMR->GetHealthPercent() <= 0 )
|
|
AwardSingleMedalTo(MEDAL_LAST_STAND, pMR);*/
|
|
|
|
// awarded for hacking a door quickly
|
|
/*if ( pMR->m_iFastDoorHacks >= 3 )
|
|
AwardSingleMedalTo( MEDAL_ELECTRICAL_SYSTEMS_EXPERT, pMR ); */
|
|
|
|
// awarded for hacking a computer quickly
|
|
/*if ( pMR->m_iFastComputerHacks > 0 )
|
|
AwardSingleMedalTo( MEDAL_COMPUTER_SYSTEMS_EXPERT, pMR ); */
|
|
|
|
// grub medal awarded for killing all grubs on a map, at least X
|
|
//if (m_bAwardGrubMedal)
|
|
//{
|
|
// // check there's no unpopped grub sacs left
|
|
// CBaseEntity* pEntity = NULL;
|
|
// int iNumSacs = 0;
|
|
// while ((pEntity = gEntList.FindEntityByClassname( pEntity, "asw_grub_sac" )) != NULL)
|
|
// {
|
|
// iNumSacs++;
|
|
// }
|
|
// if (iNumSacs <= 0)
|
|
// {
|
|
// if (m_bAwardGrubMedal && pMR->m_iGrubKills > asw_medal_grub_kills.GetInt() && ASWGameRules()->GetMissionSuccess())
|
|
// AwardSingleMedalTo(MEDAL_BUGSTOMPER, pMR);
|
|
// }
|
|
//}
|
|
|
|
float accuracy = 0;
|
|
if ( pMR->m_iPlayerShotsFired > 0 )
|
|
{
|
|
accuracy = float(pMR->m_iPlayerShotsFired - pMR->m_iPlayerShotsMissed) / float(pMR->m_iPlayerShotsFired);
|
|
}
|
|
|
|
// Old medals!
|
|
|
|
// have we only fired 1 weapon type throughout the mission? award special medals if so
|
|
// requires some minimum number of kills, mission success, 90% accuracy and hard difficulty
|
|
//if (pMR->m_iOnlyWeaponEquipIndex >= 0 && ASWEquipmentList()
|
|
// && pMR->m_iAliensKilled >= 10 && ASWGameRules()->GetMissionSuccess()
|
|
// && accuracy >= 0.9f && ASWGameRules()->GetSkillLevel() >= 3)
|
|
//{
|
|
// if (!pMR->m_bOnlyWeaponExtra)
|
|
// {
|
|
// CASW_EquipItem *pItem = ASWEquipmentList()->GetRegular(pMR->m_iOnlyWeaponEquipIndex);
|
|
// if (pItem)
|
|
// {
|
|
// if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_rifle")
|
|
// || !Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_prifle"))
|
|
// AwardSingleMedalTo(MEDAL_IRON_DAGGER, pMR);
|
|
// else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_flamer"))
|
|
// AwardSingleMedalTo(MEDAL_PYROMANIAC, pMR);
|
|
// else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_shotgun"))
|
|
// AwardSingleMedalTo(MEDAL_HUNTER, pMR);
|
|
// //else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_railgun"))
|
|
// //AwardSingleMedalTo(MEDAL_HYBRID_WEAPONS_EXPERT, pMR);
|
|
// else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_pdw"))
|
|
// AwardSingleMedalTo(MEDAL_SMALL_ARMS_SPECIALIST, pMR);
|
|
// else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_autogun"))
|
|
// AwardSingleMedalTo(MEDAL_IRON_SWORD, pMR);
|
|
// else if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_vindicator"))
|
|
// AwardSingleMedalTo(MEDAL_IRON_HAMMER, pMR);
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// CASW_EquipItem *pItem = ASWEquipmentList()->GetExtra(pMR->m_iOnlyWeaponEquipIndex);
|
|
// if (pItem)
|
|
// {
|
|
// if (!Q_strcmp(STRING(pItem->m_EquipClass), "asw_weapon_pistol"))
|
|
// AwardSingleMedalTo(MEDAL_GUNFIGHTER, pMR);
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
// accuracy medal awarded for achieving X hits with shots fired from guns
|
|
if ( accuracy > asw_medal_accuracy.GetFloat() && pMR->m_iAliensKilled >= 10 && ASWGameRules()->GetMissionSuccess() )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SHARPSHOOTER, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_ACCURACY );
|
|
}
|
|
|
|
// halo medals, awarded for different amounts of healing alien damage from marines
|
|
bool bMedic = ( pMR->GetProfile() && pMR->GetProfile()->CanUseFirstAid() );
|
|
if ( bMedic )
|
|
{
|
|
// Old medals!
|
|
|
|
/*bool bAwardedSilverHalo = false;
|
|
if (pMR->m_iMedicHealing >= asw_medal_silver_heal_amount.GetInt())
|
|
{
|
|
bAwardedSilverHalo = AwardSingleMedalTo(MEDAL_SILVER_HALO, pMR);
|
|
}
|
|
if ( !bAwardedSilverHalo && pMR->m_iMedicHealing >= asw_medal_blood_heal_amount.GetInt() )
|
|
AwardSingleMedalTo(MEDAL_BLOOD_HALO, pMR);*/
|
|
|
|
// golden halo awarded for healing a marine so he survives Infestation
|
|
if ( pMR->m_iCuredInfestation > 0 )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_GOLDEN_HALO, pMR );
|
|
}
|
|
|
|
const int iAllMedicHealAmount = 300;
|
|
if ( pMR->m_iMedicHealing >= iAllMedicHealAmount && !pMR->m_bDealtNonMeleeDamage )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_BLOOD_HALO, pMR );
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_ALL_HEALING );
|
|
}
|
|
}
|
|
|
|
if ( ASWGameResource()->m_iStartingEggsInMap > 5 && ASWGameResource()->m_iEggsKilled >= ASWGameResource()->m_iStartingEggsInMap && ASWGameResource()->m_iEggsHatched <= 0 )
|
|
{
|
|
// No eggs hatched FTW!
|
|
AwardSingleMedalTo( MEDAL_PEST_CONTROL, pMR );
|
|
}
|
|
|
|
if ( pMR->m_bMeleeParasiteKill )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_EXTERMINATOR, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bProtectedTech )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_ELECTRICAL_SYSTEMS_EXPERT, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bDidFastReloadsInARow )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SMALL_ARMS_SPECIALIST, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bDamageAmpMedal )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_GUNFIGHTER, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bKilledBoomerEarly )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_BUGSTOMPER, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bStunGrenadeMedal )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_RECKLESS_EXPLOSIVES_MERIT, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bDodgedRanger )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_LIFESAVER, pMR);
|
|
}
|
|
|
|
if ( pMR->m_bFreezeGrenadeMedal )
|
|
{
|
|
AwardSingleMedalTo(MEDAL_HUNTER, pMR);
|
|
}
|
|
|
|
// awarded for kicking X aliens
|
|
if ( pMR->m_iAliensKicked >= asw_medal_melee_hits.GetInt() )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_IRON_FIST, pMR );
|
|
}
|
|
|
|
// awarded for killing X aliens with barrels
|
|
if ( pMR->m_iBarrelKills >= asw_medal_barrel_kills.GetInt() )
|
|
{
|
|
AwardSingleMedalTo( MEDAL_COLLATERAL_DAMAGE, pMR );
|
|
}
|
|
|
|
if ( ASWGameRules()->GetMissionSuccess() )
|
|
{
|
|
if ( m_bAllSurvived )
|
|
{
|
|
// speed runs
|
|
int iCompleteSeconds = gpGlobals->curtime - m_fStartMissionTime;
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("Mission complete, took %d seconds\n", iCompleteSeconds);
|
|
|
|
const char *mapName = STRING(gpGlobals->mapname);
|
|
if (asw_debug_medals.GetBool())
|
|
Msg("Medal checking mapname: %s\n", mapName);
|
|
|
|
int speedrun_time = 240;
|
|
if ( GetWorldEntity() && ASWGameRules()->GetSpeedrunTime() > 0 )
|
|
{
|
|
speedrun_time = ASWGameRules()->GetSpeedrunTime();
|
|
}
|
|
|
|
if ( !Q_stricmp( mapName, "ASI-Jac1-LandingBay_01" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_LANDING_BAY, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_LANDING_BAY );
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac1-LandingBay_02" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_DESCENT, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_DESCENT );
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac2-Deima" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_OUTSIDE, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_DEIMA );
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac3-Rydberg" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_PLANT, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_RYDBERG );
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac4-Residential" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_OFFICE, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_RESIDENTIAL );
|
|
}
|
|
/*else if ( !Q_stricmp( mapName, "ASI-Jac5-BioResearch" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_LABS, pMR);
|
|
}*/
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac6-SewerJunction" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_SEWERS, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_SEWER );
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac7-TimorStation" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_MINE, pMR);
|
|
pPlayer->AwardAchievement( ACHIEVEMENT_ASW_SPEEDRUN_TIMOR );
|
|
}
|
|
/*else if ( !Q_stricmp( mapName, "ASI-Jac8-LastRites" ) && iCompleteSeconds <= speedrun_time)
|
|
{
|
|
AwardSingleMedalTo(MEDAL_SPEED_RUN_QUEEN_LAIR, pMR);
|
|
}*/
|
|
}
|
|
|
|
// Old medals
|
|
|
|
// outstanding execution - requires insane difficulty
|
|
/*if (ASWGameRules()->IsCampaignGame() && ASWGameRules()->GetCampaignSave()
|
|
&& ASWGameRules()->GetSkillLevel() >= 4)
|
|
{
|
|
if (ASWGameRules()->GetCampaignSave()->GetRetries() <= 1)
|
|
{
|
|
if ( !Q_stricmp( mapName, "ASI-Jac1-LandingBay" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_LANDING_BAY, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac2-Deima" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_OUTSIDE, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac3-Rydberg" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_PLANT, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac4-Residential" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_OFFICE, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac5-BioResearch" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_LABS, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac6-SewerJunction" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_SEWERS, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac7-TimorStation" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_MINE, pMR);
|
|
}
|
|
else if ( !Q_stricmp( mapName, "ASI-Jac8-LastRites" ))
|
|
{
|
|
AwardSingleMedalTo(MEDAL_OUTSTANDING_EXECUTION_QUEEN_LAIR, pMR);
|
|
}
|
|
}
|
|
}*/
|
|
}
|
|
|
|
//DebugMedals(pMR);
|
|
}
|
|
|
|
bool CASW_Medals::AwardSingleMedalTo(int iMedal, CASW_Marine_Resource *pMR)
|
|
{
|
|
if (iMedal <= 0 || iMedal >= LAST_MEDAL)
|
|
return false;
|
|
|
|
// most medals have been replaced with achievements. Only support a subset of repeatable ones.
|
|
bool bSupported = false;
|
|
for ( int i = 0; i < NELEMS( s_nRepeatableMedals ); i++ )
|
|
{
|
|
if ( s_nRepeatableMedals[ i ] == iMedal )
|
|
{
|
|
bSupported = true;
|
|
break;
|
|
}
|
|
}
|
|
if ( !bSupported )
|
|
return false;
|
|
|
|
// check he doesn't have it already
|
|
if (HasMedal(iMedal, pMR))
|
|
return false;
|
|
|
|
// add the new medal to the end of the current medals this marine has been awarded
|
|
char buffer[255];
|
|
if (Q_strlen(pMR->m_MedalsAwarded.Get()) <= 0)
|
|
{
|
|
Q_snprintf(buffer, sizeof(buffer), "%d", iMedal);
|
|
}
|
|
else
|
|
Q_snprintf(buffer, sizeof(buffer), "%s %d", pMR->m_MedalsAwarded.Get(), iMedal);
|
|
|
|
// copy new string into the marine info
|
|
Q_snprintf(pMR->m_MedalsAwarded.GetForModify(), 255, "%s", buffer);
|
|
//Msg("Awarding medal, setting medal string to:%s\n", buffer);
|
|
|
|
// update char array of medal used for uploading stats
|
|
pMR->m_CharMedals.AddToTail(iMedal);
|
|
|
|
return true;
|
|
}
|
|
|
|
void CASW_Medals::DebugMedals(CASW_Marine_Resource *pMR)
|
|
{
|
|
const char *p = pMR->m_MedalsAwarded.Get();
|
|
char token[128];
|
|
|
|
p = nexttoken( token, p, ' ' );
|
|
|
|
Msg("Marine %s has medals (p=%s token=%s):\n", pMR->GetProfile()->m_ShortName,
|
|
p, token);
|
|
// list all the medals
|
|
while ( Q_strlen( token ) > 0 )
|
|
{
|
|
int iHasMedal = atoi(token);
|
|
Msg("%d ", iHasMedal);
|
|
if (p)
|
|
p = nexttoken( token, p, ' ' );
|
|
else
|
|
token[0] = '\0';
|
|
}
|
|
Msg("\n");
|
|
}
|
|
|
|
bool CASW_Medals::HasMedal(int iMedal, CASW_Marine_Resource *pMR, bool bOnlyThisMission)
|
|
{
|
|
if (!pMR)
|
|
return false;
|
|
|
|
// check in the medals awarded so far this mission
|
|
const char *p = pMR->m_MedalsAwarded.Get();
|
|
char token[128];
|
|
|
|
p = nexttoken( token, p, ' ' );
|
|
//p = nexttoken( token, p, ' ' );
|
|
|
|
while ( Q_strlen( token ) > 0 )
|
|
{
|
|
int iHasMedal = atoi(token);
|
|
if (iHasMedal == iMedal)
|
|
{
|
|
//Msg("Marine already has medal %d, so can't award it\n", iMedal);
|
|
return true;
|
|
}
|
|
if ( iHasMedal < 0 && MedalMatchesAchievement( iMedal, -iHasMedal ) )
|
|
return true;
|
|
if (p)
|
|
p = nexttoken( token, p, ' ' );
|
|
else
|
|
token[0] = '\0';
|
|
}
|
|
|
|
if (bOnlyThisMission)
|
|
return false;
|
|
|
|
// check in the medals awarded in previous missions
|
|
#ifdef USE_MEDAL_STORE
|
|
if (ASWGameRules()->IsCampaignGame())
|
|
{
|
|
CASW_Campaign_Save* pSave = ASWGameRules()->GetCampaignSave();
|
|
int iProfileIndex = pMR->GetProfileIndex();
|
|
if (pSave && iProfileIndex >=0 && iProfileIndex <ASW_NUM_MARINE_PROFILES)
|
|
{
|
|
p = STRING(pSave->m_Medals[iProfileIndex]);
|
|
p = nexttoken( token, p, ' ' );
|
|
//p = nexttoken( token, p, ' ' );
|
|
|
|
while ( Q_strlen( token ) > 0 )
|
|
{
|
|
int iHasMedal = atoi(token);
|
|
if (iHasMedal == iMedal)
|
|
{
|
|
Msg("Marine already has medal %d, so can't award it\n", iMedal);
|
|
return true;
|
|
}
|
|
if (p)
|
|
p = nexttoken( token, p, ' ' );
|
|
else
|
|
token[0] = '\0';
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
//Msg("Marine doesn't have medal %d, so awarding it\n", iMedal);
|
|
return false;
|
|
}
|
|
|
|
void CASW_Medals::AddMedalsToCampaignSave(CASW_Campaign_Save *pSave)
|
|
{
|
|
if ( !ASWGameResource() )
|
|
return;
|
|
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
// go through each marine
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (!pMR)
|
|
continue;
|
|
|
|
int iProfileIndex = pMR->GetProfileIndex();
|
|
if (iProfileIndex < 0 || iProfileIndex >= ASW_NUM_MARINE_PROFILES)
|
|
continue;
|
|
|
|
if (Q_strlen(pMR->m_MedalsAwarded.Get()) <= 0)
|
|
continue;
|
|
|
|
// add the new medal to the end of the current medals this marine has been awarded
|
|
char buffer[255];
|
|
if (Q_strlen(STRING(pSave->m_Medals[iProfileIndex])) <= 0)
|
|
Q_snprintf(buffer, sizeof(buffer), "%s", pMR->m_MedalsAwarded.Get());
|
|
else
|
|
Q_snprintf(buffer, sizeof(buffer), "%s %s", STRING(pSave->m_Medals[iProfileIndex]), pMR->m_MedalsAwarded.Get());
|
|
|
|
// copy new string into the campaign save
|
|
pSave->m_Medals.Set(iProfileIndex, AllocPooledString(buffer));
|
|
//Q_snprintf(pMR->m_MedalsAwarded.GetForModify(), 255, "%s", buffer);
|
|
Msg("[p%d] Added medals to campaign save:%s\n", iProfileIndex, buffer);
|
|
|
|
// clear the medals our the marine info now
|
|
pMR->m_MedalsAwarded.GetForModify()[0] = '\0';
|
|
}
|
|
}
|
|
|
|
// ================ Player Medals =======================
|
|
|
|
void CASW_Medals::AwardPlayerMedalsTo(CASW_Player *pPlayer)
|
|
{
|
|
if (!pPlayer || !ASWGameRules())
|
|
return;
|
|
CASW_Game_Resource *pGameResource = ASWGameResource();
|
|
if (!pGameResource)
|
|
return;
|
|
|
|
// don't award player medals to spectators
|
|
if (pGameResource->GetNumMarines(pPlayer) <= 0)
|
|
return;
|
|
|
|
//DebugMedals(pPlayer);
|
|
//Msg("Awarding medals to player %d\n", pPlayer->entindex());
|
|
|
|
// give him some random medals
|
|
//int iNumMedals = random->RandomInt(5, 5);
|
|
//for (int i=0;i<iNumMedals;i++)
|
|
//{
|
|
//AwardSinglePlayerMedalTo(random->RandomInt(MEDAL_BLOOD_HEART, MEDAL_OUTSTANDING_EXECUTION_QUEEN_LAIR), pPlayer);
|
|
//}
|
|
|
|
// Old medals!
|
|
|
|
//if (ASWGameRules()->GetMissionSuccess())
|
|
//{
|
|
// //char mapName[255];
|
|
// //Q_FileBase( engine->GetLevelName(), mapName, sizeof(mapName) );
|
|
// const char *mapName = STRING(gpGlobals->mapname);
|
|
//
|
|
// if ( !Q_strncmp( mapName, "tutorial", 8 ) )
|
|
// {
|
|
// AwardSinglePlayerMedalTo(MEDAL_IAF_TRAINING, pPlayer);
|
|
// }
|
|
|
|
// // check for X missions medals
|
|
// if (ASWGameRules()->GetSkillLevel() >= 2) // minimum normal difficulty
|
|
// {
|
|
// int iOldMissions = pPlayer->m_iClientMissionsCompleted;
|
|
// if (iOldMissions == ASW_MISSIONS_MEDAL_1 -1)
|
|
// {
|
|
// AwardSinglePlayerMedalTo(MEDAL_IAF_COMBAT_HONORS, pPlayer);
|
|
// }
|
|
// if (iOldMissions == ASW_MISSIONS_MEDAL_2 - 1)
|
|
// {
|
|
// AwardSinglePlayerMedalTo(MEDAL_IAF_BATTLE_HONORS, pPlayer);
|
|
// }
|
|
|
|
// // if this is the last mission in the campaign, check if any players are 1 campaign away from a campaign medal
|
|
// if (ASWGameRules()->IsCampaignGame() && ASWGameRules()->CampaignMissionsLeft() == 1)
|
|
// {
|
|
// int iOldCampaigns = pPlayer->m_iClientCampaignsCompleted;
|
|
// if (iOldCampaigns == ASW_CAMPAIGNS_MEDAL_1 - 1)
|
|
// {
|
|
// AwardSinglePlayerMedalTo(MEDAL_IAF_CAMPAIGN_HONORS, pPlayer);
|
|
// }
|
|
// if (iOldCampaigns == ASW_CAMPAIGNS_MEDAL_2 - 1)
|
|
// {
|
|
// AwardSinglePlayerMedalTo(MEDAL_IAF_WARTIME_SERVICE, pPlayer);
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
// check for X kills medals
|
|
/*int iOldKills = pPlayer->m_iClientKills;
|
|
int iNewKills = iOldKills;
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
CASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR && pMR->GetCommander() == pPlayer)
|
|
iNewKills += pMR->m_iAliensKilled;
|
|
}
|
|
if (iOldKills < ASW_KILLS_MEDAL_1 && iNewKills >= ASW_KILLS_MEDAL_1)
|
|
{
|
|
AwardSinglePlayerMedalTo(MEDAL_PROFESSIONAL, pPlayer);
|
|
}
|
|
if (iOldKills < ASW_KILLS_MEDAL_2 && iNewKills >= ASW_KILLS_MEDAL_2)
|
|
{
|
|
AwardSinglePlayerMedalTo(MEDAL_NEMESIS, pPlayer);
|
|
}
|
|
if (iOldKills < ASW_KILLS_MEDAL_3 && iNewKills >= ASW_KILLS_MEDAL_3)
|
|
{
|
|
AwardSinglePlayerMedalTo(MEDAL_RETRIBUTION, pPlayer);
|
|
}
|
|
if (iOldKills < ASW_KILLS_MEDAL_4 && iNewKills >= ASW_KILLS_MEDAL_4)
|
|
{
|
|
AwardSinglePlayerMedalTo(MEDAL_IAF_HERO, pPlayer);
|
|
}*/
|
|
|
|
//DebugMedals(pPlayer);
|
|
}
|
|
|
|
bool CASW_Medals::AwardSinglePlayerMedalTo(int iMedal, CASW_Player *pPlayer)
|
|
{
|
|
if (iMedal <= 0 || iMedal >= LAST_MEDAL)
|
|
return false;
|
|
|
|
// most medals have been replaced with achievements. Only support a subset of repeatable ones.
|
|
bool bSupported = false;
|
|
for ( int i = 0; i < NELEMS( s_nRepeatableMedals ); i++ )
|
|
{
|
|
if ( s_nRepeatableMedals[ i ] == iMedal )
|
|
{
|
|
bSupported = true;
|
|
break;
|
|
}
|
|
}
|
|
if ( !bSupported )
|
|
return false;
|
|
|
|
// check he doesn't have it already
|
|
if (HasPlayerMedal(iMedal, pPlayer))
|
|
return false;
|
|
|
|
if ( !ASWGameResource() )
|
|
return false;
|
|
|
|
int iPlayerIndex = pPlayer->entindex() - 1;
|
|
if (iPlayerIndex < 0 || iPlayerIndex >= ASW_MAX_READY_PLAYERS)
|
|
return false;
|
|
|
|
// add the new medal to the end of the current medals this marine has been awarded
|
|
char buffer[255];
|
|
if (Q_strlen(STRING(ASWGameResource()->m_iszPlayerMedals[iPlayerIndex])) <= 0)
|
|
{
|
|
Q_snprintf(buffer, sizeof(buffer), "%d", iMedal);
|
|
}
|
|
else
|
|
Q_snprintf(buffer, sizeof(buffer), "%s %d", STRING(ASWGameResource()->m_iszPlayerMedals[iPlayerIndex]), iMedal);
|
|
|
|
// copy new string into the game resource
|
|
ASWGameResource()->m_iszPlayerMedals.Set(iPlayerIndex, AllocPooledString(buffer));
|
|
//Msg("Awarding player medal, setting medal string to:%s\n", buffer);
|
|
|
|
// update char array of medal used for uploading stats
|
|
pPlayer->m_CharMedals.AddToTail(iMedal);
|
|
|
|
return true;
|
|
}
|
|
|
|
void CASW_Medals::DebugMedals(CASW_Player *pPlayer)
|
|
{
|
|
int iPlayerIndex = pPlayer->entindex() - 1;
|
|
if (iPlayerIndex < 0 || iPlayerIndex >= ASW_MAX_READY_PLAYERS)
|
|
return;
|
|
|
|
const char *p = STRING(ASWGameResource()->m_iszPlayerMedals[iPlayerIndex]);
|
|
char token[128];
|
|
|
|
p = nexttoken( token, p, ' ' );
|
|
//p = nexttoken( token, p, ' ' );
|
|
|
|
Msg("Player %d has medals (p=%s token=%s):\n", iPlayerIndex,
|
|
p, token);
|
|
// list all the medals
|
|
while ( Q_strlen( token ) > 0 )
|
|
{
|
|
int iHasMedal = atoi(token);
|
|
Msg("%d ", iHasMedal);
|
|
if (p)
|
|
p = nexttoken( token, p, ' ' );
|
|
else
|
|
token[0] = '\0';
|
|
}
|
|
Msg("\n");
|
|
}
|
|
|
|
bool CASW_Medals::HasPlayerMedal(int iMedal, CASW_Player *pPlayer)
|
|
{
|
|
if (!pPlayer)
|
|
return false;
|
|
|
|
int iPlayerIndex = pPlayer->entindex() - 1;
|
|
if (iPlayerIndex < 0 || iPlayerIndex >= ASW_MAX_READY_PLAYERS)
|
|
return false;
|
|
|
|
// check in the medals awarded so far this mission
|
|
const char *p = STRING(ASWGameResource()->m_iszPlayerMedals[iPlayerIndex]);
|
|
char token[128];
|
|
|
|
p = nexttoken( token, p, ' ' );
|
|
//p = nexttoken( token, p, ' ' );
|
|
|
|
while ( Q_strlen( token ) > 0 )
|
|
{
|
|
int iHasMedal = atoi(token);
|
|
if (iHasMedal == iMedal)
|
|
{
|
|
Msg("Player already has medal %d, so can't award it\n", iMedal);
|
|
return true;
|
|
}
|
|
if (p)
|
|
p = nexttoken( token, p, ' ' );
|
|
else
|
|
token[0] = '\0';
|
|
}
|
|
|
|
Msg("Player doesn't have medal %d, so awarding it\n", iMedal);
|
|
return false;
|
|
} |