/*
  Copyright (C) 2010-2011  Charles Pence <charles@charlespence.net>
  Copyright (C) 1996-1997  Id Software, Inc.

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
// quakedef.h -- primary header for client
#define    GAMENAME    "id1"        // directory to look in by default

#define MAX_NUM_ARGVS    50

// up / down
#define    PITCH    0

// left / right
#define    YAW        1

// fall over
#define    ROLL    2


#define    MAX_QPATH        64            // max length of a quake game pathname
#define    MAX_OSPATH        128            // max length of a filesystem pathname

#define    ON_EPSILON        0.1            // point on plane side epsilon

#define    MAX_MSGLEN        8000        // max length of a reliable message
#define    MAX_DATAGRAM    1024        // max length of unreliable message

//
// per-level limits
//
#define    MAX_EDICTS        600            // FIXME: ouch! ouch! ouch!
#define    MAX_LIGHTSTYLES    64
#define    MAX_MODELS        256            // these are sent over the net as bytes
#define    MAX_SOUNDS        256            // so they cannot be blindly increased

#define    SAVEGAME_COMMENT_LENGTH    39

#define    MAX_STYLESTRING    64

//
// stats are integers communicated to the client by the server
//
#define    MAX_CL_STATS        32
#define    STAT_HEALTH            0
#define    STAT_FRAGS            1
#define    STAT_WEAPON            2
#define    STAT_AMMO            3
#define    STAT_ARMOR            4
#define    STAT_WEAPONFRAME    5
#define    STAT_SHELLS            6
#define    STAT_NAILS            7
#define    STAT_ROCKETS        8
#define    STAT_CELLS            9
#define    STAT_ACTIVEWEAPON    10
#define    STAT_TOTALSECRETS    11
#define    STAT_TOTALMONSTERS    12
#define    STAT_SECRETS        13        // bumped on client side by svc_foundsecret
#define    STAT_MONSTERS        14        // bumped by svc_killedmonster

// stock defines

#define    IT_SHOTGUN                1
#define    IT_SUPER_SHOTGUN        2
#define    IT_NAILGUN                4
#define    IT_SUPER_NAILGUN        8
#define    IT_GRENADE_LAUNCHER        16
#define    IT_ROCKET_LAUNCHER        32
#define    IT_LIGHTNING            64
#define IT_SUPER_LIGHTNING      128
#define IT_SHELLS               256
#define IT_NAILS                512
#define IT_ROCKETS              1024
#define IT_CELLS                2048
#define IT_AXE                  4096
#define IT_ARMOR1               8192
#define IT_ARMOR2               16384
#define IT_ARMOR3               32768
#define IT_SUPERHEALTH          65536
#define IT_KEY1                 131072
#define IT_KEY2                 262144
#define    IT_INVISIBILITY            524288
#define    IT_INVULNERABILITY        1048576
#define    IT_SUIT                    2097152
#define    IT_QUAD                    4194304
#define IT_SIGIL1               (1<<28)
#define IT_SIGIL2               (1<<29)
#define IT_SIGIL3               (1<<30)
#define IT_SIGIL4               (1<<31)

//===========================================

#define    MAX_SCOREBOARD        16
#define    MAX_SCOREBOARDNAME    32

#define    SOUND_CHANNELS        8

#include "util/cast.h"
#include "filesystem/file.h"

#include "common.h"
#include "mathlib.h"

#include "bspfile.h"
#include "vid.h"
#include "sys.h"
#include "zone.h"

typedef struct
{
    vec3_t    origin;
    vec3_t    angles;
    int        modelindex;
    int        frame;
    qboolean recolor;
    int        skin;
    int        effects;
} entity_state_t;


#include "wad.h"
#include "draw.h"
#include "cvar.h"
#include "screen.h"
#include "net.h"
#include "protocol.h"
#include "cmd.h"
#include "sbar.h"
#include "sound/service.h"
#include "render.h"
#include "client.h"
#include "progs.h"
#include "server.h"
#include "gl_model.h"
#include "input.h"
#include "world.h"
#include "keys.h"
#include "console.h"
#include "view.h"
#include "menu.h"

#include "r_texture.h"
#include "glquake.h"

#include "service/signals.h"

//=============================================================================

// the host system specifies the base of the directory tree, the
// command line parms passed to the program, and the amount of memory
// available for the program to use

typedef struct
{
    const char *argv0;
    char    *basedir;
    void    *membase;
    int     memsize;
} quakeparms_t;


//=============================================================================



extern qboolean noclip_anglehack;


//
// host
//
extern    quakeparms_t host_parms;

extern    qboolean    host_initialized;        // true if into command execution
extern    double        host_frametime;
extern    byte        *host_basepal;
extern    int            host_framecount;    // incremented every frame, never reset
extern    double        realtime;            // not bounded in any way, changed at
                                        // start of every frame, never reset

void Host_ClearMemory (void);
void Host_ServerFrame (void);
void Host_InitCommands (void);
void Host_Init (quakeparms_t *parms);
void Host_Shutdown(void);
void Host_Error (char *error, ...);
void Host_EndGame (char *message, ...);
void Host_Frame (float time);
void Host_Quit_f (void);
void Host_ClientCommands (char *fmt, ...);
void Host_ShutdownServer (qboolean crash);

extern int            current_skill;        // skill level for currently loaded level (in case
                                        //  the user changes the cvar while the level is
                                        //  running, this reflects the level actually in use)

//
// chase
//
extern  qboolean chase_nodraw;

void Chase_Init (void);
void Chase_Reset (void);
void Chase_Update (void);
