]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/items.qc
change placeholder weapon name to "AOL CD Thrower"
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / items.qc
1 // WEAPON PLUGIN SYSTEM
2 entity weapon_info[WEP_MAXCOUNT];
3 entity dummy_weapon_info;
4
5 void register_weapon(float id, float(float) func, float ammotype, float i, float weapontype, float pickupbasevalue, string modelname, string shortname, string wname)
6 {
7         entity e;
8         weapon_info[id - 1] = e = spawn();
9         e.classname = "weapon_info";
10         e.weapon = id;
11         WEPSET_COPY_EW(e, id);
12         e.netname = shortname;
13         e.message = wname;
14         e.items = ammotype;
15         e.weapon_func = func;
16         e.mdl = modelname;
17         e.model = strzone(strcat("models/weapons/g_", modelname, ".md3"));
18         e.spawnflags = weapontype;
19         e.model2 = strzone(strcat("wpn-", e.mdl));
20         e.impulse = i;
21         e.bot_pickupbasevalue = pickupbasevalue;
22         if(ammotype & IT_SHELLS)
23                 e.ammo_field = ammo_shells;
24         else if(ammotype & IT_NAILS)
25                 e.ammo_field = ammo_nails;
26         else if(ammotype & IT_ROCKETS)
27                 e.ammo_field = ammo_rockets;
28         else if(ammotype & IT_CELLS)
29                 e.ammo_field = ammo_cells;
30         else if(ammotype & IT_FUEL)
31                 e.ammo_field = ammo_fuel;
32         else
33                 e.ammo_field = ammo_batteries;
34 }
35 float w_null(float dummy)
36 {
37         return 0;
38 }
39 void register_weapons_done()
40 {
41         dummy_weapon_info = spawn();
42         dummy_weapon_info.classname = "weapon_info";
43         dummy_weapon_info.weapon = 0; // you can recognize dummies by this
44         WEPSET_CLEAR_E(dummy_weapon_info);
45         dummy_weapon_info.netname = "";
46         dummy_weapon_info.message = "AOL CD Thrower";
47         dummy_weapon_info.items = 0;
48         dummy_weapon_info.weapon_func = w_null;
49         dummy_weapon_info.mdl = "";
50         dummy_weapon_info.model = "";
51         dummy_weapon_info.spawnflags = 0;
52         dummy_weapon_info.model2 = "";
53         dummy_weapon_info.impulse = -1;
54         dummy_weapon_info.bot_pickupbasevalue = 0;
55
56         float i;
57         weaponorder_byid = "";
58         for(i = WEP_MAXCOUNT; i >= 1; --i)
59                 if(weapon_info[i-1])
60                         weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i));
61         weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1));
62 }
63 entity get_weaponinfo(float id)
64 {
65         entity w;
66         if(id < WEP_FIRST || id > WEP_LAST)
67                 return dummy_weapon_info;
68         w = weapon_info[id - 1];
69         if(w)
70                 return w;
71         return dummy_weapon_info;
72 }
73 string W_FixWeaponOrder(string order, float complete)
74 {
75         return fixPriorityList(order, WEP_FIRST, WEP_LAST, 230 - WEP_FIRST, complete);
76 }
77 string W_NameWeaponOrder_MapFunc(string s)
78 {
79         entity wi;
80         if(s == "0" || stof(s))
81         {
82                 wi = get_weaponinfo(stof(s));
83                 if(wi != dummy_weapon_info)
84                         return wi.netname;
85         }
86         return s;
87 }
88 string W_NameWeaponOrder(string order)
89 {
90         return mapPriorityList(order, W_NameWeaponOrder_MapFunc);
91 }
92 string W_NumberWeaponOrder_MapFunc(string s)
93 {
94         float i;
95         if(s == "0" || stof(s))
96                 return s;
97         for(i = WEP_FIRST; i <= WEP_LAST; ++i)
98                 if(s == get_weaponinfo(i).netname)
99                         return ftos(i);
100         return s;
101 }
102 string W_NumberWeaponOrder(string order)
103 {
104         return mapPriorityList(order, W_NumberWeaponOrder_MapFunc);
105 }
106
107 float W_FixWeaponOrder_BuildImpulseList_buf[WEP_MAXCOUNT];
108 string W_FixWeaponOrder_BuildImpulseList_order;
109 void W_FixWeaponOrder_BuildImpulseList_swap(float i, float j, entity pass)
110 {
111         float h;
112         h = W_FixWeaponOrder_BuildImpulseList_buf[i];
113         W_FixWeaponOrder_BuildImpulseList_buf[i] = W_FixWeaponOrder_BuildImpulseList_buf[j];
114         W_FixWeaponOrder_BuildImpulseList_buf[j] = h;
115 }
116 float W_FixWeaponOrder_BuildImpulseList_cmp(float i, float j, entity pass)
117 {
118         entity e1, e2;
119         float d;
120         e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]);
121         e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]);
122         d = mod(e1.impulse + 9, 10) - mod(e2.impulse + 9, 10);
123         if(d != 0)
124                 return -d; // high impulse first!
125         return
126                 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0)
127                 -
128                 strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0)
129                 ; // low char index first!
130 }
131 string W_FixWeaponOrder_BuildImpulseList(string o)
132 {
133         float i;
134         W_FixWeaponOrder_BuildImpulseList_order = o;
135         for(i = WEP_FIRST; i <= WEP_LAST; ++i)
136                 W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i;
137         heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, world);
138         o = "";
139         for(i = WEP_FIRST; i <= WEP_LAST; ++i)
140                 o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST]));
141         W_FixWeaponOrder_BuildImpulseList_order = string_null;
142         return substring(o, 1, -1);
143 }
144
145 string W_FixWeaponOrder_AllowIncomplete(string order)
146 {
147         return W_FixWeaponOrder(order, 0);
148 }
149
150 string W_FixWeaponOrder_ForceComplete(string order)
151 {
152         if(order == "")
153                 order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority"));
154         return W_FixWeaponOrder(order, 1);
155 }
156
157 void W_RandomWeapons(entity e, float n)
158 {
159         float i, j;
160         WEPSET_DECLARE_A(remaining);
161         WEPSET_DECLARE_A(result);
162         WEPSET_COPY_AE(remaining, e);
163         WEPSET_CLEAR_A(result);
164         for(i = 0; i < n; ++i)
165         {
166                 RandomSelection_Init();
167                 for(j = WEP_FIRST; j <= WEP_LAST; ++j)
168                         if(WEPSET_CONTAINS_AW(remaining, j))
169                                 RandomSelection_Add(world, j, string_null, 1, 1);
170                 WEPSET_OR_AW(result, RandomSelection_chosen_float);
171                 WEPSET_ANDNOT_AW(remaining, RandomSelection_chosen_float);
172         }
173         WEPSET_COPY_EA(e, result);
174 }