]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/nades.qh
Merge branch 'master' into TimePath/unified_weapons
[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, entity, 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, EFFECT_Null);
53     NADE_PROJECTILE(1, PROJECTILE_NADE_BURN, EFFECT_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, EFFECT_TR_ROCKET);
61     NADE_PROJECTILE(1, PROJECTILE_NADE_NAPALM_BURN, EFFECT_SPIDERBOT_ROCKET_TRAIL);
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, EFFECT_TR_NEXUIZPLASMA);
69     NADE_PROJECTILE(1, PROJECTILE_NADE_ICE_BURN, EFFECT_RACER_ROCKET_TRAIL);
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, EFFECT_TR_CRYLINKPLASMA);
77     NADE_PROJECTILE(1, PROJECTILE_NADE_TRANSLOCATE, EFFECT_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, EFFECT_NADE_TRAIL_YELLOW);
85     NADE_PROJECTILE(1, PROJECTILE_NADE_SPAWN, EFFECT_NADE_TRAIL_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, EFFECT_NADE_TRAIL_RED);
93     NADE_PROJECTILE(1, PROJECTILE_NADE_HEAL_BURN, EFFECT_NADE_TRAIL_BURN_RED);
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, EFFECT_NADE_TRAIL_RED);
101     NADE_PROJECTILE(1, PROJECTILE_NADE_MONSTER_BURN, EFFECT_NADE_TRAIL_BURN_RED);
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 entity Nade_TrailEffect(int proj, int nade_team)
116 {
117     switch (proj)
118     {
119         case PROJECTILE_NADE:       return EFFECT_NADE_TRAIL(nade_team);
120         case PROJECTILE_NADE_BURN:  return EFFECT_NADE_TRAIL_BURN(nade_team);
121     }
122
123     FOREACH(NADES, true, LAMBDA(
124         for (int j = 0; j < 2; j++)
125         {
126             if (it.m_projectile[j] == proj)
127             {
128                 string trail = it.m_trail[j].eent_eff_name;
129                 if (trail) return it.m_trail[j];
130                 break;
131             }
132         }
133     ));
134
135     return EFFECT_Null;
136 }
137
138 #ifdef SVQC
139 float healer_send(entity to, int sf);
140 #endif
141
142 #endif