Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

179 lines
4.5 KiB

#include "cbase.h"
#include <KeyValues.h>
#include <filesystem.h>
#include "asw_map_scores.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CASW_Map_Scores* g_pMapScores = NULL;
CASW_Map_Scores* MapScores()
{
if (!g_pMapScores)
{
g_pMapScores = new CASW_Map_Scores();
}
return g_pMapScores;
}
CASW_Map_Scores::CASW_Map_Scores()
{
m_pScoreKeyValues = NULL;
LoadMapScores();
}
void CASW_Map_Scores::LoadMapScores()
{
if (m_pScoreKeyValues)
{
Msg("Error: Attempted to load CASW_Map_Scores twice\n");
return;
}
m_pScoreKeyValues = new KeyValues( "MAPSCORES" );
if ( !m_pScoreKeyValues->LoadFromFile( filesystem, "cfg/mapscores.dat" ) )
{
Msg("couldn't fine any, keyvalues is empty!\n");
// if we get here, it means the player has no mapscores.dat file and therefore no scores
// (but that's fine)
return;
}
}
bool CASW_Map_Scores::SaveMapScores()
{
if (!m_pScoreKeyValues)
{
Msg("Error: Attempted to save CASW_Map_Scores without loading first\n");
}
return (m_pScoreKeyValues->SaveToFile(filesystem, "cfg/mapscores.dat"));
}
// adds an entry for a particular map
void CASW_Map_Scores::OnMapCompleted(const char *szMapName, int iSkill, float fTime, int iKills, int iUnlockMode)
{
if (!m_pScoreKeyValues)
{
Msg("Error: Attempted to save map stats without creating keyvalues\n");
return;
}
// see if we have a subkey for this map
KeyValues *pkvMap = GetSubkeyForMap(szMapName);
if (!pkvMap)
{
// create one
pkvMap = new KeyValues("MAPENTRY");
m_pScoreKeyValues->AddSubKey(pkvMap);
}
// grab the current map data
float fBestTime = pkvMap->GetFloat(GetBestTimeKeyName(iSkill));
int iBestKills = pkvMap->GetInt(GetBestKillsKeyName(iSkill));
int iVariations = pkvMap->GetInt(GetVariationsKeyName(iSkill));
// update it if we did better
fBestTime = MIN(fBestTime, fTime);
if (fBestTime <= 0)
fBestTime = fTime;
iBestKills = MAX(iBestKills, iKills);
iVariations |= iUnlockMode;
// set properties of the subkey
pkvMap->SetString("MapName", szMapName);
pkvMap->SetFloat(GetBestTimeKeyName(iSkill), fBestTime);
pkvMap->SetInt(GetBestKillsKeyName(iSkill), iBestKills);
pkvMap->SetInt(GetVariationsKeyName(iSkill), iVariations);
// save new entry
SaveMapScores();
}
// reports previously entered data
bool CASW_Map_Scores::IsModeUnlocked(const char *szMapName, int iSkill, int iGameMode)
{
KeyValues *pkvMap = GetSubkeyForMap(szMapName);
if (!pkvMap)
return false;
//Msg("CASW_Map_Scores::IsModeUnlocked %s skill=%d gamemode=%d\n", szMapName, iSkill, iGameMode);
//Msg(" keyname=%s int=%d result=%d\n", GetVariationsKeyName(iSkill), pkvMap->GetInt(GetVariationsKeyName(iSkill)),
//(pkvMap->GetInt(GetVariationsKeyName(iSkill)) & iGameMode));
return (pkvMap->GetInt(GetVariationsKeyName(iSkill)) & iGameMode) != 0;
}
float CASW_Map_Scores::GetBestTime(const char *szMapName, int iSkill)
{
KeyValues *pkvMap = GetSubkeyForMap(szMapName);
if (!pkvMap)
return 0;
return pkvMap->GetFloat(GetBestTimeKeyName(iSkill));
}
int CASW_Map_Scores::GetBestKills(const char *szMapName, int iSkill)
{
KeyValues *pkvMap = GetSubkeyForMap(szMapName);
if (!pkvMap)
return 0;
return pkvMap->GetInt(GetBestKillsKeyName(iSkill));
}
KeyValues* CASW_Map_Scores::GetSubkeyForMap(const char *szMapName)
{
// now go through each mission section, adding it
KeyValues *pkvMap = m_pScoreKeyValues->GetFirstSubKey();
while ( pkvMap )
{
if (Q_stricmp(pkvMap->GetName(), "MAPENTRY")==0)
{
const char *szName = pkvMap->GetString("MapName");
if (!Q_stricmp(szName, szMapName))
return pkvMap;
}
pkvMap = pkvMap->GetNextKey();
}
return NULL;
}
const char* CASW_Map_Scores::GetBestKillsKeyName(int iSkill)
{
switch (iSkill)
{
case 1: return "BestKillsEasy"; break;
case 3: return "BestKillsHard"; break;
case 4: return "BestKillsInsane"; break;
case 5: return "BestKillsImba"; break;
default: break;
}
return "BestKillsNormal";
}
const char* CASW_Map_Scores::GetBestTimeKeyName(int iSkill)
{
switch (iSkill)
{
case 1: return "BestTimeEasy"; break;
case 3: return "BestTimeHard"; break;
case 4: return "BestTimeInsane"; break;
case 5: return "BestTimeImba"; break;
default: break;
}
return "BestTimeNormal";
}
// variations aren't remembered per difficulty
const char* CASW_Map_Scores::GetVariationsKeyName(int iSkill)
{
return "VariationsUnlocked";
/*
switch (iSkill)
{
case 1: return "VariationsUnlockedEasy"; break;
case 3: return "VariationsUnlockedHard"; break;
case 4: return "VariationsUnlockedInsane"; break;
default: break;
}
return "VariationsUnlockedNormal";*/
}