]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/gamemodes/gamemode/keyhunt/cl_keyhunt.qc
Fix FL_WEAPON flag overlapping FL_JUMPRELEASED. This unintentional change was introdu...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / gamemodes / gamemode / keyhunt / cl_keyhunt.qc
1 #include "cl_keyhunt.qh"
2
3 #include <client/hud/panel/modicons.qh>
4
5 // Keyhunt HUD modicon section
6 vector KH_SLOTS[4];
7
8 void HUD_Mod_KH(vector pos, vector mySize)
9 {
10         mod_active = 1; // keyhunt should never hide the mod icons panel
11
12         // Read current state
13         int state = STAT(OBJECTIVE_STATUS);
14         if(!state) return;
15
16         int i, key_state;
17         int all_keys, team1_keys, team2_keys, team3_keys, team4_keys, dropped_keys, carrying_keys;
18         all_keys = team1_keys = team2_keys = team3_keys = team4_keys = dropped_keys = carrying_keys = 0;
19
20         for(i = 0; i < 4; ++i)
21         {
22                 key_state = (bitshift(state, i * -5) & 31) - 1;
23
24                 if(key_state == -1)
25                         continue;
26
27                 if(key_state == 30)
28                 {
29                         ++carrying_keys;
30                         key_state = myteam;
31                 }
32
33                 switch(key_state)
34                 {
35                         case NUM_TEAM_1: ++team1_keys; break;
36                         case NUM_TEAM_2: ++team2_keys; break;
37                         case NUM_TEAM_3: ++team3_keys; break;
38                         case NUM_TEAM_4: ++team4_keys; break;
39                         case 29: ++dropped_keys; break;
40                 }
41
42                 ++all_keys;
43         }
44
45         // Calculate slot measurements
46         vector slot_size;
47         if(all_keys == 4 && mySize.x * 0.5 < mySize.y && mySize.y * 0.5 < mySize.x)
48         {
49                 // Quadratic arrangement
50                 slot_size = vec2(mySize.x * 0.5, mySize.y * 0.5);
51                 KH_SLOTS[0] = pos;
52                 KH_SLOTS[1] = pos + eX * slot_size.x;
53                 KH_SLOTS[2] = pos + eY * slot_size.y;
54                 KH_SLOTS[3] = pos + eX * slot_size.x + eY * slot_size.y;
55         }
56         else
57         {
58                 if(mySize.x > mySize.y)
59                 {
60                         // Horizontal arrangement
61                         slot_size = vec2(mySize.x / all_keys, mySize.y);
62                         for(i = 0; i < all_keys; ++i)
63                                 KH_SLOTS[i] = pos + eX * slot_size.x * i;
64                 }
65                 else
66                 {
67                         // Vertical arrangement
68                         slot_size = vec2(mySize.x, mySize.y / all_keys);
69                         for(i = 0; i < all_keys; ++i)
70                                 KH_SLOTS[i] = pos + eY * slot_size.y * i;
71                 }
72         }
73
74         // Make icons blink in case of RUN HERE
75
76         float alpha = 1;
77         if(carrying_keys)
78         {
79                 float blink = 0.6 + sin(2 * M_PI * time) * 0.4; // Oscillate between 0.2 and 1
80                 switch(myteam)
81                 {
82                         case NUM_TEAM_1: if(team1_keys == all_keys) alpha = blink; break;
83                         case NUM_TEAM_2: if(team2_keys == all_keys) alpha = blink; break;
84                         case NUM_TEAM_3: if(team3_keys == all_keys) alpha = blink; break;
85                         case NUM_TEAM_4: if(team4_keys == all_keys) alpha = blink; break;
86                 }
87         }
88         alpha *= panel_fg_alpha;
89
90         // Draw icons
91
92         i = 0;
93
94         while(team1_keys--)
95                 if(myteam == NUM_TEAM_1 && carrying_keys)
96                 {
97                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
98                         --carrying_keys;
99                 }
100                 else
101                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_red_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
102
103         while(team2_keys--)
104                 if(myteam == NUM_TEAM_2 && carrying_keys)
105                 {
106                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
107                         --carrying_keys;
108                 }
109                 else
110                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_blue_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
111
112         while(team3_keys--)
113                 if(myteam == NUM_TEAM_3 && carrying_keys)
114                 {
115                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
116                         --carrying_keys;
117                 }
118                 else
119                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_yellow_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
120
121         while(team4_keys--)
122                 if(myteam == NUM_TEAM_4 && carrying_keys)
123                 {
124                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_carrying", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
125                         --carrying_keys;
126                 }
127                 else
128                         drawpic_aspect_skin(KH_SLOTS[i++], "kh_pink_taken", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
129
130         while(dropped_keys--)
131                 drawpic_aspect_skin(KH_SLOTS[i++], "kh_dropped", slot_size, '1 1 1', alpha, DRAWFLAG_NORMAL);
132 }