mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-15 23:21:40 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
724
Code/Combat/objectives.cpp
Normal file
724
Code/Combat/objectives.cpp
Normal file
@@ -0,0 +1,724 @@
|
||||
/*
|
||||
** Command & Conquer Renegade(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** Confidential - Westwood Studios ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Commando *
|
||||
* *
|
||||
* $Archive:: /Commando/Code/Combat/objectives.cpp $*
|
||||
* *
|
||||
* $Author:: Patrick $*
|
||||
* *
|
||||
* $Modtime:: 1/24/02 5:10p $*
|
||||
* *
|
||||
* $Revision:: 38 $*
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "objectives.h"
|
||||
#include "gameobjref.h"
|
||||
#include "debug.h"
|
||||
#include "radar.h"
|
||||
#include "scriptablegameobj.h"
|
||||
#include "translatedb.h"
|
||||
#include "combat.h"
|
||||
#include "messagewindow.h"
|
||||
#include "globalsettings.h"
|
||||
#include "physicalgameobj.h"
|
||||
#include "diaglog.h"
|
||||
#include "wwaudio.h"
|
||||
#include "hud.h"
|
||||
#include "string_ids.h"
|
||||
|
||||
|
||||
/*
|
||||
** Static member initialization
|
||||
*/
|
||||
SimpleDynVecClass<Objective*> ObjectiveManager::ObjectiveList;
|
||||
ObjectivesViewerClass ObjectiveManager::Viewer;
|
||||
bool ObjectiveManager::DebugMode = false;
|
||||
bool ObjectiveManager::HUDUpdate = true;
|
||||
int ObjectiveManager::NumSpecifiedTertiaryObjectives;
|
||||
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
const Vector3 & Objective::Type_To_Base_Color( void )
|
||||
{
|
||||
static Vector3 color (1.0F, 1.0F, 1.0F);
|
||||
|
||||
if ( HUDGlobalSettingsDef::Get_Instance() != NULL ) {
|
||||
switch ( Type ) {
|
||||
case ObjectiveManager::TYPE_PRIMARY:
|
||||
color = HUDGlobalSettingsDef::Get_Instance()->Get_Primary_Objective_Color();
|
||||
break;
|
||||
|
||||
case ObjectiveManager::TYPE_SECONDARY:
|
||||
color = HUDGlobalSettingsDef::Get_Instance()->Get_Secondary_Objective_Color();
|
||||
break;
|
||||
|
||||
case ObjectiveManager::TYPE_TERTIARY:
|
||||
color = HUDGlobalSettingsDef::Get_Instance()->Get_Tertiary_Objective_Color();
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
const Vector3 & Objective::Type_To_Color( void )
|
||||
{
|
||||
static Vector3 color (1.0F, 1.0F, 1.0F);
|
||||
color = Type_To_Base_Color ();
|
||||
|
||||
//
|
||||
// Dim the colors if this objective has been accomplished
|
||||
//
|
||||
if( Status == ObjectiveManager::STATUS_ACCOMPLISHED ) {
|
||||
color *= 0.6F;
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
const WCHAR * Objective::Type_To_Name( void )
|
||||
{
|
||||
switch ( Type ) {
|
||||
case ObjectiveManager::TYPE_PRIMARY: return TRANSLATE (IDS_MENU_TEXT145);
|
||||
case ObjectiveManager::TYPE_SECONDARY: return TRANSLATE (IDS_MENU_TEXT113);
|
||||
case ObjectiveManager::TYPE_TERTIARY: return TRANSLATE (IDS_MENU_TERTIARY);
|
||||
default: return TRANSLATE (IDS_LOCALE_UNKNOWN);
|
||||
}
|
||||
}
|
||||
|
||||
const WCHAR * Objective::Status_To_Name( void )
|
||||
{
|
||||
if ( Status == ObjectiveManager::STATUS_ACCOMPLISHED ) return TRANSLATE (IDS_MENU_OBJ_ACCOMPLISHED);
|
||||
if ( Status == ObjectiveManager::STATUS_FAILED ) return TRANSLATE (IDS_MENU_OBJ_FAILED);
|
||||
if ( Status == ObjectiveManager::STATUS_HIDDEN ) return TRANSLATE (IDS_MENU_OBJ_HIDDEN);
|
||||
return TRANSLATE (IDS_MENU_OBJ_PENDING);
|
||||
}
|
||||
|
||||
const Vector3 & Objective::Status_To_Color( void )
|
||||
{
|
||||
static const Vector3 RED(1,0,0);
|
||||
static const Vector3 GREEN(0,1,0);
|
||||
static const Vector3 YELLOW(1,1,0);
|
||||
static const Vector3 GREY(0.8F,0.8F,0.8F);
|
||||
|
||||
switch ( Status ) {
|
||||
case ObjectiveManager::STATUS_IS_PENDING: return GREEN;
|
||||
case ObjectiveManager::STATUS_ACCOMPLISHED: return YELLOW;
|
||||
case ObjectiveManager::STATUS_FAILED: return RED;
|
||||
case ObjectiveManager::STATUS_HIDDEN: return GREY;
|
||||
default: return GREEN;
|
||||
}
|
||||
}
|
||||
|
||||
Objective::Objective( void ) :
|
||||
ID( 0 ),
|
||||
Type( 0 ),
|
||||
Status( 0 ),
|
||||
DrawBlip( false ),
|
||||
Position( 0,0,0 ),
|
||||
BlipIntensity( 0 ),
|
||||
HUDMessageStringID( 0 ),
|
||||
LongDescriptionID( 0 ),
|
||||
ShortDescriptionID( 0 ),
|
||||
HUDPriority( 0 ),
|
||||
Age( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
Objective::~Objective( void )
|
||||
{
|
||||
Set_Object( NULL );
|
||||
}
|
||||
|
||||
int Objective::Radar_Blip_Color_Type( void )
|
||||
{
|
||||
return Type - ObjectiveManager::TYPE_PRIMARY + RadarManager::BLIP_COLOR_TYPE_PRIMARY_OBJECTIVE;
|
||||
}
|
||||
|
||||
void Objective::Set_Object( PhysicalGameObj * object )
|
||||
{
|
||||
PhysicalGameObj * obj = (PhysicalGameObj*)Object.Get_Ptr();
|
||||
if ( obj != NULL ) {
|
||||
obj->Reset_Radar_Blip_Shape_Type();
|
||||
obj->Reset_Radar_Blip_Color_Type();
|
||||
}
|
||||
Object = object;
|
||||
Update_Object_Blip();
|
||||
}
|
||||
|
||||
void Objective::Update_Object_Blip( void )
|
||||
{
|
||||
PhysicalGameObj * obj = (PhysicalGameObj*)Object.Get_Ptr();
|
||||
if ( obj != NULL ) {
|
||||
if ( Status == ObjectiveManager::STATUS_IS_PENDING ) {
|
||||
obj->Set_Radar_Blip_Shape_Type( RadarManager::BLIP_SHAPE_TYPE_OBJECTIVE );
|
||||
obj->Set_Radar_Blip_Color_Type( Radar_Blip_Color_Type() );
|
||||
} else {
|
||||
obj->Reset_Radar_Blip_Shape_Type();
|
||||
obj->Reset_Radar_Blip_Color_Type();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vector3 Objective::Get_Position( void )
|
||||
{
|
||||
if ( Object.Get_Ptr() != NULL ) {
|
||||
Vector3 pos;
|
||||
Object.Get_Ptr()->Get_Position( &pos );
|
||||
return pos;
|
||||
}
|
||||
return Position;
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
enum {
|
||||
CHUNKID_VARIABLES = 629001440,
|
||||
CHUNKID_OBJECT,
|
||||
|
||||
MICROCHUNKID_ID = 1,
|
||||
MICROCHUNKID_TYPE,
|
||||
MICROCHUNKID_STATUS,
|
||||
MICROCHUNKID_DESCRIPTION,
|
||||
MICROCHUNKID_DESCRIPTION_SOUND,
|
||||
XXXMICROCHUNKID_RADAR_MARKER_ID,
|
||||
MICROCHUNKID_DESCRIPTION_ID,
|
||||
MICROCHUNKID_DRAW_BLIP,
|
||||
MICROCHUNKID_POSITION,
|
||||
MICROCHUNKID_LONG_DESCRIPTION_ID,
|
||||
MICROCHUNKID_AGE,
|
||||
MICROCHUNKID_HUD_POG_TEXTURE_NAME,
|
||||
MICROCHUNKID_HUD_MESSAGE_STRING_ID,
|
||||
MICROCHUNKID_HUD_PRIORITY,
|
||||
MICROCHUNKID_HUD_AGE,
|
||||
};
|
||||
|
||||
bool Objective::Save( ChunkSaveClass & csave )
|
||||
{
|
||||
csave.Begin_Chunk( CHUNKID_VARIABLES );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_ID, ID );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_TYPE, Type );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_STATUS, Status );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_DESCRIPTION_ID, ShortDescriptionID );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_LONG_DESCRIPTION_ID, LongDescriptionID );
|
||||
WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_DESCRIPTION_SOUND, DescriptionSoundFilename );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_DRAW_BLIP, DrawBlip );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_POSITION, Position );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AGE, Age );
|
||||
WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_HUD_POG_TEXTURE_NAME, HUDPogTextureName );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_HUD_MESSAGE_STRING_ID, HUDMessageStringID );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_HUD_PRIORITY, HUDPriority );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_HUD_AGE, Age );
|
||||
csave.End_Chunk();
|
||||
|
||||
|
||||
if ( Object.Get_Ptr() != NULL ) {
|
||||
csave.Begin_Chunk( CHUNKID_OBJECT );
|
||||
Object.Save( csave );
|
||||
csave.End_Chunk();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Objective::Load( ChunkLoadClass &cload )
|
||||
{
|
||||
while (cload.Open_Chunk()) {
|
||||
switch(cload.Cur_Chunk_ID()) {
|
||||
|
||||
case CHUNKID_VARIABLES:
|
||||
while (cload.Open_Micro_Chunk()) {
|
||||
switch(cload.Cur_Micro_Chunk_ID()) {
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_ID, ID );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_TYPE, Type );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_STATUS, Status );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_DESCRIPTION_ID, ShortDescriptionID );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_LONG_DESCRIPTION_ID, LongDescriptionID );
|
||||
READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_DESCRIPTION_SOUND, DescriptionSoundFilename );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_DRAW_BLIP, DrawBlip );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_POSITION, Position );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_AGE, Age );
|
||||
READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_HUD_POG_TEXTURE_NAME, HUDPogTextureName );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_HUD_MESSAGE_STRING_ID, HUDMessageStringID );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_HUD_PRIORITY, HUDPriority );
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_HUD_AGE, Age );
|
||||
|
||||
default:
|
||||
Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
|
||||
break;
|
||||
}
|
||||
cload.Close_Micro_Chunk();
|
||||
}
|
||||
break;
|
||||
|
||||
case CHUNKID_OBJECT:
|
||||
Object.Load( cload );
|
||||
break;
|
||||
|
||||
default:
|
||||
Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
|
||||
break;
|
||||
|
||||
}
|
||||
cload.Close_Chunk();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
Objective * ObjectiveManager::Add_Loadable_Objective( void )
|
||||
{
|
||||
Objective * objective = new Objective();
|
||||
ObjectiveList.Add( objective );
|
||||
return objective;
|
||||
}
|
||||
|
||||
Objective * ObjectiveManager::Find_Objective( int id )
|
||||
{
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
if ( ObjectiveList[i]->ID == id ) {
|
||||
return ObjectiveList[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
void ObjectiveManager::Init( void )
|
||||
{
|
||||
Viewer.Initialize();
|
||||
HUDUpdate = true;
|
||||
NumSpecifiedTertiaryObjectives = 0;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Shutdown( void )
|
||||
{
|
||||
Viewer.Shutdown();
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
void ObjectiveManager::Reset( void )
|
||||
{
|
||||
HUDUpdate = true;
|
||||
while ( ObjectiveList.Count() != 0 ) {
|
||||
Objective * objective = ObjectiveList[0];
|
||||
ObjectiveList.Delete( 0 );
|
||||
delete objective;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
enum {
|
||||
CHUNKID_OBJECTIVE_ENTRY = 629001432,
|
||||
CHUNKID_MANAGER_VARIABLES,
|
||||
|
||||
MICROCHUNKID_NUM_SPECIFIED_TERTIARY_OBJECTIVES = 1,
|
||||
};
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
bool ObjectiveManager::Save( ChunkSaveClass &csave )
|
||||
{
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
csave.Begin_Chunk( CHUNKID_OBJECTIVE_ENTRY );
|
||||
ObjectiveList[i]->Save( csave );
|
||||
csave.End_Chunk();
|
||||
}
|
||||
|
||||
csave.Begin_Chunk( CHUNKID_MANAGER_VARIABLES );
|
||||
WRITE_MICRO_CHUNK( csave, MICROCHUNKID_NUM_SPECIFIED_TERTIARY_OBJECTIVES, NumSpecifiedTertiaryObjectives );
|
||||
csave.End_Chunk();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ObjectiveManager::Load( ChunkLoadClass &cload )
|
||||
{
|
||||
WWASSERT( ObjectiveList.Count() == 0 );
|
||||
|
||||
while (cload.Open_Chunk()) {
|
||||
switch(cload.Cur_Chunk_ID()) {
|
||||
|
||||
case CHUNKID_MANAGER_VARIABLES:
|
||||
while (cload.Open_Micro_Chunk()) {
|
||||
switch(cload.Cur_Micro_Chunk_ID()) {
|
||||
READ_MICRO_CHUNK( cload, MICROCHUNKID_NUM_SPECIFIED_TERTIARY_OBJECTIVES, NumSpecifiedTertiaryObjectives );
|
||||
default:
|
||||
Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
|
||||
break;
|
||||
}
|
||||
cload.Close_Micro_Chunk();
|
||||
}
|
||||
break;
|
||||
|
||||
case CHUNKID_OBJECTIVE_ENTRY:
|
||||
{
|
||||
Objective * objective = Add_Loadable_Objective();
|
||||
objective->Load( cload );
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
|
||||
break;
|
||||
|
||||
}
|
||||
cload.Close_Chunk();
|
||||
}
|
||||
|
||||
Viewer.Update ();
|
||||
|
||||
HUDUpdate = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
void ObjectiveManager::Add_Objective( int id, int type, int status, int short_description_id, int long_description_id, char * description_sound_filename )
|
||||
{
|
||||
if ( Find_Objective( id ) != NULL ) {
|
||||
Debug_Say(( "Adding a duplicate Objective ID\n" ));
|
||||
return;
|
||||
}
|
||||
|
||||
Objective * objective = Add_Loadable_Objective();
|
||||
objective->ID = id;
|
||||
objective->Type = type;
|
||||
objective->Status = status;
|
||||
objective->ShortDescriptionID = short_description_id;
|
||||
objective->LongDescriptionID = long_description_id;
|
||||
objective->DescriptionSoundFilename = description_sound_filename;
|
||||
|
||||
|
||||
#if 01
|
||||
//
|
||||
// Update our EVA message window
|
||||
//
|
||||
if ( status != ObjectiveManager::STATUS_HIDDEN ) {
|
||||
WideStringClass message;
|
||||
WideStringClass description = TranslateDBClass::Get_String( short_description_id );
|
||||
message.Format( TRANSLATE (IDS_OBJ_NEW_OBJ), objective->Type_To_Name(), description );
|
||||
CombatManager::Get_Message_Window ()->Add_Message (message, objective->Type_To_Base_Color());
|
||||
|
||||
HUDClass::Add_Objective( type );
|
||||
}
|
||||
|
||||
const char * preset_name = NULL;
|
||||
switch ( type ) {
|
||||
case ObjectiveManager::TYPE_PRIMARY: preset_name = "EVA_Primary_Add"; break;
|
||||
case ObjectiveManager::TYPE_SECONDARY: preset_name = "EVA_Secondary_Add"; break;
|
||||
}
|
||||
if ( preset_name ) {
|
||||
// WWAudioClass::Get_Instance()->Create_Instant_Sound( preset_name, Matrix3D(1) );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Viewer.Update ();
|
||||
HUDUpdate = true;
|
||||
return ;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Remove_Objective( int id )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
|
||||
#if 01
|
||||
WideStringClass message;
|
||||
message.Format( TRANSLATE (IDS_OBJ_CANCELLED), objective->Type_To_Name () );
|
||||
CombatManager::Get_Message_Window ()->Add_Message( message, objective->Type_To_Base_Color() );
|
||||
|
||||
// WWAudioClass::Get_Instance()->Create_Instant_Sound( "EVA_Complete", Matrix3D(1) );
|
||||
#endif
|
||||
|
||||
ObjectiveList.Delete( objective );
|
||||
delete objective;
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to delete\n" ));
|
||||
}
|
||||
|
||||
Viewer.Update ();
|
||||
HUDUpdate = true;
|
||||
return ;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Set_Objective_Status( int id, int status )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
|
||||
bool is_unhiding = (objective->Status == ObjectiveManager::STATUS_HIDDEN) &&
|
||||
(status != ObjectiveManager::STATUS_HIDDEN);
|
||||
|
||||
objective->Status = status;
|
||||
|
||||
if ( status == STATUS_FAILED ) {
|
||||
DIAG_LOG(( "OBFA", "%d; %s", id, objective->Status_To_Name() ));
|
||||
}
|
||||
|
||||
if ( status == STATUS_ACCOMPLISHED ) {
|
||||
DIAG_LOG(( "OBCO", "%d; %s", id, objective->Status_To_Name() ));
|
||||
}
|
||||
|
||||
objective->Update_Object_Blip();
|
||||
|
||||
if ( is_unhiding ) {
|
||||
objective->Age = 0; // Reset age
|
||||
}
|
||||
|
||||
#if 01
|
||||
//
|
||||
// Special case changing an objective from hidden to pending... (Note: for
|
||||
// a completed objective, we display the normal message even if it was hidden).
|
||||
//
|
||||
WideStringClass message;
|
||||
if (is_unhiding && (status != ObjectiveManager::STATUS_ACCOMPLISHED)) {
|
||||
WideStringClass description = TranslateDBClass::Get_String( objective->ShortDescriptionID );
|
||||
message.Format( TRANSLATE (IDS_OBJ_NEW_OBJ), objective->Type_To_Name(), description );
|
||||
|
||||
HUDClass::Add_Objective( objective->Type );
|
||||
} else {
|
||||
if ( objective->Status != ObjectiveManager::STATUS_HIDDEN ) {
|
||||
message.Format( TRANSLATE (IDS_OBJ_STATUS_CHANGED), objective->Type_To_Name(), objective->Status_To_Name() );
|
||||
}
|
||||
}
|
||||
CombatManager::Get_Message_Window ()->Add_Message( message, objective->Type_To_Base_Color() );
|
||||
#endif
|
||||
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to set status\n" ));
|
||||
}
|
||||
|
||||
Sort_Objectives();
|
||||
Viewer.Update ();
|
||||
HUDUpdate = true;
|
||||
return ;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Change_Objective_Type( int id, int type )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
objective->Type = type;
|
||||
objective->Update_Object_Blip();
|
||||
//DebugManager::Display_Text( "Mission objective priority changed\n", objective->Type_To_Color () );
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to change type\n" ));
|
||||
}
|
||||
|
||||
Viewer.Update ();
|
||||
HUDUpdate = true;
|
||||
return ;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Set_Objective_Radar_Blip( int id, Vector3 position )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
objective->Set_Object( NULL );
|
||||
objective->Position = position;
|
||||
objective->DrawBlip = true;
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to set_radar_blip\n" ));
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectiveManager::Set_Objective_Radar_Blip( int id, PhysicalGameObj * object )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
objective->Set_Object( object );
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to set_radar_blip\n" ));
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// fnCompareObjectivesCallback
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
int __cdecl ObjectiveManager::ObjectiveSortCallback( const void *elem1, const void *elem2 )
|
||||
{
|
||||
WWASSERT (elem1 != NULL);
|
||||
WWASSERT (elem2 != NULL);
|
||||
Objective *objective1 = *((Objective **)elem1);
|
||||
Objective *objective2 = *((Objective **)elem2);
|
||||
|
||||
// Sort first on status, low first
|
||||
if (objective1->Status < objective2->Status) {
|
||||
return -1;
|
||||
}
|
||||
if (objective1->Status > objective2->Status) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Sort Next on Priority, high first
|
||||
if (objective1->HUDPriority > objective2->HUDPriority) {
|
||||
return -1;
|
||||
}
|
||||
if (objective1->HUDPriority < objective2->HUDPriority) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Sort_Objectives( void )
|
||||
{
|
||||
// Assume the rest of the list is sorted
|
||||
// And bubble him to where he belongs
|
||||
if ( ObjectiveList.Count() != 0 ) {
|
||||
::qsort (&ObjectiveList[0], ObjectiveList.Count(), sizeof(ObjectiveList[0]), ObjectiveSortCallback );
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectiveManager::Set_Objective_HUD_Info( int id, float priority, const char * texture_name, int message_id )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
objective->HUDPriority = priority;
|
||||
objective->HUDPogTextureName = texture_name;
|
||||
objective->HUDMessageStringID = message_id;
|
||||
|
||||
Sort_Objectives();
|
||||
HUDUpdate = true;
|
||||
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to Set_Objective_HUD_Info\n" ));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ObjectiveManager::Set_Objective_HUD_Info( int id, float priority, const char * texture_name, int message_id, const Vector3 & position )
|
||||
{
|
||||
Objective * objective = Find_Objective( id );
|
||||
if ( objective != NULL ) {
|
||||
objective->HUDPriority = priority;
|
||||
objective->HUDPogTextureName = texture_name;
|
||||
objective->HUDMessageStringID = message_id;
|
||||
objective->Position = position;
|
||||
Sort_Objectives();
|
||||
HUDUpdate = true;
|
||||
|
||||
} else {
|
||||
Debug_Say(( "Objective not found to Set_Objective_HUD_Info\n" ));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int ObjectiveManager::Get_Num_HUD_Objectives( void )
|
||||
{
|
||||
// Assume the pendings are first, in priority order
|
||||
int count = 0;
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
if ( ( ObjectiveList[i]->Status == STATUS_IS_PENDING ) &&
|
||||
( ObjectiveList[i]->HUDPriority > 0 ) ) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
const char * ObjectiveManager::Get_HUD_Objectives_Pog_Texture_Name( int index )
|
||||
{
|
||||
return ObjectiveList[index]->HUDPogTextureName;
|
||||
}
|
||||
|
||||
const WCHAR * ObjectiveManager::Get_HUD_Objectives_Message( int index )
|
||||
{
|
||||
return TranslateDBClass::Get_String( ObjectiveList[index]->HUDMessageStringID );
|
||||
}
|
||||
|
||||
Vector3 ObjectiveManager::Get_HUD_Objectives_Location( int index )
|
||||
{
|
||||
return ObjectiveList[index]->Get_Position();
|
||||
}
|
||||
|
||||
float ObjectiveManager::Get_HUD_Objectives_Age( int index )
|
||||
{
|
||||
return ObjectiveList[index]->Age;
|
||||
}
|
||||
|
||||
int ObjectiveManager::Get_Num_Objectives( int type )
|
||||
{
|
||||
int count = 0;
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
if ( ( ObjectiveList[i]->Type == type ) &&
|
||||
( ObjectiveList[i]->Status != STATUS_HIDDEN ) ) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( type == TYPE_TERTIARY ) {
|
||||
if ( count < NumSpecifiedTertiaryObjectives ) {
|
||||
count = NumSpecifiedTertiaryObjectives;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int ObjectiveManager::Get_Num_Completed_Objectives( int type )
|
||||
{
|
||||
int count = 0;
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
if ( ( ObjectiveList[i]->Type == type ) &&
|
||||
( ObjectiveList[i]->Status == STATUS_ACCOMPLISHED ) ) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void ObjectiveManager::Update( float dt )
|
||||
{
|
||||
for ( int i = 0; i < ObjectiveList.Count(); i++ ) {
|
||||
if ( ObjectiveList[i]->Status != STATUS_HIDDEN ) {
|
||||
ObjectiveList[i]->Age += dt;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user