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.
188 lines
4.5 KiB
188 lines
4.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// tactical_mission.cpp |
|
// Interface for managing player "missions" |
|
// Michael Booth, June 2009 |
|
|
|
#include "cbase.h" |
|
#include "tactical_mission.h" |
|
|
|
/** |
|
* Global singleton accessor. |
|
*/ |
|
CTacticalMissionManager &TheTacticalMissions( void ) |
|
{ |
|
static CTacticalMissionManager *manager = g_pGameRules->TacticalMissionManagerFactory(); |
|
|
|
return *manager; |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
class CListMissions : public CTacticalMissionManager::IForEachMission |
|
{ |
|
public: |
|
virtual bool Inspect( const CTacticalMission &mission ) |
|
{ |
|
Msg( "%s\n", mission.GetName() ); |
|
return true; |
|
} |
|
}; |
|
|
|
CON_COMMAND_F( mission_list, "List all available tactical missions", FCVAR_GAMEDLL ) |
|
{ |
|
if ( !UTIL_IsCommandIssuedByServerAdmin() ) |
|
return; |
|
|
|
CListMissions list; |
|
TheTacticalMissions().ForEachMission( list ); |
|
} |
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
class CShowZone : public IForEachNavArea |
|
{ |
|
public: |
|
virtual bool Inspect( const CNavArea *area ) |
|
{ |
|
#ifdef NEXT_BOT |
|
area->DrawFilled( 255, 255, 0, 255, 9999.9f ); |
|
#endif |
|
return true; |
|
} |
|
}; |
|
|
|
|
|
CON_COMMAND_F( mission_show, "Show the given mission", FCVAR_GAMEDLL ) |
|
{ |
|
if ( !UTIL_IsCommandIssuedByServerAdmin() ) |
|
return; |
|
|
|
if ( args.ArgC() < 2 ) |
|
{ |
|
Msg( "%s <name of mission>\n", args.Arg(0) ); |
|
return; |
|
} |
|
|
|
const CTacticalMission *mission = TheTacticalMissions().GetMission( args.Arg(1) ); |
|
if ( mission ) |
|
{ |
|
const CTacticalMissionZone *zone = mission->GetDeployZone( NULL ); |
|
if ( zone ) |
|
{ |
|
CShowZone show; |
|
zone->ForEachArea( show ); |
|
} |
|
else |
|
{ |
|
Msg( "No deploy zone\n" ); |
|
} |
|
} |
|
else |
|
{ |
|
Msg( "Unknown mission '%s'\n", args.Arg(1) ); |
|
} |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
CNavArea *CTacticalMissionZone::SelectArea( CBasePlayer *who ) const |
|
{ |
|
if ( m_areaVector.Count() == 0 ) |
|
return NULL; |
|
|
|
int which = RandomInt( 0, m_areaVector.Count()-1 ); |
|
return m_areaVector[ which ]; |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
/** |
|
* Iterate each area in this zone. |
|
* If functor returns false, stop iterating and return false. |
|
*/ |
|
bool CTacticalMissionZone::ForEachArea( IForEachNavArea &func ) const |
|
{ |
|
int i; |
|
|
|
for( i=0; i<m_areaVector.Count(); ++i ) |
|
{ |
|
if ( func.Inspect( m_areaVector[i] ) == false ) |
|
break; |
|
} |
|
|
|
bool wasCompleteIteration = ( i == m_areaVector.Count() ); |
|
|
|
func.PostIteration( wasCompleteIteration ); |
|
|
|
return wasCompleteIteration; |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
//--------------------------------------------------------------------------------------------- |
|
CTacticalMissionManager::CTacticalMissionManager( void ) |
|
{ |
|
ListenForGameEvent( "round_start" ); |
|
ListenForGameEvent( "teamplay_round_start" ); |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
void CTacticalMissionManager::FireGameEvent( IGameEvent *gameEvent ) |
|
{ |
|
if ( FStrEq( gameEvent->GetName(), "round_start" ) || FStrEq( gameEvent->GetName(), "teamplay_round_start" ) ) |
|
{ |
|
OnRoundRestart(); |
|
} |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
void CTacticalMissionManager::Register( CTacticalMission *mission ) |
|
{ |
|
if ( m_missionVector.Find( mission ) == m_missionVector.InvalidIndex() ) |
|
{ |
|
m_missionVector.AddToTail( mission ); |
|
} |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
void CTacticalMissionManager::Unregister( CTacticalMission *mission ) |
|
{ |
|
m_missionVector.FindAndRemove( mission ); |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
/** |
|
* Given a mission name, return the mission (or NULL) |
|
*/ |
|
const CTacticalMission *CTacticalMissionManager::GetMission( const char *name ) |
|
{ |
|
FOR_EACH_VEC( m_missionVector, it ) |
|
{ |
|
if ( FStrEq( m_missionVector[it]->GetName(), name ) ) |
|
return m_missionVector[it]; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------- |
|
/** |
|
* Iterate each mission. |
|
* If functor returns false, stop iterating and return false. |
|
*/ |
|
bool CTacticalMissionManager::ForEachMission( CTacticalMissionManager::IForEachMission &func ) |
|
{ |
|
FOR_EACH_VEC( m_missionVector, it ) |
|
{ |
|
if ( !func.Inspect( *m_missionVector[it] ) ) |
|
return false; |
|
} |
|
|
|
return true; |
|
}
|
|
|