Annotation of quake2/xatrix/g_local.h, revision 1.1

1.1     ! root        1: // g_local.h -- local definitions for game module
        !             2: 
        !             3: #include "q_shared.h"
        !             4: 
        !             5: // define GAME_INCLUDE so that game.h does not define the
        !             6: // short, server-visible gclient_t and edict_t structures,
        !             7: // because we define the full size ones in this file
        !             8: #define        GAME_INCLUDE
        !             9: #include "game.h"
        !            10: 
        !            11: // the "gameversion" client command will print this plus compile date
        !            12: #define        GAMEVERSION     "baseq2"
        !            13: 
        !            14: // protocol bytes that can be directly added to messages
        !            15: #define        svc_muzzleflash         1
        !            16: #define        svc_muzzleflash2        2
        !            17: #define        svc_temp_entity         3
        !            18: #define        svc_layout                      4
        !            19: #define        svc_inventory           5
        !            20: #define        svc_stufftext           11
        !            21: 
        !            22: //==================================================================
        !            23: 
        !            24: // view pitching times
        !            25: #define DAMAGE_TIME            0.5
        !            26: #define        FALL_TIME               0.3
        !            27: 
        !            28: 
        !            29: // edict->spawnflags
        !            30: // these are set with checkboxes on each entity in the map editor
        !            31: #define        SPAWNFLAG_NOT_EASY                      0x00000100
        !            32: #define        SPAWNFLAG_NOT_MEDIUM            0x00000200
        !            33: #define        SPAWNFLAG_NOT_HARD                      0x00000400
        !            34: #define        SPAWNFLAG_NOT_DEATHMATCH        0x00000800
        !            35: #define        SPAWNFLAG_NOT_COOP                      0x00001000
        !            36: 
        !            37: // edict->flags
        !            38: #define        FL_FLY                                  0x00000001
        !            39: #define        FL_SWIM                                 0x00000002      // implied immunity to drowining
        !            40: #define FL_IMMUNE_LASER                        0x00000004
        !            41: #define        FL_INWATER                              0x00000008
        !            42: #define        FL_GODMODE                              0x00000010
        !            43: #define        FL_NOTARGET                             0x00000020
        !            44: #define FL_IMMUNE_SLIME                        0x00000040
        !            45: #define FL_IMMUNE_LAVA                 0x00000080
        !            46: #define        FL_PARTIALGROUND                0x00000100      // not all corners are valid
        !            47: #define        FL_WATERJUMP                    0x00000200      // player jumping out of water
        !            48: #define        FL_TEAMSLAVE                    0x00000400      // not the first on the team
        !            49: #define FL_NO_KNOCKBACK                        0x00000800
        !            50: #define FL_POWER_ARMOR                 0x00001000      // power armor (if any) is active
        !            51: #define FL_RESPAWN                             0x80000000      // used for item respawning
        !            52: 
        !            53: 
        !            54: #define        FRAMETIME               0.1
        !            55: 
        !            56: // memory tags to allow dynamic memory to be cleaned up
        !            57: #define        TAG_GAME        765             // clear when unloading the dll
        !            58: #define        TAG_LEVEL       766             // clear when loading a new level
        !            59: 
        !            60: 
        !            61: #define MELEE_DISTANCE 80
        !            62: 
        !            63: #define BODY_QUEUE_SIZE                8
        !            64: 
        !            65: typedef enum
        !            66: {
        !            67:        DAMAGE_NO,
        !            68:        DAMAGE_YES,                     // will take damage if hit
        !            69:        DAMAGE_AIM                      // auto targeting recognizes this
        !            70: } damage_t;
        !            71: 
        !            72: typedef enum 
        !            73: {
        !            74:        WEAPON_READY, 
        !            75:        WEAPON_ACTIVATING,
        !            76:        WEAPON_DROPPING,
        !            77:        WEAPON_FIRING
        !            78: } weaponstate_t;
        !            79: 
        !            80: typedef enum
        !            81: {
        !            82:        AMMO_BULLETS,
        !            83:        AMMO_SHELLS,
        !            84:        AMMO_ROCKETS,
        !            85:        AMMO_GRENADES,
        !            86:        AMMO_CELLS,
        !            87:        AMMO_SLUGS,
        !            88:        // RAFAEL
        !            89:        AMMO_MAGSLUG,
        !            90:        AMMO_TRAP
        !            91: } ammo_t;
        !            92: 
        !            93: 
        !            94: //deadflag
        !            95: #define DEAD_NO                                        0
        !            96: #define DEAD_DYING                             1
        !            97: #define DEAD_DEAD                              2
        !            98: #define DEAD_RESPAWNABLE               3
        !            99: 
        !           100: //range
        !           101: #define RANGE_MELEE                            0
        !           102: #define RANGE_NEAR                             1
        !           103: #define RANGE_MID                              2
        !           104: #define RANGE_FAR                              3
        !           105: 
        !           106: //gib types
        !           107: #define GIB_ORGANIC                            0
        !           108: #define GIB_METALLIC                   1
        !           109: 
        !           110: //monster ai flags
        !           111: #define AI_STAND_GROUND                        0x00000001
        !           112: #define AI_TEMP_STAND_GROUND   0x00000002
        !           113: #define AI_SOUND_TARGET                        0x00000004
        !           114: #define AI_LOST_SIGHT                  0x00000008
        !           115: #define AI_PURSUIT_LAST_SEEN   0x00000010
        !           116: #define AI_PURSUE_NEXT                 0x00000020
        !           117: #define AI_PURSUE_TEMP                 0x00000040
        !           118: #define AI_HOLD_FRAME                  0x00000080
        !           119: #define AI_GOOD_GUY                            0x00000100
        !           120: #define AI_BRUTAL                              0x00000200
        !           121: #define AI_NOSTEP                              0x00000400
        !           122: #define AI_DUCKED                              0x00000800
        !           123: #define AI_COMBAT_POINT                        0x00001000
        !           124: #define AI_MEDIC                               0x00002000
        !           125: #define AI_RESURRECTING                        0x00004000
        !           126: 
        !           127: //monster attack state
        !           128: #define AS_STRAIGHT                            1
        !           129: #define AS_SLIDING                             2
        !           130: #define        AS_MELEE                                3
        !           131: #define        AS_MISSILE                              4
        !           132: 
        !           133: // armor types
        !           134: #define ARMOR_NONE                             0
        !           135: #define ARMOR_JACKET                   1
        !           136: #define ARMOR_COMBAT                   2
        !           137: #define ARMOR_BODY                             3
        !           138: #define ARMOR_SHARD                            4
        !           139: 
        !           140: // power armor types
        !           141: #define POWER_ARMOR_NONE               0
        !           142: #define POWER_ARMOR_SCREEN             1
        !           143: #define POWER_ARMOR_SHIELD             2
        !           144: 
        !           145: // handedness values
        !           146: #define RIGHT_HANDED                   0
        !           147: #define LEFT_HANDED                            1
        !           148: #define CENTER_HANDED                  2
        !           149: 
        !           150: 
        !           151: // game.serverflags values
        !           152: #define SFL_CROSS_TRIGGER_1            0x00000001
        !           153: #define SFL_CROSS_TRIGGER_2            0x00000002
        !           154: #define SFL_CROSS_TRIGGER_3            0x00000004
        !           155: #define SFL_CROSS_TRIGGER_4            0x00000008
        !           156: #define SFL_CROSS_TRIGGER_5            0x00000010
        !           157: #define SFL_CROSS_TRIGGER_6            0x00000020
        !           158: #define SFL_CROSS_TRIGGER_7            0x00000040
        !           159: #define SFL_CROSS_TRIGGER_8            0x00000080
        !           160: #define SFL_CROSS_TRIGGER_MASK 0x000000ff
        !           161: 
        !           162: 
        !           163: // noise types for PlayerNoise
        !           164: #define PNOISE_SELF                            0
        !           165: #define PNOISE_WEAPON                  1
        !           166: #define PNOISE_IMPACT                  2
        !           167: 
        !           168: 
        !           169: // edict->movetype values
        !           170: typedef enum
        !           171: {
        !           172: MOVETYPE_NONE,                 // never moves
        !           173: MOVETYPE_NOCLIP,               // origin and angles change with no interaction
        !           174: MOVETYPE_PUSH,                 // no clip to world, push on box contact
        !           175: MOVETYPE_STOP,                 // no clip to world, stops on box contact
        !           176: 
        !           177: MOVETYPE_WALK,                 // gravity
        !           178: MOVETYPE_STEP,                 // gravity, special edge handling
        !           179: MOVETYPE_FLY,
        !           180: MOVETYPE_TOSS,                 // gravity
        !           181: MOVETYPE_FLYMISSILE,   // extra size to monsters
        !           182: MOVETYPE_BOUNCE,               // added this (the comma at the end of line)
        !           183: // RAFAEL
        !           184: MOVETYPE_WALLBOUNCE
        !           185: } movetype_t;
        !           186: 
        !           187: 
        !           188: 
        !           189: typedef struct
        !           190: {
        !           191:        int             base_count;
        !           192:        int             max_count;
        !           193:        float   normal_protection;
        !           194:        float   energy_protection;
        !           195:        int             armor;
        !           196: } gitem_armor_t;
        !           197: 
        !           198: 
        !           199: // gitem_t->flags
        !           200: #define        IT_WEAPON               1               // use makes active weapon
        !           201: #define        IT_AMMO                 2
        !           202: #define IT_ARMOR               4
        !           203: #define IT_STAY_COOP   8
        !           204: #define IT_KEY                 16
        !           205: #define IT_POWERUP             32
        !           206: 
        !           207: typedef struct gitem_s
        !           208: {
        !           209:        char            *classname;     // spawning name
        !           210:        qboolean        (*pickup)(struct edict_s *ent, struct edict_s *other);
        !           211:        void            (*use)(struct edict_s *ent, struct gitem_s *item);
        !           212:        void            (*drop)(struct edict_s *ent, struct gitem_s *item);
        !           213:        void            (*weaponthink)(struct edict_s *ent);
        !           214:        char            *pickup_sound;
        !           215:        char            *world_model;
        !           216:        int                     world_model_flags;
        !           217:        char            *view_model;
        !           218: 
        !           219:        // client side info
        !           220:        char            *icon;
        !           221:        char            *pickup_name;   // for printing on pickup
        !           222:        int                     count_width;            // number of digits to display by icon
        !           223: 
        !           224:        int                     quantity;               // for ammo how much, for weapons how much is used per shot
        !           225:        char            *ammo;                  // for weapons
        !           226:        int                     flags;                  // IT_* flags
        !           227: 
        !           228:        void            *info;
        !           229:        int                     tag;
        !           230: 
        !           231:        char            *precaches;             // string of all models, sounds, and images this item will use
        !           232: } gitem_t;
        !           233: 
        !           234: 
        !           235: 
        !           236: //
        !           237: // this structure is left intact through an entire game
        !           238: // it should be initialized at dll load time, and read/written to
        !           239: // the server.ssv file for savegames
        !           240: //
        !           241: typedef struct
        !           242: {
        !           243:        char            helpmessage1[512];
        !           244:        char            helpmessage2[512];
        !           245:        int                     helpchanged;    // flash F1 icon if non 0, play sound
        !           246:                                                                // and increment only if 1, 2, or 3
        !           247: 
        !           248:        gclient_t       *clients;               // [maxclients]
        !           249: 
        !           250:        // can't store spawnpoint in level, because
        !           251:        // it would get overwritten by the savegame restore
        !           252:        char            spawnpoint[512];        // needed for coop respawns
        !           253: 
        !           254:        // store latched cvars here that we want to get at often
        !           255:        int                     maxclients;
        !           256:        int                     maxentities;
        !           257: 
        !           258:        // cross level triggers
        !           259:        int                     serverflags;
        !           260: 
        !           261:        // items
        !           262:        int                     num_items;
        !           263: 
        !           264:        qboolean        autosaved;
        !           265: } game_locals_t;
        !           266: 
        !           267: 
        !           268: //
        !           269: // this structure is cleared as each map is entered
        !           270: // it is read/written to the level.sav file for savegames
        !           271: //
        !           272: typedef struct
        !           273: {
        !           274:        int                     framenum;
        !           275:        float           time;
        !           276: 
        !           277:        char            level_name[MAX_QPATH];  // the descriptive name (Outer Base, etc)
        !           278:        char            mapname[MAX_QPATH];             // the server name (base1, etc)
        !           279:        char            nextmap[MAX_QPATH];             // go here when fraglimit is hit
        !           280: 
        !           281:        // intermission state
        !           282:        float           intermissiontime;               // time the intermission was started
        !           283:        char            *changemap;
        !           284:        int                     exitintermission;
        !           285:        vec3_t          intermission_origin;
        !           286:        vec3_t          intermission_angle;
        !           287: 
        !           288:        edict_t         *sight_client;  // changed once each frame for coop games
        !           289: 
        !           290:        edict_t         *sight_entity;
        !           291:        int                     sight_entity_framenum;
        !           292:        edict_t         *sound_entity;
        !           293:        int                     sound_entity_framenum;
        !           294:        edict_t         *sound2_entity;
        !           295:        int                     sound2_entity_framenum;
        !           296: 
        !           297:        int                     pic_health;
        !           298: 
        !           299:        int                     total_secrets;
        !           300:        int                     found_secrets;
        !           301: 
        !           302:        int                     total_goals;
        !           303:        int                     found_goals;
        !           304: 
        !           305:        int                     total_monsters;
        !           306:        int                     killed_monsters;
        !           307: 
        !           308:        edict_t         *current_entity;        // entity running from G_RunFrame
        !           309:        int                     body_que;                       // dead bodies
        !           310: 
        !           311:        int                     power_cubes;            // ugly necessity for coop
        !           312: } level_locals_t;
        !           313: 
        !           314: 
        !           315: // spawn_temp_t is only used to hold entity field values that
        !           316: // can be set from the editor, but aren't actualy present
        !           317: // in edict_t during gameplay
        !           318: typedef struct
        !           319: {
        !           320:        // world vars
        !           321:        char            *sky;
        !           322:        float           skyrotate;
        !           323:        vec3_t          skyaxis;
        !           324:        char            *nextmap;
        !           325: 
        !           326:        int                     lip;
        !           327:        int                     distance;
        !           328:        int                     height;
        !           329:        char            *noise;
        !           330:        float           pausetime;
        !           331:        char            *item;
        !           332:        char            *gravity;
        !           333: 
        !           334:        float           minyaw;
        !           335:        float           maxyaw;
        !           336:        float           minpitch;
        !           337:        float           maxpitch;
        !           338: } spawn_temp_t;
        !           339: 
        !           340: 
        !           341: typedef struct
        !           342: {
        !           343:        // fixed data
        !           344:        vec3_t          start_origin;
        !           345:        vec3_t          start_angles;
        !           346:        vec3_t          end_origin;
        !           347:        vec3_t          end_angles;
        !           348: 
        !           349:        int                     sound_start;
        !           350:        int                     sound_middle;
        !           351:        int                     sound_end;
        !           352: 
        !           353:        float           accel;
        !           354:        float           speed;
        !           355:        float           decel;
        !           356:        float           distance;
        !           357: 
        !           358:        float           wait;
        !           359: 
        !           360:        // state data
        !           361:        int                     state;
        !           362:        vec3_t          dir;
        !           363:        float           current_speed;
        !           364:        float           move_speed;
        !           365:        float           next_speed;
        !           366:        float           remaining_distance;
        !           367:        float           decel_distance;
        !           368:        void            (*endfunc)(edict_t *);
        !           369: } moveinfo_t;
        !           370: 
        !           371: 
        !           372: typedef struct
        !           373: {
        !           374:        void    (*aifunc)(edict_t *self, float dist);
        !           375:        float   dist;
        !           376:        void    (*thinkfunc)(edict_t *self);
        !           377: } mframe_t;
        !           378: 
        !           379: typedef struct
        !           380: {
        !           381:        int                     firstframe;
        !           382:        int                     lastframe;
        !           383:        mframe_t        *frame;
        !           384:        void            (*endfunc)(edict_t *self);
        !           385: } mmove_t;
        !           386: 
        !           387: typedef struct
        !           388: {
        !           389:        mmove_t         *currentmove;
        !           390:        int                     aiflags;
        !           391:        int                     nextframe;
        !           392:        float           scale;
        !           393: 
        !           394:        void            (*stand)(edict_t *self);
        !           395:        void            (*idle)(edict_t *self);
        !           396:        void            (*search)(edict_t *self);
        !           397:        void            (*walk)(edict_t *self);
        !           398:        void            (*run)(edict_t *self);
        !           399:        void            (*dodge)(edict_t *self, edict_t *other, float eta);
        !           400:        void            (*attack)(edict_t *self);
        !           401:        void            (*melee)(edict_t *self);
        !           402:        void            (*sight)(edict_t *self, edict_t *other);
        !           403:        qboolean        (*checkattack)(edict_t *self);
        !           404: 
        !           405:        float           pausetime;
        !           406:        float           attack_finished;
        !           407: 
        !           408:        vec3_t          saved_goal;
        !           409:        float           search_time;
        !           410:        float           trail_time;
        !           411:        vec3_t          last_sighting;
        !           412:        int                     attack_state;
        !           413:        int                     lefty;
        !           414:        float           idle_time;
        !           415:        int                     linkcount;
        !           416: 
        !           417:        int                     power_armor_type;
        !           418:        int                     power_armor_power;
        !           419: } monsterinfo_t;
        !           420: 
        !           421: 
        !           422: 
        !           423: extern game_locals_t   game;
        !           424: extern level_locals_t  level;
        !           425: extern game_import_t   gi;
        !           426: extern game_export_t   globals;
        !           427: extern spawn_temp_t    st;
        !           428: 
        !           429: extern int     sm_meat_index;
        !           430: extern int     snd_fry;
        !           431: 
        !           432: extern int     jacket_armor_index;
        !           433: extern int     combat_armor_index;
        !           434: extern int     body_armor_index;
        !           435: 
        !           436: 
        !           437: // means of death
        !           438: #define MOD_UNKNOWN                    0
        !           439: #define MOD_BLASTER                    1
        !           440: #define MOD_SHOTGUN                    2
        !           441: #define MOD_SSHOTGUN           3
        !           442: #define MOD_MACHINEGUN         4
        !           443: #define MOD_CHAINGUN           5
        !           444: #define MOD_GRENADE                    6
        !           445: #define MOD_G_SPLASH           7
        !           446: #define MOD_ROCKET                     8
        !           447: #define MOD_R_SPLASH           9
        !           448: #define MOD_HYPERBLASTER       10
        !           449: #define MOD_RAILGUN                    11
        !           450: #define MOD_BFG_LASER          12
        !           451: #define MOD_BFG_BLAST          13
        !           452: #define MOD_BFG_EFFECT         14
        !           453: #define MOD_HANDGRENADE                15
        !           454: #define MOD_HG_SPLASH          16
        !           455: #define MOD_WATER                      17
        !           456: #define MOD_SLIME                      18
        !           457: #define MOD_LAVA                       19
        !           458: #define MOD_CRUSH                      20
        !           459: #define MOD_TELEFRAG           21
        !           460: #define MOD_FALLING                    22
        !           461: #define MOD_SUICIDE                    23
        !           462: #define MOD_HELD_GRENADE       24
        !           463: #define MOD_EXPLOSIVE          25
        !           464: #define MOD_BARREL                     26
        !           465: #define MOD_BOMB                       27
        !           466: #define MOD_EXIT                       28
        !           467: #define MOD_SPLASH                     29
        !           468: #define MOD_TARGET_LASER       30
        !           469: #define MOD_TRIGGER_HURT       31
        !           470: #define MOD_HIT                                32
        !           471: #define MOD_TARGET_BLASTER     33
        !           472: // RAFAEL 14-APR-98
        !           473: #define MOD_RIPPER                             34
        !           474: #define MOD_PHALANX                            35
        !           475: #define MOD_BRAINTENTACLE              36
        !           476: #define MOD_BLASTOFF                   37
        !           477: #define MOD_GEKK                               38
        !           478: #define MOD_TRAP                               39
        !           479: // END 14-APR-98
        !           480: #define MOD_FRIENDLY_FIRE      0x8000000
        !           481: 
        !           482: extern int     meansOfDeath;
        !           483: 
        !           484: 
        !           485: extern edict_t                 *g_edicts;
        !           486: 
        !           487: #define        FOFS(x) (int)&(((edict_t *)0)->x)
        !           488: #define        STOFS(x) (int)&(((spawn_temp_t *)0)->x)
        !           489: #define        LLOFS(x) (int)&(((level_locals_t *)0)->x)
        !           490: #define        CLOFS(x) (int)&(((gclient_t *)0)->x)
        !           491: 
        !           492: #define random()       ((rand () & 0x7fff) / ((float)0x7fff))
        !           493: #define crandom()      (2.0 * (random() - 0.5))
        !           494: 
        !           495: extern cvar_t  *maxentities;
        !           496: extern cvar_t  *deathmatch;
        !           497: extern cvar_t  *coop;
        !           498: extern cvar_t  *dmflags;
        !           499: extern cvar_t  *skill;
        !           500: extern cvar_t  *fraglimit;
        !           501: extern cvar_t  *timelimit;
        !           502: extern cvar_t  *password;
        !           503: extern cvar_t  *spectator_password;
        !           504: extern cvar_t  *g_select_empty;
        !           505: extern cvar_t  *dedicated;
        !           506: 
        !           507: extern cvar_t  *filterban;
        !           508: 
        !           509: extern cvar_t  *sv_gravity;
        !           510: extern cvar_t  *sv_maxvelocity;
        !           511: 
        !           512: extern cvar_t  *gun_x, *gun_y, *gun_z;
        !           513: extern cvar_t  *sv_rollspeed;
        !           514: extern cvar_t  *sv_rollangle;
        !           515: 
        !           516: extern cvar_t  *run_pitch;
        !           517: extern cvar_t  *run_roll;
        !           518: extern cvar_t  *bob_up;
        !           519: extern cvar_t  *bob_pitch;
        !           520: extern cvar_t  *bob_roll;
        !           521: 
        !           522: extern cvar_t  *sv_cheats;
        !           523: extern cvar_t  *maxclients;
        !           524: extern cvar_t  *maxspectators;
        !           525: 
        !           526: extern cvar_t  *flood_msgs;
        !           527: extern cvar_t  *flood_persecond;
        !           528: extern cvar_t  *flood_waitdelay;
        !           529: 
        !           530: extern cvar_t  *sv_maplist;
        !           531: 
        !           532: #define world  (&g_edicts[0])
        !           533: 
        !           534: // item spawnflags
        !           535: #define ITEM_TRIGGER_SPAWN             0x00000001
        !           536: #define ITEM_NO_TOUCH                  0x00000002
        !           537: // 6 bits reserved for editor flags
        !           538: // 8 bits used as power cube id bits for coop games
        !           539: #define DROPPED_ITEM                   0x00010000
        !           540: #define        DROPPED_PLAYER_ITEM             0x00020000
        !           541: #define ITEM_TARGETS_USED              0x00040000
        !           542: 
        !           543: //
        !           544: // fields are needed for spawning from the entity string
        !           545: // and saving / loading games
        !           546: //
        !           547: #define FFL_SPAWNTEMP          1
        !           548: #define FFL_NOSPAWN                    2
        !           549: 
        !           550: typedef enum {
        !           551:        F_INT, 
        !           552:        F_FLOAT,
        !           553:        F_LSTRING,                      // string on disk, pointer in memory, TAG_LEVEL
        !           554:        F_GSTRING,                      // string on disk, pointer in memory, TAG_GAME
        !           555:        F_VECTOR,
        !           556:        F_ANGLEHACK,
        !           557:        F_EDICT,                        // index on disk, pointer in memory
        !           558:        F_ITEM,                         // index on disk, pointer in memory
        !           559:        F_CLIENT,                       // index on disk, pointer in memory
        !           560:        F_FUNCTION,
        !           561:        F_MMOVE,
        !           562:        F_IGNORE
        !           563: } fieldtype_t;
        !           564: 
        !           565: typedef struct
        !           566: {
        !           567:        char    *name;
        !           568:        int             ofs;
        !           569:        fieldtype_t     type;
        !           570:        int             flags;
        !           571: } field_t;
        !           572: 
        !           573: 
        !           574: extern field_t fields[];
        !           575: extern gitem_t itemlist[];
        !           576: 
        !           577: 
        !           578: //
        !           579: // g_cmds.c
        !           580: //
        !           581: void Cmd_Help_f (edict_t *ent);
        !           582: void Cmd_Score_f (edict_t *ent);
        !           583: 
        !           584: //
        !           585: // g_items.c
        !           586: //
        !           587: void PrecacheItem (gitem_t *it);
        !           588: void InitItems (void);
        !           589: void SetItemNames (void);
        !           590: gitem_t        *FindItem (char *pickup_name);
        !           591: gitem_t        *FindItemByClassname (char *classname);
        !           592: #define        ITEM_INDEX(x) ((x)-itemlist)
        !           593: edict_t *Drop_Item (edict_t *ent, gitem_t *item);
        !           594: void SetRespawn (edict_t *ent, float delay);
        !           595: void ChangeWeapon (edict_t *ent);
        !           596: void SpawnItem (edict_t *ent, gitem_t *item);
        !           597: void Think_Weapon (edict_t *ent);
        !           598: int ArmorIndex (edict_t *ent);
        !           599: int PowerArmorType (edict_t *ent);
        !           600: gitem_t        *GetItemByIndex (int index);
        !           601: qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count);
        !           602: void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
        !           603: 
        !           604: //
        !           605: // g_utils.c
        !           606: //
        !           607: qboolean       KillBox (edict_t *ent);
        !           608: void   G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
        !           609: edict_t *G_Find (edict_t *from, int fieldofs, char *match);
        !           610: edict_t *findradius (edict_t *from, vec3_t org, float rad);
        !           611: edict_t *G_PickTarget (char *targetname);
        !           612: void   G_UseTargets (edict_t *ent, edict_t *activator);
        !           613: void   G_SetMovedir (vec3_t angles, vec3_t movedir);
        !           614: 
        !           615: void   G_InitEdict (edict_t *e);
        !           616: edict_t        *G_Spawn (void);
        !           617: void   G_FreeEdict (edict_t *e);
        !           618: 
        !           619: void   G_TouchTriggers (edict_t *ent);
        !           620: void   G_TouchSolids (edict_t *ent);
        !           621: 
        !           622: char   *G_CopyString (char *in);
        !           623: 
        !           624: float  *tv (float x, float y, float z);
        !           625: char   *vtos (vec3_t v);
        !           626: 
        !           627: float vectoyaw (vec3_t vec);
        !           628: void vectoangles (vec3_t vec, vec3_t angles);
        !           629: 
        !           630: //
        !           631: // g_combat.c
        !           632: //
        !           633: qboolean OnSameTeam (edict_t *ent1, edict_t *ent2);
        !           634: qboolean CanDamage (edict_t *targ, edict_t *inflictor);
        !           635: void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod);
        !           636: void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod);
        !           637: 
        !           638: // damage flags
        !           639: #define DAMAGE_RADIUS                  0x00000001      // damage was indirect
        !           640: #define DAMAGE_NO_ARMOR                        0x00000002      // armour does not protect from this damage
        !           641: #define DAMAGE_ENERGY                  0x00000004      // damage is from an energy based weapon
        !           642: #define DAMAGE_NO_KNOCKBACK            0x00000008      // do not affect velocity, just view angles
        !           643: #define DAMAGE_BULLET                  0x00000010  // damage is from a bullet (used for ricochets)
        !           644: #define DAMAGE_NO_PROTECTION   0x00000020  // armor, shields, invulnerability, and godmode have no effect
        !           645: 
        !           646: #define DEFAULT_BULLET_HSPREAD 300
        !           647: #define DEFAULT_BULLET_VSPREAD 500
        !           648: #define DEFAULT_SHOTGUN_HSPREAD        1000
        !           649: #define DEFAULT_SHOTGUN_VSPREAD        500
        !           650: #define DEFAULT_DEATHMATCH_SHOTGUN_COUNT       12
        !           651: #define DEFAULT_SHOTGUN_COUNT  12
        !           652: #define DEFAULT_SSHOTGUN_COUNT 20
        !           653: 
        !           654: //
        !           655: // g_monster.c
        !           656: //
        !           657: void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype);
        !           658: void monster_fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int flashtype);
        !           659: void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
        !           660: void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype);
        !           661: void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype);
        !           662: void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype);
        !           663: void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype);
        !           664: // RAFAEL
        !           665: void monster_fire_ionripper (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
        !           666: void monster_fire_heat (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype);
        !           667: void monster_dabeam (edict_t *self);
        !           668: void monster_fire_blueblaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect);
        !           669: 
        !           670: 
        !           671: void M_droptofloor (edict_t *ent);
        !           672: void monster_think (edict_t *self);
        !           673: void walkmonster_start (edict_t *self);
        !           674: void swimmonster_start (edict_t *self);
        !           675: void flymonster_start (edict_t *self);
        !           676: void AttackFinished (edict_t *self, float time);
        !           677: void monster_death_use (edict_t *self);
        !           678: void M_CatagorizePosition (edict_t *ent);
        !           679: qboolean M_CheckAttack (edict_t *self);
        !           680: void M_FlyCheck (edict_t *self);
        !           681: void M_CheckGround (edict_t *ent);
        !           682: 
        !           683: //
        !           684: // g_misc.c
        !           685: //
        !           686: void ThrowHead (edict_t *self, char *gibname, int damage, int type);
        !           687: void ThrowClientHead (edict_t *self, int damage);
        !           688: void ThrowGib (edict_t *self, char *gibname, int damage, int type);
        !           689: void BecomeExplosion1(edict_t *self);
        !           690: // RAFAEL
        !           691: void ThrowHeadACID (edict_t *self, char *gibname, int damage, int type);
        !           692: void ThrowGibACID (edict_t *self, char *gibname, int damage, int type);
        !           693: 
        !           694: //
        !           695: // g_ai.c
        !           696: //
        !           697: void AI_SetSightClient (void);
        !           698: 
        !           699: void ai_stand (edict_t *self, float dist);
        !           700: void ai_move (edict_t *self, float dist);
        !           701: void ai_walk (edict_t *self, float dist);
        !           702: void ai_turn (edict_t *self, float dist);
        !           703: void ai_run (edict_t *self, float dist);
        !           704: void ai_charge (edict_t *self, float dist);
        !           705: int range (edict_t *self, edict_t *other);
        !           706: 
        !           707: void FoundTarget (edict_t *self);
        !           708: qboolean infront (edict_t *self, edict_t *other);
        !           709: qboolean visible (edict_t *self, edict_t *other);
        !           710: qboolean FacingIdeal(edict_t *self);
        !           711: 
        !           712: //
        !           713: // g_weapon.c
        !           714: //
        !           715: void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin);
        !           716: qboolean fire_hit (edict_t *self, vec3_t aim, int damage, int kick);
        !           717: void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod);
        !           718: void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod);
        !           719: void fire_blaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect, qboolean hyper);
        !           720: void fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius);
        !           721: void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held);
        !           722: void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
        !           723: void fire_rail (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick);
        !           724: void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius);
        !           725: // RAFAEL
        !           726: void fire_ionripper (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect);
        !           727: void fire_heat (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
        !           728: void fire_blueblaster (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int effect);
        !           729: void fire_plasma (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage);
        !           730: void fire_trap (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held);
        !           731: 
        !           732: //
        !           733: // g_ptrail.c
        !           734: //
        !           735: void PlayerTrail_Init (void);
        !           736: void PlayerTrail_Add (vec3_t spot);
        !           737: void PlayerTrail_New (vec3_t spot);
        !           738: edict_t *PlayerTrail_PickFirst (edict_t *self);
        !           739: edict_t *PlayerTrail_PickNext (edict_t *self);
        !           740: edict_t        *PlayerTrail_LastSpot (void);
        !           741: 
        !           742: //
        !           743: // g_client.c
        !           744: //
        !           745: void respawn (edict_t *ent);
        !           746: void BeginIntermission (edict_t *targ);
        !           747: void PutClientInServer (edict_t *ent);
        !           748: void InitClientPersistant (gclient_t *client);
        !           749: void InitClientResp (gclient_t *client);
        !           750: void InitBodyQue (void);
        !           751: void ClientBeginServerFrame (edict_t *ent);
        !           752: 
        !           753: //
        !           754: // g_player.c
        !           755: //
        !           756: void player_pain (edict_t *self, edict_t *other, float kick, int damage);
        !           757: void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
        !           758: 
        !           759: //
        !           760: // g_svcmds.c
        !           761: //
        !           762: void   ServerCommand (void);
        !           763: qboolean SV_FilterPacket (char *from);
        !           764: 
        !           765: //
        !           766: // p_view.c
        !           767: //
        !           768: void ClientEndServerFrame (edict_t *ent);
        !           769: 
        !           770: //
        !           771: // p_hud.c
        !           772: //
        !           773: void MoveClientToIntermission (edict_t *client);
        !           774: void G_SetStats (edict_t *ent);
        !           775: void G_SetSpectatorStats (edict_t *ent);
        !           776: void G_CheckChaseStats (edict_t *ent);
        !           777: void ValidateSelectedItem (edict_t *ent);
        !           778: void DeathmatchScoreboardMessage (edict_t *client, edict_t *killer);
        !           779: 
        !           780: //
        !           781: // g_pweapon.c
        !           782: //
        !           783: void PlayerNoise(edict_t *who, vec3_t where, int type);
        !           784: 
        !           785: //
        !           786: // m_move.c
        !           787: //
        !           788: qboolean M_CheckBottom (edict_t *ent);
        !           789: qboolean M_walkmove (edict_t *ent, float yaw, float dist);
        !           790: void M_MoveToGoal (edict_t *ent, float dist);
        !           791: void M_ChangeYaw (edict_t *ent);
        !           792: 
        !           793: //
        !           794: // g_phys.c
        !           795: //
        !           796: void G_RunEntity (edict_t *ent);
        !           797: 
        !           798: //
        !           799: // g_main.c
        !           800: //
        !           801: void SaveClientData (void);
        !           802: void FetchClientEntData (edict_t *ent);
        !           803: 
        !           804: //
        !           805: // g_chase.c
        !           806: //
        !           807: void UpdateChaseCam(edict_t *ent);
        !           808: void ChaseNext(edict_t *ent);
        !           809: void ChasePrev(edict_t *ent);
        !           810: void GetChaseTarget(edict_t *ent);
        !           811: 
        !           812: //============================================================================
        !           813: 
        !           814: // client_t->anim_priority
        !           815: #define        ANIM_BASIC              0               // stand / run
        !           816: #define        ANIM_WAVE               1
        !           817: #define        ANIM_JUMP               2
        !           818: #define        ANIM_PAIN               3
        !           819: #define        ANIM_ATTACK             4
        !           820: #define        ANIM_DEATH              5
        !           821: #define        ANIM_REVERSE    6
        !           822: 
        !           823: 
        !           824: // client data that stays across multiple level loads
        !           825: typedef struct
        !           826: {
        !           827:        char            userinfo[MAX_INFO_STRING];
        !           828:        char            netname[16];
        !           829:        int                     hand;
        !           830: 
        !           831:        qboolean        connected;                      // a loadgame will leave valid entities that
        !           832:                                                                        // just don't have a connection yet
        !           833: 
        !           834:        // values saved and restored from edicts when changing levels
        !           835:        int                     health;
        !           836:        int                     max_health;
        !           837:        int                     savedFlags;
        !           838: 
        !           839:        int                     selected_item;
        !           840:        int                     inventory[MAX_ITEMS];
        !           841: 
        !           842:        // ammo capacities
        !           843:        int                     max_bullets;
        !           844:        int                     max_shells;
        !           845:        int                     max_rockets;
        !           846:        int                     max_grenades;
        !           847:        int                     max_cells;
        !           848:        int                     max_slugs;
        !           849:        // RAFAEL
        !           850:        int                     max_magslug;
        !           851:        int                     max_trap;
        !           852: 
        !           853:        gitem_t         *weapon;
        !           854:        gitem_t         *lastweapon;
        !           855: 
        !           856:        int                     power_cubes;    // used for tracking the cubes in coop games
        !           857:        int                     score;                  // for calculating total unit score in coop games
        !           858: 
        !           859:        int                     game_helpchanged;
        !           860:        int                     helpchanged;
        !           861: 
        !           862:        qboolean        spectator;                      // client is a spectator
        !           863: } client_persistant_t;
        !           864: 
        !           865: // client data that stays across deathmatch respawns
        !           866: typedef struct
        !           867: {
        !           868:        client_persistant_t     coop_respawn;   // what to set client->pers to on a respawn
        !           869:        int                     enterframe;                     // level.framenum the client entered the game
        !           870:        int                     score;                          // frags, etc
        !           871:        vec3_t          cmd_angles;                     // angles sent over in the last command
        !           872: 
        !           873:        qboolean        spectator;                      // client is a spectator
        !           874: } client_respawn_t;
        !           875: 
        !           876: // this structure is cleared on each PutClientInServer(),
        !           877: // except for 'client->pers'
        !           878: struct gclient_s
        !           879: {
        !           880:        // known to server
        !           881:        player_state_t  ps;                             // communicated by server to clients
        !           882:        int                             ping;
        !           883: 
        !           884:        // private to game
        !           885:        client_persistant_t     pers;
        !           886:        client_respawn_t        resp;
        !           887:        pmove_state_t           old_pmove;      // for detecting out-of-pmove changes
        !           888: 
        !           889:        qboolean        showscores;                     // set layout stat
        !           890:        qboolean        showinventory;          // set layout stat
        !           891:        qboolean        showhelp;
        !           892:        qboolean        showhelpicon;
        !           893: 
        !           894:        int                     ammo_index;
        !           895: 
        !           896:        int                     buttons;
        !           897:        int                     oldbuttons;
        !           898:        int                     latched_buttons;
        !           899: 
        !           900:        qboolean        weapon_thunk;
        !           901: 
        !           902:        gitem_t         *newweapon;
        !           903: 
        !           904:        // sum up damage over an entire frame, so
        !           905:        // shotgun blasts give a single big kick
        !           906:        int                     damage_armor;           // damage absorbed by armor
        !           907:        int                     damage_parmor;          // damage absorbed by power armor
        !           908:        int                     damage_blood;           // damage taken out of health
        !           909:        int                     damage_knockback;       // impact damage
        !           910:        vec3_t          damage_from;            // origin for vector calculation
        !           911: 
        !           912:        float           killer_yaw;                     // when dead, look at killer
        !           913: 
        !           914:        weaponstate_t   weaponstate;
        !           915:        vec3_t          kick_angles;    // weapon kicks
        !           916:        vec3_t          kick_origin;
        !           917:        float           v_dmg_roll, v_dmg_pitch, v_dmg_time;    // damage kicks
        !           918:        float           fall_time, fall_value;          // for view drop on fall
        !           919:        float           damage_alpha;
        !           920:        float           bonus_alpha;
        !           921:        vec3_t          damage_blend;
        !           922:        vec3_t          v_angle;                        // aiming direction
        !           923:        float           bobtime;                        // so off-ground doesn't change it
        !           924:        vec3_t          oldviewangles;
        !           925:        vec3_t          oldvelocity;
        !           926: 
        !           927:        float           next_drown_time;
        !           928:        int                     old_waterlevel;
        !           929:        int                     breather_sound;
        !           930: 
        !           931:        int                     machinegun_shots;       // for weapon raising
        !           932: 
        !           933:        // animation vars
        !           934:        int                     anim_end;
        !           935:        int                     anim_priority;
        !           936:        qboolean        anim_duck;
        !           937:        qboolean        anim_run;
        !           938: 
        !           939:        // powerup timers
        !           940:        float           quad_framenum;
        !           941:        float           invincible_framenum;
        !           942:        float           breather_framenum;
        !           943:        float           enviro_framenum;
        !           944: 
        !           945:        qboolean        grenade_blew_up;
        !           946:        float           grenade_time;
        !           947:        // RAFAEL
        !           948:        float           quadfire_framenum;
        !           949:        qboolean        trap_blew_up;
        !           950:        float           trap_time;
        !           951:        
        !           952:        int                     silencer_shots;
        !           953:        int                     weapon_sound;
        !           954: 
        !           955:        float           pickup_msg_time;
        !           956: 
        !           957:        float           flood_locktill;         // locked from talking
        !           958:        float           flood_when[10];         // when messages were said
        !           959:        int                     flood_whenhead;         // head pointer for when said
        !           960: 
        !           961:        float           respawn_time;           // can respawn when time > this
        !           962: 
        !           963:        edict_t         *chase_target;          // player we are chasing
        !           964:        qboolean        update_chase;           // need to update chase info?
        !           965: };
        !           966: 
        !           967: 
        !           968: struct edict_s
        !           969: {
        !           970:        entity_state_t  s;
        !           971:        struct gclient_s        *client;        // NULL if not a player
        !           972:                                                                        // the server expects the first part
        !           973:                                                                        // of gclient_s to be a player_state_t
        !           974:                                                                        // but the rest of it is opaque
        !           975: 
        !           976:        qboolean        inuse;
        !           977:        int                     linkcount;
        !           978: 
        !           979:        // FIXME: move these fields to a server private sv_entity_t
        !           980:        link_t          area;                           // linked to a division node or leaf
        !           981:        
        !           982:        int                     num_clusters;           // if -1, use headnode instead
        !           983:        int                     clusternums[MAX_ENT_CLUSTERS];
        !           984:        int                     headnode;                       // unused if num_clusters != -1
        !           985:        int                     areanum, areanum2;
        !           986: 
        !           987:        //================================
        !           988: 
        !           989:        int                     svflags;
        !           990:        vec3_t          mins, maxs;
        !           991:        vec3_t          absmin, absmax, size;
        !           992:        solid_t         solid;
        !           993:        int                     clipmask;
        !           994:        edict_t         *owner;
        !           995: 
        !           996: 
        !           997:        // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
        !           998:        // EXPECTS THE FIELDS IN THAT ORDER!
        !           999: 
        !          1000:        //================================
        !          1001:        int                     movetype;
        !          1002:        int                     flags;
        !          1003: 
        !          1004:        char            *model;
        !          1005:        float           freetime;                       // sv.time when the object was freed
        !          1006:        
        !          1007:        //
        !          1008:        // only used locally in game, not by server
        !          1009:        //
        !          1010:        char            *message;
        !          1011:        char            *classname;
        !          1012:        int                     spawnflags;
        !          1013: 
        !          1014:        float           timestamp;
        !          1015: 
        !          1016:        float           angle;                  // set in qe3, -1 = up, -2 = down
        !          1017:        char            *target;
        !          1018:        char            *targetname;
        !          1019:        char            *killtarget;
        !          1020:        char            *team;
        !          1021:        char            *pathtarget;
        !          1022:        char            *deathtarget;
        !          1023:        char            *combattarget;
        !          1024:        edict_t         *target_ent;
        !          1025: 
        !          1026:        float           speed, accel, decel;
        !          1027:        vec3_t          movedir;
        !          1028:        vec3_t          pos1, pos2;
        !          1029: 
        !          1030:        vec3_t          velocity;
        !          1031:        vec3_t          avelocity;
        !          1032:        int                     mass;
        !          1033:        float           air_finished;
        !          1034:        float           gravity;                // per entity gravity multiplier (1.0 is normal)
        !          1035:                                                                // use for lowgrav artifact, flares
        !          1036: 
        !          1037:        edict_t         *goalentity;
        !          1038:        edict_t         *movetarget;
        !          1039:        float           yaw_speed;
        !          1040:        float           ideal_yaw;
        !          1041: 
        !          1042:        float           nextthink;
        !          1043:        void            (*prethink) (edict_t *ent);
        !          1044:        void            (*think)(edict_t *self);
        !          1045:        void            (*blocked)(edict_t *self, edict_t *other);      //move to moveinfo?
        !          1046:        void            (*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
        !          1047:        void            (*use)(edict_t *self, edict_t *other, edict_t *activator);
        !          1048:        void            (*pain)(edict_t *self, edict_t *other, float kick, int damage);
        !          1049:        void            (*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
        !          1050: 
        !          1051:        float           touch_debounce_time;            // are all these legit?  do we need more/less of them?
        !          1052:        float           pain_debounce_time;
        !          1053:        float           damage_debounce_time;
        !          1054:        float           fly_sound_debounce_time;        //move to clientinfo
        !          1055:        float           last_move_time;
        !          1056: 
        !          1057:        int                     health;
        !          1058:        int                     max_health;
        !          1059:        int                     gib_health;
        !          1060:        int                     deadflag;
        !          1061:        qboolean        show_hostile;
        !          1062: 
        !          1063:        float           powerarmor_time;
        !          1064: 
        !          1065:        char            *map;                   // target_changelevel
        !          1066: 
        !          1067:        int                     viewheight;             // height above origin where eyesight is determined
        !          1068:        int                     takedamage;
        !          1069:        int                     dmg;
        !          1070:        int                     radius_dmg;
        !          1071:        float           dmg_radius;
        !          1072:        int                     sounds;                 //make this a spawntemp var?
        !          1073:        int                     count;
        !          1074: 
        !          1075:        edict_t         *chain;
        !          1076:        edict_t         *enemy;
        !          1077:        edict_t         *oldenemy;
        !          1078:        edict_t         *activator;
        !          1079:        edict_t         *groundentity;
        !          1080:        int                     groundentity_linkcount;
        !          1081:        edict_t         *teamchain;
        !          1082:        edict_t         *teammaster;
        !          1083: 
        !          1084:        edict_t         *mynoise;               // can go in client only
        !          1085:        edict_t         *mynoise2;
        !          1086: 
        !          1087:        int                     noise_index;
        !          1088:        int                     noise_index2;
        !          1089:        float           volume;
        !          1090:        float           attenuation;
        !          1091: 
        !          1092:        // timing variables
        !          1093:        float           wait;
        !          1094:        float           delay;                  // before firing targets
        !          1095:        float           random;
        !          1096: 
        !          1097:        float           teleport_time;
        !          1098: 
        !          1099:        int                     watertype;
        !          1100:        int                     waterlevel;
        !          1101: 
        !          1102:        vec3_t          move_origin;
        !          1103:        vec3_t          move_angles;
        !          1104: 
        !          1105:        // move this to clientinfo?
        !          1106:        int                     light_level;
        !          1107: 
        !          1108:        int                     style;                  // also used as areaportal number
        !          1109: 
        !          1110:        gitem_t         *item;                  // for bonus items
        !          1111: 
        !          1112:        // common data blocks
        !          1113:        moveinfo_t              moveinfo;
        !          1114:        monsterinfo_t   monsterinfo;
        !          1115: 
        !          1116:        // RAFAEL
        !          1117:        int                     orders;
        !          1118: };
        !          1119: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.