- 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:
Braden Obrzut 2010-05-21 19:56:13 +00:00
parent c4efbeb515
commit 9611e7310a
6 changed files with 103 additions and 30 deletions

View File

@ -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;

View File

@ -221,6 +221,17 @@ int FindMugShotStateIndex(FName state)
//===========================================================================
FMugShot::FMugShot()
{
Reset();
}
//===========================================================================
//
// FMugShot :: Reset
//
//===========================================================================
void FMugShot::Reset()
{
FaceHealth = -1;
bEvilGrin = false;

View File

@ -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')

View File

@ -98,6 +98,8 @@ struct SBarInfo
int height;
int gameType;
FMugShot MugShot;
int resW;
int resH;
int GetGameType() { return gameType; }
void ParseSBarInfo(int lump);

View File

@ -1175,6 +1175,10 @@ class CommandDrawMugShot : public SBarInfoCommand
GetCoordinates(sc, fullScreenOffsets, x, y);
sc.MustGetToken(';');
}
void Reset()
{
script->MugShot.Reset();
}
protected:
FString defaultFace; //Deprecated

View File

@ -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);