]> icculus.org git repositories - icculus/iodoom3.git/blob - neo/game/Game.h
hello world
[icculus/iodoom3.git] / neo / game / Game.h
1 /*
2 ===========================================================================
3
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. 
6
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).  
8
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code.  If not, see <http://www.gnu.org/licenses/>.
21
22 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.
23
24 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.
25
26 ===========================================================================
27 */
28
29 #ifndef __GAME_H__
30 #define __GAME_H__
31
32 /*
33 ===============================================================================
34
35         Public game interface with methods to run the game.
36
37 ===============================================================================
38 */
39
40 // default scripts
41 #define SCRIPT_DEFAULTDEFS                      "script/doom_defs.script"
42 #define SCRIPT_DEFAULT                          "script/doom_main.script"
43 #define SCRIPT_DEFAULTFUNC                      "doom_main"
44
45 typedef struct {
46         char            sessionCommand[MAX_STRING_CHARS];       // "map", "disconnect", "victory", etc
47         int                     consistencyHash;                                        // used to check for network game divergence
48         int                     health;
49         int                     heartRate;
50         int                     stamina;
51         int                     combat;
52         bool            syncNextGameFrame;                                      // used when cinematics are skipped to prevent session from simulating several game frames to
53                                                                                                         // keep the game time in sync with real time
54 } gameReturn_t;
55
56 typedef enum {
57         ALLOW_YES = 0,
58         ALLOW_BADPASS,  // core will prompt for password and connect again
59         ALLOW_NOTYET,   // core will wait with transmitted message
60         ALLOW_NO                // core will abort with transmitted message
61 } allowReply_t;
62
63 typedef enum {
64         ESC_IGNORE = 0, // do nothing
65         ESC_MAIN,               // start main menu GUI
66         ESC_GUI                 // set an explicit GUI
67 } escReply_t;
68
69 #define TIME_GROUP1             0
70 #define TIME_GROUP2             1
71
72 class idGame {
73 public:
74         virtual                                         ~idGame() {}
75
76         // Initialize the game for the first time.
77         virtual void                            Init( void ) = 0;
78
79         // Shut down the entire game.
80         virtual void                            Shutdown( void ) = 0;
81
82         // Set the local client number. Distinguishes listen ( == 0 ) / dedicated ( == -1 )
83         virtual void                            SetLocalClient( int clientNum ) = 0;
84
85         // Sets the user info for a client.
86         // if canModify is true, the game can modify the user info in the returned dictionary pointer, server will forward the change back
87         // canModify is never true on network client
88         virtual const idDict *          SetUserInfo( int clientNum, const idDict &userInfo, bool isClient, bool canModify ) = 0;
89
90         // Retrieve the game's userInfo dict for a client.
91         virtual const idDict *          GetUserInfo( int clientNum ) = 0;
92
93         // The game gets a chance to alter userinfo before they are emitted to server.
94         virtual void                            ThrottleUserInfo( void ) = 0;
95
96         // Sets the serverinfo at map loads and when it changes.
97         virtual void                            SetServerInfo( const idDict &serverInfo ) = 0;
98
99         // The session calls this before moving the single player game to a new level.
100         virtual const idDict &          GetPersistentPlayerInfo( int clientNum ) = 0;
101
102         // The session calls this right before a new level is loaded.
103         virtual void                            SetPersistentPlayerInfo( int clientNum, const idDict &playerInfo ) = 0;
104
105         // Loads a map and spawns all the entities.
106         virtual void                            InitFromNewMap( const char *mapName, idRenderWorld *renderWorld, idSoundWorld *soundWorld, bool isServer, bool isClient, int randseed ) = 0;
107
108         // Loads a map from a savegame file.
109         virtual bool                            InitFromSaveGame( const char *mapName, idRenderWorld *renderWorld, idSoundWorld *soundWorld, idFile *saveGameFile ) = 0;
110
111         // Saves the current game state, the session may have written some data to the file already.
112         virtual void                            SaveGame( idFile *saveGameFile ) = 0;
113
114         // Shut down the current map.
115         virtual void                            MapShutdown( void ) = 0;
116
117         // Caches media referenced from in key/value pairs in the given dictionary.
118         virtual void                            CacheDictionaryMedia( const idDict *dict ) = 0;
119
120         // Spawns the player entity to be used by the client.
121         virtual void                            SpawnPlayer( int clientNum ) = 0;
122
123         // Runs a game frame, may return a session command for level changing, etc
124         virtual gameReturn_t            RunFrame( const usercmd_t *clientCmds ) = 0;
125
126         // Makes rendering and sound system calls to display for a given clientNum.
127         virtual bool                            Draw( int clientNum ) = 0;
128
129         // Let the game do it's own UI when ESCAPE is used
130         virtual escReply_t                      HandleESC( idUserInterface **gui ) = 0;
131
132         // get the games menu if appropriate ( multiplayer )
133         virtual idUserInterface *       StartMenu() = 0;
134
135         // When the game is running it's own UI fullscreen, GUI commands are passed through here
136         // return NULL once the fullscreen UI mode should stop, or "main" to go to main menu
137         virtual const char *            HandleGuiCommands( const char *menuCommand ) = 0;
138
139         // main menu commands not caught in the engine are passed here
140         virtual void                            HandleMainMenuCommands( const char *menuCommand, idUserInterface *gui ) = 0;
141
142         // Early check to deny connect.
143         virtual allowReply_t            ServerAllowClient( int numClients, const char *IP, const char *guid, const char *password, char reason[MAX_STRING_CHARS] ) = 0;
144
145         // Connects a client.
146         virtual void                            ServerClientConnect( int clientNum, const char *guid ) = 0;
147
148         // Spawns the player entity to be used by the client.
149         virtual void                            ServerClientBegin( int clientNum ) = 0;
150
151         // Disconnects a client and removes the player entity from the game.
152         virtual void                            ServerClientDisconnect( int clientNum ) = 0;
153
154         // Writes initial reliable messages a client needs to recieve when first joining the game.
155         virtual void                            ServerWriteInitialReliableMessages( int clientNum ) = 0;
156
157         // Writes a snapshot of the server game state for the given client.
158         virtual void                            ServerWriteSnapshot( int clientNum, int sequence, idBitMsg &msg, byte *clientInPVS, int numPVSClients ) = 0;
159
160         // Patches the network entity states at the server with a snapshot for the given client.
161         virtual bool                            ServerApplySnapshot( int clientNum, int sequence ) = 0;
162
163         // Processes a reliable message from a client.
164         virtual void                            ServerProcessReliableMessage( int clientNum, const idBitMsg &msg ) = 0;
165
166         // Reads a snapshot and updates the client game state.
167         virtual void                            ClientReadSnapshot( int clientNum, int sequence, const int gameFrame, const int gameTime, const int dupeUsercmds, const int aheadOfServer, const idBitMsg &msg ) = 0;
168
169         // Patches the network entity states at the client with a snapshot.
170         virtual bool                            ClientApplySnapshot( int clientNum, int sequence ) = 0;
171
172         // Processes a reliable message from the server.
173         virtual void                            ClientProcessReliableMessage( int clientNum, const idBitMsg &msg ) = 0;
174
175         // Runs prediction on entities at the client.
176         virtual gameReturn_t            ClientPrediction( int clientNum, const usercmd_t *clientCmds, bool lastPredictFrame ) = 0;
177
178         // Used to manage divergent time-lines
179         virtual void                            SelectTimeGroup( int timeGroup ) = 0;
180         virtual int                                     GetTimeGroupTime( int timeGroup ) = 0;
181
182         virtual void                            GetBestGameType( const char* map, const char* gametype, char buf[ MAX_STRING_CHARS ] ) = 0;
183
184         // Returns a summary of stats for a given client
185         virtual void                            GetClientStats( int clientNum, char *data, const int len ) = 0;
186
187         // Switch a player to a particular team
188         virtual void                            SwitchTeam( int clientNum, int team ) = 0;
189
190         virtual bool                            DownloadRequest( const char *IP, const char *guid, const char *paks, char urls[ MAX_STRING_CHARS ] ) = 0;
191
192         virtual void                            GetMapLoadingGUI( char gui[ MAX_STRING_CHARS ] ) = 0;
193 };
194
195 extern idGame *                                 game;
196
197
198 /*
199 ===============================================================================
200
201         Public game interface with methods for in-game editing.
202
203 ===============================================================================
204 */
205
206 typedef struct {
207         idSoundEmitter *                        referenceSound; // this is the interface to the sound system, created
208                                                                                                 // with idSoundWorld::AllocSoundEmitter() when needed
209         idVec3                                          origin;
210         int                                                     listenerId;             // SSF_PRIVATE_SOUND only plays if == listenerId from PlaceListener
211                                                                                                 // no spatialization will be performed if == listenerID
212         const idSoundShader *           shader;                 // this really shouldn't be here, it is a holdover from single channel behavior
213         float                                           diversity;              // 0.0 to 1.0 value used to select which
214                                                                                                 // samples in a multi-sample list from the shader are used
215         bool                                            waitfortrigger; // don't start it at spawn time
216         soundShaderParms_t                      parms;                  // override volume, flags, etc
217 } refSound_t;
218
219 enum {
220         TEST_PARTICLE_MODEL = 0,
221         TEST_PARTICLE_IMPACT,
222         TEST_PARTICLE_MUZZLE,
223         TEST_PARTICLE_FLIGHT,
224         TEST_PARTICLE_SELECTED
225 };
226
227 class idEntity;
228 class idMD5Anim;
229
230 // FIXME: this interface needs to be reworked but it properly separates code for the time being
231 class idGameEdit {
232 public:
233         virtual                                         ~idGameEdit( void ) {}
234
235         // These are the canonical idDict to parameter parsing routines used by both the game and tools.
236         virtual void                            ParseSpawnArgsToRenderLight( const idDict *args, renderLight_t *renderLight );
237         virtual void                            ParseSpawnArgsToRenderEntity( const idDict *args, renderEntity_t *renderEntity );
238         virtual void                            ParseSpawnArgsToRefSound( const idDict *args, refSound_t *refSound );
239
240         // Animation system calls for non-game based skeletal rendering.
241         virtual idRenderModel *         ANIM_GetModelFromEntityDef( const char *classname );
242         virtual const idVec3            &ANIM_GetModelOffsetFromEntityDef( const char *classname );
243         virtual idRenderModel *         ANIM_GetModelFromEntityDef( const idDict *args );
244         virtual idRenderModel *         ANIM_GetModelFromName( const char *modelName );
245         virtual const idMD5Anim *       ANIM_GetAnimFromEntityDef( const char *classname, const char *animname );
246         virtual int                                     ANIM_GetNumAnimsFromEntityDef( const idDict *args );
247         virtual const char *            ANIM_GetAnimNameFromEntityDef( const idDict *args, int animNum );
248         virtual const idMD5Anim *       ANIM_GetAnim( const char *fileName );
249         virtual int                                     ANIM_GetLength( const idMD5Anim *anim );
250         virtual int                                     ANIM_GetNumFrames( const idMD5Anim *anim );
251         virtual void                            ANIM_CreateAnimFrame( const idRenderModel *model, const idMD5Anim *anim, int numJoints, idJointMat *frame, int time, const idVec3 &offset, bool remove_origin_offset );
252         virtual idRenderModel *         ANIM_CreateMeshForAnim( idRenderModel *model, const char *classname, const char *animname, int frame, bool remove_origin_offset );
253
254         // Articulated Figure calls for AF editor and Radiant.
255         virtual bool                            AF_SpawnEntity( const char *fileName );
256         virtual void                            AF_UpdateEntities( const char *fileName );
257         virtual void                            AF_UndoChanges( void );
258         virtual idRenderModel *         AF_CreateMesh( const idDict &args, idVec3 &meshOrigin, idMat3 &meshAxis, bool &poseIsSet );
259
260
261         // Entity selection.
262         virtual void                            ClearEntitySelection( void );
263         virtual int                                     GetSelectedEntities( idEntity *list[], int max );
264         virtual void                            AddSelectedEntity( idEntity *ent );
265
266         // Selection methods
267         virtual void                            TriggerSelected();
268
269         // Entity defs and spawning.
270         virtual const idDict *          FindEntityDefDict( const char *name, bool makeDefault = true ) const;
271         virtual void                            SpawnEntityDef( const idDict &args, idEntity **ent );
272         virtual idEntity *                      FindEntity( const char *name ) const;
273         virtual const char *            GetUniqueEntityName( const char *classname ) const;
274
275         // Entity methods.
276         virtual void                            EntityGetOrigin( idEntity *ent, idVec3 &org ) const;
277         virtual void                            EntityGetAxis( idEntity *ent, idMat3 &axis ) const;
278         virtual void                            EntitySetOrigin( idEntity *ent, const idVec3 &org );
279         virtual void                            EntitySetAxis( idEntity *ent, const idMat3 &axis );
280         virtual void                            EntityTranslate( idEntity *ent, const idVec3 &org );
281         virtual const idDict *          EntityGetSpawnArgs( idEntity *ent ) const;
282         virtual void                            EntityUpdateChangeableSpawnArgs( idEntity *ent, const idDict *dict );
283         virtual void                            EntityChangeSpawnArgs( idEntity *ent, const idDict *newArgs );
284         virtual void                            EntityUpdateVisuals( idEntity *ent );
285         virtual void                            EntitySetModel( idEntity *ent, const char *val );
286         virtual void                            EntityStopSound( idEntity *ent );
287         virtual void                            EntityDelete( idEntity *ent );
288         virtual void                            EntitySetColor( idEntity *ent, const idVec3 color );
289
290         // Player methods.
291         virtual bool                            PlayerIsValid() const;
292         virtual void                            PlayerGetOrigin( idVec3 &org ) const;
293         virtual void                            PlayerGetAxis( idMat3 &axis ) const;
294         virtual void                            PlayerGetViewAngles( idAngles &angles ) const;
295         virtual void                            PlayerGetEyePosition( idVec3 &org ) const;
296
297         // In game map editing support.
298         virtual const idDict *          MapGetEntityDict( const char *name ) const;
299         virtual void                            MapSave( const char *path = NULL ) const;
300         virtual void                            MapSetEntityKeyVal( const char *name, const char *key, const char *val ) const ;
301         virtual void                            MapCopyDictToEntity( const char *name, const idDict *dict ) const;
302         virtual int                                     MapGetUniqueMatchingKeyVals( const char *key, const char *list[], const int max ) const;
303         virtual void                            MapAddEntity( const idDict *dict ) const;
304         virtual int                                     MapGetEntitiesMatchingClassWithString( const char *classname, const char *match, const char *list[], const int max ) const;
305         virtual void                            MapRemoveEntity( const char *name ) const;
306         virtual void                            MapEntityTranslate( const char *name, const idVec3 &v ) const;
307
308 };
309
310 extern idGameEdit *                             gameEdit;
311
312
313 /*
314 ===============================================================================
315
316         Game API.
317
318 ===============================================================================
319 */
320
321 const int GAME_API_VERSION              = 8;
322
323 typedef struct {
324
325         int                                                     version;                                // API version
326         idSys *                                         sys;                                    // non-portable system services
327         idCommon *                                      common;                                 // common
328         idCmdSystem *                           cmdSystem;                              // console command system
329         idCVarSystem *                          cvarSystem;                             // console variable system
330         idFileSystem *                          fileSystem;                             // file system
331         idNetworkSystem *                       networkSystem;                  // network system
332         idRenderSystem *                        renderSystem;                   // render system
333         idSoundSystem *                         soundSystem;                    // sound system
334         idRenderModelManager *          renderModelManager;             // render model manager
335         idUserInterfaceManager *        uiManager;                              // user interface manager
336         idDeclManager *                         declManager;                    // declaration manager
337         idAASFileManager *                      AASFileManager;                 // AAS file manager
338         idCollisionModelManager *       collisionModelManager;  // collision model manager
339
340 } gameImport_t;
341
342 typedef struct {
343
344         int                                                     version;                                // API version
345         idGame *                                        game;                                   // interface to run the game
346         idGameEdit *                            gameEdit;                               // interface for in-game editing
347
348 } gameExport_t;
349
350 extern "C" {
351 typedef gameExport_t * (*GetGameAPI_t)( gameImport_t *import );
352 }
353
354 #endif /* !__GAME_H__ */