SBARINFO update:

- Reorganized the SBarInfo code.
- Added interpolate(<speed>) flag to drawnumber, drawbar, and drawgem.  The old
  way of interpolating the health and armor is depreciated.
- Added: armortype to drawswitchableimage loosely based on Gez's submission.
- As an extension to the previous you can now use comparison operators on
  inventory items and armortype in drawswitchableimage.


SVN r2069 (trunk)
This commit is contained in:
Christoph Oelckers 2010-01-01 09:11:55 +00:00
parent 515862636a
commit 3f4f0a8ae4
11 changed files with 4333 additions and 4120 deletions

View file

@ -1,3 +1,11 @@
January 1, 2010 (SBARINFO update)
- Reorganized the SBarInfo code.
- Added interpolate(<speed>) flag to drawnumber, drawbar, and drawgem. The old
way of interpolating the health and armor is depreciated.
- Added: armortype to drawswitchableimage loosely based on Gez's submission.
- As an extension to the previous you can now use comparison operators on
inventory items and armortype in drawswitchableimage.
January 1, 2010 (Changes by Graf Zahl) January 1, 2010 (Changes by Graf Zahl)
- Fixed: Heretic's Weredragon (Beast) should not have a melee state. - Fixed: Heretic's Weredragon (Beast) should not have a melee state.

View file

