gzdoom-gles/src/g_shared/sbarinfo.h
Christoph Oelckers 9adf1d4ddc - Fixed: The serializer for side_t::part never read the texture information
from a savegame.
- Fixed: side_t::StopInterpolation called setinterpolation instead of
  stopinterpolation. Also moved the clearinterpolation call in 
  P_SetupLevel after the P_FreeLevelData to make absolutely sure that
  nothing in there can leave an interpolator behind by accident.
- Applied Linux fixes by Jim.
SBARINFO update by Blzut3:
- Fixed: the playerclass command needed a null pointer check to prevent
  crashing on respawn.
- Fixed: Mug Shot states were not reset on respawn.
- Removed keepoffsets flag since apparently it was keeping the offsets by
  default.  The means that the only thing not affected by the offsets was using
  nullimage as a background.  Since I wasn't able to get a result I liked I'm
  going to say that if you want a black background with high res positioning
  you will have to create your own bar image.  Maybe I'll fix it some other
  time.
- Added: monospacefonts variable which allows for all of the fonts to be
  monospaced by a specified character (from their fontset of corse).
- Made SBarInfo recognize the bar names for the Strife popups but they don't
  do anything beyond that.  The names are: popuplog, popupkeys, and popupstatus.
- Started converting the drawing routine to be more flexable towards high
  resolution status bars.  (Only did one call so far.)


SVN r835 (trunk)
2008-03-22 09:26:59 +00:00

359 lines
9.3 KiB
C++

