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