- let hud_scale act like an override to uiscale, just like con_scale does.

- better handling of ForceScale for the fullscreen HUD that doesn't mess around with CVARs.
- moved the mug shot into the status bar, because this is global state that needs to be shared between different pieces of code which want to display a mug shot.
- SBARINFO should work off the current status bar settings instead of the ones stored in its script object
This commit is contained in:
Christoph Oelckers 2017-03-25 18:31:53 +01:00
parent 093a05b588
commit 3e67a8bafa
18 changed files with 335 additions and 281 deletions

View file

@ -2569,7 +2569,13 @@ void D_DoomMain (void)
P_SetupWeapons_ntohton(); P_SetupWeapons_ntohton();
//SBarInfo support. //SBarInfo support.
SBarInfo::Load(); // This needs special checking because there are two distinct methods of defining status bars.
// SBARINFO should only be picked if it is the most recently defined one, so that both
// methods can override each other if loaded in sequence.
if (gameinfo.statusbarfile > gameinfo.statusbarclassfile)
{
SBarInfo::Load();
}
HUD_InitHud(); HUD_InitHud();
if (!batchrun) if (!batchrun)

View file

@ -435,59 +435,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
S_ResumeSound (false); S_ResumeSound (false);
} }
if (StatusBar != NULL) ST_CreateStatusBar(bTitleLevel);
{
StatusBar->Destroy();
StatusBar = NULL;
}
auto cls = PClass::FindClass("DoomStatusBar");
if (bTitleLevel)
{
StatusBar = new DBaseStatusBar ();
StatusBar->SetSize(0);
}
else if (cls && gameinfo.gametype == GAME_Doom)
{
StatusBar = (DBaseStatusBar*)cls->CreateNew();
}
else if (SBarInfoScript[SCRIPT_CUSTOM] != NULL)
{
int cstype = SBarInfoScript[SCRIPT_CUSTOM]->GetGameType();
//Did the user specify a "base"
if(cstype == GAME_Strife)
{
StatusBar = CreateStrifeStatusBar();
}
else if(cstype == GAME_Any) //Use the default, empty or custom.
{
StatusBar = CreateCustomStatusBar(SCRIPT_CUSTOM);
}
else
{
StatusBar = CreateCustomStatusBar(SCRIPT_DEFAULT);
}
}
if (StatusBar == NULL)
{
if (gameinfo.gametype & (GAME_DoomChex|GAME_Heretic|GAME_Hexen))
{
StatusBar = CreateCustomStatusBar (SCRIPT_DEFAULT);
}
else if (gameinfo.gametype == GAME_Strife)
{
StatusBar = CreateStrifeStatusBar ();
}
else
{
StatusBar = new DBaseStatusBar();
StatusBar->SetSize(0);
}
}
GC::WriteBarrier(StatusBar);
StatusBar->AttachToPlayer (&players[consoleplayer]);
StatusBar->NewGame ();
setsizeneeded = true; setsizeneeded = true;
if (gameinfo.gametype == GAME_Strife || (SBarInfoScript[SCRIPT_CUSTOM] != NULL && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife)) if (gameinfo.gametype == GAME_Strife || (SBarInfoScript[SCRIPT_CUSTOM] != NULL && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife))

View file

@ -390,6 +390,7 @@ public:
void DrawTopStuff (EHudState state); void DrawTopStuff (EHudState state);
void FlashItem (const PClass *itemtype); void FlashItem (const PClass *itemtype);
void AttachToPlayer(player_t *player); void AttachToPlayer(player_t *player);
DVector2 GetHUDScale() const;
virtual void FlashCrosshair (); virtual void FlashCrosshair ();
virtual void BlendView (float blend[4]); virtual void BlendView (float blend[4]);
void NewGame (); void NewGame ();
@ -406,12 +407,9 @@ public:
void DrawString(FFont *font, const FString &cstring, double x, double y, double Alpha, int translation, int align, int screenalign, int spacing = 0, bool monospaced = false, int shadowX = 0, int shadowY = 0); void DrawString(FFont *font, const FString &cstring, double x, double y, double Alpha, int translation, int align, int screenalign, int spacing = 0, bool monospaced = false, int shadowX = 0, int shadowY = 0);
void GetCoords(int &x, int &y) void BeginStatusBar(int resW, int resH, int relTop, bool completeborder = false, bool forceScaled = false);
{ void BeginHUD(int resW, int resH, double Alpha, bool forceScaled = false);
x = ST_X; void ForceHUDScale(bool on) { ForcedScale = on; } // This is for SBARINFO which should not use BeginStatusBar or BeginHUD.
y = ST_Y;
}
//protected: //protected:
void DrawPowerups (); void DrawPowerups ();
@ -423,10 +421,14 @@ public:
AInventory *ValidateInvFirst (int numVisible) const; AInventory *ValidateInvFirst (int numVisible) const;
void DrawCrosshair (); void DrawCrosshair ();
// Sizing info for ths status bar.
int ST_X, ST_Y; int ST_X, ST_Y;
int RelTop; int RelTop;
int HorizontalResolution, VerticalResolution; int HorizontalResolution, VerticalResolution;
bool Scaled; bool Scaled; // This needs to go away.
DVector2 defaultScale; // factor for fully scaled fullscreen display.
bool ForcedScale = false;
bool Centering; bool Centering;
bool FixedOrigin; bool FixedOrigin;
bool CompleteBorder; bool CompleteBorder;
@ -442,7 +444,6 @@ public:
DVector2 drawOffset = { 0,0 }; // can be set by subclasses to offset drawing operations DVector2 drawOffset = { 0,0 }; // can be set by subclasses to offset drawing operations
double drawClip[4] = { 0,0,0,0 }; // defines a clipping rectangle (not used yet) double drawClip[4] = { 0,0,0,0 }; // defines a clipping rectangle (not used yet)
bool fullscreenOffsets = false; // current screen is displayed with fullscreen behavior. bool fullscreenOffsets = false; // current screen is displayed with fullscreen behavior.
DVector2 cleanScale; // factor for scaled fullscreen display.
FMugShot mugshot; FMugShot mugshot;
private: private:
@ -458,7 +459,6 @@ extern DBaseStatusBar *StatusBar;
// Status bar factories ----------------------------------------------------- // Status bar factories -----------------------------------------------------
DBaseStatusBar *CreateStrifeStatusBar();
DBaseStatusBar *CreateCustomStatusBar(int script=0); DBaseStatusBar *CreateCustomStatusBar(int script=0);
// Crosshair stuff ---------------------------------------------------------- // Crosshair stuff ----------------------------------------------------------
@ -466,6 +466,7 @@ DBaseStatusBar *CreateCustomStatusBar(int script=0);
void ST_FormatMapName(FString &mapname, const char *mapnamecolor = ""); void ST_FormatMapName(FString &mapname, const char *mapnamecolor = "");
void ST_LoadCrosshair(bool alwaysload=false); void ST_LoadCrosshair(bool alwaysload=false);
void ST_Clear(); void ST_Clear();
void ST_CreateStatusBar(bool bTitleLevel);
extern FTexture *CrosshairImage; extern FTexture *CrosshairImage;
FTextureID GetInventoryIcon(AInventory *item, uint32_t flags, bool *applyscale); FTextureID GetInventoryIcon(AInventory *item, uint32_t flags, bool *applyscale);

