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.
671 lines
17 KiB
671 lines
17 KiB
1 year ago
|
#include "asw_location_grid.h"
|
||
|
#include "KeyValues.h"
|
||
|
#include "filesystem.h"
|
||
|
#include "asw_mission_chooser.h"
|
||
|
#include "asw_key_values_database.h"
|
||
|
#include "ConVar.h"
|
||
|
#include "utlbuffer.h"
|
||
|
#include "layout_system/tilegen_mission_preprocessor.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
ConVar asw_location_grid_debug( "asw_location_grid_debug", "0", FCVAR_NONE, "Outputs mission grid hexes for server and client" );
|
||
|
ConVar asw_unlock_all_locations( "asw_unlock_all_locations", "0", FCVAR_CHEAT, "Unlocks all mission hexes" );
|
||
|
|
||
|
char* TileGenCopyString( const char *szString );
|
||
|
|
||
|
CASW_Location_Grid::CASW_Location_Grid()
|
||
|
{
|
||
|
m_pMissionDatabase = new CASW_KeyValuesDatabase();
|
||
|
m_pMissionDatabase->LoadFiles( "tilegen/new_missions/" );
|
||
|
|
||
|
// Preprocess all of the new missions.
|
||
|
|
||
|
// Load the rules.
|
||
|
CASW_KeyValuesDatabase *pRulesDatabase = new CASW_KeyValuesDatabase();
|
||
|
pRulesDatabase->LoadFiles( "tilegen/rules/" );
|
||
|
|
||
|
// Create a mission preprocessor from the rules.
|
||
|
m_pPreprocessor = new CTilegenMissionPreprocessor();
|
||
|
for ( int i = 0; i < pRulesDatabase->GetFileCount(); ++ i )
|
||
|
{
|
||
|
m_pPreprocessor->ParseAndStripRules( pRulesDatabase->GetFile( i ) );
|
||
|
}
|
||
|
delete pRulesDatabase;
|
||
|
|
||
|
// Preprocess the missions in-memory.
|
||
|
for ( int i = 0; i < m_pMissionDatabase->GetFileCount(); ++ i )
|
||
|
{
|
||
|
KeyValues *pOriginalMission = m_pMissionDatabase->GetFile( i );
|
||
|
if ( !m_pPreprocessor->SubstituteRules( pOriginalMission ) )
|
||
|
{
|
||
|
Warning( "Error pre-processing mission '%s'.\n", m_pMissionDatabase->GetFilename( i ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LoadLocationGrid();
|
||
|
}
|
||
|
|
||
|
CASW_Location_Grid::~CASW_Location_Grid()
|
||
|
{
|
||
|
m_Groups.PurgeAndDeleteElements();
|
||
|
delete m_pMissionDatabase;
|
||
|
delete m_pPreprocessor;
|
||
|
}
|
||
|
|
||
|
bool CASW_Location_Grid::LoadLocationGrid()
|
||
|
{
|
||
|
m_Groups.PurgeAndDeleteElements();
|
||
|
|
||
|
// open our mission grid file
|
||
|
KeyValues *pGridKeys = new KeyValues( "MissionGrid" );
|
||
|
if ( !pGridKeys->LoadFromFile( g_pFullFileSystem, "resource/mission_grid.txt", "GAME" ) )
|
||
|
{
|
||
|
Msg( "Failed to load resource/mission_grid.txt\n" );
|
||
|
pGridKeys->deleteThis();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
KeyValues *pKeys = pGridKeys;
|
||
|
while ( pKeys )
|
||
|
{
|
||
|
if ( !Q_stricmp( pKeys->GetName(), "Group" ) )
|
||
|
{
|
||
|
CASW_Location_Group *pGroup = new CASW_Location_Group( this );
|
||
|
pGroup->LoadFromKeyValues( pKeys );
|
||
|
m_Groups.AddToTail( pGroup );
|
||
|
}
|
||
|
pKeys = pKeys->GetNextKey();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CASW_Location_Grid::SaveLocationGrid()
|
||
|
{
|
||
|
const char *filename = "resource/mission_grid.txt";
|
||
|
|
||
|
CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER );
|
||
|
for ( int i = 0; i < m_Groups.Count(); i++ )
|
||
|
{
|
||
|
KeyValues *pKey = m_Groups[i]->GetKeyValuesForEditor();
|
||
|
pKey->RecursiveSaveToFile( buf, 0 );
|
||
|
pKey->deleteThis();
|
||
|
}
|
||
|
if ( !g_pFullFileSystem->WriteFile( filename, "GAME", buf ) )
|
||
|
{
|
||
|
Warning( "Failed to SaveLocationGrid %s\n", filename );
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
IASW_Location_Group* CASW_Location_Grid::GetGroup( int iIndex )
|
||
|
{
|
||
|
if ( iIndex < 0 || iIndex >= m_Groups.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_Groups[iIndex];
|
||
|
}
|
||
|
|
||
|
CASW_Location_Group* CASW_Location_Grid::GetCGroup( int iIndex )
|
||
|
{
|
||
|
if ( iIndex < 0 || iIndex >= m_Groups.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_Groups[iIndex];
|
||
|
}
|
||
|
|
||
|
CASW_Location_Group* CASW_Location_Grid::GetGroupByName( const char *szName )
|
||
|
{
|
||
|
int nGroups = m_Groups.Count();
|
||
|
for ( int i = 0; i < nGroups; i++ )
|
||
|
{
|
||
|
if ( !Q_stricmp( m_Groups[i]->m_szGroupName, szName ) )
|
||
|
return m_Groups[i];
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
IASW_Location* CASW_Location_Grid::GetLocationByID( int iLocationID )
|
||
|
{
|
||
|
for ( int i = 0; i < m_Groups.Count(); i++ )
|
||
|
{
|
||
|
for ( int k = 0; k < m_Groups[i]->GetNumLocations(); k++ )
|
||
|
{
|
||
|
if ( m_Groups[i]->m_Locations[k]->m_iLocationID == iLocationID )
|
||
|
{
|
||
|
return m_Groups[i]->m_Locations[k];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void CASW_Location_Grid::SetLocationComplete( int iLocationID )
|
||
|
{
|
||
|
for ( int i = 0; i < m_Groups.Count(); i++ )
|
||
|
{
|
||
|
for ( int k = 0; k < m_Groups[i]->GetNumLocations(); k++ )
|
||
|
{
|
||
|
if ( m_Groups[i]->m_Locations[k]->m_iLocationID == iLocationID )
|
||
|
{
|
||
|
m_Groups[i]->m_Locations[k]->m_bCompleted = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CASW_Location_Grid::GetFreeLocationID()
|
||
|
{
|
||
|
int iHighestID = 0;
|
||
|
for ( int i = 0; i < m_Groups.Count(); i++ )
|
||
|
{
|
||
|
for ( int k = 0; k < m_Groups[i]->GetNumLocations(); k++ )
|
||
|
{
|
||
|
if ( m_Groups[i]->m_Locations[k]->m_iLocationID > iHighestID )
|
||
|
{
|
||
|
iHighestID = m_Groups[i]->m_Locations[k]->m_iLocationID;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ++iHighestID;
|
||
|
}
|
||
|
|
||
|
KeyValues *CASW_Location_Grid::GetMissionData( const char *pMissionName )
|
||
|
{
|
||
|
return m_pMissionDatabase->GetFileByName( pMissionName );
|
||
|
}
|
||
|
|
||
|
// delete a group and all locations in it
|
||
|
void CASW_Location_Grid::DeleteGroup( int iIndex )
|
||
|
{
|
||
|
m_Groups.Remove( iIndex );
|
||
|
}
|
||
|
|
||
|
void CASW_Location_Grid::CreateNewGroup()
|
||
|
{
|
||
|
CASW_Location_Group *pGroup = new CASW_Location_Group( this );
|
||
|
m_Groups.AddToTail( pGroup );
|
||
|
}
|
||
|
|
||
|
|
||
|
//======================================================================================
|
||
|
// Reward
|
||
|
//======================================================================================
|
||
|
CASW_Reward::CASW_Reward()
|
||
|
{
|
||
|
m_RewardType = ASW_REWARD_MONEY;
|
||
|
m_iRewardAmount = 0;
|
||
|
m_szRewardName = NULL;
|
||
|
m_iRewardLevel = 1;
|
||
|
m_iRewardQuality = 0;
|
||
|
}
|
||
|
|
||
|
CASW_Reward::~CASW_Reward()
|
||
|
{
|
||
|
delete m_szRewardName;
|
||
|
}
|
||
|
|
||
|
bool CASW_Reward::LoadFromKeyValues( KeyValues *pKeys, int iMissionDifficulty )
|
||
|
{
|
||
|
if ( !Q_stricmp( pKeys->GetName(), "MoneyReward") )
|
||
|
{
|
||
|
m_RewardType = ASW_REWARD_MONEY;
|
||
|
m_iRewardAmount = pKeys->GetInt();
|
||
|
return true;
|
||
|
}
|
||
|
else if ( !Q_stricmp( pKeys->GetName(), "XPReward") )
|
||
|
{
|
||
|
m_RewardType = ASW_REWARD_XP;
|
||
|
//TODO: this was the previous average of how much XP you got with the Tier system per objective.
|
||
|
// we probably want a more robust system for determining the amount of XP we want to reward on the mission
|
||
|
m_iRewardAmount = pKeys->GetInt( NULL, 400 * iMissionDifficulty );
|
||
|
if ( m_iRewardAmount == 0 )
|
||
|
{
|
||
|
m_iRewardAmount = 400 * iMissionDifficulty;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
else if ( !Q_stricmp( pKeys->GetName(), "ItemReward") )
|
||
|
{
|
||
|
m_RewardType = ASW_REWARD_ITEM;
|
||
|
m_iRewardAmount = 0;
|
||
|
m_szRewardName = TileGenCopyString( pKeys->GetString( "ItemName" ) );
|
||
|
m_iRewardLevel = pKeys->GetInt( "ItemLevel" );
|
||
|
m_iRewardQuality = pKeys->GetInt( "ItemQuality" );
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Reward::GetKeyValuesForEditor()
|
||
|
{
|
||
|
switch( m_RewardType )
|
||
|
{
|
||
|
case ASW_REWARD_MONEY:
|
||
|
{
|
||
|
KeyValues *pReward = new KeyValues( "MoneyReward");
|
||
|
pReward->SetInt( NULL, m_iRewardAmount );
|
||
|
return pReward;
|
||
|
}
|
||
|
case ASW_REWARD_XP:
|
||
|
{
|
||
|
KeyValues *pReward = new KeyValues( "XPReward");
|
||
|
pReward->SetInt( NULL, m_iRewardAmount );
|
||
|
return pReward;
|
||
|
}
|
||
|
case ASW_REWARD_ITEM:
|
||
|
{
|
||
|
KeyValues *pReward = new KeyValues( "ItemReward");
|
||
|
pReward->SetString( "ItemName", m_szRewardName );
|
||
|
pReward->SetInt( "ItemLevel", m_iRewardLevel );
|
||
|
pReward->SetInt( "ItemQuality", m_iRewardQuality );
|
||
|
return pReward;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//======================================================================================
|
||
|
// Group
|
||
|
//======================================================================================
|
||
|
CASW_Location_Group::CASW_Location_Group( CASW_Location_Grid *pLocationGrid ) :
|
||
|
m_pLocationGrid( pLocationGrid )
|
||
|
{
|
||
|
m_szGroupName = NULL;
|
||
|
m_szTitleText = NULL;
|
||
|
m_szDescriptionText = NULL;
|
||
|
m_szImageName = NULL;
|
||
|
m_iRequiredUnlocks = 0;
|
||
|
m_Color = Color( 128, 128, 128, 128 );
|
||
|
m_Locations.PurgeAndDeleteElements();
|
||
|
m_Random.SetSeed( 0 );
|
||
|
}
|
||
|
|
||
|
CASW_Location_Group::~CASW_Location_Group()
|
||
|
{
|
||
|
m_Locations.PurgeAndDeleteElements();
|
||
|
delete m_szGroupName;
|
||
|
delete m_szTitleText;
|
||
|
delete m_szDescriptionText;
|
||
|
delete m_szImageName;
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Location_Group::GetKeyValuesForEditor()
|
||
|
{
|
||
|
char buffer[64];
|
||
|
KeyValues *pKeys = new KeyValues( "Group" );
|
||
|
pKeys->SetInt( "RequiredUnlocks", m_iRequiredUnlocks );
|
||
|
Q_snprintf( buffer, sizeof( buffer ), "%d %d %d %d", m_Color.r(), m_Color.g(), m_Color.b(), m_Color.a() );
|
||
|
pKeys->SetString( "Color", buffer );
|
||
|
pKeys->SetString( "Name", m_szGroupName );
|
||
|
pKeys->SetString( "TitleText", m_szTitleText );
|
||
|
pKeys->SetString( "DescriptionText", m_szDescriptionText );
|
||
|
pKeys->SetString( "ImageName", m_szImageName );
|
||
|
|
||
|
for ( int i = 0; i < m_UnlockedBy.Count(); i++ )
|
||
|
{
|
||
|
KeyValues *pKey = new KeyValues( "UnlockMissionID" );
|
||
|
Q_snprintf( buffer, sizeof( buffer ), "%d", m_UnlockedBy[i] );
|
||
|
pKey->SetStringValue( buffer );
|
||
|
pKeys->AddSubKey( pKey );
|
||
|
}
|
||
|
for ( int i = 0; i < m_Locations.Count(); i++ )
|
||
|
{
|
||
|
KeyValues *pKey = m_Locations[i]->GetKeyValuesForEditor();
|
||
|
pKeys->AddSubKey( pKey );
|
||
|
}
|
||
|
return pKeys;
|
||
|
}
|
||
|
void CASW_Location_Group::LoadFromKeyValues( KeyValues *pKeys )
|
||
|
{
|
||
|
m_iRequiredUnlocks = pKeys->GetInt( "RequiredUnlocks", 0 );
|
||
|
m_Color = pKeys->GetColor( "Color" );
|
||
|
m_szGroupName = TileGenCopyString( pKeys->GetString( "Name" ) );
|
||
|
m_szTitleText = TileGenCopyString( pKeys->GetString( "TitleText" ) );
|
||
|
m_szDescriptionText = TileGenCopyString( pKeys->GetString( "DescriptionText" ) );
|
||
|
m_szImageName = TileGenCopyString( pKeys->GetString( "ImageName" ) );
|
||
|
|
||
|
// check all keys for unlock IDs
|
||
|
m_UnlockedBy.Purge();
|
||
|
m_Locations.PurgeAndDeleteElements();
|
||
|
for ( KeyValues *pSubKey = pKeys->GetFirstSubKey(); pSubKey; pSubKey = pSubKey->GetNextKey() )
|
||
|
{
|
||
|
if ( !Q_stricmp( pSubKey->GetName(), "UnlockMissionID" ) )
|
||
|
{
|
||
|
m_UnlockedBy.AddToTail( pSubKey->GetInt() );
|
||
|
}
|
||
|
else if ( !Q_stricmp( pSubKey->GetName(), "Location" ) )
|
||
|
{
|
||
|
CASW_Location *pLocation = new CASW_Location( m_pLocationGrid );
|
||
|
pLocation->LoadFromKeyValues( pSubKey, &m_Random );
|
||
|
pLocation->m_pGroup = this;
|
||
|
m_Locations.AddToTail( pLocation );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IASW_Location* CASW_Location_Group::GetLocation( int iIndex )
|
||
|
{
|
||
|
if ( iIndex < 0 || iIndex >= m_Locations.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_Locations[iIndex];
|
||
|
}
|
||
|
|
||
|
CASW_Location* CASW_Location_Group::GetCLocation( int iIndex )
|
||
|
{
|
||
|
if ( iIndex < 0 || iIndex >= m_Locations.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_Locations[iIndex];
|
||
|
}
|
||
|
|
||
|
int CASW_Location_Group::GetHighestUnlockMissionID()
|
||
|
{
|
||
|
int iMissionID = 0;
|
||
|
if ( m_UnlockedBy.Count() <= 0 )
|
||
|
return iMissionID;
|
||
|
|
||
|
for ( int i = 0; i < m_UnlockedBy.Count(); i++ )
|
||
|
{
|
||
|
if ( i == 0 )
|
||
|
{
|
||
|
iMissionID = m_UnlockedBy[i];
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if ( m_UnlockedBy[i-1] && m_UnlockedBy[i] > m_UnlockedBy[i-1])
|
||
|
iMissionID = m_UnlockedBy[i];
|
||
|
}
|
||
|
return iMissionID;
|
||
|
}
|
||
|
|
||
|
bool CASW_Location_Group::IsGroupLocked( CUtlVector<int> &completedMissions )
|
||
|
{
|
||
|
if ( asw_unlock_all_locations.GetBool() )
|
||
|
return false;
|
||
|
|
||
|
if ( m_UnlockedBy.Count() <= 0 )
|
||
|
return false;
|
||
|
|
||
|
for ( int i = 0; i < m_UnlockedBy.Count(); i++ )
|
||
|
{
|
||
|
if ( completedMissions.Find( m_UnlockedBy[i] ) != completedMissions.InvalidIndex() ) // this mission has been completed, so it won't make this group locked
|
||
|
continue;
|
||
|
|
||
|
// one of our required missions is incomplete, so this group is locked
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//======================================================================================
|
||
|
// Location
|
||
|
//======================================================================================
|
||
|
|
||
|
CASW_Location::CASW_Location( CASW_Location_Grid *pLocationGrid ) :
|
||
|
m_pMissionKV( NULL ),
|
||
|
m_pLocationGrid( pLocationGrid )
|
||
|
{
|
||
|
m_szMapName[0] = 0;
|
||
|
m_iDifficulty = 0;
|
||
|
m_iMinDifficulty = 1;
|
||
|
m_iMaxDifficulty = 100;
|
||
|
m_pGroup = NULL;
|
||
|
m_bCompleted = false;
|
||
|
m_iXPos = 0;
|
||
|
m_iYPos = 0;
|
||
|
m_pszCustomMission = NULL;
|
||
|
m_iCompanyIndex = 0;
|
||
|
m_bIsMissionOptional = true;
|
||
|
m_szStoryScene = NULL;
|
||
|
m_szImageName = NULL;
|
||
|
m_iLocationID = -1;
|
||
|
}
|
||
|
|
||
|
CASW_Location::~CASW_Location()
|
||
|
{
|
||
|
if ( m_pMissionKV != NULL )
|
||
|
{
|
||
|
m_pMissionKV->deleteThis();
|
||
|
}
|
||
|
m_Rewards.PurgeAndDeleteElements();
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Location::GetMissionSettings()
|
||
|
{
|
||
|
return m_pMissionKV != NULL ? m_pMissionKV->FindKey( "mission_settings" ) : NULL;
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Location::GetMissionDefinition()
|
||
|
{
|
||
|
return m_pMissionKV;
|
||
|
}
|
||
|
|
||
|
// TODO: Move this company stuff into some data driven class?
|
||
|
const char* CASW_Location::GetCompanyName( void )
|
||
|
{
|
||
|
/*
|
||
|
asw_company_name_deuce "Deuce Company"
|
||
|
asw_company_name_iaf "IAF (Interstellar Armed Forces)"
|
||
|
asw_company_name_totem "Totem Corp."
|
||
|
asw_company_name_oldeearth "Olde Earth"
|
||
|
asw_company_name_magnus "Magnus-Parke Industries"
|
||
|
asw_company_name_civilised "Civilised LTD."
|
||
|
*/
|
||
|
switch( m_iCompanyIndex )
|
||
|
{
|
||
|
case 1:
|
||
|
return "#asw_company_name_deuce";
|
||
|
|
||
|
case 2:
|
||
|
return "#asw_company_name_iaf";
|
||
|
|
||
|
case 3:
|
||
|
return "#asw_company_name_totem";
|
||
|
|
||
|
case 4:
|
||
|
return "#asw_company_name_oldeearth";
|
||
|
|
||
|
case 5:
|
||
|
return "#asw_company_name_magnus";
|
||
|
|
||
|
case 6:
|
||
|
return "#asw_company_name_civilised";
|
||
|
|
||
|
default:
|
||
|
return "#asw_company_name_none";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const char* CASW_Location::GetCompanyImage( void )
|
||
|
{
|
||
|
/*
|
||
|
asw_company_name_deuce "Deuce Company"
|
||
|
asw_company_name_iaf "IAF (Interstellar Armed Forces)"
|
||
|
asw_company_name_totem "Totem Corp."
|
||
|
asw_company_name_oldeearth "Olde Earth"
|
||
|
asw_company_name_magnus "Magnus-Parke Industries"
|
||
|
asw_company_name_civilised "Civilised LTD."
|
||
|
*/
|
||
|
switch( m_iCompanyIndex )
|
||
|
{
|
||
|
case 1:
|
||
|
return "briefing/companylogo/deuce";
|
||
|
|
||
|
case 2:
|
||
|
return "briefing/companylogo/iaf";
|
||
|
|
||
|
case 3:
|
||
|
return "briefing/companylogo/totem";
|
||
|
|
||
|
case 4:
|
||
|
return "briefing/companylogo/oldeearth";
|
||
|
|
||
|
case 5:
|
||
|
return "briefing/companylogo/magnus";
|
||
|
|
||
|
case 6:
|
||
|
return "briefing/companylogo/civilised";
|
||
|
|
||
|
default:
|
||
|
return "briefing/companylogo/none";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Location::GetKeyValuesForEditor()
|
||
|
{
|
||
|
KeyValues *pKeys = new KeyValues( "Location" );
|
||
|
pKeys->SetInt( "x", m_iXPos );
|
||
|
pKeys->SetInt( "y", m_iYPos );
|
||
|
pKeys->SetInt( "MinDifficulty", m_iMinDifficulty );
|
||
|
pKeys->SetInt( "MaxDifficulty", m_iMaxDifficulty );
|
||
|
pKeys->SetString( "StoryScene", m_szStoryScene );
|
||
|
pKeys->SetString( "ImageName", m_szImageName );
|
||
|
// if mission doesn't have a valid ID then find one
|
||
|
if ( m_iLocationID == -1 )
|
||
|
{
|
||
|
m_iLocationID = LocationGrid()->GetFreeLocationID();
|
||
|
}
|
||
|
pKeys->SetInt( "ID", m_iLocationID );
|
||
|
pKeys->SetString( "CustomMission", m_pszCustomMission );
|
||
|
pKeys->SetInt( "Company", m_iCompanyIndex );
|
||
|
//pKeys->SetInt( "MoneyReward", m_iMoneyReward );
|
||
|
//pKeys->SetInt( "XPReward", m_iXPReward );
|
||
|
pKeys->SetInt( "Optional", m_bIsMissionOptional );
|
||
|
|
||
|
if ( m_Rewards.Count() > 0 )
|
||
|
{
|
||
|
KeyValues *pRewards = new KeyValues( "Rewards");
|
||
|
pKeys->AddSubKey( pRewards );
|
||
|
for ( int i = 0; i < m_Rewards.Count(); i++ )
|
||
|
{
|
||
|
KeyValues *pReward = m_Rewards[i]->GetKeyValuesForEditor();
|
||
|
if ( pReward )
|
||
|
{
|
||
|
pRewards->AddSubKey( pReward );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return pKeys;
|
||
|
}
|
||
|
|
||
|
void CASW_Location::LoadFromKeyValues( KeyValues *pKeys, CUniformRandomStream* pStream)
|
||
|
{
|
||
|
m_iXPos = pKeys->GetInt( "x" );
|
||
|
m_iYPos = pKeys->GetInt( "y" );
|
||
|
Q_strcpy( m_szMapName, "random" );
|
||
|
m_iMinDifficulty = pKeys->GetInt( "MinDifficulty", 1 );
|
||
|
m_iMaxDifficulty = pKeys->GetInt( "MaxDifficulty", 100 );
|
||
|
m_iCompanyIndex = pKeys->GetInt( "Company", 0 );
|
||
|
m_bIsMissionOptional = !!pKeys->GetInt( "Optional", 1 );
|
||
|
m_iLocationID = pKeys->GetInt( "ID", -1 );
|
||
|
m_pszCustomMission = TileGenCopyString( pKeys->GetString( "CustomMission" ) );
|
||
|
m_szStoryScene = TileGenCopyString( pKeys->GetString( "StoryScene" ) ) ? TileGenCopyString( pKeys->GetString( "StoryScene" ) ) : "spaceport_crashsite";
|
||
|
m_szImageName = TileGenCopyString( pKeys->GetString( "ImageName" ) ) ? TileGenCopyString( pKeys->GetString( "ImageName" ) ) : "swarm/MissionPics/PlantMissionpic.vmt";
|
||
|
if ( m_pszCustomMission )
|
||
|
{
|
||
|
Q_FixSlashes( m_pszCustomMission );
|
||
|
}
|
||
|
|
||
|
// pick a difficulty between the bounds
|
||
|
m_iDifficulty = pStream->RandomInt( m_iMinDifficulty, m_iMaxDifficulty );
|
||
|
|
||
|
if ( m_pszCustomMission && m_pszCustomMission[0] )
|
||
|
{
|
||
|
m_pMissionKV = m_pLocationGrid->GetMissionData( m_pszCustomMission );
|
||
|
}
|
||
|
if ( m_pMissionKV )
|
||
|
{
|
||
|
// Make a copy so we can modify it
|
||
|
m_pMissionKV = m_pMissionKV->MakeCopy();
|
||
|
|
||
|
// Fill out mission settings from the mission grid data so it gets into the .layout file
|
||
|
if ( GetMissionSettings() )
|
||
|
{
|
||
|
GetMissionSettings()->SetInt( "Difficulty", m_iDifficulty );
|
||
|
const char *pMissionName = m_pszCustomMission;
|
||
|
if ( Q_strnicmp( m_pszCustomMission, "tilegen/new_missions/", Q_strlen( "tilegen/new_missions/" ) ) == 0 )
|
||
|
{
|
||
|
pMissionName += Q_strlen( "tilegen/new_missions/" );
|
||
|
}
|
||
|
GetMissionSettings()->SetString( "Filename", m_pszCustomMission + Q_strlen( "tilegen/new_missions/" ) );
|
||
|
GetMissionSettings()->SetInt( "GridLocationID", m_iLocationID );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if mission doesn't have a valid ID then find one
|
||
|
if ( m_iLocationID == -1 )
|
||
|
{
|
||
|
m_iLocationID = LocationGrid()->GetFreeLocationID();
|
||
|
}
|
||
|
|
||
|
KeyValues *pRewards = pKeys->FindKey( "Rewards" );
|
||
|
if ( pRewards )
|
||
|
{
|
||
|
for ( KeyValues *pRewardKey = pRewards->GetFirstSubKey(); pRewardKey; pRewardKey = pRewardKey->GetNextKey() )
|
||
|
{
|
||
|
CASW_Reward *pReward = new CASW_Reward();
|
||
|
if ( pReward->LoadFromKeyValues( pRewardKey, m_iDifficulty ) )
|
||
|
{
|
||
|
m_Rewards.AddToTail( pReward );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
delete pReward;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// TODO: Create some default rewards?
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CASW_Location::IsLocationLocked( CUtlVector<int> &completedMissions )
|
||
|
{
|
||
|
if ( !GetGroup() )
|
||
|
return false;
|
||
|
|
||
|
return GetGroup()->IsGroupLocked( completedMissions );
|
||
|
}
|
||
|
|
||
|
int CASW_Location::GetNumRewards()
|
||
|
{
|
||
|
return m_Rewards.Count();
|
||
|
}
|
||
|
|
||
|
IASW_Reward* CASW_Location::GetReward( int iRewardIndex )
|
||
|
{
|
||
|
if ( iRewardIndex < 0 || iRewardIndex >= m_Rewards.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_Rewards[ iRewardIndex ];
|
||
|
}
|
||
|
|
||
|
int CASW_Location::GetMoneyReward()
|
||
|
{
|
||
|
int iAmount = 0;
|
||
|
for ( int i = 0; i < m_Rewards.Count(); i++ )
|
||
|
{
|
||
|
if ( m_Rewards[i]->GetRewardType() == ASW_REWARD_MONEY )
|
||
|
{
|
||
|
iAmount += m_Rewards[i]->GetRewardAmount();
|
||
|
}
|
||
|
}
|
||
|
return iAmount;
|
||
|
}
|
||
|
|
||
|
int CASW_Location::GetXPReward()
|
||
|
{
|
||
|
int iAmount = 0;
|
||
|
for ( int i = 0; i < m_Rewards.Count(); i++ )
|
||
|
{
|
||
|
if ( m_Rewards[i]->GetRewardType() == ASW_REWARD_XP )
|
||
|
{
|
||
|
iAmount += m_Rewards[i]->GetRewardAmount();
|
||
|
}
|
||
|
}
|
||
|
return iAmount;
|
||
|
}
|