dhewm3/neo/framework/Session_local.h
Daniel Gibson 42886f0e4b Modify check for Demo version to not break Game DLL ABI
Changing idSession would break the interface for Game DLLs, making the
existing ports of Mods incompatible.
Luckily we have idCommon::GetAdditionalFunction() for cases like this..

Also added a check for WEAPON_NETFIRING in idWeapon::EnterCinematic(),
I got an Assert() there in Debug builds.

Running the Demo seems to work now, at least I could finish it without
any problems (ignoring some warnings in the console)
2019-01-07 15:06:59 +01:00

381 lines
12 KiB
C++

/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
Doom 3 Source Code 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.
Doom 3 Source Code 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 Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#ifndef __SESSIONLOCAL_H__
#define __SESSIONLOCAL_H__
#include "idlib/containers/StrList.h"
#include "idlib/Dict.h"
#include "framework/Session.h"
#include "framework/UsercmdGen.h"
#include "framework/KeyInput.h"
#include "framework/DeclEntityDef.h"
#include "renderer/RenderSystem.h"
#include "renderer/RenderWorld.h"
#include "ui/ListGUI.h"
/*
IsConnectedToServer();
IsGameLoaded();
IsGuiActive();
IsPlayingRenderDemo();
if connected to a server
if handshaking
if map loading
if in game
else if a game loaded
if in load game menu
if main menu up
else if playing render demo
else
if error dialog
full console
*/
typedef struct {
usercmd_t cmd;
int consistencyHash;
} logCmd_t;
struct fileTIME_T {
int index;
ID_TIME_T timeStamp;
operator int() const { return timeStamp; }
};
typedef struct {
idDict serverInfo;
idDict syncedCVars;
idDict userInfo[MAX_ASYNC_CLIENTS];
idDict persistentPlayerInfo[MAX_ASYNC_CLIENTS];
usercmd_t mapSpawnUsercmd[MAX_ASYNC_CLIENTS]; // needed for tracking delta angles
} mapSpawnData_t;
typedef enum {
TD_NO,
TD_YES,
TD_YES_THEN_QUIT
} timeDemo_t;
const int USERCMD_PER_DEMO_FRAME = 2;
const int CONNECT_TRANSMIT_TIME = 1000;
const int MAX_LOGGED_USERCMDS = 60*60*60; // one hour of single player, 15 minutes of four player
class idSessionLocal : public idSession {
public:
idSessionLocal();
virtual ~idSessionLocal();
virtual void Init();
virtual void Shutdown();
virtual void Stop();
virtual void UpdateScreen( bool outOfSequence = true );
virtual void PacifierUpdate();
virtual void Frame();
virtual bool IsMultiplayer();
virtual bool ProcessEvent( const sysEvent_t *event );
virtual void StartMenu( bool playIntro = false );
virtual void ExitMenu();
virtual void GuiFrameEvents();
virtual void SetGUI( idUserInterface *gui, HandleGuiCommand_t handle );
virtual const char *MessageBox( msgBoxType_t type, const char *message, const char *title = NULL, bool wait = false, const char *fire_yes = NULL, const char *fire_no = NULL, bool network = false );
virtual void StopBox( void );
virtual void DownloadProgressBox( backgroundDownload_t *bgl, const char *title, int progress_start = 0, int progress_end = 100 );
virtual void SetPlayingSoundWorld();
virtual void TimeHitch( int msec );
virtual void ReadCDKey( void );
virtual void WriteCDKey( void );
virtual const char *GetCDKey( bool xp );
virtual bool CheckKey( const char *key, bool netConnect, bool offline_valid[ 2 ] );
virtual bool CDKeysAreValid( bool strict );
virtual void ClearCDKey( bool valid[ 2 ] );
virtual void SetCDKeyGuiVars( void );
virtual bool WaitingForGameAuth( void );
virtual void CDKeysAuthReply( bool valid, const char *auth_msg );
virtual int GetSaveGameVersion( void );
virtual const char *GetCurrentMapName();
//=====================================
int GetLocalClientNum();
void MoveToNewMap( const char *mapName );
// loads a map and starts a new game on it
void StartNewGame( const char *mapName, bool devmap = false );
void PlayIntroGui();
void LoadSession( const char *name );
void SaveSession( const char *name );
// called by Draw when the scene to scene wipe is still running
void DrawWipeModel();
void StartWipe( const char *materialName, bool hold = false);
void CompleteWipe();
void ClearWipe();
void ShowLoadingGui();
void ScrubSaveGameFileName( idStr &saveFileName ) const;
idStr GetAutoSaveName( const char *mapName ) const;
bool LoadGame(const char *saveName);
bool SaveGame(const char *saveName, bool autosave = false);
const char *GetAuthMsg( void );
//=====================================
static idCVar com_showAngles;
static idCVar com_showTics;
static idCVar com_minTics;
static idCVar com_fixedTic;
static idCVar com_showDemo;
static idCVar com_skipGameDraw;
static idCVar com_aviDemoWidth;
static idCVar com_aviDemoHeight;
static idCVar com_aviDemoSamples;
static idCVar com_aviDemoTics;
static idCVar com_wipeSeconds;
static idCVar com_guid;
static idCVar gui_configServerRate;
int timeHitch;
bool menuActive;
idSoundWorld * menuSoundWorld; // so the game soundWorld can be muted
bool insideExecuteMapChange; // draw loading screen and update
// screen on prints
int bytesNeededForMapLoad; //
// we don't want to redraw the loading screen for every single
// console print that happens
int lastPacifierTime;
// this is the information required to be set before ExecuteMapChange() is called,
// which can be saved off at any time with the following commands so it can all be played back
mapSpawnData_t mapSpawnData;
idStr currentMapName; // for checking reload on same level
bool mapSpawned; // cleared on Stop()
int numClients; // from serverInfo
int logIndex;
logCmd_t loggedUsercmds[MAX_LOGGED_USERCMDS];
int statIndex;
logStats_t loggedStats[MAX_LOGGED_STATS];
int lastSaveIndex;
// each game tic, numClients usercmds will be added, until full
bool insideUpdateScreen; // true while inside ::UpdateScreen()
bool loadingSaveGame; // currently loading map from a SaveGame
idFile * savegameFile; // this is the savegame file to load from
int savegameVersion;
idFile * cmdDemoFile; // if non-zero, we are reading commands from a file
int latchedTicNumber; // set to com_ticNumber each frame
int lastGameTic; // while latchedTicNumber > lastGameTic, run game frames
int lastDemoTic;
bool syncNextGameFrame;
bool aviCaptureMode; // if true, screenshots will be taken and sound captured
idStr aviDemoShortName; //
float aviDemoFrameCount;
int aviTicStart;
timeDemo_t timeDemo;
int timeDemoStartTime;
int numDemoFrames; // for timeDemo and demoShot
int demoTimeOffset;
renderView_t currentDemoRenderView;
// the next one will be read when
// com_frameTime + demoTimeOffset > currentDemoRenderView.
// TODO: make this private (after sync networking removal and idnet tweaks)
idUserInterface * guiActive;
HandleGuiCommand_t guiHandle;
idUserInterface * guiInGame;
idUserInterface * guiMainMenu;
idListGUI * guiMainMenu_MapList; // easy map list handling
idUserInterface * guiRestartMenu;
idUserInterface * guiLoading;
idUserInterface * guiIntro;
idUserInterface * guiGameOver;
idUserInterface * guiTest;
idUserInterface * guiTakeNotes;
idUserInterface * guiMsg;
idUserInterface * guiMsgRestore; // store the calling GUI for restore
idStr msgFireBack[ 2 ];
bool msgRunning;
int msgRetIndex;
bool msgIgnoreButtons;
bool waitingOnBind;
const idMaterial * whiteMaterial;
const idMaterial * wipeMaterial;
int wipeStartTic;
int wipeStopTic;
bool wipeHold;
#if ID_CONSOLE_LOCK
int emptyDrawCount; // watchdog to force the main menu to restart
#endif
//=====================================
void Clear();
void DrawCmdGraph();
void Draw();
void WriteCmdDemo( const char *name, bool save = false);
void StartPlayingCmdDemo( const char *demoName);
void TimeCmdDemo( const char *demoName);
void SaveCmdDemoToFile(idFile *file);
void LoadCmdDemoFromFile(idFile *file);
void StartRecordingRenderDemo( const char *name );
void StopRecordingRenderDemo();
void StartPlayingRenderDemo( idStr name );
void StopPlayingRenderDemo();
void CompressDemoFile( const char *scheme, const char *name );
void TimeRenderDemo( const char *name, bool twice = false );
void AVIRenderDemo( const char *name );
void AVICmdDemo( const char *name );
void AVIGame( const char *name );
void BeginAVICapture( const char *name );
void EndAVICapture();
void AdvanceRenderDemo( bool singleFrameOnly );
void RunGameTic();
void FinishCmdLoad();
void LoadLoadingGui(const char *mapName);
void DemoShot( const char *name );
void TestGUI( const char *name );
int GetBytesNeededForMapLoad( const char *mapName );
void SetBytesNeededForMapLoad( const char *mapName, int bytesNeeded );
void ExecuteMapChange( bool noFadeWipe = false );
void UnloadMap();
// return true if we actually waiting on an auth reply
bool MaybeWaitOnCDKey( void );
//------------------
// Session_menu.cpp
idStrList loadGameList;
idStrList modsList;
idUserInterface * GetActiveMenu();
void DispatchCommand( idUserInterface *gui, const char *menuCommand, bool doIngame = true );
void MenuEvent( const sysEvent_t *event );
bool HandleSaveGameMenuCommand( idCmdArgs &args, int &icmd );
void HandleInGameCommands( const char *menuCommand );
void HandleMainMenuCommands( const char *menuCommand );
void HandleChatMenuCommands( const char *menuCommand );
void HandleIntroMenuCommands( const char *menuCommand );
void HandleRestartMenuCommands( const char *menuCommand );
void HandleMsgCommands( const char *menuCommand );
void HandleNoteCommands( const char *menuCommand );
void GetSaveGameList( idStrList &fileList, idList<fileTIME_T> &fileTimes );
void TakeNotes( const char * p, bool extended = false );
void UpdateMPLevelShot( void );
void SetSaveGameGuiVars( void );
void SetMainMenuGuiVars( void );
void SetModsMenuGuiVars( void );
void SetMainMenuSkin( void );
void SetPbMenuGuiVars( void );
// DG: true if running the Demo version of Doom3 (for FT_IsDemo, see Common.h)
bool IsDemoVersion()
{
return demoversion;
}
private:
bool BoxDialogSanityCheck( void );
void EmitGameAuth( void );
typedef enum {
CDKEY_UNKNOWN, // need to perform checks on the key
CDKEY_INVALID, // that key is wrong
CDKEY_OK, // valid
CDKEY_CHECKING, // sent a check request ( gameAuth only )
CDKEY_NA // does not apply, xp key when xp is not present
} cdKeyState_t;
static const int CDKEY_BUF_LEN = 17;
static const int CDKEY_AUTH_TIMEOUT = 5000;
char cdkey[ CDKEY_BUF_LEN ];
cdKeyState_t cdkey_state;
char xpkey[ CDKEY_BUF_LEN ];
cdKeyState_t xpkey_state;
int authEmitTimeout;
bool authWaitBox;
idStr authMsg;
bool demoversion; // DG: true if running the Demo version of Doom3, for FT_IsDemo (see Common.h)
};
extern idSessionLocal sessLocal;
#endif /* !__SESSIONLOCAL_H__ */