mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-23 20:43:15 +00:00
- Added resolution setting to SBarInfo.
- Fixed: Mug shot was not reset at the start of a new game. SVN r2332 (trunk)
This commit is contained in:
parent
c4efbeb515
commit
9611e7310a
6 changed files with 103 additions and 30 deletions
|
@ -215,6 +215,7 @@ class FMugShot
|
|||
|
||||
FMugShot();
|
||||
void Grin(bool grin=true) { bEvilGrin = grin; }
|
||||
void Reset();
|
||||
void Tick(player_t *player);
|
||||
bool SetState(const char *state_name, bool wait_till_done=false, bool reset=false);
|
||||
int UpdateState(player_t *player, StateFlags stateflags=STANDARD);
|
||||
|
@ -275,7 +276,7 @@ public:
|
|||
ST_DEADFACE = ST_GODFACE + 1
|
||||
};
|
||||
|
||||
DBaseStatusBar (int reltop);
|
||||
DBaseStatusBar (int reltop, int hres=320, int vres=200);
|
||||
void Destroy ();
|
||||
|
||||
void SetScaled (bool scale, bool force=false);
|
||||
|
@ -338,6 +339,7 @@ public:
|
|||
|
||||
int ST_X, ST_Y;
|
||||
int RelTop;
|
||||
int HorizontalResolution, VirticalResolution;
|
||||
bool Scaled;
|
||||
bool Centering;
|
||||
bool FixedOrigin;
|
||||
|
|
|
@ -221,6 +221,17 @@ int FindMugShotStateIndex(FName state)
|
|||
//===========================================================================
|
||||
|
||||
FMugShot::FMugShot()
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// FMugShot :: Reset
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
void FMugShot::Reset()
|
||||
{
|
||||
FaceHealth = -1;
|
||||
bEvilGrin = false;
|
||||
|
|
|
@ -190,8 +190,8 @@ class SBarInfoCommand
|
|||
}
|
||||
}
|
||||
|
||||
if(!fullScreenOffsets)
|
||||
y.SetCoord((negative ? -sc.Number : sc.Number) - (200 - script->height));
|
||||
//if(!fullScreenOffsets)
|
||||
// y.SetCoord((negative ? -sc.Number : sc.Number) - (200 - script->height));
|
||||
}
|
||||
EColorRange GetTranslation(FScanner &sc)
|
||||
{
|
||||
|
@ -367,6 +367,7 @@ enum //Key words
|
|||
SBARINFO_COMPLETEBORDER,
|
||||
SBARINFO_MONOSPACEFONTS,
|
||||
SBARINFO_LOWERHEALTHCAP,
|
||||
SBARINFO_RESOLUTION,
|
||||
SBARINFO_STATUSBAR,
|
||||
SBARINFO_MUGSHOT,
|
||||
SBARINFO_CREATEPOPUP,
|
||||
|
@ -394,6 +395,7 @@ static const char *SBarInfoTopLevel[] =
|
|||
"completeborder",
|
||||
"monospacefonts",
|
||||
"lowerhealthcap",
|
||||
"resolution",
|
||||
"statusbar",
|
||||
"mugshot",
|
||||
"createpopup",
|
||||
|
@ -579,6 +581,14 @@ void SBarInfo::ParseSBarInfo(int lump)
|
|||
}
|
||||
sc.MustGetToken(';');
|
||||
break;
|
||||
case SBARINFO_RESOLUTION:
|
||||
sc.MustGetToken(TK_IntConst);
|
||||
resW = sc.Number;
|
||||
sc.MustGetToken(',');
|
||||
sc.MustGetToken(TK_IntConst);
|
||||
resH = sc.Number;
|
||||
sc.MustGetToken(';');
|
||||
break;
|
||||
case SBARINFO_STATUSBAR:
|
||||
{
|
||||
if(!baseSet) //If the user didn't explicitly define a base, do so now.
|
||||
|
@ -761,6 +771,8 @@ void SBarInfo::Init()
|
|||
armorInterpolationSpeed = 8;
|
||||
height = 0;
|
||||
spacingCharacter = '\0';
|
||||
resW = 320;
|
||||
resH = 200;
|
||||
|
||||
for(unsigned int i = 0;i < NUMHUDS;i++)
|
||||
huds[i] = new SBarInfoMainBlock(this);
|
||||
|
@ -902,7 +914,7 @@ class DSBarInfo : public DBaseStatusBar
|
|||
{
|
||||
DECLARE_CLASS(DSBarInfo, DBaseStatusBar)
|
||||
public:
|
||||
DSBarInfo (SBarInfo *script=NULL) : DBaseStatusBar(script->height),
|
||||
DSBarInfo (SBarInfo *script=NULL) : DBaseStatusBar(script->height, script->resW, script->resH),
|
||||
ammo1(NULL), ammo2(NULL), ammocount1(0), ammocount2(0), armor(NULL),
|
||||
pendingPopup(POP_None), currentPopup(POP_None), lastHud(-1),
|
||||
lastInventoryBar(NULL), lastPopup(NULL)
|
||||
|
@ -1110,7 +1122,7 @@ public:
|
|||
fixed_t tmp = 0;
|
||||
// I'll handle the conversion from fixed to int myself for more control
|
||||
fixed_t fx = (x + ST_X).Coordinate() << FRACBITS;
|
||||
fixed_t fy = (y + ST_Y).Coordinate() << FRACBITS;
|
||||
fixed_t fy = (y + ST_Y - (Scaled ? script->resH : 200) + script->height).Coordinate() << FRACBITS;
|
||||
fixed_t fw = (forceWidth <= -1 ? texture->GetScaledWidth() : forceWidth) << FRACBITS;
|
||||
fixed_t fh = (forceHeight <= -1 ? texture->GetScaledHeight() : forceHeight) << FRACBITS;
|
||||
fixed_t fcx = cx == 0 ? 0 : fx + cx - (texture->GetScaledLeftOffset() << FRACBITS);
|
||||
|
@ -1120,10 +1132,16 @@ public:
|
|||
if(Scaled)
|
||||
{
|
||||
if(cx != 0 || cy != 0)
|
||||
screen->VirtualToRealCoordsFixed(fcx, fcy, tmp, tmp, 320, 200, true);
|
||||
screen->VirtualToRealCoordsFixed(fcx, fcy, tmp, tmp, script->resW, script->resH, true);
|
||||
if(cr != 0 || cb != 0 || clearDontDraw)
|
||||
screen->VirtualToRealCoordsFixed(fcr, fcb, tmp, tmp, 320, 200, true);
|
||||
screen->VirtualToRealCoordsFixed(fx, fy, fw, fh, 320, 200, true);
|
||||
screen->VirtualToRealCoordsFixed(fcr, fcb, tmp, tmp, script->resW, script->resH, true);
|
||||
screen->VirtualToRealCoordsFixed(fx, fy, fw, fh, script->resW, script->resH, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
fy += (200 - script->resH)<<FRACBITS;
|
||||
fcy += (200 - script->resH)<<FRACBITS;
|
||||
fcb += (200 - script->resH)<<FRACBITS;
|
||||
}
|
||||
// Round to nearest
|
||||
w = (fw + (FRACUNIT>>1)) >> FRACBITS;
|
||||
|
@ -1173,10 +1191,26 @@ public:
|
|||
int rx, ry, rcx=0, rcy=0, rcr=INT_MAX, rcb=INT_MAX;
|
||||
ADJUST_RELCENTER(x,y,rx,ry)
|
||||
|
||||
// We can't use DTA_HUDRules since it forces a width and height.
|
||||
// Translation: No high res.
|
||||
bool xright = rx < 0;
|
||||
bool ybot = ry < 0;
|
||||
|
||||
w = (forceWidth <= -1 ? texture->GetScaledWidth() : forceWidth);
|
||||
h = (forceHeight <= -1 ? texture->GetScaledHeight() : forceHeight);
|
||||
if(vid_fps && rx < 0 && ry >= 0)
|
||||
ry += 10;
|
||||
if(hud_scale)
|
||||
{
|
||||
rx *= CleanXfac * 320.0/script->resW;
|
||||
ry *= CleanYfac * 200.0/script->resH;
|
||||
w *= CleanXfac * 320.0/script->resW;
|
||||
h *= CleanYfac * 200.0/script->resH;
|
||||
}
|
||||
if(xright)
|
||||
rx = SCREENWIDTH + rx;
|
||||
if(ybot)
|
||||
ry = SCREENHEIGHT + ry;
|
||||
|
||||
// Check for clipping
|
||||
if(cx != 0 || cy != 0 || cr != 0 || cb != 0)
|
||||
|
@ -1189,34 +1223,34 @@ public:
|
|||
if(ry < 0)
|
||||
{
|
||||
if(rcy != 0)
|
||||
rcy = hud_scale ? SCREENHEIGHT + (rcy*CleanYfac) : SCREENHEIGHT + rcy;
|
||||
rcy = hud_scale ? SCREENHEIGHT + (rcy*CleanYfac*200.0/script->resH) : SCREENHEIGHT + rcy;
|
||||
if(rcb != INT_MAX)
|
||||
rcb = hud_scale ? SCREENHEIGHT + (rcb*CleanYfac) : SCREENHEIGHT + rcb;
|
||||
rcb = hud_scale ? SCREENHEIGHT + (rcb*CleanYfac*200.0/script->resH) : SCREENHEIGHT + rcb;
|
||||
}
|
||||
else if(hud_scale)
|
||||
{
|
||||
rcy *= CleanYfac;
|
||||
rcy *= CleanYfac*200.0/script->resH;
|
||||
if(rcb != INT_MAX)
|
||||
rcb *= CleanYfac;
|
||||
rcb *= CleanYfac*200.0/script->resH;
|
||||
}
|
||||
if(rx < 0)
|
||||
{
|
||||
if(rcx != 0)
|
||||
rcx = hud_scale ? SCREENWIDTH + (rcx*CleanXfac) : SCREENWIDTH + rcx;
|
||||
rcx = hud_scale ? SCREENWIDTH + (rcx*CleanXfac*320.0/script->resW) : SCREENWIDTH + rcx;
|
||||
if(rcr != INT_MAX)
|
||||
rcr = hud_scale ? SCREENWIDTH + (rcr*CleanXfac) : SCREENWIDTH + rcr;
|
||||
rcr = hud_scale ? SCREENWIDTH + (rcr*CleanXfac*320.0/script->resW) : SCREENWIDTH + rcr;
|
||||
}
|
||||
else if(hud_scale)
|
||||
{
|
||||
rcx *= CleanXfac;
|
||||
rcx *= CleanXfac*320.0/script->resW;
|
||||
if(rcr != INT_MAX)
|
||||
rcr *= CleanXfac;
|
||||
rcr *= CleanXfac*320.0/script->resW;
|
||||
}
|
||||
}
|
||||
|
||||
if(clearDontDraw)
|
||||
{
|
||||
screen->Clear(rcx, rcy, MIN<int>(rcr, w*(hud_scale ? CleanXfac : 1)), MIN<int>(rcb, h*(hud_scale ? CleanYfac : 1)), GPalette.BlackIndex, 0);
|
||||
screen->Clear(rcx, rcy, MIN<int>(rcr, w), MIN<int>(rcb, h), GPalette.BlackIndex, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1232,7 +1266,6 @@ public:
|
|||
DTA_Translation, translate ? GetTranslation() : 0,
|
||||
DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
|
||||
DTA_CenterBottomOffset, (offsetflags & SBarInfoCommand::CENTER_BOTTOM) == SBarInfoCommand::CENTER_BOTTOM,
|
||||
DTA_HUDRules, HUD_Normal,
|
||||
DTA_Alpha, alpha,
|
||||
DTA_AlphaChannel, alphaMap,
|
||||
DTA_FillColor, 0,
|
||||
|
@ -1250,7 +1283,6 @@ public:
|
|||
DTA_Translation, translate ? GetTranslation() : 0,
|
||||
DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
|
||||
DTA_CenterBottomOffset, (offsetflags & SBarInfoCommand::CENTER_BOTTOM) == SBarInfoCommand::CENTER_BOTTOM,
|
||||
DTA_HUDRules, HUD_Normal,
|
||||
DTA_Alpha, alpha,
|
||||
TAG_DONE);
|
||||
}
|
||||
|
@ -1297,9 +1329,13 @@ public:
|
|||
if(!fullScreenOffsets)
|
||||
{
|
||||
rx += ST_X;
|
||||
ry += ST_Y;
|
||||
ry += ST_Y - (Scaled ? script->resH : 200) + script->height;
|
||||
if(Scaled)
|
||||
screen->VirtualToRealCoordsInt(rx, ry, rw, rh, 320, 200, true);
|
||||
screen->VirtualToRealCoordsInt(rx, ry, rw, rh, script->resW, script->resH, true);
|
||||
else
|
||||
{
|
||||
ry += (200 - script->resH);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1340,12 +1376,26 @@ public:
|
|||
}
|
||||
else
|
||||
{
|
||||
bool xright = rx < 0;
|
||||
bool ybot = ry < 0;
|
||||
|
||||
if(hud_scale)
|
||||
{
|
||||
rx *= CleanXfac * 320.0/script->resW;
|
||||
ry *= CleanYfac * 200.0/script->resH;
|
||||
rw *= CleanXfac * 320.0/script->resW;
|
||||
rh *= CleanYfac * 200.0/script->resH;
|
||||
}
|
||||
if(xright)
|
||||
rx = SCREENWIDTH + rx;
|
||||
if(ybot)
|
||||
ry = SCREENHEIGHT + ry;
|
||||
|
||||
screen->DrawTexture(character, rx, ry,
|
||||
DTA_DestWidth, rw,
|
||||
DTA_DestHeight, rh,
|
||||
DTA_Translation, font->GetColorTranslation(translation),
|
||||
DTA_Alpha, alpha,
|
||||
DTA_HUDRules, HUD_Normal,
|
||||
TAG_DONE);
|
||||
}
|
||||
if(script->spacingCharacter == '\0')
|
||||
|
|
|
@ -98,6 +98,8 @@ struct SBarInfo
|
|||
int height;
|
||||
int gameType;
|
||||
FMugShot MugShot;
|
||||
int resW;
|
||||
int resH;
|
||||
|
||||
int GetGameType() { return gameType; }
|
||||
void ParseSBarInfo(int lump);
|
||||
|
|
|
@ -1175,6 +1175,10 @@ class CommandDrawMugShot : public SBarInfoCommand
|
|||
GetCoordinates(sc, fullScreenOffsets, x, y);
|
||||
sc.MustGetToken(';');
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
script->MugShot.Reset();
|
||||
}
|
||||
|
||||
protected:
|
||||
FString defaultFace; //Deprecated
|
||||
|
|
|
@ -175,7 +175,7 @@ void ST_LoadCrosshair(bool alwaysload)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
DBaseStatusBar::DBaseStatusBar (int reltop)
|
||||
DBaseStatusBar::DBaseStatusBar (int reltop, int hres, int vres)
|
||||
{
|
||||
Centering = false;
|
||||
FixedOrigin = false;
|
||||
|
@ -185,6 +185,8 @@ DBaseStatusBar::DBaseStatusBar (int reltop)
|
|||
Displacement = 0;
|
||||
CPlayer = NULL;
|
||||
ShowLog = false;
|
||||
HorizontalResolution = hres;
|
||||
VirticalResolution = vres;
|
||||
|
||||
SetScaled (st_scale);
|
||||
}
|
||||
|
@ -216,18 +218,20 @@ void DBaseStatusBar::Destroy ()
|
|||
//---------------------------------------------------------------------------
|
||||
|
||||
//[BL] Added force argument to have forcescaled mean forcescaled.
|
||||
// - Also, if the VirticalResolution is something other than the default (200)
|
||||
// We should always obey the value of scale.
|
||||
void DBaseStatusBar::SetScaled (bool scale, bool force)
|
||||
{
|
||||
Scaled = (RelTop != 0 || force) && (SCREENWIDTH != 320 && scale);
|
||||
Scaled = (RelTop != 0 || force) && ((SCREENWIDTH != 320 || HorizontalResolution != 320) && scale);
|
||||
|
||||
if (!Scaled)
|
||||
{
|
||||
ST_X = (SCREENWIDTH - 320) / 2;
|
||||
ST_X = (SCREENWIDTH - HorizontalResolution) / 2;
|
||||
ST_Y = SCREENHEIGHT - RelTop;
|
||||
::ST_Y = ST_Y;
|
||||
if (RelTop > 0)
|
||||
{
|
||||
Displacement = ((ST_Y * 200 / SCREENHEIGHT) - (200 - RelTop))*FRACUNIT/RelTop;
|
||||
Displacement = ((ST_Y * VirticalResolution / SCREENHEIGHT) - (VirticalResolution - RelTop))*FRACUNIT/RelTop;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -237,14 +241,14 @@ void DBaseStatusBar::SetScaled (bool scale, bool force)
|
|||
else
|
||||
{
|
||||
ST_X = 0;
|
||||
ST_Y = 200 - RelTop;
|
||||
ST_Y = VirticalResolution - RelTop;
|
||||
if (CheckRatio(SCREENWIDTH, SCREENHEIGHT) != 4)
|
||||
{ // Normal resolution
|
||||
::ST_Y = Scale (ST_Y, SCREENHEIGHT, 200);
|
||||
::ST_Y = Scale (ST_Y, SCREENHEIGHT, VirticalResolution);
|
||||
}
|
||||
else
|
||||
{ // 5:4 resolution
|
||||
::ST_Y = Scale(ST_Y - 100, SCREENHEIGHT*3, BaseRatioSizes[4][1]) + SCREENHEIGHT/2
|
||||
::ST_Y = Scale(ST_Y - VirticalResolution/2, SCREENHEIGHT*3, Scale(VirticalResolution, BaseRatioSizes[4][1], 200)) + SCREENHEIGHT/2
|
||||
+ (SCREENHEIGHT - SCREENHEIGHT * BaseRatioSizes[4][3] / 48) / 2;
|
||||
}
|
||||
Displacement = 0;
|
||||
|
@ -1000,7 +1004,7 @@ void DBaseStatusBar::RefreshBackground () const
|
|||
if (x > 0)
|
||||
{
|
||||
y = x == ST_X ? ST_Y : ::ST_Y;
|
||||
x2 = !(ratio & 3) || !Scaled ? ST_X+320 :
|
||||
x2 = !(ratio & 3) || !Scaled ? ST_X+HorizontalResolution :
|
||||
SCREENWIDTH - (SCREENWIDTH*(48-BaseRatioSizes[ratio][3])+48*2-1)/(48*2);
|
||||
R_DrawBorder (0, y, x, SCREENHEIGHT);
|
||||
R_DrawBorder (x2, y, SCREENWIDTH, SCREENHEIGHT);
|
||||
|
|
Loading…
Reference in a new issue