This commit is 90% contributed content:

- Added transference of a select few flags from PowerProtection to its owner.
- Added actor type parameters to A_PodPain() and A_MakePod().
- The savegame path is now passed through NicePath(), since it's user-
  specifiable.
- Added save_dir cvar. When non-empty, it controls where savegames go.
- SBARINFO update:
  * Added the ability to center things with fullscreenoffsets enabled.  Due
    to some limitations the syntax is [-]<integer> [+ center].
  * Fixed: the translucent flag on drawinventorybar didn't work quite right.
  * Fixed: Extremely minor inaccuracy in the Doom SBarInfo code.  The
    fullscreen inventory bar wasn't scaled correctly.


SVN r1571 (trunk)
This commit is contained in:
Randy Heit 2009-05-09 02:31:49 +00:00
parent a9c396a8ce
commit 41a416f068
9 changed files with 305 additions and 142 deletions

View file

@ -1,4 +1,17 @@
May 3, 2009 (Changes by Graf Zahl) May 8, 2009
- Added transference of a select few flags from PowerProtection to its owner.
- Added actor type parameters to A_PodPain() and A_MakePod().
- The savegame path is now passed through NicePath(), since it's user-
specifiable.
- Added save_dir cvar. When non-empty, it controls where savegames go.
- SBARINFO update:
* Added the ability to center things with fullscreenoffsets enabled. Due
to some limitations the syntax is [-]<integer> [+ center].
* Fixed: the translucent flag on drawinventorybar didn't work quite right.
* Fixed: Extremely minor inaccuracy in the Doom SBarInfo code. The
fullscreen inventory bar wasn't scaled correctly.
May 3, 2009 (Changes by Graf Zahl)
- fixed: The CHECKSWITCHRANGE line flag was ignored for one sided lines. - fixed: The CHECKSWITCHRANGE line flag was ignored for one sided lines.
- Added more compatibility settings, submitted by Gez. - Added more compatibility settings, submitted by Gez.

View file

