X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fnades.qh;h=01eb7fff2c8e2730fa1a8eca1062571c4467c977;hb=4a1190b6273d8909b799314abb4f7b665b220176;hp=1004e1ecab63cf9d61ea094bc2dec2a15cf48f5f;hpb=604fe50563434567aeaad721be86ee269c439826;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/nades.qh b/qcsrc/common/nades.qh index 1004e1eca..01eb7fff2 100644 --- a/qcsrc/common/nades.qh +++ b/qcsrc/common/nades.qh @@ -1,103 +1,136 @@ +#ifndef NADES_H +#define NADES_H + +#include "oo.qh" +#include "registry.qh" +#include "teams.qh" + +.float healer_lifetime; +.float healer_radius; + // use slots 70-100 -const float PROJECTILE_NADE = 71; -const float PROJECTILE_NADE_BURN = 72; -const float PROJECTILE_NADE_NAPALM = 73; -const float PROJECTILE_NADE_NAPALM_BURN = 74; -const float PROJECTILE_NAPALM_FOUNTAIN = 75; -const float PROJECTILE_NADE_ICE = 76; -const float PROJECTILE_NADE_ICE_BURN = 77; -const float PROJECTILE_NADE_TRANSLOCATE = 78; -const float PROJECTILE_NADE_SPAWN = 79; -const float PROJECTILE_NADE_HEAL = 80; -const float PROJECTILE_NADE_HEAL_BURN = 81; -const float PROJECTILE_NADE_MONSTER = 82; -const float PROJECTILE_NADE_MONSTER_BURN = 83; - -const float NADE_TYPE_NORMAL = 1; -const float NADE_TYPE_NAPALM = 2; -const float NADE_TYPE_ICE = 3; -const float NADE_TYPE_TRANSLOCATE = 4; -const float NADE_TYPE_SPAWN = 5; -const float NADE_TYPE_HEAL = 6; -const float NADE_TYPE_MONSTER = 7; - -const float NADE_TYPE_LAST = 7; // a check to prevent using higher values & crashing - -vector Nade_Color(float nadeid) -{ - switch(nadeid) - { - case NADE_TYPE_NORMAL: return '1 1 1'; - case NADE_TYPE_NAPALM: return '2 0.5 0'; - case NADE_TYPE_ICE: return '0 0.5 2'; - case NADE_TYPE_TRANSLOCATE: return '1 0.0625 1'; - case NADE_TYPE_SPAWN: return '1 0.9 0.06'; - case NADE_TYPE_HEAL: return '1 0 0'; - case NADE_TYPE_MONSTER: return '1 0.5 0'; - } - - return '0 0 0'; +const int PROJECTILE_NADE = 71; +const int PROJECTILE_NADE_BURN = 72; +const int PROJECTILE_NADE_NAPALM = 73; +const int PROJECTILE_NADE_NAPALM_BURN = 74; +const int PROJECTILE_NAPALM_FOUNTAIN = 75; +const int PROJECTILE_NADE_ICE = 76; +const int PROJECTILE_NADE_ICE_BURN = 77; +const int PROJECTILE_NADE_TRANSLOCATE = 78; +const int PROJECTILE_NADE_SPAWN = 79; +const int PROJECTILE_NADE_HEAL = 80; +const int PROJECTILE_NADE_HEAL_BURN = 81; +const int PROJECTILE_NADE_MONSTER = 82; +const int PROJECTILE_NADE_MONSTER_BURN = 83; + +void RegisterNades(); +const int NADES_MAX = 8; +entity NADES[NADES_MAX], NADES_first, NADES_last; +int NADES_COUNT; +#define REGISTER_NADE(id) REGISTER(RegisterNades, NADE_TYPE, NADES, NADES_COUNT, id, m_id, NEW(Nade)) +REGISTER_REGISTRY(RegisterNades) + +CLASS(Nade, Object) + ATTRIB(Nade, m_id, int, 0) + ATTRIB(Nade, m_color, vector, '0 0 0') + ATTRIB(Nade, m_icon, string, "nade_normal") + ATTRIBARRAY(Nade, m_projectile, int, 2) + ATTRIBARRAY(Nade, m_trail, string, 2) +ENDCLASS(Nade) + +REGISTER_NADE(NULL); + +#define NADE_PROJECTILE(i, projectile, trail) do { \ + this.m_projectile[i] = projectile; \ + this.m_trail[i] = trail; \ +} while (0) + +REGISTER_NADE(NORMAL) { + this.m_color = '1 1 1'; + NADE_PROJECTILE(0, PROJECTILE_NADE, string_null); + NADE_PROJECTILE(1, PROJECTILE_NADE_BURN, string_null); } -float Nade_IDFromProjectile(float proj) -{ - switch(proj) - { - case PROJECTILE_NADE: - case PROJECTILE_NADE_BURN: return NADE_TYPE_NORMAL; - case PROJECTILE_NADE_NAPALM: - case PROJECTILE_NADE_NAPALM_BURN: return NADE_TYPE_NAPALM; - case PROJECTILE_NADE_ICE: - case PROJECTILE_NADE_ICE_BURN: return NADE_TYPE_ICE; - case PROJECTILE_NADE_TRANSLOCATE: return NADE_TYPE_TRANSLOCATE; - case PROJECTILE_NADE_SPAWN: return NADE_TYPE_SPAWN; - case PROJECTILE_NADE_HEAL: - case PROJECTILE_NADE_HEAL_BURN: return NADE_TYPE_HEAL; - case PROJECTILE_NADE_MONSTER: - case PROJECTILE_NADE_MONSTER_BURN: return NADE_TYPE_MONSTER; - } - - return 0; +REGISTER_NADE(NAPALM) { + this.m_color = '2 0.5 0'; + this.m_icon = "nade_napalm"; + NADE_PROJECTILE(0, PROJECTILE_NADE_NAPALM, "TR_ROCKET"); + NADE_PROJECTILE(1, PROJECTILE_NADE_NAPALM_BURN, "spiderbot_rocket_thrust"); } -float Nade_ProjectileFromID(float proj, float burn) +REGISTER_NADE(ICE) { + this.m_color = '0 0.5 2'; + this.m_icon = "nade_ice"; + NADE_PROJECTILE(0, PROJECTILE_NADE_ICE, "TR_NEXUIZPLASMA"); + NADE_PROJECTILE(1, PROJECTILE_NADE_ICE_BURN, "wakizashi_rocket_thrust"); +} + +REGISTER_NADE(TRANSLOCATE) { + this.m_color = '1 0 1'; + this.m_icon = "nade_translocate"; + NADE_PROJECTILE(0, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA"); + NADE_PROJECTILE(1, PROJECTILE_NADE_TRANSLOCATE, "TR_CRYLINKPLASMA"); +} + +REGISTER_NADE(SPAWN) { + this.m_color = '1 0.9 0'; + this.m_icon = "nade_spawn"; + NADE_PROJECTILE(0, PROJECTILE_NADE_SPAWN, "nade_yellow"); + NADE_PROJECTILE(1, PROJECTILE_NADE_SPAWN, "nade_yellow"); +} + +REGISTER_NADE(HEAL) { + this.m_color = '1 0 0'; + this.m_icon = "nade_heal"; + NADE_PROJECTILE(0, PROJECTILE_NADE_HEAL, "nade_red"); + NADE_PROJECTILE(1, PROJECTILE_NADE_HEAL_BURN, "nade_red_burn"); +} + +REGISTER_NADE(MONSTER) { + this.m_color = '0.25 0.75 0'; + this.m_icon = "nade_monster"; + NADE_PROJECTILE(0, PROJECTILE_NADE_MONSTER, "nade_red"); + NADE_PROJECTILE(1, PROJECTILE_NADE_MONSTER_BURN, "nade_red_burn"); +} + +entity Nade_FromProjectile(float proj) { - switch(proj) - { - case NADE_TYPE_NORMAL: return (burn) ? PROJECTILE_NADE_BURN : PROJECTILE_NADE; - case NADE_TYPE_NAPALM: return (burn) ? PROJECTILE_NADE_NAPALM_BURN : PROJECTILE_NADE_NAPALM; - case NADE_TYPE_ICE: return (burn) ? PROJECTILE_NADE_ICE_BURN : PROJECTILE_NADE_ICE; - case NADE_TYPE_TRANSLOCATE: return PROJECTILE_NADE_TRANSLOCATE; - case NADE_TYPE_SPAWN: return PROJECTILE_NADE_SPAWN; - case NADE_TYPE_HEAL: return (burn) ? PROJECTILE_NADE_HEAL_BURN : PROJECTILE_NADE_HEAL; - case NADE_TYPE_MONSTER: return (burn) ? PROJECTILE_NADE_MONSTER_BURN : PROJECTILE_NADE_MONSTER; - } - - return 0; + FOREACH(NADES, true, LAMBDA( + for (int j = 0; j < 2; j++) + { + if (it.m_projectile[j] == proj) return it; + } + )); + return NADE_TYPE_NULL; } string Nade_TrailEffect(float proj, float nade_team) { - switch(proj) - { - case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team)); - case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn"); - case PROJECTILE_NADE_NAPALM: return "TR_ROCKET"; - case PROJECTILE_NADE_NAPALM_BURN: return "spiderbot_rocket_thrust"; - case PROJECTILE_NADE_ICE: return "TR_NEXUIZPLASMA"; - case PROJECTILE_NADE_ICE_BURN: return "wakizashi_rocket_thrust"; - case PROJECTILE_NADE_TRANSLOCATE: return "TR_CRYLINKPLASMA"; - case PROJECTILE_NADE_SPAWN: return "nade_yellow"; - case PROJECTILE_NADE_HEAL: return "nade_red"; - case PROJECTILE_NADE_HEAL_BURN: return "nade_red_burn"; - case PROJECTILE_NADE_MONSTER: return "nade_red"; - case PROJECTILE_NADE_MONSTER_BURN: return "nade_red_burn"; - } - - return ""; + FOREACH(NADES, true, LAMBDA( + for (int j = 0; j < 2; j++) + { + if (it.m_projectile[j] == proj) + { + string trail = it.m_trail[j]; + if (trail) return trail; + break; + } + } + )); + switch (proj) + { + case PROJECTILE_NADE: return strcat("nade_", Static_Team_ColorName_Lower(nade_team)); + case PROJECTILE_NADE_BURN: return strcat("nade_", Static_Team_ColorName_Lower(nade_team), "_burn"); + } + return ""; } +#ifdef SVQC +float healer_send(entity to, int sf); +#endif + #ifdef CSQC // misc functions void ent_healer(); #endif // CSQC +#endif