]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/nades.qh
Merge branch 'maint' (early part before Transifex)
[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_icon, string, "nade_normal")
37     ATTRIBARRAY(Nade, m_projectile, int, 2)
38     ATTRIBARRAY(Nade, m_trail, string, 2)
39 ENDCLASS(Nade)
40
41 REGISTER_NADE(NULL);
42
43 #define NADE_PROJECTILE(i, projectile, trail) do { \
44     this.m_projectile[i] = projectile; \
45     this.m_trail[i] = trail; \
46 } while (0)
47
48 REGISTER_NADE(NORMAL) {
49     this.m_color = '1 1 1';
50     NADE_PROJECTILE(0, PROJECTILE_NADE, string_null);
51     NADE_PROJECTILE(1, PROJECTILE_NADE_BURN, string_null);
52 }
53
54 REGISTER_NADE(NAPALM) {
55     this.m_color = '2 0.5 0';
56     this.m_icon = "nade_napalm";
57     NADE_PROJECTILE(0, PROJECTILE_NADE_NAPALM, "TR_ROCKET");
58     NADE_PROJECTILE(1, PROJECTILE_NADE_NAPALM_BURN, "spiderbot_rocket_thrust");
59 }
60
61 REGISTER_NADE(ICE) {
62     this.m_color = '0 0.5 2';
63     this.m_icon = "nade_ice";
64     NADE_PROJECTILE(0, PROJECTILE_NADE_ICE, "TR_NEXUIZPLASMA");
65     NADE_PROJECTILE(1, PROJECTILE_NADE_ICE_BURN, "wakizashi_rocket_thrust");
66 }
67
68 REGISTER_NADE(TRANSLOCATE) {
69     this.m_color = '1 0 1';
70     this.m_icon = "nade_translocate";
71     NADE_PROJECTILE(0, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
72     NADE_PROJECTILE(1, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA");
73 }
74
75 REGISTER_NADE(SPAWN) {
76     this.m_color = '1 0.9 0';
77     this.m_icon = "nade_spawn";
78     NADE_PROJECTILE(0, PROJECTILE_NADE_SPAWN, "nade_yellow");
79     NADE_PROJECTILE(1, PROJECTILE_NADE_SPAWN, "nade_yellow");
80 }
81
82 REGISTER_NADE(HEAL) {
83     this.m_color = '1 0 0';
84     this.m_icon = "nade_heal";
85     NADE_PROJECTILE(0, PROJECTILE_NADE_HEAL, "nade_red");
86     NADE_PROJECTILE(1, PROJECTILE_NADE_HEAL_BURN, "nade_red_burn");
87 }
88
89 REGISTER_NADE(MONSTER) {
90     this.m_color = '0.25 0.75 0';
91     this.m_icon = "nade_monster";
92     NADE_PROJECTILE(0, PROJECTILE_NADE_MONSTER, "nade_red");
93     NADE_PROJECTILE(1, PROJECTILE_NADE_MONSTER_BURN, "nade_red_burn");
94 }
95
96 entity Nade_FromProjectile(float proj)
97 {
98     FOREACH(NADES, true, LAMBDA(
99         for (int j = 0; j < 2; j++)
100         {
101             if (it.m_projectile[j] == proj) return it;
102         }
103     ));
104     return NADE_TYPE_NULL;
105 }
106
107 string Nade_TrailEffect(float proj, float nade_team)
108 {
109     FOREACH(NADES, true, LAMBDA(
110         for (int j = 0; j < 2; j++)
111         {
112             if (it.m_projectile[j] == proj)
113             {
114                 string trail = it.m_trail[j];
115                 if (trail) return trail;
116                 break;
117             }
118         }
119     ));
120     switch (proj)
121     {
122         case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team));
123         case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn");
124     }
125     return "";
126 }
127
128 #ifdef SVQC
129 float healer_send(entity to, int sf);
130 #endif
131
132 #ifdef CSQC
133 // misc functions
134 void ent_healer();
135 #endif // CSQC
136 #endif