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