etqw-sdk/source/game/roles/Tasks.h

246 lines
8.1 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __GAME_ROLES_TASKS_H__
#define __GAME_ROLES_TASKS_H__
#include "../misc/RenderEntityBundle.h"
#include "../decls/DeclPlayerTask.h"
class sdFireTeam;
class sdDeclPlayerTask;
class sdWayPoint;
class sdRenderEntityBundle;
typedef sdHandle< int, -1 > taskHandle_t;
class sdPlayerTask : public idClass {
public:
CLASS_PROTOTYPE( sdPlayerTask );
static const int TASK_BITS = 8;
static const int MAX_TASKS = ( 1 << TASK_BITS );
static const int MAX_WAYPOINTS = 8;
static const int MAX_CHOOSABLE_TASKS = 5;
enum taskFlags_t {
TF_COMPLETE = BITT< 0 >::VALUE,
TF_USERCREATED = BITT< 1 >::VALUE,
};
static const int NUM_TASKFLAGS = 2;
enum taskMessageType_t {
TM_CREATE,
TM_REMOVE,
TM_COMPLETE,
TM_FULLSTATE,
TM_SETLOCATIION,
TM_USER_CREATED,
TM_VISSTATE,
TM_NUM_MESSAGES,
};
struct wayPointInfo_t {
bool fixed;
bool enabled;
sdWayPoint* wayPoint;
idVec3 offset;
};
class sdTaskMessage : public sdReliableServerMessage {
public:
sdTaskMessage( const sdPlayerTask* task, taskMessageType_t type ) : sdReliableServerMessage( GAME_RELIABLE_SMESSAGE_TASK ) {
WriteBits( type, idMath::BitsForInteger( TM_NUM_MESSAGES ) );
WriteBits( task->GetHandle(), sdPlayerTask::TASK_BITS );
}
};
typedef idLinkList< sdPlayerTask > nodeType_t;
sdPlayerTask( void );
~sdPlayerTask( void );
void Create( int taskIndex, const sdDeclPlayerTask* taskInfo );
taskHandle_t GetHandle( void ) const;
int GetIndex( void ) const { return _taskIndex; }
void SetComplete( void );
void SetTimeout( int duration );
void SetEntity( int spawnId );
void UpdateObjectiveWayPoint( void );
void Think( void );
static void Read( idFile* file );
idEntity* GetEntity( void ) const { return _entity; }
bool IsAvailable( idPlayer* player ) const;
bool IsPlayerEligible( idPlayer* player ) const;
nodeType_t& GetNode( void ) { return _node; }
nodeType_t& GetWorldNode( void ) { return _worldNode; }
nodeType_t& GetObjectiveNode( void ) { return _objectiveNode; }
const sdDeclPlayerTask* GetInfo( void ) const { return _taskInfo; }
int GetEndTime( void ) const { return _endTime; }
int GetStartTime( void ) const { return _creationTime; }
int GetPriority( void ) const { return _taskInfo->GetPriority(); }
float GetCurrentRange( void ) const { return _currentRange; }
bool IsComplete( void ) const { return ( _flags & TF_COMPLETE ) != 0; }
bool HasEligibleWayPoint( void ) const { return _taskInfo->HasEligibleWayPoint() || IsUserCreated(); }
void OnPlayerJoined( idPlayer* player );
void OnPlayerLeft( idPlayer* player );
void SelectWayPoints( int time );
void WriteInitialState( const sdReliableMessageClientInfoBase& target ) const;
void ReadInitialState( const idBitMsg& msg );
void ReadInitialState( idFile* file );
void Write( idFile* file ) const;
void SetUserCreated( void );
bool IsMission( void ) const { return _taskInfo->IsMission() && !IsUserCreated(); }
bool IsUserCreated( void ) const { return ( _flags & TF_USERCREATED ) != 0; }
bool IsObjective( void ) const { return _taskInfo->IsObjective(); }
const char* GetTimeLimit( void ) const;
const wchar_t* GetTitle( idPlayer* player = NULL ) const;
const wchar_t* GetCompletedTitle( idPlayer* player = NULL ) const;
float GetXP( void ) const;
static void HandleMessage( const idBitMsg& msg );
void HandleMessage( taskMessageType_t type, const idBitMsg& msg );
void ShowWayPoint( void );
void ShowWayPoint( int i );
void HideWayPoint( void );
void HideWayPoint( int i );
bool SetTargetPos( int index, const idVec3& target );
bool SetWayPointState( int index, bool state );
virtual idScriptObject* GetScriptObject( void ) const { return _scriptObject; }
void SetCurrentRange( float value ) { _currentRange = value; }
void FlashIcon( int time );
void Event_Complete( void );
void Event_SetTimeout( float duration );
void Event_Free( void );
void Event_GetTaskEntity( void );
void Event_SetTargetPos( int index, const idVec3& position );
void Event_SetWayPointState( int index, bool state );
void Event_GetKey( const char *key );
void Event_GetIntKey( const char *key );
void Event_GetFloatKey( const char *key );
void Event_GetVectorKey( const char *key );
void Event_GetKeyWithDefault( const char *key, const char* defaultvalue );
void Event_GetIntKeyWithDefault( const char *key, int defaultvalue );
void Event_GetFloatKeyWithDefault( const char *key, float defaultvalue );
void Event_GetVectorKeyWithDefault( const char *key, const idVec3& defaultvalue );
void Event_GiveObjectiveProficiency( float count, const char* reason );
void Event_SetUserCreated( void );
void Event_IsUserCreated( void );
void Event_FlashIcon( int time );
private:
idWStr& ProcessTitle( const wchar_t* text, idWStr& output ) const;
int _taskIndex;
const sdDeclPlayerTask* _taskInfo;
idEntityPtr< idEntity > _entity;
int _flags;
nodeType_t _node;
nodeType_t _worldNode;
nodeType_t _objectiveNode;
int _endTime;
int _creationTime;
idStaticList< wayPointInfo_t, MAX_WAYPOINTS > _wayPointInfo;
mutable idWStr _titleBuffer;
idScriptObject* _scriptObject;
float _xp;
bool _wayPointEnabled;
float _currentRange;
idStaticList< idEntityPtr< idPlayer >, MAX_CLIENTS > _players;
};
typedef idStaticList< sdPlayerTask*, sdPlayerTask::MAX_TASKS > playerTaskList_t;
class sdTaskManagerLocal : public idClass {
public:
typedef sdPlayerTask* taskPtr_t;
public:
CLASS_PROTOTYPE( sdTaskManagerLocal );
sdTaskManagerLocal( void );
~sdTaskManagerLocal( void );
sdPlayerTask* TaskForHandle( taskHandle_t handle ) const { return handle.IsValid() ? _taskList[ handle ] : NULL; }
void Init( void );
void Shutdown( void );
void CheckForLeaks( void );
void OnNewTask( sdPlayerTask* task );
sdPlayerTask* AllocTask( const sdDeclPlayerTask* taskInfo, idEntity* object );
void AllocTask( taskHandle_t handle, const sdDeclPlayerTask* taskInfo, int spawnId );
void FreeTask( taskHandle_t handle );
const sdPlayerTask::nodeType_t& GetTasks( void ) { return _activeTasks; }
const sdPlayerTask::nodeType_t& GetObjectiveTasks( const sdTeamInfo* team );
void Think( void );
bool IsTaskValid( idPlayer* player, taskHandle_t taskHandle, bool onlyCheckInitialFT );
void SelectTask( idPlayer* player, taskHandle_t taskHandle );
void WriteInitialReliableMessages( const sdReliableMessageClientInfoBase& target ) const;
void Write( idFile* file ) const;
void Read( idFile* file );
void AddTaskEntity( idLinkList< idEntity >& entity );
static int SortTasksByPriority( const taskPtr_t* a, const taskPtr_t* b );
void OnNewScriptLoad( void );
void OnMapStart( void );
void OnMapShutdown( void );
void OnScriptChange( void );
void OnLocalTeamChanged( void );
void BuildTaskList( idPlayer* player, playerTaskList_t& list );
void Event_AllocEntityTask( int taskIndex, idEntity* object );
private:
playerTaskList_t _taskList;
idStaticList< int, sdPlayerTask::MAX_TASKS > _freeTasks;
sdPlayerTask::nodeType_t _activeTasks;
idList< sdPlayerTask::nodeType_t > _objectiveTasks;
idLinkList< idEntity > _taskEntities;
idScriptObject* _scriptObject;
};
typedef sdSingleton< sdTaskManagerLocal > sdTaskManager;
#endif // __GAME_ROLES_TASKS_H__