mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-28 23:22:43 +00:00
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every usage of the cvars. Cvars no longer store the value they control, instead, they use a cexpr value object to reference the value and specify the value's type (currently, a null type is used for strings). Non-string cvars are passed through cexpr, allowing expressions in the cvars' settings. Also, cvars have returned to an enhanced version of the original (id quake) registration scheme. As a minor benefit, relevant code having direct access to the cvar-controlled variables is probably a slight optimization as it removed a pointer dereference, and the variables can be located for data locality. The static cvar descriptors are made private as an additional safety layer, though there's nothing stopping external modification via Cvar_FindVar (which is needed for adding listeners). While not used yet (partly due to working out the design), cvars can have a validation function. Registering a cvar allows a primary listener (and its data) to be specified: it will always be called first when the cvar is modified. The combination of proper listeners and direct access to the controlled variable greatly simplifies the more complex cvar interactions as much less null checking is required, and there's no need for one cvar's callback to call another's. nq-x11 is known to work at least well enough for the demos. More testing will come.
This commit is contained in:
parent
87b3c64801
commit
12c84046f3
240 changed files with 8069 additions and 4224 deletions
|
@ -55,7 +55,15 @@ typedef struct server_s {
|
|||
double timeout;
|
||||
} server_t;
|
||||
|
||||
static cvar_t *sv_console_plugin;
|
||||
static char *sv_console_plugin;
|
||||
static cvar_t sv_console_plugin_cvar = {
|
||||
.name = "sv_console_plugin",
|
||||
.description =
|
||||
"Plugin used for the console",
|
||||
.default_value = "server",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &sv_console_plugin },
|
||||
};
|
||||
SERVER_PLUGIN_PROTOS
|
||||
static plugin_list_t server_plugin_list[] = {
|
||||
SERVER_PLUGIN_LIST
|
||||
|
@ -535,10 +543,9 @@ main (int argc, const char **argv)
|
|||
|
||||
PI_Init ();
|
||||
|
||||
sv_console_plugin = Cvar_Get ("sv_console_plugin", "server",
|
||||
CVAR_ROM, 0, "Plugin used for the console");
|
||||
Cvar_Register (&sv_console_plugin_cvar, 0, 0);
|
||||
PI_RegisterPlugins (server_plugin_list);
|
||||
Con_Init (sv_console_plugin->string);
|
||||
Con_Init (sv_console_plugin);
|
||||
if (con_module)
|
||||
con_module->data->console->cbuf = mst_cbuf;
|
||||
con_list_print = Sys_Printf;
|
||||
|
|
|
@ -38,7 +38,7 @@ extern int c_brush_polys, c_alias_polys;
|
|||
extern float gl_modelalpha;
|
||||
//extern vec3_t shadecolor;
|
||||
|
||||
extern void gl_multitexture_f (struct cvar_s *var);
|
||||
extern void gl_multitexture_f (void *data, const struct cvar_s *var);
|
||||
|
||||
void glrmain_init (void);
|
||||
void gl_R_RotateForEntity (struct entity_s *e);
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef __QF_Vulkan_cvars_h
|
||||
#define __QF_Vulkan_cvars_h
|
||||
|
||||
extern struct cvar_s *vulkan_use_validation;
|
||||
extern struct cvar_s *vulkan_presentation_mode;
|
||||
extern struct cvar_s *vulkan_frame_count;
|
||||
extern int vulkan_use_validation;
|
||||
extern int vulkan_presentation_mode;
|
||||
extern int vulkan_frame_count;
|
||||
|
||||
#endif//__QF_Vulkan_cvars_h
|
||||
|
|
|
@ -85,7 +85,7 @@ struct cbuf_interpreter_s *Cmd_GetProvider(const char *name);
|
|||
|
||||
|
||||
extern struct cbuf_args_s *cmd_args;
|
||||
extern struct cvar_s *cmd_warncmd;
|
||||
extern int cmd_warncmd;
|
||||
|
||||
///@}
|
||||
|
||||
|
|
|
@ -33,31 +33,20 @@
|
|||
*/
|
||||
///@{
|
||||
|
||||
#include "QF/cexpr.h"
|
||||
#include "QF/listener.h"
|
||||
#include "QF/qtypes.h"
|
||||
#include "QF/quakeio.h"
|
||||
|
||||
typedef struct cvar_s {
|
||||
const char *name; ///< The name of the cvar.
|
||||
const char *string; ///< The current cvar value as a string.
|
||||
const char *default_string; ///< The default value of the cvar.
|
||||
int flags; ///< Cvar flags
|
||||
/** Callback for when the cvar value changes.
|
||||
|
||||
This allows for more flexibility in what happens when a cvar is
|
||||
nodifed than can be achieved with flags alone. While a similar could
|
||||
be done using commands, a cvar with a callback and CVAR_ARCHIVE set
|
||||
allows the setting to be saved automatically.
|
||||
|
||||
\param var This cvar.
|
||||
*/
|
||||
void (*callback)(struct cvar_s *var);
|
||||
const char *name;
|
||||
const char *description;
|
||||
const char *default_value;
|
||||
unsigned flags;
|
||||
exprval_t value;
|
||||
int (*validator) (const struct cvar_s *var);
|
||||
struct cvar_listener_set_s *listeners;
|
||||
const char *description; ///< for "help" command
|
||||
float value; ///< The current cvar value as a float
|
||||
int int_val; ///< The current cvar value as an integer
|
||||
vec3_t vec; ///< The current cvar value as a vector
|
||||
struct cvar_s *next; ///< \internal Linked list of cvars.
|
||||
struct cvar_s *next;
|
||||
} cvar_t;
|
||||
|
||||
typedef struct cvar_listener_set_s LISTENER_SET_TYPE (cvar_t)
|
||||
|
@ -88,16 +77,14 @@ typedef struct cvar_alias_s {
|
|||
///< (not implemented)
|
||||
#define CVAR_ROM 64 ///< display only, cannot be set
|
||||
#define CVAR_USER_CREATED 128 ///< created by a set command
|
||||
#define CVAR_REGISTERED 256 ///< var has been registered
|
||||
#define CVAR_LATCH 2048 ///< will change only when C code next does
|
||||
///< a Cvar_Get(), so it can't be changed
|
||||
///< (not implemented)
|
||||
///@}
|
||||
|
||||
|
||||
// Returns the Cvar if found, creates it with value if not. Description and
|
||||
// flags are always updated.
|
||||
cvar_t *Cvar_Get (const char *name, const char *value, int cvarflags,
|
||||
void (*callback)(cvar_t*), const char *description);
|
||||
void Cvar_Register (cvar_t *var, cvar_listener_t listener, void *data);
|
||||
|
||||
cvar_t *Cvar_FindAlias (const char *alias_name);
|
||||
|
||||
|
@ -107,17 +94,18 @@ void Cvar_AddListener (cvar_t *cvar, cvar_listener_t listener, void *data);
|
|||
void Cvar_RemoveListener (cvar_t *cvar, cvar_listener_t listener, void *data);
|
||||
|
||||
// equivelants to "<name> <variable>" typed at the console
|
||||
void Cvar_Set (cvar_t *var, const char *value);
|
||||
void Cvar_SetValue (cvar_t *var, float value);
|
||||
void Cvar_Set (const char *var, const char *value);
|
||||
void Cvar_SetVar (cvar_t *var, const char *value);
|
||||
|
||||
// allows you to change a Cvar's flags without a full Cvar_Get
|
||||
void Cvar_SetFlags (cvar_t *var, int cvarflags);
|
||||
|
||||
// returns 0 if not defined or non numeric
|
||||
float Cvar_VariableValue (const char *var_name);
|
||||
float Cvar_Value (const char *var_name);
|
||||
|
||||
// returns an empty string if not defined
|
||||
const char *Cvar_VariableString (const char *var_name);
|
||||
const char *Cvar_String (const char *var_name);
|
||||
const char *Cvar_VarString (const cvar_t *var);
|
||||
|
||||
// called by Cmd_ExecuteString when Cmd_Argv(0) doesn't match a known
|
||||
// command. Returns true if the command was a variable reference that
|
||||
|
|
|
@ -122,16 +122,16 @@ int IN_GetButtonInfo (int devid, int button_num, in_buttoninfo_t *info);
|
|||
|
||||
void IN_ProcessEvents (void);
|
||||
|
||||
void IN_UpdateGrab (struct cvar_s *);
|
||||
void IN_UpdateGrab (int grab);
|
||||
|
||||
void IN_ClearStates (void);
|
||||
|
||||
extern struct cvar_s *in_grab;
|
||||
extern struct cvar_s *in_amp;
|
||||
extern struct cvar_s *in_pre_amp;
|
||||
extern struct cvar_s *in_mouse_accel;
|
||||
extern struct cvar_s *in_freelook;
|
||||
extern struct cvar_s *lookstrafe;
|
||||
extern int in_grab;
|
||||
extern float in_amp;
|
||||
extern float in_pre_amp;
|
||||
extern int in_mouse_accel;
|
||||
extern int in_freelook;
|
||||
extern char *lookstrafe;
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
#define JOY_MAX_AXES 32
|
||||
#define JOY_MAX_BUTTONS 64
|
||||
|
||||
extern struct cvar_s *joy_device; // Joystick device name
|
||||
extern struct cvar_s *joy_enable; // Joystick enabling flag
|
||||
extern char *joy_device;
|
||||
extern int joy_enable;
|
||||
|
||||
struct joy_axis_button {
|
||||
float threshold;
|
||||
|
@ -92,7 +92,7 @@ extern struct joy_button joy_buttons[JOY_MAX_BUTTONS];
|
|||
frame.
|
||||
|
||||
You should exit this function immediately if either joy_active or
|
||||
joy_enable->int_val are zero.
|
||||
joy_enable are zero.
|
||||
*/
|
||||
void JOY_Command (void);
|
||||
void joy_clear_axis (int i);
|
||||
|
@ -103,7 +103,7 @@ void joy_clear_axis (int i);
|
|||
Use this function to process joystick movements to move the player around.
|
||||
|
||||
You should exit this function immediately if either joy_active or
|
||||
joy_enable->int_val are zero.
|
||||
joy_enable are zero.
|
||||
*/
|
||||
void JOY_Move (void);
|
||||
|
||||
|
|
|
@ -449,10 +449,11 @@ void Mod_LeafPVS_mix (const mleaf_t *leaf, const model_t *model, byte defvis,
|
|||
|
||||
void Mod_Print (void);
|
||||
|
||||
extern struct cvar_s *gl_mesh_cache;
|
||||
extern struct cvar_s *gl_subdivide_size;
|
||||
extern struct cvar_s *gl_alias_render_tri;
|
||||
extern struct cvar_s *gl_textures_external;
|
||||
extern int gl_mesh_cache;
|
||||
extern float gl_subdivide_size;
|
||||
extern int gl_alias_render_tri;
|
||||
extern int gl_textures_external;
|
||||
extern int mod_sky_divide;
|
||||
extern int mod_lightmap_bytes;
|
||||
|
||||
#endif//__QF_model_h
|
||||
|
|
|
@ -98,7 +98,7 @@ typedef struct plugin_list_s {
|
|||
/*
|
||||
Plugin system variables
|
||||
*/
|
||||
extern struct cvar_s *fs_pluginpath;
|
||||
extern char *fs_pluginpath;
|
||||
|
||||
/*
|
||||
Function prototypes
|
||||
|
|
|
@ -138,9 +138,9 @@ typedef struct vid_render_data_s {
|
|||
int scr_copytop;
|
||||
int scr_copyeverything;
|
||||
int scr_fullupdate; // set to 0 to force full redraw
|
||||
void (*viewsize_callback) (struct cvar_s *);
|
||||
struct cvar_s *scr_viewsize;
|
||||
struct cvar_s *graphheight;
|
||||
void (*viewsize_callback) (int view_size);
|
||||
int *scr_viewsize;
|
||||
int *graphheight;
|
||||
float min_wateralpha;
|
||||
qboolean force_fullscreen;
|
||||
qboolean inhibit_viewmodel;
|
||||
|
|
|
@ -1829,11 +1829,12 @@ void PR_DumpState (progs_t *pr);
|
|||
void PR_StackTrace (progs_t *pr);
|
||||
void PR_Profile (progs_t *pr);
|
||||
|
||||
extern struct cvar_s *pr_debug;
|
||||
extern struct cvar_s *pr_deadbeef_ents;
|
||||
extern struct cvar_s *pr_deadbeef_locals;
|
||||
extern struct cvar_s *pr_boundscheck;
|
||||
extern struct cvar_s *pr_faultchecks;
|
||||
extern int pr_debug;
|
||||
extern char *pr_source_path;
|
||||
extern int pr_deadbeef_ents;
|
||||
extern int pr_deadbeef_locals;
|
||||
extern int pr_boundscheck;
|
||||
extern int pr_faultchecks;
|
||||
|
||||
///@}
|
||||
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
extern int com_argc;
|
||||
extern const char **com_argv;
|
||||
extern const char *com_cmdline;
|
||||
extern struct cvar_s *fs_globalcfg;
|
||||
extern struct cvar_s *fs_usercfg;
|
||||
extern char *fs_globalcfg;
|
||||
extern char *fs_usercfg;
|
||||
|
||||
int COM_CheckParm (const char *parm) __attribute__((pure));
|
||||
void COM_AddParm (const char *parm);
|
||||
|
|
|
@ -181,7 +181,6 @@ struct progs_s;
|
|||
void R_Progs_Init (struct progs_s *pr);
|
||||
|
||||
dlight_t *R_AllocDlight (int key);
|
||||
void R_MaxDlightsCheck (struct cvar_s *var);
|
||||
void R_DecayLights (double frametime);
|
||||
void Fog_Update (float density, float red, float green, float blue,
|
||||
float time);
|
||||
|
|
|
@ -47,7 +47,10 @@ void SCR_SetFOV (float fov);
|
|||
void SCR_SetFullscreen (qboolean fullscreen);
|
||||
void SCR_SetBottomMargin (int lines);
|
||||
|
||||
extern struct cvar_s *hud_fps, *hud_time, *r_timegraph, *r_zgraph;
|
||||
extern int hud_fps;
|
||||
extern int hud_time;
|
||||
extern int r_timegraph;
|
||||
extern int r_zgraph;
|
||||
extern int scr_copytop;
|
||||
extern qboolean scr_skipupdate;
|
||||
|
||||
|
|
|
@ -40,12 +40,12 @@
|
|||
|
||||
struct dstring_s;
|
||||
|
||||
extern struct cvar_s *sys_nostdout;
|
||||
extern struct cvar_s *sys_extrasleep;
|
||||
extern struct cvar_s *sys_dead_sleep;
|
||||
extern struct cvar_s *sys_sleep;
|
||||
extern int sys_nostdout;
|
||||
extern int sys_extrasleep;
|
||||
extern int sys_dead_sleep;
|
||||
extern int sys_sleep;
|
||||
|
||||
extern struct cvar_s *developer;
|
||||
extern int developer;
|
||||
|
||||
|
||||
extern const char sys_char_map[256];
|
||||
|
|
|
@ -28,9 +28,9 @@
|
|||
#ifndef __QF_teamplay_h
|
||||
#define __QF_teamplay_h
|
||||
|
||||
extern struct cvar_s *cl_parsesay;
|
||||
extern struct cvar_s *cl_nofake;
|
||||
extern struct cvar_s *cl_freply;
|
||||
extern int cl_parsesay;
|
||||
extern int cl_nofake;
|
||||
extern float cl_freply;
|
||||
|
||||
typedef const char *(*ffunc_t) (char *args);
|
||||
typedef struct freply_s {
|
||||
|
|
|
@ -40,7 +40,7 @@ typedef struct chasestate_s {
|
|||
vec3_t player_angles;
|
||||
} chasestate_t;
|
||||
|
||||
extern struct cvar_s *chase_active;
|
||||
extern int chase_active;
|
||||
|
||||
void Chase_Init_Cvars (void);
|
||||
void Chase_Reset (void);
|
||||
|
|
|
@ -25,11 +25,29 @@
|
|||
Boston, MA 02111-1307, USA
|
||||
|
||||
*/
|
||||
#ifndef __client_hud_h_
|
||||
#define __client_hud_h_
|
||||
#ifndef __client_hud_h
|
||||
#define __client_hud_h
|
||||
|
||||
extern struct cvar_s *hud_sbar;
|
||||
extern struct cvar_s *hud_scoreboard_gravity;
|
||||
extern struct cvar_s *hud_swap;
|
||||
extern int hud_sb_lines;
|
||||
|
||||
#endif // __client_hud_h_
|
||||
extern int hud_sbar;
|
||||
extern char *hud_scoreboard_gravity;
|
||||
extern int hud_swap;
|
||||
|
||||
extern struct view_s *sbar_view;
|
||||
extern struct view_s *sbar_inventory_view;
|
||||
extern struct view_s *sbar_frags_view;
|
||||
|
||||
extern struct view_s *hud_view;
|
||||
extern struct view_s *hud_inventory_view;
|
||||
extern struct view_s *hud_armament_view;
|
||||
extern struct view_s *hud_frags_view;
|
||||
|
||||
extern struct view_s *hud_overlay_view;
|
||||
extern struct view_s *hud_stuff_view;
|
||||
extern struct view_s *hud_main_view;
|
||||
|
||||
void HUD_Init_Cvars (void);
|
||||
void HUD_Calc_sb_lines (int view_size);
|
||||
|
||||
#endif//__client_hud_h
|
||||
|
|
|
@ -33,22 +33,22 @@
|
|||
|
||||
struct cbuf_s;
|
||||
|
||||
extern struct cvar_s *cl_upspeed;
|
||||
extern struct cvar_s *cl_forwardspeed;
|
||||
extern struct cvar_s *cl_backspeed;
|
||||
extern struct cvar_s *cl_sidespeed;
|
||||
extern float cl_upspeed;
|
||||
extern float cl_forwardspeed;
|
||||
extern float cl_backspeed;
|
||||
extern float cl_sidespeed;
|
||||
|
||||
extern struct cvar_s *cl_movespeedkey;
|
||||
extern float cl_movespeedkey;
|
||||
|
||||
extern struct cvar_s *cl_yawspeed;
|
||||
extern struct cvar_s *cl_pitchspeed;
|
||||
extern float cl_yawspeed;
|
||||
extern float cl_pitchspeed;
|
||||
|
||||
extern struct cvar_s *cl_anglespeedkey;
|
||||
extern float cl_anglespeedkey;
|
||||
|
||||
extern struct cvar_s *m_pitch;
|
||||
extern struct cvar_s *m_yaw;
|
||||
extern struct cvar_s *m_forward;
|
||||
extern struct cvar_s *m_side;
|
||||
extern float m_pitch;
|
||||
extern float m_yaw;
|
||||
extern float m_forward;
|
||||
extern float m_side;
|
||||
|
||||
#define FORWARD 0
|
||||
#define SIDE 1
|
||||
|
@ -59,7 +59,7 @@ typedef struct movestate_s {
|
|||
vec4f_t angles;
|
||||
} movestate_t;
|
||||
|
||||
#define freelook (in_mlook.state & 1 || in_freelook->int_val)
|
||||
#define freelook (in_mlook.state & 1 || in_freelook)
|
||||
|
||||
struct viewstate_s;
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ extern int win_canalttab;
|
|||
extern DEVMODE win_gdevmode;
|
||||
extern struct sw_ctx_s *win_sw_context;
|
||||
extern int win_minimized;
|
||||
extern struct cvar_s *vid_ddraw;
|
||||
extern int vid_ddraw;
|
||||
extern int win_center_x, win_center_y;
|
||||
extern RECT win_rect;
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@ void X11_CloseDisplay (void);
|
|||
void X11_CreateNullCursor (void);
|
||||
void X11_CreateWindow (int, int);
|
||||
void X11_ForceViewPort (void);
|
||||
void X11_UpdateFullscreen (int fullscreen);
|
||||
void X11_Init_Cvars (void);
|
||||
void X11_OpenDisplay (void);
|
||||
void X11_ProcessEvent (void);
|
||||
|
|
|
@ -112,7 +112,7 @@ typedef struct
|
|||
int color;
|
||||
} zpointdesc_t;
|
||||
|
||||
extern struct cvar_s *r_drawflat;
|
||||
extern int r_drawflat;
|
||||
extern int r_framecount; // sequence # of current frame since Quake
|
||||
// started
|
||||
extern qboolean r_drawpolys; // 1 if driver wants clipped polygons
|
||||
|
|
|
@ -62,7 +62,7 @@ extern netadr_t net_loopback_adr;
|
|||
extern netadr_t net_from; // address of who sent the packet
|
||||
extern struct msg_s *net_message;
|
||||
|
||||
extern struct cvar_s *qport;
|
||||
extern int qport;
|
||||
|
||||
int Net_Log_Init (const char **sound_precache, int server);
|
||||
void Net_LogPrintf (const char *fmt, ...) __attribute__ ((format (PRINTF, 1, 2)));
|
||||
|
@ -72,7 +72,7 @@ void Net_LogStop (void *data);
|
|||
void Analyze_Client_Packet (const byte * data, int len, int has_sequence);
|
||||
void Analyze_Server_Packet (const byte * data, int len, int has_sequence);
|
||||
|
||||
extern struct cvar_s *net_packetlog;
|
||||
extern int net_packetlog;
|
||||
///@}
|
||||
|
||||
/** \defgroup qw-udp QuakeWorld udp support.
|
||||
|
|
|
@ -385,7 +385,7 @@ extern qboolean slistInProgress;
|
|||
extern qboolean slistSilent;
|
||||
extern qboolean slistLocal;
|
||||
|
||||
extern struct cvar_s *hostname;
|
||||
extern char *hostname;
|
||||
|
||||
extern QFile *vcrFile;
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ typedef struct {
|
|||
float entgravity;
|
||||
} movevars_t;
|
||||
|
||||
extern struct cvar_s *no_pogo_stick;
|
||||
extern int no_pogo_stick;
|
||||
extern movevars_t movevars;
|
||||
extern playermove_t pmove;
|
||||
extern int onground;
|
||||
|
|
169
include/r_cvar.h
169
include/r_cvar.h
|
@ -1,93 +1,92 @@
|
|||
#include "QF/mathlib.h"
|
||||
|
||||
extern void gl_overbright_f (struct cvar_s *cvar);
|
||||
extern void gl_overbright_f (void *data, const struct cvar_s *cvar);
|
||||
|
||||
extern struct cvar_s *cl_crossx;
|
||||
extern struct cvar_s *cl_crossy;
|
||||
extern struct cvar_s *cl_verstring;
|
||||
extern struct cvar_s *crosshair;
|
||||
extern struct cvar_s *crosshaircolor;
|
||||
extern int cl_crossx;
|
||||
extern int cl_crossy;
|
||||
extern char *cl_verstring;
|
||||
extern int crosshair;
|
||||
extern int crosshaircolor;
|
||||
extern quat_t crosshair_color;
|
||||
|
||||
extern struct cvar_s *d_mipcap;
|
||||
extern struct cvar_s *d_mipscale;
|
||||
extern float d_mipcap;
|
||||
extern float d_mipscale;
|
||||
|
||||
extern struct cvar_s *gl_affinemodels;
|
||||
extern struct cvar_s *gl_anisotropy;
|
||||
extern struct cvar_s *gl_clear;
|
||||
extern struct cvar_s *gl_conspin;
|
||||
extern struct cvar_s *gl_constretch;
|
||||
extern struct cvar_s *gl_dlight_polyblend;
|
||||
extern struct cvar_s *gl_dlight_smooth;
|
||||
extern struct cvar_s *gl_fb_bmodels;
|
||||
extern struct cvar_s *gl_fb_models;
|
||||
extern struct cvar_s *gl_finish;
|
||||
extern struct cvar_s *gl_keeptjunctions;
|
||||
extern struct cvar_s *gl_lerp_anim;
|
||||
extern struct cvar_s *gl_lightmap_align;
|
||||
extern struct cvar_s *gl_lightmap_subimage;
|
||||
extern struct cvar_s *gl_max_size;
|
||||
extern struct cvar_s *gl_multitexture;
|
||||
extern struct cvar_s *gl_nocolors;
|
||||
extern struct cvar_s *gl_overbright;
|
||||
extern struct cvar_s *gl_particle_mip;
|
||||
extern struct cvar_s *gl_particle_size;
|
||||
extern struct cvar_s *gl_picmip;
|
||||
extern struct cvar_s *gl_playermip;
|
||||
extern struct cvar_s *gl_reporttjunctions;
|
||||
extern struct cvar_s *gl_sky_clip;
|
||||
extern struct cvar_s *gl_sky_debug;
|
||||
extern struct cvar_s *gl_sky_divide;
|
||||
extern struct cvar_s *gl_sky_multipass;
|
||||
extern struct cvar_s *gl_tessellate;
|
||||
extern struct cvar_s *gl_texsort;
|
||||
extern struct cvar_s *gl_textures_bgra;
|
||||
extern struct cvar_s *gl_triplebuffer;
|
||||
extern struct cvar_s *gl_vector_light;
|
||||
extern int gl_affinemodels;
|
||||
extern float gl_anisotropy;
|
||||
extern int gl_clear;
|
||||
extern float gl_conspin;
|
||||
extern int gl_constretch;
|
||||
extern int gl_dlight_polyblend;
|
||||
extern int gl_dlight_smooth;
|
||||
extern int gl_fb_bmodels;
|
||||
extern int gl_fb_models;
|
||||
extern int gl_finish;
|
||||
extern int gl_keeptjunctions;
|
||||
extern int gl_lerp_anim;
|
||||
extern int gl_lightmap_align;
|
||||
extern int gl_lightmap_subimage;
|
||||
extern int gl_max_size;
|
||||
extern int gl_multitexture;
|
||||
extern int gl_nocolors;
|
||||
extern int gl_overbright;
|
||||
extern int gl_particle_mip;
|
||||
extern int gl_particle_size;
|
||||
extern int gl_picmip;
|
||||
extern int gl_playermip;
|
||||
extern int gl_reporttjunctions;
|
||||
extern int gl_sky_clip;
|
||||
extern int gl_sky_debug;
|
||||
extern int gl_sky_multipass;
|
||||
extern int gl_tessellate;
|
||||
extern int gl_texsort;
|
||||
extern int gl_textures_bgra;
|
||||
extern int gl_triplebuffer;
|
||||
extern int gl_vector_light;
|
||||
|
||||
extern struct cvar_s *r_aliasstats;
|
||||
extern struct cvar_s *r_aliastransadj;
|
||||
extern struct cvar_s *r_aliastransbase;
|
||||
extern struct cvar_s *r_clearcolor;
|
||||
extern struct cvar_s *r_dlight_lightmap;
|
||||
extern struct cvar_s *r_drawentities;
|
||||
extern struct cvar_s *r_drawexplosions;
|
||||
extern struct cvar_s *r_drawviewmodel;
|
||||
extern struct cvar_s *r_dspeeds;
|
||||
extern struct cvar_s *r_dynamic;
|
||||
extern struct cvar_s *r_explosionclip;
|
||||
extern struct cvar_s *r_farclip;
|
||||
extern struct cvar_s *r_firecolor;
|
||||
extern struct cvar_s *r_flatlightstyles;
|
||||
extern struct cvar_s *r_graphheight;
|
||||
extern struct cvar_s *r_lightmap_components;
|
||||
extern struct cvar_s *r_maxedges;
|
||||
extern struct cvar_s *r_maxsurfs;
|
||||
extern struct cvar_s *r_mirroralpha;
|
||||
extern struct cvar_s *r_nearclip;
|
||||
extern struct cvar_s *r_norefresh;
|
||||
extern struct cvar_s *r_novis;
|
||||
extern struct cvar_s *r_numedges;
|
||||
extern struct cvar_s *r_numsurfs;
|
||||
extern struct cvar_s *r_particles;
|
||||
extern struct cvar_s *r_particles_max;
|
||||
extern struct cvar_s *r_particles_nearclip;
|
||||
extern struct cvar_s *r_reportedgeout;
|
||||
extern struct cvar_s *r_reportsurfout;
|
||||
extern struct cvar_s *r_shadows;
|
||||
extern struct cvar_s *r_skyname;
|
||||
extern struct cvar_s *r_speeds;
|
||||
extern struct cvar_s *r_timegraph;
|
||||
extern struct cvar_s *r_wateralpha;
|
||||
extern struct cvar_s *r_waterripple;
|
||||
extern struct cvar_s *r_waterwarp;
|
||||
extern struct cvar_s *r_zgraph;
|
||||
extern int r_aliasstats;
|
||||
extern float r_aliastransadj;
|
||||
extern float r_aliastransbase;
|
||||
extern int r_clearcolor;
|
||||
extern int r_dlight_lightmap;
|
||||
extern int r_drawentities;
|
||||
extern int r_drawexplosions;
|
||||
extern int r_drawviewmodel;
|
||||
extern int r_dspeeds;
|
||||
extern int r_dynamic;
|
||||
extern int r_explosionclip;
|
||||
extern float r_farclip;
|
||||
extern vec4f_t r_firecolor;
|
||||
extern int r_flatlightstyles;
|
||||
extern int r_graphheight;
|
||||
extern int r_lightmap_components;
|
||||
extern int r_maxedges;
|
||||
extern int r_maxsurfs;
|
||||
extern float r_mirroralpha;
|
||||
extern float r_nearclip;
|
||||
extern int r_norefresh;
|
||||
extern int r_novis;
|
||||
extern int r_numedges;
|
||||
extern int r_numsurfs;
|
||||
extern int r_particles;
|
||||
extern int r_particles_max;
|
||||
extern float r_particles_nearclip;
|
||||
extern int r_reportedgeout;
|
||||
extern int r_reportsurfout;
|
||||
extern int r_shadows;
|
||||
extern char *r_skyname;
|
||||
extern int r_speeds;
|
||||
extern int r_timegraph;
|
||||
extern float r_wateralpha;
|
||||
extern float r_waterripple;
|
||||
extern int r_waterwarp;
|
||||
extern int r_zgraph;
|
||||
|
||||
extern struct cvar_s *scr_fov;
|
||||
extern struct cvar_s *scr_fisheye;
|
||||
extern struct cvar_s *scr_fviews;
|
||||
extern struct cvar_s *scr_ffov;
|
||||
extern struct cvar_s *scr_showpause;
|
||||
extern struct cvar_s *scr_showram;
|
||||
extern struct cvar_s *scr_showturtle;
|
||||
extern struct cvar_s *scr_viewsize;
|
||||
extern float scr_fov;
|
||||
extern int scr_fisheye;
|
||||
extern int scr_fviews;
|
||||
extern float scr_ffov;
|
||||
extern int scr_showpause;
|
||||
extern int scr_showram;
|
||||
extern int scr_showturtle;
|
||||
extern int scr_viewsize;
|
||||
|
|
|
@ -46,16 +46,12 @@ typedef enum {
|
|||
struct entity_s;
|
||||
|
||||
void R_PushDlights (const vec3_t entorigin);
|
||||
struct cvar_s;
|
||||
void R_MaxDlightsCheck (struct cvar_s *var);
|
||||
void R_MaxDlightsCheck (int max_dlights);
|
||||
void R_Particles_Init_Cvars (void);
|
||||
void R_InitBubble (void);
|
||||
|
||||
void R_InitParticles (void);
|
||||
void R_ClearParticles (void);
|
||||
struct cvar_s;
|
||||
void R_MaxParticlesCheck (struct cvar_s *r_particles,
|
||||
struct cvar_s *r_particles_max);
|
||||
void R_InitSprites (void);
|
||||
|
||||
#endif // _R_DYNAMIC_H
|
||||
|
|
|
@ -66,22 +66,22 @@ typedef struct {
|
|||
|
||||
//===========================================================================
|
||||
|
||||
extern struct cvar_s *r_speeds;
|
||||
extern struct cvar_s *r_timegraph;
|
||||
extern struct cvar_s *r_graphheight;
|
||||
extern struct cvar_s *r_clearcolor;
|
||||
extern struct cvar_s *r_waterwarp;
|
||||
extern struct cvar_s *r_drawentities;
|
||||
extern struct cvar_s *r_aliasstats;
|
||||
extern struct cvar_s *r_dspeeds;
|
||||
extern struct cvar_s *r_drawflat;
|
||||
extern struct cvar_s *r_ambient;
|
||||
extern struct cvar_s *r_reportsurfout;
|
||||
extern struct cvar_s *r_maxsurfs;
|
||||
extern struct cvar_s *r_numsurfs;
|
||||
extern struct cvar_s *r_reportedgeout;
|
||||
extern struct cvar_s *r_maxedges;
|
||||
extern struct cvar_s *r_numedges;
|
||||
extern int r_speeds;
|
||||
extern int r_timegraph;
|
||||
extern int r_graphheight;
|
||||
extern int r_clearcolor;
|
||||
extern int r_waterwarp;
|
||||
extern int r_drawentities;
|
||||
extern int r_aliasstats;
|
||||
extern int r_dspeeds;
|
||||
extern int r_drawflat;
|
||||
extern int r_ambient;
|
||||
extern int r_reportsurfout;
|
||||
extern int r_maxsurfs;
|
||||
extern int r_numsurfs;
|
||||
extern int r_reportedgeout;
|
||||
extern int r_maxedges;
|
||||
extern int r_numedges;
|
||||
|
||||
extern float cl_wateralpha;
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ extern float pixelAspect;
|
|||
|
||||
extern int r_drawnpolycount;
|
||||
|
||||
extern struct cvar_s *r_clearcolor;
|
||||
extern int r_clearcolor;
|
||||
|
||||
extern int sintable[SIN_BUFFER_SIZE];
|
||||
extern int intsintable[SIN_BUFFER_SIZE];
|
||||
|
|
|
@ -38,7 +38,7 @@ extern int sb_lines; // scan lines to draw
|
|||
void Sbar_Init (void);
|
||||
|
||||
struct cvar_s;
|
||||
void Sbar_DMO_Init_f (struct cvar_s *var);
|
||||
void Sbar_DMO_Init_f (void *data, const struct cvar_s *var);
|
||||
|
||||
void Sbar_Changed (void);
|
||||
// call whenever any of the client stats represented on the sbar changes
|
||||
|
|
|
@ -229,7 +229,7 @@ struct channel_s {
|
|||
//@}
|
||||
};
|
||||
|
||||
extern struct cvar_s *snd_volume;
|
||||
extern float snd_volume;
|
||||
|
||||
extern snd_render_data_t snd_render_data;
|
||||
#define PAINTBUFFER_SIZE 512
|
||||
|
|
|
@ -4,6 +4,14 @@
|
|||
#include "QF/vid.h"
|
||||
#include "QF/plugin/vid_render.h"
|
||||
|
||||
typedef struct vid_system_s {
|
||||
void (*init) (byte *palette, byte *colormap);
|
||||
void (*init_cvars) (void);
|
||||
void (*update_fullscreen) (int fullscreen);
|
||||
} vid_system_t;
|
||||
|
||||
extern vid_system_t vid_system;
|
||||
|
||||
typedef struct vid_internal_s {
|
||||
void (*flush_caches) (void *data);
|
||||
void (*init_buffers) (void *data);
|
||||
|
@ -20,15 +28,15 @@ typedef struct vid_internal_s {
|
|||
struct vulkan_ctx_s *(*vulkan_context) (void);
|
||||
} vid_internal_t;
|
||||
|
||||
extern struct cvar_s *vid_fullscreen;
|
||||
extern struct cvar_s *vid_system_gamma;
|
||||
extern struct cvar_s *vid_gamma;
|
||||
extern int vid_fullscreen;
|
||||
extern int vid_system_gamma;
|
||||
extern float vid_gamma;
|
||||
|
||||
void VID_GetWindowSize (int def_w, int def_h);
|
||||
|
||||
void VID_InitGamma (const byte *);
|
||||
qboolean VID_SetGamma (double);
|
||||
void VID_UpdateGamma (struct cvar_s *);
|
||||
void VID_UpdateGamma (void);
|
||||
|
||||
void VID_MakeColormaps (void);
|
||||
|
||||
|
|
|
@ -108,13 +108,13 @@ typedef struct vulkan_ctx_s {
|
|||
|
||||
#define qfvPushDebug(ctx, x) \
|
||||
do { \
|
||||
if (developer->int_val & SYS_vulkan) { \
|
||||
if (developer & SYS_vulkan) { \
|
||||
DARRAY_APPEND(&(ctx)->instance->debug_stack, (x)); \
|
||||
} \
|
||||
} while (0)
|
||||
#define qfvPopDebug(ctx) \
|
||||
do { \
|
||||
if (developer->int_val & SYS_vulkan) { \
|
||||
if (developer & SYS_vulkan) { \
|
||||
__auto_type ds = &(ctx)->instance->debug_stack; \
|
||||
DARRAY_REMOVE_AT(ds, ds->size - 1); \
|
||||
} \
|
||||
|
|
|
@ -40,7 +40,15 @@
|
|||
#include "QF/plugin/general.h"
|
||||
#include "QF/plugin/cd.h"
|
||||
|
||||
cvar_t *cd_plugin;
|
||||
char *cd_plugin;
|
||||
static cvar_t cd_plugin_cvar = {
|
||||
.name = "cd_plugin",
|
||||
.description =
|
||||
"CD Plugin to use",
|
||||
.default_value = CD_DEFAULT,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &cd_plugin },
|
||||
};
|
||||
plugin_t *cdmodule = NULL;
|
||||
|
||||
CD_PLUGIN_PROTOS
|
||||
|
@ -96,19 +104,18 @@ CDAudio_Init (void)
|
|||
Sys_RegisterShutdown (CDAudio_shutdown, 0);
|
||||
|
||||
PI_RegisterPlugins (cd_plugin_list);
|
||||
cd_plugin = Cvar_Get ("cd_plugin", CD_DEFAULT, CVAR_ROM, NULL,
|
||||
"CD Plugin to use");
|
||||
Cvar_Register (&cd_plugin_cvar, 0, 0);
|
||||
|
||||
if (COM_CheckParm ("-nocdaudio"))
|
||||
return 0;
|
||||
|
||||
if (!*cd_plugin->string) {
|
||||
if (!*cd_plugin) {
|
||||
Sys_Printf ("Not loading CD due to no driver\n");
|
||||
return 0;
|
||||
}
|
||||
cdmodule = PI_LoadPlugin ("cd", cd_plugin->string);
|
||||
cdmodule = PI_LoadPlugin ("cd", cd_plugin);
|
||||
if (!cdmodule) {
|
||||
Sys_Printf ("Loading of cd module: %s failed!\n", cd_plugin->string);
|
||||
Sys_Printf ("Loading of cd module: %s failed!\n", cd_plugin);
|
||||
return -1;
|
||||
}
|
||||
Cmd_AddCommand (
|
||||
|
|
|
@ -84,15 +84,31 @@ static plitem_t *play_list; // string or array of strings
|
|||
static int play_pos = -1; // position in play_list (0 for string)
|
||||
// -1 = invalid (both)
|
||||
|
||||
static cvar_t *bgmvolume; // volume cvar
|
||||
static cvar_t *mus_ogglist; // tracklist cvar
|
||||
static float bgmvolume;
|
||||
static cvar_t bgmvolume_cvar = {
|
||||
.name = "bgmvolume",
|
||||
.description =
|
||||
"Volume of CD music",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &bgmvolume },
|
||||
};
|
||||
static char *mus_ogglist;
|
||||
static cvar_t mus_ogglist_cvar = {
|
||||
.name = "mus_ogglist",
|
||||
.description =
|
||||
"filename of track to music file map",
|
||||
.default_value = "tracklist.cfg",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0, .value = &mus_ogglist },
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
set_volume (void)
|
||||
{
|
||||
if (cd_channel && cd_channel->sfx) {
|
||||
int vol = bgmvolume->value * 255;
|
||||
int vol = bgmvolume * 255;
|
||||
|
||||
cd_channel->master_vol = vol;
|
||||
cd_channel->leftvol = cd_channel->rightvol = cd_channel->master_vol;
|
||||
|
@ -151,14 +167,14 @@ Load_Tracklist (void)
|
|||
ogglistvalid = false;
|
||||
mus_enabled = false;
|
||||
|
||||
if (!mus_ogglist || strequal (mus_ogglist->string, "none")) {
|
||||
if (!mus_ogglist || strequal (mus_ogglist, "none")) {
|
||||
return -1; // bail if we don't have a valid filename
|
||||
}
|
||||
|
||||
oggfile = QFS_FOpenFile (mus_ogglist->string);
|
||||
oggfile = QFS_FOpenFile (mus_ogglist);
|
||||
if (!oggfile) {
|
||||
Sys_Printf ("Mus_OggInit: open of file \"%s\" failed\n",
|
||||
mus_ogglist->string);
|
||||
mus_ogglist);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -324,7 +340,7 @@ I_OGGMus_Info (void)
|
|||
return;
|
||||
|
||||
Sys_Printf ("\n" "Tracklist loaded from file:\n%s\n"
|
||||
"---------------------------\n", mus_ogglist->string);
|
||||
"---------------------------\n", mus_ogglist);
|
||||
|
||||
/* loop, and count up the Highest key number. */
|
||||
for (iter = 1, count = 0; count < keycount && iter <= 99 ; iter++) {
|
||||
|
@ -439,15 +455,14 @@ I_OGGMus_Update (void)
|
|||
|
||||
/* called when the mus_ogglist cvar is changed */
|
||||
static void
|
||||
Mus_OggChange (cvar_t *ogglist)
|
||||
Mus_OggChange (void *data, const cvar_t *cvar)
|
||||
{
|
||||
mus_ogglist = ogglist;
|
||||
Load_Tracklist ();
|
||||
}
|
||||
|
||||
/* change volume on sound object */
|
||||
static void
|
||||
Mus_VolChange (cvar_t *bgmvolume)
|
||||
Mus_VolChange (void *data, const cvar_t *bgmvolume)
|
||||
{
|
||||
set_volume ();
|
||||
}
|
||||
|
@ -456,18 +471,15 @@ static void
|
|||
Mus_gamedir (int phase)
|
||||
{
|
||||
if (phase)
|
||||
Mus_OggChange (mus_ogglist);
|
||||
Load_Tracklist ();
|
||||
}
|
||||
|
||||
static void
|
||||
I_OGGMus_Init (void)
|
||||
{
|
||||
/* check list file cvar, open list file, create map, close file. */
|
||||
mus_ogglist = Cvar_Get ("mus_ogglist", "tracklist.cfg", CVAR_NONE,
|
||||
Mus_OggChange,
|
||||
"filename of track to music file map");
|
||||
bgmvolume = Cvar_Get ("bgmvolume", "1.0", CVAR_ARCHIVE, Mus_VolChange,
|
||||
"Volume of CD music");
|
||||
Cvar_Register (&mus_ogglist_cvar, Mus_OggChange, 0);
|
||||
Cvar_Register (&bgmvolume_cvar, Mus_VolChange, 0);
|
||||
QFS_GamedirCallback (Mus_gamedir);
|
||||
}
|
||||
|
||||
|
|
|
@ -77,8 +77,24 @@ static byte playTrack;
|
|||
static byte maxTrack;
|
||||
static int cdfile = -1;
|
||||
|
||||
static cvar_t *mus_cddevice;
|
||||
static cvar_t *bgmvolume;
|
||||
static char *mus_cddevice;
|
||||
static cvar_t mus_cddevice_cvar = {
|
||||
.name = "mus_cddevice",
|
||||
.description =
|
||||
"device to use for CD music",
|
||||
.default_value = "/dev/cdrom",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &mus_cddevice },
|
||||
};
|
||||
static float bgmvolume;
|
||||
static cvar_t bgmvolume_cvar = {
|
||||
.name = "bgmvolume",
|
||||
.description =
|
||||
"Volume of CD music",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &bgmvolume },
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
|
@ -382,14 +398,14 @@ I_CDAudio_Update (void)
|
|||
if (!mus_enabled)
|
||||
return;
|
||||
|
||||
if (bgmvolume->value != cdvolume) {
|
||||
if (bgmvolume != cdvolume) {
|
||||
if (cdvolume) {
|
||||
Cvar_SetValue (bgmvolume, 0.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 0.0;
|
||||
cdvolume = bgmvolume;
|
||||
I_CDAudio_Pause ();
|
||||
} else {
|
||||
Cvar_SetValue (bgmvolume, 1.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 1.0;
|
||||
cdvolume = bgmvolume;
|
||||
I_CDAudio_Resume ();
|
||||
}
|
||||
}
|
||||
|
@ -412,20 +428,20 @@ I_CDAudio_Update (void)
|
|||
}
|
||||
|
||||
static void
|
||||
Mus_CDChange (cvar_t *mus_cdaudio)
|
||||
Mus_CDChange (void *data, const cvar_t *cvar)
|
||||
{
|
||||
int i;
|
||||
|
||||
I_CDAudio_Shutdown ();
|
||||
if (strequal (mus_cdaudio->string, "none")) {
|
||||
if (strequal (mus_cddevice, "none")) {
|
||||
return;
|
||||
}
|
||||
|
||||
cdfile = open (mus_cdaudio->string, O_RDONLY | O_NONBLOCK);
|
||||
cdfile = open (mus_cddevice, O_RDONLY | O_NONBLOCK);
|
||||
if (cdfile == -1) {
|
||||
Sys_MaskPrintf (SYS_snd,
|
||||
"Mus_CDInit: open device \"%s\" failed (error %i)\n",
|
||||
mus_cdaudio->string, errno);
|
||||
mus_cddevice, errno);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -443,10 +459,8 @@ Mus_CDChange (cvar_t *mus_cdaudio)
|
|||
static void
|
||||
I_CDAudio_Init (void)
|
||||
{
|
||||
mus_cddevice = Cvar_Get ("mus_cddevice", "/dev/cdrom", CVAR_NONE,
|
||||
Mus_CDChange, "device to use for CD music");
|
||||
bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, NULL,
|
||||
"Volume of CD music");
|
||||
Cvar_Register (&mus_cddevice_cvar, Mus_CDChange, 0);
|
||||
Cvar_Register (&bgmvolume_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static general_funcs_t plugin_info_general_funcs = {
|
||||
|
|
|
@ -64,7 +64,15 @@ static qboolean playLooping = false;
|
|||
static SDL_CD *cd_id;
|
||||
static float cdvolume = 1.0;
|
||||
|
||||
static cvar_t *bgmvolume;
|
||||
static float bgmvolume;
|
||||
static cvar_t bgmvolume_cvar = {
|
||||
.name = "bgmvolume",
|
||||
.description =
|
||||
"Volume of CD music",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &bgmvolume },
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
|
@ -168,15 +176,15 @@ I_CDAudio_Update (void)
|
|||
{
|
||||
if (!cd_id || !enabled)
|
||||
return;
|
||||
if (bgmvolume->value != cdvolume) {
|
||||
if (bgmvolume != cdvolume) {
|
||||
if (cdvolume) {
|
||||
Cvar_SetValue (bgmvolume, 0.0);
|
||||
bgmvolume = 0.0;
|
||||
I_CDAudio_Pause ();
|
||||
} else {
|
||||
Cvar_SetValue (bgmvolume, 1.0);
|
||||
bgmvolume = 1.0;
|
||||
I_CDAudio_Resume ();
|
||||
}
|
||||
cdvolume = bgmvolume->value;
|
||||
cdvolume = bgmvolume;
|
||||
return;
|
||||
}
|
||||
if (playLooping && (SDL_CDStatus (cd_id) != CD_PLAYING)
|
||||
|
@ -276,8 +284,7 @@ I_CDAudio_Init (void)
|
|||
cdValid = false;
|
||||
}
|
||||
|
||||
bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, NULL,
|
||||
"Volume of CD music");
|
||||
Cvar_Register (&bgmvolume_cvar, 0, 0);
|
||||
|
||||
Sys_Printf ("CD Audio Initialized.\n");
|
||||
}
|
||||
|
|
|
@ -63,7 +63,15 @@ static byte playTrack;
|
|||
static char cd_dev[] = "/dev/cdrom";
|
||||
|
||||
static CDPLAYER *cdp = NULL;
|
||||
static cvar_t *bgmvolume;
|
||||
static float bgmvolume;
|
||||
static cvar_t bgmvolume_cvar = {
|
||||
.name = "bgmvolume",
|
||||
.description =
|
||||
"Volume of CD music",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &bgmvolume },
|
||||
};
|
||||
|
||||
static void
|
||||
I_SGI_Eject (void)
|
||||
|
@ -219,14 +227,14 @@ I_SGI_Update (void)
|
|||
if (!initialized || !enabled)
|
||||
return;
|
||||
|
||||
if (bgmvolume->value != cdvolume) {
|
||||
if (bgmvolume != cdvolume) {
|
||||
if (cdvolume) {
|
||||
Cvar_SetValue (bgmvolume, 0.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 0.0;
|
||||
cdvolume = bgmvolume;
|
||||
CDAudio_Pause ();
|
||||
} else {
|
||||
Cvar_SetValue (bgmvolume, 1.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 1.0;
|
||||
cdvolume = bgmvolume;
|
||||
CDAudio_Resume ();
|
||||
}
|
||||
}
|
||||
|
@ -334,8 +342,7 @@ I_SGI_Init (void)
|
|||
{
|
||||
int i;
|
||||
|
||||
bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, NULL,
|
||||
"Volume of CD music");
|
||||
Cvar_Register (&bgmvolume_cvar, 0, 0);
|
||||
if ((i = COM_CheckParm ("-cddev")) != 0 && i < com_argc - 1) {
|
||||
strncpy (cd_dev, com_argv[i + 1], sizeof (cd_dev));
|
||||
cd_dev[sizeof (cd_dev) - 1] = 0;
|
||||
|
|
|
@ -64,7 +64,15 @@ static UINT wDeviceID;
|
|||
static void I_CDAudio_Play (int track, qboolean looping);
|
||||
static void I_CDAudio_Stop (void);
|
||||
|
||||
static cvar_t *bgmvolume;
|
||||
static float bgmvolume;
|
||||
static cvar_t bgmvolume_cvar = {
|
||||
.name = "bgmvolume",
|
||||
.description =
|
||||
"Volume of CD music",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &bgmvolume },
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
|
@ -331,14 +339,14 @@ I_CDAudio_Update (void)
|
|||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (bgmvolume->value != cdvolume) {
|
||||
if (bgmvolume != cdvolume) {
|
||||
if (cdvolume) {
|
||||
Cvar_SetValue (bgmvolume, 0.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 0.0;
|
||||
cdvolume = bgmvolume;
|
||||
I_CDAudio_Pause ();
|
||||
} else {
|
||||
Cvar_SetValue (bgmvolume, 1.0);
|
||||
cdvolume = bgmvolume->value;
|
||||
bgmvolume = 1.0;
|
||||
cdvolume = bgmvolume;
|
||||
I_CDAudio_Resume ();
|
||||
}
|
||||
}
|
||||
|
@ -483,8 +491,7 @@ I_CDAudio_Init (void)
|
|||
initialized = true;
|
||||
enabled = true;
|
||||
|
||||
bgmvolume = Cvar_Get ("bgmvolume", "1", CVAR_ARCHIVE, NULL,
|
||||
"Volume of CD music");
|
||||
Cvar_Register (&bgmvolume_cvar, 0, 0);
|
||||
|
||||
if (I_CDAudio_GetAudioDiskInfo ()) {
|
||||
Sys_Printf ("CDAudio_Init: No CD in player.\n");
|
||||
|
|
|
@ -2,39 +2,57 @@ plugin_LTLIBRARIES += @snd_render_plugins@
|
|||
noinst_LTLIBRARIES += @snd_render_static_plugins@
|
||||
EXTRA_LTLIBRARIES += libs/audio/renderer/snd_render_default.la
|
||||
|
||||
flac_src=libs/audio/renderer/flac.c
|
||||
midi_src=libs/audio/renderer/midi.c
|
||||
vorbis_src=libs/audio/renderer/vorbis.c
|
||||
wav_src=libs/audio/renderer/wav.c
|
||||
flac_src = libs/audio/renderer/flac.c
|
||||
midi_src = libs/audio/renderer/midi.c
|
||||
vorbis_src = libs/audio/renderer/vorbis.c
|
||||
wav_src = libs/audio/renderer/wav.c
|
||||
|
||||
if HAVE_FLAC
|
||||
have_flac_src=$(flac_src)
|
||||
have_flac_src = $(flac_src)
|
||||
else
|
||||
have_flac_src=
|
||||
have_flac_src =
|
||||
endif
|
||||
if HAVE_MIDI
|
||||
have_midi_src=$(midi_src)
|
||||
have_midi_src = $(midi_src)
|
||||
else
|
||||
have_midi_src=
|
||||
have_midi_src =
|
||||
endif
|
||||
if HAVE_VORBIS
|
||||
have_vorbis_src=$(vorbis_src)
|
||||
have_vorbis_src = $(vorbis_src)
|
||||
else
|
||||
have_vorbis_src=
|
||||
have_vorbis_src =
|
||||
endif
|
||||
have_wav_src=$(wav_src)
|
||||
have_wav_src = $(wav_src)
|
||||
|
||||
format_src=$(have_flac_src) $(have_midi_src) $(have_vorbis_src) $(have_wav_src)
|
||||
format_libs= \
|
||||
$(SAMPLERATE_LIBS) $(VORBISFILE_LIBS) $(VORBIS_LIBS) $(FLAC_LIBS) \
|
||||
$(OGG_LIBS) $(WM_LIBS)
|
||||
extra_format_src=libs/audio/renderer/flac.c libs/audio/renderer/midi.c libs/audio/renderer/vorbis.c libs/audio/renderer/wav.c
|
||||
snd_common=libs/audio/renderer/snd_channels.c libs/audio/renderer/snd_mem.c libs/audio/renderer/snd_mix.c libs/audio/renderer/snd_resample.c libs/audio/renderer/snd_sfx.c
|
||||
snd_libs= \
|
||||
$(SAMPLERATE_LIBS) \
|
||||
$(VORBISFILE_LIBS) \
|
||||
$(VORBIS_LIBS) \
|
||||
$(FLAC_LIBS) \
|
||||
$(OGG_LIBS) \
|
||||
$(WM_LIBS)
|
||||
extra_format_src = \
|
||||
libs/audio/renderer/flac.c \
|
||||
libs/audio/renderer/midi.c \
|
||||
libs/audio/renderer/vorbis.c \
|
||||
libs/audio/renderer/wav.c
|
||||
snd_common = \
|
||||
libs/audio/renderer/snd_channels.c \
|
||||
libs/audio/renderer/snd_mem.c \
|
||||
libs/audio/renderer/snd_mix.c \
|
||||
libs/audio/renderer/snd_resample.c \
|
||||
libs/audio/renderer/snd_sfx.c
|
||||
snd_libs = \
|
||||
libs/util/libQFutil.la
|
||||
|
||||
libs_audio_renderer_snd_render_default_la_LDFLAGS= $(plugin_ldflags)
|
||||
libs_audio_renderer_snd_render_default_la_SOURCES= libs/audio/renderer/snd_dma.c $(snd_common) $(format_src)
|
||||
libs_audio_renderer_snd_render_default_la_LIBADD= $(snd_libs) $(format_libs)
|
||||
libs_audio_renderer_snd_render_default_la_DEPENDENCIES= $(snd_libs)
|
||||
EXTRA_libs_audio_renderer_snd_render_default_la_SOURCES=$(extra_format_src)
|
||||
libs_audio_renderer_snd_render_default_la_LDFLAGS = $(plugin_ldflags)
|
||||
libs_audio_renderer_snd_render_default_la_SOURCES = \
|
||||
libs/audio/renderer/snd_dma.c \
|
||||
$(snd_common) \
|
||||
$(format_src)
|
||||
libs_audio_renderer_snd_render_default_la_LIBADD = \
|
||||
$(snd_libs) \
|
||||
$(format_libs)
|
||||
libs_audio_renderer_snd_render_default_la_DEPENDENCIES = $(snd_libs)
|
||||
EXTRA_libs_audio_renderer_snd_render_default_la_SOURCES = $(extra_format_src)
|
||||
|
|
|
@ -57,19 +57,32 @@ typedef struct {
|
|||
|
||||
static int midi_intiialized = 0;
|
||||
|
||||
static cvar_t *wildmidi_volume;
|
||||
static cvar_t *wildmidi_config;
|
||||
static char *wildmidi_volume;
|
||||
static cvar_t wildmidi_volume_cvar = {
|
||||
.name = "wildmidi_volume",
|
||||
.description =
|
||||
"Set the Master Volume",
|
||||
.default_value = "100",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &wildmidi_volume },
|
||||
};
|
||||
static char *wildmidi_config;
|
||||
static cvar_t wildmidi_config_cvar = {
|
||||
.name = "wildmidi_config",
|
||||
.description =
|
||||
"path/filename of timidity.cfg",
|
||||
.default_value = "/etc/timidity.cfg",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &wildmidi_config },
|
||||
};
|
||||
|
||||
static int
|
||||
midi_init (snd_t *snd)
|
||||
{
|
||||
wildmidi_volume = Cvar_Get ("wildmidi_volume", "100", CVAR_ARCHIVE, NULL,
|
||||
"Set the Master Volume");
|
||||
wildmidi_config = Cvar_Get ("wildmidi_config", "/etc/timidity.cfg",
|
||||
CVAR_ROM, NULL,
|
||||
"path/filename of timidity.cfg");
|
||||
Cvar_Register (&wildmidi_volume_cvar, 0, 0);
|
||||
Cvar_Register (&wildmidi_config_cvar, 0, 0);
|
||||
|
||||
if (WildMidi_Init (wildmidi_config->string, snd->speed, 0) == -1)
|
||||
if (WildMidi_Init (wildmidi_config, snd->speed, 0) == -1)
|
||||
return 1;
|
||||
midi_intiialized = 1;
|
||||
return 0;
|
||||
|
|
|
@ -71,11 +71,51 @@ static vec4f_t listener_forward;
|
|||
static vec4f_t listener_right;
|
||||
static vec4f_t listener_up;
|
||||
|
||||
static cvar_t *snd_phasesep;
|
||||
static cvar_t *snd_volumesep;
|
||||
static cvar_t *snd_swapchannelside;
|
||||
static cvar_t *ambient_fade;
|
||||
static cvar_t *ambient_level;
|
||||
static float snd_phasesep;
|
||||
static cvar_t snd_phasesep_cvar = {
|
||||
.name = "snd_phasesep",
|
||||
.description =
|
||||
"max stereo phase separation in ms. 0.6 is for 20cm head",
|
||||
.default_value = "0.0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &snd_phasesep },
|
||||
};
|
||||
static float snd_volumesep;
|
||||
static cvar_t snd_volumesep_cvar = {
|
||||
.name = "snd_volumesep",
|
||||
.description =
|
||||
"max stereo volume separation. 1.0 is max",
|
||||
.default_value = "1.0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &snd_volumesep },
|
||||
};
|
||||
static int snd_swapchannelside;
|
||||
static cvar_t snd_swapchannelside_cvar = {
|
||||
.name = "snd_swapchannelside",
|
||||
.description =
|
||||
"Toggle swapping of left and right channels",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &snd_swapchannelside },
|
||||
};
|
||||
static float ambient_fade;
|
||||
static cvar_t ambient_fade_cvar = {
|
||||
.name = "ambient_fade",
|
||||
.description =
|
||||
"How quickly ambient sounds fade in or out",
|
||||
.default_value = "100",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &ambient_fade },
|
||||
};
|
||||
static float ambient_level;
|
||||
static cvar_t ambient_level_cvar = {
|
||||
.name = "ambient_level",
|
||||
.description =
|
||||
"Ambient sounds' volume",
|
||||
.default_value = "0.3",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &ambient_level },
|
||||
};
|
||||
|
||||
static inline channel_t *
|
||||
unlink_channel (channel_t **_ch)
|
||||
|
@ -320,18 +360,11 @@ SND_Channels_Init (snd_t *snd)
|
|||
{
|
||||
int i;
|
||||
|
||||
snd_phasesep = Cvar_Get ("snd_phasesep", "0.0", CVAR_ARCHIVE, NULL,
|
||||
"max stereo phase separation in ms. 0.6 is for "
|
||||
"20cm head");
|
||||
snd_volumesep = Cvar_Get ("snd_volumesep", "1.0", CVAR_ARCHIVE, NULL,
|
||||
"max stereo volume separation. 1.0 is max");
|
||||
snd_swapchannelside = Cvar_Get ("snd_swapchannelside", "0", CVAR_ARCHIVE,
|
||||
NULL, "Toggle swapping of left and right "
|
||||
"channels");
|
||||
ambient_fade = Cvar_Get ("ambient_fade", "100", CVAR_NONE, NULL,
|
||||
"How quickly ambient sounds fade in or out");
|
||||
ambient_level = Cvar_Get ("ambient_level", "0.3", CVAR_NONE, NULL,
|
||||
"Ambient sounds' volume");
|
||||
Cvar_Register (&snd_phasesep_cvar, 0, 0);
|
||||
Cvar_Register (&snd_volumesep_cvar, 0, 0);
|
||||
Cvar_Register (&snd_swapchannelside_cvar, 0, 0);
|
||||
Cvar_Register (&ambient_fade_cvar, 0, 0);
|
||||
Cvar_Register (&ambient_level_cvar, 0, 0);
|
||||
|
||||
Cmd_AddDataCommand ("play", s_play_f, snd,
|
||||
"Play selected sound effect (play pathto/sound.wav)");
|
||||
|
@ -408,7 +441,7 @@ s_updateAmbientSounds (snd_t *snd, const byte *ambient_sound_level)
|
|||
if (!snd_ambient)
|
||||
return;
|
||||
// calc ambient sound levels
|
||||
if (!ambient_sound_level || !ambient_level->value) {
|
||||
if (!ambient_sound_level || !ambient_level) {
|
||||
// if we're not in a leaf (huh?) or ambients have been turned off,
|
||||
// stop all ambient channels.
|
||||
for (ambient_channel = 0; ambient_channel < NUM_AMBIENTS;
|
||||
|
@ -447,19 +480,19 @@ s_updateAmbientSounds (snd_t *snd, const byte *ambient_sound_level)
|
|||
// sfx will be written to chan->sfx later to ensure mixer doesn't use
|
||||
// channel prematurely.
|
||||
|
||||
vol = ambient_level->value * ambient_sound_level[ambient_channel];
|
||||
vol = ambient_level * ambient_sound_level[ambient_channel];
|
||||
if (vol < 8)
|
||||
vol = 0;
|
||||
|
||||
// don't adjust volume too fast
|
||||
if (chan->master_vol < vol) {
|
||||
chan->master_vol += *snd_render_data.host_frametime
|
||||
* ambient_fade->value;
|
||||
* ambient_fade;
|
||||
if (chan->master_vol > vol)
|
||||
chan->master_vol = vol;
|
||||
} else if (chan->master_vol > vol) {
|
||||
chan->master_vol -= *snd_render_data.host_frametime
|
||||
* ambient_fade->value;
|
||||
* ambient_fade;
|
||||
if (chan->master_vol < vol)
|
||||
chan->master_vol = vol;
|
||||
}
|
||||
|
@ -494,7 +527,7 @@ s_spatialize (snd_t *snd, channel_t *ch)
|
|||
dist = VectorNormalize (source_vec) * ch->dist_mult;
|
||||
|
||||
dot = DotProduct (listener_right, source_vec);
|
||||
if (snd_swapchannelside->int_val)
|
||||
if (snd_swapchannelside)
|
||||
dot = -dot;
|
||||
|
||||
if (snd->channels == 1) {
|
||||
|
@ -502,9 +535,9 @@ s_spatialize (snd_t *snd, channel_t *ch)
|
|||
lscale = 1.0;
|
||||
phase = 0;
|
||||
} else {
|
||||
rscale = 1.0 + dot * snd_volumesep->value;
|
||||
lscale = 1.0 - dot * snd_volumesep->value;
|
||||
phase = snd_phasesep->value * 0.001 * snd->speed * dot;
|
||||
rscale = 1.0 + dot * snd_volumesep;
|
||||
lscale = 1.0 - dot * snd_volumesep;
|
||||
phase = snd_phasesep * 0.001 * snd->speed * dot;
|
||||
}
|
||||
|
||||
// add in distance effect
|
||||
|
|
|
@ -60,10 +60,52 @@ static unsigned soundtime; // sample PAIRS
|
|||
static int sound_started = 0;
|
||||
|
||||
|
||||
static cvar_t *nosound;
|
||||
static cvar_t *snd_mixahead;
|
||||
static cvar_t *snd_noextraupdate;
|
||||
static cvar_t *snd_show;
|
||||
float snd_volume;
|
||||
static cvar_t snd_volume_cvar = {
|
||||
.name = "volume",
|
||||
.description =
|
||||
"Set the volume for sound playback",
|
||||
.default_value = "0.7",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &snd_volume },
|
||||
};
|
||||
static char *nosound;
|
||||
static cvar_t nosound_cvar = {
|
||||
.name = "nosound",
|
||||
.description =
|
||||
"Set to turn sound off",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &nosound },
|
||||
};
|
||||
static float snd_mixahead;
|
||||
static cvar_t snd_mixahead_cvar = {
|
||||
.name = "snd_mixahead",
|
||||
.description =
|
||||
"Delay time for sounds",
|
||||
.default_value = "0.1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &snd_mixahead },
|
||||
};
|
||||
static int snd_noextraupdate;
|
||||
static cvar_t snd_noextraupdate_cvar = {
|
||||
.name = "snd_noextraupdate",
|
||||
.description =
|
||||
"Toggles the correct value display in host_speeds. Usually messes up "
|
||||
"sound playback when in effect",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &snd_noextraupdate },
|
||||
};
|
||||
static char *snd_show;
|
||||
static cvar_t snd_show_cvar = {
|
||||
.name = "snd_show",
|
||||
.description =
|
||||
"Toggles display of sounds currently being played",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &snd_show },
|
||||
};
|
||||
|
||||
static general_data_t plugin_info_general_data;
|
||||
|
||||
|
@ -196,7 +238,7 @@ s_update_ (void)
|
|||
snd.paintedtime = soundtime;
|
||||
}
|
||||
// mix ahead of current position
|
||||
endtime = soundtime + snd_mixahead->value * snd.speed;
|
||||
endtime = soundtime + snd_mixahead * snd.speed;
|
||||
samps = snd.frames;
|
||||
if (endtime - soundtime > samps)
|
||||
endtime = soundtime + samps;
|
||||
|
@ -233,7 +275,7 @@ static void
|
|||
s_extra_update (void)
|
||||
{
|
||||
if (snd_output_data->model == som_push) {
|
||||
if (!sound_started || snd_noextraupdate->int_val)
|
||||
if (!sound_started || snd_noextraupdate)
|
||||
return; // don't pollute timings
|
||||
s_update_ ();
|
||||
}
|
||||
|
@ -315,18 +357,11 @@ s_snd_force_unblock (void)
|
|||
static void
|
||||
s_init_cvars (void)
|
||||
{
|
||||
nosound = Cvar_Get ("nosound", "0", CVAR_NONE, NULL,
|
||||
"Set to turn sound off");
|
||||
snd_volume = Cvar_Get ("volume", "0.7", CVAR_ARCHIVE, NULL,
|
||||
"Set the volume for sound playback");
|
||||
snd_mixahead = Cvar_Get ("snd_mixahead", "0.1", CVAR_ARCHIVE, NULL,
|
||||
"Delay time for sounds");
|
||||
snd_noextraupdate = Cvar_Get ("snd_noextraupdate", "0", CVAR_NONE, NULL,
|
||||
"Toggles the correct value display in "
|
||||
"host_speeds. Usually messes up sound "
|
||||
"playback when in effect");
|
||||
snd_show = Cvar_Get ("snd_show", "0", CVAR_NONE, NULL,
|
||||
"Toggles display of sounds currently being played");
|
||||
Cvar_Register (&nosound_cvar, 0, 0);
|
||||
Cvar_Register (&snd_volume_cvar, 0, 0);
|
||||
Cvar_Register (&snd_mixahead_cvar, 0, 0);
|
||||
Cvar_Register (&snd_noextraupdate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_show_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -344,13 +379,6 @@ s_init (void)
|
|||
Cmd_AddCommand ("snd_force_unblock", s_snd_force_unblock,
|
||||
"fix permanently blocked sound");
|
||||
|
||||
// FIXME
|
||||
//extern struct cvar_s *snd_loadas8bit;
|
||||
// if (host_parms.memsize < 0x800000) {
|
||||
// Cvar_Set (snd_loadas8bit, "1");
|
||||
// Sys_Printf ("loading all sounds as 8bit\n");
|
||||
// }
|
||||
|
||||
snd_initialized = true;
|
||||
|
||||
s_startup ();
|
||||
|
|
|
@ -48,8 +48,6 @@
|
|||
// note: must be >= 255 due to the channel
|
||||
// volumes being 0-255.
|
||||
|
||||
cvar_t *snd_volume;
|
||||
|
||||
portable_samplepair_t snd_paintbuffer[PAINTBUFFER_SIZE * 2];
|
||||
static int max_overpaint; // number of extra samples painted
|
||||
// due to phase shift
|
||||
|
@ -170,7 +168,7 @@ SND_PaintChannels (snd_t *snd, unsigned endtime)
|
|||
|
||||
// transfer out according to DMA format
|
||||
snd->xfer (snd, snd_paintbuffer, end - snd->paintedtime,
|
||||
snd_volume->value);
|
||||
snd_volume);
|
||||
|
||||
memmove (snd_paintbuffer, snd_paintbuffer + end - snd->paintedtime,
|
||||
max_overpaint * sizeof (snd_paintbuffer[0]));
|
||||
|
|
|
@ -53,7 +53,15 @@ static sfx_t snd_sfx[MAX_SFX];
|
|||
static int snd_num_sfx;
|
||||
static hashtab_t *snd_sfx_hash;
|
||||
|
||||
static cvar_t *precache;
|
||||
static int precache;
|
||||
static cvar_t precache_cvar = {
|
||||
.name = "precache",
|
||||
.description =
|
||||
"Toggle the use of a precache",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &precache },
|
||||
};
|
||||
|
||||
static const char *
|
||||
snd_sfx_getkey (const void *sfx, void *unused)
|
||||
|
@ -203,7 +211,7 @@ SND_PrecacheSound (snd_t *snd, const char *name)
|
|||
Sys_Error ("SND_PrecacheSound: NULL");
|
||||
|
||||
sfx = SND_LoadSound (snd, va (0, "sound/%s", name));
|
||||
if (sfx && precache->int_val) {
|
||||
if (sfx && precache) {
|
||||
if (sfx->retain (sfx))
|
||||
sfx->release (sfx);
|
||||
}
|
||||
|
@ -249,8 +257,7 @@ void
|
|||
SND_SFX_Init (snd_t *snd)
|
||||
{
|
||||
snd_sfx_hash = Hash_NewTable (511, snd_sfx_getkey, snd_sfx_free, 0, 0);
|
||||
precache = Cvar_Get ("precache", "1", CVAR_NONE, NULL,
|
||||
"Toggle the use of a precache");
|
||||
Cvar_Register (&precache_cvar, 0, 0);
|
||||
|
||||
QFS_GamedirCallback (s_gamedir);
|
||||
|
||||
|
|
|
@ -37,8 +37,24 @@
|
|||
|
||||
#include "snd_internal.h"
|
||||
|
||||
static cvar_t *snd_output;
|
||||
static cvar_t *snd_render;
|
||||
static char *snd_output;
|
||||
static cvar_t snd_output_cvar = {
|
||||
.name = "snd_output",
|
||||
.description =
|
||||
"Sound Output Plugin to use",
|
||||
.default_value = SND_OUTPUT_DEFAULT,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_output },
|
||||
};
|
||||
static char *snd_render;
|
||||
static cvar_t snd_render_cvar = {
|
||||
.name = "snd_render",
|
||||
.description =
|
||||
"Sound Renderer Plugin to use",
|
||||
.default_value = "default",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_render },
|
||||
};
|
||||
static plugin_t *snd_render_module = NULL;
|
||||
static plugin_t *snd_output_module = NULL;
|
||||
static snd_render_funcs_t *snd_render_funcs = NULL;
|
||||
|
@ -73,7 +89,7 @@ S_Init (int *viewentity, double *host_frametime)
|
|||
if (COM_CheckParm ("-nosound"))
|
||||
return;
|
||||
|
||||
if (!*snd_output->string || !*snd_render->string) {
|
||||
if (!*snd_output || !*snd_render) {
|
||||
Sys_Printf ("Not loading sound due to no renderer/output\n");
|
||||
return;
|
||||
}
|
||||
|
@ -82,15 +98,15 @@ S_Init (int *viewentity, double *host_frametime)
|
|||
|
||||
PI_RegisterPlugins (snd_output_list);
|
||||
PI_RegisterPlugins (snd_render_list);
|
||||
snd_output_module = PI_LoadPlugin ("snd_output", snd_output->string);
|
||||
snd_output_module = PI_LoadPlugin ("snd_output", snd_output);
|
||||
if (!snd_output_module) {
|
||||
Sys_Printf ("Loading of sound output module: %s failed!\n",
|
||||
snd_output->string);
|
||||
snd_output);
|
||||
} else {
|
||||
snd_render_module = PI_LoadPlugin ("snd_render", snd_render->string);
|
||||
snd_render_module = PI_LoadPlugin ("snd_render", snd_render);
|
||||
if (!snd_render_module) {
|
||||
Sys_Printf ("Loading of sound render module: %s failed!\n",
|
||||
snd_render->string);
|
||||
snd_render);
|
||||
PI_UnloadPlugin (snd_output_module);
|
||||
snd_output_module = NULL;
|
||||
} else {
|
||||
|
@ -114,10 +130,8 @@ S_Init (int *viewentity, double *host_frametime)
|
|||
VISIBLE void
|
||||
S_Init_Cvars (void)
|
||||
{
|
||||
snd_output = Cvar_Get ("snd_output", SND_OUTPUT_DEFAULT, CVAR_ROM, NULL,
|
||||
"Sound Output Plugin to use");
|
||||
snd_render = Cvar_Get ("snd_render", "default", CVAR_ROM, NULL,
|
||||
"Sound Renderer Plugin to use");
|
||||
Cvar_Register (&snd_output_cvar, 0, 0);
|
||||
Cvar_Register (&snd_render_cvar, 0, 0);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -53,10 +53,42 @@ static void *alsa_handle;
|
|||
static snd_pcm_t *pcm;
|
||||
static snd_async_handler_t *async_handler;
|
||||
|
||||
static cvar_t *snd_bits;
|
||||
static cvar_t *snd_device;
|
||||
static cvar_t *snd_rate;
|
||||
static cvar_t *snd_stereo;
|
||||
static int snd_bits;
|
||||
static cvar_t snd_bits_cvar = {
|
||||
.name = "snd_bits",
|
||||
.description =
|
||||
"sound sample depth. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_bits },
|
||||
};
|
||||
static char *snd_device;
|
||||
static cvar_t snd_device_cvar = {
|
||||
.name = "snd_device",
|
||||
.description =
|
||||
"sound device. \"\" is system default",
|
||||
.default_value = "",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_device },
|
||||
};
|
||||
static int snd_rate;
|
||||
static cvar_t snd_rate_cvar = {
|
||||
.name = "snd_rate",
|
||||
.description =
|
||||
"sound playback rate. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_rate },
|
||||
};
|
||||
static int snd_stereo;
|
||||
static cvar_t snd_stereo_cvar = {
|
||||
.name = "snd_stereo",
|
||||
.description =
|
||||
"sound stereo output",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_stereo },
|
||||
};
|
||||
|
||||
//FIXME xfer probably should not be touching this (such data should probably
|
||||
//come through snd_t)
|
||||
|
@ -92,14 +124,10 @@ load_libasound (void)
|
|||
static void
|
||||
SNDDMA_Init_Cvars (void)
|
||||
{
|
||||
snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, NULL,
|
||||
"sound stereo output");
|
||||
snd_rate = Cvar_Get ("snd_rate", "0", CVAR_ROM, NULL,
|
||||
"sound playback rate. 0 is system default");
|
||||
snd_device = Cvar_Get ("snd_device", "", CVAR_ROM, NULL,
|
||||
"sound device. \"\" is system default");
|
||||
snd_bits = Cvar_Get ("snd_bits", "0", CVAR_ROM, NULL,
|
||||
"sound sample depth. 0 is system default");
|
||||
Cvar_Register (&snd_stereo_cvar, 0, 0);
|
||||
Cvar_Register (&snd_rate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_device_cvar, 0, 0);
|
||||
Cvar_Register (&snd_bits_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static __attribute__((const)) snd_pcm_uframes_t
|
||||
|
@ -415,13 +443,13 @@ alsa_playback_set_bps (snd_t *snd, snd_pcm_hw_params_t *hw)
|
|||
int res;
|
||||
int bps = 0;
|
||||
|
||||
if (snd_bits->int_val == 16) {
|
||||
if (snd_bits == 16) {
|
||||
bps = SND_PCM_FORMAT_S16_LE;
|
||||
snd->samplebits = 16;
|
||||
} else if (snd_bits->int_val == 8) {
|
||||
} else if (snd_bits == 8) {
|
||||
bps = SND_PCM_FORMAT_U8;
|
||||
snd->samplebits = 8;
|
||||
} else if (snd_bits->int_val) {
|
||||
} else if (snd_bits) {
|
||||
Sys_Printf ("snd_alsa: invalid sample bits: %d\n", bps);
|
||||
return 0;
|
||||
}
|
||||
|
@ -454,7 +482,7 @@ alsa_playback_set_channels (snd_t *snd, snd_pcm_hw_params_t *hw)
|
|||
int res;
|
||||
int channels = 1;
|
||||
|
||||
if (snd_stereo->int_val) {
|
||||
if (snd_stereo) {
|
||||
channels = 2;
|
||||
}
|
||||
if ((res = qfsnd_pcm_hw_params_set_channels (pcm, hw, channels)) == 0) {
|
||||
|
@ -473,8 +501,8 @@ alsa_playback_set_rate (snd_t *snd, snd_pcm_hw_params_t *hw)
|
|||
unsigned rate = 0;
|
||||
static int default_rates[] = { 48000, 44100, 22050, 11025, 0 };
|
||||
|
||||
if (snd_rate->int_val) {
|
||||
rate = snd_rate->int_val;
|
||||
if (snd_rate) {
|
||||
rate = snd_rate;
|
||||
}
|
||||
|
||||
if (rate) {
|
||||
|
@ -531,7 +559,7 @@ static int
|
|||
SNDDMA_Init (snd_t *snd)
|
||||
{
|
||||
int res;
|
||||
const char *device = snd_device->string;
|
||||
const char *device = snd_device;
|
||||
|
||||
snd_pcm_hw_params_t *hw;
|
||||
snd_pcm_sw_params_t *sw;
|
||||
|
|
|
@ -83,21 +83,42 @@ static HINSTANCE hInstDS;
|
|||
|
||||
static sndinitstat SNDDMA_InitDirect (snd_t *snd);
|
||||
|
||||
static cvar_t *snd_stereo;
|
||||
static cvar_t *snd_rate;
|
||||
static cvar_t *snd_bits;
|
||||
static int snd_stereo;
|
||||
static cvar_t snd_stereo_cvar = {
|
||||
.name = "snd_stereo",
|
||||
.description =
|
||||
"sound stereo output",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_stereo },
|
||||
};
|
||||
static int snd_rate;
|
||||
static cvar_t snd_rate_cvar = {
|
||||
.name = "snd_rate",
|
||||
.description =
|
||||
"sound playback rate. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_rate },
|
||||
};
|
||||
static int snd_bits;
|
||||
static cvar_t snd_bits_cvar = {
|
||||
.name = "snd_bits",
|
||||
.description =
|
||||
"sound sample depth. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_bits },
|
||||
};
|
||||
|
||||
static DWORD *DSOUND_LockBuffer (snd_t *snd, qboolean lockit);
|
||||
|
||||
static void
|
||||
SNDDMA_Init_Cvars (void)
|
||||
{
|
||||
snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, NULL,
|
||||
"sound stereo output");
|
||||
snd_rate = Cvar_Get ("snd_rate", "11025", CVAR_ROM, NULL,
|
||||
"sound playback rate. 0 is system default");
|
||||
snd_bits = Cvar_Get ("snd_bits", "16", CVAR_ROM, NULL,
|
||||
"sound sample depth. 0 is system default");
|
||||
Cvar_Register (&snd_stereo_cvar, 0, 0);
|
||||
Cvar_Register (&snd_rate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_bits_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -152,14 +173,14 @@ SNDDMA_InitDirect (snd_t *snd)
|
|||
HRESULT hresult;
|
||||
WAVEFORMATEX format, pformat;
|
||||
|
||||
if (!snd_stereo->int_val) {
|
||||
if (!snd_stereo) {
|
||||
snd->channels = 1;
|
||||
} else {
|
||||
snd->channels = 2;
|
||||
}
|
||||
|
||||
snd->samplebits = snd_bits->int_val;
|
||||
snd->speed = snd_rate->int_val;
|
||||
snd->samplebits = snd_bits;
|
||||
snd->speed = snd_rate;
|
||||
|
||||
memset (&format, 0, sizeof (format));
|
||||
format.wFormatTag = WAVE_FORMAT_PCM;
|
||||
|
|
|
@ -55,8 +55,25 @@ static double snd_alive_time = 0;
|
|||
static jack_client_t *jack_handle;
|
||||
static jack_port_t *jack_out[2];
|
||||
static float *output[2];
|
||||
static cvar_t *snd_jack_server;
|
||||
static cvar_t *snd_jack_ports;
|
||||
static char *snd_jack_server;
|
||||
static cvar_t snd_jack_server_cvar = {
|
||||
.name = "snd_jack_server",
|
||||
.description =
|
||||
"The name of the JACK server to connect to",
|
||||
.default_value = "default",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_jack_server },
|
||||
};
|
||||
static char *snd_jack_ports;
|
||||
static cvar_t snd_jack_ports_cvar = {
|
||||
.name = "snd_jack_ports",
|
||||
.description =
|
||||
"; separated list of port names to which QF will connect. Defaults to "
|
||||
"the first two physical ports. Currently only two ports are supported.",
|
||||
.default_value = "",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_jack_ports },
|
||||
};
|
||||
|
||||
static int s_jack_connect (snd_t *snd);
|
||||
|
||||
|
@ -126,13 +143,13 @@ s_jack_activate (void)
|
|||
int i;
|
||||
|
||||
snd_shutdown = 0;
|
||||
if (!*snd_jack_ports->string) {
|
||||
if (!*snd_jack_ports) {
|
||||
ports = jack_get_ports (jack_handle, 0, 0,
|
||||
JackPortIsPhysical | JackPortIsInput);
|
||||
} else {
|
||||
ports = s_jack_parse_ports (snd_jack_ports->string);
|
||||
ports = s_jack_parse_ports (snd_jack_ports);
|
||||
}
|
||||
if (developer->int_val & SYS_snd) {
|
||||
if (developer & SYS_snd) {
|
||||
for (i = 0; ports[i]; i++) {
|
||||
Sys_Printf ("%s\n", ports[i]);
|
||||
}
|
||||
|
@ -222,7 +239,7 @@ snd_jack_error (const char *desc)
|
|||
static int
|
||||
snd_jack_xrun (void *arg)
|
||||
{
|
||||
if (developer->int_val & SYS_snd) {
|
||||
if (developer & SYS_snd) {
|
||||
fprintf (stderr, "snd_jack: xrun\n");
|
||||
}
|
||||
return 0;
|
||||
|
@ -236,7 +253,7 @@ s_jack_connect (snd_t *snd)
|
|||
jack_set_error_function (snd_jack_error);
|
||||
if ((jack_handle = jack_client_open ("QuakeForge",
|
||||
JackServerName | JackNoStartServer, 0,
|
||||
snd_jack_server->string)) == 0) {
|
||||
snd_jack_server)) == 0) {
|
||||
Sys_Printf ("Could not connect to JACK\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -280,13 +297,8 @@ s_shutdown (snd_t *snd)
|
|||
static void
|
||||
s_init_cvars (void)
|
||||
{
|
||||
snd_jack_server = Cvar_Get ("snd_jack_server", "default", CVAR_ROM, NULL,
|
||||
"The name of the JACK server to connect to");
|
||||
snd_jack_ports = Cvar_Get ("snd_jack_ports", "", CVAR_ROM, NULL,
|
||||
"; separated list of port names to which QF "
|
||||
"will connect. Defaults to the first two "
|
||||
"physical ports. Currently only two ports "
|
||||
"are supported.");
|
||||
Cvar_Register (&snd_jack_server_cvar, 0, 0);
|
||||
Cvar_Register (&snd_jack_ports_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static general_funcs_t plugin_info_general_funcs = {
|
||||
|
|
|
@ -81,11 +81,51 @@ static const char *snd_dev = "/dev/dsp";
|
|||
|
||||
static int tryrates[] = { 44100, 48000, 11025, 22050, 22051, 44100, 8000 };
|
||||
|
||||
static cvar_t *snd_stereo;
|
||||
static cvar_t *snd_rate;
|
||||
static cvar_t *snd_device;
|
||||
static cvar_t *snd_bits;
|
||||
static cvar_t *snd_oss_mmaped;
|
||||
static int snd_stereo;
|
||||
static cvar_t snd_stereo_cvar = {
|
||||
.name = "snd_stereo",
|
||||
.description =
|
||||
"sound stereo output",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_stereo },
|
||||
};
|
||||
static int snd_rate;
|
||||
static cvar_t snd_rate_cvar = {
|
||||
.name = "snd_rate",
|
||||
.description =
|
||||
"sound playback rate. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_rate },
|
||||
};
|
||||
static char *snd_device;
|
||||
static cvar_t snd_device_cvar = {
|
||||
.name = "snd_device",
|
||||
.description =
|
||||
"sound device. \"\" is system default",
|
||||
.default_value = "",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &snd_device },
|
||||
};
|
||||
static int snd_bits;
|
||||
static cvar_t snd_bits_cvar = {
|
||||
.name = "snd_bits",
|
||||
.description =
|
||||
"sound sample depth. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_bits },
|
||||
};
|
||||
static int snd_oss_mmaped;
|
||||
static cvar_t snd_oss_mmaped_cvar = {
|
||||
.name = "snd_oss_mmaped",
|
||||
.description =
|
||||
"mmaped io",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_oss_mmaped },
|
||||
};
|
||||
|
||||
static plugin_t plugin_info;
|
||||
static plugin_data_t plugin_info_data;
|
||||
|
@ -99,16 +139,11 @@ static snd_output_funcs_t plugin_info_snd_output_funcs;
|
|||
static void
|
||||
SNDDMA_Init_Cvars (void)
|
||||
{
|
||||
snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, NULL,
|
||||
"sound stereo output");
|
||||
snd_rate = Cvar_Get ("snd_rate", "0", CVAR_ROM, NULL,
|
||||
"sound playback rate. 0 is system default");
|
||||
snd_device = Cvar_Get ("snd_device", "", CVAR_ROM, NULL,
|
||||
"sound device. \"\" is system default");
|
||||
snd_bits = Cvar_Get ("snd_bits", "0", CVAR_ROM, NULL,
|
||||
"sound sample depth. 0 is system default");
|
||||
snd_oss_mmaped = Cvar_Get ("snd_oss_mmaped", "1", CVAR_ROM, NULL,
|
||||
"mmaped io");
|
||||
Cvar_Register (&snd_stereo_cvar, 0, 0);
|
||||
Cvar_Register (&snd_rate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_device_cvar, 0, 0);
|
||||
Cvar_Register (&snd_bits_cvar, 0, 0);
|
||||
Cvar_Register (&snd_oss_mmaped_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -122,11 +157,11 @@ try_open (snd_t *snd, int rw)
|
|||
struct audio_buf_info info;
|
||||
|
||||
snd_inited = 0;
|
||||
mmaped_io = snd_oss_mmaped->int_val;
|
||||
mmaped_io = snd_oss_mmaped;
|
||||
|
||||
// open snd_dev, confirm capability to mmap, and get size of dma buffer
|
||||
if (snd_device->string[0])
|
||||
snd_dev = snd_device->string;
|
||||
if (snd_device[0])
|
||||
snd_dev = snd_device;
|
||||
|
||||
if (rw) {
|
||||
omode = O_RDWR;
|
||||
|
@ -168,7 +203,7 @@ try_open (snd_t *snd, int rw)
|
|||
}
|
||||
|
||||
// set sample bits & speed
|
||||
snd->samplebits = snd_bits->int_val;
|
||||
snd->samplebits = snd_bits;
|
||||
|
||||
if (snd->samplebits != 16 && snd->samplebits != 8) {
|
||||
ioctl (audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
|
||||
|
@ -216,8 +251,8 @@ try_open (snd_t *snd, int rw)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (snd_rate->int_val) {
|
||||
snd->speed = snd_rate->int_val;
|
||||
if (snd_rate) {
|
||||
snd->speed = snd_rate;
|
||||
} else {
|
||||
for (i = 0; i < ((int) sizeof (tryrates) / 4); i++)
|
||||
if (!ioctl (audio_fd, SNDCTL_DSP_SPEED, &tryrates[i]))
|
||||
|
@ -225,7 +260,7 @@ try_open (snd_t *snd, int rw)
|
|||
snd->speed = tryrates[i];
|
||||
}
|
||||
|
||||
if (!snd_stereo->int_val) {
|
||||
if (!snd_stereo) {
|
||||
snd->channels = 1;
|
||||
} else {
|
||||
snd->channels = 2;
|
||||
|
|
|
@ -55,9 +55,33 @@ static unsigned shm_rpos;
|
|||
|
||||
static unsigned wpos;
|
||||
|
||||
static cvar_t *snd_bits;
|
||||
static cvar_t *snd_rate;
|
||||
static cvar_t *snd_stereo;
|
||||
static int snd_bits;
|
||||
static cvar_t snd_bits_cvar = {
|
||||
.name = "snd_bits",
|
||||
.description =
|
||||
"sound sample depth. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_bits },
|
||||
};
|
||||
static int snd_rate;
|
||||
static cvar_t snd_rate_cvar = {
|
||||
.name = "snd_rate",
|
||||
.description =
|
||||
"sound playback rate. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_rate },
|
||||
};
|
||||
static int snd_stereo;
|
||||
static cvar_t snd_stereo_cvar = {
|
||||
.name = "snd_stereo",
|
||||
.description =
|
||||
"sound stereo output",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_stereo },
|
||||
};
|
||||
|
||||
static plugin_t plugin_info;
|
||||
static plugin_data_t plugin_info_data;
|
||||
|
@ -86,12 +110,9 @@ paint_audio (void *unused, Uint8 * stream, int len)
|
|||
static void
|
||||
SNDDMA_Init_Cvars (void)
|
||||
{
|
||||
snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, NULL,
|
||||
"sound stereo output");
|
||||
snd_rate = Cvar_Get ("snd_rate", "0", CVAR_ROM, NULL,
|
||||
"sound playback rate. 0 is system default");
|
||||
snd_bits = Cvar_Get ("snd_bits", "0", CVAR_ROM, NULL,
|
||||
"sound sample depth. 0 is system default");
|
||||
Cvar_Register (&snd_stereo_cvar, 0, 0);
|
||||
Cvar_Register (&snd_rate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_bits_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -109,9 +130,9 @@ SNDDMA_Init (snd_t *snd)
|
|||
|
||||
/* Set up the desired format */
|
||||
desired.freq = 22050;
|
||||
if (snd_rate->int_val)
|
||||
desired.freq = snd_rate->int_val;
|
||||
switch (snd_bits->int_val) {
|
||||
if (snd_rate)
|
||||
desired.freq = snd_rate;
|
||||
switch (snd_bits) {
|
||||
case 8:
|
||||
desired.format = AUDIO_U8;
|
||||
break;
|
||||
|
@ -124,10 +145,10 @@ SNDDMA_Init (snd_t *snd)
|
|||
break;
|
||||
default:
|
||||
Sys_Printf ("Unknown number of audio bits: %d\n",
|
||||
snd_bits->int_val);
|
||||
snd_bits);
|
||||
return 0;
|
||||
}
|
||||
desired.channels = snd_stereo->int_val ? 2 : 1;
|
||||
desired.channels = snd_stereo ? 2 : 1;
|
||||
desired.samples = 1024;
|
||||
desired.callback = paint_audio;
|
||||
|
||||
|
|
|
@ -70,20 +70,41 @@ static DWORD gSndBufSize;
|
|||
|
||||
static qboolean SNDDMA_InitWav (snd_t *snd);
|
||||
|
||||
static cvar_t *snd_stereo;
|
||||
static cvar_t *snd_rate;
|
||||
static cvar_t *snd_bits;
|
||||
static int snd_stereo;
|
||||
static cvar_t snd_stereo_cvar = {
|
||||
.name = "snd_stereo",
|
||||
.description =
|
||||
"sound stereo output",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_stereo },
|
||||
};
|
||||
static int snd_rate;
|
||||
static cvar_t snd_rate_cvar = {
|
||||
.name = "snd_rate",
|
||||
.description =
|
||||
"sound playback rate. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_rate },
|
||||
};
|
||||
static int snd_bits;
|
||||
static cvar_t snd_bits_cvar = {
|
||||
.name = "snd_bits",
|
||||
.description =
|
||||
"sound sample depth. 0 is system default",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &snd_bits },
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
SNDDMA_Init_Cvars (void)
|
||||
{
|
||||
snd_stereo = Cvar_Get ("snd_stereo", "1", CVAR_ROM, NULL,
|
||||
"sound stereo output");
|
||||
snd_rate = Cvar_Get ("snd_rate", "11025", CVAR_ROM, NULL,
|
||||
"sound playback rate. 0 is system default");
|
||||
snd_bits = Cvar_Get ("snd_bits", "16", CVAR_ROM, NULL,
|
||||
"sound sample depth. 0 is system default");
|
||||
Cvar_Register (&snd_stereo_cvar, 0, 0);
|
||||
Cvar_Register (&snd_rate_cvar, 0, 0);
|
||||
Cvar_Register (&snd_bits_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -150,14 +171,14 @@ SNDDMA_InitWav (snd_t *snd)
|
|||
snd_sent = 0;
|
||||
snd_completed = 0;
|
||||
|
||||
if (!snd_stereo->int_val) {
|
||||
if (!snd_stereo) {
|
||||
snd->channels = 1;
|
||||
} else {
|
||||
snd->channels = 2;
|
||||
}
|
||||
|
||||
snd->samplebits = snd_bits->int_val;
|
||||
snd->speed = snd_rate->int_val;
|
||||
snd->samplebits = snd_bits;
|
||||
snd->speed = snd_rate;
|
||||
|
||||
memset (&format, 0, sizeof (format));
|
||||
format.wFormatTag = WAVE_FORMAT_PCM;
|
||||
|
|
|
@ -66,7 +66,7 @@ init (void)
|
|||
|
||||
Sys_Init ();
|
||||
COM_ParseConfig (testsound_cbuf);
|
||||
Cvar_Get ("cmd_warncmd", "1", CVAR_NONE, NULL, NULL);
|
||||
cmd_warncmd = 1;
|
||||
|
||||
memhunk_t *hunk = Memory_Init (Sys_Alloc (MEMSIZE), MEMSIZE);
|
||||
|
||||
|
|
|
@ -50,19 +50,51 @@
|
|||
#include "client/view.h"
|
||||
|
||||
|
||||
cvar_t *chase_back;
|
||||
cvar_t *chase_up;
|
||||
cvar_t *chase_right;
|
||||
cvar_t *chase_active;
|
||||
float chase_back;
|
||||
static cvar_t chase_back_cvar = {
|
||||
.name = "chase_back",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "100",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &chase_back },
|
||||
};
|
||||
float chase_up;
|
||||
static cvar_t chase_up_cvar = {
|
||||
.name = "chase_up",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "16",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &chase_up },
|
||||
};
|
||||
float chase_right;
|
||||
static cvar_t chase_right_cvar = {
|
||||
.name = "chase_right",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &chase_right },
|
||||
};
|
||||
int chase_active;
|
||||
static cvar_t chase_active_cvar = {
|
||||
.name = "chase_active",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &chase_active },
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
Chase_Init_Cvars (void)
|
||||
{
|
||||
chase_back = Cvar_Get ("chase_back", "100", CVAR_NONE, NULL, "None");
|
||||
chase_up = Cvar_Get ("chase_up", "16", CVAR_NONE, NULL, "None");
|
||||
chase_right = Cvar_Get ("chase_right", "0", CVAR_NONE, NULL, "None");
|
||||
chase_active = Cvar_Get ("chase_active", "0", CVAR_NONE, NULL, "None");
|
||||
Cvar_Register (&chase_back_cvar, 0, 0);
|
||||
Cvar_Register (&chase_up_cvar, 0, 0);
|
||||
Cvar_Register (&chase_right_cvar, 0, 0);
|
||||
Cvar_Register (&chase_active_cvar, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -104,8 +136,8 @@ limit_distance (chasestate_t *cs)
|
|||
vec4f_t dir = cs->camera_origin - cs->player_origin;
|
||||
vec4f_t forward = normalf (dir);
|
||||
|
||||
if (magnitudef (dir)[0] > chase_back->value) {
|
||||
cs->camera_origin = cs->player_origin + forward * chase_back->value;
|
||||
if (magnitudef (dir)[0] > chase_back) {
|
||||
cs->camera_origin = cs->player_origin + forward * chase_back;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,26 +164,26 @@ cam_controls (chasestate_t *cs, viewstate_t *vs)
|
|||
vec4f_t dir = { };
|
||||
|
||||
if (in_strafe.state & 1) {
|
||||
move[SIDE] += cl_sidespeed->value * IN_ButtonState (&in_right);
|
||||
move[SIDE] -= cl_sidespeed->value * IN_ButtonState (&in_left);
|
||||
move[SIDE] += cl_sidespeed * IN_ButtonState (&in_right);
|
||||
move[SIDE] -= cl_sidespeed * IN_ButtonState (&in_left);
|
||||
}
|
||||
move[SIDE] += cl_sidespeed->value * IN_ButtonState (&in_moveright);
|
||||
move[SIDE] -= cl_sidespeed->value * IN_ButtonState (&in_moveleft);
|
||||
move[SIDE] += cl_sidespeed * IN_ButtonState (&in_moveright);
|
||||
move[SIDE] -= cl_sidespeed * IN_ButtonState (&in_moveleft);
|
||||
|
||||
if (!(in_klook.state & 1)) {
|
||||
move[FORWARD] += cl_forwardspeed->value
|
||||
move[FORWARD] += cl_forwardspeed
|
||||
* IN_ButtonState (&in_forward);
|
||||
move[FORWARD] -= cl_backspeed->value * IN_ButtonState (&in_back);
|
||||
move[FORWARD] -= cl_backspeed * IN_ButtonState (&in_back);
|
||||
}
|
||||
if (in_speed.state & 1) {
|
||||
move *= cl_movespeedkey->value;
|
||||
move *= cl_movespeedkey;
|
||||
}
|
||||
|
||||
// mouse and joystick controllers add to movement
|
||||
VectorSet (0, vs->player_angles[1] - cs->camera_angles[1], 0, dir);
|
||||
AngleVectors ((vec_t*)&dir, (vec_t*)&forward, (vec_t*)&right, (vec_t*)&up); //FIXME
|
||||
forward *= IN_UpdateAxis (&in_cam_forward) * m_forward->value;
|
||||
right *= IN_UpdateAxis (&in_cam_side) * m_side->value;
|
||||
forward *= IN_UpdateAxis (&in_cam_forward) * m_forward;
|
||||
right *= IN_UpdateAxis (&in_cam_side) * m_side;
|
||||
dir = forward + right;
|
||||
move[FORWARD] += dir[0];
|
||||
move[SIDE] -= dir[1];
|
||||
|
@ -191,9 +223,9 @@ chase_mode_1 (chasestate_t *cs)
|
|||
|
||||
// calc exact destination
|
||||
cs->camera_origin = vs->player_origin
|
||||
- forward * chase_back->value - right * chase_right->value;
|
||||
- forward * chase_back - right * chase_right;
|
||||
// chase_up is world up
|
||||
cs->camera_origin[2] += chase_up->value;
|
||||
cs->camera_origin[2] += chase_up;
|
||||
|
||||
// check for walls between player and camera
|
||||
stop = TraceLine (cs, vs->player_origin, cs->camera_origin);
|
||||
|
@ -219,13 +251,13 @@ chase_mode_2 (chasestate_t *cs)
|
|||
// move camera, it's not enough to just change the angles because
|
||||
// the angles are automatically changed to look toward the player
|
||||
AngleVectors (cs->camera_angles, (vec_t*)&forward, (vec_t*)&right, (vec_t*)&up);//FIXME
|
||||
cs->camera_origin = cs->player_origin - chase_back->value * forward;
|
||||
cs->camera_origin = cs->player_origin - chase_back * forward;
|
||||
|
||||
cs->player_origin = vs->player_origin;
|
||||
|
||||
// don't let camera get too low
|
||||
if (cs->camera_origin[2] < cs->player_origin[2] + chase_up->value) {
|
||||
cs->camera_origin[2] = cs->player_origin[2] + chase_up->value;
|
||||
if (cs->camera_origin[2] < cs->player_origin[2] + chase_up) {
|
||||
cs->camera_origin[2] = cs->player_origin[2] + chase_up;
|
||||
}
|
||||
|
||||
limit_distance (cs);
|
||||
|
@ -267,7 +299,7 @@ chase_mode_3 (chasestate_t *cs)
|
|||
|
||||
cs->player_origin = vs->player_origin;
|
||||
AngleVectors (cs->camera_angles, (vec_t*)&forward, (vec_t*)&right, (vec_t*)&up);//FIXME
|
||||
cs->camera_origin = cs->player_origin - chase_back->value * forward;
|
||||
cs->camera_origin = cs->player_origin - chase_back * forward;
|
||||
limit_distance (cs);
|
||||
check_for_walls (cs, forward);
|
||||
set_camera (cs, vs);
|
||||
|
@ -277,7 +309,7 @@ chase_mode_3 (chasestate_t *cs)
|
|||
void
|
||||
Chase_Update (chasestate_t *cs)
|
||||
{
|
||||
switch (chase_active->int_val) {
|
||||
switch (chase_active) {
|
||||
case 1:
|
||||
chase_mode_1 (cs);
|
||||
return;
|
||||
|
|
|
@ -129,7 +129,7 @@ CL_ModelEffects (entity_t *ent, int num, int glow_color, double time)
|
|||
VectorCopy (ent_origin, dl->origin);
|
||||
dl->radius = 200.0;
|
||||
dl->die = time + 0.1;
|
||||
//FIXME VectorCopy (r_firecolor->vec, dl->color);
|
||||
//FIXME VectorCopy (r_firecolor, dl->color);
|
||||
VectorSet (0.9, 0.7, 0.0, dl->color);
|
||||
dl->color[3] = 0.7;
|
||||
}
|
||||
|
|
|
@ -214,20 +214,124 @@ static in_button_t *cl_in_buttons[] = {
|
|||
0
|
||||
};
|
||||
|
||||
cvar_t *cl_anglespeedkey;
|
||||
cvar_t *cl_backspeed;
|
||||
cvar_t *cl_forwardspeed;
|
||||
cvar_t *cl_movespeedkey;
|
||||
cvar_t *cl_pitchspeed;
|
||||
cvar_t *cl_sidespeed;
|
||||
cvar_t *cl_upspeed;
|
||||
cvar_t *cl_yawspeed;
|
||||
float cl_anglespeedkey;
|
||||
static cvar_t cl_anglespeedkey_cvar = {
|
||||
.name = "cl_anglespeedkey",
|
||||
.description =
|
||||
"turn `run' speed multiplier",
|
||||
.default_value = "1.5",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_anglespeedkey },
|
||||
};
|
||||
float cl_backspeed;
|
||||
static cvar_t cl_backspeed_cvar = {
|
||||
.name = "cl_backspeed",
|
||||
.description =
|
||||
"backward speed",
|
||||
.default_value = "200",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_backspeed },
|
||||
};
|
||||
float cl_forwardspeed;
|
||||
static cvar_t cl_forwardspeed_cvar = {
|
||||
.name = "cl_forwardspeed",
|
||||
.description =
|
||||
"forward speed",
|
||||
.default_value = "200",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_forwardspeed },
|
||||
};
|
||||
float cl_movespeedkey;
|
||||
static cvar_t cl_movespeedkey_cvar = {
|
||||
.name = "cl_movespeedkey",
|
||||
.description =
|
||||
"move `run' speed multiplier",
|
||||
.default_value = "2.0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_movespeedkey },
|
||||
};
|
||||
float cl_pitchspeed;
|
||||
static cvar_t cl_pitchspeed_cvar = {
|
||||
.name = "cl_pitchspeed",
|
||||
.description =
|
||||
"look up/down speed",
|
||||
.default_value = "150",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_pitchspeed },
|
||||
};
|
||||
float cl_sidespeed;
|
||||
static cvar_t cl_sidespeed_cvar = {
|
||||
.name = "cl_sidespeed",
|
||||
.description =
|
||||
"strafe speed",
|
||||
.default_value = "350",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_sidespeed },
|
||||
};
|
||||
float cl_upspeed;
|
||||
static cvar_t cl_upspeed_cvar = {
|
||||
.name = "cl_upspeed",
|
||||
.description =
|
||||
"swim/fly up/down speed",
|
||||
.default_value = "200",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_upspeed },
|
||||
};
|
||||
float cl_yawspeed;
|
||||
static cvar_t cl_yawspeed_cvar = {
|
||||
.name = "cl_yawspeed",
|
||||
.description =
|
||||
"turning speed",
|
||||
.default_value = "140",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_yawspeed },
|
||||
};
|
||||
|
||||
cvar_t *lookspring;
|
||||
cvar_t *m_pitch;
|
||||
cvar_t *m_yaw;
|
||||
cvar_t *m_forward;
|
||||
cvar_t *m_side;
|
||||
int lookspring;
|
||||
static cvar_t lookspring_cvar = {
|
||||
.name = "lookspring",
|
||||
.description =
|
||||
"Snap view to center when moving and no mlook/klook",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &lookspring },
|
||||
};
|
||||
float m_pitch;
|
||||
static cvar_t m_pitch_cvar = {
|
||||
.name = "m_pitch",
|
||||
.description =
|
||||
"mouse pitch (up/down) multipier",
|
||||
.default_value = "0.022",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &m_pitch },
|
||||
};
|
||||
float m_yaw;
|
||||
static cvar_t m_yaw_cvar = {
|
||||
.name = "m_yaw",
|
||||
.description =
|
||||
"mouse yaw (left/right) multipiler",
|
||||
.default_value = "0.022",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &m_yaw },
|
||||
};
|
||||
float m_forward;
|
||||
static cvar_t m_forward_cvar = {
|
||||
.name = "m_forward",
|
||||
.description =
|
||||
"mouse forward/back speed",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &m_forward },
|
||||
};
|
||||
float m_side;
|
||||
static cvar_t m_side_cvar = {
|
||||
.name = "m_side",
|
||||
.description =
|
||||
"mouse strafe speed",
|
||||
.default_value = "0.8",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &m_side },
|
||||
};
|
||||
|
||||
static void
|
||||
CL_AdjustAngles (float frametime, movestate_t *ms, viewstate_t *vs)
|
||||
|
@ -236,12 +340,12 @@ CL_AdjustAngles (float frametime, movestate_t *ms, viewstate_t *vs)
|
|||
float pitchspeed, yawspeed;
|
||||
vec4f_t delta = {};
|
||||
|
||||
pitchspeed = cl_pitchspeed->value;
|
||||
yawspeed = cl_yawspeed->value;
|
||||
pitchspeed = cl_pitchspeed;
|
||||
yawspeed = cl_yawspeed;
|
||||
|
||||
if (in_speed.state & inb_down) {
|
||||
pitchspeed *= cl_anglespeedkey->value;
|
||||
yawspeed *= cl_anglespeedkey->value;
|
||||
pitchspeed *= cl_anglespeedkey;
|
||||
yawspeed *= cl_anglespeedkey;
|
||||
}
|
||||
|
||||
pitchspeed *= frametime;
|
||||
|
@ -263,9 +367,9 @@ CL_AdjustAngles (float frametime, movestate_t *ms, viewstate_t *vs)
|
|||
delta[PITCH] -= pitchspeed * up;
|
||||
delta[PITCH] += pitchspeed * down;
|
||||
|
||||
delta[PITCH] -= IN_UpdateAxis (&in_move_pitch) * m_pitch->value;
|
||||
delta[YAW] -= IN_UpdateAxis (&in_move_yaw) * m_yaw->value;
|
||||
delta[ROLL] -= IN_UpdateAxis (&in_move_roll) * m_pitch->value;
|
||||
delta[PITCH] -= IN_UpdateAxis (&in_move_pitch) * m_pitch;
|
||||
delta[YAW] -= IN_UpdateAxis (&in_move_yaw) * m_yaw;
|
||||
delta[ROLL] -= IN_UpdateAxis (&in_move_roll) * m_pitch;
|
||||
|
||||
ms->angles += delta;
|
||||
|
||||
|
@ -359,7 +463,7 @@ CL_Legacy_Init (void)
|
|||
void
|
||||
CL_Input_BuildMove (float frametime, movestate_t *state, viewstate_t *vs)
|
||||
{
|
||||
if (IN_ButtonReleased (&in_mlook) && !freelook && lookspring->int_val) {
|
||||
if (IN_ButtonReleased (&in_mlook) && !freelook && lookspring) {
|
||||
V_StartPitchDrift (vs);
|
||||
}
|
||||
|
||||
|
@ -368,35 +472,35 @@ CL_Input_BuildMove (float frametime, movestate_t *state, viewstate_t *vs)
|
|||
vec4f_t move = {};
|
||||
|
||||
if (in_strafe.state & inb_down) {
|
||||
move[SIDE] += cl_sidespeed->value * IN_ButtonState (&in_right);
|
||||
move[SIDE] -= cl_sidespeed->value * IN_ButtonState (&in_left);
|
||||
move[SIDE] += cl_sidespeed * IN_ButtonState (&in_right);
|
||||
move[SIDE] -= cl_sidespeed * IN_ButtonState (&in_left);
|
||||
}
|
||||
|
||||
move[SIDE] += cl_sidespeed->value * IN_ButtonState (&in_moveright);
|
||||
move[SIDE] -= cl_sidespeed->value * IN_ButtonState (&in_moveleft);
|
||||
move[SIDE] += cl_sidespeed * IN_ButtonState (&in_moveright);
|
||||
move[SIDE] -= cl_sidespeed * IN_ButtonState (&in_moveleft);
|
||||
|
||||
move[UP] += cl_upspeed->value * IN_ButtonState (&in_up);
|
||||
move[UP] -= cl_upspeed->value * IN_ButtonState (&in_down);
|
||||
move[UP] += cl_upspeed * IN_ButtonState (&in_up);
|
||||
move[UP] -= cl_upspeed * IN_ButtonState (&in_down);
|
||||
|
||||
if (!(in_klook.state & inb_down)) {
|
||||
move[FORWARD] += cl_forwardspeed->value * IN_ButtonState (&in_forward);
|
||||
move[FORWARD] -= cl_backspeed->value * IN_ButtonState (&in_back);
|
||||
move[FORWARD] += cl_forwardspeed * IN_ButtonState (&in_forward);
|
||||
move[FORWARD] -= cl_backspeed * IN_ButtonState (&in_back);
|
||||
}
|
||||
|
||||
// adjust for speed key
|
||||
if (in_speed.state & inb_down) {
|
||||
move *= cl_movespeedkey->value;
|
||||
move *= cl_movespeedkey;
|
||||
}
|
||||
|
||||
move[FORWARD] -= IN_UpdateAxis (&in_move_forward) * m_forward->value;
|
||||
move[SIDE] += IN_UpdateAxis (&in_move_side) * m_side->value;
|
||||
move[FORWARD] -= IN_UpdateAxis (&in_move_forward) * m_forward;
|
||||
move[SIDE] += IN_UpdateAxis (&in_move_side) * m_side;
|
||||
move[UP] -= IN_UpdateAxis (&in_move_up);
|
||||
|
||||
if (freelook)
|
||||
V_StopPitchDrift (vs);
|
||||
|
||||
if (vs->chase
|
||||
&& (chase_active->int_val == 2 || chase_active->int_val == 3)) {
|
||||
&& (chase_active == 2 || chase_active == 3)) {
|
||||
/* adjust for chase camera angles
|
||||
* makes the player move relative to the chase camera frame rather
|
||||
* than the player's frame
|
||||
|
@ -481,32 +585,19 @@ CL_Input_Init (cbuf_t *cbuf)
|
|||
void
|
||||
CL_Input_Init_Cvars (void)
|
||||
{
|
||||
lookspring = Cvar_Get ("lookspring", "0", CVAR_ARCHIVE, NULL, "Snap view "
|
||||
"to center when moving and no mlook/klook");
|
||||
m_pitch = Cvar_Get ("m_pitch", "0.022", CVAR_ARCHIVE, NULL,
|
||||
"mouse pitch (up/down) multipier");
|
||||
m_yaw = Cvar_Get ("m_yaw", "0.022", CVAR_ARCHIVE, NULL,
|
||||
"mouse yaw (left/right) multipiler");
|
||||
m_forward = Cvar_Get ("m_forward", "1", CVAR_ARCHIVE, NULL,
|
||||
"mouse forward/back speed");
|
||||
m_side = Cvar_Get ("m_side", "0.8", CVAR_ARCHIVE, NULL,
|
||||
"mouse strafe speed");
|
||||
cl_anglespeedkey = Cvar_Get ("cl_anglespeedkey", "1.5", CVAR_NONE, NULL,
|
||||
"turn `run' speed multiplier");
|
||||
cl_backspeed = Cvar_Get ("cl_backspeed", "200", CVAR_ARCHIVE, NULL,
|
||||
"backward speed");
|
||||
cl_forwardspeed = Cvar_Get ("cl_forwardspeed", "200", CVAR_ARCHIVE, NULL,
|
||||
"forward speed");
|
||||
cl_movespeedkey = Cvar_Get ("cl_movespeedkey", "2.0", CVAR_NONE, NULL,
|
||||
"move `run' speed multiplier");
|
||||
cl_pitchspeed = Cvar_Get ("cl_pitchspeed", "150", CVAR_NONE, NULL,
|
||||
"look up/down speed");
|
||||
cl_sidespeed = Cvar_Get ("cl_sidespeed", "350", CVAR_NONE, NULL,
|
||||
"strafe speed");
|
||||
cl_upspeed = Cvar_Get ("cl_upspeed", "200", CVAR_NONE, NULL,
|
||||
"swim/fly up/down speed");
|
||||
cl_yawspeed = Cvar_Get ("cl_yawspeed", "140", CVAR_NONE, NULL,
|
||||
"turning speed");
|
||||
Cvar_Register (&lookspring_cvar, 0, 0);
|
||||
Cvar_Register (&m_pitch_cvar, 0, 0);
|
||||
Cvar_Register (&m_yaw_cvar, 0, 0);
|
||||
Cvar_Register (&m_forward_cvar, 0, 0);
|
||||
Cvar_Register (&m_side_cvar, 0, 0);
|
||||
Cvar_Register (&cl_anglespeedkey_cvar, 0, 0);
|
||||
Cvar_Register (&cl_backspeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_forwardspeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_movespeedkey_cvar, 0, 0);
|
||||
Cvar_Register (&cl_pitchspeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_sidespeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_upspeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_yawspeed_cvar, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -60,8 +60,24 @@ cl_particle_funcs_t *clp_funcs;
|
|||
static mtstate_t mt; // private PRNG state
|
||||
static psystem_t *cl_psystem;
|
||||
|
||||
static cvar_t *easter_eggs;
|
||||
static cvar_t *particles_style;
|
||||
static int easter_eggs;
|
||||
static cvar_t easter_eggs_cvar = {
|
||||
.name = "easter_eggs",
|
||||
.description =
|
||||
"Enables easter eggs.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &easter_eggs },
|
||||
};
|
||||
static int particles_style;
|
||||
static cvar_t particles_style_cvar = {
|
||||
.name = "particles_style",
|
||||
.description =
|
||||
"Sets particle style. 0 for Id, 1 for QF.",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &particles_style },
|
||||
};
|
||||
|
||||
static int ramp[] = {
|
||||
/*ramp1*/ 0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61,
|
||||
|
@ -1238,37 +1254,34 @@ static cl_particle_funcs_t particles_ID_egg = {
|
|||
};
|
||||
|
||||
static void
|
||||
easter_eggs_f (cvar_t *var)
|
||||
set_particle_funcs (void)
|
||||
{
|
||||
if (easter_eggs) {
|
||||
if (easter_eggs->int_val) {
|
||||
if (particles_style->int_val) {
|
||||
if (particles_style) {
|
||||
clp_funcs = &particles_QF_egg;
|
||||
} else {
|
||||
clp_funcs = &particles_ID_egg;
|
||||
}
|
||||
} else if (particles_style) {
|
||||
if (particles_style->int_val) {
|
||||
} else {
|
||||
if (particles_style) {
|
||||
clp_funcs = &particles_QF;
|
||||
} else {
|
||||
clp_funcs = &particles_ID;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
particles_style_f (cvar_t *var)
|
||||
easter_eggs_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
easter_eggs_f (easter_eggs);
|
||||
cl_psystem->points_only = !var->int_val;
|
||||
set_particle_funcs ();
|
||||
}
|
||||
|
||||
static void
|
||||
CL_ParticleFunctionInit (void)
|
||||
particles_style_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
particles_style_f (particles_style);
|
||||
easter_eggs_f (easter_eggs);
|
||||
set_particle_funcs ();
|
||||
cl_psystem->points_only = !particles_style;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1276,12 +1289,9 @@ CL_Particles_Init (void)
|
|||
{
|
||||
mtwist_seed (&mt, 0xdeadbeef);
|
||||
cl_psystem = r_funcs->ParticleSystem ();
|
||||
easter_eggs = Cvar_Get ("easter_eggs", "0", CVAR_NONE, easter_eggs_f,
|
||||
"Enables easter eggs.");
|
||||
particles_style = Cvar_Get ("particles_style", "1", CVAR_ARCHIVE,
|
||||
particles_style_f,
|
||||
"Sets particle style. 0 for Id, 1 for QF.");
|
||||
CL_ParticleFunctionInit ();
|
||||
Cvar_Register (&easter_eggs_cvar, easter_eggs_f, 0);
|
||||
Cvar_Register (&particles_style_cvar, particles_style_f, 0);
|
||||
set_particle_funcs ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -54,37 +54,230 @@
|
|||
especially when crossing a water boudnary.
|
||||
*/
|
||||
|
||||
cvar_t *scr_ofsx;
|
||||
cvar_t *scr_ofsy;
|
||||
cvar_t *scr_ofsz;
|
||||
float scr_ofsx;
|
||||
static cvar_t scr_ofsx_cvar = {
|
||||
.name = "scr_ofsx",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &scr_ofsx },
|
||||
};
|
||||
float scr_ofsy;
|
||||
static cvar_t scr_ofsy_cvar = {
|
||||
.name = "scr_ofsy",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &scr_ofsy },
|
||||
};
|
||||
float scr_ofsz;
|
||||
static cvar_t scr_ofsz_cvar = {
|
||||
.name = "scr_ofsz",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &scr_ofsz },
|
||||
};
|
||||
|
||||
cvar_t *cl_rollspeed;
|
||||
cvar_t *cl_rollangle;
|
||||
float cl_rollspeed;
|
||||
static cvar_t cl_rollspeed_cvar = {
|
||||
.name = "cl_rollspeed",
|
||||
.description =
|
||||
"How quickly you straighten out after strafing",
|
||||
.default_value = "200",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_rollspeed },
|
||||
};
|
||||
float cl_rollangle;
|
||||
static cvar_t cl_rollangle_cvar = {
|
||||
.name = "cl_rollangle",
|
||||
.description =
|
||||
"How much your screen tilts when strafing",
|
||||
.default_value = "2.0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_rollangle },
|
||||
};
|
||||
|
||||
cvar_t *cl_bob;
|
||||
cvar_t *cl_bobcycle;
|
||||
cvar_t *cl_bobup;
|
||||
float cl_bob;
|
||||
static cvar_t cl_bob_cvar = {
|
||||
.name = "cl_bob",
|
||||
.description =
|
||||
"How much your weapon moves up and down when walking",
|
||||
.default_value = "0.02",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_bob },
|
||||
};
|
||||
float cl_bobcycle;
|
||||
static cvar_t cl_bobcycle_cvar = {
|
||||
.name = "cl_bobcycle",
|
||||
.description =
|
||||
"How quickly your weapon moves up and down when walking",
|
||||
.default_value = "0.6",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_bobcycle },
|
||||
};
|
||||
float cl_bobup;
|
||||
static cvar_t cl_bobup_cvar = {
|
||||
.name = "cl_bobup",
|
||||
.description =
|
||||
"How long your weapon stays up before cycling when walking",
|
||||
.default_value = "0.5",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &cl_bobup },
|
||||
};
|
||||
|
||||
cvar_t *v_centermove;
|
||||
cvar_t *v_centerspeed;
|
||||
float v_centermove;
|
||||
static cvar_t v_centermove_cvar = {
|
||||
.name = "v_centermove",
|
||||
.description =
|
||||
"How far the player must move forward before the view re-centers",
|
||||
.default_value = "0.15",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_centermove },
|
||||
};
|
||||
float v_centerspeed;
|
||||
static cvar_t v_centerspeed_cvar = {
|
||||
.name = "v_centerspeed",
|
||||
.description =
|
||||
"How quickly you return to a center view after a lookup or lookdown",
|
||||
.default_value = "500",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_centerspeed },
|
||||
};
|
||||
|
||||
cvar_t *v_kicktime;
|
||||
cvar_t *v_kickroll;
|
||||
cvar_t *v_kickpitch;
|
||||
float v_kicktime;
|
||||
static cvar_t v_kicktime_cvar = {
|
||||
.name = "v_kicktime",
|
||||
.description =
|
||||
"How long the kick from an attack lasts",
|
||||
.default_value = "0.5",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_kicktime },
|
||||
};
|
||||
float v_kickroll;
|
||||
static cvar_t v_kickroll_cvar = {
|
||||
.name = "v_kickroll",
|
||||
.description =
|
||||
"How much you lean when hit",
|
||||
.default_value = "0.6",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_kickroll },
|
||||
};
|
||||
float v_kickpitch;
|
||||
static cvar_t v_kickpitch_cvar = {
|
||||
.name = "v_kickpitch",
|
||||
.description =
|
||||
"How much you look up when hit",
|
||||
.default_value = "0.6",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_kickpitch },
|
||||
};
|
||||
|
||||
cvar_t *cl_cshift_bonus;
|
||||
cvar_t *cl_cshift_contents;
|
||||
cvar_t *cl_cshift_damage;
|
||||
cvar_t *cl_cshift_powerup;
|
||||
int cl_cshift_bonus;
|
||||
static cvar_t cl_cshift_bonus_cvar = {
|
||||
.name = "cl_cshift_bonus",
|
||||
.description =
|
||||
"Show bonus flash on item pickup",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &cl_cshift_bonus },
|
||||
};
|
||||
int cl_cshift_contents;
|
||||
static cvar_t cl_cshift_contents_cvar = {
|
||||
.name = "cl_cshift_content",
|
||||
.description =
|
||||
"Shift view colors for contents (water, slime, etc)",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &cl_cshift_contents },
|
||||
};
|
||||
int cl_cshift_damage;
|
||||
static cvar_t cl_cshift_damage_cvar = {
|
||||
.name = "cl_cshift_damage",
|
||||
.description =
|
||||
"Shift view colors on damage",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &cl_cshift_damage },
|
||||
};
|
||||
int cl_cshift_powerup;
|
||||
static cvar_t cl_cshift_powerup_cvar = {
|
||||
.name = "cl_cshift_powerup",
|
||||
.description =
|
||||
"Shift view colors for powerups",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &cl_cshift_powerup },
|
||||
};
|
||||
|
||||
cvar_t *v_iyaw_cycle;
|
||||
cvar_t *v_iroll_cycle;
|
||||
cvar_t *v_ipitch_cycle;
|
||||
cvar_t *v_iyaw_level;
|
||||
cvar_t *v_iroll_level;
|
||||
cvar_t *v_ipitch_level;
|
||||
float v_iyaw_cycle;
|
||||
static cvar_t v_iyaw_cycle_cvar = {
|
||||
.name = "v_iyaw_cycle",
|
||||
.description =
|
||||
"How far you tilt right and left when v_idlescale is enabled",
|
||||
.default_value = "2",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_iyaw_cycle },
|
||||
};
|
||||
float v_iroll_cycle;
|
||||
static cvar_t v_iroll_cycle_cvar = {
|
||||
.name = "v_iroll_cycle",
|
||||
.description =
|
||||
"How quickly you tilt right and left when v_idlescale is enabled",
|
||||
.default_value = "0.5",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_iroll_cycle },
|
||||
};
|
||||
float v_ipitch_cycle;
|
||||
static cvar_t v_ipitch_cycle_cvar = {
|
||||
.name = "v_ipitch_cycle",
|
||||
.description =
|
||||
"How quickly you lean forwards and backwards when v_idlescale is "
|
||||
"enabled",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_ipitch_cycle },
|
||||
};
|
||||
float v_iyaw_level;
|
||||
static cvar_t v_iyaw_level_cvar = {
|
||||
.name = "v_iyaw_level",
|
||||
.description =
|
||||
"How far you tilt right and left when v_idlescale is enabled",
|
||||
.default_value = "0.3",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_iyaw_level },
|
||||
};
|
||||
float v_iroll_level;
|
||||
static cvar_t v_iroll_level_cvar = {
|
||||
.name = "v_iroll_level",
|
||||
.description =
|
||||
"How far you tilt right and left when v_idlescale is enabled",
|
||||
.default_value = "0.1",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_iroll_level },
|
||||
};
|
||||
float v_ipitch_level;
|
||||
static cvar_t v_ipitch_level_cvar = {
|
||||
.name = "v_ipitch_level",
|
||||
.description =
|
||||
"How far you lean forwards and backwards when v_idlescale is enabled",
|
||||
.default_value = "0.3",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_ipitch_level },
|
||||
};
|
||||
|
||||
cvar_t *v_idlescale;
|
||||
float v_idlescale;
|
||||
static cvar_t v_idlescale_cvar = {
|
||||
.name = "v_idlescale",
|
||||
.description =
|
||||
"Toggles whether the view remains idle",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &v_idlescale },
|
||||
};
|
||||
|
||||
float v_dmg_time, v_dmg_roll, v_dmg_pitch;
|
||||
|
||||
|
@ -137,10 +330,10 @@ V_CalcRoll (const vec3_t angles, vec4f_t velocity)
|
|||
sign = side < 0 ? -1 : 1;
|
||||
side = fabs (side);
|
||||
|
||||
value = cl_rollangle->value;
|
||||
value = cl_rollangle;
|
||||
|
||||
if (side < cl_rollspeed->value)
|
||||
side = side * value / cl_rollspeed->value;
|
||||
if (side < cl_rollspeed)
|
||||
side = side * value / cl_rollspeed;
|
||||
else
|
||||
side = value;
|
||||
|
||||
|
@ -162,18 +355,18 @@ V_CalcBob (viewstate_t *vs)
|
|||
return bob; // just use old value
|
||||
|
||||
bobtime += vs->frametime;
|
||||
cycle = bobtime - (int) (bobtime / cl_bobcycle->value) *
|
||||
cl_bobcycle->value;
|
||||
cycle /= cl_bobcycle->value;
|
||||
if (cycle < cl_bobup->value)
|
||||
cycle = cycle / cl_bobup->value;
|
||||
cycle = bobtime - (int) (bobtime / cl_bobcycle) *
|
||||
cl_bobcycle;
|
||||
cycle /= cl_bobcycle;
|
||||
if (cycle < cl_bobup)
|
||||
cycle = cycle / cl_bobup;
|
||||
else
|
||||
cycle = 1 + (cycle - cl_bobup->value) / (1.0 - cl_bobup->value);
|
||||
cycle = 1 + (cycle - cl_bobup) / (1.0 - cl_bobup);
|
||||
|
||||
// bob is proportional to velocity in the xy plane
|
||||
// (don't count Z, or jumping messes it up)
|
||||
velocity[2] = 0;
|
||||
bob = sqrt (dotf (velocity, velocity)[0]) * cl_bob->value;
|
||||
bob = sqrt (dotf (velocity, velocity)[0]) * cl_bob;
|
||||
bob = bob * 0.3 + bob * 0.7 * sin (cycle * M_PI);
|
||||
if (bob > 4)
|
||||
bob = 4;
|
||||
|
@ -190,7 +383,7 @@ V_StartPitchDrift (viewstate_t *vs)
|
|||
}
|
||||
|
||||
if (vs->nodrift || !vs->pitchvel) {
|
||||
vs->pitchvel = v_centerspeed->value;
|
||||
vs->pitchvel = v_centerspeed;
|
||||
vs->nodrift = false;
|
||||
vs->driftmove = 0;
|
||||
}
|
||||
|
@ -236,12 +429,12 @@ V_DriftPitch (viewstate_t *vs)
|
|||
|
||||
// don't count small mouse motion
|
||||
if (vs->nodrift) {
|
||||
if (fabs (forwardmove) < cl_forwardspeed->value)
|
||||
if (fabs (forwardmove) < cl_forwardspeed)
|
||||
vs->driftmove = 0;
|
||||
else
|
||||
vs->driftmove += vs->frametime;
|
||||
|
||||
if (vs->driftmove > v_centermove->value) {
|
||||
if (vs->driftmove > v_centermove) {
|
||||
V_StartPitchDrift (vs);
|
||||
}
|
||||
return;
|
||||
|
@ -255,7 +448,7 @@ V_DriftPitch (viewstate_t *vs)
|
|||
}
|
||||
|
||||
move = vs->frametime * vs->pitchvel;
|
||||
vs->pitchvel += vs->frametime * v_centerspeed->value;
|
||||
vs->pitchvel += vs->frametime * v_centerspeed;
|
||||
|
||||
if (delta > 0) {
|
||||
if (move > delta) {
|
||||
|
@ -291,7 +484,7 @@ V_ParseDamage (qmsg_t *net_message, viewstate_t *vs)
|
|||
if (count < 10)
|
||||
count = 10;
|
||||
|
||||
if (cl_cshift_damage->int_val
|
||||
if (cl_cshift_damage
|
||||
|| (vs->force_cshifts & INFO_CSHIFT_DAMAGE)) {
|
||||
cshift_t *cshift = &vs->cshifts[CSHIFT_DAMAGE];
|
||||
int percent = cshift->percent;
|
||||
|
@ -309,12 +502,12 @@ V_ParseDamage (qmsg_t *net_message, viewstate_t *vs)
|
|||
AngleVectors (angles, forward, right, up);
|
||||
|
||||
side = DotProduct (from, right);
|
||||
v_dmg_roll = count * side * v_kickroll->value;
|
||||
v_dmg_roll = count * side * v_kickroll;
|
||||
|
||||
side = DotProduct (from, forward);
|
||||
v_dmg_pitch = count * side * v_kickpitch->value;
|
||||
v_dmg_pitch = count * side * v_kickpitch;
|
||||
|
||||
v_dmg_time = v_kicktime->value;
|
||||
v_dmg_time = v_kicktime;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -335,7 +528,7 @@ static void
|
|||
V_BonusFlash_f (void *data)
|
||||
{
|
||||
viewstate_t *vs = data;
|
||||
if (!cl_cshift_bonus->int_val
|
||||
if (!cl_cshift_bonus
|
||||
&& !(vs->force_cshifts & INFO_CSHIFT_BONUS))
|
||||
return;
|
||||
|
||||
|
@ -352,7 +545,7 @@ V_BonusFlash_f (void *data)
|
|||
void
|
||||
V_SetContentsColor (viewstate_t *vs, int contents)
|
||||
{
|
||||
if (!cl_cshift_contents->int_val
|
||||
if (!cl_cshift_contents
|
||||
&& !(vs->force_cshifts & INFO_CSHIFT_CONTENTS)) {
|
||||
vs->cshifts[CSHIFT_CONTENTS] = cshift_empty;
|
||||
return;
|
||||
|
@ -441,7 +634,7 @@ V_PrepBlend (viewstate_t *vs)
|
|||
{
|
||||
int i, j;
|
||||
|
||||
if (cl_cshift_powerup->int_val
|
||||
if (cl_cshift_powerup
|
||||
|| (vs->force_cshifts & INFO_CSHIFT_POWERUP))
|
||||
V_CalcPowerupCshift (vs);
|
||||
|
||||
|
@ -499,14 +692,14 @@ V_BoundOffsets (viewstate_t *vs)
|
|||
}
|
||||
|
||||
static vec4f_t
|
||||
idle_quat (vec4f_t axis, cvar_t *cycle, cvar_t *level, double time)
|
||||
idle_quat (vec4f_t axis, float cycle, float level, double time)
|
||||
{
|
||||
vec4f_t identity = { 0, 0, 0, 1 };
|
||||
if (!level || !cycle) {
|
||||
return identity;
|
||||
}
|
||||
float scale = sin (time * cycle->value);
|
||||
float ang = scale * level->value * v_idlescale->value;
|
||||
float scale = sin (time * cycle);
|
||||
float ang = scale * level * v_idlescale;
|
||||
float c = cos (ang * M_PI / 360);
|
||||
float s = sin (ang * M_PI / 360);
|
||||
return axis * s + identity * c;
|
||||
|
@ -553,8 +746,8 @@ V_CalcViewRoll (viewstate_t *vs)
|
|||
ang[ROLL] = V_CalcRoll (angles, velocity);
|
||||
|
||||
if (v_dmg_time > 0) {
|
||||
ang[ROLL] += v_dmg_time / v_kicktime->value * v_dmg_roll;
|
||||
ang[PITCH] += v_dmg_time / v_kicktime->value * v_dmg_pitch;
|
||||
ang[ROLL] += v_dmg_time / v_kicktime * v_dmg_roll;
|
||||
ang[PITCH] += v_dmg_time / v_kicktime * v_dmg_pitch;
|
||||
v_dmg_time -= vs->frametime;
|
||||
}
|
||||
|
||||
|
@ -586,10 +779,10 @@ V_CalcIntermissionRefdef (viewstate_t *vs)
|
|||
view->renderer.model = NULL;
|
||||
|
||||
// always idle in intermission
|
||||
old = v_idlescale->value;
|
||||
Cvar_SetValue (v_idlescale, 1);
|
||||
old = v_idlescale;
|
||||
v_idlescale = 1;
|
||||
V_AddIdle (vs);
|
||||
Cvar_SetValue (v_idlescale, old);
|
||||
v_idlescale = old;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -628,9 +821,7 @@ V_CalcRefdef (viewstate_t *vs)
|
|||
// don't allow cheats in multiplayer
|
||||
// FIXME check for dead
|
||||
if (vs->voffs_enabled) {
|
||||
origin += scr_ofsx->value * forward
|
||||
+ scr_ofsy->value * right
|
||||
+ scr_ofsz->value * up;
|
||||
origin += scr_ofsx * forward + scr_ofsy * right + scr_ofsz * up;
|
||||
}
|
||||
|
||||
V_BoundOffsets (vs);
|
||||
|
@ -644,15 +835,15 @@ V_CalcRefdef (viewstate_t *vs)
|
|||
|
||||
// fudge position around to keep amount of weapon visible
|
||||
// roughly equal with different FOV
|
||||
if (hud_sbar->int_val == 0 && r_data->scr_viewsize->int_val >= 100) {
|
||||
if (hud_sbar == 0 && *r_data->scr_viewsize >= 100) {
|
||||
;
|
||||
} else if (r_data->scr_viewsize->int_val == 110) {
|
||||
} else if (*r_data->scr_viewsize == 110) {
|
||||
gun_origin += (vec4f_t) { 0, 0, 1, 0};
|
||||
} else if (r_data->scr_viewsize->int_val == 100) {
|
||||
} else if (*r_data->scr_viewsize == 100) {
|
||||
gun_origin += (vec4f_t) { 0, 0, 2, 0};
|
||||
} else if (r_data->scr_viewsize->int_val == 90) {
|
||||
} else if (*r_data->scr_viewsize == 90) {
|
||||
gun_origin += (vec4f_t) { 0, 0, 1, 0};
|
||||
} else if (r_data->scr_viewsize->int_val == 80) {
|
||||
} else if (*r_data->scr_viewsize == 80) {
|
||||
gun_origin += (vec4f_t) { 0, 0, 0.5, 0};
|
||||
}
|
||||
|
||||
|
@ -741,7 +932,7 @@ V_RenderView (viewstate_t *vs)
|
|||
if (vs->intermission) { // intermission / finale rendering
|
||||
V_CalcIntermissionRefdef (vs);
|
||||
} else {
|
||||
if (vs->chase && chase_active->int_val) {
|
||||
if (vs->chase && chase_active) {
|
||||
Chase_Update (vs->chasestate);
|
||||
} else {
|
||||
V_CalcRefdef (vs);
|
||||
|
@ -769,61 +960,29 @@ V_Init (viewstate_t *viewstate)
|
|||
void
|
||||
V_Init_Cvars (void)
|
||||
{
|
||||
v_centermove = Cvar_Get ("v_centermove", "0.15", CVAR_NONE, NULL,
|
||||
"How far the player must move forward before the "
|
||||
"view re-centers");
|
||||
v_centerspeed = Cvar_Get ("v_centerspeed", "500", CVAR_NONE, NULL,
|
||||
"How quickly you return to a center view after "
|
||||
"a lookup or lookdown");
|
||||
v_iyaw_cycle = Cvar_Get ("v_iyaw_cycle", "2", CVAR_NONE, NULL,
|
||||
"How far you tilt right and left when "
|
||||
"v_idlescale is enabled");
|
||||
v_iroll_cycle = Cvar_Get ("v_iroll_cycle", "0.5", CVAR_NONE, NULL,
|
||||
"How quickly you tilt right and left when "
|
||||
"v_idlescale is enabled");
|
||||
v_ipitch_cycle = Cvar_Get ("v_ipitch_cycle", "1", CVAR_NONE, NULL,
|
||||
"How quickly you lean forwards and backwards "
|
||||
"when v_idlescale is enabled");
|
||||
v_iyaw_level = Cvar_Get ("v_iyaw_level", "0.3", CVAR_NONE, NULL,
|
||||
"How far you tilt right and left when "
|
||||
"v_idlescale is enabled");
|
||||
v_iroll_level = Cvar_Get ("v_iroll_level", "0.1", CVAR_NONE, NULL,
|
||||
"How far you tilt right and left when "
|
||||
"v_idlescale is enabled");
|
||||
v_ipitch_level = Cvar_Get ("v_ipitch_level", "0.3", CVAR_NONE, NULL,
|
||||
"How far you lean forwards and backwards when "
|
||||
"v_idlescale is enabled");
|
||||
v_idlescale = Cvar_Get ("v_idlescale", "0", CVAR_NONE, NULL,
|
||||
"Toggles whether the view remains idle");
|
||||
Cvar_Register (&v_centermove_cvar, 0, 0);
|
||||
Cvar_Register (&v_centerspeed_cvar, 0, 0);
|
||||
Cvar_Register (&v_iyaw_cycle_cvar, 0, 0);
|
||||
Cvar_Register (&v_iroll_cycle_cvar, 0, 0);
|
||||
Cvar_Register (&v_ipitch_cycle_cvar, 0, 0);
|
||||
Cvar_Register (&v_iyaw_level_cvar, 0, 0);
|
||||
Cvar_Register (&v_iroll_level_cvar, 0, 0);
|
||||
Cvar_Register (&v_ipitch_level_cvar, 0, 0);
|
||||
Cvar_Register (&v_idlescale_cvar, 0, 0);
|
||||
|
||||
scr_ofsx = Cvar_Get ("scr_ofsx", "0", CVAR_NONE, NULL, "None");
|
||||
scr_ofsy = Cvar_Get ("scr_ofsy", "0", CVAR_NONE, NULL, "None");
|
||||
scr_ofsz = Cvar_Get ("scr_ofsz", "0", CVAR_NONE, NULL, "None");
|
||||
cl_rollspeed = Cvar_Get ("cl_rollspeed", "200", CVAR_NONE, NULL,
|
||||
"How quickly you straighten out after strafing");
|
||||
cl_rollangle = Cvar_Get ("cl_rollangle", "2.0", CVAR_NONE, NULL,
|
||||
"How much your screen tilts when strafing");
|
||||
cl_bob = Cvar_Get ("cl_bob", "0.02", CVAR_NONE, NULL,
|
||||
"How much your weapon moves up and down when walking");
|
||||
cl_bobcycle = Cvar_Get ("cl_bobcycle", "0.6", CVAR_NONE, NULL,
|
||||
"How quickly your weapon moves up and down when "
|
||||
"walking");
|
||||
cl_bobup = Cvar_Get ("cl_bobup", "0.5", CVAR_NONE, NULL,
|
||||
"How long your weapon stays up before cycling when "
|
||||
"walking");
|
||||
v_kicktime = Cvar_Get ("v_kicktime", "0.5", CVAR_NONE, NULL,
|
||||
"How long the kick from an attack lasts");
|
||||
v_kickroll = Cvar_Get ("v_kickroll", "0.6", CVAR_NONE, NULL,
|
||||
"How much you lean when hit");
|
||||
v_kickpitch = Cvar_Get ("v_kickpitch", "0.6", CVAR_NONE, NULL,
|
||||
"How much you look up when hit");
|
||||
cl_cshift_bonus = Cvar_Get ("cl_cshift_bonus", "1", CVAR_ARCHIVE, NULL,
|
||||
"Show bonus flash on item pickup");
|
||||
cl_cshift_contents = Cvar_Get ("cl_cshift_content", "1", CVAR_ARCHIVE,
|
||||
NULL, "Shift view colors for contents "
|
||||
"(water, slime, etc)");
|
||||
cl_cshift_damage = Cvar_Get ("cl_cshift_damage", "1", CVAR_ARCHIVE, NULL,
|
||||
"Shift view colors on damage");
|
||||
cl_cshift_powerup = Cvar_Get ("cl_cshift_powerup", "1", CVAR_ARCHIVE, NULL,
|
||||
"Shift view colors for powerups");
|
||||
Cvar_Register (&scr_ofsx_cvar, 0, 0);
|
||||
Cvar_Register (&scr_ofsy_cvar, 0, 0);
|
||||
Cvar_Register (&scr_ofsz_cvar, 0, 0);
|
||||
Cvar_Register (&cl_rollspeed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_rollangle_cvar, 0, 0);
|
||||
Cvar_Register (&cl_bob_cvar, 0, 0);
|
||||
Cvar_Register (&cl_bobcycle_cvar, 0, 0);
|
||||
Cvar_Register (&cl_bobup_cvar, 0, 0);
|
||||
Cvar_Register (&v_kicktime_cvar, 0, 0);
|
||||
Cvar_Register (&v_kickroll_cvar, 0, 0);
|
||||
Cvar_Register (&v_kickpitch_cvar, 0, 0);
|
||||
Cvar_Register (&cl_cshift_bonus_cvar, 0, 0);
|
||||
Cvar_Register (&cl_cshift_contents_cvar, 0, 0);
|
||||
Cvar_Register (&cl_cshift_damage_cvar, 0, 0);
|
||||
Cvar_Register (&cl_cshift_powerup_cvar, 0, 0);
|
||||
}
|
||||
|
|
|
@ -29,8 +29,162 @@
|
|||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "QF/cvar.h"
|
||||
#include <string.h>
|
||||
|
||||
cvar_t *hud_sbar;
|
||||
cvar_t *hud_scoreboard_gravity;
|
||||
cvar_t *hud_swap;
|
||||
#include "QF/cvar.h"
|
||||
#include "QF/screen.h"
|
||||
#include "QF/render.h"
|
||||
#include "QF/plugin/vid_render.h"
|
||||
#include "QF/ui/view.h"
|
||||
|
||||
#include "compat.h"
|
||||
|
||||
#include "client/hud.h"
|
||||
|
||||
int hud_sb_lines;
|
||||
|
||||
int hud_sbar;
|
||||
static cvar_t hud_sbar_cvar = {
|
||||
.name = "hud_sbar",
|
||||
.description =
|
||||
"status bar mode: 0 = hud, 1 = oldstyle",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &hud_sbar },
|
||||
};
|
||||
char *hud_scoreboard_gravity;
|
||||
static cvar_t hud_scoreboard_gravity_cvar = {
|
||||
.name = "hud_scoreboard_gravity",
|
||||
.description =
|
||||
"control placement of scoreboard overlay: center, northwest, north, "
|
||||
"northeast, west, east, southwest, south, southeast",
|
||||
.default_value = "center",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &hud_scoreboard_gravity },
|
||||
};
|
||||
int hud_swap;
|
||||
static cvar_t hud_swap_cvar = {
|
||||
.name = "hud_swap",
|
||||
.description =
|
||||
"new HUD on left side?",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &hud_swap },
|
||||
};
|
||||
|
||||
view_t *sbar_view;
|
||||
view_t *sbar_inventory_view;
|
||||
view_t *sbar_frags_view;
|
||||
|
||||
view_t *hud_view;
|
||||
view_t *hud_inventory_view;
|
||||
view_t *hud_armament_view;
|
||||
view_t *hud_frags_view;
|
||||
|
||||
view_t *hud_overlay_view;
|
||||
view_t *hud_stuff_view;
|
||||
view_t *hud_main_view;
|
||||
|
||||
static void
|
||||
hud_sbar_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
HUD_Calc_sb_lines (*r_data->scr_viewsize);
|
||||
SCR_SetBottomMargin (hud_sbar ? hud_sb_lines : 0);
|
||||
if (hud_sbar) {
|
||||
view_remove (hud_main_view, hud_main_view->children[0]);
|
||||
view_insert (hud_main_view, sbar_view, 0);
|
||||
} else {
|
||||
view_remove (hud_main_view, hud_main_view->children[0]);
|
||||
view_insert (hud_main_view, hud_view, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
hud_swap_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
if (hud_swap) {
|
||||
//FIXME why is this needed for nq but not for qw?
|
||||
hud_armament_view->children[0]->gravity = grav_northwest;
|
||||
hud_armament_view->children[1]->gravity = grav_southeast;
|
||||
view_setgravity (hud_armament_view, grav_southwest);
|
||||
view_setgravity (hud_stuff_view, grav_southeast);
|
||||
} else {
|
||||
//FIXME why is this needed for nq but not for qw?
|
||||
hud_armament_view->children[0]->gravity = grav_northeast;
|
||||
hud_armament_view->children[1]->gravity = grav_southwest;
|
||||
view_setgravity (hud_armament_view, grav_southeast);
|
||||
view_setgravity (hud_stuff_view, grav_southwest);
|
||||
}
|
||||
view_move (hud_armament_view, hud_armament_view->xpos,
|
||||
hud_armament_view->ypos);
|
||||
view_move (hud_stuff_view, hud_stuff_view->xpos, hud_stuff_view->ypos);
|
||||
}
|
||||
|
||||
static void
|
||||
hud_scoreboard_gravity_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
grav_t grav;
|
||||
|
||||
if (strequal (hud_scoreboard_gravity, "center"))
|
||||
grav = grav_center;
|
||||
else if (strequal (hud_scoreboard_gravity, "northwest"))
|
||||
grav = grav_northwest;
|
||||
else if (strequal (hud_scoreboard_gravity, "north"))
|
||||
grav = grav_north;
|
||||
else if (strequal (hud_scoreboard_gravity, "northeast"))
|
||||
grav = grav_northeast;
|
||||
else if (strequal (hud_scoreboard_gravity, "west"))
|
||||
grav = grav_west;
|
||||
else if (strequal (hud_scoreboard_gravity, "east"))
|
||||
grav = grav_east;
|
||||
else if (strequal (hud_scoreboard_gravity, "southwest"))
|
||||
grav = grav_southwest;
|
||||
else if (strequal (hud_scoreboard_gravity, "south"))
|
||||
grav = grav_south;
|
||||
else if (strequal (hud_scoreboard_gravity, "southeast"))
|
||||
grav = grav_southeast;
|
||||
else
|
||||
grav = grav_center;
|
||||
view_setgravity (hud_overlay_view, grav);
|
||||
}
|
||||
|
||||
void
|
||||
HUD_Init_Cvars (void)
|
||||
{
|
||||
Cvar_Register (&hud_sbar_cvar, hud_sbar_f, 0);
|
||||
Cvar_Register (&hud_swap_cvar, hud_swap_f, 0);
|
||||
Cvar_Register (&hud_scoreboard_gravity_cvar, hud_scoreboard_gravity_f, 0);
|
||||
}
|
||||
|
||||
void
|
||||
HUD_Calc_sb_lines (int view_size)
|
||||
{
|
||||
int stuff_y;
|
||||
|
||||
if (view_size >= 120) {
|
||||
hud_sb_lines = 0;
|
||||
stuff_y = 0;
|
||||
} else if (view_size >= 110) {
|
||||
hud_sb_lines = 24;
|
||||
sbar_inventory_view->visible = 0;
|
||||
hud_inventory_view->visible = 0;
|
||||
hud_armament_view->visible = 0;
|
||||
stuff_y = 32;
|
||||
} else {
|
||||
hud_sb_lines = 48;
|
||||
sbar_inventory_view->visible = 1;
|
||||
hud_inventory_view->visible = 1;
|
||||
hud_armament_view->visible = 1;
|
||||
stuff_y = 48;
|
||||
}
|
||||
if (hud_sb_lines) {
|
||||
sbar_view->visible = 1;
|
||||
hud_view->visible = 1;
|
||||
view_resize (sbar_view, sbar_view->xlen, hud_sb_lines);
|
||||
view_resize (hud_view, hud_view->xlen, hud_sb_lines);
|
||||
} else {
|
||||
sbar_view->visible = 0;
|
||||
hud_view->visible = 0;
|
||||
}
|
||||
view_move (hud_stuff_view, hud_stuff_view->xpos, stuff_y);
|
||||
}
|
||||
|
|
|
@ -80,11 +80,79 @@ static old_console_t *con;
|
|||
|
||||
static float con_cursorspeed = 4;
|
||||
|
||||
static cvar_t *con_notifytime; // seconds
|
||||
static cvar_t *con_alpha;
|
||||
static cvar_t *con_size;
|
||||
static cvar_t *con_speed;
|
||||
static cvar_t *cl_conmode;
|
||||
static float con_notifytime;
|
||||
static cvar_t con_notifytime_cvar = {
|
||||
.name = "con_notifytime",
|
||||
.description =
|
||||
"How long in seconds messages are displayed on screen",
|
||||
.default_value = "3",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &con_notifytime },
|
||||
};
|
||||
static float con_alpha;
|
||||
static cvar_t con_alpha_cvar = {
|
||||
.name = "con_alpha",
|
||||
.description =
|
||||
"alpha value for the console background",
|
||||
.default_value = "0.6",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &con_alpha },
|
||||
};
|
||||
static float con_size;
|
||||
static cvar_t con_size_cvar = {
|
||||
.name = "con_size",
|
||||
.description =
|
||||
"Fraction of the screen the console covers when down",
|
||||
.default_value = "0.5",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &con_size },
|
||||
};
|
||||
static float con_speed;
|
||||
static cvar_t con_speed_cvar = {
|
||||
.name = "con_speed",
|
||||
.description =
|
||||
"How quickly the console scrolls up or down",
|
||||
.default_value = "300",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &con_speed },
|
||||
};
|
||||
static exprenum_t cl_conmode_enum;
|
||||
static exprtype_t cl_conmode_type = {
|
||||
.name = "cl_conmode",
|
||||
.size = sizeof (int),
|
||||
.data = &cl_conmode_enum,
|
||||
.get_string = cexpr_enum_get_string,
|
||||
};
|
||||
static int cl_exec_line_command (void *data, const char *line);
|
||||
static int cl_exec_line_chat (void *data, const char *line);
|
||||
static int cl_exec_line_rcon (void *data, const char *line);
|
||||
static int (*cl_conmode_values[])(void *, const char *) = {
|
||||
cl_exec_line_command,
|
||||
cl_exec_line_chat,
|
||||
cl_exec_line_rcon,
|
||||
};
|
||||
static exprsym_t cl_conmode_symbols[] = {
|
||||
{"command", &cl_conmode_type, cl_conmode_values + 0},
|
||||
{"chat", &cl_conmode_type, cl_conmode_values + 1},
|
||||
{"rcon", &cl_conmode_type, cl_conmode_values + 1},
|
||||
{}
|
||||
};
|
||||
static exprtab_t cl_conmode_symtab = {
|
||||
cl_conmode_symbols,
|
||||
};
|
||||
static exprenum_t cl_conmode_enum = {
|
||||
&cl_conmode_type,
|
||||
&cl_conmode_symtab,
|
||||
};
|
||||
static char *cl_conmode;
|
||||
static cvar_t cl_conmode_cvar = {
|
||||
.name = "cl_conmode",
|
||||
.description =
|
||||
"Set the console input mode (command, chat, rcon)",
|
||||
.default_value = "command",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cl_conmode_type, .value = &cl_conmode },
|
||||
};
|
||||
|
||||
#define NUM_CON_TIMES 4
|
||||
static float con_times[NUM_CON_TIMES]; // realtime time the line was generated
|
||||
|
@ -313,22 +381,6 @@ cl_exec_line_rcon (void *data, const char *line)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
cl_conmode_f (cvar_t *var)
|
||||
{
|
||||
if (!strcmp (var->string, "command")) {
|
||||
con_data.exec_line = cl_exec_line_command;
|
||||
} else if (!strcmp (var->string, "chat")) {
|
||||
con_data.exec_line = cl_exec_line_chat;
|
||||
} else if (!strcmp (var->string, "rcon")) {
|
||||
con_data.exec_line = cl_exec_line_rcon;
|
||||
} else {
|
||||
Sys_Printf ("mode must be one of \"command\", \"chat\" or \"rcon\"\n");
|
||||
Sys_Printf (" forcing \"command\"\n");
|
||||
Cvar_Set (var, "command");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
con_end_message (inputline_t *line)
|
||||
{
|
||||
|
@ -588,8 +640,8 @@ draw_console (view_t *view)
|
|||
if (con_state == con_fullscreen) {
|
||||
alpha = 255;
|
||||
} else {
|
||||
float y = r_data->vid->conview->ylen * con_size->value;
|
||||
alpha = 255 * con_alpha->value * view->ylen / y;
|
||||
float y = r_data->vid->conview->ylen * con_size;
|
||||
alpha = 255 * con_alpha * view->ylen / y;
|
||||
alpha = min (alpha, 255);
|
||||
}
|
||||
// draw the background
|
||||
|
@ -632,7 +684,7 @@ draw_notify (view_t *view)
|
|||
if (time == 0)
|
||||
continue;
|
||||
time = *con_data.realtime - time;
|
||||
if (time > con_notifytime->value)
|
||||
if (time > con_notifytime)
|
||||
continue;
|
||||
text = con->text + (i % con_totallines) * con_linewidth;
|
||||
|
||||
|
@ -655,7 +707,7 @@ setup_console (void)
|
|||
lines = 0;
|
||||
break;
|
||||
case con_active:
|
||||
lines = r_data->vid->conview->ylen * bound (0.2, con_size->value,
|
||||
lines = r_data->vid->conview->ylen * bound (0.2, con_size,
|
||||
1);
|
||||
break;
|
||||
case con_fullscreen:
|
||||
|
@ -663,12 +715,12 @@ setup_console (void)
|
|||
break;
|
||||
}
|
||||
|
||||
if (con_speed->value) {
|
||||
if (con_speed) {
|
||||
if (lines < con_data.lines) {
|
||||
con_data.lines -= max (0.2, con_speed->value) * *con_data.frametime;
|
||||
con_data.lines -= max (0.2, con_speed) * *con_data.frametime;
|
||||
con_data.lines = max (con_data.lines, lines);
|
||||
} else if (lines > con_data.lines) {
|
||||
con_data.lines += max (0.2, con_speed->value) * *con_data.frametime;
|
||||
con_data.lines += max (0.2, con_speed) * *con_data.frametime;
|
||||
con_data.lines = min (con_data.lines, lines);
|
||||
}
|
||||
} else {
|
||||
|
@ -843,19 +895,12 @@ C_Init (void)
|
|||
|
||||
Menu_Init ();
|
||||
|
||||
con_notifytime = Cvar_Get ("con_notifytime", "3", CVAR_NONE, NULL,
|
||||
"How long in seconds messages are displayed "
|
||||
"on screen");
|
||||
Cvar_Register (&con_notifytime_cvar, 0, 0);
|
||||
|
||||
con_alpha = Cvar_Get ("con_alpha", "0.6", CVAR_ARCHIVE, NULL,
|
||||
"alpha value for the console background");
|
||||
con_size = Cvar_Get ("con_size", "0.5", CVAR_ARCHIVE, NULL,
|
||||
"Fraction of the screen the console covers when "
|
||||
"down");
|
||||
con_speed = Cvar_Get ("con_speed", "300", CVAR_ARCHIVE, NULL,
|
||||
"How quickly the console scrolls up or down");
|
||||
cl_conmode = Cvar_Get ("cl_conmode", "command", CVAR_ARCHIVE, cl_conmode_f,
|
||||
"Set the console input mode (command, chat, rcon)");
|
||||
Cvar_Register (&con_alpha_cvar, 0, 0);
|
||||
Cvar_Register (&con_size_cvar, 0, 0);
|
||||
Cvar_Register (&con_speed_cvar, 0, 0);
|
||||
Cvar_Register (&cl_conmode_cvar, 0, 0);
|
||||
|
||||
con_debuglog = COM_CheckParm ("-condebug");
|
||||
|
||||
|
|
|
@ -56,23 +56,31 @@ static U inputline_t *(*const create)(int, int, char) = Con_CreateInputLine;
|
|||
static U void (*const display)(const char **, int) = Con_DisplayList;
|
||||
#undef U
|
||||
|
||||
static cvar_t *con_interpreter;
|
||||
static char *con_interpreter;
|
||||
static cvar_t con_interpreter_cvar = {
|
||||
.name = "con_interpreter",
|
||||
.description =
|
||||
"Interpreter for the interactive console",
|
||||
.default_value = "id",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &con_interpreter },
|
||||
};
|
||||
static sys_printf_t saved_sys_printf;
|
||||
|
||||
static void
|
||||
Con_Interp_f (cvar_t *var)
|
||||
Con_Interp_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
cbuf_interpreter_t *interp;
|
||||
|
||||
if (!con_module)
|
||||
return;
|
||||
|
||||
interp = Cmd_GetProvider(var->string);
|
||||
interp = Cmd_GetProvider(con_interpreter);
|
||||
|
||||
if (interp) {
|
||||
cbuf_t *new;
|
||||
|
||||
Sys_Printf ("Switching to interpreter '%s'\n", var->string);
|
||||
Sys_Printf ("Switching to interpreter '%s'\n", con_interpreter);
|
||||
|
||||
new = Cbuf_New (interp);
|
||||
|
||||
|
@ -83,7 +91,7 @@ Con_Interp_f (cvar_t *var)
|
|||
}
|
||||
con_module->data->console->cbuf = new;
|
||||
} else {
|
||||
Sys_Printf ("Unknown interpreter '%s'\n", var->string);
|
||||
Sys_Printf ("Unknown interpreter '%s'\n", con_interpreter);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,9 +119,7 @@ Con_Init (const char *plugin_name)
|
|||
} else {
|
||||
setvbuf (stdout, 0, _IOLBF, BUFSIZ);
|
||||
}
|
||||
con_interpreter =
|
||||
Cvar_Get("con_interpreter", "id", CVAR_NONE, Con_Interp_f,
|
||||
"Interpreter for the interactive console");
|
||||
Cvar_Register (&con_interpreter_cvar, Con_Interp_f, 0);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -79,7 +79,15 @@ typedef struct menu_item_s {
|
|||
menu_pic_t *pics;
|
||||
} menu_item_t;
|
||||
|
||||
static cvar_t *confirm_quit;
|
||||
static int confirm_quit;
|
||||
static cvar_t confirm_quit_cvar = {
|
||||
.name = "confirm_quit",
|
||||
.description =
|
||||
"confirm quit command",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &confirm_quit },
|
||||
};
|
||||
|
||||
static progs_t menu_pr_state;
|
||||
static menu_item_t *menu;
|
||||
|
@ -482,7 +490,7 @@ quit_f (void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (confirm_quit->int_val && menu_quit) {
|
||||
if (confirm_quit && menu_quit) {
|
||||
run_menu_pre ();
|
||||
PR_ExecuteProgram (&menu_pr_state, menu_quit);
|
||||
ret = R_INT (&menu_pr_state);
|
||||
|
@ -611,8 +619,7 @@ Menu_Init (void)
|
|||
R_Progs_Init (&menu_pr_state);
|
||||
S_Progs_Init (&menu_pr_state);
|
||||
|
||||
confirm_quit = Cvar_Get ("confirm_quit", "1", CVAR_ARCHIVE, NULL,
|
||||
"confirm quit command");
|
||||
Cvar_Register (&confirm_quit_cvar, 0, 0);
|
||||
|
||||
Cmd_AddCommand ("togglemenu", togglemenu_f,
|
||||
"Toggle the display of the menu");
|
||||
|
|
|
@ -82,8 +82,59 @@
|
|||
static console_data_t sv_con_data;
|
||||
|
||||
static QFile *log_file;
|
||||
static cvar_t *sv_logfile;
|
||||
static cvar_t *sv_conmode;
|
||||
static char *sv_logfile;
|
||||
static cvar_t sv_logfile_cvar = {
|
||||
.name = "sv_logfile",
|
||||
.description =
|
||||
"Control server console logging. \"none\" for off, or "
|
||||
"\"filename:gzflags\"",
|
||||
.default_value = "none",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &sv_logfile },
|
||||
};
|
||||
static exprenum_t sv_conmode_enum;
|
||||
static exprtype_t sv_conmode_type = {
|
||||
.name = "sv_conmode",
|
||||
.size = sizeof (int),
|
||||
.data = &sv_conmode_enum,
|
||||
.get_string = cexpr_enum_get_string,
|
||||
};
|
||||
static int sv_exec_line_command (void *data, const char *line);
|
||||
static int sv_exec_line_chat (void *data, const char *line);
|
||||
static int (*sv_conmode_values[])(void *, const char *) = {
|
||||
sv_exec_line_command,
|
||||
sv_exec_line_chat,
|
||||
};
|
||||
static exprsym_t sv_conmode_symbols[] = {
|
||||
{"command", &sv_conmode_type, sv_conmode_values + 0},
|
||||
{"chat", &sv_conmode_type, sv_conmode_values + 1},
|
||||
{}
|
||||
};
|
||||
static exprtab_t sv_conmode_symtab = {
|
||||
sv_conmode_symbols,
|
||||
};
|
||||
static exprenum_t sv_conmode_enum = {
|
||||
&sv_conmode_type,
|
||||
&sv_conmode_symtab,
|
||||
};
|
||||
static char *sv_conmode;
|
||||
static cvar_t sv_conmode_cvar = {
|
||||
.name = "sv_conmode",
|
||||
.description =
|
||||
"Set the console input mode (command, chat)",
|
||||
.default_value = "command",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &sv_conmode_type, .value = &sv_conmode },
|
||||
};
|
||||
static int sv_use_curses;
|
||||
static cvar_t sv_use_curses_cvar = {
|
||||
.name = "sv_use_curses",
|
||||
.description =
|
||||
"Set to 1 to enable curses server console.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = &cexpr_int, .value = &sv_use_curses },
|
||||
};
|
||||
|
||||
#ifdef HAVE_NCURSES
|
||||
|
||||
|
@ -631,14 +682,14 @@ init (void)
|
|||
#endif
|
||||
|
||||
static void
|
||||
sv_logfile_f (cvar_t *var)
|
||||
sv_logfile_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
if (!var->string[0] || strequal (var->string, "none")) {
|
||||
if (!sv_logfile[0] || strequal (sv_logfile, "none")) {
|
||||
if (log_file)
|
||||
Qclose (log_file);
|
||||
log_file = 0;
|
||||
} else {
|
||||
char *fname = strdup (var->string);
|
||||
char *fname = strdup (sv_logfile);
|
||||
char *flags = strrchr (fname, ':');
|
||||
|
||||
if (flags) {
|
||||
|
@ -670,37 +721,19 @@ sv_exec_line_chat (void *data, const char *line)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
sv_conmode_f (cvar_t *var)
|
||||
{
|
||||
if (!strcmp (var->string, "command")) {
|
||||
sv_con_data.exec_line = sv_exec_line_command;
|
||||
} else if (!strcmp (var->string, "chat")) {
|
||||
sv_con_data.exec_line = sv_exec_line_chat;
|
||||
} else {
|
||||
Sys_Printf ("mode must be one of \"command\" or \"chat\"\n");
|
||||
Sys_Printf (" forcing \"command\"\n");
|
||||
Cvar_Set (var, "command");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
C_Init (void)
|
||||
{
|
||||
Cvar_Register (&sv_use_curses_cvar, 0, 0);
|
||||
#ifdef HAVE_NCURSES
|
||||
cvar_t *curses = Cvar_Get ("sv_use_curses", "0", CVAR_ROM, NULL,
|
||||
"Set to 1 to enable curses server console.");
|
||||
use_curses = curses->int_val;
|
||||
use_curses = sv_use_curses;
|
||||
if (use_curses) {
|
||||
init ();
|
||||
} else
|
||||
#endif
|
||||
setvbuf (stdout, 0, _IOLBF, BUFSIZ);
|
||||
sv_logfile = Cvar_Get ("sv_logfile", "none", CVAR_NONE, sv_logfile_f,
|
||||
"Control server console logging. \"none\" for off, "
|
||||
"or \"filename:gzflags\"");
|
||||
sv_conmode = Cvar_Get ("sv_conmode", "command", CVAR_NONE, sv_conmode_f,
|
||||
"Set the console input mode (command, chat)");
|
||||
Cvar_Register (&sv_logfile_cvar, sv_logfile_f, 0);
|
||||
Cvar_Register (&sv_conmode_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -117,8 +117,24 @@ typedef struct {
|
|||
dstring_t *dstr;
|
||||
} pr_debug_data_t;
|
||||
|
||||
cvar_t *pr_debug;
|
||||
cvar_t *pr_source_path;
|
||||
int pr_debug;
|
||||
static cvar_t pr_debug_cvar = {
|
||||
.name = "pr_debug",
|
||||
.description =
|
||||
"enable progs debugging",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &pr_debug },
|
||||
};
|
||||
char *pr_source_path;
|
||||
static cvar_t pr_source_path_cvar = {
|
||||
.name = "pr_source_path",
|
||||
.description =
|
||||
"where to look (within gamedir) for source files",
|
||||
.default_value = ".",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0/* not used */, .value = &pr_source_path },
|
||||
};
|
||||
static char *source_path_string;
|
||||
static char **source_paths;
|
||||
|
||||
|
@ -182,7 +198,7 @@ compunit_get_key (const void *cu, void *p)
|
|||
}
|
||||
|
||||
static void
|
||||
source_path_f (cvar_t *var)
|
||||
source_path_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
int i;
|
||||
char *s;
|
||||
|
@ -190,7 +206,7 @@ source_path_f (cvar_t *var)
|
|||
if (source_path_string) {
|
||||
free (source_path_string);
|
||||
}
|
||||
source_path_string = strdup (var->string);
|
||||
source_path_string = strdup (pr_source_path);
|
||||
if (source_paths) {
|
||||
free (source_paths);
|
||||
}
|
||||
|
@ -587,7 +603,7 @@ PR_LoadDebug (progs_t *pr)
|
|||
|
||||
res->debug = 0;
|
||||
|
||||
if (!pr_debug->int_val)
|
||||
if (!pr_debug)
|
||||
return 1;
|
||||
|
||||
def = PR_FindGlobal (pr, ".debug_file");
|
||||
|
@ -976,7 +992,7 @@ PR_DumpState (progs_t *pr)
|
|||
{
|
||||
prdeb_resources_t *res = pr->pr_debug_resources;
|
||||
if (pr->pr_xfunction) {
|
||||
if (pr_debug->int_val && res->debug) {
|
||||
if (pr_debug && res->debug) {
|
||||
pr_lineno_t *lineno;
|
||||
pr_auxfunction_t *func = 0;
|
||||
dfunction_t *descriptor = pr->pr_xfunction->descriptor;
|
||||
|
@ -1045,7 +1061,7 @@ pr_debug_find_def (progs_t *pr, pr_ptr_t *ofs)
|
|||
prdeb_resources_t *res = pr->pr_debug_resources;
|
||||
pr_def_t *def = 0;
|
||||
|
||||
if (pr_debug->int_val && res->debug) {
|
||||
if (pr_debug && res->debug) {
|
||||
def = PR_Get_Local_Def (pr, ofs);
|
||||
}
|
||||
if (*ofs >= pr->progs->globals.count) {
|
||||
|
@ -1486,10 +1502,10 @@ PR_PrintStatement (progs_t *pr, dstatement_t *s, int contents)
|
|||
data.pr = pr;
|
||||
data.dstr = res->dstr;
|
||||
|
||||
if (pr_debug->int_val > 1)
|
||||
if (pr_debug > 1)
|
||||
dump_code = 1;
|
||||
|
||||
if (pr_debug->int_val && res->debug) {
|
||||
if (pr_debug && res->debug) {
|
||||
const char *source_line = PR_Get_Source_Line (pr, addr);
|
||||
|
||||
if (source_line) {
|
||||
|
@ -1528,7 +1544,7 @@ PR_PrintStatement (progs_t *pr, dstatement_t *s, int contents)
|
|||
}
|
||||
|
||||
dasprintf (res->line, "%04x ", addr);
|
||||
if (pr_debug->int_val > 2) {
|
||||
if (pr_debug > 2) {
|
||||
if (pr->progs->version < PROG_VERSION) {
|
||||
dasprintf (res->line,
|
||||
"%03x %04x(%8s) %04x(%8s) %04x(%8s)\t",
|
||||
|
@ -1741,7 +1757,7 @@ dump_frame (progs_t *pr, prstack_t *frame)
|
|||
Sys_Printf ("<NO FUNCTION>\n");
|
||||
return;
|
||||
}
|
||||
if (pr_debug->int_val && res->debug) {
|
||||
if (pr_debug && res->debug) {
|
||||
pr_lineno_t *lineno = PR_Find_Lineno (pr, frame->staddr);
|
||||
pr_auxfunction_t *func = PR_Get_Lineno_Func (pr, lineno);
|
||||
pr_uint_t line = PR_Get_Lineno_Line (pr, lineno);
|
||||
|
@ -1932,9 +1948,6 @@ PR_Debug_Init (progs_t *pr)
|
|||
void
|
||||
PR_Debug_Init_Cvars (void)
|
||||
{
|
||||
pr_debug = Cvar_Get ("pr_debug", "0", CVAR_NONE, NULL,
|
||||
"enable progs debugging");
|
||||
pr_source_path = Cvar_Get ("pr_source_path", ".", CVAR_NONE, source_path_f,
|
||||
"where to look (within gamedir) for source "
|
||||
"files");
|
||||
Cvar_Register (&pr_debug_cvar, 0, 0);
|
||||
Cvar_Register (&pr_source_path_cvar, source_path_f, 0);
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ ED_Free (progs_t *pr, edict_t *ed)
|
|||
if (pr->unlink)
|
||||
pr->unlink (ed); // unlink from world bsp
|
||||
|
||||
if (pr_deadbeef_ents->int_val) {
|
||||
if (pr_deadbeef_ents) {
|
||||
ED_ClearEdict (pr, ed, 0xdeadbeef);
|
||||
} else {
|
||||
if (pr->free_edict)
|
||||
|
|
|
@ -284,7 +284,7 @@ PR_EnterFunction (progs_t *pr, bfunction_t *f)
|
|||
sizeof (pr_type_t) * f->locals);
|
||||
pr->localstack_used += f->locals;
|
||||
|
||||
if (pr_deadbeef_locals->int_val) {
|
||||
if (pr_deadbeef_locals) {
|
||||
for (pr_uint_t i = f->params_start;
|
||||
i < f->params_start + f->locals; i++) {
|
||||
pr->pr_globals[i].int_var = 0xdeadbeef;
|
||||
|
@ -357,7 +357,7 @@ PR_BoundsCheckSize (progs_t *pr, pr_ptr_t addr, unsigned size)
|
|||
|| size > (unsigned) (pr->globals_size - addr))
|
||||
PR_RunError (pr, "invalid memory access: %d (0 to %d-%d)", addr,
|
||||
pr->globals_size, size);
|
||||
if (pr_boundscheck->int_val >= 2
|
||||
if (pr_boundscheck >= 2
|
||||
&& PR_GetPointer (pr, addr + size) > (pr_type_t *) pr->zone) {
|
||||
void *mem = (void *) PR_GetPointer (pr, addr);
|
||||
Z_CheckPointer (pr->zone, mem, size * sizeof (pr_type_t));
|
||||
|
@ -385,7 +385,7 @@ signal_hook (int sig, void *data)
|
|||
{
|
||||
progs_t *pr = (progs_t *) data;
|
||||
|
||||
if (sig == SIGFPE && pr_faultchecks->int_val) {
|
||||
if (sig == SIGFPE && pr_faultchecks) {
|
||||
dstatement_t *st;
|
||||
pr_type_t *op_a, *op_b, *op_c;
|
||||
|
||||
|
@ -501,7 +501,7 @@ PR_SetupParams (progs_t *pr, int num_params, int min_alignment)
|
|||
}
|
||||
pr_ptr_t mask = ~(min_alignment - 1);
|
||||
pr_ptr_t stack = (*pr->globals.stack - offset) & mask;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 0);
|
||||
}
|
||||
*pr->globals.stack = stack;
|
||||
|
@ -835,7 +835,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_STOREP_I_v6p:
|
||||
case OP_STOREP_P_v6p:
|
||||
pointer = OPB(ptr);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -843,7 +843,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREP_V_v6p:
|
||||
pointer = OPB(ptr);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_vector);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -851,7 +851,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREP_Q_v6p:
|
||||
pointer = OPB(ptr);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -859,7 +859,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREP_D_v6p:
|
||||
pointer = OPB(ptr);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_double);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -867,7 +867,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
|
||||
case OP_ADDRESS_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
if (OPA(entity) >= pr->pr_edict_area_size)
|
||||
PR_RunError (pr, "Progs attempted to address an out "
|
||||
"of bounds edict");
|
||||
|
@ -901,7 +901,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_LOAD_FN_v6p:
|
||||
case OP_LOAD_I_v6p:
|
||||
case OP_LOAD_P_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
if (OPA(entity) >= pr->pr_edict_area_size)
|
||||
PR_RunError (pr, "Progs attempted to read an out of "
|
||||
"bounds edict number");
|
||||
|
@ -913,7 +913,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
OPC(int) = pr->pr_edict_area[fldofs].int_var;
|
||||
break;
|
||||
case OP_LOAD_V_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
if (OPA(entity) >= pr->pr_edict_area_size)
|
||||
PR_RunError (pr, "Progs attempted to read an out of "
|
||||
"bounds edict number");
|
||||
|
@ -925,7 +925,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
memcpy (op_c, &pr->pr_edict_area[fldofs], 3 * sizeof (*op_c));
|
||||
break;
|
||||
case OP_LOAD_Q_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
if (OPA(entity) >= pr->pr_edict_area_size)
|
||||
PR_RunError (pr, "Progs attempted to read an out of "
|
||||
"bounds edict number");
|
||||
|
@ -937,7 +937,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
memcpy (op_c, &pr->pr_edict_area[fldofs], 4 * sizeof (*op_c));
|
||||
break;
|
||||
case OP_LOAD_D_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
if (OPA(entity) >= pr->pr_edict_area_size)
|
||||
PR_RunError (pr, "Progs attempted to read an out of "
|
||||
"bounds edict number");
|
||||
|
@ -957,7 +957,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_LOADB_I_v6p:
|
||||
case OP_LOADB_P_v6p:
|
||||
pointer = OPA(entity) + OPB(field);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -965,7 +965,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADB_V_v6p:
|
||||
pointer = OPA(entity) + OPB(field);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_vector);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -973,7 +973,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADB_Q_v6p:
|
||||
pointer = OPA(entity) + OPB(field);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -981,7 +981,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADB_D_v6p:
|
||||
pointer = OPA(entity) + OPB(field);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_double);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -996,7 +996,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_LOADBI_I_v6p:
|
||||
case OP_LOADBI_P_v6p:
|
||||
pointer = OPA(ptr) + (short) st->b;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1004,7 +1004,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADBI_V_v6p:
|
||||
pointer = OPA(ptr) + (short) st->b;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_vector);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1012,7 +1012,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADBI_Q_v6p:
|
||||
pointer = OPA(ptr) + (short) st->b;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1020,7 +1020,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_LOADBI_D_v6p:
|
||||
pointer = OPA(ptr) + (short) st->b;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1045,7 +1045,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_STOREB_I_v6p:
|
||||
case OP_STOREB_P_v6p:
|
||||
pointer = OPB(ptr) + OPC(int);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1053,7 +1053,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREB_V_v6p:
|
||||
pointer = OPB(ptr) + OPC(int);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_vector);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1061,7 +1061,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREB_Q_v6p:
|
||||
pointer = OPB(ptr) + OPC(int);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1069,7 +1069,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREB_D_v6p:
|
||||
pointer = OPB(ptr) + OPC(int);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1084,7 +1084,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
case OP_STOREBI_I_v6p:
|
||||
case OP_STOREBI_P_v6p:
|
||||
pointer = OPB(ptr) + (short) st->c;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1092,7 +1092,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREBI_V_v6p:
|
||||
pointer = OPB(ptr) + (short) st->c;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_vector);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1100,7 +1100,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREBI_Q_v6p:
|
||||
pointer = OPB(ptr) + (short) st->c;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1108,7 +1108,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_STOREBI_D_v6p:
|
||||
pointer = OPB(ptr) + (short) st->c;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
@ -1125,7 +1125,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack - 1;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
}
|
||||
stk->int_var = OPA(int);
|
||||
|
@ -1136,7 +1136,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack - 3;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
}
|
||||
memcpy (stk, op_a, 3 * sizeof (*op_c));
|
||||
|
@ -1147,7 +1147,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack - 4;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
}
|
||||
memcpy (stk, op_a, 4 * sizeof (*op_c));
|
||||
|
@ -1169,7 +1169,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1186,7 +1186,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1203,7 +1203,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
|
@ -1227,7 +1227,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1244,7 +1244,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1261,7 +1261,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
|
@ -1281,7 +1281,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
}
|
||||
OPA(int) = stk->int_var;
|
||||
|
@ -1292,7 +1292,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
}
|
||||
memcpy (op_a, stk, 3 * sizeof (*op_c));
|
||||
|
@ -1303,7 +1303,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
}
|
||||
memcpy (op_a, stk, 4 * sizeof (*op_c));
|
||||
|
@ -1325,7 +1325,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1342,7 +1342,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1359,7 +1359,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + OPB(int);
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
|
@ -1383,7 +1383,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 1);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1400,7 +1400,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 3);
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
|
@ -1417,7 +1417,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
pointer = OPA(ptr) + st->b;
|
||||
ptr = pr->pr_globals + pointer;
|
||||
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
PR_BoundsCheck (pr, pointer, ev_quaternion);
|
||||
}
|
||||
|
@ -1469,7 +1469,7 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
st = pr->pr_statements + pr->pr_xstatement;
|
||||
break;
|
||||
case OP_JUMP_v6p:
|
||||
if (pr_boundscheck->int_val
|
||||
if (pr_boundscheck
|
||||
&& (OPA(uint) >= pr->progs->statements.count)) {
|
||||
PR_RunError (pr, "Invalid jump destination");
|
||||
}
|
||||
|
@ -1478,12 +1478,12 @@ pr_exec_quakec (progs_t *pr, int exitdepth)
|
|||
break;
|
||||
case OP_JUMPB_v6p:
|
||||
pointer = st->a + OPB(int);
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheck (pr, pointer, ev_int);
|
||||
}
|
||||
ptr = pr->pr_globals + pointer;
|
||||
pointer = ptr->int_var;
|
||||
if (pr_boundscheck->int_val
|
||||
if (pr_boundscheck
|
||||
&& (pointer >= pr->progs->statements.count)) {
|
||||
PR_RunError (pr, "Invalid jump destination");
|
||||
}
|
||||
|
@ -1701,7 +1701,7 @@ op_call:
|
|||
memmove (op_c, op_a, st->b * 4);
|
||||
break;
|
||||
case OP_MOVEP_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheckSize (pr, OPC(ptr), OPB(uint));
|
||||
PR_BoundsCheckSize (pr, OPA(ptr), OPB(uint));
|
||||
}
|
||||
|
@ -1710,7 +1710,7 @@ op_call:
|
|||
OPB(uint) * 4);
|
||||
break;
|
||||
case OP_MOVEPI_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheckSize (pr, OPC(ptr), st->b);
|
||||
PR_BoundsCheckSize (pr, OPA(ptr), st->b);
|
||||
}
|
||||
|
@ -1722,14 +1722,14 @@ op_call:
|
|||
pr_memset (op_c, OPA(ptr), st->b);
|
||||
break;
|
||||
case OP_MEMSETP_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheckSize (pr, OPC(ptr), OPB(uint));
|
||||
}
|
||||
pr_memset (pr->pr_globals + OPC(ptr), OPA(int),
|
||||
OPB(uint));
|
||||
break;
|
||||
case OP_MEMSETPI_v6p:
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheckSize (pr, OPC(ptr), st->b);
|
||||
}
|
||||
pr_memset (pr->pr_globals + OPC(ptr), OPA(int),
|
||||
|
@ -1888,7 +1888,7 @@ pr_jump_mode (progs_t *pr, const dstatement_t *st, int jump_ind)
|
|||
jump_offs = OPA(ptr) + OPB(int);
|
||||
break;
|
||||
}
|
||||
if (pr_boundscheck->int_val && jump_offs >= pr->progs->statements.count) {
|
||||
if (pr_boundscheck && jump_offs >= pr->progs->statements.count) {
|
||||
PR_RunError (pr, "out of bounds: %x", jump_offs);
|
||||
}
|
||||
return jump_offs - 1; // for st++
|
||||
|
@ -1900,7 +1900,7 @@ pr_stack_push (progs_t *pr)
|
|||
// keep the stack 16-byte aligned
|
||||
pr_ptr_t stack = *pr->globals.stack - 4;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
}
|
||||
*pr->globals.stack = stack;
|
||||
|
@ -1912,7 +1912,7 @@ pr_stack_pop (progs_t *pr)
|
|||
{
|
||||
pr_ptr_t stack = *pr->globals.stack;
|
||||
pr_type_t *stk = pr->pr_globals + stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack, 4);
|
||||
}
|
||||
// keep the stack 16-byte aligned
|
||||
|
@ -1929,7 +1929,7 @@ pr_stack_adjust (progs_t *pr, int mode, int offset)
|
|||
}
|
||||
|
||||
pr_ptr_t stack = *pr->globals.stack;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
check_stack_pointer (pr, stack + offset, 0);
|
||||
}
|
||||
*pr->globals.stack = stack + offset;
|
||||
|
|
|
@ -50,10 +50,42 @@
|
|||
|
||||
#include "compat.h"
|
||||
|
||||
VISIBLE cvar_t *pr_boundscheck;
|
||||
cvar_t *pr_deadbeef_ents;
|
||||
cvar_t *pr_deadbeef_locals;
|
||||
cvar_t *pr_faultchecks;
|
||||
VISIBLE int pr_boundscheck;
|
||||
static cvar_t pr_boundscheck_cvar = {
|
||||
.name = "pr_boundscheck",
|
||||
.description =
|
||||
"Server progs bounds checking",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &pr_boundscheck },
|
||||
};
|
||||
int pr_deadbeef_ents;
|
||||
static cvar_t pr_deadbeef_ents_cvar = {
|
||||
.name = "pr_deadbeef_ents",
|
||||
.description =
|
||||
"set to clear unallocated memory to 0xdeadbeef",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &pr_deadbeef_ents },
|
||||
};
|
||||
int pr_deadbeef_locals;
|
||||
static cvar_t pr_deadbeef_locals_cvar = {
|
||||
.name = "pr_deadbeef_locals",
|
||||
.description =
|
||||
"set to clear uninitialized local vars to 0xdeadbeef",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &pr_deadbeef_locals },
|
||||
};
|
||||
int pr_faultchecks;
|
||||
static cvar_t pr_faultchecks_cvar = {
|
||||
.name = "pr_faultchecks",
|
||||
.description =
|
||||
"capture and handle division by 0 in progs",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &pr_faultchecks },
|
||||
};
|
||||
|
||||
static const char *
|
||||
function_get_key (const void *f, void *_pr)
|
||||
|
@ -498,16 +530,10 @@ PR_LoadProgs (progs_t *pr, const char *progsname)
|
|||
VISIBLE void
|
||||
PR_Init_Cvars (void)
|
||||
{
|
||||
pr_boundscheck =
|
||||
Cvar_Get ("pr_boundscheck", "0", CVAR_NONE, NULL,
|
||||
"Server progs bounds checking");
|
||||
pr_deadbeef_ents = Cvar_Get ("pr_deadbeef_ents", "0", CVAR_NONE, NULL,
|
||||
"set to clear unallocated memory to 0xdeadbeef");
|
||||
pr_deadbeef_locals = Cvar_Get ("pr_deadbeef_locals", "0", CVAR_NONE, NULL,
|
||||
"set to clear uninitialized local vars to "
|
||||
"0xdeadbeef");
|
||||
pr_faultchecks = Cvar_Get ("pr_faultchecks", "0", CVAR_NONE, NULL,
|
||||
"capture and handle division by 0 in progs");
|
||||
Cvar_Register (&pr_boundscheck_cvar, 0, 0);
|
||||
Cvar_Register (&pr_deadbeef_ents_cvar, 0, 0);
|
||||
Cvar_Register (&pr_deadbeef_locals_cvar, 0, 0);
|
||||
Cvar_Register (&pr_faultchecks_cvar, 0, 0);
|
||||
PR_Debug_Init_Cvars ();
|
||||
}
|
||||
|
||||
|
|
|
@ -1562,7 +1562,7 @@ check_global (progs_t *pr, dstatement_t *st, const v6p_opcode_t *op, etype_t typ
|
|||
}
|
||||
if (!pr->denorm_found) {
|
||||
pr->denorm_found = 1;
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
Sys_Printf ("DENORMAL floats detected, these progs might "
|
||||
"not work. Good luck.\n");
|
||||
return;
|
||||
|
@ -1619,7 +1619,7 @@ PR_Check_v6p_Opcodes (progs_t *pr)
|
|||
//FIXME need to decide if I really want to always do static bounds checking
|
||||
// the only problem is that it slows progs load a little, but it's the only
|
||||
// way to check for qccx' evil
|
||||
if (0 && !pr_boundscheck->int_val) {
|
||||
if (0 && !pr_boundscheck) {
|
||||
for (i = 0, st = pr->pr_statements; i < pr->progs->statements.count;
|
||||
st++, i++) {
|
||||
pr_opcode_v6p_e st_op = (pr_opcode_v6p_e) st->op;
|
||||
|
|
|
@ -201,7 +201,7 @@ main (int argc, char **argv)
|
|||
Cmd_Init ();
|
||||
Cvar_Init ();
|
||||
PR_Init_Cvars ();
|
||||
pr_boundscheck->int_val = 1;
|
||||
pr_boundscheck = 1;
|
||||
|
||||
while ((c = getopt (argc, argv, "qvt:")) != EOF) {
|
||||
switch (c) {
|
||||
|
|
|
@ -76,8 +76,8 @@ GIB_Exec_Override_f (void)
|
|||
return;
|
||||
}
|
||||
if (!Cvar_Command ()
|
||||
&& (cmd_warncmd->int_val
|
||||
|| (developer && developer->int_val & SYS_dev)))
|
||||
&& (cmd_warncmd
|
||||
|| (developer && developer & SYS_dev)))
|
||||
Sys_Printf ("execing %s\n", Cmd_Argv (1));
|
||||
if ((strlen (Cmd_Argv (1)) >= 4
|
||||
&& !strcmp (Cmd_Argv (1) + strlen (Cmd_Argv (1)) - 4, ".gib"))
|
||||
|
|
|
@ -114,7 +114,8 @@ GIB_Process_Embedded (gib_tree_t * node, cbuf_args_t * args)
|
|||
} else if (cur->delim == '#')
|
||||
dstring_appendstr (args->argv[args->argc - 1], "0");
|
||||
else if (cvar)
|
||||
dstring_appendstr (args->argv[args->argc - 1], cvar->string);
|
||||
dstring_appendstr (args->argv[args->argc - 1],
|
||||
Cvar_VarString (cvar));
|
||||
} else if ((var = GIB_Var_Get_Complex (&GIB_DATA (cbuf_active)->locals,
|
||||
&GIB_DATA (cbuf_active)->globals,
|
||||
(char *) cur->str, &index, false))) {
|
||||
|
@ -126,7 +127,8 @@ GIB_Process_Embedded (gib_tree_t * node, cbuf_args_t * args)
|
|||
} else if (cur->delim == '#')
|
||||
dstring_appendstr (args->argv[args->argc - 1], "0");
|
||||
else if ((cvar = Cvar_FindVar (cur->str)))
|
||||
dstring_appendstr (args->argv[args->argc - 1], cvar->string);
|
||||
dstring_appendstr (args->argv[args->argc - 1],
|
||||
Cvar_VarString (cvar));
|
||||
}
|
||||
if (str[prev])
|
||||
dstring_appendstr (args->argv[args->argc - 1], str + prev);
|
||||
|
|
|
@ -222,9 +222,11 @@ GIB_Var_Get_Very_Complex (hashtab_t ** first, hashtab_t ** second, dstring_t *ke
|
|||
dstring_replace (key, n, i-n+varstartskip, "0", 1);
|
||||
protect = n+1;
|
||||
} else if ((cvar = Cvar_FindVar (key->str+n+1+varstartskip))) {
|
||||
const char *cvar_str = Cvar_VarString (cvar);
|
||||
key->str[i] = c;
|
||||
dstring_replace (key, n, i-n+varstartskip, cvar->string, strlen (cvar->string));
|
||||
protect = n+strlen(cvar->string);
|
||||
dstring_replace (key, n, i-n+varstartskip, cvar_str,
|
||||
strlen (cvar_str));
|
||||
protect = n+strlen(cvar_str);
|
||||
} else {
|
||||
key->str[i] = c;
|
||||
dstring_snip (key, n, n-i+varstartskip);
|
||||
|
|
|
@ -70,14 +70,79 @@ typedef struct {
|
|||
static struct DARRAY_TYPE (in_regdriver_t) in_drivers = { .grow = 8 };
|
||||
static struct DARRAY_TYPE (in_device_t) in_devices = { .grow = 8 };
|
||||
|
||||
cvar_t *in_grab;
|
||||
VISIBLE cvar_t *in_amp;
|
||||
VISIBLE cvar_t *in_pre_amp;
|
||||
cvar_t *in_freelook;
|
||||
cvar_t *in_mouse_filter;
|
||||
cvar_t *in_mouse_amp;
|
||||
cvar_t *in_mouse_pre_amp;
|
||||
cvar_t *lookstrafe;
|
||||
int in_grab;
|
||||
static cvar_t in_grab_cvar = {
|
||||
.name = "in_grab",
|
||||
.description =
|
||||
"With this set to 1, quake will grab the mouse, preventing loss of "
|
||||
"input focus.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &in_grab },
|
||||
};
|
||||
VISIBLE float in_amp;
|
||||
static cvar_t in_amp_cvar = {
|
||||
.name = "in_amp",
|
||||
.description =
|
||||
"global in_amp multiplier",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &in_amp },
|
||||
};
|
||||
VISIBLE float in_pre_amp;
|
||||
static cvar_t in_pre_amp_cvar = {
|
||||
.name = "in_pre_amp",
|
||||
.description =
|
||||
"global in_pre_amp multiplier",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &in_pre_amp },
|
||||
};
|
||||
int in_freelook;
|
||||
static cvar_t in_freelook_cvar = {
|
||||
.name = "freelook",
|
||||
.description =
|
||||
"force +mlook",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &in_freelook },
|
||||
};
|
||||
char *in_mouse_filter;
|
||||
static cvar_t in_mouse_filter_cvar = {
|
||||
.name = "in_mouse_filter",
|
||||
.description =
|
||||
"Toggle mouse input filtering.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &in_mouse_filter },
|
||||
};
|
||||
char *in_mouse_amp;
|
||||
static cvar_t in_mouse_amp_cvar = {
|
||||
.name = "in_mouse_amp",
|
||||
.description =
|
||||
"mouse in_mouse_amp multiplier",
|
||||
.default_value = "15",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &in_mouse_amp },
|
||||
};
|
||||
char *in_mouse_pre_amp;
|
||||
static cvar_t in_mouse_pre_amp_cvar = {
|
||||
.name = "in_mouse_pre_amp",
|
||||
.description =
|
||||
"mouse in_mouse_pre_amp multiplier",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &in_mouse_pre_amp },
|
||||
};
|
||||
char *lookstrafe;
|
||||
static cvar_t lookstrafe_cvar = {
|
||||
.name = "lookstrafe",
|
||||
.description =
|
||||
"when mlook/klook on player will strafe",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = 0/* not used */, .value = &lookstrafe },
|
||||
};
|
||||
|
||||
int64_t in_timeout = 10000;//10ms default timeout
|
||||
|
||||
|
@ -395,18 +460,22 @@ IN_GetButtonInfo (int devid, int button_num, in_buttoninfo_t *info)
|
|||
}
|
||||
|
||||
void
|
||||
IN_UpdateGrab (cvar_t *var) // called from context_*.c
|
||||
IN_UpdateGrab (int grab)
|
||||
{
|
||||
if (var) {
|
||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||
in_regdriver_t *rd = &in_drivers.a[i];
|
||||
if (rd->driver.grab_input) {
|
||||
rd->driver.grab_input (rd->data, var->int_val);
|
||||
}
|
||||
rd->driver.grab_input (rd->data, grab);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
in_grab_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
IN_UpdateGrab (in_grab);
|
||||
}
|
||||
|
||||
void
|
||||
IN_ProcessEvents (void)
|
||||
{
|
||||
|
@ -488,23 +557,14 @@ IN_Init (void)
|
|||
void
|
||||
IN_Init_Cvars (void)
|
||||
{
|
||||
in_grab = Cvar_Get ("in_grab", "0", CVAR_ARCHIVE, IN_UpdateGrab,
|
||||
"With this set to 1, quake will grab the mouse, "
|
||||
"preventing loss of input focus.");
|
||||
in_amp = Cvar_Get ("in_amp", "1", CVAR_ARCHIVE, NULL,
|
||||
"global in_amp multiplier");
|
||||
in_pre_amp = Cvar_Get ("in_pre_amp", "1", CVAR_ARCHIVE, NULL,
|
||||
"global in_pre_amp multiplier");
|
||||
in_freelook = Cvar_Get ("freelook", "0", CVAR_ARCHIVE, NULL,
|
||||
"force +mlook");
|
||||
in_mouse_filter = Cvar_Get ("in_mouse_filter", "0", CVAR_ARCHIVE, NULL,
|
||||
"Toggle mouse input filtering.");
|
||||
in_mouse_amp = Cvar_Get ("in_mouse_amp", "15", CVAR_ARCHIVE, NULL,
|
||||
"mouse in_mouse_amp multiplier");
|
||||
in_mouse_pre_amp = Cvar_Get ("in_mouse_pre_amp", "1", CVAR_ARCHIVE, NULL,
|
||||
"mouse in_mouse_pre_amp multiplier");
|
||||
lookstrafe = Cvar_Get ("lookstrafe", "0", CVAR_ARCHIVE, NULL,
|
||||
"when mlook/klook on player will strafe");
|
||||
Cvar_Register (&in_grab_cvar, in_grab_f, 0);
|
||||
Cvar_Register (&in_amp_cvar, 0, 0);
|
||||
Cvar_Register (&in_pre_amp_cvar, 0, 0);
|
||||
Cvar_Register (&in_freelook_cvar, 0, 0);
|
||||
Cvar_Register (&in_mouse_filter_cvar, 0, 0);
|
||||
Cvar_Register (&in_mouse_amp_cvar, 0, 0);
|
||||
Cvar_Register (&in_mouse_pre_amp_cvar, 0, 0);
|
||||
Cvar_Register (&lookstrafe_cvar, 0, 0);
|
||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||
in_regdriver_t *rd = &in_drivers.a[i];
|
||||
if (rd->driver.init_cvars) {
|
||||
|
|
|
@ -267,7 +267,8 @@ imt_switcher_update (imt_switcher_t *switcher)
|
|||
val = !!(input->button->state & inb_down);
|
||||
break;
|
||||
case imti_cvar:
|
||||
val = !!input->cvar->int_val;
|
||||
//FIXME check cvar type
|
||||
val = !!*(int *) input->cvar->value.value;
|
||||
break;
|
||||
}
|
||||
state |= val << i;
|
||||
|
@ -497,6 +498,7 @@ IMT_CreateSwitcher (const char *switcher_name, int context, imt_t *default_imt,
|
|||
switcher);
|
||||
} else {
|
||||
input->type = imti_cvar;
|
||||
//FIXME check cvar type
|
||||
input->cvar = Cvar_FindVar (input_name);
|
||||
Cvar_AddListener (input->cvar, imt_switcher_cvar_update, switcher);
|
||||
}
|
||||
|
|
|
@ -350,10 +350,9 @@ gl_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
|
|||
cache = dstring_new ();
|
||||
fullpath = dstring_new ();
|
||||
|
||||
if (!gl_alias_render_tri->int_val) {
|
||||
if (!gl_alias_render_tri) {
|
||||
|
||||
if (gl_mesh_cache->int_val
|
||||
&& gl_mesh_cache->int_val <= header->mdl.numtris) {
|
||||
if (gl_mesh_cache && gl_mesh_cache <= header->mdl.numtris) {
|
||||
do_cache = true;
|
||||
|
||||
mdfour (model_digest, (unsigned char *) _m, _s);
|
||||
|
|
|
@ -125,7 +125,7 @@ gl_Mod_ProcessTexture (model_t *mod, texture_t *tx)
|
|||
r_notexture_mip->render = &gl_notexture;
|
||||
return;
|
||||
}
|
||||
if (gl_textures_external && gl_textures_external->int_val) {
|
||||
if (gl_textures_external) {
|
||||
if (Mod_LoadExternalTextures (mod, tx)) {
|
||||
return;
|
||||
}
|
||||
|
@ -239,8 +239,7 @@ SubdividePolygon (int numverts, float *verts)
|
|||
|
||||
for (i = 0; i < 3; i++) {
|
||||
m = (mins[i] + maxs[i]) * 0.5;
|
||||
m = gl_subdivide_size->value * floor (m / gl_subdivide_size->value +
|
||||
0.5);
|
||||
m = gl_subdivide_size * floor (m / gl_subdivide_size + 0.5);
|
||||
if (maxs[i] - m < 8)
|
||||
continue;
|
||||
if (m - mins[i] < 8)
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
#include "compat.h"
|
||||
#include "mod_internal.h"
|
||||
|
||||
VISIBLE cvar_t *gl_sky_divide; //FIXME visibility?
|
||||
VISIBLE int mod_sky_divide; //FIXME visibility?
|
||||
VISIBLE int mod_lightmap_bytes = 1; //FIXME should this be visible?
|
||||
|
||||
VISIBLE mleaf_t *
|
||||
|
@ -640,9 +640,11 @@ Mod_LoadFaces (model_t *mod, bsp_t *bsp)
|
|||
|
||||
if (!strncmp (out->texinfo->texture->name, "sky", 3)) { // sky
|
||||
out->flags |= (SURF_DRAWSKY | SURF_DRAWTILED);
|
||||
if (gl_sky_divide && gl_sky_divide->int_val)
|
||||
if (mod_funcs && mod_funcs->Mod_SubdivideSurface)
|
||||
if (mod_sky_divide) {
|
||||
if (mod_funcs && mod_funcs->Mod_SubdivideSurface) {
|
||||
mod_funcs->Mod_SubdivideSurface (mod, out);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -174,12 +174,12 @@ build_skin (skin_t *skin, int cmap)
|
|||
int texnum, fb_texnum;
|
||||
|
||||
// FIXME deek: This 512x256 limit sucks!
|
||||
scaled_width = min (gl_max_size->int_val, 512);
|
||||
scaled_height = min (gl_max_size->int_val, 256);
|
||||
scaled_width = min (gl_max_size, 512);
|
||||
scaled_height = min (gl_max_size, 256);
|
||||
|
||||
// allow users to crunch sizes down even more if they want
|
||||
scaled_width >>= gl_playermip->int_val;
|
||||
scaled_height >>= gl_playermip->int_val;
|
||||
scaled_width >>= gl_playermip;
|
||||
scaled_height >>= gl_playermip;
|
||||
scaled_width = max (scaled_width, 1);
|
||||
scaled_height = max (scaled_height, 1);
|
||||
|
||||
|
|
|
@ -59,10 +59,43 @@ static size_t mod_numknown;
|
|||
|
||||
VISIBLE texture_t *r_notexture_mip;
|
||||
|
||||
cvar_t *gl_mesh_cache;
|
||||
cvar_t *gl_subdivide_size;
|
||||
cvar_t *gl_alias_render_tri;
|
||||
cvar_t *gl_textures_external;
|
||||
int gl_mesh_cache;
|
||||
static cvar_t gl_mesh_cache_cvar = {
|
||||
.name = "gl_mesh_cache",
|
||||
.description =
|
||||
"minimum triangle count in a model for its mesh to be cached. 0 to "
|
||||
"disable caching",
|
||||
.default_value = "256",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &gl_mesh_cache },
|
||||
};
|
||||
float gl_subdivide_size;
|
||||
static cvar_t gl_subdivide_size_cvar = {
|
||||
.name = "gl_subdivide_size",
|
||||
.description =
|
||||
"Sets the division value for the sky brushes.",
|
||||
.default_value = "128",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_float, .value = &gl_subdivide_size },
|
||||
};
|
||||
int gl_alias_render_tri;
|
||||
static cvar_t gl_alias_render_tri_cvar = {
|
||||
.name = "gl_alias_render_tri",
|
||||
.description =
|
||||
"When loading alias models mesh for pure triangle rendering",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &gl_alias_render_tri },
|
||||
};
|
||||
int gl_textures_external;
|
||||
static cvar_t gl_textures_external_cvar = {
|
||||
.name = "gl_textures_external",
|
||||
.description =
|
||||
"Use external textures to replace BSP textures",
|
||||
.default_value = "1",
|
||||
.flags = CVAR_ARCHIVE,
|
||||
.value = { .type = &cexpr_int, .value = &gl_textures_external },
|
||||
};
|
||||
|
||||
static void Mod_CallbackLoad (void *object, cache_allocator_t allocator);
|
||||
|
||||
|
@ -99,18 +132,10 @@ Mod_Init (void)
|
|||
VISIBLE void
|
||||
Mod_Init_Cvars (void)
|
||||
{
|
||||
gl_subdivide_size =
|
||||
Cvar_Get ("gl_subdivide_size", "128", CVAR_ARCHIVE, NULL,
|
||||
"Sets the division value for the sky brushes.");
|
||||
gl_mesh_cache = Cvar_Get ("gl_mesh_cache", "256", CVAR_ARCHIVE, NULL,
|
||||
"minimum triangle count in a model for its mesh"
|
||||
" to be cached. 0 to disable caching");
|
||||
gl_alias_render_tri =
|
||||
Cvar_Get ("gl_alias_render_tri", "0", CVAR_ARCHIVE, NULL, "When "
|
||||
"loading alias models mesh for pure triangle rendering");
|
||||
gl_textures_external =
|
||||
Cvar_Get ("gl_textures_external", "1", CVAR_ARCHIVE, NULL,
|
||||
"Use external textures to replace BSP textures");
|
||||
Cvar_Register (&gl_subdivide_size_cvar, 0, 0);
|
||||
Cvar_Register (&gl_mesh_cache_cvar, 0, 0);
|
||||
Cvar_Register (&gl_alias_render_tri_cvar, 0, 0);
|
||||
Cvar_Register (&gl_textures_external_cvar, 0, 0);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -114,7 +114,15 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
static cvar_t *net_family;
|
||||
static char *net_family;
|
||||
static cvar_t net_family_cvar = {
|
||||
.name = "net_family",
|
||||
.description =
|
||||
"Set the address family to ipv4, ipv6 or unspecified",
|
||||
.default_value = "unspecified",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &net_family },
|
||||
};
|
||||
|
||||
netadr_t net_from;
|
||||
netadr_t net_local_adr;
|
||||
|
@ -330,9 +338,9 @@ NET_StringToAdr (const char *s, netadr_t *a)
|
|||
|
||||
memset (&hints, 0, sizeof (hints));
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
if (strchr (net_family->string, '6')) {
|
||||
if (strchr (net_family, '6')) {
|
||||
hints.ai_family = AF_INET6;
|
||||
} else if (strchr (net_family->string, '4')) {
|
||||
} else if (strchr (net_family, '4')) {
|
||||
hints.ai_family = AF_INET;
|
||||
} else {
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
|
@ -492,9 +500,9 @@ UDP_OpenSocket (int port)
|
|||
address.sin6_family = AF_INET6;
|
||||
|
||||
memset (&hints, 0, sizeof (hints));
|
||||
if (strchr (net_family->string, '6')) {
|
||||
if (strchr (net_family, '6')) {
|
||||
hints.ai_family = AF_INET6;
|
||||
} else if (strchr (net_family->string, '4')) {
|
||||
} else if (strchr (net_family, '4')) {
|
||||
hints.ai_family = AF_INET;
|
||||
} else {
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
|
@ -581,9 +589,7 @@ NET_Init (int port)
|
|||
if (r)
|
||||
Sys_Error ("Winsock initialization failed.");
|
||||
#endif /* _WIN32 */
|
||||
net_family = Cvar_Get ("net_family", "unspecified", CVAR_ROM, 0,
|
||||
"Set the address family to ipv4, ipv6 or"
|
||||
" unspecified");
|
||||
Cvar_Register (&net_family_cvar, 0, 0);
|
||||
|
||||
// open the single socket to be used for all communications
|
||||
net_socket = UDP_OpenSocket (port);
|
||||
|
|
|
@ -54,9 +54,35 @@
|
|||
int net_nochoke;
|
||||
int net_blocksend;
|
||||
double *net_realtime;
|
||||
cvar_t *showpackets;
|
||||
cvar_t *showdrop;
|
||||
cvar_t *qport;
|
||||
int showpackets;
|
||||
static cvar_t showpackets_cvar = {
|
||||
.name = "showpackets",
|
||||
.description =
|
||||
"Show all network packets",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &showpackets },
|
||||
};
|
||||
int showdrop;
|
||||
static cvar_t showdrop_cvar = {
|
||||
.name = "showdrop",
|
||||
.description =
|
||||
"Toggle the display of how many packets you are dropping",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &showdrop },
|
||||
};
|
||||
int qport;
|
||||
static cvar_t qport_cvar = {
|
||||
.name = "qport",
|
||||
.description =
|
||||
"The internal port number for the game networking code. Useful for "
|
||||
"clients who use multiple connections through one IP address (NAT/IP-"
|
||||
"MASQ) because default port is random.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &qport },
|
||||
};
|
||||
void (*net_log_packet) (int length, const void *data, netadr_t to);
|
||||
|
||||
|
||||
|
@ -68,21 +94,15 @@ Netchan_Init (void)
|
|||
// pick a port value that should be nice and random
|
||||
port = Sys_TimeID ();
|
||||
|
||||
Cvar_SetValue (qport, port);
|
||||
qport = port;
|
||||
}
|
||||
|
||||
void
|
||||
Netchan_Init_Cvars (void)
|
||||
{
|
||||
showpackets = Cvar_Get ("showpackets", "0", CVAR_NONE, NULL,
|
||||
"Show all network packets");
|
||||
showdrop = Cvar_Get ("showdrop", "0", CVAR_NONE, NULL, "Toggle the "
|
||||
"display of how many packets you are dropping");
|
||||
qport = Cvar_Get ("qport", "0", CVAR_NONE, NULL, "The internal port "
|
||||
"number for the game networking code. Useful for "
|
||||
"clients who use multiple connections through one "
|
||||
"IP address (NAT/IP-MASQ) because default port is "
|
||||
"random.");
|
||||
Cvar_Register (&showpackets_cvar, 0, 0);
|
||||
Cvar_Register (&showdrop_cvar, 0, 0);
|
||||
Cvar_Register (&qport_cvar, 0, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -256,13 +276,13 @@ Netchan_Transmit (netchan_t *chan, unsigned length, byte *data)
|
|||
if (net_nochoke)
|
||||
chan->cleartime = *net_realtime;
|
||||
|
||||
if (showpackets->int_val & 1) {
|
||||
if (showpackets & 1) {
|
||||
Sys_Printf ("--> s=%i(%i) a=%i(%i) %-4i %i\n",
|
||||
chan->outgoing_sequence, send_reliable,
|
||||
chan->incoming_sequence, chan->incoming_reliable_sequence,
|
||||
send.cursize,
|
||||
chan->outgoing_sequence - chan->incoming_sequence);
|
||||
if (showpackets->int_val & 4) {
|
||||
if (showpackets & 4) {
|
||||
SZ_Dump (&send);
|
||||
}
|
||||
}
|
||||
|
@ -292,10 +312,10 @@ Netchan_Process (netchan_t *chan)
|
|||
sequence &= ~(1 << 31);
|
||||
sequence_ack &= ~(1 << 31);
|
||||
|
||||
if (showpackets->int_val & 2) {
|
||||
if (showpackets & 2) {
|
||||
Sys_Printf ("<-- s=%i(%i) a=%i(%i) %i\n", sequence, reliable_message,
|
||||
sequence_ack, reliable_ack, net_message->message->cursize);
|
||||
if (showpackets->int_val & 8) {
|
||||
if (showpackets & 8) {
|
||||
SZ_Dump (net_message->message);
|
||||
}
|
||||
}
|
||||
|
@ -329,7 +349,7 @@ Netchan_Process (netchan_t *chan)
|
|||
|
||||
/// Discard stale or duplicated packets.
|
||||
if (sequence < (unsigned int) chan->incoming_sequence + 1) {
|
||||
if (showdrop->int_val)
|
||||
if (showdrop)
|
||||
Sys_Printf ("%s:Out of order packet %i at %i\n",
|
||||
NET_AdrToString (chan->remote_address), sequence,
|
||||
chan->incoming_sequence);
|
||||
|
@ -341,7 +361,7 @@ Netchan_Process (netchan_t *chan)
|
|||
if (chan->net_drop > 0) {
|
||||
chan->drop_count += 1;
|
||||
|
||||
if (showdrop->int_val)
|
||||
if (showdrop)
|
||||
Sys_Printf ("%s:Dropped %i packets at %i\n",
|
||||
NET_AdrToString (chan->remote_address),
|
||||
sequence - (chan->incoming_sequence + 1), sequence);
|
||||
|
|
|
@ -86,8 +86,24 @@ int messagesReceived = 0;
|
|||
int unreliableMessagesSent = 0;
|
||||
int unreliableMessagesReceived = 0;
|
||||
|
||||
cvar_t *net_messagetimeout;
|
||||
cvar_t *hostname;
|
||||
float net_messagetimeout;
|
||||
static cvar_t net_messagetimeout_cvar = {
|
||||
.name = "net_messagetimeout",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "300",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_float, .value = &net_messagetimeout },
|
||||
};
|
||||
char *hostname;
|
||||
static cvar_t hostname_cvar = {
|
||||
.name = "hostname",
|
||||
.description =
|
||||
"None",
|
||||
.default_value = "UNNAMED",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = 0, .value = &hostname },
|
||||
};
|
||||
|
||||
QFile *vcrFile;
|
||||
qboolean recording = false;
|
||||
|
@ -229,9 +245,9 @@ MaxPlayers_f (void)
|
|||
|
||||
svs.maxclients = n;
|
||||
if (n == 1)
|
||||
Cvar_Set (deathmatch, "0");
|
||||
Cvar_Set ("deathmatch", "0");
|
||||
else
|
||||
Cvar_Set (deathmatch, "1");
|
||||
Cvar_Set ("deathmatch", "1");
|
||||
}
|
||||
|
||||
|
||||
|
@ -574,7 +590,7 @@ NET_GetMessage (qsocket_t *sock)
|
|||
|
||||
// see if this connection has timed out
|
||||
if (ret == 0 && sock->driver) {
|
||||
if (net_time - sock->lastMessageTime > net_messagetimeout->value) {
|
||||
if (net_time - sock->lastMessageTime > net_messagetimeout) {
|
||||
Sys_MaskPrintf (SYS_net, "socket timed out\n");
|
||||
NET_Close (sock);
|
||||
return -1;
|
||||
|
@ -849,9 +865,8 @@ NET_Init (cbuf_t *cbuf)
|
|||
// allocate space for network message buffer
|
||||
SZ_Alloc (&_net_message_message, NET_MAXMESSAGE);
|
||||
|
||||
net_messagetimeout =
|
||||
Cvar_Get ("net_messagetimeout", "300", CVAR_NONE, NULL, "None");
|
||||
hostname = Cvar_Get ("hostname", "UNNAMED", CVAR_NONE, NULL, "None");
|
||||
Cvar_Register (&net_messagetimeout_cvar, 0, 0);
|
||||
Cvar_Register (&hostname_cvar, 0, 0);
|
||||
|
||||
Cmd_AddCommand ("slist", NET_Slist_f, "No Description");
|
||||
Cmd_AddCommand ("listen", NET_Listen_f, "No Description");
|
||||
|
|
|
@ -634,7 +634,7 @@ _Datagram_CheckNewConnections (void)
|
|||
MSG_WriteByte (net_message->message, CCREP_SERVER_INFO);
|
||||
dfunc.GetSocketAddr (acceptsock, &newaddr);
|
||||
MSG_WriteString (net_message->message, dfunc.AddrToString (&newaddr));
|
||||
MSG_WriteString (net_message->message, hostname->string);
|
||||
MSG_WriteString (net_message->message, hostname);
|
||||
MSG_WriteString (net_message->message, sv.name);
|
||||
MSG_WriteByte (net_message->message, net_activeconnections);
|
||||
MSG_WriteByte (net_message->message, svs.maxclients);
|
||||
|
@ -719,7 +719,7 @@ _Datagram_CheckNewConnections (void)
|
|||
MSG_WriteByte (net_message->message, CCREP_RULE_INFO);
|
||||
if (var) {
|
||||
MSG_WriteString (net_message->message, var->name);
|
||||
MSG_WriteString (net_message->message, var->string);
|
||||
MSG_WriteString (net_message->message, Cvar_VarString (var));
|
||||
}
|
||||
MSG_PokeLongBE (net_message->message, 0,
|
||||
NETFLAG_CTL | net_message->message->cursize);
|
||||
|
|
|
@ -69,8 +69,8 @@ Loop_SearchForHosts (qboolean xmit)
|
|||
return;
|
||||
|
||||
const char *name = "local";
|
||||
if (strcmp (hostname->string, "UNNAMED") != 0) {
|
||||
name = hostname->string;
|
||||
if (strcmp (hostname, "UNNAMED") != 0) {
|
||||
name = hostname;
|
||||
}
|
||||
const char *map = sv.name;
|
||||
int users = net_activeconnections;
|
||||
|
|
|
@ -259,9 +259,9 @@ UDP_Init (void)
|
|||
myAddr = 0;
|
||||
|
||||
// if the quake hostname isn't set, set it to the machine name
|
||||
if (strcmp (hostname->string, "UNNAMED") == 0) {
|
||||
if (strcmp (hostname, "UNNAMED") == 0) {
|
||||
buff[15] = 0;
|
||||
Cvar_Set (hostname, buff);
|
||||
Cvar_Set ("hostname", buff);
|
||||
}
|
||||
|
||||
if ((net_controlsocket = UDP_OpenSocket (0)) == -1)
|
||||
|
@ -552,7 +552,7 @@ UDP_Read (int socket, byte *buf, int len, netadr_t *from)
|
|||
UDP_AddrToString (from));
|
||||
last_iface = default_iface;
|
||||
#endif
|
||||
if (developer->int_val & SYS_net) {
|
||||
if (developer & SYS_net) {
|
||||
hex_dump_buf (buf, ret);
|
||||
}
|
||||
return ret;
|
||||
|
@ -603,7 +603,7 @@ UDP_Write (int socket, byte *buf, int len, netadr_t *to)
|
|||
return 0;
|
||||
Sys_MaskPrintf (SYS_net, "sent %d bytes to %s\n", ret,
|
||||
UDP_AddrToString (to));
|
||||
if (developer->int_val & SYS_net) {
|
||||
if (developer & SYS_net) {
|
||||
hex_dump_buf (buf, len);
|
||||
}
|
||||
return ret;
|
||||
|
|
|
@ -252,7 +252,7 @@ WINS_Init (void)
|
|||
return -1;
|
||||
}
|
||||
// if the quake hostname isn't set, set it to the machine name
|
||||
if (strcmp (hostname->string, "UNNAMED") == 0) {
|
||||
if (strcmp (hostname, "UNNAMED") == 0) {
|
||||
// see if it's a text IP address (well, close enough)
|
||||
for (p = buff; *p; p++)
|
||||
if ((*p < '0' || *p > '9') && *p != '.')
|
||||
|
@ -265,7 +265,7 @@ WINS_Init (void)
|
|||
break;
|
||||
buff[i] = 0;
|
||||
}
|
||||
Cvar_Set (hostname, buff);
|
||||
Cvar_Set ("hostname", buff);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("-ip");
|
||||
|
|
|
@ -209,7 +209,7 @@ PF_cvar (progs_t *pr, void *data)
|
|||
|
||||
str = P_GSTRING (pr, 0);
|
||||
|
||||
R_FLOAT (pr) = Cvar_VariableValue (str);
|
||||
R_FLOAT (pr) = Cvar_Value (str);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -231,7 +231,7 @@ PF_cvar_set (progs_t *pr, void *data)
|
|||
return;
|
||||
}
|
||||
|
||||
Cvar_Set (var, val);
|
||||
Cvar_SetVar (var, val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
#include "QF/progs.h"
|
||||
#include "QF/va.h"
|
||||
|
||||
#include "QF/simd/types.h"
|
||||
|
||||
#include "rua_internal.h"
|
||||
|
||||
typedef struct bi_alias_s {
|
||||
|
@ -127,7 +129,7 @@ bi_Cvar_SetString (progs_t *pr, void *_res)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
Cvar_Set (var, val);
|
||||
Cvar_SetVar (var, val);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -140,7 +142,7 @@ bi_Cvar_SetInteger (progs_t *pr, void *_res)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
Cvar_Set (var, va (0, "%d", val));
|
||||
Cvar_SetVar (var, va (0, "%d", val));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -153,7 +155,7 @@ bi_Cvar_SetFloat (progs_t *pr, void *_res)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
Cvar_Set (var, va (0, "%g", val));
|
||||
Cvar_SetVar (var, va (0, "%g", val));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -166,7 +168,7 @@ bi_Cvar_SetVector (progs_t *pr, void *_res)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
Cvar_Set (var, va (0, "%g %g %g", val[0], val[1], val[2]));
|
||||
Cvar_SetVar (var, va (0, "%g %g %g", val[0], val[1], val[2]));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -178,7 +180,7 @@ bi_Cvar_GetString (progs_t *pr, void *_res)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
RETURN_STRING (pr, var->string);
|
||||
RETURN_STRING (pr, Cvar_VarString (var));
|
||||
else
|
||||
RETURN_STRING (pr, "");
|
||||
}
|
||||
|
@ -189,9 +191,13 @@ bi_Cvar_GetInteger (progs_t *pr, void *_res)
|
|||
const char *varname = P_GSTRING (pr, 0);
|
||||
cvar_t *var = Cvar_FindVar (varname);
|
||||
|
||||
R_INT (pr) = 0;
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
R_INT (pr) = var ? var->int_val : 0;
|
||||
if (!var || var->value.type != &cexpr_int)
|
||||
return;
|
||||
|
||||
R_INT (pr) = *(int *) var->value.value;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -200,9 +206,12 @@ bi_Cvar_GetFloat (progs_t *pr, void *_res)
|
|||
const char *varname = P_GSTRING (pr, 0);
|
||||
cvar_t *var = Cvar_FindVar (varname);
|
||||
|
||||
R_FLOAT (pr) = 0;
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
R_FLOAT (pr) = var ? var->value : 0;
|
||||
if (!var || var->value.type != &cexpr_float)
|
||||
return;
|
||||
R_INT (pr) = *(float *) var->value.value;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -213,8 +222,8 @@ bi_Cvar_GetVector (progs_t *pr, void *_res)
|
|||
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
RETURN_VECTOR (pr, var->vec);
|
||||
if (var && var->value.type == &cexpr_vector)
|
||||
RETURN_VECTOR (pr, *(vec4f_t *) var->value.value);
|
||||
else
|
||||
VectorZero (R_VECTOR (pr));
|
||||
}
|
||||
|
@ -228,8 +237,9 @@ bi_Cvar_Toggle (progs_t *pr, void *_res)
|
|||
var = Cvar_FindVar (varname);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (varname);
|
||||
if (var)
|
||||
Cvar_Set (var, var->int_val ? "0" : "1");
|
||||
if (var && var->value.type == &cexpr_int) {
|
||||
*(int *) var->value.value = !*(int *) var->value.value;
|
||||
}
|
||||
}
|
||||
|
||||
#define bi(x,np,params...) {#x, bi_##x, -1, np, {params}}
|
||||
|
|
|
@ -860,7 +860,7 @@ obj_find_message (probj_t *probj, pr_class_t *class, pr_sel_t *selector)
|
|||
pr_method_t *method;
|
||||
pr_sel_t *sel;
|
||||
int i;
|
||||
int dev = developer->int_val;
|
||||
int dev = developer;
|
||||
pr_string_t *names;
|
||||
|
||||
if (dev & SYS_rua_msg) {
|
||||
|
@ -882,7 +882,7 @@ obj_find_message (probj_t *probj, pr_class_t *class, pr_sel_t *selector)
|
|||
for (i = 0, method = method_list->method_list;
|
||||
i < method_list->method_count; i++, method++) {
|
||||
sel = &G_STRUCT (pr, pr_sel_t, method->method_name);
|
||||
if (developer->int_val & SYS_rua_msg) {
|
||||
if (developer & SYS_rua_msg) {
|
||||
names = probj->selector_names;
|
||||
Sys_Printf (" %s\n",
|
||||
PR_GetString (pr, names[sel->sel_id]));
|
||||
|
@ -1214,7 +1214,7 @@ rua___obj_exec_class (progs_t *pr, void *data)
|
|||
Sys_MaskPrintf (SYS_rua_obj, " instance variables: %d @ %x\n",
|
||||
class->instance_size,
|
||||
class->ivars);
|
||||
if (developer->int_val & SYS_rua_obj)
|
||||
if (developer & SYS_rua_obj)
|
||||
dump_ivars (probj, class->ivars);
|
||||
Sys_MaskPrintf (SYS_rua_obj, " instance methods: %x\n",
|
||||
class->methods);
|
||||
|
@ -1224,7 +1224,7 @@ rua___obj_exec_class (progs_t *pr, void *data)
|
|||
Sys_MaskPrintf (SYS_rua_obj, " instance variables: %d @ %x\n",
|
||||
meta->instance_size,
|
||||
meta->ivars);
|
||||
if (developer->int_val & SYS_rua_obj)
|
||||
if (developer & SYS_rua_obj)
|
||||
dump_ivars (probj, meta->ivars);
|
||||
|
||||
class->subclass_list = 0;
|
||||
|
@ -1482,7 +1482,7 @@ rua_obj_msg_sendv (progs_t *pr, void *data)
|
|||
if (count < 2 || count > PR_MAX_PARAMS) {
|
||||
PR_RunError (pr, "bad args count in obj_msg_sendv: %d", count);
|
||||
}
|
||||
if (pr_boundscheck->int_val) {
|
||||
if (pr_boundscheck) {
|
||||
PR_BoundsCheckSize (pr, args->list, count * pr->pr_param_size);
|
||||
}
|
||||
|
||||
|
|
|
@ -132,21 +132,13 @@ cexpr_cvar (const char *name, exprctx_t *ctx)
|
|||
}
|
||||
|
||||
exprtype_t *type = ctx->result->type;
|
||||
binop_t *cast = cexpr_find_cast (type, &cexpr_int);
|
||||
|
||||
exprval_t *val = 0;
|
||||
if (cast || val->type == &cexpr_int || val->type == &cexpr_uint) {
|
||||
val = cexpr_value (type, ctx);
|
||||
*(int *) val->value = var->int_val;
|
||||
} else if (val->type == &cexpr_float) {
|
||||
val = cexpr_value (type, ctx);
|
||||
*(float *) val->value = var->value;
|
||||
} else if (val->type == &cexpr_double) {
|
||||
val = cexpr_value (type, ctx);
|
||||
//FIXME cvars need to support double values
|
||||
*(double *) val->value = var->value;
|
||||
}
|
||||
if (var->value.type) {
|
||||
exprval_t *val = cexpr_value (type, ctx);
|
||||
cexpr_assign_value (val, &var->value, ctx);
|
||||
return val;
|
||||
}
|
||||
cexpr_error (ctx, "cvar %s has unknown type", var->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
VISIBLE exprval_t *
|
||||
|
|
|
@ -65,7 +65,15 @@ typedef struct cmd_provider_s
|
|||
|
||||
static cmdalias_t *cmd_alias;
|
||||
|
||||
VISIBLE cvar_t *cmd_warncmd;
|
||||
VISIBLE int cmd_warncmd;
|
||||
static cvar_t cmd_warncmd_cvar = {
|
||||
.name = "cmd_warncmd",
|
||||
.description =
|
||||
"Toggles the display of error messages for unknown commands",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &cmd_warncmd },
|
||||
};
|
||||
|
||||
static hashtab_t *cmd_alias_hash;
|
||||
static hashtab_t *cmd_hash;
|
||||
|
@ -130,7 +138,7 @@ Cmd_Command (cbuf_args_t *args)
|
|||
return 0;
|
||||
if (cbuf_active->strict)
|
||||
return -1;
|
||||
else if (cmd_warncmd->int_val || developer->int_val & SYS_dev)
|
||||
else if (cmd_warncmd || developer & SYS_dev)
|
||||
Sys_Printf ("Unknown command \"%s\"\n", Cmd_Argv (0));
|
||||
return 0;
|
||||
}
|
||||
|
@ -515,9 +523,7 @@ Cmd_Exec_f (void)
|
|||
Sys_Printf ("couldn't exec %s\n", Cmd_Argv (1));
|
||||
return;
|
||||
}
|
||||
if (!Cvar_Command ()
|
||||
&& (cmd_warncmd->int_val
|
||||
|| (developer && developer->int_val & SYS_dev)))
|
||||
if (!Cvar_Command () && (cmd_warncmd || (developer & SYS_dev)))
|
||||
Sys_Printf ("execing %s\n", Cmd_Argv (1));
|
||||
Cbuf_InsertText (cbuf_active, f);
|
||||
Hunk_FreeToLowMark (0, mark);
|
||||
|
@ -629,8 +635,7 @@ Cmd_Init (void)
|
|||
Cmd_AddCommand ("echo", Cmd_Echo_f, "Print text to console");
|
||||
Cmd_AddCommand ("wait", Cmd_Wait_f, "Wait a game tic");
|
||||
Cmd_AddCommand ("sleep", Cmd_Sleep_f, "Wait for a certain number of seconds.");
|
||||
cmd_warncmd = Cvar_Get ("cmd_warncmd", "0", CVAR_NONE, NULL, "Toggles the "
|
||||
"display of error messages for unknown commands");
|
||||
Cvar_Register (&cmd_warncmd_cvar, 0, 0);
|
||||
cmd_cbuf = Cbuf_New (&id_interp);
|
||||
|
||||
Cmd_AddProvider("id", &id_interp);
|
||||
|
|
410
libs/util/cvar.c
410
libs/util/cvar.c
|
@ -43,6 +43,7 @@
|
|||
|
||||
#include "QF/cmd.h"
|
||||
#include "QF/cvar.h"
|
||||
#include "QF/cmem.h"
|
||||
#include "QF/hash.h"
|
||||
#include "QF/mathlib.h"
|
||||
#include "QF/plist.h"
|
||||
|
@ -56,13 +57,82 @@
|
|||
#define USER_RO_CVAR "User-created READ-ONLY Cvar"
|
||||
#define USER_CVAR "User-created cvar"
|
||||
|
||||
VISIBLE cvar_t *developer;
|
||||
static exprenum_t developer_enum;
|
||||
static exprtype_t developer_type = {
|
||||
.name = "developer",
|
||||
.size = sizeof (int),
|
||||
.binops = cexpr_flag_binops,
|
||||
.unops = cexpr_flag_unops,
|
||||
.data = &developer_enum,
|
||||
.get_string = cexpr_enum_get_string,
|
||||
};
|
||||
|
||||
#define SYS_DEVELOPER(dev) (SYS_##dev & ~SYS_dev),
|
||||
static int developer_values[] = {
|
||||
SYS_dev,
|
||||
#include "QF/sys_developer.h"
|
||||
};
|
||||
#undef SYS_DEVELOPER
|
||||
#define SYS_DEVELOPER(dev) {#dev, &developer_type, developer_values + __LINE__ - 31},
|
||||
static exprsym_t developer_symbols[] = {
|
||||
{"dev", &developer_type, developer_values + 0},
|
||||
#include "QF/sys_developer.h"
|
||||
{}
|
||||
};
|
||||
#undef SYS_DEVELOPER
|
||||
static exprtab_t developer_symtab = {
|
||||
developer_symbols,
|
||||
};
|
||||
static exprenum_t developer_enum = {
|
||||
&developer_type,
|
||||
&developer_symtab,
|
||||
};
|
||||
|
||||
VISIBLE int developer;
|
||||
static cvar_t developer_cvar = {
|
||||
.name = "developer",
|
||||
.description =
|
||||
"set to enable extra debugging information",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &developer_type, .value = &developer },
|
||||
};
|
||||
VISIBLE cvar_t *cvar_vars;
|
||||
static cvar_t *user_cvars;
|
||||
static const char *cvar_null_string = "";
|
||||
static cvar_alias_t *calias_vars;
|
||||
static hashtab_t *cvar_hash;
|
||||
static hashtab_t *calias_hash;
|
||||
|
||||
static cvar_t *
|
||||
cvar_create (const char *name, const char *value)
|
||||
{
|
||||
cvar_t *var = calloc (1, sizeof (cvar_t) + sizeof (char *));
|
||||
var->name = strdup (name);
|
||||
var->description = cvar_null_string;
|
||||
var->default_value = cvar_null_string;
|
||||
var->flags = CVAR_USER_CREATED;
|
||||
var->value.value = var + 1;
|
||||
*(char **)var->value.value = strdup (value);
|
||||
|
||||
var->next = user_cvars;
|
||||
user_cvars = var;
|
||||
|
||||
Hash_Add (cvar_hash, var);
|
||||
return var;
|
||||
}
|
||||
|
||||
static void
|
||||
cvar_destroy (cvar_t *var)
|
||||
{
|
||||
if (!(var->flags & CVAR_USER_CREATED)) {
|
||||
Sys_Error ("Attempt to destroy non-user cvar");
|
||||
}
|
||||
Hash_Del (cvar_hash, var->name);
|
||||
free (*(char **) var->value.value);
|
||||
free ((char *) var->name);
|
||||
free (var);
|
||||
}
|
||||
|
||||
VISIBLE cvar_t *
|
||||
Cvar_FindVar (const char *var_name)
|
||||
|
@ -130,8 +200,21 @@ Cvar_RemoveAlias (const char *name)
|
|||
return var;
|
||||
}
|
||||
|
||||
static float
|
||||
cvar_value (cvar_t *var)
|
||||
{
|
||||
if (!var->value.type) {
|
||||
return atof (*(char **)var->value.value);
|
||||
} else if (var->value.type == &cexpr_int) {
|
||||
return *(int *)var->value.value;
|
||||
} else if (var->value.type == &cexpr_float) {
|
||||
return *(float *)var->value.value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
VISIBLE float
|
||||
Cvar_VariableValue (const char *var_name)
|
||||
Cvar_Value (const char *var_name)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
|
@ -140,11 +223,22 @@ Cvar_VariableValue (const char *var_name)
|
|||
var = Cvar_FindAlias (var_name);
|
||||
if (!var)
|
||||
return 0;
|
||||
return atof (var->string);
|
||||
return cvar_value (var);
|
||||
}
|
||||
|
||||
static const char *
|
||||
cvar_string (const cvar_t *var)
|
||||
{
|
||||
if (!var->value.type) {
|
||||
return *(char **)var->value.value;
|
||||
} else if (var->value.type->get_string) {
|
||||
return var->value.type->get_string (&var->value, 0);
|
||||
}
|
||||
return cvar_null_string;
|
||||
}
|
||||
|
||||
VISIBLE const char *
|
||||
Cvar_VariableString (const char *var_name)
|
||||
Cvar_String (const char *var_name)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
|
@ -153,7 +247,13 @@ Cvar_VariableString (const char *var_name)
|
|||
var = Cvar_FindAlias (var_name);
|
||||
if (!var)
|
||||
return cvar_null_string;
|
||||
return var->string;
|
||||
return cvar_string (var);
|
||||
}
|
||||
|
||||
VISIBLE const char *
|
||||
Cvar_VarString (const cvar_t *var)
|
||||
{
|
||||
return cvar_string (var);
|
||||
}
|
||||
|
||||
VISIBLE const char *
|
||||
|
@ -267,47 +367,74 @@ Cvar_RemoveListener (cvar_t *cvar, cvar_listener_t listener, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
Cvar_Set (cvar_t *var, const char *value)
|
||||
static int
|
||||
cvar_setvar (cvar_t *var, const char *value)
|
||||
{
|
||||
int changed;
|
||||
int vals;
|
||||
int changed = 0;
|
||||
|
||||
if (!var)
|
||||
return;
|
||||
if (!var->value.type) {
|
||||
char **str_value = var->value.value;
|
||||
changed = !*str_value || !strequal (*str_value, value);
|
||||
if (var->validator) {
|
||||
changed = changed && var->validator (var);
|
||||
}
|
||||
if (changed) {
|
||||
free (*str_value);
|
||||
*str_value = strdup (value);
|
||||
}
|
||||
} else {
|
||||
exprenum_t *enm = var->value.type->data;
|
||||
exprctx_t context = {
|
||||
.memsuper = new_memsuper (),
|
||||
.symtab = enm ? enm->symtab : 0,
|
||||
.msg_prefix = var->name,
|
||||
};
|
||||
if (context.symtab && !context.symtab->tab) {
|
||||
cexpr_init_symtab (context.symtab, &context);
|
||||
}
|
||||
context.result = cexpr_value (var->value.type, &context);
|
||||
if (!cexpr_eval_string (value, &context)) {
|
||||
changed = memcmp (context.result->value, var->value.value,
|
||||
var->value.type->size) != 0;
|
||||
if (var->validator) {
|
||||
changed = changed && var->validator (var);
|
||||
}
|
||||
if (changed) {
|
||||
memcpy (var->value.value, context.result->value,
|
||||
var->value.type->size);
|
||||
}
|
||||
}
|
||||
delete_memsuper (context.memsuper);
|
||||
}
|
||||
|
||||
if (changed && var->listeners) {
|
||||
LISTENER_INVOKE (var->listeners, var);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
Cvar_SetVar (cvar_t *var, const char *value)
|
||||
{
|
||||
if (var->flags & CVAR_ROM) {
|
||||
Sys_MaskPrintf (SYS_dev, "Cvar \"%s\" is read-only, cannot modify\n",
|
||||
var->name);
|
||||
return;
|
||||
}
|
||||
|
||||
changed = !strequal (var->string, value);
|
||||
if (changed) {
|
||||
free ((char*)var->string); // free the old value string
|
||||
|
||||
var->string = strdup (value);
|
||||
var->value = atof (var->string);
|
||||
var->int_val = atoi (var->string);
|
||||
VectorZero (var->vec);
|
||||
vals = sscanf (var->string, "%f %f %f",
|
||||
&var->vec[0], &var->vec[1], &var->vec[2]);
|
||||
if (vals == 1)
|
||||
var->vec[2] = var->vec[1] = var->vec[0];
|
||||
|
||||
if (var->callback)
|
||||
var->callback (var);
|
||||
|
||||
if (var->listeners) {
|
||||
LISTENER_INVOKE (var->listeners, var);
|
||||
}
|
||||
}
|
||||
cvar_setvar (var, value);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
Cvar_SetValue (cvar_t *var, float value)
|
||||
Cvar_Set (const char *var_name, const char *value)
|
||||
{
|
||||
Cvar_Set (var, va (0, "%.9g", value));
|
||||
cvar_t *var;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
|
||||
if (!var)
|
||||
return;
|
||||
|
||||
Cvar_SetVar (var, value);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -329,11 +456,11 @@ Cvar_Command (void)
|
|||
|
||||
// perform a variable print or set
|
||||
if (Cmd_Argc () == 1) {
|
||||
Sys_Printf ("\"%s\" is \"%s\"\n", v->name, v->string);
|
||||
Sys_Printf ("\"%s\" is \"%s\"\n", v->name, cvar_string (v));
|
||||
return true;
|
||||
}
|
||||
|
||||
Cvar_Set (v, Cmd_Argv (1));
|
||||
Cvar_SetVar (v, Cmd_Argv (1));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -350,7 +477,7 @@ Cvar_WriteVariables (QFile *f)
|
|||
|
||||
for (var = cvar_vars; var; var = var->next)
|
||||
if (var->flags & CVAR_ARCHIVE)
|
||||
Qprintf (f, "seta %s \"%s\"\n", var->name, var->string);
|
||||
Qprintf (f, "seta %s \"%s\"\n", var->name, cvar_string (var));
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
@ -360,7 +487,7 @@ Cvar_SaveConfig (plitem_t *config)
|
|||
PL_D_AddObject (config, "cvars", cvars);
|
||||
for (cvar_t *var = cvar_vars; var; var = var->next) {
|
||||
if (var->flags & CVAR_ARCHIVE) {
|
||||
PL_D_AddObject (cvars, var->name, PL_NewString (var->string));
|
||||
PL_D_AddObject (cvars, var->name, PL_NewString (cvar_string (var)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -379,79 +506,16 @@ Cvar_LoadConfig (plitem_t *config)
|
|||
if (value) {
|
||||
cvar_t *var = Cvar_FindVar (cvar_name);
|
||||
if (var) {
|
||||
Cvar_Set (var, value);
|
||||
Cvar_SetFlags (var, var->flags | CVAR_ARCHIVE);
|
||||
Cvar_SetVar (var, value);
|
||||
var->flags |= CVAR_ARCHIVE;
|
||||
} else {
|
||||
Cvar_Get (cvar_name, value, CVAR_USER_CREATED | CVAR_ARCHIVE,
|
||||
0, USER_CVAR);
|
||||
var = cvar_create (cvar_name, value);
|
||||
var->flags |= CVAR_ARCHIVE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define SYS_DEVELOPER(developer) #developer,
|
||||
static const char *developer_flags[] = {
|
||||
"dev",
|
||||
#include "QF/sys_developer.h"
|
||||
0
|
||||
};
|
||||
|
||||
static int
|
||||
parse_developer_flag (const char *flag)
|
||||
{
|
||||
const char **devflag;
|
||||
char *end;
|
||||
int val;
|
||||
|
||||
val = strtol (flag, &end, 0);
|
||||
if (!*end) {
|
||||
return val;
|
||||
}
|
||||
for (devflag = developer_flags; *devflag; devflag++) {
|
||||
if (!strcmp (*devflag, flag)) {
|
||||
return 1 << (devflag - developer_flags);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
developer_f (cvar_t *var)
|
||||
{
|
||||
char *buf = alloca (strlen (var->string) + 1);
|
||||
const char *s;
|
||||
char *b;
|
||||
char c;
|
||||
int parse = 0;
|
||||
|
||||
for (s = var->string; *s; s++) {
|
||||
if (isalpha (*s) || *s == '|') {
|
||||
parse = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!parse) {
|
||||
return;
|
||||
}
|
||||
var->int_val = 0;
|
||||
for (s = var->string, b = buf; (c = *s++); ) {
|
||||
if (isspace (c)) {
|
||||
continue;
|
||||
}
|
||||
if (c == '|') {
|
||||
*b = 0;
|
||||
var->int_val |= parse_developer_flag (buf);
|
||||
b = buf;
|
||||
continue;
|
||||
}
|
||||
*b++ = c;
|
||||
}
|
||||
if (b != buf) {
|
||||
*b = 0;
|
||||
var->int_val |= parse_developer_flag (buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_cvar (const char *cmd, int orflags)
|
||||
{
|
||||
|
@ -477,12 +541,12 @@ set_cvar (const char *cmd, int orflags)
|
|||
"Cvar \"%s\" is read-only, cannot modify\n",
|
||||
var_name);
|
||||
} else {
|
||||
Cvar_Set (var, value);
|
||||
Cvar_SetFlags (var, var->flags | orflags);
|
||||
Cvar_SetVar (var, value);
|
||||
var->flags |= orflags;
|
||||
}
|
||||
} else {
|
||||
Cvar_Get (var_name, value, CVAR_USER_CREATED | orflags, NULL,
|
||||
USER_CVAR);
|
||||
var = cvar_create (var_name, value);
|
||||
var->flags |= orflags;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -523,11 +587,23 @@ Cvar_Inc_f (void)
|
|||
var = Cvar_FindVar (name);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (name);
|
||||
if (!var)
|
||||
if (!var) {
|
||||
Sys_Printf ("Unknown variable \"%s\"\n", name);
|
||||
return;
|
||||
}
|
||||
if (var->flags & CVAR_ROM) {
|
||||
Sys_Printf ("Variable \"%s\" is read-only\n", name);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
Cvar_SetValue (var, var->value + inc);
|
||||
if (var->value.type == &cexpr_float) {
|
||||
*(float *) var->value.value += inc;
|
||||
} else if (var->value.type == &cexpr_int) {
|
||||
*(int *) var->value.value += inc;
|
||||
} else {
|
||||
Sys_Printf ("Variable \"%s\" cannot be incremented\n", name);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -547,8 +623,12 @@ Cvar_Toggle_f (void)
|
|||
Sys_Printf ("Unknown variable \"%s\"\n", Cmd_Argv (1));
|
||||
return;
|
||||
}
|
||||
if ((var->flags & CVAR_ROM) || var->value.type != &cexpr_int) {
|
||||
Sys_Printf ("Variable \"%s\" cannot be toggled\n", Cmd_Argv (1));
|
||||
return;
|
||||
}
|
||||
|
||||
Cvar_Set (var, var->int_val ? "0" : "1");
|
||||
*(int *) var->value.value = !*(int *) var->value.value;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -569,8 +649,7 @@ Cvar_Cycle_f (void)
|
|||
if (!var)
|
||||
var = Cvar_FindAlias (name);
|
||||
if (!var) {
|
||||
var = Cvar_Get (name, Cmd_Argv (Cmd_Argc () - 1), CVAR_USER_CREATED,
|
||||
0, USER_CVAR);
|
||||
var = cvar_create (name, Cmd_Argv (Cmd_Argc () - 1));
|
||||
}
|
||||
|
||||
// loop through the args until you find one that matches the current cvar
|
||||
|
@ -583,27 +662,22 @@ Cvar_Cycle_f (void)
|
|||
// it won't match on zero when it should, but after that, it will be
|
||||
// comparing string that all had the same source (the user) so it will
|
||||
// work.
|
||||
if (atof (Cmd_Argv (i)) == 0) {
|
||||
if (!strcmp (Cmd_Argv (i), var->string))
|
||||
if (!strcmp (Cmd_Argv (i), cvar_string (var)))
|
||||
break;
|
||||
} else {
|
||||
if (atof (Cmd_Argv (i)) == var->value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == Cmd_Argc ())
|
||||
Cvar_Set (var, Cmd_Argv (2)); // no match
|
||||
Cvar_SetVar (var, Cmd_Argv (2)); // no match
|
||||
else if (i + 1 == Cmd_Argc ())
|
||||
Cvar_Set (var, Cmd_Argv (2)); // matched last value in list
|
||||
Cvar_SetVar (var, Cmd_Argv (2)); // matched last value in list
|
||||
else
|
||||
Cvar_Set (var, Cmd_Argv (i + 1)); // matched earlier in list
|
||||
Cvar_SetVar (var, Cmd_Argv (i + 1)); // matched earlier in list
|
||||
}
|
||||
|
||||
static void
|
||||
Cvar_Reset (cvar_t *var)
|
||||
{
|
||||
Cvar_Set (var, var->default_string);
|
||||
Cvar_SetVar (var, var->default_value);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -661,7 +735,7 @@ Cvar_CvarList_f (void)
|
|||
var->flags & CVAR_SERVERINFO ? 's' : ' ');
|
||||
if (showhelp == 2)
|
||||
Sys_Printf ("//%s %s\n%s \"%s\"\n\n", flags, var->description,
|
||||
var->name, var->string);
|
||||
var->name, cvar_string (var));
|
||||
else if (showhelp)
|
||||
Sys_Printf ("%s %-20s : %s\n", flags, var->name, var->description);
|
||||
else
|
||||
|
@ -671,15 +745,6 @@ Cvar_CvarList_f (void)
|
|||
Sys_Printf ("------------\n%d variables\n", i);
|
||||
}
|
||||
|
||||
static void
|
||||
cvar_free (void *c, void *unused)
|
||||
{
|
||||
cvar_t *cvar = (cvar_t*)c;
|
||||
free ((char*)cvar->name);
|
||||
free ((char*)cvar->string);
|
||||
free (cvar);
|
||||
}
|
||||
|
||||
static const char *
|
||||
cvar_get_key (const void *c, void *unused)
|
||||
{
|
||||
|
@ -705,15 +770,14 @@ calias_get_key (const void *c, void *unused)
|
|||
VISIBLE void
|
||||
Cvar_Init_Hash (void)
|
||||
{
|
||||
cvar_hash = Hash_NewTable (1021, cvar_get_key, cvar_free, 0, 0);
|
||||
cvar_hash = Hash_NewTable (1021, cvar_get_key, 0, 0, 0);
|
||||
calias_hash = Hash_NewTable (1021, calias_get_key, calias_free, 0, 0);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
Cvar_Init (void)
|
||||
{
|
||||
developer = Cvar_Get ("developer", "0", CVAR_NONE, developer_f,
|
||||
"set to enable extra debugging information");
|
||||
Cvar_Register (&developer_cvar, 0, 0);
|
||||
|
||||
Cmd_AddCommand ("set", Cvar_Set_f, "Set the selected variable, useful on "
|
||||
"the command line (+set variablename setting)");
|
||||
|
@ -732,66 +796,38 @@ Cvar_Init (void)
|
|||
Cmd_AddCommand ("resetall", Cvar_ResetAll_f, "Reset all cvars");
|
||||
}
|
||||
|
||||
VISIBLE cvar_t *
|
||||
Cvar_Get (const char *name, const char *string, int cvarflags,
|
||||
void (*callback)(cvar_t*), const char *description)
|
||||
VISIBLE void
|
||||
Cvar_Register (cvar_t *var, cvar_listener_t listener, void *data)
|
||||
{
|
||||
int changed = 0;
|
||||
cvar_t *var;
|
||||
cvar_t *user_var;
|
||||
|
||||
if (Cmd_Exists (name)) {
|
||||
Sys_Printf ("Cvar_Get: %s is a command\n", name);
|
||||
return NULL;
|
||||
if (Cmd_Exists (var->name)) {
|
||||
Sys_Printf ("Cvar_Get: %s is a command\n", var->name);
|
||||
return;
|
||||
}
|
||||
if (var->flags & CVAR_REGISTERED) {
|
||||
Sys_Error ("Cvar %s already registered", var->name);
|
||||
}
|
||||
var = Cvar_FindVar (name);
|
||||
if (!var) {
|
||||
cvar_t **v;
|
||||
var = (cvar_t *) calloc (1, sizeof (cvar_t));
|
||||
|
||||
// Cvar doesn't exist, so we create it
|
||||
var->name = strdup (name);
|
||||
var->string = strdup (string);
|
||||
var->default_string = strdup (string);
|
||||
var->flags = cvarflags;
|
||||
var->callback = callback;
|
||||
var->description = description;
|
||||
var->value = atof (var->string);
|
||||
var->int_val = atoi (var->string);
|
||||
sscanf (var->string, "%f %f %f",
|
||||
&var->vec[0], &var->vec[1], &var->vec[2]);
|
||||
Hash_Add (cvar_hash, var);
|
||||
|
||||
for (v = &cvar_vars; *v; v = &(*v)->next)
|
||||
if (strcmp ((*v)->name, var->name) >= 0)
|
||||
break;
|
||||
var->next = *v;
|
||||
*v = var;
|
||||
|
||||
changed = 1;
|
||||
if ((user_var = Hash_Find (cvar_hash, var->name))) {
|
||||
cvar_setvar (var, cvar_string (user_var));
|
||||
cvar_destroy (user_var);
|
||||
} else {
|
||||
// Cvar does exist, so we update the flags and return.
|
||||
var->flags &= ~CVAR_USER_CREATED;
|
||||
var->flags |= cvarflags;
|
||||
changed = !strequal (var->string, string) || var->callback != callback;
|
||||
if (!var->callback)
|
||||
var->callback = callback;
|
||||
if (!var->description
|
||||
|| strequal (var->description, USER_RO_CVAR)
|
||||
|| strequal (var->description, USER_CVAR))
|
||||
var->description = description;
|
||||
if (!var->default_string)
|
||||
var->default_string = strdup (string);
|
||||
cvar_setvar (var, var->default_value);
|
||||
}
|
||||
if (changed) {
|
||||
if (var->callback)
|
||||
var->callback (var);
|
||||
var->flags |= CVAR_REGISTERED;
|
||||
var->next = cvar_vars;
|
||||
cvar_vars = var;
|
||||
|
||||
if (listener) {
|
||||
Cvar_AddListener (var, listener, data);
|
||||
}
|
||||
|
||||
Hash_Add (cvar_hash, var);
|
||||
|
||||
if (var->listeners) {
|
||||
LISTENER_INVOKE (var->listeners, var);
|
||||
}
|
||||
}
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -71,7 +71,15 @@ typedef struct loaded_plugin_s {
|
|||
plugin_t *plugin;
|
||||
} loaded_plugin_t;
|
||||
|
||||
cvar_t *fs_pluginpath;
|
||||
char *fs_pluginpath;
|
||||
static cvar_t fs_pluginpath_cvar = {
|
||||
.name = "fs_pluginpath",
|
||||
.description =
|
||||
"Location of your plugin directory",
|
||||
.default_value = FS_PLUGINPATH,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_pluginpath },
|
||||
};
|
||||
|
||||
hashtab_t *registered_plugins, *loaded_plugins;
|
||||
|
||||
|
@ -155,9 +163,9 @@ static const char *
|
|||
pi_realname (const char *type, const char *name)
|
||||
{
|
||||
#if defined(HAVE_DLOPEN)
|
||||
return va (0, "%s/%s_%s.so", fs_pluginpath->string, type, name);
|
||||
return va (0, "%s/%s_%s.so", fs_pluginpath, type, name);
|
||||
#elif defined(_WIN32)
|
||||
return va (0, "%s/%s_%s.dll", fs_pluginpath->string, type, name);
|
||||
return va (0, "%s/%s_%s.dll", fs_pluginpath, type, name);
|
||||
#else
|
||||
return "No shared library support. FIXME";
|
||||
#endif
|
||||
|
@ -178,8 +186,7 @@ pi_info_name (const char *type, const char *name)
|
|||
static void
|
||||
PI_InitCvars (void)
|
||||
{
|
||||
fs_pluginpath = Cvar_Get ("fs_pluginpath", FS_PLUGINPATH, CVAR_ROM, NULL,
|
||||
"Location of your plugin directory");
|
||||
Cvar_Register (&fs_pluginpath_cvar, 0, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -51,8 +51,24 @@
|
|||
#include "QF/sys.h"
|
||||
#include "QF/va.h"
|
||||
|
||||
cvar_t *fs_globalcfg;
|
||||
cvar_t *fs_usercfg;
|
||||
char *fs_globalcfg;
|
||||
static cvar_t fs_globalcfg_cvar = {
|
||||
.name = "fs_globalcfg",
|
||||
.description =
|
||||
"global configuration file",
|
||||
.default_value = FS_GLOBALCFG,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_globalcfg },
|
||||
};
|
||||
char *fs_usercfg;
|
||||
static cvar_t fs_usercfg_cvar = {
|
||||
.name = "fs_usercfg",
|
||||
.description =
|
||||
"user configuration file",
|
||||
.default_value = FS_USERCFG,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_usercfg },
|
||||
};
|
||||
|
||||
static const char **largv;
|
||||
static const char *argvdummy = " ";
|
||||
|
@ -160,9 +176,8 @@ COM_ParseConfig (cbuf_t *cbuf)
|
|||
Cbuf_Execute_Sets (cbuf);
|
||||
|
||||
// execute set commands in the global configuration file if it exists
|
||||
fs_globalcfg = Cvar_Get ("fs_globalcfg", FS_GLOBALCFG, CVAR_ROM, NULL,
|
||||
"global configuration file");
|
||||
Cmd_Exec_File (cbuf, fs_globalcfg->string, 0);
|
||||
Cvar_Register (&fs_globalcfg_cvar, 0, 0);
|
||||
Cmd_Exec_File (cbuf, fs_globalcfg, 0);
|
||||
Cbuf_Execute_Sets (cbuf);
|
||||
|
||||
// execute +set again to override the config file
|
||||
|
@ -170,9 +185,8 @@ COM_ParseConfig (cbuf_t *cbuf)
|
|||
Cbuf_Execute_Sets (cbuf);
|
||||
|
||||
// execute set commands in the user configuration file if it exists
|
||||
fs_usercfg = Cvar_Get ("fs_usercfg", FS_USERCFG, CVAR_ROM, NULL,
|
||||
"user configuration file");
|
||||
Cmd_Exec_File (cbuf, fs_usercfg->string, 0);
|
||||
Cvar_Register (&fs_usercfg_cvar, 0, 0);
|
||||
Cmd_Exec_File (cbuf, fs_usercfg, 0);
|
||||
Cbuf_Execute_Sets (cbuf);
|
||||
|
||||
// execute +set again to override the config file
|
||||
|
@ -212,14 +226,14 @@ COM_ExecConfig (cbuf_t *cbuf, int skip_quakerc)
|
|||
// should be used to set up defaults on the assumption that the user has
|
||||
// things set up to work with another (hopefully compatible) client
|
||||
if (Cmd_Exec_File (cbuf, "quakeforge.cfg", 1)) {
|
||||
Cmd_Exec_File (cbuf, fs_usercfg->string, 0);
|
||||
Cmd_Exec_File (cbuf, fs_usercfg, 0);
|
||||
Cmd_StuffCmds (cbuf);
|
||||
COM_Check_quakerc ("startdemos", cbuf);
|
||||
} else {
|
||||
if (!skip_quakerc) {
|
||||
Cbuf_InsertText (cbuf, "exec quake.rc\n");
|
||||
}
|
||||
Cmd_Exec_File (cbuf, fs_usercfg->string, 0);
|
||||
Cmd_Exec_File (cbuf, fs_usercfg, 0);
|
||||
// Reparse the command line for + commands.
|
||||
// (sets still done, but it doesn't matter)
|
||||
// (Note, no non-base commands exist yet)
|
||||
|
|
|
@ -123,9 +123,33 @@ int fnmatch (const char *__pattern, const char *__string, int __flags);
|
|||
// QUAKE FILESYSTEM
|
||||
|
||||
static memhunk_t *qfs_hunk;
|
||||
static cvar_t *fs_userpath;
|
||||
static cvar_t *fs_sharepath;
|
||||
static cvar_t *fs_dirconf;
|
||||
static char *fs_userpath;
|
||||
static cvar_t fs_userpath_cvar = {
|
||||
.name = "fs_userpath",
|
||||
.description =
|
||||
"location of your game directories",
|
||||
.default_value = FS_USERPATH,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_userpath },
|
||||
};
|
||||
static char *fs_sharepath;
|
||||
static cvar_t fs_sharepath_cvar = {
|
||||
.name = "fs_sharepath",
|
||||
.description =
|
||||
"location of shared (read-only) game directories",
|
||||
.default_value = FS_SHAREPATH,
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_sharepath },
|
||||
};
|
||||
static char *fs_dirconf;
|
||||
static cvar_t fs_dirconf_cvar = {
|
||||
.name = "fs_dirconf",
|
||||
.description =
|
||||
"full path to gamedir.conf FIXME",
|
||||
.default_value = "",
|
||||
.flags = CVAR_ROM,
|
||||
.value = { .type = 0, .value = &fs_dirconf },
|
||||
};
|
||||
|
||||
VISIBLE const char *qfs_userpath;
|
||||
|
||||
|
@ -650,8 +674,8 @@ qfs_load_config (void)
|
|||
char *buf;
|
||||
char *dirconf;
|
||||
|
||||
if (*fs_dirconf->string) {
|
||||
dirconf = Sys_ExpandSquiggle (fs_dirconf->string);
|
||||
if (*fs_dirconf) {
|
||||
dirconf = Sys_ExpandSquiggle (fs_dirconf);
|
||||
if (!(f = Qopen (dirconf, "rt")))
|
||||
Sys_MaskPrintf (SYS_fs,
|
||||
"Could not load `%s', using builtin defaults\n",
|
||||
|
@ -1333,17 +1357,17 @@ qfs_add_gamedir (vpath_t *vpath, const char *dir)
|
|||
|
||||
if (!*dir)
|
||||
return;
|
||||
e = fs_sharepath->string + strlen (fs_sharepath->string);
|
||||
e = fs_sharepath + strlen (fs_sharepath);
|
||||
s = e;
|
||||
s_dir = dstring_new ();
|
||||
f_dir = dstring_new ();
|
||||
|
||||
while (s >= fs_sharepath->string) {
|
||||
while (s != fs_sharepath->string && s[-1] !=':')
|
||||
while (s >= fs_sharepath) {
|
||||
while (s != fs_sharepath && s[-1] !=':')
|
||||
s--;
|
||||
if (s != e) {
|
||||
dsprintf (s_dir, "%.*s", (int) (e - s), s);
|
||||
if (strcmp (s_dir->str, fs_userpath->string) != 0) {
|
||||
if (strcmp (s_dir->str, fs_userpath) != 0) {
|
||||
if (qfs_expand_path (f_dir, s_dir->str, dir, 0) != 0) {
|
||||
Sys_Printf ("dropping bad directory %s\n", dir);
|
||||
break;
|
||||
|
@ -1409,12 +1433,15 @@ QFS_GamedirCallback (gamedir_callback_t *func)
|
|||
}
|
||||
|
||||
static void
|
||||
qfs_path_cvar (cvar_t *var)
|
||||
qfs_path_cvar (void *data, const cvar_t *cvar)
|
||||
{
|
||||
char *cpath = QFS_CompressPath (var->string);
|
||||
if (strcmp (cpath, var->string))
|
||||
Cvar_Set (var, cpath);
|
||||
char *cpath = QFS_CompressPath (*(char **)data);
|
||||
if (strcmp (cpath, *(char **)data)) {
|
||||
free (*(char **)cvar->value.value);
|
||||
*(char **)cvar->value.value = cpath;
|
||||
} else {
|
||||
free (cpath);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1434,19 +1461,13 @@ QFS_Init (memhunk_t *hunk, const char *game)
|
|||
|
||||
qfs_hunk = hunk;
|
||||
|
||||
fs_sharepath = Cvar_Get ("fs_sharepath", FS_SHAREPATH, CVAR_ROM,
|
||||
qfs_path_cvar,
|
||||
"location of shared (read-only) game "
|
||||
"directories");
|
||||
fs_userpath = Cvar_Get ("fs_userpath", FS_USERPATH, CVAR_ROM,
|
||||
qfs_path_cvar,
|
||||
"location of your game directories");
|
||||
fs_dirconf = Cvar_Get ("fs_dirconf", "", CVAR_ROM, NULL,
|
||||
"full path to gamedir.conf FIXME");
|
||||
Cvar_Register (&fs_sharepath_cvar, qfs_path_cvar, &fs_sharepath);
|
||||
Cvar_Register (&fs_userpath_cvar, qfs_path_cvar, &fs_userpath);
|
||||
Cvar_Register (&fs_dirconf_cvar, 0, 0);
|
||||
|
||||
Cmd_AddCommand ("path", qfs_path_f, "Show what paths Quake is using");
|
||||
|
||||
qfs_userpath = Sys_ExpandSquiggle (fs_userpath->string);
|
||||
qfs_userpath = Sys_ExpandSquiggle (fs_userpath);
|
||||
|
||||
qfs_load_config ();
|
||||
|
||||
|
|
|
@ -96,10 +96,45 @@
|
|||
static void Sys_StdPrintf (const char *fmt, va_list args) __attribute__((format(PRINTF, 1, 0)));
|
||||
static void Sys_ErrPrintf (const char *fmt, va_list args) __attribute__((format(PRINTF, 1, 0)));
|
||||
|
||||
VISIBLE cvar_t *sys_nostdout;
|
||||
VISIBLE cvar_t *sys_extrasleep;
|
||||
cvar_t *sys_dead_sleep;
|
||||
cvar_t *sys_sleep;
|
||||
VISIBLE int sys_nostdout;
|
||||
static cvar_t sys_nostdout_cvar = {
|
||||
.name = "sys_nostdout",
|
||||
.description =
|
||||
"Set to disable std out",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &sys_nostdout },
|
||||
};
|
||||
VISIBLE int sys_extrasleep;
|
||||
static cvar_t sys_extrasleep_cvar = {
|
||||
.name = "sys_extrasleep",
|
||||
.description =
|
||||
"Set to cause whatever amount delay in microseconds you want. Mostly "
|
||||
"useful to generate simulated bad connections.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &sys_extrasleep },
|
||||
};
|
||||
int sys_dead_sleep;
|
||||
static cvar_t sys_dead_sleep_cvar = {
|
||||
.name = "sys_dead_sleep",
|
||||
.description =
|
||||
"When set, the server gets NO cpu if no clients are connected and "
|
||||
"there's no other activity. *MIGHT* cause problems with some mods.",
|
||||
.default_value = "0",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &sys_dead_sleep },
|
||||
};
|
||||
int sys_sleep;
|
||||
static cvar_t sys_sleep_cvar = {
|
||||
.name = "sys_sleep",
|
||||
.description =
|
||||
"Sleep how long in seconds between checking for connections. Minimum "
|
||||
"is 0, maximum is 13",
|
||||
.default_value = "8",
|
||||
.flags = CVAR_NONE,
|
||||
.value = { .type = &cexpr_int, .value = &sys_sleep },
|
||||
};
|
||||
|
||||
int sys_checksum;
|
||||
|
||||
|
@ -297,7 +332,7 @@ Sys_Print (FILE *stream, const char *fmt, va_list args)
|
|||
static void
|
||||
Sys_StdPrintf (const char *fmt, va_list args)
|
||||
{
|
||||
if (sys_nostdout && sys_nostdout->int_val)
|
||||
if (sys_nostdout)
|
||||
return;
|
||||
Sys_Print (stdout, fmt, args);
|
||||
}
|
||||
|
@ -322,7 +357,7 @@ Sys_MaskPrintf (int mask, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
|
||||
if (!developer || !(developer->int_val & mask))
|
||||
if (!(developer & mask))
|
||||
return;
|
||||
va_start (args, fmt);
|
||||
sys_std_printf_function (fmt, args);
|
||||
|
@ -495,21 +530,10 @@ Sys_MakeCodeWriteable (uintptr_t startaddr, size_t length)
|
|||
VISIBLE void
|
||||
Sys_Init_Cvars (void)
|
||||
{
|
||||
sys_nostdout = Cvar_Get ("sys_nostdout", "0", CVAR_NONE, NULL,
|
||||
"Set to disable std out");
|
||||
sys_extrasleep = Cvar_Get ("sys_extrasleep", "0", CVAR_NONE, NULL,
|
||||
"Set to cause whatever amount delay in "
|
||||
"microseconds you want. Mostly "
|
||||
"useful to generate simulated bad "
|
||||
"connections.");
|
||||
sys_dead_sleep = Cvar_Get ("sys_dead_sleep", "0", CVAR_NONE, NULL,
|
||||
"When set, the server gets NO cpu if no "
|
||||
"clients are connected and there's no other "
|
||||
"activity. *MIGHT* cause problems with some "
|
||||
"mods.");
|
||||
sys_sleep = Cvar_Get ("sys_sleep", "8", CVAR_NONE, NULL, "Sleep how long "
|
||||
"in seconds between checking for connections. "
|
||||
"Minimum is 0, maximum is 13");
|
||||
Cvar_Register (&sys_nostdout_cvar, 0, 0);
|
||||
Cvar_Register (&sys_extrasleep_cvar, 0, 0);
|
||||
Cvar_Register (&sys_dead_sleep_cvar, 0, 0);
|
||||
Cvar_Register (&sys_sleep_cvar, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -802,7 +826,7 @@ Sys_CheckInput (int idle, int net_socket)
|
|||
int sleep_msec;
|
||||
// Now we want to give some processing time to other applications,
|
||||
// such as qw_client, running on this machine.
|
||||
sleep_msec = sys_sleep->int_val;
|
||||
sleep_msec = sys_sleep;
|
||||
if (sleep_msec > 0) {
|
||||
if (sleep_msec > 13)
|
||||
sleep_msec = 13;
|
||||
|
@ -825,7 +849,7 @@ Sys_CheckInput (int idle, int net_socket)
|
|||
if (net_socket >= 0)
|
||||
QF_FD_SET (((unsigned) net_socket), &fdset);// cast needed for windows
|
||||
|
||||
if (idle && sys_dead_sleep->int_val)
|
||||
if (idle && sys_dead_sleep)
|
||||
usec = -1;
|
||||
|
||||
res = Sys_Select (max (net_socket, 0), &fdset, usec);
|
||||
|
|
|
@ -222,7 +222,7 @@ Z_TagMalloc (memzone_t *zone, size_t size, int tag)
|
|||
int requested_size = size;
|
||||
memblock_t *start, *rover, *new, *base;
|
||||
|
||||
if (!developer || developer->int_val & SYS_dev)
|
||||
if (developer & SYS_dev)
|
||||
Z_CheckHeap (zone); // DEBUG
|
||||
|
||||
if (!tag) {
|
||||
|
@ -291,7 +291,7 @@ Z_Realloc (memzone_t *zone, void *ptr, size_t size)
|
|||
if (!ptr)
|
||||
return Z_Malloc (zone, size);
|
||||
|
||||
if (!developer || developer->int_val & SYS_dev)
|
||||
if (developer & SYS_dev)
|
||||
Z_CheckHeap (zone); // DEBUG
|
||||
|
||||
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
|
||||
|
|
|
@ -569,7 +569,7 @@ crosshair_2 (int x, int y)
|
|||
{
|
||||
unsigned char *pColor;
|
||||
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor->int_val];
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor];
|
||||
qfglColor4ubv (pColor);
|
||||
qfglBindTexture (GL_TEXTURE_2D, cs_texture);
|
||||
|
||||
|
@ -593,7 +593,7 @@ crosshair_3 (int x, int y)
|
|||
{
|
||||
unsigned char *pColor;
|
||||
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor->int_val];
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor];
|
||||
qfglColor4ubv (pColor);
|
||||
qfglBindTexture (GL_TEXTURE_2D, cs_texture);
|
||||
|
||||
|
@ -617,7 +617,7 @@ crosshair_4 (int x, int y)
|
|||
{
|
||||
unsigned char *pColor;
|
||||
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor->int_val];
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor];
|
||||
qfglColor4ubv (pColor);
|
||||
qfglBindTexture (GL_TEXTURE_2D, cs_texture);
|
||||
|
||||
|
@ -641,7 +641,7 @@ crosshair_5 (int x, int y) //FIXME don't use until the data is filled in
|
|||
{
|
||||
unsigned char *pColor;
|
||||
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor->int_val];
|
||||
pColor = (unsigned char *) &d_8to24table[crosshaircolor];
|
||||
qfglColor4ubv (pColor);
|
||||
qfglBindTexture (GL_TEXTURE_2D, cs_texture);
|
||||
|
||||
|
@ -674,12 +674,12 @@ gl_Draw_Crosshair (void)
|
|||
int x, y;
|
||||
int ch;
|
||||
|
||||
ch = crosshair->int_val - 1;
|
||||
ch = crosshair - 1;
|
||||
if ((unsigned) ch >= sizeof (crosshair_func) / sizeof (crosshair_func[0]))
|
||||
return;
|
||||
|
||||
x = vid.conview->xlen / 2 + cl_crossx->int_val;
|
||||
y = vid.conview->ylen / 2 + cl_crossy->int_val;
|
||||
x = vid.conview->xlen / 2 + cl_crossx;
|
||||
y = vid.conview->ylen / 2 + cl_crossy;
|
||||
|
||||
crosshair_func[ch] (x, y);
|
||||
}
|
||||
|
@ -784,7 +784,7 @@ gl_Draw_ConsoleBackground (int lines, byte alpha)
|
|||
gl = (glpic_t *) conback->data;
|
||||
|
||||
// spin the console? - effect described in a QER tutorial
|
||||
if (gl_conspin->value) {
|
||||
if (gl_conspin) {
|
||||
static float xangle = 0;
|
||||
static float xfactor = .3f;
|
||||
static float xstep = .005f;
|
||||
|
@ -793,7 +793,7 @@ gl_Draw_ConsoleBackground (int lines, byte alpha)
|
|||
qfglMatrixMode (GL_TEXTURE);
|
||||
qfglPushMatrix ();
|
||||
qfglLoadIdentity ();
|
||||
xangle += gl_conspin->value;
|
||||
xangle += gl_conspin;
|
||||
xfactor += xstep;
|
||||
if (xfactor > 8 || xfactor < .3f)
|
||||
xstep = -xstep;
|
||||
|
@ -801,7 +801,7 @@ gl_Draw_ConsoleBackground (int lines, byte alpha)
|
|||
qfglScalef (xfactor, xfactor, xfactor);
|
||||
}
|
||||
// slide console up/down or stretch it?
|
||||
if (gl_constretch->int_val) {
|
||||
if (gl_constretch) {
|
||||
ofs = 0;
|
||||
} else
|
||||
ofs = (vid.conview->ylen - lines) / (float) vid.conview->ylen;
|
||||
|
@ -827,15 +827,15 @@ gl_Draw_ConsoleBackground (int lines, byte alpha)
|
|||
qfglColor3ubv (color_0_8);
|
||||
}
|
||||
|
||||
if (gl_conspin->value) {
|
||||
if (gl_conspin) {
|
||||
qfglPopMatrix ();
|
||||
qfglMatrixMode (GL_MODELVIEW);
|
||||
qfglPopMatrix ();
|
||||
}
|
||||
|
||||
int len = strlen (cl_verstring->string);
|
||||
int len = strlen (cl_verstring);
|
||||
gl_Draw_AltString (vid.conview->xlen - len * 8 - 11, lines - 14,
|
||||
cl_verstring->string);
|
||||
cl_verstring);
|
||||
qfglColor3ubv (color_white);
|
||||
}
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@ gl_R_RenderDlights (void)
|
|||
unsigned int i;
|
||||
dlight_t *l;
|
||||
|
||||
if (!gl_dlight_polyblend->int_val)
|
||||
if (!gl_dlight_polyblend)
|
||||
return;
|
||||
|
||||
qfglDepthMask (GL_FALSE);
|
||||
|
@ -127,7 +127,7 @@ gl_R_RenderDlights (void)
|
|||
R_RenderDlight (l);
|
||||
}
|
||||
|
||||
if (!gl_dlight_smooth->int_val)
|
||||
if (!gl_dlight_smooth)
|
||||
qfglShadeModel (GL_FLAT);
|
||||
qfglColor3ubv (color_white);
|
||||
qfglEnable (GL_TEXTURE_2D);
|
||||
|
|
|
@ -109,9 +109,17 @@ alloc_arrays (psystem_t *ps)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gl_particles_f (void *data, const cvar_t *cvar)
|
||||
{
|
||||
alloc_arrays (&r_psystem);//FIXME
|
||||
}
|
||||
|
||||
void
|
||||
gl_R_InitParticles (void)
|
||||
{
|
||||
Cvar_AddListener (Cvar_FindVar ("r_particles"), gl_particles_f, 0);
|
||||
Cvar_AddListener (Cvar_FindVar ("r_particles_max"), gl_particles_f, 0);
|
||||
alloc_arrays (&r_psystem);
|
||||
}
|
||||
|
||||
|
@ -134,8 +142,8 @@ gl_R_DrawParticles (psystem_t *psystem)
|
|||
qfglInterleavedArrays (GL_T2F_C4UB_V3F, 0, particleVertexArray);
|
||||
|
||||
minparticledist = DotProduct (r_refdef.frame.position,
|
||||
r_refdef.frame.forward) +
|
||||
r_particles_nearclip->value;
|
||||
r_refdef.frame.forward)
|
||||
+ r_particles_nearclip;
|
||||
|
||||
vacount = 0;
|
||||
VA = particleVertexArray;
|
||||
|
@ -233,42 +241,6 @@ gl_R_DrawParticles (psystem_t *psystem)
|
|||
qfglDepthMask (GL_TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
r_particles_nearclip_f (cvar_t *var)
|
||||
{
|
||||
Cvar_SetValue (r_particles_nearclip, bound (r_nearclip->value, var->value,
|
||||
r_farclip->value));
|
||||
}
|
||||
|
||||
static void
|
||||
r_particles_f (cvar_t *var)
|
||||
{
|
||||
R_MaxParticlesCheck (var, r_particles_max);
|
||||
alloc_arrays (&r_psystem);
|
||||
}
|
||||
|
||||
static void
|
||||
r_particles_max_f (cvar_t *var)
|
||||
{
|
||||
R_MaxParticlesCheck (r_particles, var);
|
||||
alloc_arrays (&r_psystem);
|
||||
}
|
||||
|
||||
void
|
||||
gl_R_Particles_Init_Cvars (void)
|
||||
{
|
||||
r_particles = Cvar_Get ("r_particles", "1", CVAR_ARCHIVE, r_particles_f,
|
||||
"Toggles drawing of particles.");
|
||||
r_particles_max = Cvar_Get ("r_particles_max", "2048", CVAR_ARCHIVE,
|
||||
r_particles_max_f, "Maximum amount of "
|
||||
"particles to display. No maximum, minimum "
|
||||
"is 0.");
|
||||
r_particles_nearclip = Cvar_Get ("r_particles_nearclip", "32",
|
||||
CVAR_ARCHIVE, r_particles_nearclip_f,
|
||||
"Distance of the particle near clipping "
|
||||
"plane from the player.");
|
||||
}
|
||||
|
||||
psystem_t * __attribute__((const))//FIXME
|
||||
gl_ParticleSystem (void)
|
||||
{
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue