]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/weapons/all.qh
Merge branch 'terencehill/announcer_fix' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / all.qh
1 #ifndef WEAPONS_ALL_H
2 #define WEAPONS_ALL_H
3
4 #include "../command/all.qh"
5 #include "../stats.qh"
6 #include "config.qh"
7
8 // weapon sets
9 typedef vector WepSet;
10 #define WEPSET(id) WepSet_FromWeapon(WEP_##id.m_id)
11 WepSet WepSet_FromWeapon(int a);
12 #ifdef SVQC
13 void WepSet_AddStat();
14 void WepSet_AddStat_InMap();
15 void WriteWepSet(float dest, WepSet w);
16 #endif
17
18 #ifdef CSQC
19 WepSet WepSet_GetFromStat();
20 WepSet WepSet_GetFromStat_InMap();
21 WepSet ReadWepSet();
22 #endif
23
24 #include "weapon.qh"
25
26 #ifndef MENUQC
27 #include "calculations.qh"
28 #include "../models/all.qh"
29 #endif
30
31 #include "../util.qh"
32
33 #ifdef SVQC
34 #include "../../server/bot/aim.qh"
35 #endif
36
37 REGISTRY(Weapons, 72) // Increase as needed. Can be up to 72.
38 #define Weapons_from(i) _Weapons_from(i, WEP_Null)
39 #define get_weaponinfo(i) Weapons_from(i)
40 REGISTER_REGISTRY(Weapons)
41 STATIC_INIT(WeaponPickup) { FOREACH(Weapons, true, LAMBDA(it.m_pickup = NEW(WeaponPickup, it))); }
42
43
44 GENERIC_COMMAND(dumpweapons, "Dump all weapons into weapons_dump.txt") // WEAPONTODO: make this work with other progs than just server
45 {
46     switch(request)
47     {
48         case CMD_REQUEST_COMMAND:
49         {
50             #ifdef SVQC
51             wep_config_file = -1;
52             wep_config_alsoprint = -1;
53             string filename = argv(1);
54
55             if(filename == "")
56             {
57                 filename = "weapons_dump.cfg";
58                 wep_config_alsoprint = false;
59             }
60             else if(filename == "-")
61             {
62                 filename = "weapons_dump.cfg";
63                 wep_config_alsoprint = true;
64             }
65             wep_config_file = fopen(filename, FILE_WRITE);
66
67             if(wep_config_file >= 0)
68             {
69                 Dump_Weapon_Settings();
70                 LOG_INFO(sprintf("Dumping weapons... File located in ^2data/data/%s^7.\n", filename));
71                 fclose(wep_config_file);
72                 wep_config_file = -1;
73                 wep_config_alsoprint = -1;
74             }
75             else
76             {
77                 LOG_INFO(sprintf("^1Error: ^7Could not open file '%s'!\n", filename));
78             }
79             #else
80             LOG_INFO(_("Weapons dump command only works with sv_cmd.\n"));
81             #endif
82             return;
83         }
84
85         default:
86         case CMD_REQUEST_USAGE:
87         {
88             LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpweapons [filename]"));
89             LOG_INFO("  Where 'filename' is the file to write (default is weapons_dump.cfg),\n");
90             LOG_INFO("  if supplied with '-' output to console as well as default,\n");
91             LOG_INFO("  if left blank, it will only write to default.\n");
92             return;
93         }
94     }
95 }
96
97 #define REGISTER_WEAPON(id, inst) \
98     /* WepSet WEPSET_##id; */ \
99     REGISTER(Weapons, WEP, id, m_id, inst)
100
101 // create cvars for weapon settings
102 #define WEP_ADD_CVAR_NONE(wepname,name) [[last]] float autocvar_g_balance_##wepname##_##name;
103
104 #define WEP_ADD_CVAR_PRI(wepname,name) WEP_ADD_CVAR_NONE(wepname, primary_##name)
105 #define WEP_ADD_CVAR_SEC(wepname,name) WEP_ADD_CVAR_NONE(wepname, secondary_##name)
106 #define WEP_ADD_CVAR_BOTH(wepname,name) \
107     WEP_ADD_CVAR_PRI(wepname, name) \
108     WEP_ADD_CVAR_SEC(wepname, name)
109
110 #define WEP_ADD_CVAR(wepid,wepname,mode,name) WEP_ADD_CVAR_##mode(wepname, name)
111
112 // create properties for weapon settings
113 #define WEP_ADD_PROP(wepid,wepname,type,prop,name) \
114     .type prop; \
115     [[last]] type autocvar_g_balance_##wepname##_##name;
116
117 // read cvars from weapon settings
118 #define WEP_CVAR(wepname,name) autocvar_g_balance_##wepname##_##name
119 #define WEP_CVAR_PRI(wepname,name) WEP_CVAR(wepname, primary_##name)
120 #define WEP_CVAR_SEC(wepname,name) WEP_CVAR(wepname, secondary_##name)
121 #define WEP_CVAR_BOTH(wepname,isprimary,name) ((isprimary) ? WEP_CVAR_PRI(wepname, name) : WEP_CVAR_SEC(wepname, name))
122
123 // set initialization values for weapon settings
124 #define WEP_SKIP_CVAR(unuseda,unusedb,unusedc,unusedd) /* skip cvars */
125 #define WEP_SET_PROP(wepid,wepname,type,prop,name) WEP_##wepid.prop = autocvar_g_balance_##wepname##_##name;
126
127 const int WEP_FIRST = 1;
128 #define WEP_LAST (Weapons_COUNT - 1)
129 WepSet WEPSET_ALL;
130 WepSet WEPSET_SUPERWEAPONS;
131
132 REGISTER_WEAPON(Null, NEW(Weapon));
133
134 #include "all.inc"
135
136 // TODO: remove after 0.8.2. Retains impulse number compatibility because 0.8.1 clients don't reload the weapons.cfg
137 #define WEP_HARDCODED_IMPULSES 20
138
139 // TODO: invert after 0.8.2. Will require moving 'best weapon' impulses
140 #define WEP_IMPULSE_BEGIN 230
141 #define WEP_IMPULSE_END bound(WEP_IMPULSE_BEGIN, WEP_IMPULSE_BEGIN + (Weapons_COUNT - 1) - 1, 253)
142
143 REGISTRY_SORT(Weapons, WEP_HARDCODED_IMPULSES + 1)
144 REGISTRY_CHECK(Weapons)
145
146 STATIC_INIT(register_weapons_done)
147 {
148     FOREACH(Weapons, true, LAMBDA(
149         it.m_id = i;
150         WepSet set = WepSet_FromWeapon(it.m_id);
151         WEPSET_ALL |= set;
152         if ((it.spawnflags) & WEP_FLAG_SUPERWEAPON) WEPSET_SUPERWEAPONS |= set;
153         it.weapon = it.m_id;
154         it.weapons = set;
155         int imp = WEP_IMPULSE_BEGIN + it.m_id - 1;
156         if (imp <= WEP_IMPULSE_END)
157             localcmd(sprintf("alias weapon_%s \"impulse %d\"\n", it.netname, imp));
158         else
159             LOG_TRACEF(_("Impulse limit exceeded, weapon will not be directly accessible: %s\n"), it.netname);
160     ));
161     #ifdef CSQC
162     FOREACH(Weapons, true, LAMBDA(it.wr_init(it)));
163     #endif
164     weaponorder_byid = "";
165     for (int i = Weapons_MAX - 1; i >= 1; --i)
166         if (Weapons_from(i))
167             weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i));
168     weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1));
169 }
170
171 #endif