Merge branch 'master' into Mario/vaporizer_damage
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / nades.qh
1 #ifndef NADES_H
2 #define NADES_H
3
4 #include "teams.qh"
5
6 .float healer_lifetime;
7 .float healer_radius;
8
9 // use slots 70-100
10 const int PROJECTILE_NADE = 71;
11 const int PROJECTILE_NADE_BURN = 72;
12 const int PROJECTILE_NADE_NAPALM = 73;
13 const int PROJECTILE_NADE_NAPALM_BURN = 74;
14 const int PROJECTILE_NAPALM_FOUNTAIN = 75;
15 const int PROJECTILE_NADE_ICE = 76;
16 const int PROJECTILE_NADE_ICE_BURN = 77;
17 const int PROJECTILE_NADE_TRANSLOCATE = 78;
18 const int PROJECTILE_NADE_SPAWN = 79;
19 const int PROJECTILE_NADE_HEAL = 80;
20 const int PROJECTILE_NADE_HEAL_BURN = 81;
21 const int PROJECTILE_NADE_MONSTER = 82;
22 const int PROJECTILE_NADE_MONSTER_BURN = 83;
23
24 void RegisterNades();
25 const int NADES_MAX = 8;
26 entity NADES[NADES_MAX], NADES_first, NADES_last;
27 int NADES_COUNT;
28 #define REGISTER_NADE(id) REGISTER(RegisterNades, NADE_TYPE, NADES, NADES_COUNT, id, m_id, NEW(Nade))
29 REGISTER_REGISTRY(RegisterNades)
30
31 CLASS(Nade, Object)
32     ATTRIB(Nade, m_id, int, 0)
33     ATTRIB(Nade, m_color, vector, '0 0 0')
34     ATTRIB(Nade, m_name, string, _("Grenade"))
35     ATTRIB(Nade, m_icon, string, "nade_normal")
36     ATTRIBARRAY(Nade, m_projectile, int, 2)
37     ATTRIBARRAY(Nade, m_trail, string, 2)
38     METHOD(Nade, display, void(entity this, void(string name, string icon) returns)) {
39         returns(this.m_name, sprintf("/gfx/hud/%s/%s", cvar_string("menu_skin"), this.m_icon));
40     }
41 ENDCLASS(Nade)
42
43 REGISTER_NADE(NULL);
44
45 #define NADE_PROJECTILE(i, projectile, trail) do { \
46     this.m_projectile[i] = projectile; \
47     this.m_trail[i] = trail; \
48 } while (0)
49
50 REGISTER_NADE(NORMAL) {
51     this.m_color = '1 1 1';
52     NADE_PROJECTILE(0, PROJECTILE_NADE, string_null);
53     NADE_PROJECTILE(1, PROJECTILE_NADE_BURN, string_null);
54 }
55
56 REGISTER_NADE(NAPALM) {
57     this.m_color = '2 0.5 0';
58     this.m_name = _("Napalm grenade");
59     this.m_icon = "nade_napalm";
60     NADE_PROJECTILE(0, PROJECTILE_NADE_NAPALM, "TR_ROCKET");
61     NADE_PROJECTILE(1, PROJECTILE_NADE_NAPALM_BURN, "spiderbot_rocket_thrust");
62 }
63
64 REGISTER_NADE(ICE) {
65     this.m_color = '0 0.5 2';
66     this.m_name = _("Ice grenade");
67     this.m_icon = "nade_ice";
68     NADE_PROJECTILE(0, PROJECTILE_NADE_ICE, "TR_NEXUIZPLASMA");
69     NADE_PROJECTILE(1, PROJECTILE_NADE_ICE_BURN, "wakizashi_rocket_thrust");
70 }
71
72 REGISTER_NADE(TRANSLOCATE) {
73     this.m_color = '1 0 1';
74     this.m_name = _("Translocate grenade");
75     this.m_icon = "nade_translocate";
76     NADE_PROJECTILE(0, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
77     NADE_PROJECTILE(1, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
78 }
79
80 REGISTER_NADE(SPAWN) {
81     this.m_color = '1 0.9 0';
82     this.m_name = _("Spawn grenade");
83     this.m_icon = "nade_spawn";
84     NADE_PROJECTILE(0, PROJECTILE_NADE_SPAWN, "nade_yellow");
85     NADE_PROJECTILE(1, PROJECTILE_NADE_SPAWN, "nade_yellow");
86 }
87
88 REGISTER_NADE(HEAL) {
89     this.m_color = '1 0 0';
90     this.m_name = _("Heal grenade");
91     this.m_icon = "nade_heal";
92     NADE_PROJECTILE(0, PROJECTILE_NADE_HEAL, "nade_red");
93     NADE_PROJECTILE(1, PROJECTILE_NADE_HEAL_BURN, "nade_red_burn");
94 }
95
96 REGISTER_NADE(MONSTER) {
97     this.m_color = '0.25 0.75 0';
98     this.m_name = _("Monster grenade");
99     this.m_icon = "nade_monster";
100     NADE_PROJECTILE(0, PROJECTILE_NADE_MONSTER, "nade_red");
101     NADE_PROJECTILE(1, PROJECTILE_NADE_MONSTER_BURN, "nade_red_burn");
102 }
103
104 entity Nade_FromProjectile(float proj)
105 {
106     FOREACH(NADES, true, LAMBDA(
107         for (int j = 0; j < 2; j++)
108         {
109             if (it.m_projectile[j] == proj) return it;
110         }
111     ));
112     return NADE_TYPE_NULL;
113 }
114
115 string Nade_TrailEffect(float proj, float nade_team)
116 {
117     FOREACH(NADES, true, LAMBDA(
118         for (int j = 0; j < 2; j++)
119         {
120             if (it.m_projectile[j] == proj)
121             {
122                 string trail = it.m_trail[j];
123                 if (trail) return trail;
124                 break;
125             }
126         }
127     ));
128     switch (proj)
129     {
130         case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team));
131         case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn");
132     }
133     return "";
134 }
135
136 #ifdef SVQC
137 float healer_send(entity to, int sf);
138 #endif
139
140 #ifdef CSQC
141 // misc functions
142 void ent_healer();
143 #endif // CSQC
144 #endif