File: client\client.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 // client.h -- primary header for client
   21 
   22 //define        PARANOID                        // speed sapping error checking
   23 
   24 #include <math.h>
   25 #include <string.h>
   26 #include <stdarg.h>
   27 #include <stdio.h>
   28 #include <stdlib.h>
   29 
   30 #include "ref.h"
   31 
   32 #include "vid.h"
   33 #include "screen.h"
   34 #include "sound.h"
   35 #include "input.h"
   36 #include "keys.h"
   37 #include "console.h"
   38 #include "cdaudio.h"
   39 
   40 //=============================================================================
   41 
   42 typedef struct
   43 {
   44         qboolean                valid;                  // cleared if delta parsing was invalid
   45         int                             serverframe;
   46         int                             servertime;             // server time the message is valid for (in msec)
   47         int                             deltaframe;
   48         byte                    areabits[MAX_MAP_AREAS/8];              // portalarea visibility bits
   49         player_state_t  playerstate;
   50         int                             num_entities;
   51         int                             parse_entities; // non-masked index into cl_parse_entities array
   52 } frame_t;
   53 
   54 typedef struct
   55 {
   56         entity_state_t  baseline;               // delta from this if not from a previous frame
   57         entity_state_t  current;
   58         entity_state_t  prev;                   // will always be valid, but might just be a copy of current
   59 
   60         int                     serverframe;            // if not current, this ent isn't in the frame
   61 
   62         int                     trailcount;                     // for diminishing grenade trails
   63         vec3_t          lerp_origin;            // for trails (variable hz)
   64 
   65         int                     fly_stoptime;
   66 } centity_t;
   67 
   68 #define MAX_CLIENTWEAPONMODELS          20              // PGM -- upped from 16 to fit the chainfist vwep
   69 
   70 typedef struct
   71 {
   72         char    name[MAX_QPATH];
   73         char    cinfo[MAX_QPATH];
   74         struct image_s  *skin;
   75         struct image_s  *icon;
   76         char    iconname[MAX_QPATH];
   77         struct model_s  *model;
   78         struct model_s  *weaponmodel[MAX_CLIENTWEAPONMODELS];
   79 } clientinfo_t;
   80 
   81 extern char cl_weaponmodels[MAX_CLIENTWEAPONMODELS][MAX_QPATH];
   82 extern int num_cl_weaponmodels;
   83 
   84 #define CMD_BACKUP              64      // allow a lot of command backups for very fast systems
   85 
   86 //
   87 // the client_state_t structure is wiped completely at every
   88 // server map change
   89 //
   90 typedef struct
   91 {
   92         int                     timeoutcount;
   93 
   94         int                     timedemo_frames;
   95         int                     timedemo_start;
   96 
   97         qboolean        refresh_prepped;        // false if on new level or new ref dll
   98         qboolean        sound_prepped;          // ambient sounds can start
   99         qboolean        force_refdef;           // vid has changed, so we can't use a paused refdef
  100 
  101         int                     parse_entities;         // index (not anded off) into cl_parse_entities[]
  102 
  103         usercmd_t       cmd;
  104         usercmd_t       cmds[CMD_BACKUP];       // each mesage will send several old cmds
  105         int                     cmd_time[CMD_BACKUP];   // time sent, for calculating pings
  106         short           predicted_origins[CMD_BACKUP][3];       // for debug comparing against server
  107 
  108         float           predicted_step;                         // for stair up smoothing
  109         unsigned        predicted_step_time;
  110 
  111         vec3_t          predicted_origin;       // generated by CL_PredictMovement
  112         vec3_t          predicted_angles;
  113         vec3_t          prediction_error;
  114 
  115         frame_t         frame;                          // received from server
  116         int                     surpressCount;          // number of messages rate supressed
  117         frame_t         frames[UPDATE_BACKUP];
  118 
  119         // the client maintains its own idea of view angles, which are
  120         // sent to the server each frame.  It is cleared to 0 upon entering each level.
  121         // the server sends a delta each frame which is added to the locally
  122         // tracked view angles to account for standing on rotating objects,
  123         // and teleport direction changes
  124         vec3_t          viewangles;
  125 
  126         int                     time;                   // this is the time value that the client
  127                                                                 // is rendering at.  always <= cls.realtime
  128         float           lerpfrac;               // between oldframe and frame
  129 
  130         refdef_t        refdef;
  131 
  132         vec3_t          v_forward, v_right, v_up;       // set when refdef.angles is set
  133 
  134         //
  135         // transient data from server
  136         //
  137         char            layout[1024];           // general 2D overlay
  138         int                     inventory[MAX_ITEMS];
  139 
  140         //
  141         // non-gameserver infornamtion
  142         // FIXME: move this cinematic stuff into the cin_t structure
  143         FILE            *cinematic_file;
  144         int                     cinematictime;          // cls.realtime for first cinematic frame
  145         int                     cinematicframe;
  146         char            cinematicpalette[768];
  147         qboolean        cinematicpalette_active;
  148 
  149         //
  150         // server state information
  151         //
  152         qboolean        attractloop;            // running the attract loop, any key will menu
  153         int                     servercount;    // server identification for prespawns
  154         char            gamedir[MAX_QPATH];
  155         int                     playernum;
  156 
  157         char            configstrings[MAX_CONFIGSTRINGS][MAX_QPATH];
  158 
  159         //
  160         // locally derived information from server state
  161         //
  162         struct model_s  *model_draw[MAX_MODELS];
  163         struct cmodel_s *model_clip[MAX_MODELS];
  164 
  165         struct sfx_s    *sound_precache[MAX_SOUNDS];
  166         struct image_s  *image_precache[MAX_IMAGES];
  167 
  168         clientinfo_t    clientinfo[MAX_CLIENTS];
  169         clientinfo_t    baseclientinfo;
  170 } client_state_t;
  171 
  172 extern  client_state_t  cl;
  173 
  174 /*
  175 ==================================================================
  176 
  177 the client_static_t structure is persistant through an arbitrary number
  178 of server connections
  179 
  180 ==================================================================
  181 */
  182 
  183 typedef enum {
  184         ca_uninitialized,
  185         ca_disconnected,        // not talking to a server
  186         ca_connecting,          // sending request packets to the server
  187         ca_connected,           // netchan_t established, waiting for svc_serverdata
  188         ca_active                       // game views should be displayed
  189 } connstate_t;
  190 
  191 typedef enum {
  192         dl_none,
  193         dl_model,
  194         dl_sound,
  195         dl_skin,
  196         dl_single
  197 } dltype_t;             // download type
  198 
  199 typedef enum {key_game, key_console, key_message, key_menu} keydest_t;
  200 
  201 typedef struct
  202 {
  203         connstate_t     state;
  204         keydest_t       key_dest;
  205 
  206         int                     framecount;
  207         int                     realtime;                       // always increasing, no clamping, etc
  208         float           frametime;                      // seconds since last frame
  209 
  210 // screen rendering information
  211         float           disable_screen;         // showing loading plaque between levels
  212                                                                         // or changing rendering dlls
  213                                                                         // if time gets > 30 seconds ahead, break it
  214         int                     disable_servercount;    // when we receive a frame and cl.servercount
  215                                                                         // > cls.disable_servercount, clear disable_screen
  216 
  217 // connection information
  218         char            servername[MAX_OSPATH]; // name of server from original connect
  219         float           connect_time;           // for connection retransmits
  220 
  221         int                     quakePort;                      // a 16 bit value that allows quake servers
  222                                                                         // to work around address translating routers
  223         netchan_t       netchan;
  224         int                     serverProtocol;         // in case we are doing some kind of version hack
  225 
  226         int                     challenge;                      // from the server to use for connecting
  227 
  228         FILE            *download;                      // file transfer from server
  229         char            downloadtempname[MAX_OSPATH];
  230         char            downloadname[MAX_OSPATH];
  231         int                     downloadnumber;
  232         dltype_t        downloadtype;
  233         int                     downloadpercent;
  234 
  235 // demo recording info must be here, so it isn't cleared on level change
  236         qboolean        demorecording;
  237         qboolean        demowaiting;    // don't record until a non-delta message is received
  238         FILE            *demofile;
  239 } client_static_t;
  240 
  241 extern client_static_t  cls;
  242 
  243 //=============================================================================
  244 
  245 //
  246 // cvars
  247 //
  248 extern  cvar_t  *cl_stereo_separation;
  249 extern  cvar_t  *cl_stereo;
  250 
  251 extern  cvar_t  *cl_gun;
  252 extern  cvar_t  *cl_add_blend;
  253 extern  cvar_t  *cl_add_lights;
  254 extern  cvar_t  *cl_add_particles;
  255 extern  cvar_t  *cl_add_entities;
  256 extern  cvar_t  *cl_predict;
  257 extern  cvar_t  *cl_footsteps;
  258 extern  cvar_t  *cl_noskins;
  259 extern  cvar_t  *cl_autoskins;
  260 
  261 extern  cvar_t  *cl_upspeed;
  262 extern  cvar_t  *cl_forwardspeed;
  263 extern  cvar_t  *cl_sidespeed;
  264 
  265 extern  cvar_t  *cl_yawspeed;
  266 extern  cvar_t  *cl_pitchspeed;
  267 
  268 extern  cvar_t  *cl_run;
  269 
  270 extern  cvar_t  *cl_anglespeedkey;
  271 
  272 extern  cvar_t  *cl_shownet;
  273 extern  cvar_t  *cl_showmiss;
  274 extern  cvar_t  *cl_showclamp;
  275 
  276 extern  cvar_t  *lookspring;
  277 extern  cvar_t  *lookstrafe;
  278 extern  cvar_t  *sensitivity;
  279 
  280 extern  cvar_t  *m_pitch;
  281 extern  cvar_t  *m_yaw;
  282 extern  cvar_t  *m_forward;
  283 extern  cvar_t  *m_side;
  284 
  285 extern  cvar_t  *freelook;
  286 
  287 extern  cvar_t  *cl_lightlevel; // FIXME HACK
  288 
  289 extern  cvar_t  *cl_paused;
  290 extern  cvar_t  *cl_timedemo;
  291 
  292 extern  cvar_t  *cl_vwep;
  293 
  294 typedef struct
  295 {
  296         int             key;                            // so entities can reuse same entry
  297         vec3_t  color;
  298         vec3_t  origin;
  299         float   radius;
  300         float   die;                            // stop lighting after this time
  301         float   decay;                          // drop this each second
  302         float   minlight;                       // don't add when contributing less
  303 } cdlight_t;
  304 
  305 extern  centity_t       cl_entities[MAX_EDICTS];
  306 extern  cdlight_t       cl_dlights[MAX_DLIGHTS];
  307 
  308 // the cl_parse_entities must be large enough to hold UPDATE_BACKUP frames of
  309 // entities, so that when a delta compressed message arives from the server
  310 // it can be un-deltad from the original 
  311 #define MAX_PARSE_ENTITIES      1024
  312 extern  entity_state_t  cl_parse_entities[MAX_PARSE_ENTITIES];
  313 
  314 //=============================================================================
  315 
  316 extern  netadr_t        net_from;
  317 extern  sizebuf_t       net_message;
  318 
  319 void DrawString (int x, int y, char *s);
  320 void DrawAltString (int x, int y, char *s);     // toggle high bit
  321 qboolean        CL_CheckOrDownloadFile (char *filename);
  322 
  323 void CL_AddNetgraph (void);
  324 
  325 //ROGUE
  326 typedef struct cl_sustain
  327 {
  328         int                     id;
  329         int                     type;
  330         int                     endtime;
  331         int                     nextthink;
  332         int                     thinkinterval;
  333         vec3_t          org;
  334         vec3_t          dir;
  335         int                     color;
  336         int                     count;
  337         int                     magnitude;
  338         void            (*think)(struct cl_sustain *self);
  339 } cl_sustain_t;
  340 
  341 #define MAX_SUSTAINS            32
  342 void CL_ParticleSteamEffect2(cl_sustain_t *self);
  343 
  344 void CL_TeleporterParticles (entity_state_t *ent);
  345 void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count);
  346 void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count);
  347 
  348 // RAFAEL
  349 void CL_ParticleEffect3 (vec3_t org, vec3_t dir, int color, int count);
  350 
  351 
  352 //=================================================
  353 
  354 // ========
  355 // PGM
  356 typedef struct particle_s
  357 {
  358         struct particle_s       *next;
  359 
  360         float           time;
  361 
  362         vec3_t          org;
  363         vec3_t          vel;
  364         vec3_t          accel;
  365         float           color;
  366         float           colorvel;
  367         float           alpha;
  368         float           alphavel;
  369 } cparticle_t;
  370 
  371 
  372 #define PARTICLE_GRAVITY        40
  373 #define BLASTER_PARTICLE_COLOR          0xe0
  374 // PMM
  375 #define INSTANT_PARTICLE        -10000.0
  376 // PGM
  377 // ========
  378 
  379 void CL_ClearEffects (void);
  380 void CL_ClearTEnts (void);
  381 void CL_BlasterTrail (vec3_t start, vec3_t end);
  382 void CL_QuadTrail (vec3_t start, vec3_t end);
  383 void CL_RailTrail (vec3_t start, vec3_t end);
  384 void CL_BubbleTrail (vec3_t start, vec3_t end);
  385 void CL_FlagTrail (vec3_t start, vec3_t end, float color);
  386 
  387 // RAFAEL
  388 void CL_IonripperTrail (vec3_t start, vec3_t end);
  389 
  390 // ========
  391 // PGM
  392 void CL_BlasterParticles2 (vec3_t org, vec3_t dir, unsigned int color);
  393 void CL_BlasterTrail2 (vec3_t start, vec3_t end);
  394 void CL_DebugTrail (vec3_t start, vec3_t end);
  395 void CL_SmokeTrail (vec3_t start, vec3_t end, int colorStart, int colorRun, int spacing);
  396 void CL_Flashlight (int ent, vec3_t pos);
  397 void CL_ForceWall (vec3_t start, vec3_t end, int color);
  398 void CL_FlameEffects (centity_t *ent, vec3_t origin);
  399 void CL_GenericParticleEffect (vec3_t org, vec3_t dir, int color, int count, int numcolors, int dirspread, float alphavel);
  400 void CL_BubbleTrail2 (vec3_t start, vec3_t end, int dist);
  401 void CL_Heatbeam (vec3_t start, vec3_t end);
  402 void CL_ParticleSteamEffect (vec3_t org, vec3_t dir, int color, int count, int magnitude);
  403 void CL_TrackerTrail (vec3_t start, vec3_t end, int particleColor);
  404 void CL_Tracker_Explode(vec3_t origin);
  405 void CL_TagTrail (vec3_t start, vec3_t end, float color);
  406 void CL_ColorFlash (vec3_t pos, int ent, int intensity, float r, float g, float b);
  407 void CL_Tracker_Shell(vec3_t origin);
  408 void CL_MonsterPlasma_Shell(vec3_t origin);
  409 void CL_ColorExplosionParticles (vec3_t org, int color, int run);
  410 void CL_ParticleSmokeEffect (vec3_t org, vec3_t dir, int color, int count, int magnitude);
  411 void CL_Widowbeamout (cl_sustain_t *self);
  412 void CL_Nukeblast (cl_sustain_t *self);
  413 void CL_WidowSplash (vec3_t org);
  414 // PGM
  415 // ========
  416 
  417 int CL_ParseEntityBits (unsigned *bits);
  418 void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int number, int bits);
  419 void CL_ParseFrame (void);
  420 
  421 void CL_ParseTEnt (void);
  422 void CL_ParseConfigString (void);
  423 void CL_ParseMuzzleFlash (void);
  424 void CL_ParseMuzzleFlash2 (void);
  425 void SmokeAndFlash(vec3_t origin);
  426 
  427 void CL_SetLightstyle (int i);
  428 
  429 void CL_RunParticles (void);
  430 void CL_RunDLights (void);
  431 void CL_RunLightStyles (void);
  432 
  433 void CL_AddEntities (void);
  434 void CL_AddDLights (void);
  435 void CL_AddTEnts (void);
  436 void CL_AddLightStyles (void);
  437 
  438 //=================================================
  439 
  440 void CL_PrepRefresh (void);
  441 void CL_RegisterSounds (void);
  442 
  443 void CL_Quit_f (void);
  444 
  445 void IN_Accumulate (void);
  446 
  447 void CL_ParseLayout (void);
  448 
  449 
  450 //
  451 // cl_main
  452 //
  453 extern  refexport_t     re;             // interface to refresh .dll
  454 
  455 void CL_Init (void);
  456 
  457 void CL_FixUpGender(void);
  458 void CL_Disconnect (void);
  459 void CL_Disconnect_f (void);
  460 void CL_GetChallengePacket (void);
  461 void CL_PingServers_f (void);
  462 void CL_Snd_Restart_f (void);
  463 void CL_RequestNextDownload (void);
  464 
  465 //
  466 // cl_input
  467 //
  468 typedef struct
  469 {
  470         int                     down[2];                // key nums holding it down
  471         unsigned        downtime;               // msec timestamp
  472         unsigned        msec;                   // msec down this frame
  473         int                     state;
  474 } kbutton_t;
  475 
  476 extern  kbutton_t       in_mlook, in_klook;
  477 extern  kbutton_t       in_strafe;
  478 extern  kbutton_t       in_speed;
  479 
  480 void CL_InitInput (void);
  481 void CL_SendCmd (void);
  482 void CL_SendMove (usercmd_t *cmd);
  483 
  484 void CL_ClearState (void);
  485 
  486 void CL_ReadPackets (void);
  487 
  488 int  CL_ReadFromServer (void);
  489 void CL_WriteToServer (usercmd_t *cmd);
  490 void CL_BaseMove (usercmd_t *cmd);
  491 
  492 void IN_CenterView (void);
  493 
  494 float CL_KeyState (kbutton_t *key);
  495 char *Key_KeynumToString (int keynum);
  496 
  497 //
  498 // cl_demo.c
  499 //
  500 void CL_WriteDemoMessage (void);
  501 void CL_Stop_f (void);
  502 void CL_Record_f (void);
  503 
  504 //
  505 // cl_parse.c
  506 //
  507 extern  char *svc_strings[256];
  508 
  509 void CL_ParseServerMessage (void);
  510 void CL_LoadClientinfo (clientinfo_t *ci, char *s);
  511 void SHOWNET(char *s);
  512 void CL_ParseClientinfo (int player);
  513 void CL_Download_f (void);
  514 
  515 //
  516 // cl_view.c
  517 //
  518 extern  int                     gun_frame;
  519 extern  struct model_s  *gun_model;
  520 
  521 void V_Init (void);
  522 void V_RenderView( float stereo_separation );
  523 void V_AddEntity (entity_t *ent);
  524 void V_AddParticle (vec3_t org, int color, float alpha);
  525 void V_AddLight (vec3_t org, float intensity, float r, float g, float b);
  526 void V_AddLightStyle (int style, float r, float g, float b);
  527 
  528 //
  529 // cl_tent.c
  530 //
  531 void CL_RegisterTEntSounds (void);
  532 void CL_RegisterTEntModels (void);
  533 void CL_SmokeAndFlash(vec3_t origin);
  534 
  535 
  536 //
  537 // cl_pred.c
  538 //
  539 void CL_InitPrediction (void);
  540 void CL_PredictMove (void);
  541 void CL_CheckPredictionError (void);
  542 
  543 //
  544 // cl_fx.c
  545 //
  546 cdlight_t *CL_AllocDlight (int key);
  547 void CL_BigTeleportParticles (vec3_t org);
  548 void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old);
  549 void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags);
  550 void CL_FlyEffect (centity_t *ent, vec3_t origin);
  551 void CL_BfgParticles (entity_t *ent);
  552 void CL_AddParticles (void);
  553 void CL_EntityEvent (entity_state_t *ent);
  554 // RAFAEL
  555 void CL_TrapParticles (entity_t *ent);
  556 
  557 //
  558 // menus
  559 //
  560 void M_Init (void);
  561 void M_Keydown (int key);
  562 void M_Draw (void);
  563 void M_Menu_Main_f (void);
  564 void M_ForceMenuOff (void);
  565 void M_AddToServerList (netadr_t adr, char *info);
  566 
  567 //
  568 // cl_inv.c
  569 //
  570 void CL_ParseInventory (void);
  571 void CL_KeyInventory (int key);
  572 void CL_DrawInventory (void);
  573 
  574 //
  575 // cl_pred.c
  576 //
  577 void CL_PredictMovement (void);
  578 
  579 #if id386
580 void x86_TimerStart( void ); 581 void x86_TimerStop( void ); 582 void x86_TimerInit( unsigned long smallest, unsigned longest ); 583 unsigned long *x86_TimerGetHistogram( void );
584 #endif 585