/*
** sbarinfo.h
**
** Header for custom status bar definitions.
**
**---------------------------------------------------------------------------
** Copyright 2008 Braden Obrzut
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
**
** 1. Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in the
** documentation and/or other materials provided with the distribution.
** 3. The name of the author may not be used to endorse or promote products
** derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**---------------------------------------------------------------------------
**
*/
#ifndef __SBarInfo_SBAR_H__
#define __SBarInfo_SBAR_H__
#include "tarray.h"
#include "v_collection.h"
#define NUMHUDS 9
class FBarTexture;
class FScanner;
struct SBarInfoCommand; //we need to be able to use this before it is defined.
struct MugShotState;
struct SBarInfoBlock
{
TArray<SBarInfoCommand> commands;
bool forceScaled;
SBarInfoBlock();
};
struct SBarInfoCommand
{
SBarInfoCommand();
~SBarInfoCommand();
void setString(FScanner &sc, const char* source, int strnum, int maxlength=-1, bool exact=false);
int type;
int special;
int special2;
int special3;
int special4;
int flags;
int x;
int y;
int value;
int sprite;
FString string[2];
FFont *font;
EColorRange translation;
EColorRange translation2;
EColorRange translation3;
SBarInfoBlock subBlock; //for type SBarInfo_CMD_GAMEMODE
};
struct SBarInfo
{
TArray<FString> Images;
SBarInfoBlock huds[NUMHUDS];
bool automapbar;
bool interpolateHealth;
bool interpolateArmor;
bool completeBorder;
char spacingCharacter;
int interpolationSpeed;
int armorInterpolationSpeed;
int height;
int gameType;
int GetGameType() { return gameType; }
void ParseSBarInfo(int lump);
void ParseSBarInfoBlock(FScanner &sc, SBarInfoBlock &block);
void ParseMugShotBlock(FScanner &sc, MugShotState &state);
void getCoordinates(FScanner &sc, SBarInfoCommand &cmd); //retrieves the next two arguments as x and y.
int getSignedInteger(FScanner &sc); //returns a signed integer.
int newImage(const char* patchname);
void Init();
EColorRange GetTranslation(FScanner &sc, char* translation);
SBarInfo();
SBarInfo(int lumpnum);
~SBarInfo();
static void Load();
};
extern SBarInfo *SBarInfoScript;
//Mug Shot scripting structs.
struct MugShotState;
struct MugShotFrame
{
TArray<FString> graphic;
int delay;
MugShotFrame();
~MugShotFrame();
FTexture *getTexture(FPlayerSkin *skn, int random, int level=0, int direction=0, bool usesLevels=false, bool health2=false, bool healthspecial=false, bool directional=false);
};
struct MugShotState
{
bool usesLevels;
bool health2; //health level is the 2nd character from the end.
bool healthspecial; //like health2 only the 2nd frame gets the normal health type.
bool directional; //faces direction of damage.
unsigned int position;
int time;
int random;
bool finished;
FName state;
TArray<MugShotFrame> frames;
MugShotState();
MugShotState(FString name);
~MugShotState();
void tick();
void reset();
MugShotFrame getCurrentFrame() { return frames[position]; }
FTexture *getCurrentFrameTexture(FPlayerSkin *skn, int level=0, int direction=0) { return getCurrentFrame().getTexture(skn, random, level, direction, usesLevels, health2, healthspecial, directional); }
};
extern TArray<MugShotState> MugShotStates;
const MugShotState *FindMugShotState(FString state);
int FindMugShotStateIndex(FName state);
// Enums used between the parser and the display
enum //statusbar flags
{
STATUSBARFLAG_FORCESCALED = 1,
};
enum //gametype flags
{
GAMETYPE_SINGLEPLAYER = 1,
GAMETYPE_COOPERATIVE = 2,
GAMETYPE_DEATHMATCH = 4,
GAMETYPE_TEAMGAME = 8,
};
enum //drawimage flags
{
DRAWIMAGE_PLAYERICON = 1,
DRAWIMAGE_AMMO1 = 2,
DRAWIMAGE_AMMO2 = 4,
DRAWIMAGE_INVENTORYICON = 8,
DRAWIMAGE_TRANSLATABLE = 16,
DRAWIMAGE_WEAPONSLOT = 32,
DRAWIMAGE_SWITCHABLE_AND = 64,
DRAWIMAGE_INVULNERABILITY = 128,
DRAWIMAGE_OFFSET_CENTER = 256,
DRAWIMAGE_ARMOR = 512,
DRAWIMAGE_WEAPONICON = 1024,
};
enum //drawnumber flags
{
DRAWNUMBER_HEALTH = 1,
DRAWNUMBER_ARMOR = 2,
DRAWNUMBER_AMMO1 = 4,
DRAWNUMBER_AMMO2 = 8,
DRAWNUMBER_AMMO = 16,
DRAWNUMBER_AMMOCAPACITY = 32,
DRAWNUMBER_FRAGS = 64,
DRAWNUMBER_INVENTORY = 128,
DRAWNUMBER_KILLS = 256,
DRAWNUMBER_MONSTERS = 512,
DRAWNUMBER_ITEMS = 1024,
DRAWNUMBER_TOTALITEMS = 2048,
DRAWNUMBER_SECRETS = 4096,
DRAWNUMBER_TOTALSECRETS = 8192,
DRAWNUMBER_ARMORCLASS = 16384,
};
enum //drawbar flags (will go into special2)
{
DRAWBAR_HORIZONTAL = 1,
DRAWBAR_REVERSE = 2,
DRAWBAR_COMPAREDEFAULTS = 4,
};
enum //drawselectedinventory flags
{
DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY = 1,
DRAWSELECTEDINVENTORY_ARTIFLASH = 2,
DRAWSELECTEDINVENTORY_ALWAYSSHOWCOUNTER = 4,
};
enum //drawinventorybar flags
{
DRAWINVENTORYBAR_ALWAYSSHOW = 1,
DRAWINVENTORYBAR_NOARTIBOX = 2,
DRAWINVENTORYBAR_NOARROWS = 4,
DRAWINVENTORYBAR_ALWAYSSHOWCOUNTER = 8,
};
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 = 1,
DRAWMUGSHOT_ANIMATEDGODMODE = 2,
};
enum //drawkeybar flags
{
DRAWKEYBAR_VERTICAL = 1,
};
enum //event flags
{
SBARINFOEVENT_NOT = 1,
SBARINFOEVENT_OR = 2,
SBARINFOEVENT_AND = 4,
};
enum //Key words
{
SBARINFO_BASE,
SBARINFO_HEIGHT,
SBARINFO_INTERPOLATEHEALTH,
SBARINFO_INTERPOLATEARMOR,
SBARINFO_COMPLETEBORDER,
SBARINFO_MONOSPACEFONTS,
SBARINFO_STATUSBAR,
SBARINFO_MUGSHOT,
};
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_WEAPONAMMO,
};
//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();
~DSBarInfo();
void Draw(EHudState state);
void NewGame();
void AttachToPlayer(player_t *player);
void Tick();
void ReceivedWeapon (AWeapon *weapon);
void FlashItem(const PClass *itemtype);
void SetMugShotState(const char* stateName, bool waitTillDone=false);
private:
void doCommands(SBarInfoBlock &block);
void DrawGraphic(FTexture* texture, int x, int y, int flags);
void DrawString(const char* str, int x, int y, EColorRange translation, int spacing=0);
void DrawNumber(int num, int len, int x, int y, EColorRange translation, int spacing=0);
void DrawFace(int accuracy, bool xdth, bool animatedgodmode, int x, int y);
int updateState(bool xdth, bool animatedgodmode);
void DrawInventoryBar(int type, int num, int x, int y, bool alwaysshow,
int counterx, int countery, EColorRange translation, bool drawArtiboxes, bool noArrows, bool alwaysshowcounter);
void DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int padleft, int padright, int chainsize,
bool wiggle, bool translate);
FRemapTable* getTranslation();
FImageCollection Images;
FPlayerSkin *oldSkin;
FFont *drawingFont;
FString lastPrefix;
MugShotState *currentState;
bool weaponGrin;
bool damageFaceActive;
int lastDamageAngle;
int rampageTimer;
int oldHealth;
int oldArmor;
int mugshotHealth;
int chainWiggle;
int artiflash;
unsigned int invBarOffset;
FBarShader shader_horz_normal;
FBarShader shader_horz_reverse;
FBarShader shader_vert_normal;
FBarShader shader_vert_reverse;
};
#endif //__SBarInfo_SBAR_H__