File: game\game.h
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 */
20
21 // game.h -- game dll information visible to server
22
23 #define GAME_API_VERSION 3
24
25 // edict->svflags
26
27 #define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
28 #define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision
29 #define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision
30
31 // edict->solid values
32
33 typedef enum
34 {
35 SOLID_NOT, // no interaction with other objects
36 SOLID_TRIGGER, // only touch when inside, after moving
37 SOLID_BBOX, // touch on edge
38 SOLID_BSP // bsp clip, touch on edge
39 } solid_t;
40
41 //===============================================================
42
43 // link_t is only used for entity area links now
44 typedef struct link_s
45 {
46 struct link_s *prev, *next;
47 } link_t;
48
49 #define MAX_ENT_CLUSTERS 16
50
51
52 typedef struct edict_s edict_t;
53 typedef struct gclient_s gclient_t;
54
55
56 #ifndef GAME_INCLUDE
95 #endif // GAME_INCLUDE
96
97 //===============================================================
98
99 //
100 // functions provided by the main engine
101 //
102 typedef struct
103 {
104 // special messages
105 void (*bprintf) (int printlevel, char *fmt, ...);
106 void (*dprintf) (char *fmt, ...);
107 void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...);
108 void (*centerprintf) (edict_t *ent, char *fmt, ...);
109 void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs);
110 void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs);
111
112 // config strings hold all the index strings, the lightstyles,
113 // and misc data like the sky definition and cdtrack.
114 // All of the current configstrings are sent to clients when
115 // they connect, and changes are sent to all connected clients.
116 void (*configstring) (int num, char *string);
117
118 void (*error) (char *fmt, ...);
119
120 // the *index functions create configstrings and some internal server state
121 int (*modelindex) (char *name);
122 int (*soundindex) (char *name);
123 int (*imageindex) (char *name);
124
125 void (*setmodel) (edict_t *ent, char *name);
126
127 // collision detection
128 trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask);
129 int (*pointcontents) (vec3_t point);
130 qboolean (*inPVS) (vec3_t p1, vec3_t p2);
131 qboolean (*inPHS) (vec3_t p1, vec3_t p2);
132 void (*SetAreaPortalState) (int portalnum, qboolean open);
133 qboolean (*AreasConnected) (int area1, int area2);
134
135 // an entity will never be sent to a client or used for collision
136 // if it is not passed to linkentity. If the size, position, or
137 // solidity changes, it must be relinked.
138 void (*linkentity) (edict_t *ent);
139 void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict
140 int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
141 void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction
142
143 // network messaging
144 void (*multicast) (vec3_t origin, multicast_t to);
145 void (*unicast) (edict_t *ent, qboolean reliable);
146 void (*WriteChar) (int c);
147 void (*WriteByte) (int c);
148 void (*WriteShort) (int c);
149 void (*WriteLong) (int c);
150 void (*WriteFloat) (float f);
151 void (*WriteString) (char *s);
152 void (*WritePosition) (vec3_t pos); // some fractional bits
153 void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse
154 void (*WriteAngle) (float f);
155
156 // managed memory allocation
157 void *(*TagMalloc) (int size, int tag);
158 void (*TagFree) (void *block);
159 void (*FreeTags) (int tag);
160
161 // console variable interaction
162 cvar_t *(*cvar) (char *var_name, char *value, int flags);
163 cvar_t *(*cvar_set) (char *var_name, char *value);
164 cvar_t *(*cvar_forceset) (char *var_name, char *value);
165
166 // ClientCommand and ServerCommand parameter access
167 int (*argc) (void);
168 char *(*argv) (int n);
169 char *(*args) (void); // concatenation of all argv >= 1
170
171 // add commands to the server console as if they were typed in
172 // for map changing, etc
173 void (*AddCommandString) (char *text);
174
175 void (*DebugGraph) (float value, int color);
176 } game_import_t;
177
178 //
179 // functions exported by the game subsystem
180 //
181 typedef struct
182 {
183 int apiversion;
184
185 // the init function will only be called when a game starts,
186 // not each time a level is loaded. Persistant data for clients
187 // and the server can be allocated in init
188 void (*Init) (void);
189 void (*Shutdown) (void);
190
191 // each new level entered will cause a call to SpawnEntities
192 void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint);
193
194 // Read/Write Game is for storing persistant cross level information
195 // about the world state and the clients.
196 // WriteGame is called every time a level is exited.
197 // ReadGame is called on a loadgame.
198 void (*WriteGame) (char *filename, qboolean autosave);
199 void (*ReadGame) (char *filename);
200
201 // ReadLevel is called after the default map information has been
202 // loaded with SpawnEntities
203 void (*WriteLevel) (char *filename);
204 void (*ReadLevel) (char *filename);
205
206 qboolean (*ClientConnect) (edict_t *ent, char *userinfo);
207 void (*ClientBegin) (edict_t *ent);
208 void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo);
209 void (*ClientDisconnect) (edict_t *ent);
210 void (*ClientCommand) (edict_t *ent);
211 void (*ClientThink) (edict_t *ent, usercmd_t *cmd);
212
213 void (*RunFrame) (void);
214
215 // ServerCommand will be called when an "sv <command>" command is issued on the
216 // server console.
217 // The game can issue gi.argc() / gi.argv() commands to get the rest
218 // of the parameters
219 void (*ServerCommand) (void);
220
221 //
222 // global variables shared between game and server
223 //
224
225 // The edict array is allocated in the game dll so it
226 // can vary in size from one game to another.
227 //
228 // The size will be fixed when ge->Init() is called
229 struct edict_s *edicts;
230 int edict_size;
231 int num_edicts; // current number, <= max_edicts
232 int max_edicts;
233 } game_export_t;
234
235 game_export_t *GetGameApi (game_import_t *import);
236