diff --git a/polymer/eduke32/Makefile b/polymer/eduke32/Makefile
index 42cfd6d2c..032fe0416 100644
--- a/polymer/eduke32/Makefile
+++ b/polymer/eduke32/Makefile
@@ -230,7 +230,7 @@ MAPSTER32_TARGET:=$(MAPSTER32)$(EXESUFFIX)
COMMON_OBJS=rev
COMMON_EDITOR_OBJS=m32common m32def m32exec m32vars rev
-DUKE3D_OBJS=game global actors gamedef gameexec gamevars player premap sector anim animsounds common config demo input menus namesdyn net savegame rts osdfuncs osdcmds grpscan sounds soundsdyn cheats
+DUKE3D_OBJS=game global actors gamedef gameexec gamevars player premap sector anim animsounds common config demo input menus namesdyn net savegame rts osdfuncs osdcmds grpscan sounds soundsdyn cheats sbar
DUKE3D_EDITOR_OBJS=astub common grpscan sounds_mapster32
ifneq ($(USE_LIBVPX),0)
diff --git a/polymer/eduke32/Makefile.deps b/polymer/eduke32/Makefile.deps
index b37e33997..a8bab462d 100644
--- a/polymer/eduke32/Makefile.deps
+++ b/polymer/eduke32/Makefile.deps
@@ -55,6 +55,7 @@ $(DUKE3D_OBJ)/net.$o: $(DUKE3D_SRC)/net.c $(duke3d_h)
$(DUKE3D_OBJ)/player.$o: $(DUKE3D_SRC)/player.c $(duke3d_h)
$(DUKE3D_OBJ)/premap.$o: $(DUKE3D_SRC)/premap.c $(duke3d_h) $(ENGINE_INC)/osd.h
$(DUKE3D_OBJ)/savegame.$o: $(DUKE3D_SRC)/savegame.c $(duke3d_h) $(DUKE3D_SRC)/savegame.h
+$(DUKE3D_OBJ)/sbar.$o: $(DUKE3D_SRC)/sbar.c $(DUKE3D_SRC)/sbar.h
$(DUKE3D_OBJ)/sector.$o: $(DUKE3D_SRC)/sector.c $(duke3d_h) $(DUKE3D_SRC)/input.h
$(DUKE3D_OBJ)/sounds.$o: $(DUKE3D_SRC)/sounds.c $(duke3d_h)
$(DUKE3D_OBJ)/soundsdyn.$o: $(DUKE3D_SRC)/soundsdyn.c $(duke3d_h)
diff --git a/polymer/eduke32/Makefile.msvc b/polymer/eduke32/Makefile.msvc
index 867f7fe5b..7ec924a09 100644
--- a/polymer/eduke32/Makefile.msvc
+++ b/polymer/eduke32/Makefile.msvc
@@ -196,6 +196,7 @@ DUKE3D_OBJS=$(DUKE3D_OBJ)\game.$o \
$(DUKE3D_OBJ)\animsounds.$o \
$(DUKE3D_OBJ)\animvpx.$o \
$(DUKE3D_OBJ)\cheats.$o \
+ $(DUKE3D_OBJ)\sbar.$o \
$(DUKE3D_OBJ)\common.$o \
$(DUKE3D_OBJ)\demo.$o \
$(DUKE3D_OBJ)\gamedef.$o \
diff --git a/polymer/eduke32/eduke32.vcxproj b/polymer/eduke32/eduke32.vcxproj
index 4916d639d..99ff1b73a 100644
--- a/polymer/eduke32/eduke32.vcxproj
+++ b/polymer/eduke32/eduke32.vcxproj
@@ -193,6 +193,7 @@
+
@@ -341,6 +342,7 @@
+
diff --git a/polymer/eduke32/eduke32.vcxproj.filters b/polymer/eduke32/eduke32.vcxproj.filters
index e70ad1fdf..92f754425 100644
--- a/polymer/eduke32/eduke32.vcxproj.filters
+++ b/polymer/eduke32/eduke32.vcxproj.filters
@@ -513,6 +513,9 @@
eduke32\headers
+
+ eduke32\source\editor
+
@@ -899,6 +902,9 @@
eduke32\source
+
+ eduke32\source
+
diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c
index 744945f7b..d093e48a1 100644
--- a/polymer/eduke32/source/game.c
+++ b/polymer/eduke32/source/game.c
@@ -36,7 +36,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "input.h"
#include "colmatch.h"
#include "cheats.h"
-
+#include "sbar.h"
#ifdef __ANDROID__
#include "android.h"
#endif
@@ -211,49 +211,6 @@ enum gametokens
T_GLOBALGAMEFLAGS,
};
-
-static int32_t sbarsc(int32_t sc)
-{
- return scale(sc,ud.statusbarscale,100);
-}
-
-static int32_t sbarx(int32_t x)
-{
- if (ud.screen_size == 4) return sbarsc(x<<16);
- return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x<<16);
-}
-
-static int32_t sbarxr(int32_t x)
-{
- if (ud.screen_size == 4) return (320<<16) - sbarsc(x<<16);
- return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x<<16);
-}
-
-static int32_t sbary(int32_t y)
-{
- if (ud.althud == 2 && ud.screen_size == 4) return sbarsc(y << 16);
- else return (200<<16) - sbarsc(200<<16) + sbarsc(y<<16);
-}
-
-static int32_t sbarx16(int32_t x)
-{
- if (ud.screen_size == 4) return sbarsc(x);
- return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x);
-}
-
-#if 0 // enable if ever needed
-static int32_t sbarxr16(int32_t x)
-{
- if (ud.screen_size == 4) return (320<<16) - sbarsc(x);
- return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x);
-}
-#endif
-
-static int32_t sbary16(int32_t y)
-{
- return (200<<16) - sbarsc(200<<16) + sbarsc(y);
-}
-
int32_t textsc(int32_t sc)
{
// prevent ridiculousness to a degree
@@ -268,19 +225,6 @@ static int32_t gtextsc(int32_t sc)
return scale(sc,ud.textscale,400);
}
-static void G_PatchStatusBar(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
-{
- int32_t scl = sbarsc(65536);
- int32_t tx = sbarx16((160<<16) - (tilesiz[BOTTOMSTATUSBAR].x<<15)); // centered
- int32_t ty = sbary(200-tilesiz[BOTTOMSTATUSBAR].y);
-
- int32_t clx1 = sbarsc(scale(x1,xdim,320)), cly1 = sbarsc(scale(y1,ydim,200));
- int32_t clx2 = sbarsc(scale(x2,xdim,320)), cly2 = sbarsc(scale(y2,ydim,200));
- int32_t clofx = (xdim - sbarsc(xdim)) >> 1, clofy = (ydim - sbarsc(ydim));
-
- rotatesprite(tx,ty,scl,0,BOTTOMSTATUSBAR,4,0,10+16+64,clx1+clofx,cly1+clofy,clx2+clofx-1,cly2+clofy-1);
-}
-
void P_SetGamePalette(DukePlayer_t *player, uint32_t palid, int32_t set)
{
if (palid >= MAXBASEPALS)
@@ -1212,7 +1156,7 @@ int32_t G_GameTextLen(int32_t x,const char *t)
// minitext_yofs: in hud_scale-independent, (<<16)-scaled, 0-200-normalized y coords,
// (sb&ROTATESPRITE_MAX) only.
-static int32_t minitext_yofs = 0;
+int32_t minitext_yofs = 0;
int32_t minitext_lowercase = 0;
int32_t minitext_(int32_t x,int32_t y,const char *t,int32_t s,int32_t p,int32_t sb)
{
@@ -1466,941 +1410,6 @@ void G_DrawTilePalSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, in
}
#endif
-#define POLYMOSTTRANS (1)
-#define POLYMOSTTRANS2 (1|32)
-
-// Draws inventory numbers in the HUD for both the full and mini status bars.
-// yofs: in hud_scale-independent, (<<16)-scaled, 0-200-normalized y coords.
-static void G_DrawInvNum(int32_t x, int32_t yofs, int32_t y, char num1, char ha, int32_t sbits)
-{
- char dabuf[16];
- int32_t i, shd = (x < 0);
-
- const int32_t sbscale = sbarsc(65536);
- const int32_t sby = yofs+sbary(y), sbyp1 = yofs+sbary(y+1);
-
- if (shd) x = -x;
-
- Bsprintf(dabuf, "%d", num1);
-
- if (num1 > 99)
- {
- if (shd && ud.screen_size == 4 && getrendermode() >= REND_POLYMOST && althud_shadows)
- {
- for (i=0; i<=2; i++)
- rotatesprite_fs(sbarx(x+(-4+4*i)+1),sbyp1,sbscale,0,THREEBYFIVE+dabuf[i]-'0',
- 127, 4, POLYMOSTTRANS|sbits);
- }
-
- for (i=0; i<=2; i++)
- rotatesprite_fs(sbarx(x+(-4+4*i)),sby,sbscale,0,THREEBYFIVE+dabuf[i]-'0',ha, 0, sbits);
- return;
- }
-
- if (num1 > 9)
- {
- if (shd && ud.screen_size == 4 && getrendermode() >= REND_POLYMOST && althud_shadows)
- {
- rotatesprite_fs(sbarx(x+1),sbyp1,sbscale,0,THREEBYFIVE+dabuf[0]-'0',127,4,POLYMOSTTRANS|sbits);
- rotatesprite_fs(sbarx(x+4+1),sbyp1,sbscale,0,THREEBYFIVE+dabuf[1]-'0',127,4,POLYMOSTTRANS|sbits);
- }
-
- rotatesprite_fs(sbarx(x),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,sbits);
- rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,sbits);
- return;
- }
-
- rotatesprite_fs(sbarx(x+4+1),sbyp1,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,4,sbits);
- rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,sbits);
-}
-
-static void G_DrawWeapNum(int16_t ind,int32_t x,int32_t y,int32_t num1, int32_t num2,int32_t ha)
-{
- char dabuf[16];
-
- const int32_t sbscale = sbarsc(65536);
- const int32_t sby = sbary(y);
-
- rotatesprite_fs(sbarx(x-7),sby,sbscale,0,THREEBYFIVE+ind+1,ha-10,7,10);
- rotatesprite_fs(sbarx(x-3),sby,sbscale,0,THREEBYFIVE+10,ha,0,10);
-
- if (VOLUMEONE && (ind > HANDBOMB_WEAPON || ind < 0))
- {
- minitextshade(x+1,y-4,"ORDER",20,11,2+8+16+ROTATESPRITE_MAX);
- return;
- }
-
- rotatesprite_fs(sbarx(x+9),sby,sbscale,0,THREEBYFIVE+11,ha,0,10);
-
- if (num1 > 99) num1 = 99;
- if (num2 > 99) num2 = 99;
-
- Bsprintf(dabuf,"%d",num1);
- if (num1 > 9)
- {
- rotatesprite_fs(sbarx(x),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- }
- else rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
-
- Bsprintf(dabuf,"%d",num2);
- if (num2 > 9)
- {
- rotatesprite_fs(sbarx(x+13),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+17),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- return;
- }
- rotatesprite_fs(sbarx(x+13),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
-}
-
-static void G_DrawWeapNum2(char ind,int32_t x,int32_t y,int32_t num1, int32_t num2,char ha)
-{
- char dabuf[16];
-
- const int32_t sbscale = sbarsc(65536);
- const int32_t sby = sbary(y);
-
- rotatesprite_fs(sbarx(x-7),sby,sbscale,0,THREEBYFIVE+ind+1,ha-10,7,10);
- rotatesprite_fs(sbarx(x-4),sby,sbscale,0,THREEBYFIVE+10,ha,0,10);
- rotatesprite_fs(sbarx(x+13),sby,sbscale,0,THREEBYFIVE+11,ha,0,10);
-
- Bsprintf(dabuf,"%d",num1);
- if (num1 > 99)
- {
- rotatesprite_fs(sbarx(x),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+8),sby,sbscale,0,THREEBYFIVE+dabuf[2]-'0',ha,0,10);
- }
- else if (num1 > 9)
- {
- rotatesprite_fs(sbarx(x+4),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+8),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- }
- else rotatesprite_fs(sbarx(x+8),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
-
- Bsprintf(dabuf,"%d",num2);
- if (num2 > 99)
- {
- rotatesprite_fs(sbarx(x+17),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+21),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+25),sby,sbscale,0,THREEBYFIVE+dabuf[2]-'0',ha,0,10);
- }
- else if (num2 > 9)
- {
- rotatesprite_fs(sbarx(x+17),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
- rotatesprite_fs(sbarx(x+21),sby,sbscale,0,THREEBYFIVE+dabuf[1]-'0',ha,0,10);
- return;
- }
- else
- rotatesprite_fs(sbarx(x+25),sby,sbscale,0,THREEBYFIVE+dabuf[0]-'0',ha,0,10);
-}
-
-static void G_DrawWeapAmounts(const DukePlayer_t *p,int32_t x,int32_t y,int32_t u)
-{
- int32_t cw = p->curr_weapon;
-
- if (u&4)
- {
- if (u != -1) G_PatchStatusBar(88,178,88+37,178+6); //original code: (96,178,96+12,178+6);
- G_DrawWeapNum2(PISTOL_WEAPON,x,y,
- p->ammo_amount[PISTOL_WEAPON],p->max_ammo_amount[PISTOL_WEAPON],
- 12-20*(cw == PISTOL_WEAPON));
- }
- if (u&8)
- {
- if (u != -1) G_PatchStatusBar(88,184,88+37,184+6); //original code: (96,184,96+12,184+6);
- G_DrawWeapNum2(SHOTGUN_WEAPON,x,y+6,
- p->ammo_amount[SHOTGUN_WEAPON],p->max_ammo_amount[SHOTGUN_WEAPON],
- (((p->gotweapon & (1<ammo_amount[CHAINGUN_WEAPON],p->max_ammo_amount[CHAINGUN_WEAPON],
- (((p->gotweapon & (1<ammo_amount[RPG_WEAPON],p->max_ammo_amount[RPG_WEAPON],
- (((p->gotweapon & (1<ammo_amount[HANDBOMB_WEAPON],p->max_ammo_amount[HANDBOMB_WEAPON],
- (((!p->ammo_amount[HANDBOMB_WEAPON])|((p->gotweapon & (1<subweapon&(1<ammo_amount[GROW_WEAPON],p->max_ammo_amount[GROW_WEAPON],
- (((p->gotweapon & (1<ammo_amount[SHRINKER_WEAPON],p->max_ammo_amount[SHRINKER_WEAPON],
- (((p->gotweapon & (1<ammo_amount[DEVISTATOR_WEAPON],p->max_ammo_amount[DEVISTATOR_WEAPON],
- (((p->gotweapon & (1<ammo_amount[TRIPBOMB_WEAPON],p->max_ammo_amount[TRIPBOMB_WEAPON],
- (((p->gotweapon & (1<ammo_amount[FREEZE_WEAPON],p->max_ammo_amount[FREEZE_WEAPON],
- (((p->gotweapon & (1<=0; k--)
- {
- p = althud_numbertile + b[k]-'0';
- j += tilesiz[p].x+1;
- }
- c = x-(j>>1);
-
- if (rev)
- {
- for (k=0; k= REND_POLYMOST && althud_shadows)
- rotatesprite_fs(sbarxr(c+j-1),sbary(y+1),sbscale,0,p,127,4,cs|POLYMOSTTRANS2);
- rotatesprite_fs(sbarxr(c+j),sbary(y),sbscale,0,p,s,althud_numberpal,cs);
- j -= tilesiz[p].x+1;
- }
- return;
- }
-
- j = 0;
- for (k=0; k= REND_POLYMOST && althud_shadows)
- rotatesprite_fs(sbarx(c+j+1),sbary(y+1),sbscale,0,p,127,4,cs|POLYMOSTTRANS2);
- rotatesprite_fs(sbarx(c+j),sbary(y),sbscale,0,p,s,althud_numberpal,cs);
- j += tilesiz[p].x+1;
- }
-}
-
-static int32_t invensc(int32_t maximum) // used to reposition the inventory icon selector as the HUD scales
-{
- return scale(maximum << 16, ud.statusbarscale - 36, 100 - 36);
-}
-
-static void G_DrawInventory(const DukePlayer_t *p)
-{
- int32_t n, j = 0, x = 0, y;
-
- n = (p->inv_amount[GET_JETPACK] > 0)<<3;
- if (n&8) j++;
- n |= (p->inv_amount[GET_SCUBA] > 0)<<5;
- if (n&32) j++;
- n |= (p->inv_amount[GET_STEROIDS] > 0)<<1;
- if (n&2) j++;
- n |= (p->inv_amount[GET_HOLODUKE] > 0)<<2;
- if (n&4) j++;
- n |= (p->inv_amount[GET_FIRSTAID] > 0);
- if (n&1) j++;
- n |= (p->inv_amount[GET_HEATS] > 0)<<4;
- if (n&16) j++;
- n |= (p->inv_amount[GET_BOOTS] > 0)<<6;
- if (n&64) j++;
-
- x = (160-(j*11))<<16; // nearly center
-
- j = 0;
-
- if (ud.screen_size < 8) // mini-HUDs or no HUD
- {
- y = 172<<16;
-
- if (ud.screen_size == 4 && ud.althud == 1) // modern mini-HUD
- y -= invensc(tilesiz[BIGALPHANUM].y+10); // slide on the y-axis
- }
- else // full HUD
- {
- y = (200<<16) - (sbarsc(tilesiz[BOTTOMSTATUSBAR].y<<16) + (12<<16) + (tilesiz[BOTTOMSTATUSBAR].y<<(16-1)));
-
- if (!ud.statusbarmode) // original non-overlay mode
- y += sbarsc(tilesiz[BOTTOMSTATUSBAR].y<<16)>>1; // account for the viewport y-size as the HUD scales
- }
-
- if (ud.screen_size == 4 && !ud.althud) // classic mini-HUD
- x += invensc(ud.multimode > 1 ? 56 : 65); // slide on the x-axis
-
- while (j <= 9)
- {
- if (n&(1<inven_icon == j+1)
- rotatesprite_win(x-(2<<16),y+(19<<16),65536L,1024,ARROW,-32,0,2+16);
- }
-
- j++;
- }
-}
-
-void G_DrawFrags(void)
-{
- int32_t i, j = 0;
- const int32_t orient = 2+8+16+64;
-
- for (TRAVERSE_CONNECT(i))
- if (i > j)
- j = i;
-
- for (i=0; i<=(j>>2); i++)
- rotatesprite_fs(0,(8*i)<<16,65600, 0, FRAGBAR, 0,0,orient);
-
- for (TRAVERSE_CONNECT(i))
- {
- const DukePlayer_t *ps = g_player[i].ps;
- minitext(21+(73*(i&3)), 2+((i&28)<<1), g_player[i].user_name, ps->palookup, 2+8+16);
- Bsprintf(tempbuf, "%d", ps->frag-ps->fraggedself);
- minitext(17+50+(73*(i&3)), 2+((i&28)<<1), tempbuf, ps->palookup, 2+8+16);
- }
-}
-
-static int32_t G_GetInvAmount(const DukePlayer_t *p)
-{
- switch (p->inven_icon)
- {
- case ICON_FIRSTAID:
- return p->inv_amount[GET_FIRSTAID];
- case ICON_STEROIDS:
- return ((p->inv_amount[GET_STEROIDS]+3)>>2);
- case ICON_HOLODUKE:
- return ((p->inv_amount[GET_HOLODUKE]+15)/24);
- case ICON_JETPACK:
- return ((p->inv_amount[GET_JETPACK]+15)>>4);
- case ICON_HEATS:
- return p->inv_amount[GET_HEATS]/12;
- case ICON_SCUBA:
- return ((p->inv_amount[GET_SCUBA]+63)>>6);
- case ICON_BOOTS:
- return (p->inv_amount[GET_BOOTS]>>1);
- }
-
- return -1;
-}
-
-static int32_t G_GetInvOn(const DukePlayer_t *p)
-{
- switch (p->inven_icon)
- {
- case ICON_HOLODUKE:
- return p->holoduke_on;
- case ICON_JETPACK:
- return p->jetpack_on;
- case ICON_HEATS:
- return p->heat_on;
- }
-
- return 0x80000000;
-}
-
-static int32_t G_GetMorale(int32_t p_i, int32_t snum)
-{
-#if !defined LUNATIC
- return Gv_GetVarByLabel("PLR_MORALE",-1, p_i, snum);
-#else
- UNREFERENCED_PARAMETER(p_i);
- UNREFERENCED_PARAMETER(snum);
- return -1;
-#endif
-}
-
-static inline void rotatesprite_althud(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum,int8_t dashade, char dapalnum, int32_t dastat)
-{
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- rotatesprite_(sbarx(sx+1), sbary(sy+1), z, a, picnum, 127, 4, dastat + POLYMOSTTRANS2, 0, 0, 0, 0, xdim - 1, ydim - 1);
- rotatesprite_(sbarx(sx), sbary(sy), z, a, picnum, dashade, dapalnum, dastat, 0, 0, 0, 0, xdim - 1, ydim - 1);
-}
-
-static inline void rotatesprite_althudr(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat)
-{
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- rotatesprite_(sbarxr(sx + 1), sbary(sy + 1), z, a, picnum, 127, 4, dastat + POLYMOSTTRANS2, 0, 0, 0, 0, xdim - 1, ydim - 1);
- rotatesprite_(sbarxr(sx), sbary(sy), z, a, picnum, dashade, dapalnum, dastat, 0, 0, 0, 0, xdim - 1, ydim - 1);
-}
-
-static void G_DrawStatusBar(int32_t snum)
-{
- const DukePlayer_t *const p = g_player[snum].ps;
- int32_t i, j, o, u;
- int32_t permbit = 0;
-
-#ifdef SPLITSCREEN_MOD_HACKS
- const int32_t ss = g_fakeMultiMode ? 4 : ud.screen_size;
- const int32_t althud = g_fakeMultiMode ? 0 : ud.althud;
-#else
- const int32_t ss = ud.screen_size;
- const int32_t althud = ud.althud;
-#endif
-
- const int32_t SBY = (200-tilesiz[BOTTOMSTATUSBAR].y);
-
- const int32_t sb15 = sbarsc(32768), sb15h = sbarsc(49152);
- const int32_t sb16 = sbarsc(65536);
-
- static int32_t item_icons[8];
-
- if (ss < 4)
- return;
-
- if (item_icons[0] == 0)
- {
- int32_t iicons[8] = { -1, FIRSTAID_ICON, STEROIDS_ICON, HOLODUKE_ICON,
- JETPACK_ICON, HEAT_ICON, AIRTANK_ICON, BOOT_ICON };
- Bmemcpy(item_icons, iicons, sizeof(item_icons));
- }
-
- if (getrendermode() >= REND_POLYMOST) pus = NUMPAGES; // JBF 20040101: always redraw in GL
-
- if ((g_netServer || ud.multimode > 1) && ((GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR) || g_fakeMultiMode))
- {
- if (pus)
- G_DrawFrags();
- else
- {
- for (TRAVERSE_CONNECT(i))
- if (g_player[i].ps->frag != sbar.frag[i])
- {
- G_DrawFrags();
- break;
- }
-
- }
- for (TRAVERSE_CONNECT(i))
- if (i != myconnectindex)
- sbar.frag[i] = g_player[i].ps->frag;
- }
-
- if (ss == 4) //DRAW MINI STATUS BAR:
- {
- if (althud)
- {
- // ALTERNATIVE STATUS BAR
-
- int32_t hudoffset = althud == 2 ? 32 : 200;
- static int32_t ammo_sprites[MAX_WEAPONS];
-
- if (EDUKE32_PREDICT_FALSE(ammo_sprites[0] == 0))
- {
- /* this looks stupid but it lets us initialize static memory to dynamic values
- these values can be changed from the CONs with dynamic tile remapping
- but we don't want to have to recreate the values in memory every time
- the HUD is drawn */
-
- int32_t asprites[MAX_WEAPONS] = { -1, AMMO, SHOTGUNAMMO, BATTERYAMMO,
- RPGAMMO, HBOMBAMMO, CRYSTALAMMO, DEVISTATORAMMO,
- TRIPBOMBSPRITE, FREEZEAMMO+1, HBOMBAMMO, GROWAMMO
- };
- Bmemcpy(ammo_sprites, asprites, sizeof(ammo_sprites));
- }
-
-// rotatesprite_fs(sbarx(5+1),sbary(200-25+1),sb15h,0,SIXPAK,0,4,10+16+1+32);
-// rotatesprite_fs(sbarx(5),sbary(200-25),sb15h,0,SIXPAK,0,0,10+16);
- rotatesprite_althud(2,hudoffset-21,sb15h,0,COLA,0,0,10+16+256);
-
- if (sprite[p->i].pal == 1 && p->last_extra < 2)
- G_DrawAltDigiNum(40,-(hudoffset-22),1,-16,10+16+256);
- else if (!althud_flashing || p->last_extra > (p->max_player_health>>2) || totalclock&32)
- {
- int32_t s = -8;
- if (althud_flashing && p->last_extra > p->max_player_health)
- s += (sintable[(totalclock<<5)&2047]>>10);
- G_DrawAltDigiNum(40,-(hudoffset-22),p->last_extra,s,10+16+256);
- }
-
- rotatesprite_althud(62,hudoffset-25,sb15h,0,SHIELD,0,0,10+16+256);
-
- {
- int32_t lAmount = G_GetMorale(p->i, snum);
- if (lAmount == -1)
- lAmount = p->inv_amount[GET_SHIELD];
- G_DrawAltDigiNum(105,-(hudoffset-22),lAmount,-16,10+16+256);
- }
-
- if (ammo_sprites[p->curr_weapon] >= 0)
- {
- i = (tilesiz[ammo_sprites[p->curr_weapon]].y >= 50) ? 16384 : 32768;
- rotatesprite_althudr(57,hudoffset-15,sbarsc(i),0,ammo_sprites[p->curr_weapon],0,0,10+512);
- }
-
- if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON;
- else i = p->curr_weapon;
-
- if (PWEAPON(snum, p->curr_weapon, WorksLike) != KNEE_WEAPON &&
- (!althud_flashing || totalclock&32 || p->ammo_amount[i] > (p->max_ammo_amount[i]/10)))
- G_DrawAltDigiNum(-20,-(hudoffset-22),p->ammo_amount[i],-16,10+16+512);
-
- o = 102;
- permbit = 0;
-
- if (p->inven_icon)
- {
- const int32_t orient = 10+16+permbit+256;
-
- i = ((unsigned)p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
-
- if (i >= 0)
- rotatesprite_althud(231-o,hudoffset-21-2,sb16,0,i,0,0,orient);
-
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- minitextshade(292-30-o+1,hudoffset-10-3+1,"%",127,4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
- minitext(292-30-o,hudoffset-10-3,"%",6, orient+ROTATESPRITE_MAX);
-
- i = G_GetInvAmount(p);
- j = G_GetInvOn(p);
-
- G_DrawInvNum(-(284-30-o),0,hudoffset-6-3,(uint8_t)i,0,10+permbit+256);
-
- if (j > 0)
- {
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- minitextshade(288-30-o+1,hudoffset-20-3+1,"On",127,4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
- minitext(288-30-o,hudoffset-20-3,"On",0, orient+ROTATESPRITE_MAX);
- }
- else if ((uint32_t)j != 0x80000000)
- {
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- minitextshade(284-30-o+1,hudoffset-20-3+1,"Off",127,4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
- minitext(284-30-o,hudoffset-20-3,"Off",2, orient+ROTATESPRITE_MAX);
- }
-
- if (p->inven_icon >= ICON_SCUBA)
- {
- if (getrendermode() >= REND_POLYMOST && althud_shadows)
- minitextshade(284-35-o+1,hudoffset-20-3+1,"Auto",127,4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
- minitext(284-35-o,hudoffset-20-3,"Auto",2, orient+ROTATESPRITE_MAX);
- }
- }
-
- if (ud.althud == 2)
- hudoffset += 40;
-
- if (p->got_access&1) rotatesprite_althudr(39, hudoffset-43, sb15, 0, ACCESSCARD, 0, 0, 10+16+512);
- if (p->got_access&4) rotatesprite_althudr(34, hudoffset-41, sb15, 0, ACCESSCARD, 0, 23, 10+16+512);
- if (p->got_access&2) rotatesprite_althudr(29, hudoffset-39, sb15, 0, ACCESSCARD, 0, 21, 10+16+512);
- }
- else
- {
- // ORIGINAL MINI STATUS BAR
- int32_t orient = 2+8+16+256, yofssh=0;
-
-#ifdef SPLITSCREEN_MOD_HACKS
- int32_t yofs=0;
-
- if (g_fakeMultiMode)
- {
- const int32_t sidebyside = (ud.screen_size!=0);
-
- if (sidebyside && snum==1)
- {
- orient |= RS_CENTERORIGIN;
- }
- else if (!sidebyside && snum==0)
- {
- yofs = -100;
- yofssh = yofs<<16;
- }
- }
-#endif
-
- rotatesprite_fs(sbarx(5), yofssh+sbary(200-28), sb16, 0, HEALTHBOX, 0, 21, orient);
- if (p->inven_icon)
- rotatesprite_fs(sbarx(69), yofssh+sbary(200-30), sb16, 0, INVENTORYBOX, 0, 21, orient);
-
- // health
- {
- int32_t health = (sprite[p->i].pal == 1 && p->last_extra < 2) ? 1 : p->last_extra;
- G_DrawDigiNum_(20, yofssh, 200-17, health, -16, orient);
- }
-
- rotatesprite_fs(sbarx(37), yofssh+sbary(200-28), sb16, 0, AMMOBOX, 0, 21, orient);
-
- if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON)
- i = HANDBOMB_WEAPON;
- else
- i = p->curr_weapon;
- G_DrawDigiNum_(53, yofssh, 200-17, p->ammo_amount[i], -16, orient);
-
- o = 158;
- permbit = 0;
- if (p->inven_icon)
- {
-// orient |= permbit;
-
- i = ((unsigned)p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
- if (i >= 0)
- rotatesprite_fs(sbarx(231-o), yofssh+sbary(200-21), sb16, 0, i, 0, 0, orient);
-
- // scale by status bar size
- orient |= ROTATESPRITE_MAX;
-
- minitext_yofs = yofssh;
- minitext(292-30-o, 190, "%", 6, orient);
-
- i = G_GetInvAmount(p);
- j = G_GetInvOn(p);
-
- G_DrawInvNum(284-30-o, yofssh, 200-6, (uint8_t)i, 0, orient&~16);
-
- if (!WW2GI)
- {
- if (j > 0)
- minitext(288-30-o, 180, "On", 0, orient);
- else if ((uint32_t)j != 0x80000000)
- minitext(284-30-o, 180, "Off", 2, orient);
- }
-
- if (p->inven_icon >= ICON_SCUBA)
- minitext(284-35-o, 180, "Auto", 2, orient);
-
- minitext_yofs = 0;
- }
- }
-
- return;
- }
-
- //DRAW/UPDATE FULL STATUS BAR:
-
- if (pus)
- {
- pus = 0;
- u = -1;
- }
- else u = 0;
-
- if (sbar.frag[myconnectindex] != p->frag)
- {
- sbar.frag[myconnectindex] = p->frag;
- u |= 32768;
- }
- if (sbar.got_access != p->got_access)
- {
- sbar.got_access = p->got_access;
- u |= 16384;
- }
-
- if (sbar.last_extra != p->last_extra)
- {
- sbar.last_extra = p->last_extra;
- u |= 1;
- }
-
- {
- int32_t lAmount = G_GetMorale(p->i, snum);
- if (lAmount == -1)
- lAmount = p->inv_amount[GET_SHIELD];
- if (sbar.inv_amount[GET_SHIELD] != lAmount)
- {
- sbar.inv_amount[GET_SHIELD] = lAmount;
- u |= 2;
- }
- }
-
- if (sbar.curr_weapon != p->curr_weapon)
- {
- sbar.curr_weapon = p->curr_weapon;
- u |= (4+8+16+32+64+128+256+512+1024+65536L);
- }
-
- for (i=1; iammo_amount[i])
- {
- sbar.ammo_amount[i] = p->ammo_amount[i];
- if (i < 9)
- u |= ((2<gotweapon & (1<gotweapon & (1<inven_icon)
- {
- sbar.inven_icon = p->inven_icon;
- u |= (2048+4096+8192);
- }
- if (sbar.holoduke_on != p->holoduke_on)
- {
- sbar.holoduke_on = p->holoduke_on;
- u |= (4096+8192);
- }
- if (sbar.jetpack_on != p->jetpack_on)
- {
- sbar.jetpack_on = p->jetpack_on;
- u |= (4096+8192);
- }
- if (sbar.heat_on != p->heat_on)
- {
- sbar.heat_on = p->heat_on;
- u |= (4096+8192);
- }
-
- {
- static const int32_t check_items[] = {
- GET_FIRSTAID, GET_STEROIDS, GET_HOLODUKE, GET_JETPACK,
- GET_HEATS, GET_SCUBA, GET_BOOTS
- };
-
- for (i=0; i<(int32_t)sizeof(check_items)/(int32_t)sizeof(check_items[0]); i++)
- {
- int32_t item = check_items[i];
-
- if (sbar.inv_amount[item] != p->inv_amount[item])
- {
- sbar.inv_amount[item] = p->inv_amount[item];
- u |= 8192;
- }
- }
- }
-#if 0
- if (u == 0)
- return;
-#else
- // FIXME: full status bar draws rectangles in the wrong places when it's
- // updated partially.
- u = -1;
-#endif
-
- //0 - update health
- //1 - update armor
- //2 - update PISTOL_WEAPON ammo
- //3 - update SHOTGUN_WEAPON ammo
- //4 - update CHAINGUN_WEAPON ammo
- //5 - update RPG_WEAPON ammo
- //6 - update HANDBOMB_WEAPON ammo
- //7 - update SHRINKER_WEAPON ammo
- //8 - update DEVISTATOR_WEAPON ammo
- //9 - update TRIPBOMB_WEAPON ammo
- //10 - update ammo display
- //11 - update inventory icon
- //12 - update inventory on/off
- //13 - update inventory %
- //14 - update keys
- //15 - update kills
- //16 - update FREEZE_WEAPON ammo
-
- if (u == -1)
- {
- G_PatchStatusBar(0,0,320,200);
- if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR))
- rotatesprite_fs(sbarx(277+1),sbary(SBY+7-1),sb16,0,KILLSICON,0,0,10+16);
- }
-
- if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR))
- {
- if (u&32768)
- {
- if (u != -1) G_PatchStatusBar(276,SBY+17,299,SBY+17+10);
- G_DrawDigiNum(287,SBY+17,max(p->frag-p->fraggedself,0),-16,10+16);
- }
- }
- else
- {
- if (u&16384)
- {
- if (u != -1) G_PatchStatusBar(275,SBY+18,299,SBY+18+12);
- if (p->got_access&4) rotatesprite_fs(sbarx(275),sbary(SBY+16),sb16,0,ACCESS_ICON,0,23,10+16);
- if (p->got_access&2) rotatesprite_fs(sbarx(288),sbary(SBY+16),sb16,0,ACCESS_ICON,0,21,10+16);
- if (p->got_access&1) rotatesprite_fs(sbarx(281),sbary(SBY+23),sb16,0,ACCESS_ICON,0,0,10+16);
- }
- }
-
- if (u&(4+8+16+32+64+128+256+512+65536L))
- G_DrawWeapAmounts(p,96,SBY+16,u);
-
- if (u&1)
- {
- if (u != -1) G_PatchStatusBar(20,SBY+17,43,SBY+17+11);
- if (sprite[p->i].pal == 1 && p->last_extra < 2)
- G_DrawDigiNum(32,SBY+17,1,-16,10+16);
- else G_DrawDigiNum(32,SBY+17,p->last_extra,-16,10+16);
- }
- if (u&2)
- {
- int32_t lAmount = G_GetMorale(p->i, snum);
-
- if (u != -1)
- G_PatchStatusBar(52,SBY+17,75,SBY+17+11);
-
- if (lAmount == -1)
- G_DrawDigiNum(64,SBY+17,p->inv_amount[GET_SHIELD],-16,10+16);
- else
- G_DrawDigiNum(64,SBY+17,lAmount,-16,10+16);
- }
-
- if (u&1024)
- {
- if (u != -1) G_PatchStatusBar(196,SBY+17,219,SBY+17+11);
- if (PWEAPON(snum, p->curr_weapon, WorksLike) != KNEE_WEAPON)
- {
- if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON;
- else i = p->curr_weapon;
- G_DrawDigiNum(230-22,SBY+17,p->ammo_amount[i],-16,10+16);
- }
- }
-
- if (u&(2048+4096+8192))
- {
- if (u != -1)
- {
- if (u&(2048+4096))
- G_PatchStatusBar(231,SBY+13,265,SBY+13+18);
- else
- G_PatchStatusBar(250,SBY+24,261,SBY+24+6);
- }
-
- if (p->inven_icon)
- {
- o = 0;
-// permbit = 128;
-
- if (u&(2048+4096))
- {
- i = ((unsigned)p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
- // XXX: i < 0?
- rotatesprite_fs(sbarx(231-o),sbary(SBY+13),sb16,0,i,0,0,10+16+permbit);
- minitext(292-30-o,SBY+24,"%",6,10+16+permbit + ROTATESPRITE_MAX);
- if (p->inven_icon >= ICON_SCUBA) minitext(284-35-o,SBY+14,"Auto",2,10+16+permbit + ROTATESPRITE_MAX);
- }
-
- if (u&(2048+4096) && !WW2GI)
- {
- j = G_GetInvOn(p);
-
- if (j > 0) minitext(288-30-o,SBY+14,"On",0,10+16+permbit + ROTATESPRITE_MAX);
- else if ((uint32_t)j != 0x80000000) minitext(284-30-o,SBY+14,"Off",2,10+16+permbit + ROTATESPRITE_MAX);
- }
-
- if (u&8192)
- {
- i = G_GetInvAmount(p);
- G_DrawInvNum(284-30-o,0,SBY+28,(uint8_t)i,0,10+permbit);
- }
- }
- }
-}
-
#define LOW_FPS 30
#if defined GEKKO
@@ -4002,133 +3011,6 @@ static int32_t G_DoThirdPerson(const DukePlayer_t *pp, vec3_t *vect, int16_t *vs
return 0;
}
-//REPLACE FULLY
-void G_DrawBackground(void)
-{
- const int32_t dapicnum = BIGHOLE;
- int32_t x,y,x1,x2;
-
- flushperms();
-
- int32_t y1=0, y2=ydim;
-
- if ((g_player[myconnectindex].ps->gm&MODE_GAME) || ud.recstat == 2)
- {
- if (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR)
- {
- if ((g_netServer || ud.multimode > 1)) y1 += scale(ydim,8,200);
- if (ud.multimode > 4) y1 += scale(ydim,8,200);
- }
- }
- else
- {
- const int32_t MENUTILE = MENUSCREEN;//(getrendermode() == REND_CLASSIC ? MENUSCREEN : LOADSCREEN);
- const int32_t fstilep = tilesiz[MENUTILE].x>=320 && tilesiz[MENUTILE].y==200;
- int32_t bgtile = (fstilep ? MENUTILE : BIGHOLE);
-
- clearallviews(0);
-
- // when not rendering a game, fullscreen wipe
-// Gv_SetVar(g_iReturnVarID,tilesizx[MENUTILE]==320&&tilesizy[MENUTILE]==200?MENUTILE:BIGHOLE, -1, -1);
- bgtile = VM_OnEventWithReturn(EVENT_GETMENUTILE, -1, myconnectindex, bgtile);
- // MENU_TILE: is the menu tile tileable?
-#if !defined LUNATIC
- if (Gv_GetVarByLabel("MENU_TILE", !fstilep, -1, -1))
-#else
- if (!fstilep)
-#endif
- {
- if ((unsigned)bgtile < MAXTILES)
- for (y=y1; y 8)
- {
- // across top
- for (y=0; y= 8 && ud.statusbarmode == 0)
- {
- // when not rendering a game, fullscreen wipe
- x2 = (xdim - sbarsc((int32_t)(ydim*1.333333333333333333f))) >> 1;
- for (y=y2-y2%tilesiz[dapicnum].y; y>1; x+=tilesiz[dapicnum].x)
- {
- rotatesprite(x<<16,y<<16,65536L,0,dapicnum,8,0,8+16+64,0,y2,x2,ydim-1);
- rotatesprite((xdim-x)<<16,y<<16,65536L,0,dapicnum,8,0,8+16+64,xdim-x2-1,y2,xdim-1,ydim-1);
- }
-
- }
-
- if (ud.screen_size > 8)
- {
- y = 0;
- if (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR)
- {
- if ((g_netServer || ud.multimode > 1)) y += 8;
- if (ud.multimode > 4) y += 8;
- }
-
- x1 = max(windowx1-4,0);
- y1 = max(windowy1-4,y);
- x2 = min(windowx2+4,xdim-1);
- y2 = min(windowy2+4,scale(ydim,200-sbarsc(tilesiz[BOTTOMSTATUSBAR].y),200)-1);
-
- for (y=y1+4; y> 1) + sbarsc(x<<16);
+}
+
+static int32_t sbarxr(int32_t x)
+{
+ if (ud.screen_size == 4) return (320<<16) - sbarsc(x<<16);
+ return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x<<16);
+}
+
+static int32_t sbary(int32_t y)
+{
+ if (ud.althud == 2 && ud.screen_size == 4) return sbarsc(y << 16);
+ else return (200<<16) - sbarsc(200<<16) + sbarsc(y<<16);
+}
+
+int32_t sbarx16(int32_t x)
+{
+ if (ud.screen_size == 4) return sbarsc(x);
+ return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x);
+}
+
+#if 0 // enable if ever needed
+static int32_t sbarxr16(int32_t x)
+{
+ if (ud.screen_size == 4) return (320<<16) - sbarsc(x);
+ return (((320<<16) - sbarsc(320<<16)) >> 1) + sbarsc(x);
+}
+#endif
+
+int32_t sbary16(int32_t y)
+{
+ return (200<<16) - sbarsc(200<<16) + sbarsc(y);
+}
+
+static void G_PatchStatusBar(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
+{
+ int32_t scl = sbarsc(65536);
+ int32_t tx = sbarx16((160<<16) - (tilesiz[BOTTOMSTATUSBAR].x<<15)); // centered
+ int32_t ty = sbary(200-tilesiz[BOTTOMSTATUSBAR].y);
+
+ int32_t clx1 = sbarsc(scale(x1, xdim, 320)), cly1 = sbarsc(scale(y1, ydim, 200));
+ int32_t clx2 = sbarsc(scale(x2, xdim, 320)), cly2 = sbarsc(scale(y2, ydim, 200));
+ int32_t clofx = (xdim - sbarsc(xdim)) >> 1, clofy = (ydim - sbarsc(ydim));
+
+ rotatesprite(tx, ty, scl, 0, BOTTOMSTATUSBAR, 4, 0, 10+16+64, clx1+clofx, cly1+clofy, clx2+clofx-1, cly2+clofy-1);
+}
+
+#define POLYMOSTTRANS (1)
+#define POLYMOSTTRANS2 (1|32)
+
+// Draws inventory numbers in the HUD for both the full and mini status bars.
+// yofs: in hud_scale-independent, (<<16)-scaled, 0-200-normalized y coords.
+static void G_DrawInvNum(int32_t x, int32_t yofs, int32_t y, char num1, char ha, int32_t sbits)
+{
+ char dabuf[16];
+ int32_t i, shd = (x < 0);
+
+ const int32_t sbscale = sbarsc(65536);
+ const int32_t sby = yofs+sbary(y), sbyp1 = yofs+sbary(y+1);
+
+ if (shd) x = -x;
+
+ Bsprintf(dabuf, "%d", num1);
+
+ if (num1 > 99)
+ {
+ if (shd && ud.screen_size == 4 && getrendermode() >= REND_POLYMOST && althud_shadows)
+ {
+ for (i=0; i<=2; i++)
+ rotatesprite_fs(sbarx(x+(-4+4*i)+1), sbyp1, sbscale, 0, THREEBYFIVE+dabuf[i]-'0',
+ 127, 4, POLYMOSTTRANS|sbits);
+ }
+
+ for (i=0; i<=2; i++)
+ rotatesprite_fs(sbarx(x+(-4+4*i)), sby, sbscale, 0, THREEBYFIVE+dabuf[i]-'0', ha, 0, sbits);
+ return;
+ }
+
+ if (num1 > 9)
+ {
+ if (shd && ud.screen_size == 4 && getrendermode() >= REND_POLYMOST && althud_shadows)
+ {
+ rotatesprite_fs(sbarx(x+1), sbyp1, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', 127, 4, POLYMOSTTRANS|sbits);
+ rotatesprite_fs(sbarx(x+4+1), sbyp1, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', 127, 4, POLYMOSTTRANS|sbits);
+ }
+
+ rotatesprite_fs(sbarx(x), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, sbits);
+ rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, sbits);
+ return;
+ }
+
+ rotatesprite_fs(sbarx(x+4+1), sbyp1, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 4, sbits);
+ rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, sbits);
+}
+
+static void G_DrawWeapNum(int16_t ind, int32_t x, int32_t y, int32_t num1, int32_t num2, int32_t ha)
+{
+ char dabuf[16];
+
+ const int32_t sbscale = sbarsc(65536);
+ const int32_t sby = sbary(y);
+
+ rotatesprite_fs(sbarx(x-7), sby, sbscale, 0, THREEBYFIVE+ind+1, ha-10, 7, 10);
+ rotatesprite_fs(sbarx(x-3), sby, sbscale, 0, THREEBYFIVE+10, ha, 0, 10);
+
+ if (VOLUMEONE && (ind > HANDBOMB_WEAPON || ind < 0))
+ {
+ minitextshade(x+1, y-4, "ORDER", 20, 11, 2+8+16+ROTATESPRITE_MAX);
+ return;
+ }
+
+ rotatesprite_fs(sbarx(x+9), sby, sbscale, 0, THREEBYFIVE+11, ha, 0, 10);
+
+ if (num1 > 99) num1 = 99;
+ if (num2 > 99) num2 = 99;
+
+ Bsprintf(dabuf, "%d", num1);
+ if (num1 > 9)
+ {
+ rotatesprite_fs(sbarx(x), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ }
+ else rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+
+ Bsprintf(dabuf, "%d", num2);
+ if (num2 > 9)
+ {
+ rotatesprite_fs(sbarx(x+13), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+17), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ return;
+ }
+ rotatesprite_fs(sbarx(x+13), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+}
+
+static void G_DrawWeapNum2(char ind, int32_t x, int32_t y, int32_t num1, int32_t num2, char ha)
+{
+ char dabuf[16];
+
+ const int32_t sbscale = sbarsc(65536);
+ const int32_t sby = sbary(y);
+
+ rotatesprite_fs(sbarx(x-7), sby, sbscale, 0, THREEBYFIVE+ind+1, ha-10, 7, 10);
+ rotatesprite_fs(sbarx(x-4), sby, sbscale, 0, THREEBYFIVE+10, ha, 0, 10);
+ rotatesprite_fs(sbarx(x+13), sby, sbscale, 0, THREEBYFIVE+11, ha, 0, 10);
+
+ Bsprintf(dabuf, "%d", num1);
+ if (num1 > 99)
+ {
+ rotatesprite_fs(sbarx(x), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+8), sby, sbscale, 0, THREEBYFIVE+dabuf[2]-'0', ha, 0, 10);
+ }
+ else if (num1 > 9)
+ {
+ rotatesprite_fs(sbarx(x+4), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+8), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ }
+ else rotatesprite_fs(sbarx(x+8), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+
+ Bsprintf(dabuf, "%d", num2);
+ if (num2 > 99)
+ {
+ rotatesprite_fs(sbarx(x+17), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+21), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+25), sby, sbscale, 0, THREEBYFIVE+dabuf[2]-'0', ha, 0, 10);
+ }
+ else if (num2 > 9)
+ {
+ rotatesprite_fs(sbarx(x+17), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+ rotatesprite_fs(sbarx(x+21), sby, sbscale, 0, THREEBYFIVE+dabuf[1]-'0', ha, 0, 10);
+ return;
+ }
+ else
+ rotatesprite_fs(sbarx(x+25), sby, sbscale, 0, THREEBYFIVE+dabuf[0]-'0', ha, 0, 10);
+}
+
+static void G_DrawWeapAmounts(const DukePlayer_t *p, int32_t x, int32_t y, int32_t u)
+{
+ int32_t cw = p->curr_weapon;
+
+ if (u&4)
+ {
+ if (u != -1) G_PatchStatusBar(88, 178, 88+37, 178+6); //original code: (96,178,96+12,178+6);
+ G_DrawWeapNum2(PISTOL_WEAPON, x, y,
+ p->ammo_amount[PISTOL_WEAPON], p->max_ammo_amount[PISTOL_WEAPON],
+ 12-20*(cw == PISTOL_WEAPON));
+ }
+ if (u&8)
+ {
+ if (u != -1) G_PatchStatusBar(88, 184, 88+37, 184+6); //original code: (96,184,96+12,184+6);
+ G_DrawWeapNum2(SHOTGUN_WEAPON, x, y+6,
+ p->ammo_amount[SHOTGUN_WEAPON], p->max_ammo_amount[SHOTGUN_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[CHAINGUN_WEAPON], p->max_ammo_amount[CHAINGUN_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[RPG_WEAPON], p->max_ammo_amount[RPG_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[HANDBOMB_WEAPON], p->max_ammo_amount[HANDBOMB_WEAPON],
+ (((!p->ammo_amount[HANDBOMB_WEAPON])|((p->gotweapon & (1<subweapon&(1<ammo_amount[GROW_WEAPON], p->max_ammo_amount[GROW_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[SHRINKER_WEAPON], p->max_ammo_amount[SHRINKER_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[DEVISTATOR_WEAPON], p->max_ammo_amount[DEVISTATOR_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[TRIPBOMB_WEAPON], p->max_ammo_amount[TRIPBOMB_WEAPON],
+ (((p->gotweapon & (1<ammo_amount[FREEZE_WEAPON], p->max_ammo_amount[FREEZE_WEAPON],
+ (((p->gotweapon & (1<=0; k--)
+ {
+ p = althud_numbertile + b[k]-'0';
+ j += tilesiz[p].x+1;
+ }
+ c = x-(j>>1);
+
+ if (rev)
+ {
+ for (k=0; k= REND_POLYMOST && althud_shadows)
+ rotatesprite_fs(sbarxr(c+j-1), sbary(y+1), sbscale, 0, p, 127, 4, cs|POLYMOSTTRANS2);
+ rotatesprite_fs(sbarxr(c+j), sbary(y), sbscale, 0, p, s, althud_numberpal, cs);
+ j -= tilesiz[p].x+1;
+ }
+ return;
+ }
+
+ j = 0;
+ for (k=0; k= REND_POLYMOST && althud_shadows)
+ rotatesprite_fs(sbarx(c+j+1), sbary(y+1), sbscale, 0, p, 127, 4, cs|POLYMOSTTRANS2);
+ rotatesprite_fs(sbarx(c+j), sbary(y), sbscale, 0, p, s, althud_numberpal, cs);
+ j += tilesiz[p].x+1;
+ }
+}
+
+static int32_t invensc(int32_t maximum) // used to reposition the inventory icon selector as the HUD scales
+{
+ return scale(maximum << 16, ud.statusbarscale - 36, 100 - 36);
+}
+
+void G_DrawInventory(const DukePlayer_t *p)
+{
+ int32_t n, j = 0, x = 0, y;
+
+ n = (p->inv_amount[GET_JETPACK] > 0)<<3;
+ if (n&8) j++;
+ n |= (p->inv_amount[GET_SCUBA] > 0)<<5;
+ if (n&32) j++;
+ n |= (p->inv_amount[GET_STEROIDS] > 0)<<1;
+ if (n&2) j++;
+ n |= (p->inv_amount[GET_HOLODUKE] > 0)<<2;
+ if (n&4) j++;
+ n |= (p->inv_amount[GET_FIRSTAID] > 0);
+ if (n&1) j++;
+ n |= (p->inv_amount[GET_HEATS] > 0)<<4;
+ if (n&16) j++;
+ n |= (p->inv_amount[GET_BOOTS] > 0)<<6;
+ if (n&64) j++;
+
+ x = (160-(j*11))<<16; // nearly center
+
+ j = 0;
+
+ if (ud.screen_size < 8) // mini-HUDs or no HUD
+ {
+ y = 172<<16;
+
+ if (ud.screen_size == 4 && ud.althud == 1) // modern mini-HUD
+ y -= invensc(tilesiz[BIGALPHANUM].y+10); // slide on the y-axis
+ }
+ else // full HUD
+ {
+ y = (200<<16) - (sbarsc(tilesiz[BOTTOMSTATUSBAR].y<<16) + (12<<16) + (tilesiz[BOTTOMSTATUSBAR].y<<(16-1)));
+
+ if (!ud.statusbarmode) // original non-overlay mode
+ y += sbarsc(tilesiz[BOTTOMSTATUSBAR].y<<16)>>1; // account for the viewport y-size as the HUD scales
+ }
+
+ if (ud.screen_size == 4 && !ud.althud) // classic mini-HUD
+ x += invensc(ud.multimode > 1 ? 56 : 65); // slide on the x-axis
+
+ while (j <= 9)
+ {
+ if (n&(1<inven_icon == j+1)
+ rotatesprite_win(x-(2<<16), y+(19<<16), 65536L, 1024, ARROW, -32, 0, 2+16);
+ }
+
+ j++;
+ }
+}
+
+void G_DrawFrags(void)
+{
+ int32_t i, j = 0;
+ const int32_t orient = 2+8+16+64;
+
+ for (TRAVERSE_CONNECT(i))
+ if (i > j)
+ j = i;
+
+ for (i=0; i<=(j>>2); i++)
+ rotatesprite_fs(0, (8*i)<<16, 65600, 0, FRAGBAR, 0, 0, orient);
+
+ for (TRAVERSE_CONNECT(i))
+ {
+ const DukePlayer_t *ps = g_player[i].ps;
+ minitext(21+(73*(i&3)), 2+((i&28)<<1), g_player[i].user_name, ps->palookup, 2+8+16);
+ Bsprintf(tempbuf, "%d", ps->frag-ps->fraggedself);
+ minitext(17+50+(73*(i&3)), 2+((i&28)<<1), tempbuf, ps->palookup, 2+8+16);
+ }
+}
+
+static int32_t G_GetInvAmount(const DukePlayer_t *p)
+{
+ switch (p->inven_icon)
+ {
+ case ICON_FIRSTAID:
+ return p->inv_amount[GET_FIRSTAID];
+ case ICON_STEROIDS:
+ return ((p->inv_amount[GET_STEROIDS]+3)>>2);
+ case ICON_HOLODUKE:
+ return ((p->inv_amount[GET_HOLODUKE]+15)/24);
+ case ICON_JETPACK:
+ return ((p->inv_amount[GET_JETPACK]+15)>>4);
+ case ICON_HEATS:
+ return p->inv_amount[GET_HEATS]/12;
+ case ICON_SCUBA:
+ return ((p->inv_amount[GET_SCUBA]+63)>>6);
+ case ICON_BOOTS:
+ return (p->inv_amount[GET_BOOTS]>>1);
+ }
+
+ return -1;
+}
+
+static int32_t G_GetInvOn(const DukePlayer_t *p)
+{
+ switch (p->inven_icon)
+ {
+ case ICON_HOLODUKE:
+ return p->holoduke_on;
+ case ICON_JETPACK:
+ return p->jetpack_on;
+ case ICON_HEATS:
+ return p->heat_on;
+ }
+
+ return 0x80000000;
+}
+
+static int32_t G_GetMorale(int32_t p_i, int32_t snum)
+{
+#if !defined LUNATIC
+ return Gv_GetVarByLabel("PLR_MORALE", -1, p_i, snum);
+#else
+ UNREFERENCED_PARAMETER(p_i);
+ UNREFERENCED_PARAMETER(snum);
+ return -1;
+#endif
+}
+
+static inline void rotatesprite_althud(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat)
+{
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ rotatesprite_(sbarx(sx+1), sbary(sy+1), z, a, picnum, 127, 4, dastat + POLYMOSTTRANS2, 0, 0, 0, 0, xdim - 1, ydim - 1);
+ rotatesprite_(sbarx(sx), sbary(sy), z, a, picnum, dashade, dapalnum, dastat, 0, 0, 0, 0, xdim - 1, ydim - 1);
+}
+
+static inline void rotatesprite_althudr(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat)
+{
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ rotatesprite_(sbarxr(sx + 1), sbary(sy + 1), z, a, picnum, 127, 4, dastat + POLYMOSTTRANS2, 0, 0, 0, 0, xdim - 1, ydim - 1);
+ rotatesprite_(sbarxr(sx), sbary(sy), z, a, picnum, dashade, dapalnum, dastat, 0, 0, 0, 0, xdim - 1, ydim - 1);
+}
+
+void G_DrawStatusBar(int32_t snum)
+{
+ const DukePlayer_t *const p = g_player[snum].ps;
+ int32_t i, j, o, u;
+ int32_t permbit = 0;
+
+#ifdef SPLITSCREEN_MOD_HACKS
+ const int32_t ss = g_fakeMultiMode ? 4 : ud.screen_size;
+ const int32_t althud = g_fakeMultiMode ? 0 : ud.althud;
+#else
+ const int32_t ss = ud.screen_size;
+ const int32_t althud = ud.althud;
+#endif
+
+ const int32_t SBY = (200-tilesiz[BOTTOMSTATUSBAR].y);
+
+ const int32_t sb15 = sbarsc(32768), sb15h = sbarsc(49152);
+ const int32_t sb16 = sbarsc(65536);
+
+ static int32_t item_icons[8];
+
+ if (ss < 4)
+ return;
+
+ if (item_icons[0] == 0)
+ {
+ int32_t iicons[8] ={ -1, FIRSTAID_ICON, STEROIDS_ICON, HOLODUKE_ICON,
+ JETPACK_ICON, HEAT_ICON, AIRTANK_ICON, BOOT_ICON };
+ Bmemcpy(item_icons, iicons, sizeof(item_icons));
+ }
+
+ if (getrendermode() >= REND_POLYMOST) pus = NUMPAGES; // JBF 20040101: always redraw in GL
+
+ if ((g_netServer || ud.multimode > 1) && ((GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR) || g_fakeMultiMode))
+ {
+ if (pus)
+ G_DrawFrags();
+ else
+ {
+ for (TRAVERSE_CONNECT(i))
+ if (g_player[i].ps->frag != sbar.frag[i])
+ {
+ G_DrawFrags();
+ break;
+ }
+
+ }
+ for (TRAVERSE_CONNECT(i))
+ if (i != myconnectindex)
+ sbar.frag[i] = g_player[i].ps->frag;
+ }
+
+ if (ss == 4) //DRAW MINI STATUS BAR:
+ {
+ if (althud)
+ {
+ // ALTERNATIVE STATUS BAR
+
+ int32_t hudoffset = althud == 2 ? 32 : 200;
+ static int32_t ammo_sprites[MAX_WEAPONS];
+
+ if (EDUKE32_PREDICT_FALSE(ammo_sprites[0] == 0))
+ {
+ /* this looks stupid but it lets us initialize static memory to dynamic values
+ these values can be changed from the CONs with dynamic tile remapping
+ but we don't want to have to recreate the values in memory every time
+ the HUD is drawn */
+
+ int32_t asprites[MAX_WEAPONS] ={ -1, AMMO, SHOTGUNAMMO, BATTERYAMMO,
+ RPGAMMO, HBOMBAMMO, CRYSTALAMMO, DEVISTATORAMMO,
+ TRIPBOMBSPRITE, FREEZEAMMO+1, HBOMBAMMO, GROWAMMO
+ };
+ Bmemcpy(ammo_sprites, asprites, sizeof(ammo_sprites));
+ }
+
+ // rotatesprite_fs(sbarx(5+1),sbary(200-25+1),sb15h,0,SIXPAK,0,4,10+16+1+32);
+ // rotatesprite_fs(sbarx(5),sbary(200-25),sb15h,0,SIXPAK,0,0,10+16);
+ rotatesprite_althud(2, hudoffset-21, sb15h, 0, COLA, 0, 0, 10+16+256);
+
+ if (sprite[p->i].pal == 1 && p->last_extra < 2)
+ G_DrawAltDigiNum(40, -(hudoffset-22), 1, -16, 10+16+256);
+ else if (!althud_flashing || p->last_extra >(p->max_player_health>>2) || totalclock&32)
+ {
+ int32_t s = -8;
+ if (althud_flashing && p->last_extra > p->max_player_health)
+ s += (sintable[(totalclock<<5)&2047]>>10);
+ G_DrawAltDigiNum(40, -(hudoffset-22), p->last_extra, s, 10+16+256);
+ }
+
+ rotatesprite_althud(62, hudoffset-25, sb15h, 0, SHIELD, 0, 0, 10+16+256);
+
+ {
+ int32_t lAmount = G_GetMorale(p->i, snum);
+ if (lAmount == -1)
+ lAmount = p->inv_amount[GET_SHIELD];
+ G_DrawAltDigiNum(105, -(hudoffset-22), lAmount, -16, 10+16+256);
+ }
+
+ if (ammo_sprites[p->curr_weapon] >= 0)
+ {
+ i = (tilesiz[ammo_sprites[p->curr_weapon]].y >= 50) ? 16384 : 32768;
+ rotatesprite_althudr(57, hudoffset-15, sbarsc(i), 0, ammo_sprites[p->curr_weapon], 0, 0, 10+512);
+ }
+
+ if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON;
+ else i = p->curr_weapon;
+
+ if (PWEAPON(snum, p->curr_weapon, WorksLike) != KNEE_WEAPON &&
+ (!althud_flashing || totalclock&32 || p->ammo_amount[i] > (p->max_ammo_amount[i]/10)))
+ G_DrawAltDigiNum(-20, -(hudoffset-22), p->ammo_amount[i], -16, 10+16+512);
+
+ o = 102;
+ permbit = 0;
+
+ if (p->inven_icon)
+ {
+ const int32_t orient = 10+16+permbit+256;
+
+ i = ((unsigned) p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
+
+ if (i >= 0)
+ rotatesprite_althud(231-o, hudoffset-21-2, sb16, 0, i, 0, 0, orient);
+
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ minitextshade(292-30-o+1, hudoffset-10-3+1, "%", 127, 4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
+ minitext(292-30-o, hudoffset-10-3, "%", 6, orient+ROTATESPRITE_MAX);
+
+ i = G_GetInvAmount(p);
+ j = G_GetInvOn(p);
+
+ G_DrawInvNum(-(284-30-o), 0, hudoffset-6-3, (uint8_t) i, 0, 10+permbit+256);
+
+ if (j > 0)
+ {
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ minitextshade(288-30-o+1, hudoffset-20-3+1, "On", 127, 4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
+ minitext(288-30-o, hudoffset-20-3, "On", 0, orient+ROTATESPRITE_MAX);
+ }
+ else if ((uint32_t) j != 0x80000000)
+ {
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ minitextshade(284-30-o+1, hudoffset-20-3+1, "Off", 127, 4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
+ minitext(284-30-o, hudoffset-20-3, "Off", 2, orient+ROTATESPRITE_MAX);
+ }
+
+ if (p->inven_icon >= ICON_SCUBA)
+ {
+ if (getrendermode() >= REND_POLYMOST && althud_shadows)
+ minitextshade(284-35-o+1, hudoffset-20-3+1, "Auto", 127, 4, POLYMOSTTRANS+orient+ROTATESPRITE_MAX);
+ minitext(284-35-o, hudoffset-20-3, "Auto", 2, orient+ROTATESPRITE_MAX);
+ }
+ }
+
+ if (ud.althud == 2)
+ hudoffset += 40;
+
+ if (p->got_access&1) rotatesprite_althudr(39, hudoffset-43, sb15, 0, ACCESSCARD, 0, 0, 10+16+512);
+ if (p->got_access&4) rotatesprite_althudr(34, hudoffset-41, sb15, 0, ACCESSCARD, 0, 23, 10+16+512);
+ if (p->got_access&2) rotatesprite_althudr(29, hudoffset-39, sb15, 0, ACCESSCARD, 0, 21, 10+16+512);
+ }
+ else
+ {
+ // ORIGINAL MINI STATUS BAR
+ int32_t orient = 2+8+16+256, yofssh=0;
+
+#ifdef SPLITSCREEN_MOD_HACKS
+ int32_t yofs=0;
+
+ if (g_fakeMultiMode)
+ {
+ const int32_t sidebyside = (ud.screen_size!=0);
+
+ if (sidebyside && snum==1)
+ {
+ orient |= RS_CENTERORIGIN;
+ }
+ else if (!sidebyside && snum==0)
+ {
+ yofs = -100;
+ yofssh = yofs<<16;
+ }
+ }
+#endif
+
+ rotatesprite_fs(sbarx(5), yofssh+sbary(200-28), sb16, 0, HEALTHBOX, 0, 21, orient);
+ if (p->inven_icon)
+ rotatesprite_fs(sbarx(69), yofssh+sbary(200-30), sb16, 0, INVENTORYBOX, 0, 21, orient);
+
+ // health
+ {
+ int32_t health = (sprite[p->i].pal == 1 && p->last_extra < 2) ? 1 : p->last_extra;
+ G_DrawDigiNum_(20, yofssh, 200-17, health, -16, orient);
+ }
+
+ rotatesprite_fs(sbarx(37), yofssh+sbary(200-28), sb16, 0, AMMOBOX, 0, 21, orient);
+
+ if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON)
+ i = HANDBOMB_WEAPON;
+ else
+ i = p->curr_weapon;
+ G_DrawDigiNum_(53, yofssh, 200-17, p->ammo_amount[i], -16, orient);
+
+ o = 158;
+ permbit = 0;
+ if (p->inven_icon)
+ {
+ // orient |= permbit;
+
+ i = ((unsigned) p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
+ if (i >= 0)
+ rotatesprite_fs(sbarx(231-o), yofssh+sbary(200-21), sb16, 0, i, 0, 0, orient);
+
+ // scale by status bar size
+ orient |= ROTATESPRITE_MAX;
+
+ minitext_yofs = yofssh;
+ minitext(292-30-o, 190, "%", 6, orient);
+
+ i = G_GetInvAmount(p);
+ j = G_GetInvOn(p);
+
+ G_DrawInvNum(284-30-o, yofssh, 200-6, (uint8_t) i, 0, orient&~16);
+
+ if (!WW2GI)
+ {
+ if (j > 0)
+ minitext(288-30-o, 180, "On", 0, orient);
+ else if ((uint32_t) j != 0x80000000)
+ minitext(284-30-o, 180, "Off", 2, orient);
+ }
+
+ if (p->inven_icon >= ICON_SCUBA)
+ minitext(284-35-o, 180, "Auto", 2, orient);
+
+ minitext_yofs = 0;
+ }
+ }
+
+ return;
+ }
+
+ //DRAW/UPDATE FULL STATUS BAR:
+
+ if (pus)
+ {
+ pus = 0;
+ u = -1;
+ }
+ else u = 0;
+
+ if (sbar.frag[myconnectindex] != p->frag)
+ {
+ sbar.frag[myconnectindex] = p->frag;
+ u |= 32768;
+ }
+ if (sbar.got_access != p->got_access)
+ {
+ sbar.got_access = p->got_access;
+ u |= 16384;
+ }
+
+ if (sbar.last_extra != p->last_extra)
+ {
+ sbar.last_extra = p->last_extra;
+ u |= 1;
+ }
+
+ {
+ int32_t lAmount = G_GetMorale(p->i, snum);
+ if (lAmount == -1)
+ lAmount = p->inv_amount[GET_SHIELD];
+ if (sbar.inv_amount[GET_SHIELD] != lAmount)
+ {
+ sbar.inv_amount[GET_SHIELD] = lAmount;
+ u |= 2;
+ }
+ }
+
+ if (sbar.curr_weapon != p->curr_weapon)
+ {
+ sbar.curr_weapon = p->curr_weapon;
+ u |= (4+8+16+32+64+128+256+512+1024+65536L);
+ }
+
+ for (i=1; iammo_amount[i])
+ {
+ sbar.ammo_amount[i] = p->ammo_amount[i];
+ if (i < 9)
+ u |= ((2<gotweapon & (1<gotweapon & (1<inven_icon)
+ {
+ sbar.inven_icon = p->inven_icon;
+ u |= (2048+4096+8192);
+ }
+ if (sbar.holoduke_on != p->holoduke_on)
+ {
+ sbar.holoduke_on = p->holoduke_on;
+ u |= (4096+8192);
+ }
+ if (sbar.jetpack_on != p->jetpack_on)
+ {
+ sbar.jetpack_on = p->jetpack_on;
+ u |= (4096+8192);
+ }
+ if (sbar.heat_on != p->heat_on)
+ {
+ sbar.heat_on = p->heat_on;
+ u |= (4096+8192);
+ }
+
+ {
+ static const int32_t check_items [] ={
+ GET_FIRSTAID, GET_STEROIDS, GET_HOLODUKE, GET_JETPACK,
+ GET_HEATS, GET_SCUBA, GET_BOOTS
+ };
+
+ for (i=0; i<(int32_t)sizeof(check_items)/(int32_t)sizeof(check_items[0]); i++)
+ {
+ int32_t item = check_items[i];
+
+ if (sbar.inv_amount[item] != p->inv_amount[item])
+ {
+ sbar.inv_amount[item] = p->inv_amount[item];
+ u |= 8192;
+ }
+ }
+ }
+#if 0
+ if (u == 0)
+ return;
+#else
+ // FIXME: full status bar draws rectangles in the wrong places when it's
+ // updated partially.
+ u = -1;
+#endif
+
+ //0 - update health
+ //1 - update armor
+ //2 - update PISTOL_WEAPON ammo
+ //3 - update SHOTGUN_WEAPON ammo
+ //4 - update CHAINGUN_WEAPON ammo
+ //5 - update RPG_WEAPON ammo
+ //6 - update HANDBOMB_WEAPON ammo
+ //7 - update SHRINKER_WEAPON ammo
+ //8 - update DEVISTATOR_WEAPON ammo
+ //9 - update TRIPBOMB_WEAPON ammo
+ //10 - update ammo display
+ //11 - update inventory icon
+ //12 - update inventory on/off
+ //13 - update inventory %
+ //14 - update keys
+ //15 - update kills
+ //16 - update FREEZE_WEAPON ammo
+
+ if (u == -1)
+ {
+ G_PatchStatusBar(0, 0, 320, 200);
+ if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR))
+ rotatesprite_fs(sbarx(277+1), sbary(SBY+7-1), sb16, 0, KILLSICON, 0, 0, 10+16);
+ }
+
+ if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR))
+ {
+ if (u&32768)
+ {
+ if (u != -1) G_PatchStatusBar(276, SBY+17, 299, SBY+17+10);
+ G_DrawDigiNum(287, SBY+17, max(p->frag-p->fraggedself, 0), -16, 10+16);
+ }
+ }
+ else
+ {
+ if (u&16384)
+ {
+ if (u != -1) G_PatchStatusBar(275, SBY+18, 299, SBY+18+12);
+ if (p->got_access&4) rotatesprite_fs(sbarx(275), sbary(SBY+16), sb16, 0, ACCESS_ICON, 0, 23, 10+16);
+ if (p->got_access&2) rotatesprite_fs(sbarx(288), sbary(SBY+16), sb16, 0, ACCESS_ICON, 0, 21, 10+16);
+ if (p->got_access&1) rotatesprite_fs(sbarx(281), sbary(SBY+23), sb16, 0, ACCESS_ICON, 0, 0, 10+16);
+ }
+ }
+
+ if (u&(4+8+16+32+64+128+256+512+65536L))
+ G_DrawWeapAmounts(p, 96, SBY+16, u);
+
+ if (u&1)
+ {
+ if (u != -1) G_PatchStatusBar(20, SBY+17, 43, SBY+17+11);
+ if (sprite[p->i].pal == 1 && p->last_extra < 2)
+ G_DrawDigiNum(32, SBY+17, 1, -16, 10+16);
+ else G_DrawDigiNum(32, SBY+17, p->last_extra, -16, 10+16);
+ }
+ if (u&2)
+ {
+ int32_t lAmount = G_GetMorale(p->i, snum);
+
+ if (u != -1)
+ G_PatchStatusBar(52, SBY+17, 75, SBY+17+11);
+
+ if (lAmount == -1)
+ G_DrawDigiNum(64, SBY+17, p->inv_amount[GET_SHIELD], -16, 10+16);
+ else
+ G_DrawDigiNum(64, SBY+17, lAmount, -16, 10+16);
+ }
+
+ if (u&1024)
+ {
+ if (u != -1) G_PatchStatusBar(196, SBY+17, 219, SBY+17+11);
+ if (PWEAPON(snum, p->curr_weapon, WorksLike) != KNEE_WEAPON)
+ {
+ if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON;
+ else i = p->curr_weapon;
+ G_DrawDigiNum(230-22, SBY+17, p->ammo_amount[i], -16, 10+16);
+ }
+ }
+
+ if (u&(2048+4096+8192))
+ {
+ if (u != -1)
+ {
+ if (u&(2048+4096))
+ G_PatchStatusBar(231, SBY+13, 265, SBY+13+18);
+ else
+ G_PatchStatusBar(250, SBY+24, 261, SBY+24+6);
+ }
+
+ if (p->inven_icon)
+ {
+ o = 0;
+ // permbit = 128;
+
+ if (u&(2048+4096))
+ {
+ i = ((unsigned) p->inven_icon < ICON_MAX) ? item_icons[p->inven_icon] : -1;
+ // XXX: i < 0?
+ rotatesprite_fs(sbarx(231-o), sbary(SBY+13), sb16, 0, i, 0, 0, 10+16+permbit);
+ minitext(292-30-o, SBY+24, "%", 6, 10+16+permbit + ROTATESPRITE_MAX);
+ if (p->inven_icon >= ICON_SCUBA) minitext(284-35-o, SBY+14, "Auto", 2, 10+16+permbit + ROTATESPRITE_MAX);
+ }
+
+ if (u&(2048+4096) && !WW2GI)
+ {
+ j = G_GetInvOn(p);
+
+ if (j > 0) minitext(288-30-o, SBY+14, "On", 0, 10+16+permbit + ROTATESPRITE_MAX);
+ else if ((uint32_t) j != 0x80000000) minitext(284-30-o, SBY+14, "Off", 2, 10+16+permbit + ROTATESPRITE_MAX);
+ }
+
+ if (u&8192)
+ {
+ i = G_GetInvAmount(p);
+ G_DrawInvNum(284-30-o, 0, SBY+28, (uint8_t) i, 0, 10+permbit);
+ }
+ }
+ }
+}
+
+void G_DrawBackground(void)
+{
+ const int32_t dapicnum = BIGHOLE;
+ int32_t x, y, x1, x2;
+
+ flushperms();
+
+ int32_t y1=0, y2=ydim;
+
+ if ((g_player[myconnectindex].ps->gm&MODE_GAME) || ud.recstat == 2)
+ {
+ if (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR)
+ {
+ if ((g_netServer || ud.multimode > 1)) y1 += scale(ydim, 8, 200);
+ if (ud.multimode > 4) y1 += scale(ydim, 8, 200);
+ }
+ }
+ else
+ {
+ const int32_t MENUTILE = MENUSCREEN;//(getrendermode() == REND_CLASSIC ? MENUSCREEN : LOADSCREEN);
+ const int32_t fstilep = tilesiz[MENUTILE].x>=320 && tilesiz[MENUTILE].y==200;
+ int32_t bgtile = (fstilep ? MENUTILE : BIGHOLE);
+
+ clearallviews(0);
+
+ // when not rendering a game, fullscreen wipe
+ // Gv_SetVar(g_iReturnVarID,tilesizx[MENUTILE]==320&&tilesizy[MENUTILE]==200?MENUTILE:BIGHOLE, -1, -1);
+ bgtile = VM_OnEventWithReturn(EVENT_GETMENUTILE, -1, myconnectindex, bgtile);
+ // MENU_TILE: is the menu tile tileable?
+#if !defined LUNATIC
+ if (Gv_GetVarByLabel("MENU_TILE", !fstilep, -1, -1))
+#else
+ if (!fstilep)
+#endif
+ {
+ if ((unsigned) bgtile < MAXTILES)
+ for (y=y1; y 8)
+ {
+ // across top
+ for (y=0; y= 8 && ud.statusbarmode == 0)
+ {
+ // when not rendering a game, fullscreen wipe
+ x2 = (xdim - sbarsc((int32_t) (ydim*1.333333333333333333f))) >> 1;
+ for (y=y2-y2%tilesiz[dapicnum].y; y>1; x+=tilesiz[dapicnum].x)
+ {
+ rotatesprite(x<<16, y<<16, 65536L, 0, dapicnum, 8, 0, 8+16+64, 0, y2, x2, ydim-1);
+ rotatesprite((xdim-x)<<16, y<<16, 65536L, 0, dapicnum, 8, 0, 8+16+64, xdim-x2-1, y2, xdim-1, ydim-1);
+ }
+
+ }
+
+ if (ud.screen_size > 8)
+ {
+ y = 0;
+ if (GametypeFlags[ud.coop] & GAMETYPE_FRAGBAR)
+ {
+ if ((g_netServer || ud.multimode > 1)) y += 8;
+ if (ud.multimode > 4) y += 8;
+ }
+
+ x1 = max(windowx1-4, 0);
+ y1 = max(windowy1-4, y);
+ x2 = min(windowx2+4, xdim-1);
+ y2 = min(windowy2+4, scale(ydim, 200-sbarsc(tilesiz[BOTTOMSTATUSBAR].y), 200)-1);
+
+ for (y=y1+4; y