1 #include "resources.qh"
4 /// \brief Source file that contains implementation of the resource system.
6 /// \copyright GNU GPLv2 or any later version.
8 #include "autocvars.qh"
9 #include "miscfunctions.qh"
11 float GetResourceLimit(entity e, int resource_type)
14 switch (resource_type)
18 limit = autocvar_g_balance_health_limit;
23 limit = autocvar_g_balance_armor_limit;
28 limit = g_pickup_shells_max;
31 case RESOURCE_BULLETS:
33 limit = g_pickup_nails_max;
36 case RESOURCE_ROCKETS:
38 limit = g_pickup_rockets_max;
43 limit = g_pickup_cells_max;
48 limit = g_pickup_plasma_max;
53 limit = autocvar_g_balance_fuel_limit;
58 error("GetResourceLimit: Invalid resource type.");
62 MUTATOR_CALLHOOK(GetResourceLimit, e, resource_type, limit);
63 limit = M_ARGV(2, float);
64 if (limit > RESOURCE_AMOUNT_HARD_LIMIT)
66 limit = RESOURCE_AMOUNT_HARD_LIMIT;
71 float GetResourceAmount(entity e, int resource_type)
73 .float resource_field = GetResourceField(resource_type);
74 return e.(resource_field);
77 void SetResourceAmount(entity e, int resource_type, float amount)
79 bool forbid = MUTATOR_CALLHOOK(SetResourceAmount, e, resource_type, amount);
84 resource_type = M_ARGV(1, int);
85 amount = M_ARGV(2, float);
86 float max_amount = GetResourceLimit(e, resource_type);
87 float amount_wasted = 0;
88 if (amount > max_amount)
90 amount_wasted = amount - max_amount;
93 .float resource_field = GetResourceField(resource_type);
94 if (e.(resource_field) != amount)
96 e.(resource_field) = amount;
97 MUTATOR_CALLHOOK(ResourceAmountChanged, e, resource_type, amount);
99 if (amount_wasted == 0)
103 MUTATOR_CALLHOOK(ResourceWasted, e, resource_type, amount_wasted);
106 void GiveResource(entity receiver, int resource_type, float amount)
112 bool forbid = MUTATOR_CALLHOOK(GiveResource, receiver, resource_type,
118 resource_type = M_ARGV(1, int);
119 amount = M_ARGV(2, float);
124 SetResourceAmount(receiver, resource_type,
125 GetResourceAmount(receiver, resource_type) + amount);
126 switch (resource_type)
128 case RESOURCE_HEALTH:
130 receiver.pauserothealth_finished =
131 max(receiver.pauserothealth_finished, time +
132 autocvar_g_balance_pause_health_rot);
137 receiver.pauserotarmor_finished =
138 max(receiver.pauserotarmor_finished, time +
139 autocvar_g_balance_pause_armor_rot);
144 receiver.pauserotfuel_finished = max(receiver.pauserotfuel_finished,
145 time + autocvar_g_balance_pause_fuel_rot);
151 void GiveResourceWithLimit(entity receiver, int resource_type, float amount,
158 bool forbid = MUTATOR_CALLHOOK(GiveResourceWithLimit, receiver,
159 resource_type, amount, limit);
164 resource_type = M_ARGV(1, int);
165 amount = M_ARGV(2, float);
166 limit = M_ARGV(3, float);
171 float current_amount = GetResourceAmount(receiver, resource_type);
172 if (current_amount + amount > limit)
174 amount = limit - current_amount;
176 GiveResource(receiver, resource_type, amount);
179 int GetResourceType(.float resource_field)
181 switch (resource_field)
183 case health: { return RESOURCE_HEALTH; }
184 case armorvalue: { return RESOURCE_ARMOR; }
185 case ammo_shells: { return RESOURCE_SHELLS; }
186 case ammo_nails: { return RESOURCE_BULLETS; }
187 case ammo_rockets: { return RESOURCE_ROCKETS; }
188 case ammo_cells: { return RESOURCE_CELLS; }
189 case ammo_plasma: { return RESOURCE_PLASMA; }
190 case ammo_fuel: { return RESOURCE_FUEL; }
192 error("GetResourceType: Invalid field.");
196 .float GetResourceField(int resource_type)
198 switch (resource_type)
200 case RESOURCE_HEALTH: { return health; }
201 case RESOURCE_ARMOR: { return armorvalue; }
202 case RESOURCE_SHELLS: { return ammo_shells; }
203 case RESOURCE_BULLETS: { return ammo_nails; }
204 case RESOURCE_ROCKETS: { return ammo_rockets; }
205 case RESOURCE_CELLS: { return ammo_cells; }
206 case RESOURCE_PLASMA: { return ammo_plasma; }
207 case RESOURCE_FUEL: { return ammo_fuel; }
209 error("GetResourceField: Invalid resource type.");