]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/nades.qh
Merge branches 'TimePath/oo', 'TimePath/buffsys', 'TimePath/gametypesys'
[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     for (int i = 0; i < NADES_COUNT; i++)
99     {
100         entity nade = NADES[i];
101         for (int j = 0; j < 2; j++)
102         {
103             if (nade.m_projectile[j] == proj) return nade;
104         }
105     }
106     return NADE_TYPE_NULL;
107 }
108
109 string Nade_TrailEffect(float proj, float nade_team)
110 {
111     for (int i = 0; i < NADES_COUNT; i++)
112     {
113         entity nade = NADES[i];
114         for (int j = 0; j < 2; j++)
115         {
116             if (nade.m_projectile[j] == proj)
117             {
118                 string trail = nade.m_trail[j];
119                 if (trail) return trail;
120                 break;
121             }
122         }
123     }
124     switch (proj)
125     {
126         case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team));
127         case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn");
128     }
129     return "";
130 }
131
132 #ifdef SVQC
133 float healer_send(entity to, int sf);
134 #endif
135
136 #ifdef CSQC
137 // misc functions
138 void ent_healer();
139 #endif // CSQC
140 #endif