]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/weapons/weapons.qh
Merge remote-tracking branch 'origin/TimePath/experiments/csqc_prediction' into TimeP...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / weapons.qh
1 #ifndef WEAPONS_H
2 #define WEAPONS_H
3
4 #ifndef MENUQC
5 #include "calculations.qh"
6 #endif
7
8 const int MAX_SHOT_DISTANCE = 32768;
9
10 // weapon pickup ratings for bot logic
11 const int BOT_PICKUP_RATING_LOW  =  2500;
12 const int BOT_PICKUP_RATING_MID  =  5000;
13 const int BOT_PICKUP_RATING_HIGH = 10000;
14
15 // weapon flags
16 const int WEP_TYPE_OTHER          =  0x00; // not for damaging people
17 const int WEP_TYPE_SPLASH         =  0x01; // splash damage
18 const int WEP_TYPE_HITSCAN        =  0x02; // hitscan
19 const int WEP_TYPEMASK            =  0x0F;
20 const int WEP_FLAG_CANCLIMB       =  0x10; // can be used for movement
21 const int WEP_FLAG_NORMAL         =  0x20; // in "most weapons" set
22 const int WEP_FLAG_HIDDEN         =  0x40; // hides from menu
23 const int WEP_FLAG_RELOADABLE     =  0x80; // can has reload
24 const int WEP_FLAG_SUPERWEAPON    = 0x100; // powerup timer
25 const int WEP_FLAG_MUTATORBLOCKED = 0x200; // hides from impulse 99 etc. (mutators are allowed to clear this flag)
26
27 // weapon requests
28 const int WR_SETUP          =  1; // (SERVER) setup weapon data
29 const int WR_THINK          =  2; // (SERVER) logic to run every frame
30 const int WR_CHECKAMMO1     =  3; // (SERVER) checks ammo for weapon primary
31 const int WR_CHECKAMMO2     =  4; // (SERVER) checks ammo for weapon second
32 const int WR_AIM            =  5; // (SERVER) runs bot aiming code for this weapon
33 const int WR_INIT           =  6; // (BOTH)   precaches models/sounds used by this weapon, also sets up weapon properties
34 const int WR_SUICIDEMESSAGE =  7; // (SERVER) notification number for suicide message (may inspect w_deathtype for details)
35 const int WR_KILLMESSAGE    =  8; // (SERVER) notification number for kill message (may inspect w_deathtype for details)
36 const int WR_RELOAD         =  9; // (SERVER) handles reloading for weapon
37 const int WR_RESETPLAYER    = 10; // (SERVER) clears fields that the weapon may use
38 const int WR_IMPACTEFFECT   = 11; // (CLIENT) impact effect for weapon explosion
39 const int WR_PLAYERDEATH    = 12; // (SERVER) called whenever a player dies
40 const int WR_GONETHINK      = 13; // (SERVER) logic to run when weapon is lost
41 const int WR_CONFIG         = 14; // (ALL)    dump weapon cvars to config in data directory (see: sv_cmd dumpweapons)
42 const int WR_ZOOMRETICLE    = 15; // (CLIENT) weapon specific zoom reticle
43 const int WR_DROP           = 16; // (SERVER) the weapon is dropped
44 const int WR_PICKUP         = 17; // (SERVER) a weapon is picked up
45
46 // variables:
47 string weaponorder_byid;
48
49 // weapon sets
50 typedef vector WepSet;
51 WepSet WepSet_FromWeapon(float a);
52 #ifdef SVQC
53 void WepSet_AddStat();
54 void WriteWepSet(float dest, WepSet w);
55 #endif
56 #ifdef CSQC
57 WepSet WepSet_GetFromStat();
58 WepSet ReadWepSet();
59 #endif
60
61 // weapon name macros
62 #define WEP_FIRST 1
63 #define WEP_MAXCOUNT 24 // Increase as needed. Can be up to three times as much.
64 int WEP_COUNT;
65 int WEP_LAST;
66 WepSet WEPSET_ALL;
67 WepSet WEPSET_SUPERWEAPONS;
68
69 // functions:
70 entity get_weaponinfo(float id);
71 string W_FixWeaponOrder(string order, float complete);
72 string W_UndeprecateName(string s);
73 string W_NameWeaponOrder(string order);
74 string W_NumberWeaponOrder(string order);
75 string W_FixWeaponOrder_BuildImpulseList(string o);
76 string W_FixWeaponOrder_AllowIncomplete(string order);
77 string W_FixWeaponOrder_ForceComplete(string order);
78 void W_RandomWeapons(entity e, float n);
79
80 string GetAmmoPicture(.float ammotype);
81
82 #ifdef CSQC
83 .float GetAmmoFieldFromNum(int i);
84 int GetAmmoStat(.float ammotype);
85 #endif
86
87 // ammo types
88 .float ammo_shells;
89 .float ammo_nails;
90 .float ammo_rockets;
91 .float ammo_cells;
92 .float ammo_plasma;
93 .float ammo_fuel;
94 .float ammo_none;
95
96 // other useful macros
97 #define WEP_ACTION(wpn,wrequest) (get_weaponinfo(wpn)).weapon_func(wrequest)
98 #define WEP_AMMO(wpn) ((get_weaponinfo(WEP_##wpn)).ammo_field) // only used inside weapon files/with direct name, don't duplicate prefix
99 #define WEP_NAME(wpn) ((get_weaponinfo(wpn)).message)
100
101
102 // ======================
103 //  Configuration Macros
104 // ======================
105
106 // create cvars for weapon settings
107 #define WEP_ADD_CVAR_NONE(wepname,name) [[last]] float autocvar_g_balance_##wepname##_##name;
108
109 #define WEP_ADD_CVAR_PRI(wepname,name) WEP_ADD_CVAR_NONE(wepname, primary_##name)
110 #define WEP_ADD_CVAR_SEC(wepname,name) WEP_ADD_CVAR_NONE(wepname, secondary_##name)
111 #define WEP_ADD_CVAR_BOTH(wepname,name) \
112         WEP_ADD_CVAR_PRI(wepname, name) \
113         WEP_ADD_CVAR_SEC(wepname, name)
114
115 #define WEP_ADD_CVAR(wepid,wepname,mode,name) WEP_ADD_CVAR_##mode(wepname, name)
116
117 // create properties for weapon settings
118 #define WEP_ADD_PROP(wepid,wepname,type,prop,name) \
119         .type prop; \
120         [[last]] type autocvar_g_balance_##wepname##_##name;
121
122 // read cvars from weapon settings
123 #define WEP_CVAR(wepname,name) autocvar_g_balance_##wepname##_##name
124 #define WEP_CVAR_PRI(wepname,name) WEP_CVAR(wepname, primary_##name)
125 #define WEP_CVAR_SEC(wepname,name) WEP_CVAR(wepname, secondary_##name)
126 #define WEP_CVAR_BOTH(wepname,isprimary,name) ((isprimary) ? WEP_CVAR_PRI(wepname, name) : WEP_CVAR_SEC(wepname, name))
127
128 // set initialization values for weapon settings
129 #define WEP_SKIP_CVAR(unuseda,unusedb,unusedc,unusedd) /* skip cvars */
130 #define WEP_SET_PROP(wepid,wepname,type,prop,name) get_weaponinfo(WEP_##wepid).##prop = autocvar_g_balance_##wepname##_##name;
131
132
133 // =====================
134 //  Weapon Registration
135 // =====================
136
137 float w_null(float dummy);
138
139 void register_weapon(
140         float id,
141         WepSet bit,
142         float(float) func,
143         .float ammotype,
144         float i,
145         float weapontype,
146         float pickupbasevalue,
147         vector clr,
148         string modelname,
149         string simplemdl,
150         string crosshair,
151         string wepimg,
152         string refname,
153         string wepname);
154
155 void register_weapons_done();
156
157 // entity properties of weaponinfo:
158 // fields which are explicitly/manually set are marked with "M", fields set automatically are marked with "A"
159 .int weapon;                // M: WEP_id    // WEP_...
160 .WepSet weapons;            // A: WEPSET_id // WEPSET_...
161 .float(float) weapon_func;  // M: function  // w_...
162 ..float ammo_field;         // M: ammotype  // main ammo field
163 .int impulse;               // M: impulse   // weapon impulse
164 .int spawnflags;            // M: flags     // WEPSPAWNFLAG_... combined
165 .float bot_pickupbasevalue; // M: rating    // bot weapon priority
166 .vector wpcolor;            // M: color     // waypointsprite color
167 .string wpmodel;            // A: wpn-id    // wpn- sprite name
168 .string mdl;                // M: modelname // name of model (without g_ v_ or h_ prefixes)
169 .string model;              // A: modelname // full path to g_ model
170 .string w_simplemdl;        // M: simplemdl // simpleitems weapon model/image
171 .string w_crosshair;        // M: crosshair // per-weapon crosshair: "CrosshairImage Size"
172 .float w_crosshair_size;    // A: crosshair // per-weapon crosshair size (argument two of "crosshair" field)
173 .string model2;             // M: wepimg    // "weaponfoobar" side view image file of weapon // WEAPONTODO: Move out of skin files, move to common files
174 .string netname;            // M: refname   // reference name name
175 .string message;            // M: wepname   // human readable name
176
177
178 // note: the fabs call is just there to hide "if result is constant" warning
179 #define REGISTER_WEAPON_2(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \
180         int id; \
181         WepSet bit; \
182         float function(float); \
183         void RegisterWeapons_##id() \
184         { \
185                 WEP_LAST = (id = WEP_FIRST + WEP_COUNT); \
186                 bit = WepSet_FromWeapon(id); \
187                 WEPSET_ALL |= bit; \
188                 if((flags) & WEP_FLAG_SUPERWEAPON) \
189                         WEPSET_SUPERWEAPONS |= bit; \
190                 ++WEP_COUNT; \
191                 register_weapon(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname); \
192         } \
193         ACCUMULATE_FUNCTION(RegisterWeapons, RegisterWeapons_##id)
194 #ifdef MENUQC
195 #define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \
196         REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,w_null,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname)
197 #else
198 #define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \
199         REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname)
200 #endif
201
202 #include "all.qh"
203
204 #undef WEP_ADD_CVAR_MO_PRI
205 #undef WEP_ADD_CVAR_MO_SEC
206 #undef WEP_ADD_CVAR_MO_BOTH
207 #undef WEP_ADD_CVAR_MO_NONE
208 #undef WEP_ADD_CVAR
209 #undef WEP_ADD_PROP
210 #undef REGISTER_WEAPON
211
212 ACCUMULATE_FUNCTION(RegisterWeapons, register_weapons_done);
213 #endif