- Fixed. The Firedemon was missing a game filter.

SBARINfO update:
- Added: disablegrin, disableouch, disablepain, and disablerampage flags to
  drawmugshot.
- Fixed: LowerHealthCap did not work properly.
- Fixed: Various bugs I noticed in the fullscreenoffsets code.

SVN r1122 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-07 07:17:29 +00:00
parent 535f209560
commit 344f1072a6
9 changed files with 127 additions and 77 deletions

View File

@ -1,3 +1,12 @@
August 7, 2008 (Changes by Graf Zahl)
- Fixed. The Firedemon was missing a game filter.
August 7, 2008 (SBARINfO update)
- Added: disablegrin, disableouch, disablepain, and disablerampage flags to
drawmugshot.
- Fixed: LowerHealthCap did not work properly.
- Fixed: Various bugs I noticed in the fullscreenoffsets code.
August 6, 2008
- The x87 precision control is now explicitly set for double precision, since
GCC defaults to extended precision instead, unlike Visual C++.

View File

@ -707,7 +707,7 @@ private:
// face, for lack of a better place to put it.
if (CPlayer->mo->InvSel == NULL || (level.flags & LEVEL_NOINVENTORYBAR))
{
FTexture *face = MugShot.GetFace(CPlayer, "STF", 5, false, false);
FTexture *face = MugShot.GetFace(CPlayer, "STF", 5);
if (face != NULL)
{
DrawPartialImage(&StatusBarTex, 142, 37);

View File

@ -202,8 +202,8 @@ struct FMugShot
FMugShot();
void Tick(player_t *player);
bool SetState(const char *state_name, bool wait_till_done=false, bool reset=false);
int UpdateState(player_t *player, bool xdeath, bool animated_god_mode);
FTexture *GetFace(player_t *player, const char *default_face, int accuracy, bool xdeath, bool animated_god_mode);
int UpdateState(player_t *player, int stateflags=0);
FTexture *GetFace(player_t *player, const char *default_face, int accuracy, int stateflags=0);
FMugShotState *CurrentState;
int RampageTimer;

View File

@ -39,6 +39,7 @@
#include "d_player.h"
#include "d_event.h"
#include "sbar.h"
#include "sbarinfo.h"
#define ST_RAMPAGEDELAY (2*TICRATE)
#define ST_MUCHPAIN 20
@ -322,7 +323,7 @@ bool FMugShot::SetState(const char *state_name, bool wait_till_done, bool reset)
//
//===========================================================================
int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
int FMugShot::UpdateState(player_t *player, int stateflags)
{
int i;
angle_t badguyangle;
@ -331,7 +332,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
if (player->health > 0)
{
if (bEvilGrin)
if (bEvilGrin && !(stateflags & DRAWMUGSHOT_DISABLEGRIN))
{
if (player->bonuscount)
{
@ -344,7 +345,9 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
}
}
if (player->damagecount)
if (player->damagecount &&
// Now go in if pain is disabled but we think ouch will be shown (and ouch is not disabled!)
(!(stateflags & DRAWMUGSHOT_DISABLEPAIN) || (((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DRAWMUGSHOT_DISABLEOUCH))))
{
int damage_angle = 1;
if (player->attacker && player->attacker != player->mo)
@ -376,7 +379,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
}
}
bool use_ouch = false;
if ((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive)
if (((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DRAWMUGSHOT_DISABLEOUCH))
{
use_ouch = true;
full_state_name = "ouch.";
@ -403,7 +406,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
else
{
bool use_ouch = false;
if ((FaceHealth != -1 && player->health - FaceHealth > ST_MUCHPAIN) || bOuchActive)
if (((FaceHealth != -1 && player->health - FaceHealth > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DRAWMUGSHOT_DISABLEOUCH))
{
use_ouch = true;
full_state_name = "ouch.";
@ -421,7 +424,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
}
}
if (RampageTimer == ST_RAMPAGEDELAY)
if (RampageTimer == ST_RAMPAGEDELAY && !(stateflags & DRAWMUGSHOT_DISABLERAMPAGE))
{
SetState("rampage", !bNormal); //If we have nothing better to show, use the rampage face.
return 0;
@ -432,7 +435,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
bool good;
if ((player->cheats & CF_GODMODE) || (player->mo != NULL && player->mo->flags2 & MF2_INVULNERABLE))
{
good = SetState(animated_god_mode ? "godanimated" : "god");
good = SetState((stateflags & DRAWMUGSHOT_ANIMATEDGODMODE) ? "godanimated" : "god");
}
else
{
@ -446,7 +449,7 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
}
else
{
if (!xdeath || !(player->cheats & CF_EXTREMELYDEAD))
if (!(stateflags & DRAWMUGSHOT_XDEATHFACE) || !(player->cheats & CF_EXTREMELYDEAD))
{
full_state_name = "death.";
}
@ -469,9 +472,9 @@ int FMugShot::UpdateState(player_t *player, bool xdeath, bool animated_god_mode)
//
//===========================================================================
FTexture *FMugShot::GetFace(player_t *player, const char *default_face, int accuracy, bool xdeath, bool animated_god_mode)
FTexture *FMugShot::GetFace(player_t *player, const char *default_face, int accuracy, int stateflags)
{
int angle = UpdateState(player, xdeath, animated_god_mode);
int angle = UpdateState(player, stateflags);
int level = 0;
while (player->health < (accuracy-1-level) * (player->mo->GetMaxHealth()/accuracy))
{

View File

@ -238,8 +238,12 @@ enum //drawshader flags
enum //drawmugshot flags
{
DRAWMUGSHOT_XDEATHFACE = 1,
DRAWMUGSHOT_ANIMATEDGODMODE = 2,
DRAWMUGSHOT_XDEATHFACE = 0x1,
DRAWMUGSHOT_ANIMATEDGODMODE = 0x2,
DRAWMUGSHOT_DISABLEGRIN = 0x4,
DRAWMUGSHOT_DISABLEOUCH = 0x8,
DRAWMUGSHOT_DISABLEPAIN = 0x10,
DRAWMUGSHOT_DISABLERAMPAGE = 0x20,
};
enum //drawkeybar flags
@ -344,7 +348,7 @@ private:
void DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool translate=false, bool dim=false, bool center=false);
void DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing=0);
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);
void DrawFace(const char *defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets);
void DrawFace(const char *defaultFace, int accuracy, int stateflags, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets);
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,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter);

View File

@ -546,7 +546,7 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
if(cmd.flags & DRAWNUMBER_HEALTH)
{
value = health;
if(SBarInfoScript->lowerHealthCap && cmd.value < 0) //health shouldn't display negatives
if(SBarInfoScript->lowerHealthCap && value < 0) //health shouldn't display negatives
{
value = 0;
}
@ -671,7 +671,8 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
xdth = true;
if(cmd.flags & DRAWMUGSHOT_ANIMATEDGODMODE)
animatedgodmode = true;
DrawFace(cmd.string[0], cmd.special, xdth, animatedgodmode, cmd.x, cmd.y, xOffset, yOffset, alpha, block.fullScreenOffsets);
int stateflags = cmd.flags & (DRAWMUGSHOT_XDEATHFACE | DRAWMUGSHOT_ANIMATEDGODMODE | DRAWMUGSHOT_DISABLEGRIN | DRAWMUGSHOT_DISABLEOUCH | DRAWMUGSHOT_DISABLEPAIN | DRAWMUGSHOT_DISABLERAMPAGE);
DrawFace(cmd.string[0], cmd.special, stateflags, cmd.x, cmd.y, xOffset, yOffset, alpha, block.fullScreenOffsets);
break;
}
case SBARINFO_DRAWSELECTEDINVENTORY:
@ -879,14 +880,24 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
int x, y, w, h;
int cx, cy, cw, ch, cr, cb;
// Calc real screen coordinates for bar
x = cmd.x + ST_X + xOffset;
y = cmd.y + ST_Y + yOffset;
w = fg->GetScaledWidth();
h = fg->GetScaledHeight();
if (Scaled)
if(!block.fullScreenOffsets)
{
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true);
// Calc real screen coordinates for bar
x = cmd.x + ST_X + xOffset;
y = cmd.y + ST_Y + yOffset;
w = fg->GetScaledWidth();
h = fg->GetScaledHeight();
if (Scaled)
{
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true);
}
}
else
{
x = cmd.x + xOffset;
y = cmd.y + yOffset;
w = fg->GetScaledWidth();
h = fg->GetScaledHeight();
}
if(cmd.special3 != 0)
@ -915,14 +926,24 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
}
}
// Calc clipping rect for background
cx = cmd.x + ST_X + cmd.special3 + xOffset;
cy = cmd.y + ST_Y + cmd.special3 + yOffset;
cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2;
ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2;
if (Scaled)
if(!block.fullScreenOffsets)
{
screen->VirtualToRealCoordsInt(cx, cy, cw, ch, 320, 200, true);
// Calc clipping rect for background
cx = cmd.x + ST_X + cmd.special3 + xOffset;
cy = cmd.y + ST_Y + cmd.special3 + yOffset;
cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2;
ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2;
if (Scaled)
{
screen->VirtualToRealCoordsInt(cx, cy, cw, ch, 320, 200, true);
}
}
else
{
cx = cmd.x + cmd.special3 + xOffset;
cy = cmd.y + cmd.special3 + yOffset;
cw = fg->GetScaledWidth() - fg->GetScaledLeftOffset() - cmd.special3 * 2;
ch = fg->GetScaledHeight() - fg->GetScaledTopOffset() - cmd.special3 * 2;
}
if (horizontal)
@ -1019,10 +1040,20 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
};
bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL);
bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE);
screen->DrawTexture (shaders[(vertical << 1) + reverse], ST_X+cmd.x+xOffset, ST_Y+cmd.y+yOffset,
DTA_DestWidth, cmd.special,
DTA_DestHeight, cmd.special2,
DTA_Bottom320x200, Scaled,
int x = cmd.x + xOffset;
int y = cmd.y + yOffset;
int w = cmd.special;
int h = cmd.special2;
if(!block.fullScreenOffsets)
{
x += ST_X;
y += ST_Y;
if(Scaled)
screen->VirtualToRealCoordsInt(x, y, w, h, 320, 200, true);
}
screen->DrawTexture (shaders[(vertical << 1) + reverse], x, y,
DTA_DestWidth, w,
DTA_DestHeight, h,
DTA_Alpha, alpha,
DTA_AlphaChannel, true,
DTA_FillColor, 0,
@ -1219,11 +1250,14 @@ void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yO
y -= (texture->GetHeight()/2)-texture->TopOffset;
}
x += xOffset;
y += yOffset;
int w, h;
if(!fullScreenOffsets)
{
// I'll handle the conversion from fixed to int myself for more control
fixed_t fx = (x + ST_X + xOffset) << FRACBITS;
fixed_t fy = (y + ST_Y + yOffset) << FRACBITS;
fixed_t fx = (x + ST_X) << FRACBITS;
fixed_t fy = (y + ST_Y) << FRACBITS;
fixed_t fw = texture->GetScaledWidth() << FRACBITS;
fixed_t fh = texture->GetScaledHeight() << FRACBITS;
if(Scaled)
@ -1231,27 +1265,21 @@ void DSBarInfo::DrawGraphic(FTexture* texture, int x, int y, int xOffset, int yO
x = fx >> FRACBITS;
y = fy >> FRACBITS;
// Round to nearest
int w = (fw + (FRACUNIT>>1)) >> FRACBITS;
int h = (fh + (FRACUNIT>>1)) >> FRACBITS;
screen->DrawTexture(texture, x, y,
DTA_DestWidth, w,
DTA_DestHeight, h,
DTA_Translation, translate ? getTranslation() : 0,
DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
DTA_Alpha, alpha,
TAG_DONE);
w = (fw + (FRACUNIT>>1)) >> FRACBITS;
h = (fh + (FRACUNIT>>1)) >> FRACBITS;
}
else
{
screen->DrawTexture(texture, x, y,
DTA_DestWidth, texture->GetScaledWidth(),
DTA_DestHeight, texture->GetScaledHeight(),
DTA_Translation, translate ? getTranslation() : 0,
DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
DTA_Alpha, alpha,
DTA_HUDRules, HUD_Normal,
TAG_DONE);
w = texture->GetScaledWidth();
h = texture->GetScaledHeight();
}
screen->DrawTexture(texture, x, y,
DTA_DestWidth, w,
DTA_DestHeight, h,
DTA_Translation, translate ? getTranslation() : 0,
DTA_ColorOverlay, dim ? DIM_OVERLAY : 0,
DTA_Alpha, alpha,
TAG_DONE);
}
void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, EColorRange translation, int spacing)
@ -1278,31 +1306,25 @@ void DSBarInfo::DrawString(const char* str, int x, int y, int xOffset, int yOffs
}
if(SBarInfoScript->spacingCharacter == '\0') //If we are monospaced lets use the offset
x += (character->LeftOffset+1); //ignore x offsets since we adapt to character size
int rx, ry, rw, rh;
rx = x + xOffset;
ry = y + yOffset;
rw = character->GetScaledWidth();
rh = character->GetScaledHeight();
if(!fullScreenOffsets)
{
int rx = x + ST_X + xOffset;
int ry = y + ST_Y + yOffset;
int rw = character->GetScaledWidth();
int rh = character->GetScaledHeight();
rx += ST_X;
ry += ST_Y;
if(Scaled)
screen->VirtualToRealCoordsInt(rx, ry, rw, rh, 320, 200, true);
screen->DrawTexture(character, rx, ry,
DTA_DestWidth, rw,
DTA_DestHeight, rh,
DTA_Translation, drawingFont->GetColorTranslation(translation),
DTA_Alpha, alpha,
TAG_DONE);
}
else
{
screen->DrawTexture(character, x, y,
DTA_DestWidth, character->GetScaledWidth(),
DTA_DestHeight, character->GetScaledHeight(),
DTA_Translation, drawingFont->GetColorTranslation(translation),
DTA_Alpha, alpha,
DTA_HUDRules, HUD_Normal,
TAG_DONE);
}
screen->DrawTexture(character, rx, ry,
DTA_DestWidth, rw,
DTA_DestHeight, rh,
DTA_Translation, drawingFont->GetColorTranslation(translation),
DTA_Alpha, alpha,
TAG_DONE);
if(SBarInfoScript->spacingCharacter == '\0')
x += width + spacing - (character->LeftOffset+1);
else //width gets changed at the call to GetChar()
@ -1341,9 +1363,9 @@ void DSBarInfo::DrawNumber(int num, int len, int x, int y, int xOffset, int yOff
}
//draws the mug shot
void DSBarInfo::DrawFace(const char *defaultFace, int accuracy, bool xdth, bool animatedgodmode, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets)
void DSBarInfo::DrawFace(const char *defaultFace, int accuracy, int stateflags, int x, int y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets)
{
FTexture *face = MugShot.GetFace(CPlayer, defaultFace, accuracy, xdth, animatedgodmode);
FTexture *face = MugShot.GetFace(CPlayer, defaultFace, accuracy, stateflags);
if (face != NULL)
{
DrawGraphic(face, x, y, xOffset, yOffset, alpha, fullScreenOffsets);

View File

@ -657,11 +657,20 @@ void SBarInfo::ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block)
cmd.flags |= DRAWMUGSHOT_XDEATHFACE;
else if(sc.Compare("animatedgodmode"))
cmd.flags |= DRAWMUGSHOT_ANIMATEDGODMODE;
else if(sc.Compare("disablegrin"))
cmd.flags |= DRAWMUGSHOT_DISABLEGRIN;
else if(sc.Compare("disableouch"))
cmd.flags |= DRAWMUGSHOT_DISABLEOUCH;
else if(sc.Compare("disablepain"))
cmd.flags |= DRAWMUGSHOT_DISABLEPAIN;
else if(sc.Compare("disablerampage"))
cmd.flags |= DRAWMUGSHOT_DISABLERAMPAGE;
else
sc.ScriptError("Unknown flag '%s'.", sc.String);
if(!sc.CheckToken('|'))
sc.MustGetToken(',');
}
this->getCoordinates(sc, cmd, block.fullScreenOffsets);
sc.MustGetToken(';');
break;

View File

@ -573,6 +573,8 @@ void FBehavior::StaticLoadDefaultModules ()
FBehavior *FBehavior::StaticLoadModule (int lumpnum, FileReader * fr, int len)
{
if (lumpnum == -1) return;
for (unsigned int i = 0; i < StaticModules.Size(); ++i)
{
if (StaticModules[i]->LumpNum == lumpnum)

View File

@ -3,6 +3,7 @@
ACTOR FireDemon 10060
{
Game Hexen
SpawnID 5
Health 80
ReactionTime 8