@ -104,6 +104,7 @@ CVAR (Int, deathmatch, 0, CVAR_SERVERINFO|CVAR_LATCH);
CVAR (Bool, chasedemo, false, 0); CVAR (Bool, chasedemo, false, 0);
CVAR (Bool, storesavepic, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, storesavepic, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (Bool, longsavemessages, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, longsavemessages, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (String, save_dir, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG);
gameaction_t gameaction; gameaction_t gameaction;
gamestate_t gamestate = GS_STARTUP; gamestate_t gamestate = GS_STARTUP;
@ -1760,32 +1761,28 @@ void G_SaveGame (const char *filename, const char *description)
FString G_BuildSaveName (const char *prefix, int slot) FString G_BuildSaveName (const char *prefix, int slot)
{ {
FString name; FString name;
const char *leader; FString leader;
const char *slash = ""; const char *slash = "";
if (NULL != (leader = Args->CheckValue ("-savedir"))) leader = Args->CheckValue ("-savedir");
if (leader.IsEmpty())
{ {
size_t len = strlen (leader);
if (leader[len-1] != '\\' && leader[len-1] != '/')
{
slash = "/";
}
}
#ifndef unix #ifndef unix
else if (Args->CheckParm ("-cdrom")) if (Args->CheckParm ("-cdrom"))
{ {
leader = CDROM_DIR "/"; leader = CDROM_DIR "/";
} }
else else
{
leader = progdir;
}
#else
else
{
leader = "";
}
#endif #endif
{
leader = save_dir;
}
}
size_t len = leader.Len();
if (leader[0] != '\0' && leader[len-1] != '\\' && leader[len-1] != '/')
{
slash = "/";
}
if (slot < 0) if (slot < 0)
{ {
name.Format ("%s%s%s", leader, slash, prefix); name.Format ("%s%s%s", leader, slash, prefix);
@ -1797,10 +1794,10 @@ FString G_BuildSaveName (const char *prefix, int slot)
#ifdef unix #ifdef unix
if (leader[0] == 0) if (leader[0] == 0)
{ {
name = GetUserFile (name); return GetUserFile (name);
} }
#endif #endif
return name; return NicePath(name);
} }
CVAR (Int, autosavenum, 0, CVAR_NOSET|CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Int, autosavenum, 0, CVAR_NOSET|CVAR_ARCHIVE|CVAR_GLOBALCONFIG)

View file

@ -40,8 +40,11 @@ static FRandom pr_volcimpact ("VolcBallImpact");
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
DEFINE_ACTION_FUNCTION(AActor, A_PodPain) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PodPain)
{ {
ACTION_PARAM_START(1);
ACTION_PARAM_CLASS(gootype, 0);
int count; int count;
int chance; int chance;
AActor *goo; AActor *goo;
@ -53,7 +56,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_PodPain)
} }
for (count = chance > 240 ? 2 : 1; count; count--) for (count = chance > 240 ? 2 : 1; count; count--)
{ {
goo = Spawn("PodGoo", self->x, self->y, self->z + 48*FRACUNIT, ALLOW_REPLACE); goo = Spawn(gootype, self->x, self->y, self->z + 48*FRACUNIT, ALLOW_REPLACE);
goo->target = self; goo->target = self;
goo->momx = pr_podpain.Random2() << 9; goo->momx = pr_podpain.Random2() << 9;
goo->momy = pr_podpain.Random2() << 9; goo->momy = pr_podpain.Random2() << 9;
@ -88,8 +91,11 @@ DEFINE_ACTION_FUNCTION(AActor, A_RemovePod)
#define MAX_GEN_PODS 16 #define MAX_GEN_PODS 16
DEFINE_ACTION_FUNCTION(AActor, A_MakePod) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_MakePod)
{ {
ACTION_PARAM_START(1);
ACTION_PARAM_CLASS(podtype, 0);
AActor *mo; AActor *mo;
fixed_t x; fixed_t x;
fixed_t y; fixed_t y;
@ -102,7 +108,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_MakePod)
x = self->x; x = self->x;
y = self->y; y = self->y;
z = self->z; z = self->z;
mo = Spawn("Pod", x, y, ONFLOORZ, ALLOW_REPLACE); mo = Spawn(podtype, x, y, ONFLOORZ, ALLOW_REPLACE);
if (!P_CheckPosition (mo, x, y)) if (!P_CheckPosition (mo, x, y))
{ // Didn't fit { // Didn't fit
mo->Destroy (); mo->Destroy ();

View file

@ -552,10 +552,13 @@ IMPLEMENT_CLASS (APowerInvisibility)
void APowerInvisibility::CommonInit() void APowerInvisibility::CommonInit()
{ {
if (Owner != NULL)
{
Owner->flags |= MF_SHADOW; Owner->flags |= MF_SHADOW;
// transfer seeker missile blocking (but only if the owner does not already have this flag // transfer seeker missile blocking (but only if the owner does not already have this flag
if (!(Owner->flags5 & MF5_CANTSEEK) && (flags5 & MF5_CANTSEEK)) Owner->flags5 |= MF5_CANTSEEK; if (!(Owner->flags5 & MF5_CANTSEEK) && (flags5 & MF5_CANTSEEK)) Owner->flags5 |= MF5_CANTSEEK;
else flags5 &= ~MF5_CANTSEEK; else flags5 &= ~MF5_CANTSEEK;
}
} }
//=========================================================================== //===========================================================================
@ -1522,7 +1525,10 @@ void APowerDamage::ModifyDamage(int damage, FName damageType, int &newdamage, bo
// Quarter damage powerup ------------------------------------------------------ // Quarter damage powerup ------------------------------------------------------
IMPLEMENT_CLASS( APowerProtection) IMPLEMENT_CLASS(APowerProtection)
#define PROTECTION_FLAGS3 (MF3_NORADIUSDMG | MF3_DONTMORPH | MF3_DONTSQUASH | MF3_DONTBLAST | MF3_NOTELEOTHER)
#define PROTECTION_FLAGS5 (MF5_NOPAIN | MF5_DONTRIP)
//=========================================================================== //===========================================================================
// //
@ -1532,8 +1538,19 @@ IMPLEMENT_CLASS( APowerProtection)
void APowerProtection::InitEffect( ) void APowerProtection::InitEffect( )
{ {
// Use sound channel 5 to avoid interference with other actions. if (Owner != NULL)
if (Owner != NULL) S_Sound(Owner, 5, SeeSound, 1.0f, ATTN_NONE); {
S_Sound(Owner, CHAN_AUTO, SeeSound, 1.0f, ATTN_NONE);
// Transfer various protection flags if owner does not already have them.
// If the owner already has the flag, clear it from the powerup.
// If the powerup still has a flag set, add it to the owner.
flags3 &= ~(Owner->flags3 & PROTECTION_FLAGS3);
Owner->flags3 |= flags3 & PROTECTION_FLAGS3;
flags5 &= ~(Owner->flags5 & PROTECTION_FLAGS5);
Owner->flags5 |= flags5 & PROTECTION_FLAGS5;
}
} }
//=========================================================================== //===========================================================================
@ -1544,8 +1561,12 @@ void APowerProtection::InitEffect( )
void APowerProtection::EndEffect( ) void APowerProtection::EndEffect( )
{ {
// Use sound channel 5 to avoid interference with other actions. if (Owner != NULL)
if (Owner != NULL) S_Sound(Owner, 5, DeathSound, 1.0f, ATTN_NONE); {
S_Sound(Owner, CHAN_AUTO, DeathSound, 1.0f, ATTN_NONE);
Owner->flags3 &= ~(flags3 & PROTECTION_FLAGS3);
Owner->flags5 &= ~(flags5 & PROTECTION_FLAGS5);
}
} }
//=========================================================================== //===========================================================================
@ -1559,27 +1580,30 @@ void APowerProtection::ModifyDamage(int damage, FName damageType, int &newdamage
static const fixed_t def = FRACUNIT/4; static const fixed_t def = FRACUNIT/4;
if (passive && damage > 0) if (passive && damage > 0)
{ {
const fixed_t * pdf = NULL; const fixed_t *pdf = NULL;
DmgFactors * df = GetClass()->ActorInfo->DamageFactors; DmgFactors *df = GetClass()->ActorInfo->DamageFactors;
if (df != NULL && df->CountUsed() != 0) if (df != NULL && df->CountUsed() != 0)
{ {
pdf = df->CheckKey(damageType); pdf = df->CheckKey(damageType);
if (pdf== NULL && damageType != NAME_None) pdf = df->CheckKey(NAME_None); if (pdf == NULL && damageType != NAME_None) pdf = df->CheckKey(NAME_None);
} }
else pdf = &def; else pdf = &def;
if (pdf != NULL) if (pdf != NULL)
{ {
damage = newdamage = FixedMul(damage, *pdf); damage = newdamage = FixedMul(damage, *pdf);
if (Owner != NULL && *pdf < FRACUNIT) S_Sound(Owner, 5, ActiveSound, 1.0f, ATTN_NONE); if (Owner != NULL && *pdf < FRACUNIT) S_Sound(Owner, CHAN_AUTO, ActiveSound, 1.0f, ATTN_NONE);
} }
} }
if (Inventory != NULL) Inventory->ModifyDamage(damage, damageType, newdamage, passive); if (Inventory != NULL)
{
Inventory->ModifyDamage(damage, damageType, newdamage, passive);
}
} }
// Drain rune ------------------------------------------------------- // Drain rune -------------------------------------------------------
IMPLEMENT_CLASS( APowerDrain) IMPLEMENT_CLASS(APowerDrain)
//=========================================================================== //===========================================================================
// //
@ -1615,7 +1639,7 @@ void APowerDrain::EndEffect( )
// Regeneration rune ------------------------------------------------------- // Regeneration rune -------------------------------------------------------
IMPLEMENT_CLASS( APowerRegeneration) IMPLEMENT_CLASS(APowerRegeneration)
//=========================================================================== //===========================================================================
// //
@ -1650,7 +1674,7 @@ void APowerRegeneration::EndEffect( )
// High jump rune ------------------------------------------------------- // High jump rune -------------------------------------------------------
IMPLEMENT_CLASS( APowerHighJump) IMPLEMENT_CLASS(APowerHighJump)
//=========================================================================== //===========================================================================
// //
@ -1685,7 +1709,7 @@ void APowerHighJump::EndEffect( )
// Morph powerup ------------------------------------------------------ // Morph powerup ------------------------------------------------------
IMPLEMENT_CLASS( APowerMorph) IMPLEMENT_CLASS(APowerMorph)
//=========================================================================== //===========================================================================
// //

View file

@ -45,6 +45,41 @@
class FBarTexture; class FBarTexture;
class FScanner; class FScanner;
/**
* This class is used to help prevent errors that may occur from adding or
* subtracting from coordinates.
*
* In order to provide the maximum flexibility, coordinates can be stored as an
* int with the 31st bit representing REL_CENTER. This class can handle this
* flag.
*/
class SBarInfoCoordinate
{
public:
static const int REL_CENTER = 0x40000000;
SBarInfoCoordinate() {}
SBarInfoCoordinate(int coord, bool relCenter);
SBarInfoCoordinate(int value);
SBarInfoCoordinate &Add(int add);
int Coordinate() const { return value; }
bool RelCenter() const { return relCenter; }
int Value() const { return value | (relCenter ? REL_CENTER : 0); }
int operator* () const { return Coordinate(); }
SBarInfoCoordinate operator+ (int add) const { return SBarInfoCoordinate(*this).Add(add); }
SBarInfoCoordinate operator+ (const SBarInfoCoordinate &other) const { return SBarInfoCoordinate(*this).Add(other.Coordinate()); }
SBarInfoCoordinate operator- (int sub) const { return SBarInfoCoordinate(*this).Add(-sub); }
SBarInfoCoordinate operator- (const SBarInfoCoordinate &other) const { return SBarInfoCoordinate(*this).Add(-other.Coordinate()); }
void operator+= (int add) { Add(add); }
void operator-= (int sub) { Add(-sub); }
protected:
int value;
bool relCenter;
};
struct SBarInfoCommand; //we need to be able to use this before it is defined. struct SBarInfoCommand; //we need to be able to use this before it is defined.
struct MugShotState; struct MugShotState;
@ -103,8 +138,8 @@ struct SBarInfoCommand
int special3; int special3;
int special4; int special4;
int flags; int flags;
int x; SBarInfoCoordinate x;
int y; SBarInfoCoordinate y;
int value; int value;
int image_index; int image_index;
FTextureID sprite_index; FTextureID sprite_index;
@ -136,7 +171,8 @@ struct SBarInfo
void ParseSBarInfo(int lump); void ParseSBarInfo(int lump);
void ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block); void ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block);
void ParseMugShotBlock(FScanner &sc, FMugShotState &state); void ParseMugShotBlock(FScanner &sc, FMugShotState &state);
void getCoordinates(FScanner &sc, SBarInfoCommand &cmd, bool fullScreenOffsets); //retrieves the next two arguments as x and y. void getCoordinates(FScanner &sc, bool fullScreenOffsets, int &x, int &y); //retrieves the next two arguments as x and y.
void getCoordinates(FScanner &sc, bool fullScreenOffsets, SBarInfoCoordinate &x, SBarInfoCoordinate &y);
int getSignedInteger(FScanner &sc); //returns a signed integer. int getSignedInteger(FScanner &sc); //returns a signed integer.
int newImage(const char* patchname); int newImage(const char* patchname);
void Init(); void Init();
@ -144,6 +180,7 @@ struct SBarInfo
SBarInfo(); SBarInfo();
SBarInfo(int lumpnum); SBarInfo(int lumpnum);
~SBarInfo(); ~SBarInfo();
static void Load(); static void Load();
}; };
@ -151,7 +188,6 @@ struct SBarInfo
#define SCRIPT_DEFAULT 1 #define SCRIPT_DEFAULT 1
extern SBarInfo *SBarInfoScript[2]; extern SBarInfo *SBarInfoScript[2];
// Enums used between the parser and the display // Enums used between the parser and the display
enum //gametype flags enum //gametype flags
{ {
@ -359,14 +395,14 @@ public:
void SetMugShotState(const char* stateName, bool waitTillDone=false, bool reset=false); void SetMugShotState(const char* stateName, bool waitTillDone=false, bool reset=false);
private: private:
void doCommands(SBarInfoBlock &block, int xOffset=0, int yOffset=0, int alpha=FRACUNIT); void doCommands(SBarInfoBlock &block, int xOffset=0, int yOffset=0, int alpha=FRACUNIT);
void DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool translate=false, bool dim=false, int offsetflags=0); void DrawGraphic(FTexture* texture, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool translate=false, bool dim=false, int offsetflags=0);
void DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing=0, bool drawshadow=false); void DrawString(const char* str, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing=0, bool drawshadow=false);
void DrawNumber(int num, int len, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing=0, bool fillzeros=false, bool drawshadow=false); void DrawNumber(int num, int len, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing=0, bool fillzeros=false, bool drawshadow=false);
void DrawFace(const char *defaultFace, int accuracy, int stateflags, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets); void DrawFace(const char *defaultFace, int accuracy, int stateflags, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets);
int updateState(bool xdth, bool animatedgodmode); int updateState(bool xdth, bool animatedgodmode);
void DrawInventoryBar(int type, int num, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool alwaysshow, void DrawInventoryBar(int type, int num, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool alwaysshow,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter, int bgalpha); SBarInfoCoordinate counterx, SBarInfoCoordinate countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter, int bgalpha);
void DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, int padleft, int padright, int chainsize, void DrawGem(FTexture* chain, FTexture* gem, int value, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, int padleft, int padright, int chainsize,
bool wiggle, bool translate); bool wiggle, bool translate);
FRemapTable* getTranslation(); FRemapTable* getTranslation();

