]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/buffs.qh
Merge branch 'maint' of https://gitlab.com/xonotic/xonotic-data.pk3dir into maint
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / buffs.qh
1 #ifndef BUFFS_H
2 #define BUFFS_H
3 // Welcome to the stuff behind the scenes
4 // Below, you will find the list of buffs
5 // Add new buffs here!
6 // Note: Buffs also need spawnfuncs, which are set below
7
8 #include "teams.qh"
9 #include "util.qh"
10
11 entity Buff_Type_first;
12 entity Buff_Type_last;
13 .entity enemy; // internal next pointer
14
15 int BUFF_LAST = 1;
16 int BUFF_ALL;
17
18 .int items; // buff ID
19 .string netname; // buff name
20 .string message; // human readable name
21 .vector colormod; // buff color
22 .string model2; // buff sprite
23 .int skin; // buff skin
24 .float buff_time;
25
26 // hacky function to return the cvar value only to server - TODO: do this properly!
27 float sv_cvar(string cvarname)
28 {
29 #ifdef SVQC
30         return cvar(cvarname);
31 #else
32         return 0;
33 #endif
34 }
35
36 #define REGISTER_BUFF(hname,sname,NAME,bskin,bcolor) \
37         int BUFF_##NAME; \
38         entity Buff_Type##sname; \
39         void RegisterBuffs_##sname() \
40         { \
41                 BUFF_##NAME = BUFF_LAST * 2; \
42                 BUFF_LAST = BUFF_##NAME; \
43                 BUFF_ALL |= BUFF_##NAME; \
44                 Buff_Type##sname = spawn(); \
45                 Buff_Type##sname.items = BUFF_##NAME; \
46                 Buff_Type##sname.netname = #sname; \
47                 Buff_Type##sname.message = hname; \
48                 Buff_Type##sname.skin = bskin; \
49                 Buff_Type##sname.colormod = bcolor; \
50                 Buff_Type##sname.buff_time = sv_cvar(strcat("g_buffs_", #sname, "_time")); \
51                 Buff_Type##sname.model2 = strzone(strcat("buff-", #sname)); \
52                 if(!Buff_Type_first) \
53                         Buff_Type_first = Buff_Type##sname; \
54                 if(Buff_Type_last) \
55                         Buff_Type_last.enemy = Buff_Type##sname; \
56                 Buff_Type_last = Buff_Type##sname; \
57         } \
58         ACCUMULATE_FUNCTION(RegisterBuffs, RegisterBuffs_##sname)
59
60 REGISTER_BUFF(_("Ammo"),ammo,AMMO,3,'0.76 1 0.1');
61 REGISTER_BUFF(_("Resistance"),resistance,RESISTANCE,0,'0.36 1 0.07');
62 REGISTER_BUFF(_("Speed"),speed,SPEED,9,'0.1 1 0.84');
63 REGISTER_BUFF(_("Medic"),medic,MEDIC,1,'1 0.12 0');
64 REGISTER_BUFF(_("Bash"),bash,BASH,5,'1 0.39 0');
65 REGISTER_BUFF(_("Vampire"),vampire,VAMPIRE,2,'1 0 0.24');
66 REGISTER_BUFF(_("Disability"),disability,DISABILITY,7,'0.94 0.3 1');
67 REGISTER_BUFF(_("Vengeance"),vengeance,VENGEANCE,15,'1 0.23 0.61');
68 REGISTER_BUFF(_("Jump"),jump,JUMP,10,'0.24 0.78 1');
69 REGISTER_BUFF(_("Flight"),flight,FLIGHT,11,'0.33 0.56 1');
70 REGISTER_BUFF(_("Invisible"),invisible,INVISIBLE,12,'0.5 0.5 1');
71 REGISTER_BUFF(_("Inferno"),inferno,INFERNO,16,'1 0.62 0');
72 REGISTER_BUFF(_("Swapper"),swapper,SWAPPER,17,'0.63 0.36 1');
73 REGISTER_BUFF(_("Magnet"),magnet,MAGNET,18,'1 0.95 0.18');
74 #undef REGISTER_BUFF
75
76 #ifdef SVQC
77 .int buffs;
78 void buff_Init(entity ent);
79 void buff_Init_Compat(entity ent, int replacement);
80
81 #define BUFF_SPAWNFUNC(e,b,t) void spawnfunc_item_buff_##e() { self.buffs = b; self.team = t; buff_Init(self); }
82 #define BUFF_SPAWNFUNC_Q3TA_COMPAT(o,r) void spawnfunc_item_##o() { buff_Init_Compat(self,r); }
83 #define BUFF_SPAWNFUNCS(e,b)                         \
84         BUFF_SPAWNFUNC(e,           b,  0)           \
85         BUFF_SPAWNFUNC(e##_team1,   b,  NUM_TEAM_1) \
86         BUFF_SPAWNFUNC(e##_team2,   b,  NUM_TEAM_2) \
87         BUFF_SPAWNFUNC(e##_team3,   b,  NUM_TEAM_3) \
88         BUFF_SPAWNFUNC(e##_team4,   b,  NUM_TEAM_4)
89
90 BUFF_SPAWNFUNCS(resistance,             BUFF_RESISTANCE)
91 BUFF_SPAWNFUNCS(ammo,                   BUFF_AMMO)
92 BUFF_SPAWNFUNCS(speed,                  BUFF_SPEED)
93 BUFF_SPAWNFUNCS(medic,                  BUFF_MEDIC)
94 BUFF_SPAWNFUNCS(bash,                   BUFF_BASH)
95 BUFF_SPAWNFUNCS(vampire,                BUFF_VAMPIRE)
96 BUFF_SPAWNFUNCS(disability,             BUFF_DISABILITY)
97 BUFF_SPAWNFUNCS(vengeance,              BUFF_VENGEANCE)
98 BUFF_SPAWNFUNCS(jump,                   BUFF_JUMP)
99 BUFF_SPAWNFUNCS(flight,                 BUFF_FLIGHT)
100 BUFF_SPAWNFUNCS(invisible,              BUFF_INVISIBLE)
101 BUFF_SPAWNFUNCS(inferno,                BUFF_INFERNO)
102 BUFF_SPAWNFUNCS(swapper,                BUFF_SWAPPER)
103 BUFF_SPAWNFUNCS(magnet,                 BUFF_MAGNET)
104 BUFF_SPAWNFUNCS(random,                 0)
105
106 BUFF_SPAWNFUNC_Q3TA_COMPAT(doubler,    BUFF_MEDIC)
107 BUFF_SPAWNFUNC_Q3TA_COMPAT(resistance, BUFF_RESISTANCE)
108 BUFF_SPAWNFUNC_Q3TA_COMPAT(scout,      BUFF_SPEED)
109 BUFF_SPAWNFUNC_Q3TA_COMPAT(ammoregen,  BUFF_AMMO)
110
111 // actually Q3
112 BUFF_SPAWNFUNC_Q3TA_COMPAT(haste,       BUFF_SPEED)
113 BUFF_SPAWNFUNC_Q3TA_COMPAT(invis,       BUFF_INVISIBLE)
114 BUFF_SPAWNFUNC_Q3TA_COMPAT(medic,       BUFF_MEDIC)
115
116 #undef BUFF_SPAWNFUNC
117 #undef BUFF_SPAWNFUNC_Q3TA_COMPAT
118 #undef BUFF_SPAWNFUNCS
119 #endif
120
121 vector Buff_Color(int buff_id);
122 string Buff_PrettyName(int buff_id);
123 string Buff_Name(int buff_id);
124 int Buff_Type_FromName(string buff_name);
125 int Buff_Type_FromSprite(string buff_sprite);
126 int Buff_Skin(int buff_id);
127 string Buff_Sprite(int buff_id);
128 float Buff_Timer(int buff_id);
129 #endif