From 344f1072a6f8561464f0e81135009f8f666571ef Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 7 Aug 2008 07:17:29 +0000 Subject: [PATCH] - 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) --- docs/rh-log.txt | 9 ++ src/g_doom/doom_sbar.cpp | 2 +- src/g_shared/sbar.h | 4 +- src/g_shared/sbar_mugshot.cpp | 23 ++-- src/g_shared/sbarinfo.h | 10 +- src/g_shared/sbarinfo_display.cpp | 144 +++++++++++++---------- src/g_shared/sbarinfo_parser.cpp | 9 ++ src/p_acs.cpp | 2 + wadsrc/static/actors/hexen/firedemon.txt | 1 + 9 files changed, 127 insertions(+), 77 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index e92fe73fb..05dd7d708 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -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++. diff --git a/src/g_doom/doom_sbar.cpp b/src/g_doom/doom_sbar.cpp index 20a7d2140..e52f11343 100644 --- a/src/g_doom/doom_sbar.cpp +++ b/src/g_doom/doom_sbar.cpp @@ -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); diff --git a/src/g_shared/sbar.h b/src/g_shared/sbar.h index 62e3dfbd9..4beff1bcc 100644 --- a/src/g_shared/sbar.h +++ b/src/g_shared/sbar.h @@ -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; diff --git a/src/g_shared/sbar_mugshot.cpp b/src/g_shared/sbar_mugshot.cpp index d9a913de9..aa1117cdf 100644 --- a/src/g_shared/sbar_mugshot.cpp +++ b/src/g_shared/sbar_mugshot.cpp @@ -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)) { diff --git a/src/g_shared/sbarinfo.h b/src/g_shared/sbarinfo.h index 6947b08a4..0f078b148 100644 --- a/src/g_shared/sbarinfo.h +++ b/src/g_shared/sbarinfo.h @@ -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); diff --git a/src/g_shared/sbarinfo_display.cpp b/src/g_shared/sbarinfo_display.cpp index 2b77440d2..b9c13c322 100644 --- a/src/g_shared/sbarinfo_display.cpp +++ b/src/g_shared/sbarinfo_display.cpp @@ -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); diff --git a/src/g_shared/sbarinfo_parser.cpp b/src/g_shared/sbarinfo_parser.cpp index 6f86ba7a7..7421f1f32 100644 --- a/src/g_shared/sbarinfo_parser.cpp +++ b/src/g_shared/sbarinfo_parser.cpp @@ -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; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index c3104cd5b..835f54c20 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -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) diff --git a/wadsrc/static/actors/hexen/firedemon.txt b/wadsrc/static/actors/hexen/firedemon.txt index 550c5ec95..31d94dd03 100644 --- a/wadsrc/static/actors/hexen/firedemon.txt +++ b/wadsrc/static/actors/hexen/firedemon.txt @@ -3,6 +3,7 @@ ACTOR FireDemon 10060 { + Game Hexen SpawnID 5 Health 80 ReactionTime 8