static void DrawHUDNumber(int *x, int y, int val, byte *tinttab, void (*hudnumfunc)(int, int, patch_t *, byte *)) { int oldval = ABS(val); patch_t *patch; if (val < 0) { val = -val; hudnumfunc(*x, y + 5, minuspatch, tinttab); *x += SHORT(minuspatch->width); if (val == 1 || (val >= 10 && val <= 19) || (val >= 100 && val <= 199)) (*x)--; } if (val > 99) { patch = tallnum[val / 100]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); } val %= 100; if (val > 9 || oldval > 99) { patch = tallnum[val / 10]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); } val %= 10; patch = tallnum[val]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); }
static void DrawHUDNumber(int *x, int y, int val, byte *tinttab, void (*hudnumfunc)(int, int, patch_t *, byte *)) { int oldval = val; patch_t *patch; if (val > 99) { patch = tallnum[val / 100]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); } val %= 100; if (val > 9 || oldval > 99) { patch = tallnum[val / 10]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); } val %= 10; patch = tallnum[val]; hudnumfunc(*x, y, patch, tinttab); *x += SHORT(patch->width); }
static void HU_DrawHUD(void) { const int health = MAX(0, plr->health); const weapontype_t pendingweapon = plr->pendingweapon; const weapontype_t readyweapon = plr->readyweapon; int ammotype = weaponinfo[readyweapon].ammo; int ammo = plr->ammo[ammotype]; const int armor = plr->armorpoints; int health_x = HUD_HEALTH_X; int keys = 0; int i = 0; byte *tinttab; const int invulnerability = plr->powers[pw_invulnerability]; static dboolean healthanim; patch_t *patch; const dboolean gamepaused = (menuactive || paused || consoleactive); const int currenttime = I_GetTimeMS(); tinttab = (!health || (health <= HUD_HEALTH_MIN && healthanim) || health > HUD_HEALTH_MIN ? tinttab66 : tinttab25); patch = (((readyweapon == wp_fist && pendingweapon == wp_nochange) || pendingweapon == wp_fist) && plr->powers[pw_strength] ? berserkpatch : healthpatch); if (patch) { if ((plr->cheats & CF_GODMODE) || invulnerability > STARTFLASHING || (invulnerability & 8)) godhudfunc(health_x, HUD_HEALTH_Y - (SHORT(patch->height) - 17), patch, tinttab); else hudfunc(health_x, HUD_HEALTH_Y - (SHORT(patch->height) - 17), patch, tinttab); health_x += SHORT(patch->width) + 8; } if (healthhighlight > currenttime) { DrawHUDNumber(&health_x, HUD_HEALTH_Y + hudnumoffset, MAX((minuspatch ? health_min : 0), plr->health), tinttab, V_DrawHighlightedHUDNumberPatch); if (!emptytallpercent) V_DrawHighlightedHUDNumberPatch(health_x, HUD_HEALTH_Y + hudnumoffset, tallpercent, tinttab); } else { DrawHUDNumber(&health_x, HUD_HEALTH_Y + hudnumoffset, MAX((minuspatch ? health_min : 0), plr->health), tinttab, hudnumfunc); if (!emptytallpercent) hudnumfunc(health_x, HUD_HEALTH_Y + hudnumoffset, tallpercent, tinttab); } if (!gamepaused) { static int healthwait; if (health <= HUD_HEALTH_MIN) { if (healthwait < currenttime) { healthanim = !healthanim; healthwait = currenttime + HUD_HEALTH_WAIT * health / HUD_HEALTH_MIN + 115; } } else { healthanim = false; healthwait = 0; } } if (pendingweapon != wp_nochange) { ammotype = weaponinfo[pendingweapon].ammo; ammo = plr->ammo[ammotype]; } if (health && ammo && ammotype != am_noammo) { int ammo_x = HUD_AMMO_X + ammopic[ammotype].x; static dboolean ammoanim; tinttab = ((ammo <= HUD_AMMO_MIN && ammoanim) || ammo > HUD_AMMO_MIN ? tinttab66 : tinttab25); if ((patch = ammopic[ammotype].patch)) { hudfunc(ammo_x, HUD_AMMO_Y + ammopic[ammotype].y, patch, tinttab); ammo_x += SHORT(patch->width) + 8; } if (ammohighlight > currenttime) DrawHUDNumber(&ammo_x, HUD_AMMO_Y + hudnumoffset, ammo, tinttab, V_DrawHighlightedHUDNumberPatch); else DrawHUDNumber(&ammo_x, HUD_AMMO_Y + hudnumoffset, ammo, tinttab, hudnumfunc); if (!gamepaused) { static int ammowait; if (ammo <= HUD_AMMO_MIN) { if (ammowait < currenttime) { ammoanim = !ammoanim; ammowait = currenttime + HUD_AMMO_WAIT * ammo / HUD_AMMO_MIN + 115; } } else { ammoanim = false; ammowait = 0; } } } while (i < NUMCARDS) if (plr->cards[i++] > 0) keys++; if (keys || plr->neededcardflash) { int keypic_x = HUD_KEYS_X - 20 * (keys - 1); static int keywait; static dboolean showkey; if (!armor) keypic_x += 114; else { if (emptytallpercent) keypic_x += tallpercentwidth; if (armor < 10) keypic_x += 26; else if (armor < 100) keypic_x += 12; } if (plr->neededcardflash) { if ((patch = keypic[plr->neededcard].patch)) { if (!gamepaused && keywait < currenttime) { showkey = !showkey; keywait = currenttime + HUD_KEY_WAIT; plr->neededcardflash--; } if (showkey) hudfunc(keypic_x - SHORT(patch->width) - 6, HUD_KEYS_Y, patch, tinttab66); } } else { showkey = false; keywait = 0; } for (i = 0; i < NUMCARDS; i++) if (plr->cards[i] > 0 && (patch = keypic[i].patch)) hudfunc(keypic_x + (SHORT(patch->width) + 6) * (cardsfound - plr->cards[i]), HUD_KEYS_Y, patch, tinttab66); } if (armor) { int armor_x = HUD_ARMOR_X; if ((patch = (plr->armortype == GREENARMOR ? greenarmorpatch : bluearmorpatch))) { armor_x -= SHORT(patch->width); hudfunc(armor_x, HUD_ARMOR_Y - (SHORT(patch->height) - 16), patch, tinttab66); armor_x -= 7; } if (armorhighlight > currenttime) { if (emptytallpercent) { armor_x -= HUDNumberWidth(armor); DrawHUDNumber(&armor_x, HUD_ARMOR_Y + hudnumoffset, armor, tinttab66, V_DrawHighlightedHUDNumberPatch); } else { armor_x -= tallpercentwidth; V_DrawHighlightedHUDNumberPatch(armor_x, HUD_ARMOR_Y + hudnumoffset, tallpercent, tinttab66); armor_x -= HUDNumberWidth(armor); DrawHUDNumber(&armor_x, HUD_ARMOR_Y + hudnumoffset, armor, tinttab66, V_DrawHighlightedHUDNumberPatch); } } else if (emptytallpercent) { armor_x -= HUDNumberWidth(armor); DrawHUDNumber(&armor_x, HUD_ARMOR_Y + hudnumoffset, armor, tinttab66, hudnumfunc); } else { armor_x -= tallpercentwidth; hudnumfunc(armor_x, HUD_ARMOR_Y + hudnumoffset, tallpercent, tinttab66); armor_x -= HUDNumberWidth(armor); DrawHUDNumber(&armor_x, HUD_ARMOR_Y + hudnumoffset, armor, tinttab66, hudnumfunc); } } }