3 #include <client/hud/panel/modicons.qh>
5 // CTF HUD modicon section
6 int redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe, neutralflag_prevframe; // status during previous frame
7 int redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus, neutralflag_prevstatus; // last remembered status
8 float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time, neutralflag_statuschange_time; // time when the status changed
10 void HUD_Mod_CTF_Reset()
12 redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = neutralflag_prevstatus = 0;
13 redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = neutralflag_prevframe = 0;
14 redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0;
17 int autocvar__teams_available;
18 void HUD_Mod_CTF(vector pos, vector mySize)
20 vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos;
22 float f; // every function should have that
24 int redflag, blueflag, yellowflag, pinkflag, neutralflag; // current status
25 float redflag_statuschange_elapsedtime = 0, blueflag_statuschange_elapsedtime = 0, yellowflag_statuschange_elapsedtime = 0, pinkflag_statuschange_elapsedtime = 0, neutralflag_statuschange_elapsedtime = 0; // time since the status changed
26 bool ctf_oneflag; // one-flag CTF mode enabled/disabled
27 bool ctf_stalemate; // currently in stalemate
28 int stat_items = STAT(CTF_FLAGSTATUS);
29 float fs, fs2, fs3, size1, size2;
32 int nteams = autocvar__teams_available;
34 redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3;
35 blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3;
36 yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3;
37 pinkflag = (stat_items/CTF_PINK_FLAG_TAKEN) & 3;
38 neutralflag = (stat_items/CTF_NEUTRAL_FLAG_TAKEN) & 3;
40 ctf_oneflag = (stat_items & CTF_FLAG_NEUTRAL);
42 ctf_stalemate = (stat_items & CTF_STALEMATE);
44 mod_active = (redflag || blueflag || yellowflag || pinkflag || neutralflag || (stat_items & CTF_SHIELDED));
46 if (autocvar__hud_configure) {
53 ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor?
56 // when status CHANGES, set old status into prevstatus and current status into status
57 #define X(team) MACRO_BEGIN \
58 if (team##flag != team##flag_prevframe) { \
59 team##flag_statuschange_time = time; \
60 team##flag_prevstatus = team##flag_prevframe; \
61 team##flag_prevframe = team##flag; \
63 team##flag_statuschange_elapsedtime = time - team##flag_statuschange_time; \
72 #define X(team, cond) \
73 string team##_icon = string_null, team##_icon_prevstatus = string_null; \
74 int team##_alpha, team##_alpha_prevstatus; \
75 team##_alpha = team##_alpha_prevstatus = 1; \
77 switch (team##flag) { \
78 case 1: team##_icon = "flag_" #team "_taken"; break; \
79 case 2: team##_icon = "flag_" #team "_lost"; break; \
80 case 3: team##_icon = "flag_" #team "_carrying"; team##_alpha = blink(0.85, 0.15, 5); break; \
82 if ((stat_items & CTF_SHIELDED) && (cond)) { \
83 team##_icon = "flag_" #team "_shielded"; \
85 team##_icon = string_null; \
89 switch (team##flag_prevstatus) { \
90 case 1: team##_icon_prevstatus = "flag_" #team "_taken"; break; \
91 case 2: team##_icon_prevstatus = "flag_" #team "_lost"; break; \
92 case 3: team##_icon_prevstatus = "flag_" #team "_carrying"; team##_alpha_prevstatus = blink(0.85, 0.15, 5); break; \
94 if (team##flag == 3) { \
95 team##_icon_prevstatus = "flag_" #team "_carrying"; /* make it more visible */\
96 } else if((stat_items & CTF_SHIELDED) && (cond)) { \
97 team##_icon_prevstatus = "flag_" #team "_shielded"; \
99 team##_icon_prevstatus = string_null; \
104 X(red, myteam != NUM_TEAM_1 && (nteams & BIT(0)));
105 X(blue, myteam != NUM_TEAM_2 && (nteams & BIT(1)));
106 X(yellow, myteam != NUM_TEAM_3 && (nteams & BIT(2)));
107 X(pink, myteam != NUM_TEAM_4 && (nteams & BIT(3)));
108 X(neutral, ctf_oneflag);
118 // hacky, but these aren't needed
119 red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null;
121 } else switch (tcount) {
123 case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break;
124 case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break;
125 case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break;
128 if (mySize_x > mySize_y) {
144 blueflag_pos = pos + eX * fs2 * size1;
145 yellowflag_pos = pos - eX * fs2 * size1;
146 pinkflag_pos = pos + eX * fs3 * size1;
150 redflag_pos = pos + eX * fs2 * size1;
152 yellowflag_pos = pos - eX * fs2 * size1;
153 pinkflag_pos = pos + eX * fs3 * size1;
157 redflag_pos = pos + eX * fs3 * size1;
158 blueflag_pos = pos - eX * fs2 * size1;
159 yellowflag_pos = pos;
160 pinkflag_pos = pos + eX * fs2 * size1;
164 redflag_pos = pos - eX * fs2 * size1;
165 blueflag_pos = pos + eX * fs3 * size1;
166 yellowflag_pos = pos + eX * fs2 * size1;
171 neutralflag_pos = pos;
172 flag_size = e1 * fs * size1 + e2 * size2;
174 #define X(team) MACRO_BEGIN \
175 f = bound(0, team##flag_statuschange_elapsedtime * 2, 1); \
176 if (team##_icon && ctf_stalemate) \
177 drawpic_aspect_skin(team##flag_pos, "flag_stalemate", flag_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); \
178 if (team##_icon_prevstatus && f < 1) \
179 drawpic_aspect_skin_expanding(team##flag_pos, team##_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * team##_alpha_prevstatus, DRAWFLAG_NORMAL, f); \
181 drawpic_aspect_skin(team##flag_pos, team##_icon, flag_size, '1 1 1', panel_fg_alpha * team##_alpha * f, DRAWFLAG_NORMAL); \