View file

@ -79,6 +79,40 @@ enum
imgINVRTGEM2, imgINVRTGEM2,
}; };
#define ADJUST_RELCENTER(x, y, outX, outY) \
if(x.RelCenter()) \
outX = *x + SCREENWIDTH/(hud_scale ? CleanXfac*2 : 2); \
else \
outX = *x; \
if(y.RelCenter()) \
outY = *y + SCREENHEIGHT/(hud_scale ? CleanYfac*2 : 2); \
else \
outY = *y;
////////////////////////////////////////////////////////////////////////////////
SBarInfoCoordinate::SBarInfoCoordinate(int coord, bool relCenter) :
value(coord), relCenter(relCenter)
{
}
SBarInfoCoordinate::SBarInfoCoordinate(int value)
{
relCenter = ((value & REL_CENTER) != 0);
if(value < 0)
this->value = (value | REL_CENTER);
else
this->value = (value & (~REL_CENTER));
}
SBarInfoCoordinate &SBarInfoCoordinate::Add(int add)
{
value += add;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
//Used for shading //Used for shading
FBarShader::FBarShader(bool vertical, bool reverse) //make an alpha map FBarShader::FBarShader(bool vertical, bool reverse) //make an alpha map
{ {
@ -914,8 +948,8 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
if(!block.fullScreenOffsets) if(!block.fullScreenOffsets)
{ {
// Calc real screen coordinates for bar // Calc real screen coordinates for bar
x = (cmd.x + ST_X + xOffset) << FRACBITS; x = *(cmd.x + ST_X + xOffset) << FRACBITS;
y = (cmd.y + ST_Y + yOffset) << FRACBITS; y = *(cmd.y + ST_Y + yOffset) << FRACBITS;
w = fg->GetScaledWidth() << FRACBITS; w = fg->GetScaledWidth() << FRACBITS;
h = fg->GetScaledHeight() << FRACBITS; h = fg->GetScaledHeight() << FRACBITS;
if (Scaled) if (Scaled)
@ -929,10 +963,13 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
} }
else else
{ {
x = cmd.x + xOffset; ADJUST_RELCENTER(cmd.x,cmd.y,x,y)
y = cmd.y + yOffset;
x += xOffset;
y += yOffset;
w = fg->GetScaledWidth(); w = fg->GetScaledWidth();
h = fg->GetScaledHeight(); h = fg->GetScaledHeight();
if(vid_fps && x < 0 && y >= 0) if(vid_fps && x < 0 && y >= 0)
y += 10; y += 10;
} }
@ -951,15 +988,26 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
} }
else else
{ {
screen->Clear(x, y, x + w, y + h, GPalette.BlackIndex, 0); int clx = x;
int cly = y;
int clw = x + w;
int clh = y + h;
if(block.fullScreenOffsets)
{
clx = x < 0 ? SCREENWIDTH + x : x;
cly = y < 0 ? SCREENHEIGHT + y : y;
clw = clx+w > SCREENWIDTH ? SCREENWIDTH-clx : clx+w;
clh = cly+h > SCREENHEIGHT ? SCREENHEIGHT-cly : cly+h;
}
screen->Clear(clx, cly, clw, clh, GPalette.BlackIndex, 0);
} }
} }
if(!block.fullScreenOffsets) if(!block.fullScreenOffsets)
{ {
// Calc clipping rect for background // Calc clipping rect for background
cx = (cmd.x + ST_X + cmd.special3 + xOffset) << FRACBITS; cx = *(cmd.x + ST_X + cmd.special3 + xOffset) << FRACBITS;
cy = (cmd.y + ST_Y + cmd.special3 + yOffset) << FRACBITS; cy = *(cmd.y + ST_Y + cmd.special3 + yOffset) << FRACBITS;
cw = (fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2) << FRACBITS; cw = (fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2) << FRACBITS;
ch = (fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2) << FRACBITS; ch = (fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2) << FRACBITS;
if (Scaled) if (Scaled)
@ -973,8 +1021,10 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
} }
else else
{ {
cx = cmd.x + cmd.special3 + xOffset; ADJUST_RELCENTER(cmd.x,cmd.y,cx,cy)
cy = cmd.y + cmd.special3 + yOffset;
cx += cmd.special3 + xOffset;
cy += cmd.special3 + yOffset;
cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2; cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2;
ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2; ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2;
if(vid_fps && x < 0 && y >= 0) if(vid_fps && x < 0 && y >= 0)
@ -1128,8 +1178,8 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
}; };
bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL); bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL);
bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE); bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE);
int x = cmd.x + xOffset; SBarInfoCoordinate x = cmd.x + xOffset;
int y = cmd.y + yOffset; SBarInfoCoordinate y = cmd.y + yOffset;
int w = cmd.special; int w = cmd.special;
int h = cmd.special2; int h = cmd.special2;
if(!block.fullScreenOffsets) if(!block.fullScreenOffsets)
@ -1137,16 +1187,22 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
x += ST_X; x += ST_X;
y += ST_Y; y += ST_Y;
if(Scaled) if(Scaled)
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true); {
int tmpX = *x;
int tmpY = *y;
screen->VirtualToRealCoordsInt(tmpX, tmpY, w, h, 320, 200, true);
x = tmpX;
y = tmpY;
}
} }
else else
{ {
if(vid_fps && x < 0 && y >= 0) if(vid_fps && *x < 0 && *y >= 0)
y += 10; y += 10;
} }
if(!block.fullScreenOffsets) if(!block.fullScreenOffsets)
{ {
screen->DrawTexture (shaders[(vertical << 1) + reverse], x, y, screen->DrawTexture (shaders[(vertical << 1) + reverse], *x, *y,
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Alpha, alpha, DTA_Alpha, alpha,
@ -1156,7 +1212,10 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
} }
else else
{ {
screen->DrawTexture (shaders[(vertical << 1) + reverse], x, y, int rx, ry;
ADJUST_RELCENTER(x,y,rx,ry)
screen->DrawTexture (shaders[(vertical << 1) + reverse], rx, ry,
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Alpha, alpha, DTA_Alpha, alpha,
@ -1392,7 +1451,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
} }
//draws an image with the specified flags //draws an image with the specified flags
void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, void DSBarInfo::DrawGraphic(FTexture* texture, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets,
bool translate, bool dim, int offsetflags) //flags bool translate, bool dim, int offsetflags) //flags
{ {
if (texture == NULL) if (texture == NULL)
@ -1410,18 +1469,16 @@ void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yO
if(!fullScreenOffsets) if(!fullScreenOffsets)
{ {
// I'll handle the conversion from fixed to int myself for more control // I'll handle the conversion from fixed to int myself for more control
fixed_t fx = (x + ST_X) << FRACBITS; fixed_t fx = (x + ST_X).Coordinate() << FRACBITS;
fixed_t fy = (y + ST_Y) << FRACBITS; fixed_t fy = (y + ST_Y).Coordinate() << FRACBITS;
fixed_t fw = texture->GetScaledWidth() << FRACBITS; fixed_t fw = texture->GetScaledWidth() << FRACBITS;
fixed_t fh = texture->GetScaledHeight() << FRACBITS; fixed_t fh = texture->GetScaledHeight() << FRACBITS;
if(Scaled) if(Scaled)
screen->VirtualToRealCoords(fx, fy, fw, fh, 320, 200, true); screen->VirtualToRealCoords(fx, fy, fw, fh, 320, 200, true);
x = fx >> FRACBITS;
y = fy >> FRACBITS;
// Round to nearest // Round to nearest
w = (fw + (FRACUNIT>>1)) >> FRACBITS; w = (fw + (FRACUNIT>>1)) >> FRACBITS;
h = (fh + (FRACUNIT>>1)) >> FRACBITS; h = (fh + (FRACUNIT>>1)) >> FRACBITS;
screen->DrawTexture(texture, x, y, screen->DrawTexture(texture, (fx >> FRACBITS), (fy >> FRACBITS),
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Translation, translate ? getTranslation() : 0, DTA_Translation, translate ? getTranslation() : 0,
@ -1432,11 +1489,14 @@ void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yO
} }
else else
{ {
int rx, ry;
ADJUST_RELCENTER(x,y,rx,ry)
w = texture->GetScaledWidth(); w = texture->GetScaledWidth();
h = texture->GetScaledHeight(); h = texture->GetScaledHeight();
if(vid_fps && x < 0 && y >= 0) if(vid_fps && rx < 0 && ry >= 0)
y += 10; ry += 10;
screen->DrawTexture(texture, x, y, screen->DrawTexture(texture, rx, ry,
DTA_DestWidth, w, DTA_DestWidth, w,
DTA_DestHeight, h, DTA_DestHeight, h,
DTA_Translation, translate ? getTranslation() : 0, DTA_Translation, translate ? getTranslation() : 0,
@ -1448,9 +1508,15 @@ void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yO
} }
} }
void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing, bool drawshadow) void DSBarInfo::DrawString(const char* str, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing, bool drawshadow)
{ {
x += spacing; x += spacing;
int ax = *x;
int ay = *y;
if(fullScreenOffsets)
{
ADJUST_RELCENTER(x,y,ax,ay)
}
while(*str != '\0') while(*str != '\0')
{ {
if(*str == ' ') if(*str == ' ')
@ -1474,8 +1540,8 @@ void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffs
x += (character->LeftOffset+1); //ignore x offsets since we adapt to character size x += (character->LeftOffset+1); //ignore x offsets since we adapt to character size
int rx, ry, rw, rh; int rx, ry, rw, rh;
rx = x + xOffset; rx = ax + xOffset;
ry = y + yOffset; ry = ay + yOffset;
rw = character->GetScaledWidth(); rw = character->GetScaledWidth();
rh = character->GetScaledHeight(); rh = character->GetScaledHeight();
if(!fullScreenOffsets) if(!fullScreenOffsets)
@ -1487,8 +1553,8 @@ void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffs
} }
else else
{ {
if(vid_fps && x < 0 && y >= 0) if(vid_fps && ax < 0 && ay >= 0)
y += 10; ry += 10;
} }
if(drawshadow) if(drawshadow)
{ {
@ -1533,15 +1599,15 @@ void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffs
TAG_DONE); TAG_DONE);
} }
if(script->spacingCharacter == '\0') if(script->spacingCharacter == '\0')
x += width + spacing - (character->LeftOffset+1); ax += width + spacing - (character->LeftOffset+1);
else //width gets changed at the call to GetChar() else //width gets changed at the call to GetChar()
x += drawingFont->GetCharWidth((int) script->spacingCharacter) + spacing; ax += drawingFont->GetCharWidth((int) script->spacingCharacter) + spacing;
str++; str++;
} }
} }
//draws the specified number up to len digits //draws the specified number up to len digits
void DSBarInfo::DrawNumber(int num, int len, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing, bool fillzeros, bool drawshadow) void DSBarInfo::DrawNumber(int num, int len, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing, bool fillzeros, bool drawshadow)
{ {
FString value; FString value;
int maxval = (int) ceil(pow(10., len))-1; int maxval = (int) ceil(pow(10., len))-1;
@ -1570,7 +1636,7 @@ void DSBarInfo::DrawNumber(int num, int len, int x, int y, int xOffset, int yOff
} }
//draws the mug shot //draws the mug shot
void DSBarInfo::DrawFace(const char *defaultFace, int accuracy, int stateflags, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets) void DSBarInfo::DrawFace(const char *defaultFace, int accuracy, int stateflags, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets)
{ {
FTexture *face = MugShot.GetFace(CPlayer, defaultFace, accuracy, stateflags); FTexture *face = MugShot.GetFace(CPlayer, defaultFace, accuracy, stateflags);
if (face != NULL) if (face != NULL)
@ -1579,8 +1645,8 @@ void DSBarInfo::DrawFace(const char *defaultFace, int accuracy, int stateflags,
} }
} }
void DSBarInfo::DrawInventoryBar(int type, int num, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool alwaysshow, void DSBarInfo::DrawInventoryBar(int type, int num, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool alwaysshow,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter, int bgalpha) SBarInfoCoordinate counterx, SBarInfoCoordinate countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter, int bgalpha)
{ //yes, there is some Copy & Paste here too { //yes, there is some Copy & Paste here too
AInventory *item; AInventory *item;
int i; int i;
@ -1592,59 +1658,60 @@ void DSBarInfo::DrawInventoryBar(int type, int num, int x, int y, int xOffset, i
{ {
for(item = CPlayer->mo->InvFirst, i = 0; item != NULL && i < num; item = item->NextInv(), ++i) for(item = CPlayer->mo->InvFirst, i = 0; item != NULL && i < num; item = item->NextInv(), ++i)
{ {
SBarInfoCoordinate rx = x + i*spacing;
if(drawArtiboxes) if(drawArtiboxes)
{ {
DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*spacing, y, xOffset, yOffset, bgalpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgARTIBOX], rx, y, xOffset, yOffset, bgalpha, fullScreenOffsets);
} }
if(type != GAME_Strife) //Strife draws the cursor before the icons if(type != GAME_Strife) //Strife draws the cursor before the icons
DrawGraphic(TexMan(item->Icon), x+i*spacing, y, xOffset, yOffset, alpha, fullScreenOffsets, false, item->Amount <= 0); DrawGraphic(TexMan(item->Icon), rx, y, xOffset, yOffset, alpha, fullScreenOffsets, false, item->Amount <= 0);
if(item == CPlayer->mo->InvSel) if(item == CPlayer->mo->InvSel)
{ {
if(type == GAME_Heretic) if(type == GAME_Heretic)
{ {
DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*spacing, y+29, xOffset, yOffset, alpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgSELECTBOX], rx, y+29, xOffset, yOffset, alpha, fullScreenOffsets);
} }
else if(type == GAME_Hexen) else if(type == GAME_Hexen)
{ {
DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*spacing, y-1, xOffset, yOffset, alpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgSELECTBOX], rx, y-1, xOffset, yOffset, alpha, fullScreenOffsets);
} }
else if(type == GAME_Strife) else if(type == GAME_Strife)
{ {
DrawGraphic(Images[invBarOffset + imgCURSOR], x+i*spacing-6, y-2, xOffset, yOffset, alpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgCURSOR], rx-6, y-2, xOffset, yOffset, alpha, fullScreenOffsets);
} }
else else
{ {
DrawGraphic(Images[invBarOffset + imgSELECTBOX], x+i*spacing, y, xOffset, yOffset, alpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgSELECTBOX], rx, y, xOffset, yOffset, alpha, fullScreenOffsets);
} }
} }
if(type == GAME_Strife) if(type == GAME_Strife)
DrawGraphic(TexMan(item->Icon), x+i*spacing, y, xOffset, yOffset, alpha, fullScreenOffsets, false, item->Amount <= 0); DrawGraphic(TexMan(item->Icon), rx, y, xOffset, yOffset, alpha, fullScreenOffsets, false, item->Amount <= 0);
if(alwaysshowcounter || item->Amount != 1) if(alwaysshowcounter || item->Amount != 1)
{ {
DrawNumber(item->Amount, 3, counterx+i*spacing, countery, xOffset, yOffset, alpha, fullScreenOffsets, translation); DrawNumber(item->Amount, 3, counterx + (i*spacing), countery, xOffset, yOffset, alpha, fullScreenOffsets, translation);
} }
} }
for (; i < num && drawArtiboxes; ++i) for (; i < num && drawArtiboxes; ++i)
{ {
DrawGraphic(Images[invBarOffset + imgARTIBOX], x+i*spacing, y, xOffset, yOffset, alpha, fullScreenOffsets); DrawGraphic(Images[invBarOffset + imgARTIBOX], x + (i*spacing), y, xOffset, yOffset, bgalpha, fullScreenOffsets);
} }
// Is there something to the left? // Is there something to the left?
if (!noArrows && CPlayer->mo->FirstInv() != CPlayer->mo->InvFirst) if (!noArrows && CPlayer->mo->FirstInv() != CPlayer->mo->InvFirst)
{ {
DrawGraphic(Images[!(gametic & 4) ? DrawGraphic(Images[!(gametic & 4) ?
invBarOffset + imgINVLFGEM1 : invBarOffset + imgINVLFGEM2], (type != GAME_Strife) ? x-12 : x-14, y, xOffset, yOffset, alpha, fullScreenOffsets); invBarOffset + imgINVLFGEM1 : invBarOffset + imgINVLFGEM2], x + ((type != GAME_Strife) ? -12 : -14), y, xOffset, yOffset, alpha, fullScreenOffsets);
} }
// Is there something to the right? // Is there something to the right?
if (!noArrows && item != NULL) if (!noArrows && item != NULL)
{ {
DrawGraphic(Images[!(gametic & 4) ? DrawGraphic(Images[!(gametic & 4) ?
invBarOffset + imgINVRTGEM1 : invBarOffset + imgINVRTGEM2], (type != GAME_Strife) ? x+num*31+2 : x+num*35-4, y, xOffset, yOffset, alpha, fullScreenOffsets); invBarOffset + imgINVRTGEM1 : invBarOffset + imgINVRTGEM2], x + ((type != GAME_Strife) ? num*31+2 : num*35-4), y, xOffset, yOffset, alpha, fullScreenOffsets);
} }
} }
} }
//draws heretic/hexen style life gems //draws heretic/hexen style life gems
void DSBarInfo::DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, int padleft, int padright, int chainsize, void DSBarInfo::DrawGem(FTexture* chain, FTexture* gem, int value, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, int padleft, int padright, int chainsize,
bool wiggle, bool translate) bool wiggle, bool translate)
{ {
if(chain == NULL) if(chain == NULL)

View file

@ -525,7 +525,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
cmd.sprite_index.SetInvalid(); cmd.sprite_index.SetInvalid();
} }
sc.MustGetToken(','); sc.MustGetToken(',');
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
if(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
sc.MustGetToken(TK_Identifier); sc.MustGetToken(TK_Identifier);
@ -658,7 +658,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
if(!sc.CheckToken('|')) if(!sc.CheckToken('|'))
sc.MustGetToken(','); sc.MustGetToken(',');
} }
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
if(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
bool needsComma = false; bool needsComma = false;
@ -717,7 +717,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
sc.MustGetToken(','); sc.MustGetToken(',');
} }
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
sc.MustGetToken(';'); sc.MustGetToken(';');
break; break;
case SBARINFO_DRAWSELECTEDINVENTORY: case SBARINFO_DRAWSELECTEDINVENTORY:
@ -762,19 +762,13 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
if(!sc.CheckToken('|')) if(!sc.CheckToken('|'))
sc.MustGetToken(','); sc.MustGetToken(',');
} }
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
cmd.special2 = cmd.x + 30; cmd.special2 = *(cmd.x + 30);
cmd.special3 = cmd.y + 24; cmd.special3 = *(cmd.y + 24);
cmd.translation = CR_GOLD; cmd.translation = CR_GOLD;
if(sc.CheckToken(',')) //more font information if(sc.CheckToken(',')) //more font information
{ {
int x = cmd.x; this->getCoordinates(sc, block.fullScreenOffsets, cmd.special2, cmd.special3);
int y = cmd.y;
this->getCoordinates(sc, cmd, block.fullScreenOffsets);
cmd.special2 = cmd.x;
cmd.special3 = cmd.y;
cmd.x = x;
cmd.y = y;
if(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
sc.MustGetToken(TK_Identifier); sc.MustGetToken(TK_Identifier);
@ -850,17 +844,13 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
sc.ScriptError("Unknown font '%s'.", sc.String); sc.ScriptError("Unknown font '%s'.", sc.String);
sc.MustGetToken(','); sc.MustGetToken(',');
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
cmd.special2 = cmd.x + 26; cmd.special2 = *(cmd.x + 26);
cmd.special3 = cmd.y + 22; cmd.special3 = *(cmd.y + 22);
cmd.translation = CR_GOLD; cmd.translation = CR_GOLD;
if(sc.CheckToken(',')) //more font information if(sc.CheckToken(',')) //more font information
{ {
sc.MustGetToken(TK_IntConst); this->getCoordinates(sc, block.fullScreenOffsets, cmd.special2, cmd.special3);
cmd.special2 = sc.Number;
sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst);
cmd.special3 = sc.Number - (200 - this->height);
if(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
sc.MustGetToken(TK_Identifier); sc.MustGetToken(TK_Identifier);
@ -973,7 +963,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
if(!sc.CheckToken('|')) if(!sc.CheckToken('|'))
sc.MustGetToken(','); sc.MustGetToken(',');
} }
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
if(sc.CheckToken(',')) //border if(sc.CheckToken(',')) //border
{ {
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
@ -1013,7 +1003,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
sc.ScriptError("Chain size must be a positive number."); sc.ScriptError("Chain size must be a positive number.");
cmd.special4 = sc.Number; cmd.special4 = sc.Number;
sc.MustGetToken(','); sc.MustGetToken(',');
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
sc.MustGetToken(';'); sc.MustGetToken(';');
break; break;
case SBARINFO_DRAWSHADER: case SBARINFO_DRAWSHADER:
@ -1042,7 +1032,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
cmd.flags |= DRAWSHADER_REVERSE; cmd.flags |= DRAWSHADER_REVERSE;
sc.MustGetToken(','); sc.MustGetToken(',');
} }
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
sc.MustGetToken(';'); sc.MustGetToken(';');
break; break;
case SBARINFO_DRAWSTRING: case SBARINFO_DRAWSTRING:
@ -1057,7 +1047,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
sc.MustGetToken(TK_StringConst); sc.MustGetToken(TK_StringConst);
cmd.setString(sc, sc.String, 0, -1, false); cmd.setString(sc, sc.String, 0, -1, false);
sc.MustGetToken(','); sc.MustGetToken(',');
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
if(sc.CheckToken(',')) //spacing if(sc.CheckToken(',')) //spacing
{ {
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
@ -1092,7 +1082,7 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
cmd.special = sc.Number; cmd.special = sc.Number;
} }
sc.MustGetToken(','); sc.MustGetToken(',');
this->getCoordinates(sc, cmd, block.fullScreenOffsets); this->getCoordinates(sc, block.fullScreenOffsets, cmd.x, cmd.y);
if(sc.CheckToken(',')) if(sc.CheckToken(','))
{ {
//key offset //key offset
@ -1352,19 +1342,49 @@ void SBarInfo::ParseMugShotBlock(FScanner &sc, FMugShotState &state)
} }
} }
void SBarInfo::getCoordinates(FScanner &sc, SBarInfoCommand &cmd, bool fullScreenOffsets) void SBarInfo::getCoordinates(FScanner &sc, bool fullScreenOffsets, int &x, int &y)
{ {
bool negative = false; bool negative = false;
negative = sc.CheckToken('-'); bool relCenter = false;
sc.MustGetToken(TK_IntConst); int *coords[2] = {&x, &y};
cmd.x = negative ? -sc.Number : sc.Number; for(int i = 0;i < 2;i++)
{
negative = false;
relCenter = false;
if(i > 0)
sc.MustGetToken(','); sc.MustGetToken(',');
// [-]INT center
negative = sc.CheckToken('-'); negative = sc.CheckToken('-');
sc.MustGetToken(TK_IntConst); sc.MustGetToken(TK_IntConst);
if(!fullScreenOffsets) *coords[i] = negative ? -sc.Number : sc.Number;
cmd.y = (negative ? -sc.Number : sc.Number) - (200 - this->height); if(sc.CheckToken('+'))
{
sc.MustGetToken(TK_Identifier);
if(!sc.Compare("center"))
sc.ScriptError("Expected 'center' but got '%s' instead.", sc.String);
relCenter = true;
}
if(fullScreenOffsets)
{
if(relCenter)
*coords[i] |= SBarInfoCoordinate::REL_CENTER;
else else
cmd.y = negative ? -sc.Number : sc.Number; *coords[i] &= ~SBarInfoCoordinate::REL_CENTER;
}
}
if(!fullScreenOffsets)
y = (negative ? -sc.Number : sc.Number) - (200 - this->height);
}
void SBarInfo::getCoordinates(FScanner &sc, bool fullScreenOffsets, SBarInfoCoordinate &x, SBarInfoCoordinate &y)
{
int tmpX = *x;
int tmpY = *y;
getCoordinates(sc, fullScreenOffsets, tmpX, tmpY);
x = tmpX;
y = tmpY;
} }
int SBarInfo::getSignedInteger(FScanner &sc) int SBarInfo::getSignedInteger(FScanner &sc)

View file

@ -15,7 +15,7 @@ ACTOR Pod 2035
+NOBLOCKMONST +DONTGIB +OLDRADIUSDMG +NOBLOCKMONST +DONTGIB +OLDRADIUSDMG
DeathSound "world/podexplode" DeathSound "world/podexplode"
action native A_PodPain (); action native A_PodPain (class<Actor> podtype = "PodGoo");
action native A_RemovePod (); action native A_RemovePod ();
States States
@ -69,7 +69,7 @@ ACTOR PodGenerator 43
+NOSECTOR +NOSECTOR
+DONTSPLASH +DONTSPLASH
action native A_MakePod (); action native A_MakePod (class<Actor> podtype = "Pod");
States States
{ {

View file

@ -120,7 +120,7 @@ statusbar inventory // Standard bar overlay (ZDoom Addition)
drawinventorybar Doom, 7, INDEXFONT, 50, 170; drawinventorybar Doom, 7, INDEXFONT, 50, 170;
} }
statusbar inventoryfullscreen // ZDoom HUD overlay. statusbar inventoryfullscreen, fullscreenoffsets // ZDoom HUD overlay.
{ {
drawinventorybar Doom, translucent, 7, INDEXFONT, 50, 170; drawinventorybar Doom, translucent, 7, INDEXFONT, -106+center, -31;
} }