]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/resources.qc
Merge branch 'master' into Lyberta/TeamplayOverhaul
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / resources.qc
1 #include "resources.qh"
2
3 /// \file
4 /// \brief Source file that contains implementation of the resource system.
5 /// \copyright GNU GPLv2 or any later version.
6
7 float GetResourceAmount(entity e, int resource_type)
8 {
9         .float resource_field = GetResourceField(resource_type);
10         return e.(resource_field);
11 }
12
13 bool SetResourceAmountExplicit(entity e, int resource_type, float amount)
14 {
15         .float resource_field = GetResourceField(resource_type);
16         if (e.(resource_field) != amount)
17         {
18                 e.(resource_field) = amount;
19                 return true;
20         }
21         return false;
22 }
23
24 void SetResourceAmount(entity e, int resource_type, float amount)
25 {
26         SetResourceAmountExplicit(e, resource_type, amount);
27 }
28
29 void TakeResource(entity receiver, int resource_type, float amount)
30 {
31         if (amount == 0)
32         {
33                 return;
34         }
35         SetResourceAmount(receiver, resource_type,
36                 GetResourceAmount(receiver, resource_type) - amount);
37 }
38
39 void TakeResourceWithLimit(entity receiver, int resource_type, float amount,
40         float limit)
41 {
42         if (amount == 0)
43         {
44                 return;
45         }
46         float current_amount = GetResourceAmount(receiver, resource_type);
47         if (current_amount - amount < limit)
48         {
49                 amount = limit + current_amount;
50         }
51         TakeResource(receiver, resource_type, amount);
52 }
53
54 int GetResourceType(.float resource_field)
55 {
56         switch (resource_field)
57         {
58                 case health: { return RESOURCE_HEALTH; }
59                 case armorvalue: { return RESOURCE_ARMOR; }
60                 case ammo_shells: { return RESOURCE_SHELLS; }
61                 case ammo_nails: { return RESOURCE_BULLETS; }
62                 case ammo_rockets: { return RESOURCE_ROCKETS; }
63                 case ammo_cells: { return RESOURCE_CELLS; }
64                 case ammo_plasma: { return RESOURCE_PLASMA; }
65                 case ammo_fuel: { return RESOURCE_FUEL; }
66         }
67         error("GetResourceType: Invalid field.");
68         return 0;
69 }
70
71 .float GetResourceField(int resource_type)
72 {
73         switch (resource_type)
74         {
75                 case RESOURCE_HEALTH: { return health; }
76                 case RESOURCE_ARMOR: { return armorvalue; }
77                 case RESOURCE_SHELLS: { return ammo_shells; }
78                 case RESOURCE_BULLETS: { return ammo_nails; }
79                 case RESOURCE_ROCKETS: { return ammo_rockets; }
80                 case RESOURCE_CELLS: { return ammo_cells; }
81                 case RESOURCE_PLASMA: { return ammo_plasma; }
82                 case RESOURCE_FUEL: { return ammo_fuel; }
83         }
84         error("GetResourceField: Invalid resource type.");
85         return health;
86 }