2014-03-15 16:59:03 +00:00
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
2018-11-25 12:35:38 +00:00
// Copyright (C) 1999-2018 by Sonic Team Junior.
2014-03-15 16:59:03 +00:00
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file st_stuff.c
/// \brief Status bar code
/// Does the face/direction indicator animatin.
/// Does palette indicators as well (red pain/berserk, bright pickup)
# include "doomdef.h"
# include "g_game.h"
# include "r_local.h"
# include "p_local.h"
# include "f_finale.h"
# include "st_stuff.h"
# include "i_video.h"
# include "v_video.h"
# include "z_zone.h"
# include "hu_stuff.h"
# include "s_sound.h"
# include "i_system.h"
# include "m_menu.h"
# include "m_cheat.h"
# include "p_setup.h" // NiGHTS grading
2016-08-15 03:51:08 +00:00
# include "k_kart.h" // SRB2kart
2014-03-15 16:59:03 +00:00
//random index
# include "m_random.h"
// item finder
# include "m_cond.h"
# ifdef HWRENDER
# include "hardware/hw_main.h"
# endif
# ifdef HAVE_BLUA
# include "lua_hud.h"
# endif
UINT16 objectsdrawn = 0 ;
//
// STATUS BAR DATA
//
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
patch_t * facerankprefix [ MAXSKINS ] ; // ranking
patch_t * facewantprefix [ MAXSKINS ] ; // wanted
patch_t * facemmapprefix [ MAXSKINS ] ; // minimap
2014-03-15 16:59:03 +00:00
// ------------------------------------------
// status bar overlay
// ------------------------------------------
// icons for overlay
patch_t * sboscore ; // Score logo
patch_t * sbotime ; // Time logo
patch_t * sbocolon ; // Colon for time
2014-03-25 02:17:59 +00:00
patch_t * sboperiod ; // Period for time centiseconds
2014-03-15 16:59:03 +00:00
patch_t * livesback ; // Lives icon background
2014-03-25 02:17:59 +00:00
static patch_t * nrec_timer ; // Timer for NiGHTS records
2014-03-15 16:59:03 +00:00
static patch_t * sborings ;
static patch_t * sboover ;
static patch_t * timeover ;
static patch_t * stlivex ;
static patch_t * rrings ;
static patch_t * getall ; // Special Stage HUD
static patch_t * timeup ; // Special Stage HUD
static patch_t * hunthoming [ 6 ] ;
static patch_t * itemhoming [ 6 ] ;
static patch_t * race1 ;
static patch_t * race2 ;
static patch_t * race3 ;
static patch_t * racego ;
2018-06-05 05:34:05 +00:00
//static patch_t *ttlnum;
2014-03-15 16:59:03 +00:00
static patch_t * nightslink ;
static patch_t * count5 ;
static patch_t * count4 ;
static patch_t * count3 ;
static patch_t * count2 ;
static patch_t * count1 ;
static patch_t * count0 ;
static patch_t * curweapon ;
static patch_t * normring ;
static patch_t * bouncering ;
static patch_t * infinityring ;
static patch_t * autoring ;
static patch_t * explosionring ;
static patch_t * scatterring ;
static patch_t * grenadering ;
static patch_t * railring ;
static patch_t * jumpshield ;
static patch_t * forceshield ;
static patch_t * ringshield ;
static patch_t * watershield ;
static patch_t * bombshield ;
static patch_t * pityshield ;
static patch_t * invincibility ;
static patch_t * sneakers ;
static patch_t * gravboots ;
static patch_t * nonicon ;
static patch_t * bluestat ;
static patch_t * byelstat ;
static patch_t * orngstat ;
static patch_t * redstat ;
static patch_t * yelstat ;
static patch_t * nbracket ;
static patch_t * nhud [ 12 ] ;
static patch_t * nsshud ;
static patch_t * narrow [ 9 ] ;
static patch_t * nredar [ 8 ] ; // Red arrow
static patch_t * drillbar ;
static patch_t * drillfill [ 3 ] ;
static patch_t * capsulebar ;
static patch_t * capsulefill ;
patch_t * ngradeletters [ 7 ] ;
static patch_t * minus5sec ;
static patch_t * minicaps ;
static patch_t * gotrflag ;
static patch_t * gotbflag ;
2018-10-24 21:55:12 +00:00
// Midnight Channel:
static patch_t * hud_tv1 ;
static patch_t * hud_tv2 ;
2016-08-15 03:51:08 +00:00
// SRB2kart
2014-03-15 16:59:03 +00:00
hudinfo_t hudinfo [ NUMHUDITEMS ] =
{
{ 34 , 176 } , // HUD_LIVESNAME
{ 16 , 176 } , // HUD_LIVESPIC
{ 74 , 184 } , // HUD_LIVESNUM
{ 38 , 186 } , // HUD_LIVESX
2014-03-21 18:42:55 +00:00
2014-03-15 16:59:03 +00:00
{ 16 , 42 } , // HUD_RINGS
2014-03-21 18:42:55 +00:00
{ 220 , 10 } , // HUD_RINGSSPLIT
2014-03-15 16:59:03 +00:00
{ 112 , 42 } , // HUD_RINGSNUM
2014-03-21 18:42:55 +00:00
{ 288 , 10 } , // HUD_RINGSNUMSPLIT
2014-03-15 16:59:03 +00:00
{ 16 , 10 } , // HUD_SCORE
{ 128 , 10 } , // HUD_SCORENUM
{ 17 , 26 } , // HUD_TIME
2014-03-21 18:42:55 +00:00
{ 136 , 10 } , // HUD_TIMESPLIT
2014-03-15 16:59:03 +00:00
{ 88 , 26 } , // HUD_MINUTES
2014-03-21 18:42:55 +00:00
{ 188 , 10 } , // HUD_MINUTESSPLIT
2014-03-15 16:59:03 +00:00
{ 88 , 26 } , // HUD_TIMECOLON
2014-03-21 18:42:55 +00:00
{ 188 , 10 } , // HUD_TIMECOLONSPLIT
{ 112 , 26 } , // HUD_SECONDS
{ 212 , 10 } , // HUD_SECONDSSPLIT
2014-03-15 16:59:03 +00:00
{ 112 , 26 } , // HUD_TIMETICCOLON
2014-03-21 18:42:55 +00:00
{ 136 , 26 } , // HUD_TICS
2014-03-15 16:59:03 +00:00
{ 112 , 56 } , // HUD_SS_TOTALRINGS
2014-03-21 18:42:55 +00:00
{ 288 , 40 } , // HUD_SS_TOTALRINGS_SPLIT
2014-03-15 16:59:03 +00:00
{ 110 , 93 } , // HUD_GETRINGS
{ 160 , 93 } , // HUD_GETRINGSNUM
{ 124 , 160 } , // HUD_TIMELEFT
{ 168 , 176 } , // HUD_TIMELEFTNUM
{ 130 , 93 } , // HUD_TIMEUP
{ 152 , 168 } , // HUD_HUNTPICS
{ 152 , 24 } , // HUD_GRAVBOOTSICO
{ 240 , 160 } , // HUD_LAP
} ;
//
// STATUS BAR CODE
//
boolean ST_SameTeam ( player_t * a , player_t * b )
{
// Just pipe team messages to everyone in co-op or race.
2018-02-08 22:13:06 +00:00
if ( ! G_BattleGametype ( ) )
2014-03-15 16:59:03 +00:00
return true ;
// Spectator chat.
if ( a - > spectator & & b - > spectator )
return true ;
// Team chat.
if ( G_GametypeHasTeams ( ) )
return a - > ctfteam = = b - > ctfteam ;
if ( G_TagGametype ( ) )
return ( ( a - > pflags & PF_TAGIT ) = = ( b - > pflags & PF_TAGIT ) ) ;
return false ;
}
static boolean st_stopped = true ;
void ST_Ticker ( void )
{
if ( st_stopped )
return ;
}
// 0 is default, any others are special palettes.
static INT32 st_palette = 0 ;
void ST_doPaletteStuff ( void )
{
INT32 palette ;
2015-01-01 19:50:31 +00:00
if ( paused | | P_AutoPause ( ) )
2014-03-15 16:59:03 +00:00
palette = 0 ;
else if ( stplyr & & stplyr - > flashcount )
palette = stplyr - > flashpal ;
else
palette = 0 ;
2018-05-17 21:17:20 +00:00
# ifdef HWRENDER
if ( rendermode = = render_opengl )
palette = 0 ; // No flashpals here in OpenGL
# endif
2014-03-15 16:59:03 +00:00
palette = min ( max ( palette , 0 ) , 13 ) ;
if ( palette ! = st_palette )
{
st_palette = palette ;
if ( rendermode ! = render_none )
{
2018-07-18 00:21:36 +00:00
//V_SetPaletteLump(GetPalette()); // Reset the palette -- is this needed?
2017-12-19 01:59:04 +00:00
if ( ! splitscreen )
2014-03-15 16:59:03 +00:00
V_SetPalette ( palette ) ;
}
}
}
void ST_UnloadGraphics ( void )
{
Z_FreeTags ( PU_HUDGFX , PU_HUDGFX ) ;
}
void ST_LoadGraphics ( void )
{
int i ;
// SRB2 border patch
st_borderpatchnum = W_GetNumForName ( " GFZFLR01 " ) ;
scr_borderpatch = W_CacheLumpNum ( st_borderpatchnum , PU_HUDGFX ) ;
// the original Doom uses 'STF' as base name for all face graphics
// Graue 04-08-2004: face/name graphics are now indexed by skins
// but load them in R_AddSkins, that gets called
// first anyway
// cache the status bar overlay icons (fullscreen mode)
sborings = W_CachePatchName ( " SBORINGS " , PU_HUDGFX ) ;
sboscore = W_CachePatchName ( " SBOSCORE " , PU_HUDGFX ) ;
sboover = W_CachePatchName ( " SBOOVER " , PU_HUDGFX ) ;
timeover = W_CachePatchName ( " TIMEOVER " , PU_HUDGFX ) ;
stlivex = W_CachePatchName ( " STLIVEX " , PU_HUDGFX ) ;
livesback = W_CachePatchName ( " STLIVEBK " , PU_HUDGFX ) ;
rrings = W_CachePatchName ( " RRINGS " , PU_HUDGFX ) ;
sbotime = W_CachePatchName ( " SBOTIME " , PU_HUDGFX ) ; // Time logo
sbocolon = W_CachePatchName ( " SBOCOLON " , PU_HUDGFX ) ; // Colon for time
2014-03-25 02:17:59 +00:00
sboperiod = W_CachePatchName ( " SBOPERIO " , PU_HUDGFX ) ; // Period for time centiseconds
nrec_timer = W_CachePatchName ( " NGRTIMER " , PU_HUDGFX ) ; // Timer for NiGHTS
2014-03-15 16:59:03 +00:00
getall = W_CachePatchName ( " GETALL " , PU_HUDGFX ) ; // Special Stage HUD
timeup = W_CachePatchName ( " TIMEUP " , PU_HUDGFX ) ; // Special Stage HUD
race1 = W_CachePatchName ( " RACE1 " , PU_HUDGFX ) ;
race2 = W_CachePatchName ( " RACE2 " , PU_HUDGFX ) ;
race3 = W_CachePatchName ( " RACE3 " , PU_HUDGFX ) ;
racego = W_CachePatchName ( " RACEGO " , PU_HUDGFX ) ;
nightslink = W_CachePatchName ( " NGHTLINK " , PU_HUDGFX ) ;
count5 = W_CachePatchName ( " DRWNF0 " , PU_HUDGFX ) ;
count4 = W_CachePatchName ( " DRWNE0 " , PU_HUDGFX ) ;
count3 = W_CachePatchName ( " DRWND0 " , PU_HUDGFX ) ;
count2 = W_CachePatchName ( " DRWNC0 " , PU_HUDGFX ) ;
count1 = W_CachePatchName ( " DRWNB0 " , PU_HUDGFX ) ;
count0 = W_CachePatchName ( " DRWNA0 " , PU_HUDGFX ) ;
for ( i = 0 ; i < 6 ; + + i )
{
hunthoming [ i ] = W_CachePatchName ( va ( " HOMING%d " , i + 1 ) , PU_HUDGFX ) ;
itemhoming [ i ] = W_CachePatchName ( va ( " HOMITM%d " , i + 1 ) , PU_HUDGFX ) ;
}
curweapon = W_CachePatchName ( " CURWEAP " , PU_HUDGFX ) ;
normring = W_CachePatchName ( " RINGIND " , PU_HUDGFX ) ;
bouncering = W_CachePatchName ( " BNCEIND " , PU_HUDGFX ) ;
infinityring = W_CachePatchName ( " INFNIND " , PU_HUDGFX ) ;
autoring = W_CachePatchName ( " AUTOIND " , PU_HUDGFX ) ;
explosionring = W_CachePatchName ( " BOMBIND " , PU_HUDGFX ) ;
scatterring = W_CachePatchName ( " SCATIND " , PU_HUDGFX ) ;
grenadering = W_CachePatchName ( " GRENIND " , PU_HUDGFX ) ;
railring = W_CachePatchName ( " RAILIND " , PU_HUDGFX ) ;
jumpshield = W_CachePatchName ( " WHTVB0 " , PU_HUDGFX ) ;
forceshield = W_CachePatchName ( " BLTVB0 " , PU_HUDGFX ) ;
ringshield = W_CachePatchName ( " YLTVB0 " , PU_HUDGFX ) ;
watershield = W_CachePatchName ( " ELTVB0 " , PU_HUDGFX ) ;
bombshield = W_CachePatchName ( " BKTVB0 " , PU_HUDGFX ) ;
pityshield = W_CachePatchName ( " GRTVB0 " , PU_HUDGFX ) ;
invincibility = W_CachePatchName ( " PINVB0 " , PU_HUDGFX ) ;
sneakers = W_CachePatchName ( " SHTVB0 " , PU_HUDGFX ) ;
gravboots = W_CachePatchName ( " GBTVB0 " , PU_HUDGFX ) ;
tagico = W_CachePatchName ( " TAGICO " , PU_HUDGFX ) ;
rflagico = W_CachePatchName ( " RFLAGICO " , PU_HUDGFX ) ;
bflagico = W_CachePatchName ( " BFLAGICO " , PU_HUDGFX ) ;
rmatcico = W_CachePatchName ( " RMATCICO " , PU_HUDGFX ) ;
bmatcico = W_CachePatchName ( " BMATCICO " , PU_HUDGFX ) ;
gotrflag = W_CachePatchName ( " GOTRFLAG " , PU_HUDGFX ) ;
gotbflag = W_CachePatchName ( " GOTBFLAG " , PU_HUDGFX ) ;
nonicon = W_CachePatchName ( " NONICON " , PU_HUDGFX ) ;
// NiGHTS HUD things
bluestat = W_CachePatchName ( " BLUESTAT " , PU_HUDGFX ) ;
byelstat = W_CachePatchName ( " BYELSTAT " , PU_HUDGFX ) ;
orngstat = W_CachePatchName ( " ORNGSTAT " , PU_HUDGFX ) ;
redstat = W_CachePatchName ( " REDSTAT " , PU_HUDGFX ) ;
yelstat = W_CachePatchName ( " YELSTAT " , PU_HUDGFX ) ;
nbracket = W_CachePatchName ( " NBRACKET " , PU_HUDGFX ) ;
for ( i = 0 ; i < 12 ; + + i )
nhud [ i ] = W_CachePatchName ( va ( " NHUD%d " , i + 1 ) , PU_HUDGFX ) ;
nsshud = W_CachePatchName ( " NSSHUD " , PU_HUDGFX ) ;
minicaps = W_CachePatchName ( " MINICAPS " , PU_HUDGFX ) ;
for ( i = 0 ; i < 8 ; + + i )
{
narrow [ i ] = W_CachePatchName ( va ( " NARROW%d " , i + 1 ) , PU_HUDGFX ) ;
nredar [ i ] = W_CachePatchName ( va ( " NREDAR%d " , i + 1 ) , PU_HUDGFX ) ;
}
// non-animated version
narrow [ 8 ] = W_CachePatchName ( " NARROW9 " , PU_HUDGFX ) ;
drillbar = W_CachePatchName ( " DRILLBAR " , PU_HUDGFX ) ;
for ( i = 0 ; i < 3 ; + + i )
drillfill [ i ] = W_CachePatchName ( va ( " DRILLFI%d " , i + 1 ) , PU_HUDGFX ) ;
capsulebar = W_CachePatchName ( " CAPSBAR " , PU_HUDGFX ) ;
capsulefill = W_CachePatchName ( " CAPSFILL " , PU_HUDGFX ) ;
minus5sec = W_CachePatchName ( " MINUS5 " , PU_HUDGFX ) ;
for ( i = 0 ; i < 7 ; + + i )
ngradeletters [ i ] = W_CachePatchName ( va ( " GRADE%d " , i ) , PU_HUDGFX ) ;
2016-08-15 03:51:08 +00:00
K_LoadKartHUDGraphics ( ) ;
2018-10-24 21:55:12 +00:00
// Midnight Channel:
hud_tv1 = W_CachePatchName ( " HUD_TV1 " , PU_HUDGFX ) ;
hud_tv2 = W_CachePatchName ( " HUD_TV2 " , PU_HUDGFX ) ;
2014-03-15 16:59:03 +00:00
}
// made separate so that skins code can reload custom face graphics
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
void ST_LoadFaceGraphics ( char * rankstr , char * wantstr , char * mmapstr , INT32 skinnum )
2014-03-15 16:59:03 +00:00
{
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
facerankprefix [ skinnum ] = W_CachePatchName ( rankstr , PU_HUDGFX ) ;
facewantprefix [ skinnum ] = W_CachePatchName ( wantstr , PU_HUDGFX ) ;
facemmapprefix [ skinnum ] = W_CachePatchName ( mmapstr , PU_HUDGFX ) ;
2014-03-15 16:59:03 +00:00
}
void ST_ReloadSkinFaceGraphics ( void )
{
INT32 i ;
for ( i = 0 ; i < numskins ; i + + )
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
ST_LoadFaceGraphics ( skins [ i ] . facerank , skins [ i ] . facewant , skins [ i ] . facemmap , i ) ;
2014-03-15 16:59:03 +00:00
}
static inline void ST_InitData ( void )
{
// 'link' the statusbar display to a player, which could be
// another player than consoleplayer, for example, when you
// change the view in a multiplayer demo with F12.
stplyr = & players [ displayplayer ] ;
st_palette = - 1 ;
}
static inline void ST_Stop ( void )
{
if ( st_stopped )
return ;
V_SetPalette ( 0 ) ;
st_stopped = true ;
}
void ST_Start ( void )
{
if ( ! st_stopped )
ST_Stop ( ) ;
ST_InitData ( ) ;
st_stopped = false ;
}
//
// Initializes the status bar, sets the defaults border patch for the window borders.
//
// used by OpenGL mode, holds lumpnum of flat used to fill space around the viewwindow
lumpnum_t st_borderpatchnum ;
void ST_Init ( void )
{
if ( dedicated )
return ;
ST_LoadGraphics ( ) ;
}
// change the status bar too, when pressing F12 while viewing a demo.
void ST_changeDemoView ( void )
{
// the same routine is called at multiplayer deathmatch spawn
// so it can be called multiple times
ST_Start ( ) ;
}
// =========================================================================
// STATUS BAR OVERLAY
// =========================================================================
boolean st_overlay ;
2019-01-03 01:02:03 +00:00
/*
2014-03-15 16:59:03 +00:00
static INT32 SCZ ( INT32 z )
{
return FixedInt ( FixedMul ( z < < FRACBITS , vid . fdupy ) ) ;
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2019-01-03 01:02:03 +00:00
/*
2014-03-15 16:59:03 +00:00
static INT32 SCY ( INT32 y )
{
//31/10/99: fixed by Hurdler so it _works_ also in hardware mode
// do not scale to resolution for hardware accelerated
// because these modes always scale by default
y = SCZ ( y ) ; // scale to resolution
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-15 16:59:03 +00:00
{
y > > = 1 ;
if ( stplyr ! = & players [ displayplayer ] )
y + = vid . height / 2 ;
}
return y ;
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2019-01-03 01:02:03 +00:00
/*
2014-03-15 16:59:03 +00:00
static INT32 STRINGY ( INT32 y )
{
//31/10/99: fixed by Hurdler so it _works_ also in hardware mode
// do not scale to resolution for hardware accelerated
// because these modes always scale by default
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-15 16:59:03 +00:00
{
y > > = 1 ;
if ( stplyr ! = & players [ displayplayer ] )
y + = BASEVIDHEIGHT / 2 ;
}
return y ;
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-03-04 22:13:19 +00:00
/*
2014-11-12 00:55:07 +00:00
static INT32 SPLITFLAGS ( INT32 f )
{
// Pass this V_SNAPTO(TOP|BOTTOM) and it'll trim them to account for splitscreen! -Red
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-11-12 00:55:07 +00:00
{
if ( stplyr ! = & players [ displayplayer ] )
f & = ~ V_SNAPTOTOP ;
else
f & = ~ V_SNAPTOBOTTOM ;
}
return f ;
}
2017-03-04 22:13:19 +00:00
*/
2014-11-12 00:55:07 +00:00
2019-01-03 01:02:03 +00:00
/*
2014-03-15 16:59:03 +00:00
static INT32 SCX ( INT32 x )
{
return FixedInt ( FixedMul ( x < < FRACBITS , vid . fdupx ) ) ;
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2014-03-21 18:42:55 +00:00
#if 0
2014-03-15 16:59:03 +00:00
static INT32 SCR ( INT32 r )
{
fixed_t y ;
//31/10/99: fixed by Hurdler so it _works_ also in hardware mode
// do not scale to resolution for hardware accelerated
// because these modes always scale by default
y = FixedMul ( r * FRACUNIT , vid . fdupy ) ; // scale to resolution
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-15 16:59:03 +00:00
{
y > > = 1 ;
if ( stplyr ! = & players [ displayplayer ] )
y + = vid . height / 2 ;
}
return FixedInt ( FixedDiv ( y , vid . fdupy ) ) ;
}
2014-03-21 18:42:55 +00:00
# endif
2014-03-15 16:59:03 +00:00
2014-03-21 18:42:55 +00:00
// =========================================================================
// INTERNAL DRAWING
// =========================================================================
# define ST_DrawOverlayNum(x,y,n) V_DrawTallNum(x, y, V_NOSCALESTART|V_HUDTRANS, n)
# define ST_DrawPaddedOverlayNum(x,y,n,d) V_DrawPaddedTallNum(x, y, V_NOSCALESTART|V_HUDTRANS, n, d)
# define ST_DrawOverlayPatch(x,y,p) V_DrawScaledPatch(x, y, V_NOSCALESTART|V_HUDTRANS, p)
# define ST_DrawMappedOverlayPatch(x,y,p,c) V_DrawMappedScaledPatch(x, y, V_NOSCALESTART|V_HUDTRANS, p, c)
# define ST_DrawNumFromHud(h,n) V_DrawTallNum(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, n)
# define ST_DrawPadNumFromHud(h,n,q) V_DrawPaddedTallNum(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, n, q)
# define ST_DrawPatchFromHud(h,p) V_DrawScaledPatch(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, p)
# define ST_DrawNumFromHudWS(h,n) V_DrawTallNum(SCX(hudinfo[h+!!splitscreen].x), SCY(hudinfo[h+!!splitscreen].y), V_NOSCALESTART|V_HUDTRANS, n)
# define ST_DrawPadNumFromHudWS(h,n,q) V_DrawPaddedTallNum(SCX(hudinfo[h+!!splitscreen].x), SCY(hudinfo[h+!!splitscreen].y), V_NOSCALESTART|V_HUDTRANS, n, q)
# define ST_DrawPatchFromHudWS(h,p) V_DrawScaledPatch(SCX(hudinfo[h+!!splitscreen].x), SCY(hudinfo[h+!!splitscreen].y), V_NOSCALESTART|V_HUDTRANS, p)
2017-03-04 22:13:19 +00:00
/*
2014-03-21 18:42:55 +00:00
// Draw a number, scaled, over the view, maybe with set translucency
2014-03-15 16:59:03 +00:00
// Always draw the number completely since it's overlay
//
// Supports different colors! woo!
2017-03-04 22:13:19 +00:00
static void ST_DrawNightsOverlayNum ( INT32 x , INT32 y , INT32 a ,
2014-03-15 16:59:03 +00:00
INT32 num , patch_t * * numpat , skincolors_t colornum )
{
INT32 w = SHORT ( numpat [ 0 ] - > width ) ;
const UINT8 * colormap ;
2014-11-12 00:55:07 +00:00
// I want my V_SNAPTOx flags. :< -Red
//a &= V_ALPHAMASK;
2014-03-15 16:59:03 +00:00
if ( colornum = = 0 )
colormap = colormaps ;
else // Uses the player colors.
colormap = R_GetTranslationColormap ( TC_DEFAULT , colornum , GTC_CACHE ) ;
I_Assert ( num > = 0 ) ; // this function does not draw negative numbers
// draw the number
do
{
2014-11-12 00:55:07 +00:00
x - = w ;
V_DrawTranslucentMappedPatch ( x , y , a , numpat [ num % 10 ] , colormap ) ;
2014-03-15 16:59:03 +00:00
num / = 10 ;
} while ( num ) ;
// Sorry chum, this function only draws UNSIGNED values!
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
// Devmode information
static void ST_drawDebugInfo ( void )
{
INT32 height = 192 ;
if ( ! stplyr - > mo )
return ;
if ( cv_debug & DBG_BASIC )
{
const fixed_t d = AngleFixed ( stplyr - > mo - > angle ) ;
V_DrawRightAlignedString ( 320 , 168 , V_MONOSPACE , va ( " X: %6d " , stplyr - > mo - > x > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , 176 , V_MONOSPACE , va ( " Y: %6d " , stplyr - > mo - > y > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , 184 , V_MONOSPACE , va ( " Z: %6d " , stplyr - > mo - > z > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , 192 , V_MONOSPACE , va ( " A: %6d " , FixedInt ( d ) ) ) ;
height = 152 ;
}
if ( cv_debug & DBG_DETAILED )
{
V_DrawRightAlignedString ( 320 , height - 104 , V_MONOSPACE , va ( " SHIELD: %5x " , stplyr - > powers [ pw_shield ] ) ) ;
V_DrawRightAlignedString ( 320 , height - 96 , V_MONOSPACE , va ( " SCALE: %5d%% " , ( stplyr - > mo - > scale * 100 ) / FRACUNIT ) ) ;
V_DrawRightAlignedString ( 320 , height - 88 , V_MONOSPACE , va ( " DASH: %3d/%3d " , stplyr - > dashspeed > > FRACBITS , FixedMul ( stplyr - > maxdash , stplyr - > mo - > scale ) > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 80 , V_MONOSPACE , va ( " AIR: %4d, %3d " , stplyr - > powers [ pw_underwater ] , stplyr - > powers [ pw_spacetime ] ) ) ;
// Flags
V_DrawRightAlignedString ( 304 - 64 , height - 72 , V_MONOSPACE , " Flags: " ) ;
V_DrawString ( 304 - 60 , height - 72 , ( stplyr - > jumping ) ? V_GREENMAP : V_REDMAP , " JM " ) ;
V_DrawString ( 304 - 40 , height - 72 , ( stplyr - > pflags & PF_JUMPED ) ? V_GREENMAP : V_REDMAP , " JD " ) ;
V_DrawString ( 304 - 20 , height - 72 , ( stplyr - > pflags & PF_SPINNING ) ? V_GREENMAP : V_REDMAP , " SP " ) ;
V_DrawString ( 304 , height - 72 , ( stplyr - > pflags & PF_STARTDASH ) ? V_GREENMAP : V_REDMAP , " ST " ) ;
V_DrawRightAlignedString ( 320 , height - 64 , V_MONOSPACE , va ( " CEILZ: %6d " , stplyr - > mo - > ceilingz > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 56 , V_MONOSPACE , va ( " FLOORZ: %6d " , stplyr - > mo - > floorz > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 48 , V_MONOSPACE , va ( " CNVX: %6d " , stplyr - > cmomx > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 40 , V_MONOSPACE , va ( " CNVY: %6d " , stplyr - > cmomy > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 32 , V_MONOSPACE , va ( " PLTZ: %6d " , stplyr - > mo - > pmomz > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 24 , V_MONOSPACE , va ( " MOMX: %6d " , stplyr - > rmomx > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 16 , V_MONOSPACE , va ( " MOMY: %6d " , stplyr - > rmomy > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height - 8 , V_MONOSPACE , va ( " MOMZ: %6d " , stplyr - > mo - > momz > > FRACBITS ) ) ;
V_DrawRightAlignedString ( 320 , height , V_MONOSPACE , va ( " SPEED: %6d " , stplyr - > speed > > FRACBITS ) ) ;
height - = 120 ;
}
if ( cv_debug & DBG_RANDOMIZER ) // randomizer testing
{
2016-07-06 04:09:17 +00:00
fixed_t peekres = P_RandomPeek ( ) ;
peekres * = 10000 ; // Change from fixed point
peekres > > = FRACBITS ; // to displayable decimal
2014-03-15 16:59:03 +00:00
V_DrawRightAlignedString ( 320 , height - 16 , V_MONOSPACE , va ( " Init: %08x " , P_GetInitSeed ( ) ) ) ;
V_DrawRightAlignedString ( 320 , height - 8 , V_MONOSPACE , va ( " Seed: %08x " , P_GetRandSeed ( ) ) ) ;
2016-07-06 04:09:17 +00:00
V_DrawRightAlignedString ( 320 , height , V_MONOSPACE , va ( " == : .%04d " , peekres ) ) ;
2014-03-15 16:59:03 +00:00
height - = 32 ;
}
if ( cv_debug & DBG_MEMORY )
{
V_DrawRightAlignedString ( 320 , height , V_MONOSPACE , va ( " Heap used: %7sKB " , sizeu1 ( Z_TagsUsage ( 0 , INT32_MAX ) > > 10 ) ) ) ;
}
}
2017-03-04 22:13:19 +00:00
/*
2014-03-15 16:59:03 +00:00
static void ST_drawScore ( void )
{
// SCORE:
2014-03-21 18:42:55 +00:00
ST_DrawPatchFromHud ( HUD_SCORE , sboscore ) ;
2014-03-15 16:59:03 +00:00
if ( objectplacing )
{
if ( op_displayflags > UINT16_MAX )
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( hudinfo [ HUD_SCORENUM ] . x - tallminus - > width ) , SCY ( hudinfo [ HUD_SCORENUM ] . y ) , tallminus ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHud ( HUD_SCORENUM , op_displayflags ) ;
2014-03-15 16:59:03 +00:00
}
else
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHud ( HUD_SCORENUM , stplyr - > score ) ;
2014-03-15 16:59:03 +00:00
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-03-04 22:13:19 +00:00
/*
2014-03-15 16:59:03 +00:00
static void ST_drawTime ( void )
{
INT32 seconds , minutes , tictrn , tics ;
// TIME:
2014-03-21 18:42:55 +00:00
ST_DrawPatchFromHudWS ( HUD_TIME , sbotime ) ;
2014-03-15 16:59:03 +00:00
if ( objectplacing )
{
tics = objectsdrawn ;
seconds = objectsdrawn % 100 ;
minutes = objectsdrawn / 100 ;
tictrn = 0 ;
}
else
{
tics = stplyr - > realtime ;
2014-03-21 18:42:55 +00:00
seconds = G_TicsToSeconds ( tics ) ;
minutes = G_TicsToMinutes ( tics , true ) ;
2014-03-15 16:59:03 +00:00
tictrn = G_TicsToCentiseconds ( tics ) ;
}
if ( cv_timetic . value = = 1 ) // Tics only -- how simple is this?
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHudWS ( HUD_SECONDS , tics ) ;
2014-03-15 16:59:03 +00:00
else
{
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHudWS ( HUD_MINUTES , minutes ) ; // Minutes
ST_DrawPatchFromHudWS ( HUD_TIMECOLON , sbocolon ) ; // Colon
ST_DrawPadNumFromHudWS ( HUD_SECONDS , seconds , 2 ) ; // Seconds
2014-03-15 16:59:03 +00:00
2017-12-19 01:59:04 +00:00
if ( ! splitscreen & & ( cv_timetic . value = = 2 | | modeattacking ) ) // there's not enough room for tics in splitscreen, don't even bother trying!
2014-03-15 16:59:03 +00:00
{
2014-03-25 02:17:59 +00:00
ST_DrawPatchFromHud ( HUD_TIMETICCOLON , sboperiod ) ; // Period
2014-03-21 18:42:55 +00:00
ST_DrawPadNumFromHud ( HUD_TICS , tictrn , 2 ) ; // Tics
2014-03-15 16:59:03 +00:00
}
}
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
2019-01-03 01:02:03 +00:00
/*
static inline void ST_drawRings ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
2014-03-21 18:42:55 +00:00
INT32 ringnum = max ( stplyr - > health - 1 , 0 ) ;
2014-03-15 16:59:03 +00:00
2014-03-21 18:42:55 +00:00
ST_DrawPatchFromHudWS ( HUD_RINGS , ( ( stplyr - > health < = 1 & & leveltime / 5 & 1 ) ? rrings : sborings ) ) ;
2014-03-15 16:59:03 +00:00
if ( objectplacing )
2014-03-21 18:42:55 +00:00
ringnum = op_currentdoomednum ;
2014-03-15 16:59:03 +00:00
else if ( ! useNightsSS & & G_IsSpecialStage ( gamemap ) )
{
INT32 i ;
2014-03-21 18:42:55 +00:00
ringnum = 0 ;
2014-03-15 16:59:03 +00:00
for ( i = 0 ; i < MAXPLAYERS ; i + + )
if ( playeringame [ i ] & & players [ i ] . mo & & players [ i ] . mo - > health > 1 )
2014-03-21 18:42:55 +00:00
ringnum + = players [ i ] . mo - > health - 1 ;
2014-03-15 16:59:03 +00:00
}
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHudWS ( HUD_RINGSNUM , ringnum ) ;
2014-03-15 16:59:03 +00:00
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
static void ST_drawLives ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
2017-12-19 01:59:04 +00:00
const INT32 v_splitflag = ( splitscreen & & stplyr = = & players [ displayplayer ] ? V_SPLITSCREEN : 0 ) ;
2014-03-15 16:59:03 +00:00
if ( ! stplyr - > skincolor )
return ; // Just joined a server, skin isn't loaded yet!
// face background
V_DrawSmallScaledPatch ( hudinfo [ HUD_LIVESPIC ] . x , hudinfo [ HUD_LIVESPIC ] . y + ( v_splitflag ? - 12 : 0 ) ,
2014-03-21 18:42:55 +00:00
V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS | v_splitflag , livesback ) ;
2014-03-15 16:59:03 +00:00
// face
if ( stplyr - > mo & & stplyr - > mo - > color )
{
// skincolor face/super
UINT8 * colormap = R_GetTranslationColormap ( stplyr - > skin , stplyr - > mo - > color , GTC_CACHE ) ;
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
patch_t * face = facerankprefix [ stplyr - > skin ] ;
2014-03-15 16:59:03 +00:00
if ( stplyr - > powers [ pw_super ] | | stplyr - > pflags & PF_NIGHTSMODE )
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
face = facewantprefix [ stplyr - > skin ] ;
2014-03-15 16:59:03 +00:00
V_DrawSmallMappedPatch ( hudinfo [ HUD_LIVESPIC ] . x , hudinfo [ HUD_LIVESPIC ] . y + ( v_splitflag ? - 12 : 0 ) ,
2014-03-21 18:42:55 +00:00
V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS | v_splitflag , face , colormap ) ;
2014-03-15 16:59:03 +00:00
}
else if ( stplyr - > skincolor )
{
// skincolor face
UINT8 * colormap = R_GetTranslationColormap ( stplyr - > skin , stplyr - > skincolor , GTC_CACHE ) ;
V_DrawSmallMappedPatch ( hudinfo [ HUD_LIVESPIC ] . x , hudinfo [ HUD_LIVESPIC ] . y + ( v_splitflag ? - 12 : 0 ) ,
Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head.
* Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps.
* Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix).
* Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything.
* Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers.
* Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players.
2018-10-28 16:27:55 +00:00
V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS | v_splitflag , facerankprefix [ stplyr - > skin ] , colormap ) ;
2014-03-15 16:59:03 +00:00
}
// name
if ( strlen ( skins [ stplyr - > skin ] . hudname ) > 8 )
2014-03-21 18:42:55 +00:00
V_DrawThinString ( hudinfo [ HUD_LIVESNAME ] . x , hudinfo [ HUD_LIVESNAME ] . y + ( v_splitflag ? - 12 : 0 ) ,
V_HUDTRANS | V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_MONOSPACE | V_YELLOWMAP | v_splitflag , skins [ stplyr - > skin ] . hudname ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawString ( hudinfo [ HUD_LIVESNAME ] . x , hudinfo [ HUD_LIVESNAME ] . y + ( v_splitflag ? - 12 : 0 ) ,
V_HUDTRANS | V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_MONOSPACE | V_YELLOWMAP | v_splitflag , skins [ stplyr - > skin ] . hudname ) ;
2014-03-15 16:59:03 +00:00
// x
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( hudinfo [ HUD_LIVESX ] . x , hudinfo [ HUD_LIVESX ] . y + ( v_splitflag ? - 4 : 0 ) ,
V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS | v_splitflag , stlivex ) ;
2014-03-15 16:59:03 +00:00
// lives
2014-03-21 18:42:55 +00:00
V_DrawRightAlignedString ( hudinfo [ HUD_LIVESNUM ] . x , hudinfo [ HUD_LIVESNUM ] . y + ( v_splitflag ? - 4 : 0 ) ,
V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS | v_splitflag , va ( " %d " , stplyr - > lives ) ) ;
2014-03-15 16:59:03 +00:00
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
static void ST_drawLevelTitle ( void )
{
char * lvlttl = mapheaderinfo [ gamemap - 1 ] - > lvlttl ;
char * subttl = mapheaderinfo [ gamemap - 1 ] - > subttl ;
2017-09-01 17:00:53 +00:00
char * zonttl = mapheaderinfo [ gamemap - 1 ] - > zonttl ; // SRB2kart
2018-06-05 05:34:05 +00:00
char * actnum = mapheaderinfo [ gamemap - 1 ] - > actnum ;
2014-03-15 16:59:03 +00:00
INT32 lvlttlxpos ;
INT32 ttlnumxpos ;
INT32 zonexpos ;
2018-06-28 18:07:04 +00:00
INT32 dupcalc = ( vid . width / vid . dupx ) ;
UINT8 gtc = G_GetGametypeColor ( gametype ) ;
INT32 sub = 0 ;
2018-06-30 15:01:03 +00:00
INT32 bary = ( splitscreen )
? BASEVIDHEIGHT / 2
: 163 ;
2018-06-28 18:07:04 +00:00
INT32 lvlw ;
if ( timeinmap > 113 )
2014-03-15 16:59:03 +00:00
return ;
2018-06-28 18:07:04 +00:00
lvlw = V_LevelNameWidth ( lvlttl ) ;
2018-08-12 14:10:47 +00:00
if ( actnum [ 0 ] )
2018-06-28 18:07:04 +00:00
lvlttlxpos = ( ( BASEVIDWIDTH / 2 ) - ( lvlw / 2 ) ) - V_LevelNameWidth ( actnum ) ;
2014-03-15 16:59:03 +00:00
else
2018-06-28 18:07:04 +00:00
lvlttlxpos = ( ( BASEVIDWIDTH / 2 ) - ( lvlw / 2 ) ) ;
2014-03-15 16:59:03 +00:00
2018-06-29 13:14:24 +00:00
zonexpos = ttlnumxpos = lvlttlxpos + lvlw ;
if ( ! ( mapheaderinfo [ gamemap - 1 ] - > levelflags & LF_NOZONE ) )
{
if ( zonttl [ 0 ] )
zonexpos - = V_LevelNameWidth ( zonttl ) ; // SRB2kart
else
zonexpos - = V_LevelNameWidth ( M_GetText ( " ZONE " ) ) ;
}
2014-03-15 16:59:03 +00:00
if ( lvlttlxpos < 0 )
lvlttlxpos = 0 ;
2018-06-28 18:07:04 +00:00
if ( timeinmap > 105 )
2014-03-15 16:59:03 +00:00
{
2018-06-28 18:07:04 +00:00
INT32 count = ( 113 - ( INT32 ) ( timeinmap ) ) ;
sub = dupcalc ;
while ( count - - > 0 )
sub > > = 1 ;
sub = - sub ;
2014-03-15 16:59:03 +00:00
}
2018-06-28 18:07:04 +00:00
{
dupcalc = ( dupcalc - BASEVIDWIDTH ) > > 1 ;
2018-06-30 15:01:03 +00:00
V_DrawFill ( sub - dupcalc , bary + 9 , ttlnumxpos + dupcalc + 1 , 2 , 31 ) ;
V_DrawDiag ( sub + ttlnumxpos + 1 , bary , 11 , 31 ) ;
V_DrawFill ( sub - dupcalc , bary , ttlnumxpos + dupcalc , 10 , gtc ) ;
V_DrawDiag ( sub + ttlnumxpos , bary , 10 , gtc ) ;
2018-07-23 22:50:41 +00:00
2018-06-29 13:14:24 +00:00
if ( subttl [ 0 ] )
2018-06-30 15:01:03 +00:00
V_DrawRightAlignedString ( sub + zonexpos - 8 , bary + 1 , V_ALLOWLOWERCASE , subttl ) ;
2018-08-09 21:59:52 +00:00
//else
//V_DrawRightAlignedString(sub + zonexpos - 8, bary+1, V_ALLOWLOWERCASE, va("%s Mode", gametype_cons_t[gametype].strvalue));
2018-06-28 18:07:04 +00:00
}
ttlnumxpos + = sub ;
lvlttlxpos + = sub ;
zonexpos + = sub ;
2018-06-30 15:01:03 +00:00
V_DrawLevelTitle ( lvlttlxpos , bary - 18 , 0 , lvlttl ) ;
2014-03-15 16:59:03 +00:00
2017-09-01 22:57:53 +00:00
if ( strlen ( zonttl ) > 0 )
2018-06-30 15:01:03 +00:00
V_DrawLevelTitle ( zonexpos , bary + 6 , 0 , zonttl ) ;
2017-09-01 17:00:53 +00:00
else if ( ! ( mapheaderinfo [ gamemap - 1 ] - > levelflags & LF_NOZONE ) )
2018-06-30 15:01:03 +00:00
V_DrawLevelTitle ( zonexpos , bary + 6 , 0 , M_GetText ( " ZONE " ) ) ;
2018-07-01 18:29:13 +00:00
if ( actnum [ 0 ] )
2018-06-30 15:01:03 +00:00
V_DrawLevelTitle ( ttlnumxpos + 12 , bary + 6 , 0 , actnum ) ;
2014-03-15 16:59:03 +00:00
}
2018-06-26 16:02:14 +00:00
/*
2014-03-15 16:59:03 +00:00
static void ST_drawFirstPersonHUD ( void )
{
player_t * player = stplyr ;
patch_t * p = NULL ;
2014-03-17 12:13:16 +00:00
UINT16 invulntime = 0 ;
if ( player - > playerstate ! = PST_LIVE )
return ;
2014-03-15 16:59:03 +00:00
// Graue 06-18-2004: no V_NOSCALESTART, no SCX, no SCY, snap to right
if ( player - > powers [ pw_shield ] & SH_FORCE )
{
if ( ( player - > powers [ pw_shield ] & 0xFF ) > 0 | | leveltime & 1 )
2014-03-17 12:13:16 +00:00
p = forceshield ;
2014-03-15 16:59:03 +00:00
}
else switch ( player - > powers [ pw_shield ] & SH_NOSTACK )
{
2014-03-17 12:13:16 +00:00
case SH_JUMP : p = jumpshield ; break ;
case SH_ELEMENTAL : p = watershield ; break ;
case SH_BOMB : p = bombshield ; break ;
case SH_ATTRACT : p = ringshield ; break ;
case SH_PITY : p = pityshield ; break ;
default : break ;
}
if ( p )
{
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-21 18:42:55 +00:00
V_DrawSmallScaledPatch ( 312 , STRINGY ( 24 ) , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , p ) ;
2014-03-17 12:13:16 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 304 , 24 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , p ) ;
2014-03-17 12:13:16 +00:00
}
// pw_flashing just sets the icon to flash no matter what.
invulntime = player - > powers [ pw_flashing ] ? 1 : player - > powers [ pw_invulnerability ] ;
if ( invulntime > 3 * TICRATE | | ( invulntime & & leveltime & 1 ) )
{
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-21 18:42:55 +00:00
V_DrawSmallScaledPatch ( 312 , STRINGY ( 24 ) + 14 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , invincibility ) ;
2014-03-17 12:13:16 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 304 , 24 + 28 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , invincibility ) ;
2014-03-15 16:59:03 +00:00
}
2014-03-17 12:13:16 +00:00
if ( player - > powers [ pw_sneakers ] > 3 * TICRATE | | ( player - > powers [ pw_sneakers ] & & leveltime & 1 ) )
{
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-21 18:42:55 +00:00
V_DrawSmallScaledPatch ( 312 , STRINGY ( 24 ) + 28 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , sneakers ) ;
2014-03-17 12:13:16 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 304 , 24 + 56 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , sneakers ) ;
2014-03-17 12:13:16 +00:00
}
2014-03-15 16:59:03 +00:00
2014-03-17 12:13:16 +00:00
p = NULL ;
2014-03-15 16:59:03 +00:00
// Display the countdown drown numbers!
if ( ( player - > powers [ pw_underwater ] < = 11 * TICRATE + 1
& & player - > powers [ pw_underwater ] > = 10 * TICRATE + 1 )
| | ( player - > powers [ pw_spacetime ] < = 11 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > = 10 * TICRATE + 1 ) )
{
p = count5 ;
}
else if ( ( player - > powers [ pw_underwater ] < = 9 * TICRATE + 1
& & player - > powers [ pw_underwater ] > = 8 * TICRATE + 1 )
| | ( player - > powers [ pw_spacetime ] < = 9 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > = 8 * TICRATE + 1 ) )
{
p = count4 ;
}
else if ( ( player - > powers [ pw_underwater ] < = 7 * TICRATE + 1
& & player - > powers [ pw_underwater ] > = 6 * TICRATE + 1 )
| | ( player - > powers [ pw_spacetime ] < = 7 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > = 6 * TICRATE + 1 ) )
{
p = count3 ;
}
else if ( ( player - > powers [ pw_underwater ] < = 5 * TICRATE + 1
& & player - > powers [ pw_underwater ] > = 4 * TICRATE + 1 )
| | ( player - > powers [ pw_spacetime ] < = 5 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > = 4 * TICRATE + 1 ) )
{
p = count2 ;
}
else if ( ( player - > powers [ pw_underwater ] < = 3 * TICRATE + 1
& & player - > powers [ pw_underwater ] > = 2 * TICRATE + 1 )
| | ( player - > powers [ pw_spacetime ] < = 3 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > = 2 * TICRATE + 1 ) )
{
p = count1 ;
}
else if ( ( player - > powers [ pw_underwater ] < = 1 * TICRATE + 1
& & player - > powers [ pw_underwater ] > 1 )
| | ( player - > powers [ pw_spacetime ] < = 1 * TICRATE + 1
& & player - > powers [ pw_spacetime ] > 1 ) )
{
p = count0 ;
}
if ( p )
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( SCX ( ( BASEVIDWIDTH / 2 ) - ( SHORT ( p - > width ) / 2 ) + SHORT ( p - > leftoffset ) ) , SCY ( 60 - SHORT ( p - > topoffset ) ) ,
V_NOSCALESTART | V_OFFSET | V_TRANSLUCENT , p ) ;
2014-03-15 16:59:03 +00:00
}
2018-06-26 16:02:14 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-03-04 22:13:19 +00:00
/*
2014-03-15 16:59:03 +00:00
// [21:42] <+Rob> Beige - Lavender - Steel Blue - Peach - Orange - Purple - Silver - Yellow - Pink - Red - Blue - Green - Cyan - Gold
static skincolors_t linkColor [ 14 ] =
2018-07-02 12:20:04 +00:00
{ SKINCOLOR_BEIGE , SKINCOLOR_LAVENDER , SKINCOLOR_STEEL , SKINCOLOR_PEACH , SKINCOLOR_ORANGE ,
2014-03-15 16:59:03 +00:00
SKINCOLOR_PURPLE , SKINCOLOR_SILVER , SKINCOLOR_SUPER4 , SKINCOLOR_PINK , SKINCOLOR_RED ,
SKINCOLOR_BLUE , SKINCOLOR_GREEN , SKINCOLOR_CYAN , SKINCOLOR_GOLD } ;
static void ST_drawNightsRecords ( void )
{
INT32 aflag = 0 ;
if ( ! stplyr - > texttimer )
return ;
if ( stplyr - > texttimer < TICRATE / 2 )
aflag = ( 9 - 9 * stplyr - > texttimer / ( TICRATE / 2 ) ) < < V_ALPHASHIFT ;
// A "Bonus Time Start" by any other name...
if ( stplyr - > textvar = = 1 )
{
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 52 ) , V_GREENMAP | aflag , M_GetText ( " GET TO THE GOAL! " ) ) ;
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 60 ) , aflag , M_GetText ( " SCORE MULTIPLIER START! " ) ) ;
if ( stplyr - > finishedtime )
{
V_DrawString ( BASEVIDWIDTH / 2 - 48 , STRINGY ( 140 ) , aflag , " TIME: " ) ;
V_DrawString ( BASEVIDWIDTH / 2 - 48 , STRINGY ( 148 ) , aflag , " BONUS: " ) ;
V_DrawRightAlignedString ( BASEVIDWIDTH / 2 + 48 , STRINGY ( 140 ) , V_ORANGEMAP | aflag , va ( " %d " , ( stplyr - > startedtime - stplyr - > finishedtime ) / TICRATE ) ) ;
V_DrawRightAlignedString ( BASEVIDWIDTH / 2 + 48 , STRINGY ( 148 ) , V_ORANGEMAP | aflag , va ( " %d " , ( stplyr - > finishedtime / TICRATE ) * 100 ) ) ;
}
}
// Get n [more] Spheres
else if ( stplyr - > textvar < = 3 & & stplyr - > textvar > = 2 )
{
if ( ! stplyr - > capsule )
return ;
// Yes, this string is an abomination.
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 60 ) , aflag ,
va ( M_GetText ( " \x80 GET \x82 %d \x80 %s%s%s! " ) , stplyr - > capsule - > health ,
( stplyr - > textvar = = 3 ) ? M_GetText ( " MORE " ) : " " ,
( G_IsSpecialStage ( gamemap ) ) ? " SPHERE " : " RING " ,
( stplyr - > capsule - > health > 1 ) ? " S " : " " ) ) ;
}
// End Bonus
else if ( stplyr - > textvar = = 4 )
{
V_DrawString ( BASEVIDWIDTH / 2 - 48 , STRINGY ( 140 ) , aflag , ( G_IsSpecialStage ( gamemap ) ) ? " ORBS: " : " RINGS: " ) ;
V_DrawString ( BASEVIDWIDTH / 2 - 48 , STRINGY ( 148 ) , aflag , " BONUS: " ) ;
V_DrawRightAlignedString ( BASEVIDWIDTH / 2 + 48 , STRINGY ( 140 ) , V_ORANGEMAP | aflag , va ( " %d " , stplyr - > finishedrings ) ) ;
V_DrawRightAlignedString ( BASEVIDWIDTH / 2 + 48 , STRINGY ( 148 ) , V_ORANGEMAP | aflag , va ( " %d " , stplyr - > finishedrings * 50 ) ) ;
2018-07-02 12:20:04 +00:00
ST_DrawNightsOverlayNum ( BASEVIDWIDTH / 2 + 48 , STRINGY ( 160 ) , aflag , stplyr - > lastmarescore , nightsnum , SKINCOLOR_STEEL ) ;
2014-03-15 16:59:03 +00:00
// If new record, say so!
if ( ! ( netgame | | multiplayer ) & & G_GetBestNightsScore ( gamemap , stplyr - > lastmare + 1 ) < = stplyr - > lastmarescore )
{
if ( stplyr - > texttimer & 16 )
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 184 ) , V_YELLOWMAP | aflag , " * NEW RECORD * " ) ;
}
if ( P_HasGrades ( gamemap , stplyr - > lastmare + 1 ) )
{
if ( aflag )
2014-11-12 00:55:07 +00:00
V_DrawTranslucentPatch ( BASEVIDWIDTH / 2 + 60 , STRINGY ( 160 ) , aflag ,
2014-03-15 16:59:03 +00:00
ngradeletters [ P_GetGrade ( stplyr - > lastmarescore , gamemap , stplyr - > lastmare ) ] ) ;
else
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( BASEVIDWIDTH / 2 + 60 , STRINGY ( 160 ) , 0 ,
2014-03-15 16:59:03 +00:00
ngradeletters [ P_GetGrade ( stplyr - > lastmarescore , gamemap , stplyr - > lastmare ) ] ) ;
}
}
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
static void ST_drawNiGHTSHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
INT32 origamount ;
INT32 minlink = 1 ;
INT32 total_ringcount ;
2017-12-19 01:59:04 +00:00
UINT8 nosshack = 0 ;
2014-03-15 16:59:03 +00:00
// When debugging, show "0 Link".
if ( cv_debug & DBG_NIGHTSBASIC )
minlink = 0 ;
2016-08-12 15:01:03 +00:00
// Cheap hack: don't display when the score is showing (it popping up for a split second when exiting a map is intentional)
2014-03-15 16:59:03 +00:00
if ( stplyr - > texttimer & & stplyr - > textvar = = 4 )
minlink = INT32_MAX ;
if ( G_IsSpecialStage ( gamemap ) )
{ // Since special stages share score, time, rings, etc.
// disable splitscreen mode for its HUD.
if ( stplyr ! = & players [ displayplayer ] )
return ;
nosshack = splitscreen ;
2017-12-19 01:59:04 +00:00
splitscreen = 0 ;
2014-03-15 16:59:03 +00:00
}
// Link drawing
if (
# ifdef HAVE_BLUA
LUA_HudEnabled ( hud_nightslink ) & &
# endif
stplyr - > linkcount > minlink )
{
skincolors_t colornum = linkColor [ ( ( stplyr - > linkcount - 1 ) / 5 ) % ( sizeof ( linkColor ) / sizeof ( skincolors_t ) ) ] ;
if ( stplyr - > powers [ pw_nights_linkfreeze ] )
colornum = SKINCOLOR_WHITE ;
if ( stplyr - > linktimer < 2 * TICRATE / 3 )
{
INT32 linktrans = ( 9 - 9 * stplyr - > linktimer / ( 2 * TICRATE / 3 ) ) < < V_ALPHASHIFT ;
if ( splitscreen )
{
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 256 , STRINGY ( 152 ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_SNAPTORIGHT | linktrans , ( stplyr - > linkcount - 1 ) , nightsnum , colornum ) ;
V_DrawTranslucentMappedPatch ( 264 , STRINGY ( 152 ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_SNAPTORIGHT | linktrans , nightslink ,
2014-03-15 16:59:03 +00:00
colornum = = 0 ? colormaps : R_GetTranslationColormap ( TC_DEFAULT , colornum , GTC_CACHE ) ) ;
}
else
{
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 160 , 160 , V_SNAPTOBOTTOM | linktrans , ( stplyr - > linkcount - 1 ) , nightsnum , colornum ) ;
V_DrawTranslucentMappedPatch ( 168 , 160 , V_SNAPTOBOTTOM | linktrans , nightslink ,
2014-03-15 16:59:03 +00:00
colornum = = 0 ? colormaps : R_GetTranslationColormap ( TC_DEFAULT , colornum , GTC_CACHE ) ) ;
}
}
else // normal, fullbright
{
#if 0 // Cool but silly number effect where the previous link number fades away
if ( stplyr - > linkcount > 2 & & stplyr - > linktimer > ( 2 * TICRATE ) - 9 )
{
INT32 offs = 10 - ( stplyr - > linktimer - ( 2 * TICRATE - 9 ) ) ;
INT32 ghosttrans = offs < < V_ALPHASHIFT ;
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 160 , STRINGY ( 160 + offs ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | ghosttrans , ( stplyr - > linkcount - 2 ) ,
2014-03-15 16:59:03 +00:00
nightsnum , colornum ) ;
}
# endif
if ( splitscreen )
{
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 256 , STRINGY ( 152 ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_SNAPTORIGHT , ( stplyr - > linkcount - 1 ) , nightsnum , colornum ) ;
V_DrawMappedPatch ( 264 , STRINGY ( 152 ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_SNAPTORIGHT , nightslink ,
2014-03-15 16:59:03 +00:00
colornum = = 0 ? colormaps : R_GetTranslationColormap ( TC_DEFAULT , colornum , GTC_CACHE ) ) ;
}
else
{
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 160 , 160 , V_SNAPTOBOTTOM , ( stplyr - > linkcount - 1 ) , nightsnum , colornum ) ;
V_DrawMappedPatch ( 168 , 160 , V_SNAPTOBOTTOM , nightslink ,
2014-03-15 16:59:03 +00:00
colornum = = 0 ? colormaps : R_GetTranslationColormap ( TC_DEFAULT , colornum , GTC_CACHE ) ) ;
}
}
// Show remaining link time left in debug
if ( cv_debug & DBG_NIGHTSBASIC )
2014-11-12 00:55:07 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , 180 , V_SNAPTOBOTTOM , va ( " End in %d.%02d " , stplyr - > linktimer / TICRATE , G_TicsToCentiseconds ( stplyr - > linktimer ) ) ) ;
2014-03-15 16:59:03 +00:00
}
// Drill meter
if (
# ifdef HAVE_BLUA
LUA_HudEnabled ( hud_nightsdrill ) & &
# endif
stplyr - > pflags & PF_NIGHTSMODE )
{
INT32 locx , locy ;
INT32 dfill ;
UINT8 fillpatch ;
2014-11-12 00:55:07 +00:00
if ( splitscreen | | nosshack )
2014-03-15 16:59:03 +00:00
{
locx = 110 ;
locy = 188 ;
}
else
{
locx = 16 ;
locy = 180 ;
}
// Use which patch?
if ( stplyr - > pflags & PF_DRILLING )
fillpatch = ( stplyr - > drillmeter & 1 ) + 1 ;
else
fillpatch = 0 ;
if ( splitscreen )
2014-11-12 00:55:07 +00:00
{ // 11-5-14 Replaced the old hack with a slightly better hack. -Red
V_DrawScaledPatch ( locx , STRINGY ( locy ) - 3 , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_HUDTRANS , drillbar ) ;
2014-03-15 16:59:03 +00:00
for ( dfill = 0 ; dfill < stplyr - > drillmeter / 20 & & dfill < 96 ; + + dfill )
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( locx + 2 + dfill , STRINGY ( locy + 3 ) , SPLITFLAGS ( V_SNAPTOBOTTOM ) | V_HUDTRANS , drillfill [ fillpatch ] ) ;
2014-03-15 16:59:03 +00:00
}
else if ( nosshack )
{ // Even dirtier hack-of-a-hack to draw seperate drill meters in splitscreen special stages but nothing else.
2017-12-19 01:59:04 +00:00
splitscreen = nosshack ;
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( locx , STRINGY ( locy ) - 3 , V_HUDTRANS , drillbar ) ;
2014-03-15 16:59:03 +00:00
for ( dfill = 0 ; dfill < stplyr - > drillmeter / 20 & & dfill < 96 ; + + dfill )
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( locx + 2 + dfill , STRINGY ( locy + 3 ) , V_HUDTRANS , drillfill [ fillpatch ] ) ;
2014-03-15 16:59:03 +00:00
stplyr = & players [ secondarydisplayplayer ] ;
if ( stplyr - > pflags & PF_DRILLING )
fillpatch = ( stplyr - > drillmeter & 1 ) + 1 ;
else
fillpatch = 0 ;
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( locx , STRINGY ( locy - 3 ) , V_SNAPTOBOTTOM | V_HUDTRANS , drillbar ) ;
2014-03-15 16:59:03 +00:00
for ( dfill = 0 ; dfill < stplyr - > drillmeter / 20 & & dfill < 96 ; + + dfill )
2014-11-12 00:55:07 +00:00
V_DrawScaledPatch ( locx + 2 + dfill , STRINGY ( locy + 3 ) , V_SNAPTOBOTTOM | V_HUDTRANS , drillfill [ fillpatch ] ) ;
2014-03-15 16:59:03 +00:00
stplyr = & players [ displayplayer ] ;
2017-12-19 01:59:04 +00:00
splitscreen = 0 ;
2014-03-15 16:59:03 +00:00
}
else
{ // Draw normally. <:3
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( locx , locy , V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS , drillbar ) ;
2014-03-15 16:59:03 +00:00
for ( dfill = 0 ; dfill < stplyr - > drillmeter / 20 & & dfill < 96 ; + + dfill )
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( locx + 2 + dfill , locy + 3 , V_SNAPTOLEFT | V_SNAPTOBOTTOM | V_HUDTRANS , drillfill [ fillpatch ] ) ;
2014-03-15 16:59:03 +00:00
}
// Display actual drill amount and bumper time
if ( cv_debug & DBG_NIGHTSBASIC )
{
if ( stplyr - > bumpertime )
V_DrawString ( SCX ( locx ) , SCY ( locy - 8 ) , V_NOSCALESTART | V_REDMAP | V_MONOSPACE , va ( " BUMPER: 0.%02d " , G_TicsToCentiseconds ( stplyr - > bumpertime ) ) ) ;
else
V_DrawString ( SCX ( locx ) , SCY ( locy - 8 ) , V_NOSCALESTART | V_MONOSPACE , va ( " Drill: %3d%% " , ( stplyr - > drillmeter * 100 ) / ( 96 * 20 ) ) ) ;
}
}
if ( gametype = = GT_RACE | | gametype = = GT_COMPETITION )
{
ST_drawScore ( ) ;
ST_drawTime ( ) ;
return ;
}
// Begin drawing brackets/chip display
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_nightsrings ) )
{
# endif
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 16 ) , SCY ( 8 ) , nbracket ) ;
2014-03-15 16:59:03 +00:00
if ( G_IsSpecialStage ( gamemap ) )
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 24 ) , SCY ( 8 ) + SCZ ( 8 ) , nsshud ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 24 ) , SCY ( 8 ) + SCZ ( 8 ) , nhud [ ( leveltime / 2 ) % 12 ] ) ;
2014-03-15 16:59:03 +00:00
if ( G_IsSpecialStage ( gamemap ) )
{
INT32 i ;
total_ringcount = 0 ;
for ( i = 0 ; i < MAXPLAYERS ; i + + )
2017-02-18 18:39:25 +00:00
if ( playeringame [ i ] & & players [ i ] . pflags & PF_NIGHTSMODE & & players [ i ] . health )
2014-03-15 16:59:03 +00:00
total_ringcount + = players [ i ] . health - 1 ;
}
else
total_ringcount = stplyr - > health - 1 ;
if ( stplyr - > capsule )
{
INT32 amount ;
const INT32 length = 88 ;
origamount = stplyr - > capsule - > spawnpoint - > angle ;
I_Assert ( origamount > 0 ) ; // should not happen now
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 72 ) , SCY ( 8 ) , nbracket ) ;
ST_DrawOverlayPatch ( SCX ( 74 ) , SCY ( 8 ) + SCZ ( 4 ) , minicaps ) ;
2014-03-15 16:59:03 +00:00
if ( stplyr - > capsule - > reactiontime ! = 0 )
{
INT32 r ;
const INT32 orblength = 20 ;
for ( r = 0 ; r < 5 ; r + + )
{
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 230 - ( 7 * r ) ) , SCY ( 144 ) , redstat ) ;
ST_DrawOverlayPatch ( SCX ( 188 - ( 7 * r ) ) , SCY ( 144 ) , orngstat ) ;
ST_DrawOverlayPatch ( SCX ( 146 - ( 7 * r ) ) , SCY ( 144 ) , yelstat ) ;
ST_DrawOverlayPatch ( SCX ( 104 - ( 7 * r ) ) , SCY ( 144 ) , byelstat ) ;
2014-03-15 16:59:03 +00:00
}
amount = ( origamount - stplyr - > capsule - > health ) ;
amount = ( amount * orblength ) / origamount ;
if ( amount > 0 )
{
INT32 t ;
// Fill up the bar with blue orbs... in reverse! (yuck)
for ( r = amount ; r > 0 ; r - - )
{
t = r ;
if ( r > 15 ) + + t ;
if ( r > 10 ) + + t ;
if ( r > 5 ) + + t ;
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 69 + ( 7 * t ) ) , SCY ( 144 ) , bluestat ) ;
2014-03-15 16:59:03 +00:00
}
}
}
else
{
INT32 cfill ;
// Lil' white box!
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 15 , STRINGY ( 8 ) + 34 , V_SNAPTOLEFT | V_SNAPTOTOP | V_HUDTRANS , capsulebar ) ;
2014-03-15 16:59:03 +00:00
amount = ( origamount - stplyr - > capsule - > health ) ;
amount = ( amount * length ) / origamount ;
for ( cfill = 0 ; cfill < amount & & cfill < 88 ; + + cfill )
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 15 + cfill + 1 , STRINGY ( 8 ) + 35 , V_SNAPTOLEFT | V_SNAPTOTOP | V_HUDTRANS , capsulefill ) ;
2014-03-15 16:59:03 +00:00
}
if ( total_ringcount > = stplyr - > capsule - > health )
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 40 ) , SCY ( 8 ) + SCZ ( 5 ) , nredar [ leveltime % 8 ] ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 40 ) , SCY ( 8 ) + SCZ ( 5 ) , narrow [ ( leveltime / 2 ) % 8 ] ) ;
2014-03-15 16:59:03 +00:00
}
else
2014-03-21 18:42:55 +00:00
ST_DrawOverlayPatch ( SCX ( 40 ) , SCY ( 8 ) + SCZ ( 5 ) , narrow [ 8 ] ) ;
2014-03-15 16:59:03 +00:00
if ( total_ringcount > = 100 )
2014-03-21 18:42:55 +00:00
ST_DrawOverlayNum ( ( total_ringcount > = 1000 ) ? SCX ( 76 ) : SCX ( 72 ) , SCY ( 8 ) + SCZ ( 11 ) , total_ringcount ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
ST_DrawOverlayNum ( SCX ( 68 ) , SCY ( 8 ) + SCZ ( 11 ) , total_ringcount ) ;
2014-03-15 16:59:03 +00:00
# ifdef HAVE_BLUA
}
# endif
// Score
if ( ! stplyr - > exiting
# ifdef HAVE_BLUA
& & LUA_HudEnabled ( hud_nightsscore )
# endif
)
2014-03-25 02:17:59 +00:00
{
2018-07-02 12:20:04 +00:00
ST_DrawNightsOverlayNum ( 304 , STRINGY ( 16 ) , SPLITFLAGS ( V_SNAPTOTOP ) | V_SNAPTORIGHT , stplyr - > marescore , nightsnum , SKINCOLOR_STEEL ) ;
2014-03-25 02:17:59 +00:00
}
if ( ! stplyr - > exiting
# ifdef HAVE_BLUA
// TODO give this its own section for Lua
& & LUA_HudEnabled ( hud_nightsscore )
# endif
)
{
if ( modeattacking = = ATTACKING_NIGHTS )
{
INT32 maretime = max ( stplyr - > realtime - stplyr - > marebegunat , 0 ) ;
2014-11-12 00:55:07 +00:00
fixed_t cornerx = vid . width , cornery = vid . height - SCZ ( 20 ) ;
2014-03-25 02:17:59 +00:00
2014-11-12 00:55:07 +00:00
# define ASSISHHUDFIX(n) (n*vid.dupx)
ST_DrawOverlayPatch ( cornerx - ASSISHHUDFIX ( 22 ) , cornery , W_CachePatchName ( " NGRTIMER " , PU_HUDGFX ) ) ;
ST_DrawPaddedOverlayNum ( cornerx - ASSISHHUDFIX ( 22 ) , cornery , G_TicsToCentiseconds ( maretime ) , 2 ) ;
ST_DrawOverlayPatch ( cornerx - ASSISHHUDFIX ( 46 ) , cornery , sboperiod ) ;
2014-03-25 02:17:59 +00:00
if ( maretime < 60 * TICRATE )
2014-11-12 00:55:07 +00:00
ST_DrawOverlayNum ( cornerx - ASSISHHUDFIX ( 46 ) , cornery , G_TicsToSeconds ( maretime ) ) ;
2014-03-25 02:17:59 +00:00
else
{
2014-11-12 00:55:07 +00:00
ST_DrawPaddedOverlayNum ( cornerx - ASSISHHUDFIX ( 46 ) , cornery , G_TicsToSeconds ( maretime ) , 2 ) ;
ST_DrawOverlayPatch ( cornerx - ASSISHHUDFIX ( 70 ) , cornery , sbocolon ) ;
ST_DrawOverlayNum ( cornerx - ASSISHHUDFIX ( 70 ) , cornery , G_TicsToMinutes ( maretime , true ) ) ;
2014-03-25 02:17:59 +00:00
}
}
2014-11-12 00:55:07 +00:00
# undef ASSISHHUDFIX
2014-03-25 02:17:59 +00:00
}
2014-03-15 16:59:03 +00:00
// Ideya time remaining
if ( ! stplyr - > exiting & & stplyr - > nightstime > 0
# ifdef HAVE_BLUA
& & LUA_HudEnabled ( hud_nightstime )
# endif
)
{
INT32 realnightstime = stplyr - > nightstime / TICRATE ;
INT32 numbersize ;
if ( G_IsSpecialStage ( gamemap ) )
{
tic_t lowest_time = stplyr - > nightstime ;
INT32 i ;
for ( i = 0 ; i < MAXPLAYERS ; i + + )
if ( playeringame [ i ] & & players [ i ] . pflags & PF_NIGHTSMODE & & players [ i ] . nightstime < lowest_time )
lowest_time = players [ i ] . nightstime ;
realnightstime = lowest_time / TICRATE ;
}
if ( stplyr - > powers [ pw_flashing ] > TICRATE ) // was hit
{
UINT16 flashingLeft = stplyr - > powers [ pw_flashing ] - ( TICRATE ) ;
if ( flashingLeft < TICRATE / 2 ) // Start fading out
{
UINT32 fadingFlag = ( 9 - 9 * flashingLeft / ( TICRATE / 2 ) ) < < V_ALPHASHIFT ;
V_DrawTranslucentPatch ( SCX ( 160 - ( minus5sec - > width / 2 ) ) , SCY ( 28 ) , V_NOSCALESTART | fadingFlag , minus5sec ) ;
}
else
V_DrawScaledPatch ( SCX ( 160 - ( minus5sec - > width / 2 ) ) , SCY ( 28 ) , V_NOSCALESTART , minus5sec ) ;
}
if ( realnightstime < 10 )
2014-11-12 00:55:07 +00:00
numbersize = 16 / 2 ;
2014-03-15 16:59:03 +00:00
else if ( realnightstime < 100 )
2014-11-12 00:55:07 +00:00
numbersize = 32 / 2 ;
2014-03-15 16:59:03 +00:00
else
2014-11-12 00:55:07 +00:00
numbersize = 48 / 2 ;
2014-03-15 16:59:03 +00:00
if ( realnightstime < 10 )
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 160 + numbersize , STRINGY ( 12 ) , SPLITFLAGS ( V_SNAPTOTOP ) , realnightstime ,
2014-03-15 16:59:03 +00:00
nightsnum , SKINCOLOR_RED ) ;
else
2014-11-12 00:55:07 +00:00
ST_DrawNightsOverlayNum ( 160 + numbersize , STRINGY ( 12 ) , SPLITFLAGS ( V_SNAPTOTOP ) , realnightstime ,
2014-03-15 16:59:03 +00:00
nightsnum , SKINCOLOR_SUPER4 ) ;
// Show exact time in debug
if ( cv_debug & DBG_NIGHTSBASIC )
2014-11-12 00:55:07 +00:00
V_DrawString ( 160 + numbersize + 8 , 24 , V_SNAPTOTOP | ( ( realnightstime < 10 ) ? V_REDMAP : V_YELLOWMAP ) , va ( " %02d " , G_TicsToCentiseconds ( stplyr - > nightstime ) ) ) ;
2014-03-15 16:59:03 +00:00
}
// Show pickup durations
if ( cv_debug & DBG_NIGHTSBASIC )
{
UINT16 pwr ;
if ( stplyr - > powers [ pw_nights_superloop ] )
{
pwr = stplyr - > powers [ pw_nights_superloop ] ;
V_DrawSmallScaledPatch ( SCX ( 110 ) , SCY ( 44 ) , V_NOSCALESTART , W_CachePatchName ( " NPRUA0 " , PU_CACHE ) ) ;
V_DrawThinString ( SCX ( 106 ) , SCY ( 52 ) , V_NOSCALESTART | V_MONOSPACE , va ( " %2d.%02d " , pwr / TICRATE , G_TicsToCentiseconds ( pwr ) ) ) ;
}
if ( stplyr - > powers [ pw_nights_helper ] )
{
pwr = stplyr - > powers [ pw_nights_helper ] ;
V_DrawSmallScaledPatch ( SCX ( 150 ) , SCY ( 44 ) , V_NOSCALESTART , W_CachePatchName ( " NPRUC0 " , PU_CACHE ) ) ;
V_DrawThinString ( SCX ( 146 ) , SCY ( 52 ) , V_NOSCALESTART | V_MONOSPACE , va ( " %2d.%02d " , pwr / TICRATE , G_TicsToCentiseconds ( pwr ) ) ) ;
}
if ( stplyr - > powers [ pw_nights_linkfreeze ] )
{
pwr = stplyr - > powers [ pw_nights_linkfreeze ] ;
V_DrawSmallScaledPatch ( SCX ( 190 ) , SCY ( 44 ) , V_NOSCALESTART , W_CachePatchName ( " NPRUE0 " , PU_CACHE ) ) ;
V_DrawThinString ( SCX ( 186 ) , SCY ( 52 ) , V_NOSCALESTART | V_MONOSPACE , va ( " %2d.%02d " , pwr / TICRATE , G_TicsToCentiseconds ( pwr ) ) ) ;
}
}
// Records/extra text
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_nightsrecords ) )
# endif
ST_drawNightsRecords ( ) ;
2017-12-19 01:59:04 +00:00
splitscreen = nosshack ;
2014-03-15 16:59:03 +00:00
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-03-04 22:13:19 +00:00
/*
2014-03-15 16:59:03 +00:00
static void ST_drawWeaponRing ( powertype_t weapon , INT32 rwflag , INT32 wepflag , INT32 xoffs , patch_t * pat )
{
2014-03-21 18:42:55 +00:00
INT32 txtflags = 0 , patflags = 0 ;
2014-03-15 16:59:03 +00:00
if ( stplyr - > powers [ weapon ] )
{
if ( stplyr - > powers [ weapon ] > = rw_maximums [ wepflag ] )
2014-03-21 18:42:55 +00:00
txtflags | = V_YELLOWMAP ;
2014-03-15 16:59:03 +00:00
if ( weapon = = pw_infinityring
| | ( stplyr - > ringweapons & rwflag & & stplyr - > health > 1 ) )
2014-03-21 18:42:55 +00:00
txtflags | = V_20TRANS ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
{
txtflags | = V_TRANSLUCENT ;
patflags = V_80TRANS ;
}
V_DrawScaledPatch ( 8 + xoffs , STRINGY ( 162 ) , V_SNAPTOLEFT | patflags , pat ) ;
2014-03-15 16:59:03 +00:00
if ( stplyr - > powers [ weapon ] > 99 )
2014-03-21 18:42:55 +00:00
V_DrawThinString ( 8 + xoffs + 1 , STRINGY ( 162 ) , V_SNAPTOLEFT | txtflags , va ( " %d " , stplyr - > powers [ weapon ] ) ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawString ( 8 + xoffs , STRINGY ( 162 ) , V_SNAPTOLEFT | txtflags , va ( " %d " , stplyr - > powers [ weapon ] ) ) ;
2014-03-15 16:59:03 +00:00
if ( stplyr - > currentweapon = = wepflag )
V_DrawScaledPatch ( 6 + xoffs , STRINGY ( 162 - ( splitscreen ? 4 : 2 ) ) , V_SNAPTOLEFT , curweapon ) ;
}
else if ( stplyr - > ringweapons & rwflag )
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 8 + xoffs , STRINGY ( 162 ) , V_SNAPTOLEFT | V_TRANSLUCENT , pat ) ;
2014-03-15 16:59:03 +00:00
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
static void ST_drawMatchHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
INT32 offset = ( BASEVIDWIDTH / 2 ) - ( NUM_WEAPONS * 10 ) ;
2018-02-08 22:13:06 +00:00
if ( ! G_BattleGametype ( ) )
2014-03-15 16:59:03 +00:00
return ;
if ( G_TagGametype ( ) & & ! ( stplyr - > pflags & PF_TAGIT ) )
return ;
2016-08-18 23:06:12 +00:00
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_weaponrings ) ) {
# endif
2014-03-15 16:59:03 +00:00
if ( stplyr - > powers [ pw_infinityring ] )
ST_drawWeaponRing ( pw_infinityring , 0 , 0 , offset , infinityring ) ;
else if ( stplyr - > health > 1 )
V_DrawScaledPatch ( 8 + offset , STRINGY ( 162 ) , V_SNAPTOLEFT , normring ) ;
else
V_DrawTranslucentPatch ( 8 + offset , STRINGY ( 162 ) , V_SNAPTOLEFT | V_80TRANS , normring ) ;
if ( ! stplyr - > currentweapon )
V_DrawScaledPatch ( 6 + offset , STRINGY ( 162 - ( splitscreen ? 4 : 2 ) ) , V_SNAPTOLEFT , curweapon ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_automaticring , RW_AUTO , WEP_AUTO , offset , autoring ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_bouncering , RW_BOUNCE , WEP_BOUNCE , offset , bouncering ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_scatterring , RW_SCATTER , WEP_SCATTER , offset , scatterring ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_grenadering , RW_GRENADE , WEP_GRENADE , offset , grenadering ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_explosionring , RW_EXPLODE , WEP_EXPLODE , offset , explosionring ) ;
offset + = 20 ;
ST_drawWeaponRing ( pw_railring , RW_RAIL , WEP_RAIL , offset , railring ) ;
2016-08-18 23:06:12 +00:00
# ifdef HAVE_BLUA
}
if ( LUA_HudEnabled ( hud_powerstones ) ) {
# endif
2014-03-15 16:59:03 +00:00
// Power Stones collected
offset = 136 ; // Used for Y now
if ( stplyr - > powers [ pw_emeralds ] & EMERALD1 )
V_DrawScaledPatch ( 28 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 0 ] ) ;
offset + = 8 ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD2 )
V_DrawScaledPatch ( 40 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 1 ] ) ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD6 )
V_DrawScaledPatch ( 16 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 5 ] ) ;
offset + = 16 ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD3 )
V_DrawScaledPatch ( 40 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 2 ] ) ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD5 )
V_DrawScaledPatch ( 16 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 4 ] ) ;
offset + = 8 ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD4 )
V_DrawScaledPatch ( 28 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 3 ] ) ;
offset - = 16 ;
if ( stplyr - > powers [ pw_emeralds ] & EMERALD7 )
V_DrawScaledPatch ( 28 , STRINGY ( offset ) , V_SNAPTOLEFT , tinyemeraldpics [ 6 ] ) ;
2016-08-18 23:06:12 +00:00
# ifdef HAVE_BLUA
}
# endif
2014-03-15 16:59:03 +00:00
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
2019-01-03 01:02:03 +00:00
/*
static inline void ST_drawRaceHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
2018-06-25 02:15:22 +00:00
if ( leveltime > starttime - ( 3 * TICRATE ) & & leveltime < = starttime - ( 2 * TICRATE ) )
2014-03-15 16:59:03 +00:00
V_DrawScaledPatch ( SCX ( ( BASEVIDWIDTH - SHORT ( race3 - > width ) ) / 2 ) , ( INT32 ) ( SCY ( BASEVIDHEIGHT / 2 ) ) , V_NOSCALESTART , race3 ) ;
2018-06-25 02:15:22 +00:00
else if ( leveltime > starttime - ( 2 * TICRATE ) & & leveltime < = starttime - TICRATE )
2014-03-15 16:59:03 +00:00
V_DrawScaledPatch ( SCX ( ( BASEVIDWIDTH - SHORT ( race2 - > width ) ) / 2 ) , ( INT32 ) ( SCY ( BASEVIDHEIGHT / 2 ) ) , V_NOSCALESTART , race2 ) ;
2018-06-25 02:15:22 +00:00
else if ( leveltime > starttime - TICRATE & & leveltime < = starttime )
2014-03-15 16:59:03 +00:00
V_DrawScaledPatch ( SCX ( ( BASEVIDWIDTH - SHORT ( race1 - > width ) ) / 2 ) , ( INT32 ) ( SCY ( BASEVIDHEIGHT / 2 ) ) , V_NOSCALESTART , race1 ) ;
2018-06-25 02:15:22 +00:00
else if ( leveltime > starttime & & leveltime < = starttime + TICRATE )
2014-03-15 16:59:03 +00:00
V_DrawScaledPatch ( SCX ( ( BASEVIDWIDTH - SHORT ( racego - > width ) ) / 2 ) , ( INT32 ) ( SCY ( BASEVIDHEIGHT / 2 ) ) , V_NOSCALESTART , racego ) ;
if ( circuitmap )
{
if ( stplyr - > exiting )
V_DrawString ( hudinfo [ HUD_LAP ] . x , STRINGY ( hudinfo [ HUD_LAP ] . y ) , V_YELLOWMAP , " FINISHED! " ) ;
else
V_DrawString ( hudinfo [ HUD_LAP ] . x , STRINGY ( hudinfo [ HUD_LAP ] . y ) , 0 , va ( " Lap: %u/%d " , stplyr - > laps + 1 , cv_numlaps . value ) ) ;
}
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
static void ST_drawTagHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
char pstime [ 33 ] = " " ;
char pstext [ 33 ] = " " ;
// Figure out what we're going to print.
if ( leveltime < hidetime * TICRATE ) //during the hide time, the seeker and hiders have different messages on their HUD.
{
if ( hidetime )
sprintf ( pstime , " %d " , ( hidetime - leveltime / TICRATE ) ) ; //hide time is in seconds, not tics.
if ( stplyr - > pflags & PF_TAGIT & & ! stplyr - > spectator )
sprintf ( pstext , " %s " , M_GetText ( " WAITING FOR PLAYERS TO HIDE... " ) ) ;
else
{
if ( ! stplyr - > spectator ) //spectators get a generic HUD message rather than a gametype specific one.
{
if ( gametype = = GT_HIDEANDSEEK ) //hide and seek.
sprintf ( pstext , " %s " , M_GetText ( " HIDE BEFORE TIME RUNS OUT! " ) ) ;
else //default
sprintf ( pstext , " %s " , M_GetText ( " FLEE BEFORE YOU ARE HUNTED! " ) ) ;
}
else
sprintf ( pstext , " %s " , M_GetText ( " HIDE TIME REMAINING: " ) ) ;
}
}
else
{
if ( cv_timelimit . value & & timelimitintics > = leveltime )
sprintf ( pstime , " %d " , ( timelimitintics - leveltime ) / TICRATE ) ;
if ( stplyr - > pflags & PF_TAGIT )
sprintf ( pstext , " %s " , M_GetText ( " YOU'RE IT! " ) ) ;
else
{
if ( cv_timelimit . value )
sprintf ( pstext , " %s " , M_GetText ( " TIME REMAINING: " ) ) ;
else //Since having no hud message in tag is not characteristic:
sprintf ( pstext , " %s " , M_GetText ( " NO TIME LIMIT " ) ) ;
}
}
// Print the stuff.
if ( pstext [ 0 ] )
{
if ( splitscreen )
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 168 ) , 0 , pstext ) ;
else
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 184 ) , 0 , pstext ) ;
}
if ( pstime [ 0 ] )
{
if ( splitscreen )
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 184 ) , 0 , pstime ) ;
else
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 192 ) , 0 , pstime ) ;
}
}
2017-02-18 18:39:25 +00:00
static void ST_drawCTFHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
INT32 i ;
UINT16 whichflag = 0 ;
// Draw the flags
2014-03-21 18:42:55 +00:00
V_DrawSmallScaledPatch ( 256 , ( splitscreen ) ? STRINGY ( 160 ) : STRINGY ( 176 ) , V_HUDTRANS , rflagico ) ;
V_DrawSmallScaledPatch ( 288 , ( splitscreen ) ? STRINGY ( 160 ) : STRINGY ( 176 ) , V_HUDTRANS , bflagico ) ;
2014-03-15 16:59:03 +00:00
for ( i = 0 ; i < MAXPLAYERS ; i + + )
{
if ( players [ i ] . gotflag & GF_REDFLAG ) // Red flag isn't at base
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 256 , ( splitscreen ) ? STRINGY ( 156 ) : STRINGY ( 174 ) , V_HUDTRANS , nonicon ) ;
2014-03-15 16:59:03 +00:00
else if ( players [ i ] . gotflag & GF_BLUEFLAG ) // Blue flag isn't at base
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 288 , ( splitscreen ) ? STRINGY ( 156 ) : STRINGY ( 174 ) , V_HUDTRANS , nonicon ) ;
2014-03-15 16:59:03 +00:00
whichflag | = players [ i ] . gotflag ;
if ( ( whichflag & ( GF_REDFLAG | GF_BLUEFLAG ) ) = = ( GF_REDFLAG | GF_BLUEFLAG ) )
break ; // both flags were found, let's stop early
}
2014-03-17 12:13:16 +00:00
// YOU have a flag. Display a monitor-like icon for it.
if ( stplyr - > gotflag )
2014-03-15 16:59:03 +00:00
{
2014-03-17 12:13:16 +00:00
patch_t * p = ( stplyr - > gotflag & GF_REDFLAG ) ? gotrflag : gotbflag ;
if ( splitscreen )
2014-03-21 18:42:55 +00:00
V_DrawSmallScaledPatch ( 312 , STRINGY ( 24 ) + 42 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , p ) ;
2014-03-17 12:13:16 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( 304 , 24 + 84 , V_SNAPTORIGHT | V_SNAPTOTOP | V_HUDTRANS , p ) ;
2014-03-15 16:59:03 +00:00
}
// Display a countdown timer showing how much time left until the flag your team dropped returns to base.
{
char timeleft [ 33 ] ;
if ( redflag & & redflag - > fuse > 1 )
{
sprintf ( timeleft , " %u " , ( redflag - > fuse / TICRATE ) ) ;
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( 268 , STRINGY ( 184 ) , V_YELLOWMAP | V_HUDTRANS , timeleft ) ;
2014-03-15 16:59:03 +00:00
}
if ( blueflag & & blueflag - > fuse > 1 )
{
sprintf ( timeleft , " %u " , ( blueflag - > fuse / TICRATE ) ) ;
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( 300 , STRINGY ( 184 ) , V_YELLOWMAP | V_HUDTRANS , timeleft ) ;
2014-03-15 16:59:03 +00:00
}
}
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
// Draws "Red Team", "Blue Team", or "Spectator" for team gametypes.
2019-01-03 01:02:03 +00:00
/*
static inline void ST_drawTeamName ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
if ( stplyr - > ctfteam = = 1 )
2017-12-19 01:59:04 +00:00
V_DrawString ( 256 , splitscreen ? STRINGY ( 184 ) : STRINGY ( 192 ) , V_HUDTRANSHALF , " RED TEAM " ) ;
2014-03-15 16:59:03 +00:00
else if ( stplyr - > ctfteam = = 2 )
2017-12-19 01:59:04 +00:00
V_DrawString ( 248 , splitscreen ? STRINGY ( 184 ) : STRINGY ( 192 ) , V_HUDTRANSHALF , " BLUE TEAM " ) ;
2014-03-15 16:59:03 +00:00
else
2017-12-19 01:59:04 +00:00
V_DrawString ( 244 , splitscreen ? STRINGY ( 184 ) : STRINGY ( 192 ) , V_HUDTRANSHALF , " SPECTATOR " ) ;
2014-03-15 16:59:03 +00:00
}
2019-01-03 01:02:03 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
static void ST_drawSpecialStageHUD ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
if ( totalrings > 0 )
2014-03-21 18:42:55 +00:00
ST_DrawNumFromHudWS ( HUD_SS_TOTALRINGS , totalrings ) ;
2014-03-15 16:59:03 +00:00
if ( leveltime < 5 * TICRATE & & totalrings > 0 )
{
2014-03-21 18:42:55 +00:00
ST_DrawPatchFromHud ( HUD_GETRINGS , getall ) ;
ST_DrawNumFromHud ( HUD_GETRINGSNUM , totalrings ) ;
2014-03-15 16:59:03 +00:00
}
if ( sstimer )
{
2014-03-21 18:42:55 +00:00
V_DrawString ( hudinfo [ HUD_TIMELEFT ] . x , STRINGY ( hudinfo [ HUD_TIMELEFT ] . y ) , V_HUDTRANS , M_GetText ( " TIME LEFT " ) ) ;
2016-07-06 04:09:17 +00:00
ST_DrawNumFromHud ( HUD_TIMELEFTNUM , sstimer / TICRATE ) ;
2014-03-15 16:59:03 +00:00
}
else
2014-03-21 18:42:55 +00:00
ST_DrawPatchFromHud ( HUD_TIMEUP , timeup ) ;
2014-03-15 16:59:03 +00:00
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-03-04 22:13:19 +00:00
/*
2014-03-15 16:59:03 +00:00
static INT32 ST_drawEmeraldHuntIcon ( mobj_t * hunt , patch_t * * patches , INT32 offset )
{
INT32 interval , i ;
UINT32 dist = ( ( UINT32 ) P_AproxDistance ( P_AproxDistance ( stplyr - > mo - > x - hunt - > x , stplyr - > mo - > y - hunt - > y ) , stplyr - > mo - > z - hunt - > z ) ) > > FRACBITS ;
if ( dist < 128 )
{
i = 5 ;
interval = 5 ;
}
else if ( dist < 512 )
{
i = 4 ;
interval = 10 ;
}
else if ( dist < 1024 )
{
i = 3 ;
interval = 20 ;
}
else if ( dist < 2048 )
{
i = 2 ;
interval = 30 ;
}
else if ( dist < 3072 )
{
i = 1 ;
interval = 35 ;
}
else
{
i = 0 ;
interval = 0 ;
}
2014-03-21 18:42:55 +00:00
V_DrawScaledPatch ( hudinfo [ HUD_HUNTPICS ] . x + offset , STRINGY ( hudinfo [ HUD_HUNTPICS ] . y ) , V_HUDTRANS , patches [ i ] ) ;
2014-03-15 16:59:03 +00:00
return interval ;
}
2017-03-04 22:13:19 +00:00
*/
2014-03-15 16:59:03 +00:00
2017-02-18 18:39:25 +00:00
/*
2014-03-15 16:59:03 +00:00
// Separated a few things to stop the SOUND EFFECTS BLARING UGH SHUT UP AAAA
2017-02-18 18:39:25 +00:00
static void ST_doHuntIconsAndSound ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
INT32 interval = 0 , newinterval = 0 ;
if ( hunt1 & & hunt1 - > health )
interval = ST_drawEmeraldHuntIcon ( hunt1 , hunthoming , - 20 ) ;
if ( hunt2 & & hunt2 - > health )
{
newinterval = ST_drawEmeraldHuntIcon ( hunt2 , hunthoming , 0 ) ;
if ( newinterval & & ( ! interval | | newinterval < interval ) )
interval = newinterval ;
}
if ( hunt3 & & hunt3 - > health )
{
newinterval = ST_drawEmeraldHuntIcon ( hunt3 , hunthoming , 20 ) ;
if ( newinterval & & ( ! interval | | newinterval < interval ) )
interval = newinterval ;
}
2015-01-01 19:50:31 +00:00
if ( ! ( P_AutoPause ( ) | | paused ) & & interval > 0 & & leveltime & & leveltime % interval = = 0 )
2014-03-15 16:59:03 +00:00
S_StartSound ( NULL , sfx_emfind ) ;
}
2017-02-18 18:39:25 +00:00
static void ST_doItemFinderIconsAndSound ( void ) // SRB2kart - unused.
2014-03-15 16:59:03 +00:00
{
INT32 emblems [ 16 ] ;
thinker_t * th ;
mobj_t * mo2 ;
UINT8 stemblems = 0 , stunfound = 0 ;
INT32 i ;
INT32 interval = 0 , newinterval = 0 ;
INT32 soffset ;
for ( i = 0 ; i < numemblems ; + + i )
{
if ( emblemlocations [ i ] . type > ET_SKIN | | emblemlocations [ i ] . level ! = gamemap )
continue ;
emblems [ stemblems + + ] = i ;
if ( ! emblemlocations [ i ] . collected )
+ + stunfound ;
if ( stemblems > = 16 )
break ;
}
// Found all/none exist? Don't waste our time
if ( ! stunfound )
return ;
// Scan thinkers to find emblem mobj with these ids
for ( th = thinkercap . next ; th ! = & thinkercap ; th = th - > next )
{
if ( th - > function . acp1 ! = ( actionf_p1 ) P_MobjThinker )
continue ;
mo2 = ( mobj_t * ) th ;
if ( mo2 - > type = = MT_EMBLEM )
{
if ( ! ( mo2 - > flags & MF_SPECIAL ) )
continue ;
for ( i = 0 ; i < stemblems ; + + i )
{
if ( mo2 - > health = = emblems [ i ] + 1 )
{
soffset = ( i * 20 ) - ( ( stemblems - 1 ) * 10 ) ;
newinterval = ST_drawEmeraldHuntIcon ( mo2 , itemhoming , soffset ) ;
if ( newinterval & & ( ! interval | | newinterval < interval ) )
interval = newinterval ;
break ;
}
}
}
}
2015-01-01 19:50:31 +00:00
if ( ! ( P_AutoPause ( ) | | paused ) & & interval > 0 & & leveltime & & leveltime % interval = = 0 )
2014-03-15 16:59:03 +00:00
S_StartSound ( NULL , sfx_emfind ) ;
}
2017-02-18 18:39:25 +00:00
*/
2014-03-15 16:59:03 +00:00
// Draw the status bar overlay, customisable: the user chooses which
// kind of information to overlay
//
static void ST_overlayDrawer ( void )
{
2016-08-15 03:51:08 +00:00
/* SRB2kart doesn't need this stuff
2014-03-15 16:59:03 +00:00
//hu_showscores = auto hide score/time/rings when tab rankings are shown
if ( ! ( hu_showscores & & ( netgame | | multiplayer ) ) )
{
if ( maptol & TOL_NIGHTS )
ST_drawNiGHTSHUD ( ) ;
else
{
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_score ) )
# endif
ST_drawScore ( ) ;
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_time ) )
# endif
ST_drawTime ( ) ;
# ifdef HAVE_BLUA
if ( LUA_HudEnabled ( hud_rings ) )
# endif
ST_drawRings ( ) ;
if ( G_GametypeUsesLives ( )
# ifdef HAVE_BLUA
& & LUA_HudEnabled ( hud_lives )
# endif
)
ST_drawLives ( ) ;
}
}
2016-08-15 03:51:08 +00:00
*/
2014-03-15 16:59:03 +00:00
// GAME OVER pic
2018-07-22 15:16:03 +00:00
/*if (G_GametypeUsesLives() && stplyr->lives <= 0 && !(hu_showscores && (netgame || multiplayer)))
2014-03-15 16:59:03 +00:00
{
patch_t * p ;
if ( countdown = = 1 )
p = timeover ;
else
p = sboover ;
V_DrawScaledPatch ( ( BASEVIDWIDTH - SHORT ( p - > width ) ) / 2 , STRINGY ( BASEVIDHEIGHT / 2 - ( SHORT ( p - > height ) / 2 ) ) , 0 , p ) ;
2018-07-22 15:16:03 +00:00
} */
2014-03-15 16:59:03 +00:00
if ( ! hu_showscores ) // hide the following if TAB is held
{
// Countdown timer for Race Mode
Mammoth commit!
* Deaths in record attack no longer put you into a glitchy singleplayer game-over state that we somehow both kept around and also broke since we branched Kart off of Vanilla..
* Fix non-standard mapscales making the Death Egg respawn octagons dissasemble themselves.
* Allow for MULTIPLE TIME EMBLEMS PER MAP, at least in the emblem UI on the timer. It shows all completed emblems plus the uncompleted emblem up to a total of three.
* Major tweaks to the First Person HUD.
* I know this was your baby, Sal, and some of the changes may prove controversial - so I've put the ones that are likely to cause the most fuss inside an ifndef block, so that you can toggle it as you please with minimal code changes.
* Dontdraw-ness, transparency, and colorization match the player's object!
* Moves around on the screen with respect to the direction of the player object's motion, to make drifting look nicer!
* Flashes the colour of your drift sparks.
* Did a WHOLE bunch of things with respect to music. I'm not sure how to describe this, so I'll go through step-by-step.
* Countdowns now play the drowning music again.
* Removed/disabled extraenous P_RestoreMusics.
* Made map-ending music called by its own function, P_EndingMusic(player_t *player).
* Made the ending music play on the LAST player crossing the finishing line in splitscreen, rather than first.
* Make dead players spinout and clip through the floor, at least until we add the new death anims.
* Fix prior pogo spring usage making dead players fall faster.
* Make the time over countdown use the kart font when not splitscreen with 3 or 4 players.
* Removed a weird bonus HWR_DrawCroppedPatch function signature in the hardware header.
2018-07-16 19:19:30 +00:00
// ...moved to k_kart.c so we can take advantage of the LAPS_Y value
2014-03-15 16:59:03 +00:00
2016-08-15 03:51:08 +00:00
K_drawKartHUD ( ) ;
/* SRB2kart doesn't need this stuff, I think
2014-03-15 16:59:03 +00:00
// If you are in overtime, put a big honkin' flashin' message on the screen.
2018-02-08 22:13:06 +00:00
if ( G_BattleGametype ( ) & & cv_overtime . value
2014-03-15 16:59:03 +00:00
& & ( leveltime > ( timelimitintics + TICRATE / 2 ) ) & & cv_timelimit . value & & ( leveltime / TICRATE % 2 = = 0 ) )
{
if ( splitscreen )
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 168 ) , 0 , M_GetText ( " OVERTIME! " ) ) ;
else
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 184 ) , 0 , M_GetText ( " OVERTIME! " ) ) ;
}
// Draw Match-related stuff
//\note Match HUD is drawn no matter what gametype.
// ... just not if you're a spectator.
if ( ! stplyr - > spectator )
ST_drawMatchHUD ( ) ;
// Race HUD Stuff
if ( gametype = = GT_RACE | | gametype = = GT_COMPETITION )
ST_drawRaceHUD ( ) ;
// Tag HUD Stuff
else if ( gametype = = GT_TAG | | gametype = = GT_HIDEANDSEEK )
ST_drawTagHUD ( ) ;
// CTF HUD Stuff
else if ( gametype = = GT_CTF )
ST_drawCTFHUD ( ) ;
// Team names for team gametypes
if ( G_GametypeHasTeams ( ) )
ST_drawTeamName ( ) ;
// Special Stage HUD
if ( ! useNightsSS & & G_IsSpecialStage ( gamemap ) & & stplyr = = & players [ displayplayer ] )
ST_drawSpecialStageHUD ( ) ;
// Emerald Hunt Indicators
if ( cv_itemfinder . value & & M_SecretUnlocked ( SECRET_ITEMFINDER ) )
ST_doItemFinderIconsAndSound ( ) ;
else
ST_doHuntIconsAndSound ( ) ;
if ( stplyr - > powers [ pw_gravityboots ] > 3 * TICRATE | | ( stplyr - > powers [ pw_gravityboots ] & & leveltime & 1 ) )
V_DrawScaledPatch ( hudinfo [ HUD_GRAVBOOTSICO ] . x , STRINGY ( hudinfo [ HUD_GRAVBOOTSICO ] . y ) , V_SNAPTORIGHT , gravboots ) ;
2016-08-15 03:51:08 +00:00
*/
2014-03-15 16:59:03 +00:00
2019-03-25 02:32:15 +00:00
if ( ! ( multiplayer & & demo . playback ) )
2014-03-15 16:59:03 +00:00
{
2019-02-02 01:28:05 +00:00
if ( ! P_IsLocalPlayer ( stplyr ) )
{
/*char name[MAXPLAYERNAME+1];
// shorten the name if its more than twelve characters.
strlcpy ( name , player_names [ stplyr - players ] , 13 ) ; */
// Show name of player being displayed
V_DrawCenteredString ( ( BASEVIDWIDTH / 2 ) , BASEVIDHEIGHT - 40 , 0 , M_GetText ( " Viewpoint: " ) ) ;
V_DrawCenteredString ( ( BASEVIDWIDTH / 2 ) , BASEVIDHEIGHT - 32 , V_ALLOWLOWERCASE , player_names [ stplyr - players ] ) ;
}
}
2019-03-25 02:32:15 +00:00
else if ( ! demo . title )
2019-02-02 01:28:05 +00:00
{
if ( ! splitscreen )
{
V_DrawCenteredString ( ( BASEVIDWIDTH / 2 ) , BASEVIDHEIGHT - 40 , V_HUDTRANSHALF , M_GetText ( " Viewpoint: " ) ) ;
V_DrawCenteredString ( ( BASEVIDWIDTH / 2 ) , BASEVIDHEIGHT - 32 , V_HUDTRANSHALF | V_ALLOWLOWERCASE , player_names [ stplyr - players ] ) ;
}
else if ( splitscreen = = 1 )
{
char name [ MAXPLAYERNAME + 12 ] ;
2014-03-15 16:59:03 +00:00
2019-02-02 01:28:05 +00:00
INT32 y = ( stplyr = = & players [ displayplayer ] ) ? 8 : BASEVIDHEIGHT / 2 - 16 ;
2019-02-25 01:47:33 +00:00
sprintf ( name , " VIEWPOINT: %s " , player_names [ stplyr - players ] ) ;
2019-02-02 01:28:05 +00:00
V_DrawRightAlignedThinString ( BASEVIDWIDTH - 40 , y , V_HUDTRANSHALF | V_ALLOWLOWERCASE | K_calcSplitFlags ( V_SNAPTOTOP | V_SNAPTOBOTTOM | V_SNAPTORIGHT ) , name ) ;
}
else if ( splitscreen )
{
V_DrawCenteredThinString ( BASEVIDWIDTH / 4 , 4 , V_HUDTRANSHALF | V_ALLOWLOWERCASE | K_calcSplitFlags ( V_SNAPTOTOP ) , player_names [ stplyr - players ] ) ;
}
2014-03-15 16:59:03 +00:00
}
// This is where we draw all the fun cheese if you have the chasecam off!
2018-06-26 15:33:54 +00:00
/*if ((stplyr == &players[displayplayer] && !camera.chase)
2017-12-19 01:59:04 +00:00
| | ( ( splitscreen & & stplyr = = & players [ secondarydisplayplayer ] ) & & ! camera2 . chase )
| | ( ( splitscreen > 1 & & stplyr = = & players [ thirddisplayplayer ] ) & & ! camera3 . chase )
| | ( ( splitscreen > 2 & & stplyr = = & players [ fourthdisplayplayer ] ) & & ! camera4 . chase ) )
2014-03-15 16:59:03 +00:00
{
ST_drawFirstPersonHUD ( ) ;
2018-06-26 15:33:54 +00:00
} */
2014-04-14 05:14:58 +00:00
}
2014-03-15 16:59:03 +00:00
# ifdef HAVE_BLUA
2014-04-14 05:14:58 +00:00
if ( ! ( netgame | | multiplayer ) | | ! hu_showscores )
2014-03-15 16:59:03 +00:00
LUAh_GameHUD ( stplyr ) ;
# endif
// draw level title Tails
2018-07-22 15:16:03 +00:00
if ( * mapheaderinfo [ gamemap - 1 ] - > lvlttl ! = ' \0 ' & & ! ( hu_showscores & & ( netgame | | multiplayer ) & & ! mapreset )
2014-03-15 16:59:03 +00:00
# ifdef HAVE_BLUA
& & LUA_HudEnabled ( hud_stagetitle )
# endif
)
ST_drawLevelTitle ( ) ;
2018-10-02 06:23:13 +00:00
if ( ! hu_showscores & & netgame & & ! mapreset )
2014-03-15 16:59:03 +00:00
{
2018-07-22 15:16:03 +00:00
/*if (G_GametypeUsesLives() && stplyr->lives <= 0 && countdown != 1)
2018-12-03 17:12:25 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 132 ) , 0 , M_GetText ( " Press Viewpoint Key to watch a player. " ) ) ;
2014-03-15 16:59:03 +00:00
else if ( gametype = = GT_HIDEANDSEEK & &
( ! stplyr - > spectator & & ! ( stplyr - > pflags & PF_TAGIT ) ) & & ( leveltime > hidetime * TICRATE ) )
{
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 116 ) , 0 , M_GetText ( " You cannot move while hiding. " ) ) ;
2018-12-03 17:12:25 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 132 ) , 0 , M_GetText ( " Press Viewpoint Key to watch a player. " ) ) ;
2014-03-15 16:59:03 +00:00
}
2018-07-22 15:16:03 +00:00
else if ( ! G_RaceGametype ( ) & & stplyr - > playerstate = = PST_DEAD & & stplyr - > lives ) //Death overrides spectator text.
2014-03-15 16:59:03 +00:00
{
INT32 respawntime = cv_respawntime . value - stplyr - > deadtimer / TICRATE ;
if ( respawntime > 0 & & ! stplyr - > spectator )
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 132 ) , V_HUDTRANSHALF , va ( M_GetText ( " Respawn in: %d second%s. " ) , respawntime , respawntime = = 1 ? " " : " s " ) ) ;
2014-03-15 16:59:03 +00:00
else
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , STRINGY ( 132 ) , V_HUDTRANSHALF , M_GetText ( " Press Jump to respawn. " ) ) ;
2018-07-22 15:16:03 +00:00
}
else */ if ( stplyr - > spectator
2014-03-15 16:59:03 +00:00
# ifdef HAVE_BLUA
& & LUA_HudEnabled ( hud_textspectator )
# endif
)
{
2019-02-03 21:43:11 +00:00
const char * itemtxt = M_GetText ( " Item - Join Game " ) ;
if ( stplyr - > powers [ pw_flashing ] )
itemtxt = M_GetText ( " Item - . . . " ) ;
else if ( stplyr - > pflags & PF_WANTSTOJOIN )
itemtxt = M_GetText ( " Item - Cancel Join " ) ;
else if ( G_GametypeHasTeams ( ) )
itemtxt = M_GetText ( " Item - Join Team " ) ;
if ( cv_ingamecap . value )
{
UINT8 numingame = 0 ;
UINT8 i ;
for ( i = 0 ; i < MAXPLAYERS ; i + + )
if ( playeringame [ i ] & & ! players [ i ] . spectator )
numingame + + ;
itemtxt = va ( " %s (%s: %d) " , itemtxt , M_GetText ( " Slots left " ) , max ( 0 , cv_ingamecap . value - numingame ) ) ;
}
2018-01-23 03:18:57 +00:00
// SRB2kart: changed positions & text
2018-10-02 06:23:13 +00:00
if ( splitscreen )
{
INT32 splitflags = K_calcSplitFlags ( 0 ) ;
2018-10-19 19:59:13 +00:00
V_DrawThinString ( 2 , ( BASEVIDHEIGHT / 2 ) - 20 , V_YELLOWMAP | V_HUDTRANSHALF | splitflags , M_GetText ( " - SPECTATING - " ) ) ;
2019-02-03 21:43:11 +00:00
V_DrawThinString ( 2 , ( BASEVIDHEIGHT / 2 ) - 10 , V_HUDTRANSHALF | splitflags , itemtxt ) ;
2018-10-02 06:23:13 +00:00
}
2018-07-20 23:11:36 +00:00
else
2018-10-02 06:23:13 +00:00
{
2018-10-09 19:43:38 +00:00
V_DrawString ( 2 , BASEVIDHEIGHT - 40 , V_HUDTRANSHALF | V_YELLOWMAP , M_GetText ( " - SPECTATING - " ) ) ;
2019-02-03 21:43:11 +00:00
V_DrawString ( 2 , BASEVIDHEIGHT - 30 , V_HUDTRANSHALF , itemtxt ) ;
2018-10-02 06:23:13 +00:00
V_DrawString ( 2 , BASEVIDHEIGHT - 20 , V_HUDTRANSHALF , M_GetText ( " Accelerate - Float " ) ) ;
V_DrawString ( 2 , BASEVIDHEIGHT - 10 , V_HUDTRANSHALF , M_GetText ( " Brake - Sink " ) ) ;
}
2014-03-15 16:59:03 +00:00
}
}
2019-02-17 02:20:11 +00:00
// Replay manual-save stuff
2019-03-25 02:32:15 +00:00
if ( demo . recording & & multiplayer & & demo . savebutton & & demo . savebutton + 3 * TICRATE < leveltime )
2019-02-17 02:20:11 +00:00
{
2019-03-25 02:55:08 +00:00
switch ( demo . savemode )
{
case DSM_NOTSAVING :
2019-03-25 00:57:11 +00:00
V_DrawRightAlignedThinString ( BASEVIDWIDTH - 2 , 2 , V_HUDTRANS | V_SNAPTOTOP | V_SNAPTORIGHT | V_ALLOWLOWERCASE | ( G_BattleGametype ( ) ? V_REDMAP : V_SKYMAP ) , " Look Backward: Save replay " ) ;
2019-03-25 02:55:08 +00:00
break ;
case DSM_WILLAUTOSAVE :
2019-03-25 03:40:52 +00:00
V_DrawRightAlignedThinString ( BASEVIDWIDTH - 2 , 2 , V_HUDTRANS | V_SNAPTOTOP | V_SNAPTORIGHT | V_ALLOWLOWERCASE | ( G_BattleGametype ( ) ? V_REDMAP : V_SKYMAP ) , " Replay will be saved. (Look Backward: Change title) " ) ;
2019-03-25 02:55:08 +00:00
break ;
case DSM_WILLSAVE :
V_DrawRightAlignedThinString ( BASEVIDWIDTH - 2 , 2 , V_HUDTRANS | V_SNAPTOTOP | V_SNAPTORIGHT | V_ALLOWLOWERCASE | ( G_BattleGametype ( ) ? V_REDMAP : V_SKYMAP ) , " Replay will be saved. " ) ;
break ;
2019-03-25 03:40:52 +00:00
case DSM_TITLEENTRY :
ST_DrawDemoTitleEntry ( ) ;
break ;
2019-03-25 02:55:08 +00:00
default : // Don't render anything
break ;
}
2019-02-17 02:20:11 +00:00
}
2014-03-15 16:59:03 +00:00
ST_drawDebugInfo ( ) ;
}
2019-03-25 03:40:52 +00:00
void ST_DrawDemoTitleEntry ( void )
{
static UINT8 skullAnimCounter = 0 ;
char * nametodraw ;
skullAnimCounter + + ;
skullAnimCounter % = 8 ;
nametodraw = demo . titlename ;
while ( V_StringWidth ( nametodraw , 0 ) > MAXSTRINGLENGTH * 8 - 8 )
nametodraw + + ;
# define x (BASEVIDWIDTH / 2 - 139)
# define y (BASEVIDHEIGHT / 2)
M_DrawTextBox ( x , y + 4 , MAXSTRINGLENGTH , 1 ) ;
V_DrawString ( x + 8 , y + 12 , V_ALLOWLOWERCASE , nametodraw ) ;
if ( skullAnimCounter < 4 )
V_DrawCharacter ( x + 8 + V_StringWidth ( nametodraw , 0 ) , y + 12 ,
' _ ' | 0x80 , false ) ;
M_DrawTextBox ( x + 30 , y - 24 , 26 , 1 ) ;
V_DrawString ( x + 38 , y - 16 , V_ALLOWLOWERCASE , " Enter the name of the replay. " ) ;
M_DrawTextBox ( x + 50 , y + 20 , 20 , 1 ) ;
V_DrawThinString ( x + 58 , y + 28 , V_ALLOWLOWERCASE , " Escape - Cancel " ) ;
V_DrawRightAlignedThinString ( x + 220 , y + 28 , V_ALLOWLOWERCASE , " Enter - Confirm " ) ;
# undef x
# undef y
}
2018-10-24 21:55:12 +00:00
// MayonakaStatic: draw Midnight Channel's TV-like borders
static void ST_MayonakaStatic ( void )
{
INT32 flag = ( leveltime % 2 ) ? V_90TRANS : V_70TRANS ;
V_DrawFixedPatch ( 0 , 0 , FRACUNIT , V_SNAPTOTOP | V_SNAPTOLEFT | flag , hud_tv1 , NULL ) ;
V_DrawFixedPatch ( 320 < < FRACBITS , 0 , FRACUNIT , V_SNAPTOTOP | V_SNAPTORIGHT | V_FLIP | flag , hud_tv1 , NULL ) ;
V_DrawFixedPatch ( 0 , 142 < < FRACBITS , FRACUNIT , V_SNAPTOBOTTOM | V_SNAPTOLEFT | flag , hud_tv2 , NULL ) ;
V_DrawFixedPatch ( 320 < < FRACBITS , 142 < < FRACBITS , FRACUNIT , V_SNAPTOBOTTOM | V_SNAPTORIGHT | V_FLIP | flag , hud_tv2 , NULL ) ;
}
2016-07-06 04:09:17 +00:00
void ST_Drawer ( void )
2014-03-15 16:59:03 +00:00
{
# ifdef SEENAMES
2018-07-22 15:16:03 +00:00
if ( cv_seenames . value & & cv_allowseenames . value & & displayplayer = = consoleplayer & & seenplayer & & seenplayer - > mo & & ! mapreset )
2014-03-15 16:59:03 +00:00
{
if ( cv_seenames . value = = 1 )
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , BASEVIDHEIGHT / 2 + 15 , V_HUDTRANSHALF , player_names [ seenplayer - players ] ) ;
2014-03-15 16:59:03 +00:00
else if ( cv_seenames . value = = 2 )
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , BASEVIDHEIGHT / 2 + 15 , V_HUDTRANSHALF ,
2014-03-15 16:59:03 +00:00
va ( " %s%s " , G_GametypeHasTeams ( ) ? ( ( seenplayer - > ctfteam = = 1 ) ? " \x85 " : " \x84 " ) : " " , player_names [ seenplayer - players ] ) ) ;
else //if (cv_seenames.value == 3)
2014-03-21 18:42:55 +00:00
V_DrawCenteredString ( BASEVIDWIDTH / 2 , BASEVIDHEIGHT / 2 + 15 , V_HUDTRANSHALF ,
2018-02-08 22:13:06 +00:00
va ( " %s%s " , ! G_BattleGametype ( ) | | ( G_GametypeHasTeams ( ) & & players [ consoleplayer ] . ctfteam = = seenplayer - > ctfteam )
2014-03-15 16:59:03 +00:00
? " \x83 " : " \x85 " , player_names [ seenplayer - players ] ) ) ;
}
# endif
2016-07-06 04:09:17 +00:00
// Doom's status bar only updated if necessary.
// However, ours updates every frame regardless, so the "refresh" param was removed
//(void)refresh;
2014-03-15 16:59:03 +00:00
// force a set of the palette by using doPaletteStuff()
if ( vid . recalc )
st_palette = - 1 ;
// Do red-/gold-shifts from damage/items
# ifdef HWRENDER
//25/08/99: Hurdler: palette changes is done for all players,
// not only player1! That's why this part
// of code is moved somewhere else.
if ( rendermode = = render_soft )
# endif
if ( rendermode ! = render_none ) ST_doPaletteStuff ( ) ;
if ( st_overlay )
{
// No deadview!
stplyr = & players [ displayplayer ] ;
ST_overlayDrawer ( ) ;
2018-10-24 21:57:08 +00:00
2017-12-19 01:59:04 +00:00
if ( splitscreen )
2014-03-15 16:59:03 +00:00
{
stplyr = & players [ secondarydisplayplayer ] ;
ST_overlayDrawer ( ) ;
2017-12-17 06:21:24 +00:00
2017-12-19 01:59:04 +00:00
if ( splitscreen > 1 )
{
stplyr = & players [ thirddisplayplayer ] ;
ST_overlayDrawer ( ) ;
2017-12-17 06:21:24 +00:00
2017-12-19 01:59:04 +00:00
if ( splitscreen > 2 )
{
stplyr = & players [ fourthdisplayplayer ] ;
ST_overlayDrawer ( ) ;
}
}
2017-12-17 06:21:24 +00:00
}
2018-10-24 21:55:12 +00:00
// draw Midnight Channel's overlay ontop
if ( mapheaderinfo [ gamemap - 1 ] - > typeoflevel & TOL_TV ) // Very specific Midnight Channel stuff.
ST_MayonakaStatic ( ) ;
2014-03-15 16:59:03 +00:00
}
2018-10-27 19:39:41 +00:00
// Draw a white fade on level opening
2018-11-17 16:54:56 +00:00
if ( timeinmap < 15 )
2018-10-27 19:39:41 +00:00
{
2018-11-17 16:54:56 +00:00
if ( timeinmap < = 5 )
2018-10-27 19:39:41 +00:00
V_DrawFill ( 0 , 0 , BASEVIDWIDTH , BASEVIDHEIGHT , 120 ) ; // Pure white on first few frames, to hide SRB2's awful level load artifacts
else
2018-11-17 16:54:56 +00:00
V_DrawFadeScreen ( 120 , 15 - timeinmap ) ; // Then gradually fade out from there
2018-10-27 19:39:41 +00:00
}
2014-03-15 16:59:03 +00:00
}