2016-12-01 17:50:48 +00:00
|
|
|
/*
|
2018-06-14 10:05:23 +00:00
|
|
|
Copyright 2016-2018 Marco "eukara" Hladik
|
|
|
|
|
|
|
|
MIT LICENSE
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
|
|
obtaining a copy of this software and associated documentation
|
|
|
|
files (the "Software"), to deal in the Software without
|
|
|
|
restriction, including without limitation the rights to use,
|
|
|
|
copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
sell copies of the Software, and to permit persons to whom the
|
|
|
|
Software is furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
|
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
|
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
2016-12-01 17:50:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#define HUD_NUMFILE "sprites/640hud7.spr" // We'll precache this
|
|
|
|
#define HUD_NUMFILE_LAYER "sprites/640hud7.spr_0.tga" // And only use the first frame for drawing (needs precache)
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
// Sigh
|
2016-12-01 17:50:48 +00:00
|
|
|
#define NUMSIZE_X 0.09375
|
|
|
|
#define NUMSIZE_Y 0.09765625
|
|
|
|
|
2017-07-01 18:31:35 +00:00
|
|
|
#define HUD_ALPHA 0.5
|
2016-12-10 14:25:16 +00:00
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
// Instead of calculating them on demand, just read the offsets here
|
2016-12-01 17:50:48 +00:00
|
|
|
float vHUDNumPos[10] = {
|
|
|
|
0,
|
|
|
|
0.09375,
|
|
|
|
0.1875,
|
|
|
|
0.28125,
|
|
|
|
0.375,
|
|
|
|
0.46875,
|
|
|
|
0.5625,
|
|
|
|
0.65625,
|
|
|
|
0.75,
|
2018-12-23 08:11:02 +00:00
|
|
|
0.84375
|
2016-12-01 17:50:48 +00:00
|
|
|
};
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
// Ditto
|
2017-10-27 00:43:38 +00:00
|
|
|
vector vHUDCalPos[15] = {
|
2018-12-23 08:11:02 +00:00
|
|
|
[0, 0],
|
|
|
|
[0.09375, 0.28125], // 50AE
|
|
|
|
[0.28125, 0.28125], // 762MM
|
|
|
|
[0, 0.375], // 556MM
|
|
|
|
[0, 0.375], // 556MM
|
|
|
|
[0.09375, 0.375], // 338MAG
|
|
|
|
[0.1875, 0.28125], // 9MM
|
|
|
|
[0, 0.28125], // BUCKSHOT
|
|
|
|
[0.375, 0.28125], // 45ACP
|
|
|
|
[0.46875, 0.28125], // 357SIG
|
|
|
|
[0.46875, 0.375], // 57MM
|
|
|
|
[0.375, 0.375], // C4
|
|
|
|
[0.5625, 0.375], // SMOKE
|
|
|
|
[0.28125, 0.375], // HE
|
|
|
|
[0.1875, 0.375] // FLASH
|
2016-12-01 17:50:48 +00:00
|
|
|
};
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawRedNumber
|
|
|
|
|
|
|
|
Draws a normal number
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) {
|
|
|
|
drawsubpic(vPos, [24,25], HUD_NUMFILE_LAYER, [vHUDNumPos[iNumber], 0], [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawNums
|
|
|
|
|
|
|
|
Draws numerals quickly for health, armor etc.
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) {
|
2016-12-01 17:50:48 +00:00
|
|
|
int iNumber = fNumber;
|
2018-12-23 08:11:02 +00:00
|
|
|
if (iNumber > 0) {
|
|
|
|
while (iNumber > 0) {
|
|
|
|
HUD_DrawNumber((float)iNumber % 10, vPos, fAlpha, vColor);
|
2016-12-01 17:50:48 +00:00
|
|
|
iNumber = iNumber / 10;
|
2018-12-23 08:11:02 +00:00
|
|
|
vPos[0] -= 24;
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNumber(0, vPos, fAlpha, vColor);
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawHealth
|
|
|
|
|
|
|
|
Draw the current amount of health
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawHealth(void) {
|
2016-12-17 12:55:18 +00:00
|
|
|
static float fOldHealth;
|
|
|
|
static float fHealthAlpha;
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_HEALTH) != fOldHealth) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fHealthAlpha = 1.0;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fHealthAlpha >= HUD_ALPHA) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fHealthAlpha -= frametime * 0.5;
|
|
|
|
} else {
|
|
|
|
fHealthAlpha = HUD_ALPHA;
|
|
|
|
}
|
2016-12-01 17:50:48 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
vector vHealthPos = vVideoMins + [16, vVideoResolution[1] - 42];
|
|
|
|
if (getstatf(STAT_HEALTH) > 25) {
|
|
|
|
drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE);
|
|
|
|
HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, vHUDColor);
|
2017-11-20 17:16:42 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE);
|
|
|
|
HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, [1,0,0]);
|
2017-11-20 17:16:42 +00:00
|
|
|
}
|
2018-12-23 08:11:02 +00:00
|
|
|
fOldHealth = getstatf(STAT_HEALTH);
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawArmor
|
|
|
|
|
|
|
|
Draw the current amount of Kevlar
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawArmor(void) {
|
2016-12-17 12:55:18 +00:00
|
|
|
static float fOldArmor;
|
|
|
|
static float fArmorAlpha;
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_ARMOR) != fOldArmor) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fArmorAlpha = 1.0;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fArmorAlpha >= HUD_ALPHA) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fArmorAlpha -= frametime * 0.5;
|
|
|
|
} else {
|
|
|
|
fArmorAlpha = HUD_ALPHA;
|
|
|
|
}
|
2016-12-11 10:10:03 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
vector vArmorPos = vVideoMins + [128, vVideoResolution[1] - 42];
|
2019-01-05 02:18:23 +00:00
|
|
|
|
|
|
|
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_HELMET) {
|
|
|
|
drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, 0.4862745098], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
} else {
|
|
|
|
drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNums(getstatf(STAT_ARMOR), vArmorPos + [72,0], fArmorAlpha, vHUDColor);
|
|
|
|
fOldArmor = getstatf(STAT_ARMOR);
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawIcons
|
2016-12-01 17:50:48 +00:00
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
Draw icons such as hostage, bomb and buyzones
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawIcons(void) {
|
2019-01-05 19:28:31 +00:00
|
|
|
vector iconpos;
|
|
|
|
|
|
|
|
iconpos = vVideoMins + [16, (vVideoResolution[1] / 2) - 24];
|
|
|
|
|
|
|
|
// Defusal Kit Icon (64, 148)
|
|
|
|
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_DEFUSALKIT) {
|
2019-01-05 19:31:10 +00:00
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
2019-01-05 19:28:31 +00:00
|
|
|
iconpos[1] += 32;
|
|
|
|
}
|
|
|
|
|
2016-12-01 17:50:48 +00:00
|
|
|
// BuyZone Icon
|
2019-01-05 19:28:31 +00:00
|
|
|
if (getstatf(STAT_BUYZONE) == TRUE) {
|
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 3, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
|
|
|
iconpos[1] += 32;
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
2017-11-16 22:53:02 +00:00
|
|
|
|
2016-12-01 17:50:48 +00:00
|
|
|
// Hostage-Rescue Area Icon
|
2019-01-05 19:28:31 +00:00
|
|
|
if (getstatf(STAT_HOSTAGEZONE) == TRUE) {
|
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 2, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
|
|
|
iconpos[1] += 32;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Escape Zone Icon (128, 148)
|
|
|
|
if (getstatf(STAT_ESCAPEZONE) == TRUE) {
|
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.5, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
|
|
|
iconpos[1] += 32;
|
|
|
|
}
|
|
|
|
|
|
|
|
// VIP Zone Icon (160, 148)
|
|
|
|
if (getstatf(STAT_VIPZONE) == TRUE) {
|
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.625, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
|
|
|
iconpos[1] += 32;
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
2017-11-16 22:53:02 +00:00
|
|
|
|
2016-12-01 17:50:48 +00:00
|
|
|
// Bomb-Area
|
2019-01-05 20:35:38 +00:00
|
|
|
if (getstatf(STAT_SLOT_C4BOMB) == WEAPON_C4BOMB) {
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_BOMBZONE) == TRUE) {
|
|
|
|
float fAlpha = fabs(sin(time * 20));
|
2019-01-05 19:28:31 +00:00
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1 - fAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-07 23:09:50 +00:00
|
|
|
} else {
|
2019-01-05 19:28:31 +00:00
|
|
|
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
|
2016-12-07 23:09:50 +00:00
|
|
|
}
|
2019-01-05 19:28:31 +00:00
|
|
|
iconpos[1] += 32;
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawTimer
|
|
|
|
|
|
|
|
Draws the roundtime at the bottom of the screen (always visible)
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawTimer(void) {
|
2016-12-17 12:55:18 +00:00
|
|
|
static int iOldUnits;
|
|
|
|
static float fTimerAlpha;
|
2016-12-01 17:50:48 +00:00
|
|
|
int iMinutes, iSeconds, iTens, iUnits;
|
2018-12-23 08:11:02 +00:00
|
|
|
vector vTimePos = vVideoMins+[(vVideoResolution[0] / 2) - 62, vVideoResolution[1] - 42];
|
2017-11-16 22:53:02 +00:00
|
|
|
|
2018-12-30 05:37:53 +00:00
|
|
|
if (getstatf(STAT_GAMETIME) == -1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
iMinutes = getstatf(STAT_GAMETIME) / 60;
|
|
|
|
iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes;
|
2017-11-20 02:03:30 +00:00
|
|
|
iTens = iSeconds / 10;
|
|
|
|
iUnits = iSeconds - 10 * iTens;
|
2016-12-02 18:45:59 +00:00
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
// Flashing red numbers
|
2018-12-23 08:11:02 +00:00
|
|
|
if ((iMinutes == 0) && (iTens <= 1)) {
|
2016-12-04 14:56:41 +00:00
|
|
|
float fAlpha;
|
|
|
|
|
|
|
|
// 0:00 is fully red
|
2018-12-23 08:11:02 +00:00
|
|
|
if ((iTens == 0) && (iUnits == 0)) {
|
2016-12-04 14:56:41 +00:00
|
|
|
fAlpha = 1;
|
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
fAlpha = fabs(sin(time * 20));
|
2016-12-04 14:56:41 +00:00
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fAlpha, [1,0,0]);
|
|
|
|
HUD_DrawNumber(iTens, vTimePos + [75,0], fAlpha, [1,0,0]);
|
|
|
|
HUD_DrawNumber(iUnits, vTimePos + [99,0],fAlpha, [1,0,0]);
|
|
|
|
HUD_DrawNumber(iMinutes, vTimePos + [48,0], 1 - fAlpha, vHUDColor);
|
|
|
|
HUD_DrawNumber(iTens, vTimePos + [75,0], 1 - fAlpha, vHUDColor);
|
|
|
|
HUD_DrawNumber(iUnits, vTimePos + [99,0],1 - fAlpha, vHUDColor);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
|
|
|
// : symbol
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-02 18:45:59 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-02 18:45:59 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
if (iUnits != iOldUnits) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fTimerAlpha = 1.0;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fTimerAlpha >= HUD_ALPHA) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fTimerAlpha -= frametime * 0.5;
|
|
|
|
} else {
|
|
|
|
fTimerAlpha = HUD_ALPHA;
|
|
|
|
}
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fTimerAlpha, vHUDColor);
|
|
|
|
HUD_DrawNumber(iTens, vTimePos + [75,0], fTimerAlpha, vHUDColor);
|
|
|
|
HUD_DrawNumber(iUnits, vTimePos + [99,0], fTimerAlpha, vHUDColor);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
|
2016-12-10 14:25:16 +00:00
|
|
|
iOldUnits = iUnits;
|
2016-12-02 18:45:59 +00:00
|
|
|
}
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawMoney
|
|
|
|
|
|
|
|
Draws the amount of money (0-16000) with an icon to the screen
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawMoney(void) {
|
2016-12-17 12:55:18 +00:00
|
|
|
static float fOldMoneyValue;
|
|
|
|
static float fMoneyAlphaEffect;
|
|
|
|
static vector vMoneyColorEffect;
|
|
|
|
static float fMoneyDifference;
|
|
|
|
|
2016-12-09 23:03:13 +00:00
|
|
|
// If the money differs from last frame, paint it appropriately
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_MONEY) > fOldMoneyValue) {
|
2016-12-13 22:09:49 +00:00
|
|
|
// Effect already in progress from something else, go add on top of it!
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fMoneyAlphaEffect > 0) {
|
|
|
|
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
|
2016-12-13 22:09:49 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
|
2016-12-13 22:09:49 +00:00
|
|
|
}
|
2016-12-09 23:03:13 +00:00
|
|
|
// Make it green for a short time
|
2018-12-23 08:11:02 +00:00
|
|
|
vMoneyColorEffect = [0,1,0];
|
2016-12-09 23:03:13 +00:00
|
|
|
fMoneyAlphaEffect = 1.0;
|
2018-12-23 08:11:02 +00:00
|
|
|
} else if (getstatf(STAT_MONEY) < fOldMoneyValue) {
|
2016-12-13 22:09:49 +00:00
|
|
|
// Same one as above
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fMoneyAlphaEffect > 0) {
|
|
|
|
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
|
2016-12-13 22:09:49 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
|
2016-12-13 22:09:49 +00:00
|
|
|
}
|
2016-12-09 23:03:13 +00:00
|
|
|
// Make it red
|
2018-12-23 08:11:02 +00:00
|
|
|
vMoneyColorEffect = [1,0,0];
|
2016-12-09 23:03:13 +00:00
|
|
|
fMoneyAlphaEffect = 1.0;
|
2018-12-23 08:11:02 +00:00
|
|
|
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
|
2016-12-09 23:03:13 +00:00
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
vector vMoneyPos = vVideoMins+[vVideoResolution[0] - 160, vVideoResolution[1] - 72];
|
2016-12-09 23:03:13 +00:00
|
|
|
|
2016-12-11 10:10:03 +00:00
|
|
|
// If the alpha/color effect is active, draw the money twice in their varying alphas/colors
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fMoneyAlphaEffect > 0) {
|
2016-12-09 23:03:13 +00:00
|
|
|
fMoneyAlphaEffect -= frametime * 0.5;
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
|
|
|
|
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), DRAWFLAG_ADDITIVE);
|
2016-12-09 23:03:13 +00:00
|
|
|
|
2016-12-11 10:10:03 +00:00
|
|
|
// Draw the +/- symbols depending on whether or not we made or lost money
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fMoneyDifference < 0) {
|
|
|
|
drawsubpic(vMoneyPos + [0,-32], [18,23], HUD_NUMFILE_LAYER, [0.8671875, 0.09765625], [0.0703125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
|
2016-12-11 10:10:03 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vMoneyPos + [0,-32], [13,23], HUD_NUMFILE_LAYER, [0.8203125, 0.09765625], [0.05078125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
|
2016-12-11 10:10:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Shift the numbers for reverse drawing
|
2018-12-23 08:11:02 +00:00
|
|
|
vMoneyPos[0] += (24 * 5);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
|
|
|
// Draw the regular numbers at their normal positions
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect);
|
|
|
|
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), vHUDColor);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
|
|
|
// Draw above how much money we've gotten from all this
|
2018-12-23 08:11:02 +00:00
|
|
|
HUD_DrawNums(fabs(fMoneyDifference), vMoneyPos + [0,-32], fMoneyAlphaEffect, vMoneyColorEffect);
|
2016-12-09 23:03:13 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE);
|
|
|
|
vMoneyPos[0] += (24 * 5);
|
|
|
|
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA, vHUDColor);
|
2016-12-09 23:03:13 +00:00
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
fOldMoneyValue = getstatf(STAT_MONEY);
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawAmmo
|
|
|
|
|
|
|
|
Draws the current clip, the amount of ammo for the caliber and a matching caliber icon
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawAmmo(void) {
|
2016-12-17 12:55:18 +00:00
|
|
|
static float fOldMag, fOldCal;
|
|
|
|
static float fAmmoAlpha;
|
2017-10-27 00:43:38 +00:00
|
|
|
static vector vAmmoMagPos;
|
|
|
|
static vector vAmmoCalPos;
|
|
|
|
|
2018-12-30 05:37:53 +00:00
|
|
|
if (getstatf(STAT_ACTIVEWEAPON) == 0) {
|
|
|
|
return;
|
|
|
|
}
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) {
|
2016-12-07 01:07:04 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_CURRENT_MAG) != fOldMag || getstatf(STAT_CURRENT_CALIBER) != fOldCal) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fAmmoAlpha = 1.0;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (fAmmoAlpha >= HUD_ALPHA) {
|
2016-12-10 14:25:16 +00:00
|
|
|
fAmmoAlpha -= frametime * 0.5;
|
|
|
|
} else {
|
|
|
|
fAmmoAlpha = HUD_ALPHA;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber < 11) {
|
|
|
|
vAmmoMagPos = vVideoMins+[vVideoResolution[0] - 142, vVideoResolution[1] - 42];
|
|
|
|
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
|
2017-10-27 00:43:38 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vVideoMins+[vVideoResolution[0] - 118, vVideoResolution[1] - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.09765625], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE);
|
2017-10-27 00:43:38 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
vAmmoCalPos = vVideoMins+[vVideoResolution[0] - 64, vVideoResolution[1] - 42];
|
|
|
|
HUD_DrawNums(getstatf(STAT_CURRENT_CALIBER), vAmmoCalPos, fAmmoAlpha, vHUDColor);
|
2017-10-27 00:43:38 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
vAmmoMagPos = vVideoMins+[vVideoResolution[0] - 64, vVideoResolution[1] - 42];
|
|
|
|
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
|
2017-10-27 00:43:38 +00:00
|
|
|
}
|
2016-12-01 17:50:48 +00:00
|
|
|
|
|
|
|
// Caliber icon
|
2018-12-23 08:11:02 +00:00
|
|
|
drawsubpic(vVideoMins+vVideoResolution - [42,42], [24,24], HUD_NUMFILE_LAYER, vHUDCalPos[wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE);
|
|
|
|
fOldMag = getstatf(STAT_CURRENT_MAG);
|
|
|
|
fOldCal = getstatf(STAT_CURRENT_CALIBER);
|
2016-12-01 17:50:48 +00:00
|
|
|
}
|
2016-12-04 14:04:30 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawProgressBar(void) {
|
|
|
|
vector vSize = [540,16];
|
2016-12-11 10:10:03 +00:00
|
|
|
vector vMainPos;
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_PROGRESS) > 0) {
|
2017-11-16 22:53:02 +00:00
|
|
|
vMainPos = vVideoMins;
|
2018-12-23 08:11:02 +00:00
|
|
|
vMainPos[0] += (vVideoResolution[0] / 2) - (vSize[0] / 2);
|
|
|
|
vMainPos[1] += (vVideoResolution[1] / 2) - (vSize[1] / 2);
|
2016-12-11 10:10:03 +00:00
|
|
|
|
|
|
|
// Draw the background
|
|
|
|
vector vBar = vSize;
|
2018-12-23 08:11:02 +00:00
|
|
|
vBar[0] = 538 * getstatf(STAT_PROGRESS);
|
|
|
|
vBar[1] = 14;
|
|
|
|
drawfill(vMainPos + [1,1], vBar, vHUDColor, 1, DRAWFLAG_ADDITIVE);
|
2017-06-26 09:12:16 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawfill(vMainPos, [vSize[0], 1], vHUDColor, 1.0f); // Top
|
|
|
|
drawfill([vMainPos[0], vMainPos[1] + vSize[1]], [vSize[0], 1], vHUDColor, 1.0f); // Bottom
|
2017-06-26 09:12:16 +00:00
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawfill(vMainPos, [1, vSize[1]], vHUDColor, 1.0f); // Left
|
|
|
|
drawfill([vMainPos[0] + vSize[0], vMainPos[1]], [1, vSize[1] + 1], vHUDColor, 1.0f); // Right
|
2016-12-11 10:10:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawRadar(void) {
|
|
|
|
if (autocvar_cl_radar == 1) {
|
2018-12-27 22:50:36 +00:00
|
|
|
drawpic(vVideoMins, "sprites/radar640.spr_0.tga", [128,128], [1,1,1], 0.25, DRAWFLAG_ADDITIVE);
|
2018-12-23 08:11:02 +00:00
|
|
|
} else if (autocvar_cl_radar == 2) {
|
2017-11-20 17:16:42 +00:00
|
|
|
static int iLastMode = 0;
|
|
|
|
static vector vMapSize;
|
|
|
|
static float fZoom;
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (iLastMode != pSeat.iMapExpand) {
|
2017-11-20 17:16:42 +00:00
|
|
|
iLastMode = pSeat.iMapExpand;
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
if (pSeat.iMapExpand == 1) {
|
|
|
|
if (pSeat.fMapLerp < 1.0f) {
|
|
|
|
vMapSize[0] = rint(Math_Lerp(128, vVideoResolution[0] - 32, pSeat.fMapLerp));
|
|
|
|
vMapSize[1] = rint(Math_Lerp(128, vVideoResolution[1] - 32, pSeat.fMapLerp));
|
|
|
|
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (vVideoResolution[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
|
2017-11-20 17:16:42 +00:00
|
|
|
pSeat.fMapLerp += frametime * 2;
|
|
|
|
} else {
|
|
|
|
pSeat.fMapLerp = 1.0f;
|
|
|
|
fZoom = ovMap.fCameraHeight;
|
2018-12-23 08:11:02 +00:00
|
|
|
vMapSize = vVideoResolution + [-32,-32];
|
2017-11-20 17:16:42 +00:00
|
|
|
}
|
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
if (pSeat.fMapLerp > 0.0f) {
|
|
|
|
vMapSize[0] = rint(Math_Lerp(128, vVideoResolution[0] - 32, pSeat.fMapLerp));
|
|
|
|
vMapSize[1] = rint(Math_Lerp(128, vVideoResolution[1] - 32, pSeat.fMapLerp));
|
|
|
|
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (vVideoResolution[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
|
2017-11-20 17:16:42 +00:00
|
|
|
pSeat.fMapLerp -= frametime * 2;
|
|
|
|
} else {
|
|
|
|
pSeat.fMapLerp = 0.0f;
|
2018-12-23 08:11:02 +00:00
|
|
|
fZoom = (ovMap.fCameraHeight * (128 / (vVideoResolution[1] - 32)));
|
|
|
|
vMapSize = [128,128];
|
2017-11-20 17:16:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
clearscene();
|
2018-12-23 08:11:02 +00:00
|
|
|
drawfill(vVideoMins + [15,15], vMapSize + [2,2], vHUDColor, 1.0f, DRAWFLAG_ADDITIVE);
|
|
|
|
drawfill(vVideoMins + [16,16], vMapSize, [0,0,0], 1.0f, 0);
|
|
|
|
setproperty(VF_MIN, vVideoMins + [16,16]);
|
|
|
|
setproperty(VF_SIZE, vMapSize);
|
2017-11-20 17:16:42 +00:00
|
|
|
|
|
|
|
Overview_DrawLayer();
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
makevectors(view_angles);
|
|
|
|
setproperty(VF_ORIGIN, [pSeat->vPlayerOrigin[0], pSeat->vPlayerOrigin[1], fZoom] );
|
|
|
|
setproperty(VF_ANGLES, [Math_Lerp(90, 60, pSeat.fMapLerp), view_angles[1], 0]);
|
|
|
|
setproperty(VF_DRAWWORLD, 0);
|
2017-11-20 17:16:42 +00:00
|
|
|
renderscene();
|
|
|
|
}
|
2016-12-17 12:55:18 +00:00
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawFlash(void) {
|
|
|
|
if (pSeat->fFlashTime > 0.0f) {
|
2017-11-16 22:53:02 +00:00
|
|
|
pSeat->fFlashTime -= frametime;
|
2017-07-02 20:49:22 +00:00
|
|
|
} else {
|
2018-12-23 08:11:02 +00:00
|
|
|
if (pSeat->fFlashAlpha > 0.0f) {
|
|
|
|
pSeat->fFlashAlpha -= (frametime * 0.5);
|
2017-07-02 20:49:22 +00:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-23 08:11:02 +00:00
|
|
|
drawfill(vVideoMins, vVideoResolution, [1,1,1], pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/);
|
2017-07-02 20:49:22 +00:00
|
|
|
}
|
|
|
|
|
2016-12-04 14:04:30 +00:00
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_Draw
|
|
|
|
|
|
|
|
Called every frame in Draw.c
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_Draw(void) {
|
|
|
|
vHUDColor = autocvar_con_color * (1 / 255);
|
2016-12-04 14:04:30 +00:00
|
|
|
|
2017-07-01 00:39:15 +00:00
|
|
|
// I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte
|
2018-12-23 08:11:02 +00:00
|
|
|
if (getstatf(STAT_VIEWZOOM) < 1.0f) {
|
2019-01-03 01:23:21 +00:00
|
|
|
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_SG552 || getstatf(STAT_ACTIVEWEAPON) == WEAPON_AUG) {
|
|
|
|
HUD_DrawSimpleCrosshair();
|
|
|
|
} else {
|
|
|
|
HUD_DrawScope();
|
|
|
|
}
|
2017-07-01 00:39:15 +00:00
|
|
|
} else {
|
|
|
|
HUD_DrawCrosshair();
|
|
|
|
}
|
2018-12-09 04:56:34 +00:00
|
|
|
|
2017-07-02 20:49:22 +00:00
|
|
|
HUD_DrawFlash();
|
2018-12-09 04:56:34 +00:00
|
|
|
Damage_Draw();
|
2016-12-04 14:04:30 +00:00
|
|
|
HUD_DrawTimer();
|
|
|
|
HUD_DrawHealth();
|
|
|
|
HUD_DrawArmor();
|
|
|
|
HUD_DrawIcons();
|
|
|
|
HUD_DrawMoney();
|
|
|
|
HUD_DrawAmmo();
|
2017-11-20 17:16:42 +00:00
|
|
|
HUD_DrawRadar();
|
2016-12-11 10:10:03 +00:00
|
|
|
HUD_DrawProgressBar();
|
2016-12-11 13:17:00 +00:00
|
|
|
HUD_DrawWeaponSelect();
|
2016-12-04 14:04:30 +00:00
|
|
|
}
|
2017-11-18 21:21:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
HUD_DrawVoice
|
|
|
|
|
|
|
|
Draws a little notification for anyone using voice chat
|
|
|
|
=================
|
|
|
|
*/
|
2018-12-23 08:11:02 +00:00
|
|
|
void HUD_DrawVoice(void) {
|
|
|
|
vector vVoicePos = vVideoMins + [vVideoResolution[0] - 160, vVideoResolution[1] - 136];
|
|
|
|
|
|
|
|
for (int i = -1; i > -32; i--) {
|
|
|
|
if (getplayerkeyfloat(i, INFOKEY_P_VOIPSPEAKING) == 1) {
|
|
|
|
drawfill(vVoicePos, [144,24], VGUI_WINDOW_BGCOLOR, VGUI_WINDOW_BGALPHA);
|
|
|
|
drawfill(vVoicePos, [144, 1], vVGUIColor, VGUI_WINDOW_FGALPHA);
|
|
|
|
drawfill([vVoicePos[0], vVoicePos[1] + 23], [144, 1], vVGUIColor, VGUI_WINDOW_FGALPHA);
|
|
|
|
drawfill(vVoicePos, [1, 24], vVGUIColor, VGUI_WINDOW_FGALPHA);
|
|
|
|
drawfill([vVoicePos[0] + 143, vVoicePos[1]], [1, 24], vVGUIColor, VGUI_WINDOW_FGALPHA);
|
|
|
|
|
|
|
|
CSQC_DrawText([vVoicePos[0] + 28, vVoicePos[1] + 8], getplayerkeyvalue(i, "name"), [12,12], vVGUIColor, VGUI_WINDOW_FGALPHA, DRAWFLAG_NORMAL, FONT_CON);
|
|
|
|
|
|
|
|
drawpic(vVoicePos + [2,0], "gfx/vgui/icntlk_sv.tga", [24,24], vVGUIColor, 1, DRAWFLAG_NORMAL);
|
|
|
|
vVoicePos[1] -= 32;
|
2017-11-18 21:21:39 +00:00
|
|
|
}
|
|
|
|
}
|
2017-12-28 13:31:31 +00:00
|
|
|
}
|