1 // protos for ALL external functions in cube...
2 
3 #ifndef STANDALONE
4 
5 extern bool hasTE, hasMT, hasMDA, hasDRE, hasstencil, hasST2, hasSTW, hasSTS, hasAF;
6 
7 // GL_ARB_multitexture
8 extern PFNGLACTIVETEXTUREARBPROC       glActiveTexture_;
9 extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTexture_;
10 extern PFNGLMULTITEXCOORD2FARBPROC     glMultiTexCoord2f_;
11 extern PFNGLMULTITEXCOORD3FARBPROC     glMultiTexCoord3f_;
12 
13 // GL_EXT_multi_draw_arrays
14 extern PFNGLMULTIDRAWARRAYSEXTPROC   glMultiDrawArrays_;
15 extern PFNGLMULTIDRAWELEMENTSEXTPROC glMultiDrawElements_;
16 
17 // GL_EXT_draw_range_elements
18 extern PFNGLDRAWRANGEELEMENTSEXTPROC glDrawRangeElements_;
19 
20 // GL_EXT_stencil_two_side
21 extern PFNGLACTIVESTENCILFACEEXTPROC glActiveStencilFace_;
22 
23 // GL_ATI_separate_stencil
24 extern PFNGLSTENCILOPSEPARATEATIPROC   glStencilOpSeparate_;
25 extern PFNGLSTENCILFUNCSEPARATEATIPROC glStencilFuncSeparate_;
26 
27 struct color
28 {
29     float r, g, b, alpha;
colorcolor30     color(){}
colorcolor31     color(float r, float g, float b) : r(r), g(g), b(b), alpha(1.0f) {}
colorcolor32     color(float r, float g, float b, float a) : r(r), g(g), b(b), alpha(a) {}
33 };
34 
35 struct authkey // for AUTH
36 {
37     char *name, *key, *desc;
38     int lastauth;
39 
authkeyauthkey40     authkey(const char *name, const char *key, const char *desc)
41         : name(newstring(name)), key(newstring(key)), desc(newstring(desc)),
42           lastauth(0)
43     {
44     }
45 
~authkeyauthkey46     ~authkey()
47     {
48         DELETEA(name);
49         DELETEA(key);
50         DELETEA(desc);
51     }
52 };
53 
54 // console
55 extern void keypress(int code, bool isdown, int cooked, SDLMod mod = KMOD_NONE);
56 extern int rendercommand(int x, int y, int w);
57 extern void renderconsole();
58 extern char *getcurcommand();
59 extern char *addreleaseaction(const char *s);
60 extern void writebinds(stream *f);
61 extern void pasteconsole(char *dst);
62 extern void clientlogf(const char *s, ...);
63 
64 struct keym
65 {
66     int code;
67 
68     enum
69     {
70         ACTION_DEFAULT = 0,
71         ACTION_SPECTATOR,
72         ACTION_EDITING,
73         NUMACTIONS
74     };
75 
76     char *name, *actions[NUMACTIONS];
77     bool pressed;
78 
keymkeym79     keym() : code(-1), name(NULL), pressed(false) { loopi(NUMACTIONS) actions[i] = newstring(""); }
~keymkeym80     ~keym() { DELETEA(name); loopi(NUMACTIONS) DELETEA(actions[i]); }
81 };
82 
83 extern keym *keypressed;
84 
85 extern bool bindkey(keym *km, const char *action, int state = keym::ACTION_DEFAULT);
86 extern keym *findbinda(const char *action, int type = keym::ACTION_DEFAULT);
87 extern bool bindc(int code, const char *action, int type = keym::ACTION_DEFAULT);
88 
89 // menus
90 extern void rendermenu();
91 extern bool menuvisible();
92 extern void menureset(void *menu);
93 extern void menumanual(void *menu, char *text, char *action = NULL, color *bgcolor = NULL, const char *desc = NULL);
94 extern void menuimagemanual(void *menu, const char *filename1, const char *filename2, char *text, char *action = NULL, color *bgcolor = NULL, const char *desc = NULL);
95 extern void menutitle(void *menu, const char *title = NULL);
96 extern bool needscoresreorder;
97 extern void menuheader(void *menu, char *header = NULL, char *footer = NULL);
98 extern bool menukey(int code, bool isdown, int unicode, SDLMod mod = KMOD_NONE);
99 extern void *addmenu(const char *name, const char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(void *, bool) = NULL, bool (__cdecl *keyfunc)(void *, int, bool, int) = NULL, bool hotkeys = false, bool forwardkeys = false);
100 extern void rendermenumdl();
101 extern void menuset(void *m, bool save = true);
102 extern void menuselect(void *menu, int sel);
103 extern void showmenu(const char *name, bool top = true);
104 extern void closemenu(const char *name);
105 extern void addchange(const char *desc, int type);
106 extern void clearchanges(int type);
107 extern void refreshapplymenu(void *menu, bool init);
108 
109 struct mitem
110 {
111     struct gmenu *parent;
112     color *bgcolor;
113 
mitemmitem114     mitem(gmenu *parent, color *bgcolor, int type) : parent(parent), bgcolor(bgcolor), type(type) {}
~mitemmitem115     virtual ~mitem() {}
116 
117     virtual void render(int x, int y, int w);
118     virtual int width() = 0;
selectmitem119     virtual void select() {}
focusmitem120     virtual void focus(bool on) { }
keymitem121     virtual void key(int code, bool isdown, int unicode) { }
initmitem122     virtual void init() {}
getdescmitem123     virtual const char *getdesc() { return NULL; }
gettextmitem124     virtual const char *gettext() { return NULL; }
getactionmitem125     virtual const char *getaction() { return NULL; }
126     bool isselection();
127     void renderbg(int x, int y, int w, color *c);
128     static color gray, white, whitepulse;
129     int type;
130 
131     enum { TYPE_TEXTINPUT, TYPE_KEYINPUT, TYPE_CHECKBOX, TYPE_MANUAL, TYPE_SLIDER };
132 };
133 
134 struct mdirlist
135 {
136     char *dir, *ext, *action;
137     bool image;
~mdirlistmdirlist138     ~mdirlist()
139     {
140         DELETEA(dir);
141         DELETEA(ext);
142         DELETEA(action);
143     }
144 };
145 
146 struct gmenu
147 {
148     const char *name, *title, *header, *footer;
149     vector<mitem *> items;
150     int mwidth;
151     int menusel;
152     bool allowinput, inited, hotkeys, forwardkeys;
153     void (__cdecl *refreshfunc)(void *, bool);
154     bool (__cdecl *keyfunc)(void *, int, bool, int);
155     char *initaction;
156     char *usefont;
157     bool allowblink;
158     const char *mdl;
159     int anim, rotspeed, scale;
160     int footlen;
161     mdirlist *dirlist;
162 
gmenugmenu163     gmenu() : name(0), title(0), header(0), footer(0), initaction(0), usefont(0), allowblink(0), mdl(0), footlen(0), dirlist(0) {}
~gmenugmenu164     virtual ~gmenu()
165     {
166         DELETEA(name);
167         DELETEA(mdl);
168         DELETEP(dirlist);
169         DELETEA(initaction);
170         DELETEA(usefont);
171         items.deletecontents();
172     }
173 
174     void render();
175     void renderbg(int x1, int y1, int x2, int y2, bool border);
176     void conprintmenu();
177     void refresh();
178     void open();
179     void close();
180     void init();
181 };
182 
183 // serverbrowser
184 extern void addserver(const char *servername, int serverport, int weight);
185 extern char *getservername(int n);
186 extern bool resolverwait(const char *name, ENetAddress *address);
187 extern int connectwithtimeout(ENetSocket sock, const char *hostname, ENetAddress &remoteaddress);
188 extern void writeservercfg();
189 extern void refreshservers(void *menu, bool init);
190 extern bool serverskey(void *menu, int code, bool isdown, int unicode);
191 extern bool serverinfokey(void *menu, int code, bool isdown, int unicode);
192 
193 struct serverinfo
194 {
195     enum { UNRESOLVED = 0, RESOLVING, RESOLVED };
196 
197     string name;
198     string full;
199     string map;
200     string sdesc;
201     string description;
202     string cmd;
203     int mode, numplayers, maxclients, ping, protocol, minremain, resolved, port, lastpingmillis, pongflags, getinfo, menuline_from, menuline_to;
204     ENetAddress address;
205     vector<const char *> playernames;
206     uchar namedata[MAXTRANS];
207     vector<char *> infotexts;
208     uchar textdata[MAXTRANS];
209     char lang[3];
210     color *bgcolor;
211     int favcat, msweight, weight;
212 
213     int uplinkqual, uplinkqual_age;
214     unsigned char uplinkstats[MAXCLIENTS + 1];
215 
serverinfoserverinfo216     serverinfo()
217      : mode(0), numplayers(0), maxclients(0), ping(9999), protocol(0), minremain(0),
218        resolved(UNRESOLVED), port(-1), lastpingmillis(0), pongflags(0), getinfo(EXTPING_NOP),
219        bgcolor(NULL), favcat(-1), msweight(0), weight(0), uplinkqual(0), uplinkqual_age(0)
220     {
221         name[0] = full[0] = map[0] = sdesc[0] = description[0] = '\0';
222         loopi(3) lang[i] = '\0';
223         loopi(MAXCLIENTS + 1) uplinkstats[i] = 0;
224     }
225 };
226 
227 extern serverinfo *getconnectedserverinfo();
228 extern void pingservers();
229 extern void updatefrommaster(int force);
230 
231 struct packetqueue
232 {
233     ringbuf<ENetPacket *, 8> packets;
234 
235     packetqueue();
236     ~packetqueue();
237     void queue(ENetPacket *p);
238     bool flushtolog(const char *logfile);
239     void clear();
240 };
241 
242 // rendergl
243 extern glmatrixf mvmatrix, projmatrix, clipmatrix, mvpmatrix, invmvmatrix, invmvpmatrix;
244 extern void resetcamera();
245 
246 extern void gl_checkextensions();
247 extern void gl_init(int w, int h, int bpp, int depth, int fsaa);
248 extern void cleangl();
249 extern void enablepolygonoffset(GLenum type);
250 extern void disablepolygonoffset(GLenum type, bool restore = true);
251 extern void line(int x1, int y1, float z1, int x2, int y2, float z2);
252 extern void line(int x1, int y1, int x2, int y2, color *c = NULL);
253 extern void box(block &b, float z1, float z2, float z3, float z4);
254 extern void dot(int x, int y, float z);
255 extern void linestyle(float width, int r, int g, int b);
256 extern void blendbox(int x1, int y1, int x2, int y2, bool border, int tex = -1, color *c = NULL);
257 extern void quad(GLuint tex, float x, float y, float s, float tx, float ty, float tsx, float tsy = 0);
258 extern void quad(GLuint tex, vec &c1, vec &c2, float tx, float ty, float tsx, float tsy);
259 extern void circle(GLuint tex, float x, float y, float r, float tx, float ty, float tr, int subdiv = 32);
260 extern void setperspective(float fovy, float aspect, float nearplane, float farplane);
261 extern void sethudgunperspective(bool on);
262 extern void gl_drawframe(int w, int h, float changelod, float curfps);
263 extern void clearminimap();
264 extern void resetzones();
265 extern void rendercursor(int x, int y, int w);
266 extern void renderaboveheadicon(playerent *p);
267 extern void drawscope(bool preload = false);
268 extern float dynfov();
269 extern void damageblend(int n);
270 
271 enum
272 {
273     CROSSHAIR_DEFAULT = 0,
274     CROSSHAIR_TEAMMATE,
275     CROSSHAIR_SCOPE,
276     CROSSHAIR_KNIFE,
277     CROSSHAIR_PISTOL,
278     CROSSHAIR_CARBINE,
279     CROSSHAIR_SHOTGUN,
280     CROSSHAIR_SMG,
281     CROSSHAIR_SNIPER,
282     CROSSHAIR_AR,
283     CROSSHAIR_CPISTOL,
284     CROSSHAIR_GRENADES,
285     CROSSHAIR_AKIMBO,
286     CROSSHAIR_NUM,
287 };
288 
289 extern void drawcrosshair(playerent *p, int n, struct color *c = NULL, float size = -1.0f);
290 
291 // shadow
292 extern bool addshadowbox(const vec &bbmin, const vec &bbmax, const vec &extrude, const glmatrixf &mat);
293 extern void drawstencilshadows();
294 
295 // texture
296 struct Texture
297 {
298     char *name;
299     int xs, ys, bpp, clamp;
300     float scale;
301     bool mipmap, canreduce;
302     GLuint id;
303 };
304 extern Texture *notexture, *noworldtexture;
305 extern bool silent_texture_load;
306 extern bool uniformtexres;
307 
308 extern void scaletexture(uchar *src, uint sw, uint sh, uint bpp, uchar *dst, uint dw, uint dh);
309 extern void createtexture(int tnum, int w, int h, void *pixels, int clamp, bool mipmap, bool canreduce, GLenum format);
310 extern SDL_Surface *wrapsurface(void *data, int width, int height, int bpp);
311 extern SDL_Surface *creatergbsurface(int width, int height);
312 extern SDL_Surface *creatergbasurface(int width, int height);
313 extern SDL_Surface *forcergbsurface(SDL_Surface *os);
314 extern SDL_Surface *forcergbasurface(SDL_Surface *os);
315 extern Texture *textureload(const char *name, int clamp = 0, bool mipmap = true, bool canreduce = false, float scale = 1.0f, bool trydl = false);
316 extern Texture *lookuptexture(int tex, Texture *failtex = notexture, bool trydl = false);
317 extern bool reloadtexture(Texture &t);
318 extern bool reloadtexture(const char *name);
319 extern void reloadtextures();
320 Texture *createtexturefromsurface(const char *name, SDL_Surface *s);
321 extern void blitsurface(SDL_Surface *dst, SDL_Surface *src, int x, int y);
322 void loadsky(char *basename, bool reload);
323 
324 static inline Texture *lookupworldtexture(int tex, bool trydl = true)
325 { return lookuptexture(tex, noworldtexture, trydl); }
326 
327 extern float skyfloor;
328 extern void draw_envbox(int fogdist);
329 
330 extern int autodownload;
331 extern void setupcurl();
332 extern bool requirepackage(int type, const char *path);
333 extern int downloadpackages();
334 extern void sortpckservers();
335 extern void writepcksourcecfg();
336 
337 extern int maxtmus;
338 extern void inittmus();
339 extern void resettmu(int n);
340 extern void scaletmu(int n, int rgbscale, int alphascale = 0);
341 extern void colortmu(int n, float r = 0, float g = 0, float b = 0, float a = 0);
342 extern void setuptmu(int n, const char *rgbfunc = NULL, const char *alphafunc = NULL);
343 
344 struct zone { int x1, x2, y1, y2, color; }; // zones (drawn on the minimap)
345 
346 // rendercubes
347 extern void mipstats(int a, int b, int c);
348 extern void render_flat(int tex, int x, int y, int size, int h, sqr *l1, sqr *l2, sqr *l3, sqr *l4, bool isceil);
349 extern void render_flatdelta(int wtex, int x, int y, int size, float h1, float h2, float h3, float h4, sqr *l1, sqr *l2, sqr *l3, sqr *l4, bool isceil);
350 extern void render_square(int wtex, float floor1, float floor2, float ceil1, float ceil2, int x1, int y1, int x2, int y2, int size, sqr *l1, sqr *l2, bool topleft, int dir);
351 extern void render_tris(int x, int y, int size, bool topleft, sqr *h1, sqr *h2, sqr *s, sqr *t, sqr *u, sqr *v);
352 extern void resetcubes();
353 extern void setupstrips();
354 extern void renderstripssky();
355 extern void renderstrips();
356 extern void rendershadow(int x, int y, int xs, int ys, const vec &texgenS, const vec &texgenT);
357 
358 // water
359 extern void setwatercolor(const char *r = "", const char *g = "", const char *b = "", const char *a = "");
360 extern void calcwaterscissor();
361 extern void addwaterquad(int x, int y, int size);
362 extern int renderwater(float hf, GLuint reflecttex, GLuint refracttex);
363 extern void resetwater();
364 
365 // client
366 extern void abortconnect();
367 extern void disconnect(int onlyclean = 0, int async = 0);
368 extern void cleanupclient();
369 extern void toserver(char *text);
370 extern void addmsg(int type, const char *fmt = NULL, ...);
371 extern bool multiplayer(bool msg = true);
372 extern bool allowedittoggle();
373 extern void sendpackettoserv(int chan, ENetPacket *packet);
374 extern void gets2c();
375 extern void c2sinfo(playerent *d);
376 extern void c2skeepalive();
377 extern void neterr(const char *s);
378 extern int getclientnum();
379 extern void changeteam(int team, bool respawn = true); // deprecated?
380 extern void getmap(char *name = NULL, char *callback = NULL);
381 extern void newteam(char *name);
382 extern bool securemapcheck(const char *map, bool msg = true);
383 extern int getbuildtype();
384 extern void sendintro();
385 extern void getdemo(int *idx, char *dsp);
386 extern void listdemos();
387 extern bool tryauth(const char *desc);
388 extern authkey *findauthkey(const char *desc);
389 
390 // serverms
391 bool requestmasterf(const char *fmt, ...); // for AUTH et al
392 //moving to server.cpp seems a bad idea.
393 // :for AUTH
394 
395 // clientgame
396 extern flaginfo flaginfos[2];
397 extern int sessionid;
398 extern int gametimecurrent;
399 extern int gametimemaximum;
400 extern int lastgametimeupdate;
resetserverstate401 struct serverstate { int autoteam; int mastermode; int matchteamsize; void reset() { autoteam = mastermode = matchteamsize = 0; }};
402 extern struct serverstate servstate;
403 extern void updateworld(int curtime, int lastmillis);
404 extern void resetmap(bool mrproper = true);
405 extern void startmap(const char *name, bool reset = true);
406 extern void changemap(const char *name);
407 extern void initclient();
408 extern void deathstate(playerent *pl);
409 extern void spawnplayer(playerent *d);
410 extern void dodamage(int damage, playerent *pl, playerent *actor, int gun = -1, bool gib = false, bool local = true);
411 extern void dokill(playerent *pl, playerent *act, bool gib = false, int gun = 0);
412 extern playerent *newplayerent();
413 extern botent *newbotent();
414 extern void freebotent(botent *d);
415 extern char *getclientmap();
416 extern int getclientmode();
417 extern void zapplayer(playerent *&d);
418 extern playerent *getclient(int cn);
419 extern playerent *newclient(int cn);
420 extern void timeupdate(int milliscur, int millismax); // was (int timeremain);
421 extern void respawnself();
422 extern void setskin(playerent *pl, int skin, int team = -1);
423 extern void callvote(int type, const char *arg1 = NULL, const char *arg2 = NULL, const char *arg3 = NULL);
424 extern void addsleep(int msec, const char *cmd, bool persist = false);
425 extern void resetsleep(bool force = false);
426 //game mode extras
427 extern void flagpickup(int fln);
428 extern void tryflagdrop(bool manual = false);
429 extern void flagreturn(int fln);
430 extern void flagscore(int fln);
431 extern void flagstolen(int flag, int act);
432 extern void flagdropped(int flag, float x, float y, float z);
433 extern void flaginbase(int flag);
434 extern void flagidle(int flag);
435 extern void flagmsg(int flag, int message, int actor, int flagtime);
436 extern void arenarespawn();
437 extern bool tryrespawn();
438 extern void findplayerstart(playerent *d, bool mapcenter = false, int arenaspawn = -1);
439 extern void serveropcommand(int cmd, int arg1);
440 extern void refreshsopmenu(void *menu, bool init);
441 extern char *colorname(playerent *d, char *name = NULL, const char *prefix = "");
442 extern char *colorping(int ping);
443 extern char *colorpj(int pj);
444 extern const char *highlight(const char *text);
445 extern void togglespect();
446 extern playerent *updatefollowplayer(int shiftdirection = 0);
447 extern void spectatemode(int mode);
448 
449 struct votedisplayinfo
450 {
451     playerent *owner;
452     int type, stats[VOTE_NUM], result, millis;
453     string desc;
454     bool localplayervoted;
votedisplayinfovotedisplayinfo455     votedisplayinfo() : owner(NULL), result(VOTE_NEUTRAL), millis(0), localplayervoted(false) { loopi(VOTE_NUM) stats[i] = VOTE_NEUTRAL; }
456 };
457 
458 extern votedisplayinfo *newvotedisplayinfo(playerent *owner, int type, const char *arg1, const char *arg2, const char *arg3 = "");
459 extern void callvotesuc();
460 extern void callvoteerr(int e);
461 extern void displayvote(votedisplayinfo *v);
462 extern void voteresult(int v);
463 extern void votecount(int v);
464 extern void clearvote();
465 
466 // scoreboard
467 struct discscore { int team, flags, frags, deaths, points; char name[MAXNAMELEN + 1]; };
468 extern vector<discscore> discscores;
469 extern void showscores(bool on);
470 extern void renderscores(void *menu, bool init);
471 extern const char *asciiscores(bool destjpg = false);
472 extern void consolescores();
473 extern void teamflagscores(int &team1, int &team2);
474 
475 // world
476 extern void setupworld(int factor);
477 extern bool worldbordercheck(int x1, int x2, int y1, int y2, int z1, int z2);
478 extern bool empty_world(int factor, bool force);
479 extern void remip(const block &b, int level = 0);
480 extern void remipmore(const block &b, int level = 0);
481 extern int closestent();
482 extern int findtype(char *what);
483 extern int findentity(int type, int index = 0);
484 extern int findentity(int type, int index, uchar attr2);
485 extern entity *newentity(int index, int x, int y, int z, char *what, int v1, int v2, int v3, int v4);
486 
487 // worldlight
488 extern int lastcalclight;
489 
490 extern void fullbrightlight(int level = -1);
491 extern void calclight();
492 extern void adddynlight(physent *owner, const vec &o, int reach, int expire, int fade, uchar r, uchar g = 0, uchar b = 0);
493 extern void dodynlights();
494 extern void undodynlights();
495 extern void cleardynlights();
496 extern void removedynlights(physent *owner);
497 extern block *blockcopy(const block &b);
498 extern void blockpaste(const block &b, int bx, int by, bool light);
499 extern void blockpaste(const block &b);
500 extern void freeblock(block *&b);
501 
502 // worldrender
503 extern void render_world(float vx, float vy, float vh, float changelod, int yaw, int pitch, float fov, float fovy, int w, int h);
504 extern int lod_factor();
505 
506 // worldocull
507 extern void disableraytable();
508 extern void computeraytable(float vx, float vy, float fov);
509 extern int isoccluded(float vx, float vy, float cx, float cy, float csize);
510 
511 // main
512 extern SDL_Surface *screen;
513 extern int colorbits, depthbits, stencilbits;
514 
515 extern void keyrepeat(bool on);
516 extern bool interceptkey(int sym);
517 extern bool firstrun, inmainloop;
518 
519 enum
520 {
521     NOT_INITING = 0,
522     INIT_LOAD,
523     INIT_RESET
524 };
525 enum
526 {
527     CHANGE_GFX   = 1<<0,
528     CHANGE_SOUND = 1<<1
529 };
530 extern bool initwarning(const char *desc, int level = INIT_RESET, int type = CHANGE_GFX);
531 
532 // rendertext
533 struct font
534 {
535     struct charinfo
536     {
537         short x, y, w, h;
538     };
539 
540     struct utf8charinfo : charinfo
541     {
542         int code;
543     };
544 
545     char *name;
546     Texture *tex;
547     vector<charinfo> chars;
548     int defaultw, defaulth;
549     int offsetx, offsety, offsetw, offseth;
550     int skip;
551 };
552 
553 #define VIRTH 1800
554 #define FONTH (curfont->defaulth)
555 #define PIXELTAB (10*curfont->defaultw)
556 
557 extern int VIRTW; // virtual screen size for text & HUD
558 extern bool ignoreblinkingbit;
559 extern font *curfont;
560 
561 extern void initfont();
562 extern bool setfont(const char *name);
563 extern font *getfont(const char *name);
564 extern void pushfont(const char *name);
565 extern void popfont();
566 extern void draw_text(const char *str, int left, int top, int r = 255, int g = 255, int b = 255, int a = 255, int cursor = -1, int maxwidth = -1);
567 extern void draw_textf(const char *fstr, int left, int top, ...);
568 extern int text_width(const char *str);
569 extern int text_visible(const char *str, int max);
570 extern void text_bounds(const char *str, int &width, int &height, int maxwidth = -1);
571 extern int text_visible(const char *str, int hitx, int hity, int maxwidth);
572 extern void text_pos(const char *str, int cursor, int &cx, int &cy, int maxwidth);
573 extern void text_startcolumns();
574 extern void text_endcolumns();
575 
576 // editing
577 extern void cursorupdate();
578 extern void toggleedit(bool force = false);
579 extern char *editinfo();
580 extern void editdrag(bool isdown);
581 extern void checkselections();
582 extern void setvdeltaxy(int delta, block &sel);
583 extern void editequalisexy(bool isfloor, block &sel);
584 extern void edittypexy(int type, block &sel);
585 extern void edittexxy(int type, int t, block &sel);
586 extern void editheightxy(bool isfloor, int amount, block &sel);
587 //extern bool noteditmode();
588 extern bool noteditmode(const char* func = NULL);
589 extern void pruneundos(int maxremain = 0);
590 
591 // renderhud
592 enum
593 {
594     HUDMSG_INFO = 0,
595     HUDMSG_TIMER,
596 
597     HUDMSG_TYPE = 0xFF,
598     HUDMSG_OVERWRITE = 1<<8
599 };
600 extern void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwater);
601 extern void loadingscreen(const char *fmt = NULL, ...);
602 extern void hudoutf(const char *s, ...);
603 extern void hudonlyf(const char *s, ...);
604 extern void hudeditf(int type, const char *s, ...);
605 extern void show_out_of_renderloop_progress(float bar1, const char *text1, float bar2 = 0, const char *text2 = NULL);
606 extern void updatedmgindicator(vec &attack);
607 extern vec getradarpos();
608 
609 // renderparticles
610 enum
611 {
612     PT_PART = 0,
613     PT_FIREBALL,
614     PT_SHOTLINE,
615     PT_DECAL,
616     PT_BULLETHOLE,
617     PT_BLOOD,
618     PT_STAIN,
619     PT_FLASH,
620     PT_HUDFLASH
621 };
622 
623 #define PT_DECAL_MASK ((1<<PT_DECAL)|(1<<PT_BULLETHOLE)|(1<<PT_STAIN))
624 
625 enum
626 {
627     PART_SPARK = 0,
628     PART_SMOKE,
629     PART_ECLOSEST,
630     PART_BLOOD,
631     PART_DEMOTRACK,
632     PART_FIREBALL,
633     PART_SHOTLINE,
634     PART_BULLETHOLE,
635     PART_BLOODSTAIN,
636     PART_SCORCH,
637     PART_HUDMUZZLEFLASH,
638     PART_MUZZLEFLASH,
639     PART_ELIGHT,
640     PART_ESPAWN,
641     PART_EAMMO,
642     PART_EPICKUP,
643     PART_EMODEL,
644     PART_ECARROT,
645     PART_ELADDER,
646     PART_EFLAG
647 };
648 
649 extern void particleinit();
650 extern void particlereset();
651 extern void particle_flash(int type, float scale, float angle, const vec &p);
652 extern void particle_splash(int type, int num, int fade, const vec &p);
653 extern void particle_trail(int type, int fade, const vec &from, const vec &to);
654 extern void particle_emit(int type, int *args, int basetime, int seed, const vec &p);
655 extern void particle_fireball(int type, const vec &o);
656 extern void addshotline(dynent *d, const vec &from, const vec &to);
657 extern bool addbullethole(dynent *d, const vec &from, const vec &to, float radius = 1, bool noisy = true, int type = 0); // shotty
658 extern bool addscorchmark(vec &o, float radius = 7);
659 
660 extern void render_particles(int time, int typemask = ~0);
661 
662 // worldio
663 extern int mapdims[8];
664 extern const char *setnames(const char *name);
665 extern void save_world(char *fname);
666 extern bool load_world(char *mname);
667 extern void writemap(char *name, int size, uchar *data);
668 extern void writecfggz(char *name, int size, int sizegz, uchar *data);
669 extern uchar *readmap(char *name, int *size, int *revision);
670 extern uchar *readmcfggz(char *name, int *size, int *sizegz);
671 
672 // physics
673 extern float raycube(const vec &o, const vec &ray, vec &surface);
674 extern bool raycubelos(const vec &from, const vec &to, float margin = 0);
675 extern void moveplayer(physent *pl, int moveres, bool local);
676 extern void moveplayer(physent *pl, int moveres, bool local, int curtime);
677 extern void movebounceent(bounceent *p, int moveres, bool local);
678 extern void entinmap(physent *d);
679 extern void physicsframe();
680 extern void mousemove(int dx, int dy);
681 extern void fixcamerarange(physent *cam = camera1);
682 extern void updatecrouch(playerent *p, bool on);
683 extern bool objcollide(physent *d, const vec &objpos, float objrad, float objheight);
684 extern bool collide(physent *d, bool spawn = false, float drop = 0, float rise = 0, int level = 7);
685 extern void attack(bool on);
686 extern void vecfromyawpitch(float yaw, float pitch, int move, int strafe, vec &m);
687 extern void vectoyawpitch(const vec &v, float &yaw, float &pitch);
688 
689 // sound
690 /*
691 extern void audiomgr.playsound(int n, int priority = SP_NORMAL);
692 extern void audiomgr.playsound(int n, physent *p, int priority = SP_NORMAL);
693 extern void audiomgr.playsound(int n, entity *e, int priority = SP_NORMAL);
694 extern void audiomgr.playsound(int n, const vec *v, int priority = SP_NORMAL);
695 extern void audiomgr.playsoundc(int n, physent *p = NULL, int priority = SP_NORMAL);
696 extern void initsound();
697 extern void soundcleanup();
698 extern void musicsuggest(int id, int millis = 0, bool rndofs = false);
699 extern void musicfadeout(int id);
700 extern void clearworldsounds(bool fullclean = true);
701 extern void detachsounds(playerent *owner);
702 extern void updateaudio();
703 extern void preloadmapsound(entity &e);
704 extern void preloadmapsounds();
705 extern void writesoundconfig(stream *f);
706 */
707 
708 // rendermodel
709 extern void rendermodel(const char *mdl, int anim, int tex, float rad, const vec &o, float yaw, float pitch, float speed = 0, int basetime = 0, playerent *d = NULL, modelattach *a = NULL, float scale = 1.0f);
710 extern void startmodelbatches();
711 extern void endmodelbatches(bool flush = true);
712 extern void clearmodelbatches();
713 extern mapmodelinfo &getmminfo(int i);
714 extern int findanim(const char *name);
715 extern void loadskin(const char *dir, const char *altdir, Texture *&skin);
716 extern model *nomodel;
717 extern model *loadmodel(const char *name, int i = -1, bool trydl = false);
718 extern void preload_playermodels();
719 extern void preload_entmodels();
720 extern void preload_hudguns();
721 extern void preload_mapmodels(bool trydl = false);
722 extern void renderclients();
723 extern void renderclient(playerent *d);
724 extern void renderclient(playerent *d, const char *mdlname, const char *vwepname, int tex = 0);
725 extern void updateclientname(playerent *d);
726 
727 // weapon
728 extern void shoot(playerent *d, vec &to);
729 extern void createrays(vec &from, vec &to);
730 extern void removebounceents(playerent *owner);
731 extern void movebounceents();
732 extern void clearbounceents();
733 extern void renderbounceents();
734 extern void addgib(playerent *d);
735 extern playerent *playerincrosshair();
736 extern int magsize(int gun);
737 extern void setscope(bool activate);
738 extern void setburst(bool activate);
739 extern int intersect(playerent *d, const vec &from, const vec &to, vec *end = NULL);
740 extern bool intersect(entity *e, const vec &from, const vec &to, vec *end = NULL);
741 // Structure for storing traceresults
742 struct traceresult_s
743 {
744      vec end;
745      bool collided;
746 };
747 void TraceLine(vec from, vec to, dynent *pTracer, bool CheckPlayers, traceresult_s *tr, bool SkipTags=false);
748 extern void damageeffect(int damage, playerent *d);
749 extern void tryreload(playerent *p);
750 extern void checkweaponstate();
751 extern struct projectile *newprojectile(vec &from, vec &to, float speed, bool local, playerent *owner, int gun, int id = lastmillis);
752 extern int burstshotssettings[NUMGUNS];
753 
754 // entities
755 extern void spawnallitems();
756 extern void pickupeffects(int n, playerent *d);
757 extern void renderentities();
758 extern void rendermapmodels();
759 extern void resetspawns(int type = -1);
760 extern void setspawn(int i, bool on);
761 extern void checkitems(playerent *d);
762 extern vector<int> changedents;
763 extern void syncentchanges(bool force = false);
764 
765 // rndmap
766 extern void perlinarea(block &b, int scale, int seed, int psize);
767 
768 // doc
769 extern void renderdoc(int x, int y, int doch);
770 extern void renderdocmenu(void *menu, bool init);
771 extern void toggledoc();
772 extern void scrolldoc(int i);
773 extern int stringsort(const char **a, const char **b);
774 #endif
775 
776 // protocol [client and server]
777 extern const char *acronymmodestr(int n);
778 extern const char *fullmodestr(int n);
779 extern int defaultgamelimit(int gamemode);
780 
781 // crypto // for AUTH
782 extern void genprivkey(const char *seed, vector<char> &privstr, vector<char> &pubstr);
783 extern bool hashstring(const char *str, char *result, int maxlen);
784 const char *genpwdhash(const char *name, const char *pwd, int salt);
785 extern void answerchallenge(const char *privstr, const char *challenge, vector<char> &answerstr);
786 extern void *parsepubkey(const char *pubstr);
787 extern void freepubkey(void *pubkey);
788 extern void *genchallenge(void *pubkey, const void *seed, int seedlen, vector<char> &challengestr);
789 extern void freechallenge(void *answer);
790 extern bool checkchallenge(const char *answerstr, void *correct);
791 
792 // console
793 extern void conoutf(const char *s, ...);
794 
795 // command
796 extern bool per_idents, neverpersist;
797 extern int variable(const char *name, int min, int cur, int max, int *storage, void (*fun)(), bool persist);
798 extern float fvariable(const char *name, float min, float cur, float max, float *storage, void (*fun)(), bool persist);
799 extern char *svariable(const char *name, const char *cur, char **storage, void (*fun)(), bool persist);
800 extern void setvar(const char *name, int i, bool dofunc = false);
801 extern void setfvar(const char *name, float f, bool dofunc = false);
802 extern void setsvar(const char *name, const char *str, bool dofunc = false);
803 extern int getvar(const char *name);
804 extern bool identexists(const char *name);
805 extern bool addcommand(const char *name, void (*fun)(), const char *sig);
806 extern int execute(const char *p);
807 extern char *executeret(const char *p);
808 extern char *conc(char **w, int n, bool space);
809 extern void intret(int v);
810 extern const char *floatstr(float v);
811 extern void floatret(float v);
812 extern void result(const char *s);
813 extern void exec(const char *cfgfile);
814 extern bool execfile(const char *cfgfile);
815 extern void resetcomplete();
816 extern void complete(char *s);
817 extern void push(const char *name, const char *action);
818 extern void pop(const char *name);
819 extern void alias(const char *name, const char *action, bool constant = false);
820 extern const char *getalias(const char *name);
821 extern void writecfg();
822 extern void deletecfg();
823 extern void identnames(vector<const char *> &names, bool builtinonly);
824 extern void changescriptcontext(int newcontext);
825 extern void explodelist(const char *s, vector<char *> &elems);
826 extern char *indexlist(const char *s, int pos);
827 extern char *parseword(const char *&p);
828 extern char *strreplace(char *dest, const char *source, const char *search, const char *replace);
829 extern void pushscontext(int newcontext);
830 extern int popscontext();
831 extern int curscontext();
832 extern int execcontext;
833 extern const char *currentserver(int i);
834 extern void setcontext(const char *context, const char *info);
835 extern void resetcontext();
836 extern int millis_();
837 extern int screenshottype;
838 
839 // server
840 extern int modeacronyms;
841 extern void servertoclient(int chan, uchar *buf, int len, bool demo = false);
842 extern void localservertoclient(int chan, uchar *buf, int len, bool demo = false);
843 extern const char *modestr(int n, bool acronyms = false);
844 extern const char *voteerrorstr(int n);
845 extern const char *mmfullname(int n);
846 extern void fatal(const char *s, ...);
847 extern void initserver(bool dedicated, int argc = 0, char **argv = NULL);
848 extern void cleanupserver();
849 extern void localconnect();
850 extern void localdisconnect();
851 extern void localclienttoserver(int chan, ENetPacket *);
852 extern void serverslice(uint timeout);
853 extern void putint(ucharbuf &p, int n);
854 extern void putint(packetbuf &p, int n);
855 extern void putint(vector<uchar> &p, int n);
856 extern int getint(ucharbuf &p);
857 extern void putuint(ucharbuf &p, int n);
858 extern void putuint(packetbuf &p, int n);
859 extern void putuint(vector<uchar> &p, int n);
860 extern int getuint(ucharbuf &p);
861 extern void putfloat(ucharbuf &p, float f);
862 extern void putfloat(packetbuf &p, float f);
863 extern void putfloat(vector<uchar> &p, float f);
864 extern float getfloat(ucharbuf &p);
865 extern void sendstring(const char *t, ucharbuf &p);
866 extern void sendstring(const char *t, packetbuf &p);
867 extern void sendstring(const char *t, vector<uchar> &p);
868 extern void getstring(char *t, ucharbuf &p, int len = MAXTRANS);
869 extern void filtertext(char *dst, const char *src, int whitespace = 1, int len = sizeof(string)-1);
870 extern void filterrichtext(char *dst, const char *src, int len = sizeof(string)-1);
871 extern void filterservdesc(char *dst, const char *src, int len = sizeof(string)-1);
872 extern void filterlang(char *d, const char *s);
873 extern void trimtrailingwhitespace(char *s);
874 extern void cutcolorstring(char *text, int len);
875 extern void startintermission();
876 extern void restoreserverstate(vector<entity> &ents);
877 extern string mastername;
878 extern int masterport, mastertype;
879 extern ENetSocket connectmaster();
880 extern uchar *retrieveservers(uchar *buf, int buflen);
881 extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version);
882 extern int msgsizelookup(int msg);
883 extern const char *genpwdhash(const char *name, const char *pwd, int salt);
884 extern void servermsinit(const char *master, const char *ip, int serverport, bool listen);
885 extern bool serverpickup(int i, int sender);
886 extern bool valid_client(int cn);
887 extern void extinfo_cnbuf(ucharbuf &p, int cn);
888 extern void extinfo_statsbuf(ucharbuf &p, int pid, int bpos, ENetSocket &pongsock, ENetAddress &addr, ENetBuffer &buf, int len, int *csend);
889 extern void extinfo_teamscorebuf(ucharbuf &p);
890 extern char *votestring(int type, char *arg1, char *arg2, char *arg3);
891 extern int wizardmain(int argc, char **argv);
892 
893 // demo
894 #define DHDR_DESCCHARS 80
895 #define DHDR_PLISTCHARS 322
896 struct demoheader
897 {
898     char magic[16];
899     int version, protocol;
900     char desc[DHDR_DESCCHARS];
901     char plist[DHDR_PLISTCHARS];
902 };
903 #define DEFDEMOFILEFMT "%w_%h_%n_%Mmin_%G"
904 #define DEFDEMOTIMEFMT "%Y%m%d_%H%M"
905 
906 extern bool watchingdemo;
907 extern int demoprotocol;
908 extern void enddemoplayback();
909 
910 // logging
911 
912 enum { ACLOG_DEBUG = 0, ACLOG_VERBOSE, ACLOG_INFO, ACLOG_WARNING, ACLOG_ERROR, ACLOG_NUM };
913 
914 extern bool initlogging(const char *identity, int facility_, int consolethres, int filethres, int syslogthres, bool logtimestamp);
915 extern void exitlogging();
916 extern bool logline(int level, const char *msg, ...);
917 
918 // server config
919 
920 struct serverconfigfile
921 {
922     string filename;
923     int filelen;
924     char *buf;
serverconfigfileserverconfigfile925     serverconfigfile() : filelen(0), buf(NULL) { filename[0] = '\0'; }
~serverconfigfileserverconfigfile926     virtual ~serverconfigfile() { DELETEA(buf); }
927 
readserverconfigfile928     virtual void read() {}
929     void init(const char *name);
930     bool load();
931 };
932 
933 // server commandline parsing
934 struct servercommandline
935 {
936     int uprate, serverport, syslogfacility, filethres, syslogthres, maxdemos, maxclients, kickthreshold, banthreshold, verbose, incoming_limit, afk_limit, ban_time, demotimelocal;
937     const char *ip, *master, *logident, *serverpassword, *adminpasswd, *demopath, *maprot, *pwdfile, *blfile, *nbfile, *infopath, *motdpath, *forbidden, *killmessages, *demofilenameformat, *demotimestampformat;
938     bool logtimestamp, demo_interm, loggamestatus;
939     string motd, servdesc_full, servdesc_pre, servdesc_suf, voteperm, mapperm;
940     int clfilenesting;
941     vector<const char *> adminonlymaps;
942 
servercommandlineservercommandline943     servercommandline() :   uprate(0), serverport(CUBE_DEFAULT_SERVER_PORT), syslogfacility(6), filethres(-1), syslogthres(-1), maxdemos(5),
944                             maxclients(DEFAULTCLIENTS), kickthreshold(-5), banthreshold(-6), verbose(0), incoming_limit(10), afk_limit(45000), ban_time(20*60*1000), demotimelocal(0),
945                             ip(""), master(NULL), logident(""), serverpassword(""), adminpasswd(""), demopath(""),
946                             maprot("config/maprot.cfg"), pwdfile("config/serverpwd.cfg"), blfile("config/serverblacklist.cfg"), nbfile("config/nicknameblacklist.cfg"),
947                             infopath("config/serverinfo"), motdpath("config/motd"), forbidden("config/forbidden.cfg"), killmessages("config/serverkillmessages.cfg"),
948                             logtimestamp(false), demo_interm(false), loggamestatus(true),
949                             clfilenesting(0)
950     {
951         motd[0] = servdesc_full[0] = servdesc_pre[0] = servdesc_suf[0] = voteperm[0] = mapperm[0] = '\0';
952         demofilenameformat = DEFDEMOFILEFMT;
953         demotimestampformat = DEFDEMOTIMEFMT;
954     }
955 
checkargservercommandline956     bool checkarg(const char *arg)
957     {
958         if(!strncmp(arg, "assaultcube://", 13)) return false;
959         else if(arg[0] != '-' || arg[1] == '\0') return false;
960         const char *a = arg + 2 + strspn(arg + 2, " ");
961         int ai = atoi(a);
962         // client: dtwhzbsave
963         switch(arg[1])
964         { // todo: gjlqGHJQUYZ
965             case '-':
966                     if(!strncmp(arg, "--demofilenameformat=", 21))
967                     {
968                         demofilenameformat = arg+21;
969                     }
970                     else if(!strncmp(arg, "--demotimestampformat=", 22))
971                     {
972                         demotimestampformat = arg+22;
973                     }
974                     else if(!strncmp(arg, "--demotimelocal=", 16))
975                     {
976                         int ai = atoi(arg+16);
977                         demotimelocal = ai == 0 ? 0 : 1;
978                     }
979                     else if(!strncmp(arg, "--masterport=", 13))
980                     {
981                         int ai = atoi(arg+13);
982                         masterport = ai == 0 ? AC_MASTER_PORT : ai;
983                     }
984                     else if(!strncmp(arg, "--mastertype=", 13))
985                     {
986                         int ai = atoi(arg+13);
987                         mastertype = ai > 0 ? 1 : 0;
988                     }
989                     else return false;
990                     break;
991             case 'u': uprate = ai; break;
992             case 'f': if(ai > 0 && ai < 65536) serverport = ai; break;
993             case 'i': ip     = a; break;
994             case 'm': master = a; break;
995             case 'N': logident = a; break;
996             case 'l': loggamestatus = ai != 0; break;
997             case 'F': if(isdigit(*a) && ai >= 0 && ai <= 7) syslogfacility = ai; break;
998             case 'T': logtimestamp = true; break;
999             case 'L':
1000                 switch(*a)
1001                 {
1002                     case 'F': filethres = atoi(a + 1); break;
1003                     case 'S': syslogthres = atoi(a + 1); break;
1004                 }
1005                 break;
1006             case 'A': if(*a) adminonlymaps.add(a); break;
1007             case 'c': if(ai > 0) maxclients = min(ai, MAXCLIENTS); break;
1008             case 'k':
1009             {
1010                 if(arg[2]=='A' && arg[3]!='\0')
1011                 {
1012                     if ((ai = atoi(&arg[3])) >= 30) afk_limit = ai * 1000;
1013                     else afk_limit = 0;
1014                 }
1015                 else if(arg[2]=='B' && arg[3]!='\0')
1016                 {
1017                     if ((ai = atoi(&arg[3])) >= 0) ban_time = ai * 60 * 1000;
1018                     else ban_time = 0;
1019                 }
1020                 else if(ai < 0) kickthreshold = ai;
1021                 break;
1022             }
1023             case 'y': if(ai < 0) banthreshold = ai; break;
1024             case 'x': adminpasswd = a; break;
1025             case 'p': serverpassword = a; break;
1026             case 'D':
1027             {
1028                 if(arg[2]=='I')
1029                 {
1030                     demo_interm = true;
1031                 }
1032                 else if(ai > 0) maxdemos = ai; break;
1033             }
1034             case 'W': demopath = a; break;
1035             case 'r': maprot = a; break;
1036             case 'X': pwdfile = a; break;
1037             case 'B': blfile = a; break;
1038             case 'K': nbfile = a; break;
1039             case 'E': killmessages = a; break;
1040             case 'I': infopath = a; break;
1041             case 'o': filterrichtext(motd, a); break;
1042             case 'O': motdpath = a; break;
1043             case 'g': forbidden = a; break;
1044             case 'n':
1045             {
1046                 char *t = servdesc_full;
1047                 switch(*a)
1048                 {
1049                     case '1': t = servdesc_pre; a += 1 + strspn(a + 1, " "); break;
1050                     case '2': t = servdesc_suf; a += 1 + strspn(a + 1, " "); break;
1051                 }
1052                 filterrichtext(t, a);
1053                 filterservdesc(t, t);
1054                 break;
1055             }
1056             case 'P': concatstring(voteperm, a); break;
1057             case 'M': concatstring(mapperm, a); break;
1058             case 'Z': if(ai >= 0) incoming_limit = ai; break;
1059             case 'V': verbose++; break;
1060             case 'C': if(*a && clfilenesting < 3)
1061             {
1062                 serverconfigfile cfg;
1063                 cfg.init(a);
1064                 cfg.load();
1065                 int line = 1;
1066                 clfilenesting++;
1067                 if(cfg.buf)
1068                 {
1069                     printf("reading commandline parameters from file '%s'\n", a);
1070                     for(char *p = cfg.buf, *l; p < cfg.buf + cfg.filelen; line++)
1071                     {
1072                         l = p; p += strlen(p) + 1;
1073                         for(char *c = p - 2; c > l; c--) { if(*c == ' ') *c = '\0'; else break; }
1074                         l += strspn(l, " \t");
1075                         if(*l && !this->checkarg(newstring(l)))
1076                             printf("unknown parameter in file '%s', line %d: '%s'\n", cfg.filename, line, l);
1077                     }
1078                 }
1079                 else printf("failed to read file '%s'\n", a);
1080                 clfilenesting--;
1081                 break;
1082             }
1083             default: return false;
1084         }
1085         return true;
1086     }
1087 };
1088 
1089 // shotty: shotgun rays def
1090 struct sgray {
1091     int ds; // damage flag: outer, medium, center: SGSEGDMG_*
1092     vec rv; // ray vector
1093 };
1094