View file

@ -47,6 +47,7 @@
#include "a_keys.h" #include "a_keys.h"
#include "templates.h" #include "templates.h"
#include "i_system.h" #include "i_system.h"
#include "sbar.h"
#include "sbarinfo.h" #include "sbarinfo.h"
#include "gi.h" #include "gi.h"
#include "r_data/r_translate.h" #include "r_data/r_translate.h"
@ -72,11 +73,11 @@ enum
EXTERN_CVAR(Int, fraglimit) EXTERN_CVAR(Int, fraglimit)
EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Int, screenblocks)
EXTERN_CVAR(Bool, vid_fps) EXTERN_CVAR(Bool, vid_fps)
EXTERN_CVAR(Bool, hud_scale)
class DSBarInfo; class DSBarInfo;
static double nulclip[] = { 0,0,0,0 }; static double nulclip[] = { 0,0,0,0 };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/** /**
@ -629,10 +630,10 @@ void SBarInfo::ParseSBarInfo(int lump)
break; break;
case SBARINFO_RESOLUTION: case SBARINFO_RESOLUTION:
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
resW = sc.Number; _resW = sc.Number;
sc.MustGetToken(','); sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
resH = sc.Number; _resH = sc.Number;
sc.MustGetToken(';'); sc.MustGetToken(';');
break; break;
case SBARINFO_STATUSBAR: case SBARINFO_STATUSBAR:
@ -818,10 +819,8 @@ void SBarInfo::Init()
height = 0; height = 0;
spacingCharacter = '\0'; spacingCharacter = '\0';
spacingAlignment = ALIGN_CENTER; spacingAlignment = ALIGN_CENTER;
resW = 320; _resW = 320;
resH = 200; _resH = 200;
cleanX = -1;
cleanY = -1;
for(unsigned int i = 0;i < NUMHUDS;i++) for(unsigned int i = 0;i < NUMHUDS;i++)
huds[i] = new SBarInfoMainBlock(this); huds[i] = new SBarInfoMainBlock(this);
@ -957,14 +956,14 @@ void Popup::close()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
inline void adjustRelCenter(bool relX, bool relY, const double &x, const double &y, double &outX, double &outY, const double &xScale, const double &yScale) inline void adjustRelCenter(bool relX, bool relY, const double &x, const double &y, double &outX, double &outY, double ScaleX, double ScaleY)
{ {
if(relX) if(relX)
outX = x + (SCREENWIDTH/(hud_scale ? xScale*2 : 2)); outX = x + (SCREENWIDTH/(ScaleX*2));
else else
outX = x; outX = x;
if(relY) if(relY)
outY = y + (SCREENHEIGHT/(hud_scale ? yScale*2 : 2)); outY = y + (SCREENHEIGHT/(ScaleY*2));
else else
outY = y; outY = y;
} }
@ -1016,25 +1015,8 @@ public:
CPlayer = player; CPlayer = player;
} }
void _ScreenSizeChanged()
{
if (uiscale > 0)
{
script->cleanX = uiscale;
script->cleanY = uiscale;
}
else
{
V_CalcCleanFacs(script->resW, script->resH, SCREENWIDTH, SCREENHEIGHT, &script->cleanX, &script->cleanY);
}
}
void _Draw (EHudState state) void _Draw (EHudState state)
{ {
if (script->cleanX <= 0)
{ // Calculate cleanX and cleanY
wrapper->CallScreenSizeChanged();
}
int hud = STBAR_NORMAL; int hud = STBAR_NORMAL;
if(state == HUD_StatusBar) if(state == HUD_StatusBar)
{ {
@ -1055,11 +1037,10 @@ public:
{ {
hud = STBAR_NONE; hud = STBAR_NONE;
} }
bool oldhud_scale = hud_scale;
if(script->huds[hud]->ForceScaled()) //scale the statusbar if(script->huds[hud]->ForceScaled()) //scale the statusbar
{ {
if(script->huds[hud]->FullScreenOffsets()) if(script->huds[hud]->FullScreenOffsets())
hud_scale = true; wrapper->ForceHUDScale(true);
else if(!Scaled) else if(!Scaled)
{ {
scalingWasForced = true; scalingWasForced = true;
@ -1145,8 +1126,8 @@ public:
else else
lastPopup = NULL; lastPopup = NULL;
// Reset hud_scale // Reset hud scale
hud_scale = oldhud_scale; wrapper->ForceHUDScale(false);
} }
void _NewGame () void _NewGame ()
@ -1161,14 +1142,8 @@ public:
return script->huds[STBAR_POPUPLOG]->NumCommands() == 0; return script->huds[STBAR_POPUPLOG]->NumCommands() == 0;
} }
void _SetMugShotState (const char *state_name, bool wait_till_done, bool reset)
{
script->MugShot.SetState(state_name, wait_till_done, reset);
}
void _Tick () void _Tick ()
{ {
script->MugShot.Tick(CPlayer);
if(currentPopup != DBaseStatusBar::POP_None) if(currentPopup != DBaseStatusBar::POP_None)
{ {
script->popups[currentPopup-1].tick(); script->popups[currentPopup-1].tick();
@ -1188,11 +1163,6 @@ public:
lastInventoryBar->Tick(NULL, this, false); lastInventoryBar->Tick(NULL, this, false);
} }
void _ReceivedWeapon(AWeapon *weapon)
{
script->MugShot.Grin();
}
// void DSBarInfo::FlashItem(const PClass *itemtype) - Is defined with CommandDrawSelectedInventory // void DSBarInfo::FlashItem(const PClass *itemtype) - Is defined with CommandDrawSelectedInventory
void _FlashItem(const PClass *itemtype); void _FlashItem(const PClass *itemtype);
@ -1240,10 +1210,10 @@ public:
if(!fullScreenOffsets) if(!fullScreenOffsets)
{ {
double tmp = 0; double tmp = 0;
int stX, stY; int barW = wrapper->HorizontalResolution, barH = wrapper->VerticalResolution;
wrapper->GetCoords(stX, stY);
dx += stX; dx += wrapper->ST_X;
dy += stY - (Scaled ? script->resH : 200) + script->height; dy += wrapper->ST_Y - (Scaled ? barH : 200) + script->height;
w = forceWidth < 0 ? texture->GetScaledWidthDouble() : forceWidth; w = forceWidth < 0 ? texture->GetScaledWidthDouble() : forceWidth;
h = forceHeight < 0 ? texture->GetScaledHeightDouble() : forceHeight; h = forceHeight < 0 ? texture->GetScaledHeightDouble() : forceHeight;
double dcx = clip[0] == 0 ? 0 : dx + clip[0] - texture->GetScaledLeftOffsetDouble(); double dcx = clip[0] == 0 ? 0 : dx + clip[0] - texture->GetScaledLeftOffsetDouble();
@ -1255,19 +1225,19 @@ public:
{ {
if(clip[0] != 0 || clip[1] != 0) if(clip[0] != 0 || clip[1] != 0)
{ {
screen->VirtualToRealCoords(dcx, dcy, tmp, tmp, script->resW, script->resH, true); screen->VirtualToRealCoords(dcx, dcy, tmp, tmp, barW, barH, true);
if (clip[0] == 0) dcx = 0; if (clip[0] == 0) dcx = 0;
if (clip[1] == 0) dcy = 0; if (clip[1] == 0) dcy = 0;
} }
if(clip[2] != 0 || clip[3] != 0 || clearDontDraw) if(clip[2] != 0 || clip[3] != 0 || clearDontDraw)
screen->VirtualToRealCoords(dcr, dcb, tmp, tmp, script->resW, script->resH, true); screen->VirtualToRealCoords(dcr, dcb, tmp, tmp, barW, barH, true);
screen->VirtualToRealCoords(dx, dy, w, h, script->resW, script->resH, true); screen->VirtualToRealCoords(dx, dy, w, h, barW, barH, true);
} }
else else
{ {
dy += 200 - script->resH; dy += 200 - barH;
dcy += 200 - script->resH; dcy += 200 - barH;
dcb += 200 - script->resH; dcb += 200 - barH;
} }
if(clearDontDraw) if(clearDontDraw)
@ -1312,10 +1282,9 @@ public:
{ {
double rx, ry, rcx=0, rcy=0, rcr=INT_MAX, rcb=INT_MAX; double rx, ry, rcx=0, rcy=0, rcr=INT_MAX, rcb=INT_MAX;
double xScale = !hud_scale ? 1 : script->cleanX; DVector2 Scale = wrapper->GetHUDScale();
double yScale = !hud_scale ? 1 : script->cleanY;
adjustRelCenter(x.RelCenter(), y.RelCenter(), dx, dy, rx, ry, xScale, yScale); adjustRelCenter(x.RelCenter(), y.RelCenter(), dx, dy, rx, ry, Scale.X, Scale.Y);
// Translation: No high res. // Translation: No high res.
bool xright = *x < 0 && !x.RelCenter(); bool xright = *x < 0 && !x.RelCenter();
@ -1325,13 +1294,12 @@ public:
h = (forceHeight < 0 ? texture->GetScaledHeightDouble() : forceHeight); h = (forceHeight < 0 ? texture->GetScaledHeightDouble() : forceHeight);
if(vid_fps && rx < 0 && ry >= 0) if(vid_fps && rx < 0 && ry >= 0)
ry += 10; ry += 10;
if(hud_scale)
{ rx *= Scale.X;
rx *= xScale; ry *= Scale.Y;
ry *= yScale; w *= Scale.X;
w *= xScale; h *= Scale.Y;
h *= yScale;
}
if(xright) if(xright)
rx = SCREENWIDTH + rx; rx = SCREENWIDTH + rx;
if(ybot) if(ybot)
@ -1340,10 +1308,10 @@ public:
// Check for clipping // Check for clipping
if(clip[0] != 0 || clip[1] != 0 || clip[2] != 0 || clip[3] != 0) if(clip[0] != 0 || clip[1] != 0 || clip[2] != 0 || clip[3] != 0)
{ {
rcx = clip[0] == 0 ? 0 : rx+((clip[0] - texture->GetScaledLeftOffsetDouble())*xScale); rcx = clip[0] == 0 ? 0 : rx+((clip[0] - texture->GetScaledLeftOffsetDouble())*Scale.X);
rcy = clip[1] == 0 ? 0 : ry+((clip[1] - texture->GetScaledTopOffsetDouble())*yScale); rcy = clip[1] == 0 ? 0 : ry+((clip[1] - texture->GetScaledTopOffsetDouble())*Scale.Y);
rcr = clip[2] == 0 ? INT_MAX : rx+w-((clip[2] + texture->GetScaledLeftOffsetDouble())*xScale); rcr = clip[2] == 0 ? INT_MAX : rx+w-((clip[2] + texture->GetScaledLeftOffsetDouble())*Scale.X);
rcb = clip[3] == 0 ? INT_MAX : ry+h-((clip[3] + texture->GetScaledTopOffsetDouble())*yScale); rcb = clip[3] == 0 ? INT_MAX : ry+h-((clip[3] + texture->GetScaledTopOffsetDouble())*Scale.Y);
} }
if(clearDontDraw) if(clearDontDraw)
@ -1392,8 +1360,7 @@ public:
double ax = *x; double ax = *x;
double ay = *y; double ay = *y;
double xScale = 1.0; DVector2 Scale;
double yScale = 1.0;
const uint8_t* str = (const uint8_t*) cstring; const uint8_t* str = (const uint8_t*) cstring;
const EColorRange boldTranslation = EColorRange(translation ? translation - 1 : NumTextColors - 1); const EColorRange boldTranslation = EColorRange(translation ? translation - 1 : NumTextColors - 1);
@ -1401,12 +1368,12 @@ public:
if(fullScreenOffsets) if(fullScreenOffsets)
{ {
if(hud_scale) Scale = wrapper->GetHUDScale();
{ adjustRelCenter(x.RelCenter(), y.RelCenter(), *x, *y, ax, ay, Scale.X, Scale.Y);
xScale = script->cleanX; }
yScale = script->cleanY; else
} {
adjustRelCenter(x.RelCenter(), y.RelCenter(), *x, *y, ax, ay, xScale, yScale); Scale = { 1.,1. };
} }
while(*str != '\0') while(*str != '\0')
{ {
@ -1467,15 +1434,15 @@ public:
if(!fullScreenOffsets) if(!fullScreenOffsets)
{ {
int stX, stY;
wrapper->GetCoords(stX, stY); int barW = wrapper->HorizontalResolution, barH = wrapper->VerticalResolution;
rx += stX; rx += wrapper->ST_X;
ry += stY - (Scaled ? script->resH : 200) + script->height; ry += wrapper->ST_Y - (Scaled ? barH : 200) + script->height;
if(Scaled) if(Scaled)
screen->VirtualToRealCoords(rx, ry, rw, rh, script->resW, script->resH, true); screen->VirtualToRealCoords(rx, ry, rw, rh, barW, barH, true);
else else
{ {
ry += (200 - script->resH); ry += (200 - barH);
} }
} }
else else
@ -1486,13 +1453,11 @@ public:
bool xright = rx < 0; bool xright = rx < 0;
bool ybot = ry < 0; bool ybot = ry < 0;
if(hud_scale) rx *= Scale.X;
{ ry *= Scale.Y;
rx *= xScale; rw *= Scale.X;
ry *= yScale; rh *= Scale.Y;
rw *= xScale;
rh *= yScale;
}
if(xright) if(xright)
rx = SCREENWIDTH + rx; rx = SCREENWIDTH + rx;
if(ybot) if(ybot)
@ -1501,8 +1466,8 @@ public:
if(drawshadow) if(drawshadow)
{ {
double salpha = (Alpha *HR_SHADOW); double salpha = (Alpha *HR_SHADOW);
double srx = rx + (shadowX*xScale); double srx = rx + (shadowX*Scale.X);
double sry = ry + (shadowY*yScale); double sry = ry + (shadowY*Scale.Y);
screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, character, screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, character,
DTA_DestWidthF, rw, DTA_DestWidthF, rw,
DTA_DestHeightF, rh, DTA_DestHeightF, rh,
@ -1558,11 +1523,8 @@ void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statu
{ {
if(FullScreenOffsets()) if(FullScreenOffsets())
{ {
if(!hud_scale) rescale = true;
{ statusBar->wrapper->ForceHUDScale(true);
rescale = true;
hud_scale = true;
}
} }
else if(!statusBar->Scaled) else if(!statusBar->Scaled)
{ {
@ -1576,7 +1538,7 @@ void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statu
if(rescale) if(rescale)
{ {
if(FullScreenOffsets()) if(FullScreenOffsets())
hud_scale = false; statusBar->wrapper->ForceHUDScale(false);
else else
statusBar->wrapper->SetScaled(false); statusBar->wrapper->SetScaled(false);
} }
@ -1615,13 +1577,6 @@ DEFINE_ACTION_FUNCTION(DSBarInfo, AttachToPlayer)
return 0; return 0;
} }
DEFINE_ACTION_FUNCTION(DSBarInfo, ScreenSizeChanged)
{
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
self->_ScreenSizeChanged();
return 0;
}
DEFINE_ACTION_FUNCTION(DSBarInfo, Draw) DEFINE_ACTION_FUNCTION(DSBarInfo, Draw)
{ {
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo); PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
@ -1644,16 +1599,6 @@ DEFINE_ACTION_FUNCTION(DSBarInfo, MustDrawLog)
ACTION_RETURN_BOOL(self->_MustDrawLog((EHudState)State)); ACTION_RETURN_BOOL(self->_MustDrawLog((EHudState)State));
} }
DEFINE_ACTION_FUNCTION(DSBarInfo, SetMugshotState)
{
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
PARAM_STRING(name);
PARAM_BOOL(wait);
PARAM_BOOL(reset);
self->_SetMugShotState(name, wait, reset);
return 0;
}
DEFINE_ACTION_FUNCTION(DSBarInfo, Tick) DEFINE_ACTION_FUNCTION(DSBarInfo, Tick)
{ {
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo); PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
@ -1661,14 +1606,6 @@ DEFINE_ACTION_FUNCTION(DSBarInfo, Tick)
return 0; return 0;
} }
DEFINE_ACTION_FUNCTION(DSBarInfo, ReceivedWeapon)
{
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
PARAM_OBJECT(w, AWeapon);
self->_ReceivedWeapon(w);
return 0;
}
DEFINE_ACTION_FUNCTION(DSBarInfo, FlashItem) DEFINE_ACTION_FUNCTION(DSBarInfo, FlashItem)
{ {
PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo); PARAM_SELF_STRUCT_PROLOGUE(DSBarInfo);
@ -1695,7 +1632,7 @@ DBaseStatusBar *CreateCustomStatusBar(int scriptno)
auto sbar = (DBaseStatusBar*)PClass::FindClass("SBarInfoWrapper")->CreateNew(); auto sbar = (DBaseStatusBar*)PClass::FindClass("SBarInfoWrapper")->CreateNew();
auto core = new DSBarInfo(sbar, script); auto core = new DSBarInfo(sbar, script);
sbar->PointerVar<DSBarInfo>("core") = core; sbar->PointerVar<DSBarInfo>("core") = core;
sbar->SetSize(script->height, script->resW, script->resH); sbar->SetSize(script->height, script->_resW, script->_resH);
core->_SetScaled(sbar->Scaled); core->_SetScaled(sbar->Scaled);
sbar->CompleteBorder = script->completeBorder; sbar->CompleteBorder = script->completeBorder;
return sbar; return sbar;

View file

@ -106,11 +106,9 @@ struct SBarInfo
int armorInterpolationSpeed; int armorInterpolationSpeed;
int height; int height;
int gameType; int gameType;
FMugShot MugShot;
int resW; int _resW;
int resH; int _resH;
int cleanX;
int cleanY;
int GetGameType() { return gameType; } int GetGameType() { return gameType; }
void ParseSBarInfo(int lump); void ParseSBarInfo(int lump);

View file

@ -1616,7 +1616,7 @@ class CommandDrawMugShot : public SBarInfoCommand
void Draw(const SBarInfoMainBlock *block, const DSBarInfo *statusBar) void Draw(const SBarInfoMainBlock *block, const DSBarInfo *statusBar)
{ {
FTexture *face = script->MugShot.GetFace(statusBar->CPlayer, defaultFace, accuracy, stateFlags); FTexture *face = statusBar->wrapper->mugshot.GetFace(statusBar->CPlayer, defaultFace, accuracy, stateFlags);
if (face != NULL) if (face != NULL)
statusBar->DrawGraphic(face, x, y, block->XOffset(), block->YOffset(), block->Alpha(), block->FullScreenOffsets()); statusBar->DrawGraphic(face, x, y, block->XOffset(), block->YOffset(), block->Alpha(), block->FullScreenOffsets());
} }
@ -1661,7 +1661,6 @@ class CommandDrawMugShot : public SBarInfoCommand
} }
void Reset() void Reset()
{ {
script->MugShot.Reset();
} }
protected: protected:

View file

@ -4,6 +4,7 @@
** **
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** Copyright 1998-2006 Randy Heit ** Copyright 1998-2006 Randy Heit
** Copyright 2017 Christoph Oelckers
** All rights reserved. ** All rights reserved.
** **
** Redistribution and use in source and binary forms, with or without ** Redistribution and use in source and binary forms, with or without
@ -59,6 +60,7 @@
#include "virtual.h" #include "virtual.h"
#include "p_acs.h" #include "p_acs.h"
#include "r_data/r_translate.h" #include "r_data/r_translate.h"
#include "sbarinfo.h"
#include "../version.h" #include "../version.h"
@ -81,8 +83,8 @@ EXTERN_CVAR (Bool, am_showtime)
EXTERN_CVAR (Bool, am_showtotaltime) EXTERN_CVAR (Bool, am_showtotaltime)
EXTERN_CVAR (Bool, noisedebug) EXTERN_CVAR (Bool, noisedebug)
EXTERN_CVAR (Int, con_scaletext) EXTERN_CVAR (Int, con_scaletext)
EXTERN_CVAR(Bool, hud_scale)
EXTERN_CVAR(Bool, vid_fps) EXTERN_CVAR(Bool, vid_fps)
CVAR(Int, hud_scale, -1, CVAR_ARCHIVE);
int active_con_scaletext(); int active_con_scaletext();
@ -90,7 +92,7 @@ DBaseStatusBar *StatusBar;
extern int setblocks; extern int setblocks;
int gST_X, gST_Y; int gST_Y;
FTexture *CrosshairImage; FTexture *CrosshairImage;
static int CrosshairNum; static int CrosshairNum;
@ -222,6 +224,85 @@ void ST_Clear()
CrosshairNum = 0; CrosshairNum = 0;
} }
//---------------------------------------------------------------------------
//
// create a new status bar
//
//---------------------------------------------------------------------------
void ST_CreateStatusBar(bool bTitleLevel)
{
if (StatusBar != NULL)
{
StatusBar->Destroy();
StatusBar = NULL;
}
if (bTitleLevel)
{
StatusBar = new DBaseStatusBar();
StatusBar->SetSize(0);
}
else if (gameinfo.statusbarclassfile >= gameinfo.statusbarfile)
{
auto cls = PClass::FindClass(gameinfo.statusbarclass);
if (cls != nullptr)
{
StatusBar = (DBaseStatusBar *)cls->CreateNew();
IFVIRTUALPTR(StatusBar, DBaseStatusBar, Init)
{
VMValue params[] = { StatusBar };
GlobalVMStack.Call(func, params, 1, nullptr, 0);
}
}
}
if (StatusBar == nullptr && SBarInfoScript[SCRIPT_CUSTOM] != nullptr)
{
int cstype = SBarInfoScript[SCRIPT_CUSTOM]->GetGameType();
//Did the user specify a "base"
if (cstype == GAME_Any) //Use the default, empty or custom.
{
StatusBar = CreateCustomStatusBar(SCRIPT_CUSTOM);
}
else
{
StatusBar = CreateCustomStatusBar(SCRIPT_DEFAULT);
}
}
if (StatusBar == nullptr)
{
FName defname;
if (gameinfo.gametype & GAME_DoomChex) defname = "DoomStatusBar";
else if (gameinfo.gametype == GAME_Heretic) defname = "HereticStatusBar";
else if (gameinfo.gametype == GAME_Hexen) defname = "HexenStatusBar";
else if (gameinfo.gametype == GAME_Strife) defname = "StrifeStatusBar";
if (defname != NAME_None)
{
auto cls = PClass::FindClass(defname);
if (cls != nullptr)
{
StatusBar = (DBaseStatusBar *)cls->CreateNew();
IFVIRTUALPTR(StatusBar, DBaseStatusBar, Init)
{
VMValue params[] = { StatusBar };
GlobalVMStack.Call(func, params, 1, nullptr, 0);
}
}
}
}
if (StatusBar == nullptr)
{
StatusBar = new DBaseStatusBar();
StatusBar->SetSize(0);
}
GC::WriteBarrier(StatusBar);
StatusBar->AttachToPlayer(&players[consoleplayer]);
StatusBar->NewGame();
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// Constructor // Constructor
@ -238,8 +319,7 @@ DBaseStatusBar::DBaseStatusBar ()
Displacement = 0; Displacement = 0;
CPlayer = NULL; CPlayer = NULL;
ShowLog = false; ShowLog = false;
cleanScale = { (double)CleanXfac, (double)CleanYfac }; defaultScale = { (double)CleanXfac, (double)CleanYfac };
} }
void DBaseStatusBar::SetSize(int reltop, int hres, int vres) void DBaseStatusBar::SetSize(int reltop, int hres, int vres)
@ -327,7 +407,6 @@ void DBaseStatusBar::SetScaled (bool scale, bool force)
} }
Displacement = 0; Displacement = 0;
} }
gST_X = ST_X;
} }
DEFINE_ACTION_FUNCTION(DBaseStatusBar, SetScaled) DEFINE_ACTION_FUNCTION(DBaseStatusBar, SetScaled)
@ -349,6 +428,96 @@ void DBaseStatusBar::CallSetScaled(bool scale, bool force)
else SetScaled(scale, force); else SetScaled(scale, force);
} }
//---------------------------------------------------------------------------
//
// PROC GetHUDScale
//
//---------------------------------------------------------------------------
DVector2 DBaseStatusBar::GetHUDScale() const
{
int scale;
if (hud_scale < 0 || ForcedScale) // a negative value is the equivalent to the old boolean hud_scale. This can yield different values for x and y for higher resolutions.
{
return defaultScale;
}
if (hud_scale > 0) // use the scale as an absolute value, but also factor in the specified resolution of the HUD
{
scale = hud_scale;
}
else if (uiscale == 0)
{
return defaultScale;
}
else
{
scale = MAX<int>(1, uiscale);
}
// Since status bars and HUDs can be designed for non 320x200 screens this needs to be factored in here.
// The global scaling factors are for resources at 320x200, so if the actual ones are higher resolution
// the resulting scaling factor needs to be reduced accordingly.
int realscale = MAX<int>(1, (320 * scale) / HorizontalResolution);
return{ double(realscale), double(realscale) };
}
DEFINE_ACTION_FUNCTION(DBaseStatusBar, GetHUDScale)
{
PARAM_SELF_PROLOGUE(DBaseStatusBar);
ACTION_RETURN_VEC2(self->GetHUDScale());
}
//---------------------------------------------------------------------------
//
// PROC GetHUDScale
//
//---------------------------------------------------------------------------
void DBaseStatusBar::BeginStatusBar(int resW, int resH, int relTop, bool completeborder, bool forceScaled)
{
SetSize(relTop, resW, resH);
SetScaled(st_scale, forceScaled);
CompleteBorder = completeborder;
fullscreenOffsets = false;
}
DEFINE_ACTION_FUNCTION(DBaseStatusBar, BeginStatusBar)
{
PARAM_SELF_PROLOGUE(DBaseStatusBar);
PARAM_INT(w);
PARAM_INT(h);
PARAM_INT(r);
PARAM_BOOL_DEF(cb);
PARAM_BOOL_DEF(fs);
self->BeginStatusBar(w, h, r, cb, fs);
return 0;
}
//---------------------------------------------------------------------------
//
// PROC GetHUDScale
//
//---------------------------------------------------------------------------
void DBaseStatusBar::BeginHUD(int resW, int resH, double Alpha, bool forcescaled)
{
SetSize(0, resW, resH); // this intentionally resets the relative top to force the caller to go through BeginStatusBar and not just reset some variables.
this->Alpha = Alpha;
ForcedScale = forcescaled;
CompleteBorder = false;
fullscreenOffsets = true;
}
DEFINE_ACTION_FUNCTION(DBaseStatusBar, BeginHUD)
{
PARAM_SELF_PROLOGUE(DBaseStatusBar);
PARAM_INT(w);
PARAM_INT(h);
PARAM_FLOAT(a);
PARAM_BOOL_DEF(fs);
self->BeginHUD(w, h, a, fs);
return 0;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// PROC AttachToPlayer // PROC AttachToPlayer
@ -1016,6 +1185,16 @@ bool DBaseStatusBar::MustDrawLog(EHudState state)
return true; return true;
} }
DEFINE_ACTION_FUNCTION(DBaseStatusBar, SetMugshotState)
{
PARAM_SELF_PROLOGUE(DBaseStatusBar);
PARAM_STRING(statename);
PARAM_BOOL(wait);
PARAM_BOOL(reset);
self->mugshot.SetState(statename, wait, reset);
return 0;
}
void DBaseStatusBar::SetMugShotState(const char *stateName, bool waitTillDone, bool reset) void DBaseStatusBar::SetMugShotState(const char *stateName, bool waitTillDone, bool reset)
{ {
IFVIRTUAL(DBaseStatusBar, SetMugShotState) IFVIRTUAL(DBaseStatusBar, SetMugShotState)
@ -1024,7 +1203,6 @@ void DBaseStatusBar::SetMugShotState(const char *stateName, bool waitTillDone, b
VMValue params[] = { (DObject*)this, &statestring, waitTillDone, reset }; VMValue params[] = { (DObject*)this, &statestring, waitTillDone, reset };
GlobalVMStack.Call(func, params, countof(params), nullptr, 0); GlobalVMStack.Call(func, params, countof(params), nullptr, 0);
} }
mugshot.SetState(stateName, waitTillDone, reset);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1223,7 +1401,7 @@ void DBaseStatusBar::ScreenSizeChanged ()
int x, y; int x, y;
V_CalcCleanFacs(HorizontalResolution, VerticalResolution, SCREENWIDTH, SCREENHEIGHT, &x, &y); V_CalcCleanFacs(HorizontalResolution, VerticalResolution, SCREENWIDTH, SCREENHEIGHT, &x, &y);
cleanScale = { (double)x, (double)y }; defaultScale = { (double)x, (double)y };
for (size_t i = 0; i < countof(Messages); ++i) for (size_t i = 0; i < countof(Messages); ++i)
{ {
@ -1423,13 +1601,12 @@ void DBaseStatusBar::DrawGraphic(FTextureID texture, bool animate, double x, dou
if (screenalign == (RIGHT | TOP) && vid_fps) y += 10; if (screenalign == (RIGHT | TOP) && vid_fps) y += 10;
if (hud_scale) DVector2 Scale = GetHUDScale();
{
x *= cleanScale.X; x *= Scale.X;
y *= cleanScale.Y; y *= Scale.Y;
width *= cleanScale.X; width *= Scale.X;
height *= cleanScale.Y; height *= Scale.Y;
}
x += orgx; x += orgx;
y += orgy; y += orgy;
} }
@ -1495,14 +1672,13 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d
const EColorRange boldTranslation = EColorRange(translation ? translation - 1 : NumTextColors - 1); const EColorRange boldTranslation = EColorRange(translation ? translation - 1 : NumTextColors - 1);
int fontcolor = translation; int fontcolor = translation;
double orgx = 0, orgy = 0; double orgx = 0, orgy = 0;
DVector2 Scale;
if (fullscreenOffsets) if (fullscreenOffsets)
{ {
if (hud_scale) Scale = GetHUDScale();
{ shadowX *= (int)Scale.X;
shadowX *= (int)cleanScale.X; shadowY *= (int)Scale.Y;
shadowY *= (int)cleanScale.Y;
}
switch (screenalign & HMASK) switch (screenalign & HMASK)
{ {
@ -1520,6 +1696,10 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d
if (screenalign == (RIGHT | TOP) && vid_fps) orgy += 10; if (screenalign == (RIGHT | TOP) && vid_fps) orgy += 10;
} }
else
{
Scale = { 1.,1. };
}
int ch; int ch;
while (ch = *str++, ch != '\0') while (ch = *str++, ch != '\0')
{ {
@ -1582,13 +1762,11 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d
} }
else else
{ {
if (hud_scale) rx *= Scale.X;
{ ry *= Scale.Y;
rx *= cleanScale.X; rw *= Scale.X;
ry *= cleanScale.Y; rh *= Scale.Y;
rw *= cleanScale.X;
rh *= cleanScale.Y;
}
rx += orgx; rx += orgx;
ry += orgy; ry += orgy;
} }
@ -1697,23 +1875,11 @@ DEFINE_FIELD(DBaseStatusBar, Alpha);
DEFINE_FIELD(DBaseStatusBar, drawOffset); DEFINE_FIELD(DBaseStatusBar, drawOffset);
DEFINE_FIELD(DBaseStatusBar, drawClip); DEFINE_FIELD(DBaseStatusBar, drawClip);
DEFINE_FIELD(DBaseStatusBar, fullscreenOffsets); DEFINE_FIELD(DBaseStatusBar, fullscreenOffsets);
DEFINE_FIELD(DBaseStatusBar, cleanScale); DEFINE_FIELD(DBaseStatusBar, defaultScale);
DEFINE_GLOBAL(StatusBar); DEFINE_GLOBAL(StatusBar);
DBaseStatusBar *CreateStrifeStatusBar()
{
auto sb = (DBaseStatusBar *)PClass::FindClass("StrifeStatusBar")->CreateNew();
IFVIRTUALPTR(sb, DBaseStatusBar, Init)
{
VMValue params[] = { sb };
GlobalVMStack.Call(func, params, 1, nullptr, 0);
}
return sb;
}
static DObject *InitObject(PClass *type, int paramnum, VM_ARGS) static DObject *InitObject(PClass *type, int paramnum, VM_ARGS)
{ {
auto obj = type->CreateNew(); auto obj = type->CreateNew();

View file

@ -354,6 +354,21 @@ void FGameConfigFile::DoGlobalSetup ()
SetValueForKey ("5", "use ArtiInvulnerability2"); SetValueForKey ("5", "use ArtiInvulnerability2");
} }
} }
if (last < 212)
{
FBaseCVar *var = FindCVar("hud_scale", NULL);
if (var != NULL)
{
var->ResetToDefault();
}
var = FindCVar("snd_channels", NULL);
if (var != NULL)
{
// old settings were default 32, minimum 8, new settings are default 128, minimum 64.
UCVarValue v = var->GetGenericRep(CVAR_Int);
if (v.Int < 64) var->ResetToDefault();
}
}
} }
} }
} }

View file

@ -153,6 +153,14 @@ const char* GameInfoBorders[] =
gameinfo.key = sc.String; \ gameinfo.key = sc.String; \
} }
#define GAMEINFOKEY_STRING_STAMPED(key, variable, stampvar) \
else if(nextKey.CompareNoCase(variable) == 0) \
{ \
sc.MustGetToken(TK_StringConst); \
gameinfo.key = sc.String; \
gameinfo.stampvar = Wads.GetLumpFile(sc.LumpNum); \
}
#define GAMEINFOKEY_INT(key, variable) \ #define GAMEINFOKEY_INT(key, variable) \
else if(nextKey.CompareNoCase(variable) == 0) \ else if(nextKey.CompareNoCase(variable) == 0) \
{ \ { \
@ -358,7 +366,8 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor") GAMEINFOKEY_COLOR(defaultbloodcolor, "defaultbloodcolor")
GAMEINFOKEY_COLOR(defaultbloodparticlecolor, "defaultbloodparticlecolor") GAMEINFOKEY_COLOR(defaultbloodparticlecolor, "defaultbloodparticlecolor")
GAMEINFOKEY_STRING(backpacktype, "backpacktype") GAMEINFOKEY_STRING(backpacktype, "backpacktype")
GAMEINFOKEY_STRING(statusbar, "statusbar") GAMEINFOKEY_STRING_STAMPED(statusbar, "statusbar", statusbarfile)
GAMEINFOKEY_STRING_STAMPED(statusbarclass, "statusbarclass", statusbarclassfile)
GAMEINFOKEY_MUSIC(intermissionMusic, intermissionOrder, "intermissionMusic") GAMEINFOKEY_MUSIC(intermissionMusic, intermissionOrder, "intermissionMusic")
GAMEINFOKEY_STRING(CursorPic, "CursorPic") GAMEINFOKEY_STRING(CursorPic, "CursorPic")
GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic") GAMEINFOKEY_BOOL(noloopfinalemusic, "noloopfinalemusic")

View file

@ -148,8 +148,11 @@ struct gameinfo_t
FString translator; FString translator;
uint32_t defaultbloodcolor; uint32_t defaultbloodcolor;
uint32_t defaultbloodparticlecolor; uint32_t defaultbloodparticlecolor;
FName backpacktype;
FString statusbar; FString statusbar;
int statusbarfile = -1;
FName statusbarclass;
int statusbarclassfile = -1;
FName backpacktype;
FString intermissionMusic; FString intermissionMusic;
int intermissionOrder; int intermissionOrder;
FString CursorPic; FString CursorPic;

View file

@ -26,7 +26,6 @@
struct event_t; struct event_t;
extern int gST_X;
extern int gST_Y; extern int gST_Y;
bool ST_Responder(event_t* ev); bool ST_Responder(event_t* ev);

View file

@ -81,7 +81,6 @@ int CleanWidth, CleanHeight;
// Above minus 1 (or 1, if they are already 1) // Above minus 1 (or 1, if they are already 1)
int CleanXfac_1, CleanYfac_1, CleanWidth_1, CleanHeight_1; int CleanXfac_1, CleanYfac_1, CleanWidth_1, CleanHeight_1;
CVAR (Bool, hud_scale, true, CVAR_ARCHIVE);
DEFINE_ACTION_FUNCTION(_Screen, GetWidth) DEFINE_ACTION_FUNCTION(_Screen, GetWidth)
{ {
@ -210,33 +209,21 @@ bool DCanvas::SetTextureParms(DrawParms *parms, FTexture *img, double xx, double
case DTA_HUDRules: case DTA_HUDRules:
case DTA_HUDRulesC: case DTA_HUDRulesC:
{ {
// Note that this has been deprecated because it cannot intelligently decide what scale // Note that this has been deprecated because the HUD should be drawn by the status bar.
// actually needs to be used in conjunction with the active status bar.
bool xright = parms->x < 0; bool xright = parms->x < 0;
bool ybot = parms->y < 0; bool ybot = parms->y < 0;
DVector2 scale = StatusBar->GetHUDScale();
if (hud_scale) parms->x *= scale.X;
{ if (parms->cleanmode == DTA_HUDRulesC)
parms->x *= CleanXfac; parms->x += Width * 0.5;
if (parms->cleanmode == DTA_HUDRulesC) else if (xright)
parms->x += Width * 0.5; parms->x = Width + parms->x;
else if (xright) parms->y *= scale.Y;
parms->x = Width + parms->x; if (ybot)
parms->y *= CleanYfac; parms->y = Height + parms->y;
if (ybot) parms->destwidth = parms->texwidth * scale.X;
parms->y = Height + parms->y; parms->destheight = parms->texheight * scale.Y;
parms->destwidth = parms->texwidth * CleanXfac;
parms->destheight = parms->texheight * CleanYfac;
}
else
{
if (parms->cleanmode == DTA_HUDRulesC)
parms->x += Width * 0.5;
else if (xright)
parms->x = Width + parms->x;
if (ybot)
parms->y = Height + parms->y;
}
break; break;
} }
} }

View file

@ -66,7 +66,7 @@ const char *GetVersionString();
// Version stored in the ini's [LastRun] section. // Version stored in the ini's [LastRun] section.
// Bump it if you made some configuration change that you want to // Bump it if you made some configuration change that you want to
// be able to migrate in FGameConfigFile::DoGlobalSetup(). // be able to migrate in FGameConfigFile::DoGlobalSetup().
#define LASTRUNVERSION "211" #define LASTRUNVERSION "212"
// Protocol version used in demos. // Protocol version used in demos.
// Bump it if you change existing DEM_ commands or add new ones. // Bump it if you change existing DEM_ commands or add new ones.

View file

@ -27,6 +27,7 @@ gameinfo
backpacktype = "Backpack" backpacktype = "Backpack"
armoricons = "ARM1A0", 0.5, "ARM2A0" armoricons = "ARM1A0", 0.5, "ARM2A0"
statusbar = "sbarinfo/doom.txt" statusbar = "sbarinfo/doom.txt"
//statusbarclass = "DoomStatusBar"
intermissionmusic = "$MUSIC_DM2INT" intermissionmusic = "$MUSIC_DM2INT"
intermissioncounter = true intermissioncounter = true
weaponslot = 1, "Fist", "Chainsaw" weaponslot = 1, "Fist", "Chainsaw"

View file

@ -66,6 +66,7 @@ gameinfo
statscreen_coop = "CoopStatusScreen" statscreen_coop = "CoopStatusScreen"
statscreen_dm = "DeathmatchStatusScreen" statscreen_dm = "DeathmatchStatusScreen"
statscreen_single = "RavenStatusScreen" statscreen_single = "RavenStatusScreen"
statusbarclass = "StrifeStatusBar"
} }
DoomEdNums DoomEdNums

View file

@ -843,7 +843,6 @@ OptionMenu "HUDOptions"
Option "$HUDMNU_NAMETAGS", "displaynametags", "DisplayTagsTypes" Option "$HUDMNU_NAMETAGS", "displaynametags", "DisplayTagsTypes"
Option "$HUDMNU_NAMETAGCOLOR", "nametagcolor", "TextColors", "displaynametags" Option "$HUDMNU_NAMETAGCOLOR", "nametagcolor", "TextColors", "displaynametags"
Option "$HUDMNU_SCALESTATBAR", "st_scale", "OnOff" Option "$HUDMNU_SCALESTATBAR", "st_scale", "OnOff"
Option "$HUDMNU_SCALEFULLSCREENHUD", "hud_scale", "OnOff"
Option "$HUDMNU_OLDOUCH", "st_oldouch", "OnOff" Option "$HUDMNU_OLDOUCH", "st_oldouch", "OnOff"
StaticText " " StaticText " "
Option "$HUDMNU_HEXENFLASHES", "pf_hexenweaps", "ZDoomHexen" Option "$HUDMNU_HEXENFLASHES", "pf_hexenweaps", "ZDoomHexen"

View file

@ -4,13 +4,10 @@ struct SBarInfo native ui
native void SetScaled(bool scaled); native void SetScaled(bool scaled);
native void Destroy(); native void Destroy();
native void AttachToPlayer(PlayerInfo player); native void AttachToPlayer(PlayerInfo player);
native void ScreenSizeChanged();
native void Draw(int state); native void Draw(int state);
native void NewGame(); native void NewGame();
native bool MustDrawLog(int state); native bool MustDrawLog(int state);
native void SetMugShotState(String state_name, bool wait_till_done, bool reset);
native void Tick(); native void Tick();
native clearscope void ReceivedWeapon(Weapon weapon);
native void FlashItem(class<Inventory> itemtype); native void FlashItem(class<Inventory> itemtype);
native void ShowPop(int popnum); native void ShowPop(int popnum);
} }
@ -41,12 +38,6 @@ class SBarInfoWrapper : BaseStatusBar
core.AttachToPlayer(player); core.AttachToPlayer(player);
} }
override void ScreenSizeChanged()
{
Super.ScreenSizeChanged();
core.ScreenSizeChanged();
}
override void Draw(int state, double TicFrac) override void Draw(int state, double TicFrac)
{ {
Super.Draw(state, TicFrac); Super.Draw(state, TicFrac);
@ -68,22 +59,12 @@ class SBarInfoWrapper : BaseStatusBar
return core.MustDrawLog(state); return core.MustDrawLog(state);
} }
override void SetMugShotState(String state_name, bool wait_till_done, bool reset)
{
core.SetMugShotState(state_name, wait_till_done, reset);
}
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
core.Tick(); core.Tick();
} }
override void ReceivedWeapon(Weapon weapon)
{
core.ReceivedWeapon(weapon);
}
override void FlashItem(class<Inventory> itemtype) override void FlashItem(class<Inventory> itemtype)
{ {
core.FlashItem(itemtype); core.FlashItem(itemtype);

View file

@ -157,16 +157,20 @@ class BaseStatusBar native ui
native double Displacement; native double Displacement;
native PlayerInfo CPlayer; native PlayerInfo CPlayer;
native bool ShowLog; native bool ShowLog;
native Vector2 defaultScale; // factor for fully scaled fullscreen display.
// These are block properties for the drawers. A child class can set them to have a block of items use the same settings. // These are block properties for the drawers. A child class can set them to have a block of items use the same settings.
native double Alpha; native double Alpha;
native Vector2 drawOffset; // can be set by subclasses to offset drawing operations native Vector2 drawOffset; // can be set by subclasses to offset drawing operations
native double drawClip[4]; // defines a clipping rectangle (not used yet) native double drawClip[4]; // defines a clipping rectangle (not used yet)
native bool fullscreenOffsets; // current screen is displayed with fullscreen behavior. native bool fullscreenOffsets; // current screen is displayed with fullscreen behavior.
native Vector2 cleanScale; // factor for scaled fullscreen display.
native void SetSize(int height, int vwidth, int vheight); native void SetSize(int height, int vwidth, int vheight);
native Vector2 GetHUDScale();
native void BeginStatusBar(int resW, int resH, int relTop, bool completeborder = false, bool forceScaled = false);
native void BeginHUD(int resW, int resH, double Alpha, bool forcescaled = false);
virtual void Init() {} virtual void Init() {}
native virtual void SetScaled(bool scale, bool force = false); native virtual void SetScaled(bool scale, bool force = false);
@ -174,6 +178,7 @@ class BaseStatusBar native ui
native virtual void Draw (int state, double TicFrac); native virtual void Draw (int state, double TicFrac);
native virtual void ScreenSizeChanged (); native virtual void ScreenSizeChanged ();
native virtual clearscope void ReceivedWeapon (Weapon weapn); native virtual clearscope void ReceivedWeapon (Weapon weapn);
native virtual clearscope void SetMugShotState (String state_name, bool wait_till_done=false, bool reset=false);
virtual void FlashItem (class<Inventory> itemtype) {} virtual void FlashItem (class<Inventory> itemtype) {}
virtual void AttachToPlayer (PlayerInfo player) { CPlayer = player; } virtual void AttachToPlayer (PlayerInfo player) { CPlayer = player; }
@ -181,7 +186,6 @@ class BaseStatusBar native ui
virtual void NewGame () {} virtual void NewGame () {}
virtual void ShowPop (int popnum) { ShowLog = (popnum == POP_Log && !ShowLog); } virtual void ShowPop (int popnum) { ShowLog = (popnum == POP_Log && !ShowLog); }
virtual bool MustDrawLog(int state) { return true; } virtual bool MustDrawLog(int state) { return true; }
virtual void SetMugShotState (String state_name, bool wait_till_done=false, bool reset=false) {}
native void RefreshBackground () const; native void RefreshBackground () const;
native TextureID GetMugshot(PlayerInfo player, String default_face, int accuracy, int stateflags=MugShot.STANDARD); native TextureID GetMugshot(PlayerInfo player, String default_face, int accuracy, int stateflags=MugShot.STANDARD);