@ -696,8 +696,7 @@ add_executable( zdoom WIN32
g_shared/a_weaponpiece.cpp g_shared/a_weaponpiece.cpp
g_shared/a_weapons.cpp g_shared/a_weapons.cpp
g_shared/hudmessages.cpp g_shared/hudmessages.cpp
g_shared/sbarinfo_display.cpp g_shared/sbarinfo.cpp
g_shared/sbarinfo_parser.cpp
g_shared/sbar_mugshot.cpp g_shared/sbar_mugshot.cpp
g_shared/shared_hud.cpp g_shared/shared_hud.cpp
g_shared/shared_sbar.cpp g_shared/shared_sbar.cpp

View file

@ -32,6 +32,9 @@
** **
*/ */
#ifndef __SBAR_H__
#define __SBAR_H__
#include "dobject.h" #include "dobject.h"
#include "v_collection.h" #include "v_collection.h"
#include "v_text.h" #include "v_text.h"
@ -195,14 +198,29 @@ private:
}; };
class player_t; class player_t;
struct FMugShot class FMugShot
{ {
public:
enum StateFlags
{
STANDARD = 0x0,
XDEATHFACE = 0x1,
ANIMATEDGODMODE = 0x2,
DISABLEGRIN = 0x4,
DISABLEOUCH = 0x8,
DISABLEPAIN = 0x10,
DISABLERAMPAGE = 0x20,
};
FMugShot(); FMugShot();
void Grin(bool grin=true) { bEvilGrin = grin; }
void Tick(player_t *player); void Tick(player_t *player);
bool SetState(const char *state_name, bool wait_till_done=false, bool reset=false); bool SetState(const char *state_name, bool wait_till_done=false, bool reset=false);
int UpdateState(player_t *player, int stateflags=0); int UpdateState(player_t *player, StateFlags stateflags=STANDARD);
FTexture *GetFace(player_t *player, const char *default_face, int accuracy, int stateflags=0); FTexture *GetFace(player_t *player, const char *default_face, int accuracy, StateFlags stateflags=STANDARD);
private:
FMugShotState *CurrentState; FMugShotState *CurrentState;
int RampageTimer; int RampageTimer;
int LastDamageAngle; int LastDamageAngle;
@ -369,3 +387,5 @@ DBaseStatusBar *CreateCustomStatusBar(int script=0);
void ST_LoadCrosshair(bool alwaysload=false); void ST_LoadCrosshair(bool alwaysload=false);
extern FTexture *CrosshairImage; extern FTexture *CrosshairImage;
#endif /* __SBAR_H__ */

View file

@ -324,7 +324,7 @@ bool FMugShot::SetState(const char *state_name, bool wait_till_done, bool reset)
// //
//=========================================================================== //===========================================================================
int FMugShot::UpdateState(player_t *player, int stateflags) int FMugShot::UpdateState(player_t *player, StateFlags stateflags)
{ {
int i; int i;
angle_t badguyangle; angle_t badguyangle;
@ -333,7 +333,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
if (player->health > 0) if (player->health > 0)
{ {
if (bEvilGrin && !(stateflags & DRAWMUGSHOT_DISABLEGRIN)) if (bEvilGrin && !(stateflags & DISABLEGRIN))
{ {
if (player->bonuscount) if (player->bonuscount)
{ {
@ -348,7 +348,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
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!) // 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)))) (!(stateflags & DISABLEPAIN) || (((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DISABLEOUCH))))
{ {
int damage_angle = 1; int damage_angle = 1;
if (player->attacker && player->attacker != player->mo) if (player->attacker && player->attacker != player->mo)
@ -380,7 +380,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
} }
} }
bool use_ouch = false; bool use_ouch = false;
if (((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DRAWMUGSHOT_DISABLEOUCH)) if (((FaceHealth != -1 && FaceHealth - player->health > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DISABLEOUCH))
{ {
use_ouch = true; use_ouch = true;
full_state_name = "ouch."; full_state_name = "ouch.";
@ -407,7 +407,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
else else
{ {
bool use_ouch = false; bool use_ouch = false;
if (((FaceHealth != -1 && player->health - FaceHealth > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DRAWMUGSHOT_DISABLEOUCH)) if (((FaceHealth != -1 && player->health - FaceHealth > ST_MUCHPAIN) || bOuchActive) && !(stateflags & DISABLEOUCH))
{ {
use_ouch = true; use_ouch = true;
full_state_name = "ouch."; full_state_name = "ouch.";
@ -425,7 +425,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
} }
} }
if (RampageTimer == ST_RAMPAGEDELAY && !(stateflags & DRAWMUGSHOT_DISABLERAMPAGE)) if (RampageTimer == ST_RAMPAGEDELAY && !(stateflags & DISABLERAMPAGE))
{ {
SetState("rampage", !bNormal); //If we have nothing better to show, use the rampage face. SetState("rampage", !bNormal); //If we have nothing better to show, use the rampage face.
return 0; return 0;
@ -436,7 +436,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
bool good; bool good;
if ((player->cheats & CF_GODMODE) || (player->mo != NULL && player->mo->flags2 & MF2_INVULNERABLE)) if ((player->cheats & CF_GODMODE) || (player->mo != NULL && player->mo->flags2 & MF2_INVULNERABLE))
{ {
good = SetState((stateflags & DRAWMUGSHOT_ANIMATEDGODMODE) ? "godanimated" : "god"); good = SetState((stateflags & ANIMATEDGODMODE) ? "godanimated" : "god");
} }
else else
{ {
@ -450,7 +450,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
} }
else else
{ {
if (!(stateflags & DRAWMUGSHOT_XDEATHFACE) || !(player->cheats & CF_EXTREMELYDEAD)) if (!(stateflags & XDEATHFACE) || !(player->cheats & CF_EXTREMELYDEAD))
{ {
full_state_name = "death."; full_state_name = "death.";
} }
@ -473,7 +473,7 @@ int FMugShot::UpdateState(player_t *player, int stateflags)
// //
//=========================================================================== //===========================================================================
FTexture *FMugShot::GetFace(player_t *player, const char *default_face, int accuracy, int stateflags) FTexture *FMugShot::GetFace(player_t *player, const char *default_face, int accuracy, StateFlags stateflags)
{ {
int angle = UpdateState(player, stateflags); int angle = UpdateState(player, stateflags);
int level = 0; int level = 0;

1303
src/g_shared/sbarinfo.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -37,48 +37,17 @@
#define __SBarInfo_SBAR_H__ #define __SBarInfo_SBAR_H__
#include "tarray.h" #include "tarray.h"
#include "v_collection.h"
#define NUMHUDS 9 #define NUMHUDS 9
#define NUMPOPUPS 3 #define NUMPOPUPS 3
class FBarTexture;
class FScanner; class FScanner;
/** class SBarInfoMainBlock;
* 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 are packed into
* an int with one bit reserved for relCenter.
*/
class SBarInfoCoordinate
{
public:
SBarInfoCoordinate &Add(int add);
int Coordinate() const { return value; }
bool RelCenter() const { return relCenter; }
void Set(int coord, bool center) { value = coord; relCenter = center; }
void SetCoord(int coord) { value = coord; }
void SetRelCenter(bool center) { relCenter = center; }
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:
unsigned relCenter:1;
int value:31;
};
struct SBarInfoCommand; //we need to be able to use this before it is defined.
struct MugShotState;
//Popups! //Popups!
struct Popup
{
enum PopupTransition enum PopupTransition
{ {
TRANSITION_NONE, TRANSITION_NONE,
@ -86,8 +55,6 @@ enum PopupTransition
TRANSITION_FADE, TRANSITION_FADE,
}; };
struct Popup
{
PopupTransition transition; PopupTransition transition;
bool opened; bool opened;
bool moving; bool moving;
@ -110,54 +77,10 @@ struct Popup
int getAlpha(int maxAlpha=FRACUNIT); int getAlpha(int maxAlpha=FRACUNIT);
}; };
//SBarInfo
struct SBarInfoBlock
{
TArray<SBarInfoCommand> commands;
bool forceScaled;
bool fullScreenOffsets;
int alpha;
SBarInfoBlock();
};
struct SBarInfoCommand
{
SBarInfoCommand();
~SBarInfoCommand();
void setString(FScanner &sc, const char* source, int strnum, int maxlength=-1, bool exact=false);
int type;
int special;
union
{
int special2;
SBarInfoCoordinate sbcoord2;
};
union
{
int special3;
SBarInfoCoordinate sbcoord3;
};
int special4;
int flags;
SBarInfoCoordinate x;
SBarInfoCoordinate y;
int value;
int image_index;
FTextureID sprite_index;
FString string[2];
FFont *font;
EColorRange translation;
EColorRange translation2;
EColorRange translation3;
SBarInfoBlock subBlock; //for type SBarInfo_CMD_GAMEMODE
};
struct SBarInfo struct SBarInfo
{ {
TArray<FString> Images; TArray<FString> Images;
SBarInfoBlock huds[NUMHUDS]; SBarInfoMainBlock *huds[NUMHUDS];
Popup popups[NUMPOPUPS]; Popup popups[NUMPOPUPS];
bool automapbar; bool automapbar;
bool interpolateHealth; bool interpolateHealth;
@ -169,16 +92,13 @@ struct SBarInfo
int armorInterpolationSpeed; int armorInterpolationSpeed;
int height; int height;
int gameType; int gameType;
FMugShot MugShot;
int GetGameType() { return gameType; } int GetGameType() { return gameType; }
void ParseSBarInfo(int lump); void ParseSBarInfo(int lump);
void ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block);
void ParseMugShotBlock(FScanner &sc, FMugShotState &state); void ParseMugShotBlock(FScanner &sc, FMugShotState &state);
void getCoordinates(FScanner &sc, bool fullScreenOffsets, SBarInfoCoordinate &x, SBarInfoCoordinate &y); //retrieves the next two arguments as x and y.
int getSignedInteger(FScanner &sc); //returns a signed integer.
int newImage(const char* patchname); int newImage(const char* patchname);
void Init(); void Init();
EColorRange GetTranslation(FScanner &sc, const char* translation);
SBarInfo(); SBarInfo();
SBarInfo(int lumpnum); SBarInfo(int lumpnum);
~SBarInfo(); ~SBarInfo();
@ -190,243 +110,4 @@ 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
enum //gametype flags
{
GAMETYPE_SINGLEPLAYER = 1,
GAMETYPE_COOPERATIVE = 2,
GAMETYPE_DEATHMATCH = 4,
GAMETYPE_TEAMGAME = 8,
};
enum //drawimage flags
{
DRAWIMAGE_PLAYERICON = 0x1,
DRAWIMAGE_AMMO1 = 0x2,
DRAWIMAGE_AMMO2 = 0x4,
DRAWIMAGE_INVENTORYICON = 0x8,
DRAWIMAGE_TRANSLATABLE = 0x10,
DRAWIMAGE_WEAPONSLOT = 0x20,
DRAWIMAGE_SWITCHABLE_AND = 0x40,
DRAWIMAGE_INVULNERABILITY = 0x80,
DRAWIMAGE_OFFSET_CENTER = 0x100,
DRAWIMAGE_OFFSET_CENTERBOTTOM = 0x200,
DRAWIMAGE_ARMOR = 0x800,
DRAWIMAGE_WEAPONICON = 0x1000,
DRAWIMAGE_SIGIL = 0x2000,
DRAWIMAGE_KEYSLOT = 0x4000,
DRAWIMAGE_HEXENARMOR = 0x8000,
DRAWIMAGE_OFFSET = DRAWIMAGE_OFFSET_CENTER|DRAWIMAGE_OFFSET_CENTERBOTTOM,
};
enum //drawnumber flags
{
DRAWNUMBER_HEALTH = 0x1,
DRAWNUMBER_ARMOR = 0x2,
DRAWNUMBER_AMMO1 = 0x4,
DRAWNUMBER_AMMO2 = 0x8,
DRAWNUMBER_AMMO = 0x10,
DRAWNUMBER_AMMOCAPACITY = 0x20,
DRAWNUMBER_FRAGS = 0x40,
DRAWNUMBER_INVENTORY = 0x80,
DRAWNUMBER_KILLS = 0x100,
DRAWNUMBER_MONSTERS = 0x200,
DRAWNUMBER_ITEMS = 0x400,
DRAWNUMBER_TOTALITEMS = 0x800,
DRAWNUMBER_SECRETS = 0x1000,
DRAWNUMBER_TOTALSECRETS = 0x2000,
DRAWNUMBER_ARMORCLASS = 0x4000,
DRAWNUMBER_GLOBALVAR = 0x8000,
DRAWNUMBER_GLOBALARRAY = 0x10000,
DRAWNUMBER_FILLZEROS = 0x20000,
DRAWNUMBER_WHENNOTZERO = 0x40000,
DRAWNUMBER_POWERUPTIME = 0x80000,
DRAWNUMBER_DRAWSHADOW = 0x100000,
DRAWNUMBER_AIRTIME = 0x200000,
};
enum //drawbar flags (will go into special2)
{
DRAWBAR_HORIZONTAL = 1,
DRAWBAR_REVERSE = 2,
DRAWBAR_COMPAREDEFAULTS = 4,
};
enum //drawselectedinventory flags
{
DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY = 0x1,
DRAWSELECTEDINVENTORY_ARTIFLASH = 0x2,
DRAWSELECTEDINVENTORY_ALWAYSSHOWCOUNTER = 0x4,
DRAWSELECTEDINVENTORY_CENTER = 0x8,
DRAWSELECTEDINVENTORY_CENTERBOTTOM = 0x10,
DRAWSELECTEDINVENTORY_DRAWSHADOW = 0x20,
};
enum //drawinventorybar flags
{
DRAWINVENTORYBAR_ALWAYSSHOW = 0x1,
DRAWINVENTORYBAR_NOARTIBOX = 0x2,
DRAWINVENTORYBAR_NOARROWS = 0x4,
DRAWINVENTORYBAR_ALWAYSSHOWCOUNTER = 0x8,
DRAWINVENTORYBAR_TRANSLUCENT = 0x10,
DRAWINVENTORYBAR_VERTICAL = 0x20,
};
enum //drawgem flags
{
DRAWGEM_WIGGLE = 1,
DRAWGEM_TRANSLATABLE = 2,
DRAWGEM_ARMOR = 4,
DRAWGEM_REVERSE = 8,
};
enum //drawshader flags
{
DRAWSHADER_VERTICAL = 1,
DRAWSHADER_REVERSE = 2,
};
enum //drawmugshot flags
{
DRAWMUGSHOT_XDEATHFACE = 0x1,
DRAWMUGSHOT_ANIMATEDGODMODE = 0x2,
DRAWMUGSHOT_DISABLEGRIN = 0x4,
DRAWMUGSHOT_DISABLEOUCH = 0x8,
DRAWMUGSHOT_DISABLEPAIN = 0x10,
DRAWMUGSHOT_DISABLERAMPAGE = 0x20,
};
enum //drawkeybar flags
{
DRAWKEYBAR_VERTICAL = 0x1,
DRAWKEYBAR_REVERSEROWS = 0x2,
};
enum //event flags
{
SBARINFOEVENT_NOT = 1,
SBARINFOEVENT_OR = 2,
SBARINFOEVENT_AND = 4,
};
enum //aspect ratios
{
ASPECTRATIO_4_3 = 0,
ASPECTRATIO_16_9 = 1,
ASPECTRATIO_16_10 = 2,
ASPECTRATIO_5_4 = 4,
};
enum //Key words
{
SBARINFO_BASE,
SBARINFO_HEIGHT,
SBARINFO_INTERPOLATEHEALTH,
SBARINFO_INTERPOLATEARMOR,
SBARINFO_COMPLETEBORDER,
SBARINFO_MONOSPACEFONTS,
SBARINFO_LOWERHEALTHCAP,
SBARINFO_STATUSBAR,
SBARINFO_MUGSHOT,
SBARINFO_CREATEPOPUP,
};
enum //Bar types
{
STBAR_NONE,
STBAR_FULLSCREEN,
STBAR_NORMAL,
STBAR_AUTOMAP,
STBAR_INVENTORY,
STBAR_INVENTORYFULLSCREEN,
STBAR_POPUPLOG,
STBAR_POPUPKEYS,
STBAR_POPUPSTATUS,
};
enum //Bar key words
{
SBARINFO_DRAWIMAGE,
SBARINFO_DRAWNUMBER,
SBARINFO_DRAWSWITCHABLEIMAGE,
SBARINFO_DRAWMUGSHOT,
SBARINFO_DRAWSELECTEDINVENTORY,
SBARINFO_DRAWINVENTORYBAR,
SBARINFO_DRAWBAR,
SBARINFO_DRAWGEM,
SBARINFO_DRAWSHADER,
SBARINFO_DRAWSTRING,
SBARINFO_DRAWKEYBAR,
SBARINFO_GAMEMODE,
SBARINFO_PLAYERCLASS,
SBARINFO_ASPECTRATIO,
SBARINFO_ISSELECTED,
SBARINFO_USESAMMO,
SBARINFO_USESSECONDARYAMMO,
SBARINFO_HASWEAPONPIECE,
SBARINFO_INVENTORYBARNOTVISIBLE,
SBARINFO_WEAPONAMMO,
SBARINFO_ININVENTORY,
};
//All this so I can change the mugshot state in ACS...
class FBarShader : public FTexture
{
public:
FBarShader(bool vertical, bool reverse);
const BYTE *GetColumn(unsigned int column, const Span **spans_out);
const BYTE *GetPixels();
void Unload();
private:
BYTE Pixels[512];
Span DummySpan[2];
};
class DSBarInfo : public DBaseStatusBar
{
DECLARE_CLASS(DSBarInfo, DBaseStatusBar)
public:
DSBarInfo(SBarInfo *script=NULL);
~DSBarInfo();
void Draw(EHudState state);
void NewGame();
void AttachToPlayer(player_t *player);
void Tick();
void ReceivedWeapon (AWeapon *weapon);
void FlashItem(const PClass *itemtype);
void ShowPop(int popnum);
void SetMugShotState(const char* stateName, bool waitTillDone=false, bool reset=false);
private:
void doCommands(SBarInfoBlock &block, int xOffset=0, int yOffset=0, int alpha=FRACUNIT);
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, 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, 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, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets);
int updateState(bool xdth, bool animatedgodmode);
void DrawInventoryBar(int type, int num, SBarInfoCoordinate x, SBarInfoCoordinate y, int xOffset, int yOffset, int alpha, bool fullScreenOffsets, bool alwaysshow,
SBarInfoCoordinate counterx, SBarInfoCoordinate countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter, int bgalpha, bool vertical);
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);
FRemapTable* getTranslation();
SBarInfo *script;
FImageCollection Images;
FPlayerSkin *oldSkin;
FFont *drawingFont;
int oldHealth;
int oldArmor;
int mugshotHealth;
int chainWiggle;
int artiflash;
int pendingPopup;
int currentPopup;
unsigned int invBarOffset;
FBarShader shader_horz_normal;
FBarShader shader_horz_reverse;
FBarShader shader_vert_normal;
FBarShader shader_vert_reverse;
FMugShot MugShot;
};
#endif //__SBarInfo_SBAR_H__ #endif //__SBarInfo_SBAR_H__

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -67,7 +67,6 @@
#include "c_bind.h" #include "c_bind.h"
#include "info.h" #include "info.h"
#include "r_translate.h" #include "r_translate.h"
#include "sbarinfo.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "m_png.h" #include "m_png.h"
#include "p_setup.h" #include "p_setup.h"

File diff suppressed because it is too large Load diff