- Added Blzut3's SBARINFO update. (for real this time)

SVN r619 (trunk)
This commit is contained in:
Christoph Oelckers 2007-12-22 10:17:32 +00:00
parent 279aec66bb
commit 6b1a70952a

View file

@ -16,6 +16,8 @@
#include "sbarinfo.h" #include "sbarinfo.h"
#include "sc_man.h" #include "sc_man.h"
static FRandom pr_chainwiggle; //use the same method of chain wiggling as heretic.
#define ST_FACETIME (TICRATE/2) #define ST_FACETIME (TICRATE/2)
#define ST_PAINTIME (TICRATE) #define ST_PAINTIME (TICRATE)
#define ST_GRINTIME (TICRATE*2) #define ST_GRINTIME (TICRATE*2)
@ -40,11 +42,12 @@ enum //drawimage flags
DRAWIMAGE_PLAYERICON = 1, DRAWIMAGE_PLAYERICON = 1,
DRAWIMAGE_AMMO1 = 2, DRAWIMAGE_AMMO1 = 2,
DRAWIMAGE_AMMO2 = 4, DRAWIMAGE_AMMO2 = 4,
DRAWIMAGE_TRANSLATABLE = 8, DRAWIMAGE_INVENTORYICON = 8,
DRAWIMAGE_WEAPONSLOT = 16, DRAWIMAGE_TRANSLATABLE = 16,
DRAWIMAGE_SWITCHABLE_AND = 32, DRAWIMAGE_WEAPONSLOT = 32,
DRAWIMAGE_INVULNERABILITY = 64, DRAWIMAGE_SWITCHABLE_AND = 64,
DRAWIMAGE_OFFSET_CENTER = 128, DRAWIMAGE_INVULNERABILITY = 128,
DRAWIMAGE_OFFSET_CENTER = 256,
}; };
enum //drawnumber flags enum //drawnumber flags
@ -77,6 +80,12 @@ enum //drawinventorybar flags
DRAWINVENTORYBAR_NOARTIBOX = 2, DRAWINVENTORYBAR_NOARTIBOX = 2,
}; };
enum //drawgem flags
{
DRAWGEM_WIGGLE = 1,
DRAWGEM_TRANSLATABLE = 2,
};
static const char *SBarInfoTopLevel[] = static const char *SBarInfoTopLevel[] =
{ {
"base", "base",
@ -122,6 +131,7 @@ static const char *SBarInfoRoutineLevel[] =
"drawselectedinventory", "drawselectedinventory",
"drawinventorybar", "drawinventorybar",
"drawbar", "drawbar",
"drawgem",
"gamemode", "gamemode",
"playerclass", "playerclass",
NULL NULL
@ -135,6 +145,7 @@ enum
SBARINFO_DRAWSELECTEDINVENTORY, SBARINFO_DRAWSELECTEDINVENTORY,
SBARINFO_DRAWINVENTORYBAR, SBARINFO_DRAWINVENTORYBAR,
SBARINFO_DRAWBAR, SBARINFO_DRAWBAR,
SBARINFO_DRAWGEM,
SBARINFO_GAMEMODE, SBARINFO_GAMEMODE,
SBARINFO_PLAYERCLASS, SBARINFO_PLAYERCLASS,
}; };
@ -294,7 +305,15 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
getImage = true; getImage = true;
} }
else else
SC_ScriptError("Unknown imagetype '%s'.", sc_String); {
cmd.flags += DRAWIMAGE_INVENTORYICON;
const PClass* item = PClass::FindClass(sc_String);
if(item == NULL || !PClass::FindClass("Inventory")->IsAncestorOf(item)) //must be a kind of Inventory
{
SC_ScriptError("'%s' is not a type of inventory item.", sc_String);
}
cmd.sprite = ((AInventory *)GetDefaultByType(item))->Icon;
}
} }
if(getImage) if(getImage)
{ {
@ -398,6 +417,8 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.setString(sc_String, 0, 3, true); cmd.setString(sc_String, 0, 3, true);
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); //accuracy SC_MustGetToken(TK_IntConst); //accuracy
if(sc_Number < 1 || sc_Number > 9)
SC_ScriptError("Exspected a number between 1 and 9, got %d instead.", sc_Number);
cmd.special = sc_Number; cmd.special = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); //xdeath face (could be later used as flags SC_MustGetToken(TK_IntConst); //xdeath face (could be later used as flags
@ -612,6 +633,35 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript.height);
SC_MustGetToken(';'); SC_MustGetToken(';');
break; break;
case SBARINFO_DRAWGEM:
while(SC_CheckToken(TK_Identifier))
{
if(SC_Compare("wiggle"))
cmd.flags += DRAWGEM_WIGGLE;
else if(SC_Compare("translatable"))
cmd.flags += DRAWGEM_TRANSLATABLE;
else
SC_ScriptError("Unkown drawgem flag '%s'.", sc_String);
SC_MustGetToken(',');
}
SC_MustGetToken(TK_StringConst); //chain
cmd.special = newImage(sc_String);
SC_MustGetToken(',');
SC_MustGetToken(TK_StringConst); //gem
cmd.sprite = newImage(sc_String);
SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst);
if(sc_Number <= 0)
SC_ScriptError("Size must be a positive number.");
cmd.special2 = sc_Number;
SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst);
cmd.x = sc_Number;
SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height);
SC_MustGetToken(';');
break;
case SBARINFO_GAMEMODE: case SBARINFO_GAMEMODE:
while(SC_CheckToken(TK_Identifier)) while(SC_CheckToken(TK_Identifier))
{ {
@ -899,6 +949,7 @@ public:
mugshotHealth = -1; mugshotHealth = -1;
lastPrefix = new char[4]; lastPrefix = new char[4];
weaponGrin = false; weaponGrin = false;
chainWiggle = 0;
} }
~FSBarInfo () ~FSBarInfo ()
@ -961,6 +1012,8 @@ public:
void Tick () void Tick ()
{ {
FBaseStatusBar::Tick(); FBaseStatusBar::Tick();
if(level.time & 1)
chainWiggle = pr_chainwiggle() & 1;
getNewFace(M_Random()); getNewFace(M_Random());
if(!SBarInfoScript.interpolateHealth) if(!SBarInfoScript.interpolateHealth)
{ {
@ -1143,6 +1196,10 @@ private:
if(ammo2 != NULL) if(ammo2 != NULL)
DrawGraphic(TexMan[ammo2->Icon], cmd.x, cmd.y, cmd.flags); DrawGraphic(TexMan[ammo2->Icon], cmd.x, cmd.y, cmd.flags);
} }
else if((cmd.flags & DRAWIMAGE_INVENTORYICON) == DRAWIMAGE_INVENTORYICON)
{
DrawGraphic(TexMan[cmd.sprite], cmd.x, cmd.y, cmd.flags);
}
else else
{ {
DrawGraphic(Images[cmd.sprite], cmd.x, cmd.y, cmd.flags); DrawGraphic(Images[cmd.sprite], cmd.x, cmd.y, cmd.flags);
@ -1321,20 +1378,24 @@ private:
else if(cmd.flags == DRAWNUMBER_AMMO1) else if(cmd.flags == DRAWNUMBER_AMMO1)
{ {
value = ammocount1; value = ammocount1;
if(ammo1 == NULL) //no ammo, do not draw if(ammo1 == NULL) //no ammo, draw as empty
{ {
continue; value = 0;
max = 1;
} }
max = ammo1->MaxAmount; else
max = ammo1->MaxAmount;
} }
else if(cmd.flags == DRAWNUMBER_AMMO2) else if(cmd.flags == DRAWNUMBER_AMMO2)
{ {
value = ammocount2; value = ammocount2;
if(ammo2 == NULL) //no ammo, do not draw if(ammo2 == NULL) //no ammo, draw as empty
{ {
continue; value = 0;
max = 1;
} }
max = ammo2->MaxAmount; else
max = ammo2->MaxAmount;
} }
else if(cmd.flags == DRAWNUMBER_AMMO) else if(cmd.flags == DRAWNUMBER_AMMO)
{ {
@ -1386,6 +1447,29 @@ private:
DrawImage(bar, cmd.x, cmd.y); DrawImage(bar, cmd.x, cmd.y);
break; break;
} }
case SBARINFO_DRAWGEM:
{
int value = health;
int max = 100;
bool wiggle = false;
bool translate = (cmd.flags & DRAWGEM_TRANSLATABLE) == DRAWGEM_TRANSLATABLE;
if(max != 0 || value < 0)
{
value = (value*100)/max;
if(value > 100)
value = 100;
}
else
{
value = 0;
}
if(health != CPlayer->health)
{
wiggle = (cmd.flags & DRAWGEM_WIGGLE) == DRAWGEM_WIGGLE;
}
DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, wiggle, translate);
break;
}
case SBARINFO_GAMEMODE: case SBARINFO_GAMEMODE:
if(((cmd.flags & GAMETYPE_SINGLEPLAYER) == GAMETYPE_SINGLEPLAYER && !multiplayer) || if(((cmd.flags & GAMETYPE_SINGLEPLAYER) == GAMETYPE_SINGLEPLAYER && !multiplayer) ||
((cmd.flags & GAMETYPE_DEATHMATCH) == GAMETYPE_DEATHMATCH && deathmatch) || ((cmd.flags & GAMETYPE_DEATHMATCH) == GAMETYPE_DEATHMATCH && deathmatch) ||
@ -1625,6 +1709,31 @@ private:
} }
} }
//draws heretic/hexen style life gems
void DrawGem(FTexture* chain, FTexture* gem, int value, int x, int y, int size, bool wiggle, bool translate)
{
if(value > 100)
value = 100;
else if(value < 0)
value = 0;
if(wiggle)
y += chainWiggle;
int gemWidth = gem->GetWidth();
int offset = (int) (((double) (size-gemWidth)/100)*value);
if(chain != NULL)
{
DrawImage(chain, x+offset, y);
DrawImage(chain, x-chain->GetWidth()+offset+7, y);
}
if(gem != NULL)
DrawImage(gem, x-gemWidth+offset, y, translate ? /*translationtables[TRANSLATION_Players] + (CPlayer-players)*256*/ getTranslation() : NULL);
}
BYTE* getTranslation()
{
return translationtables[TRANSLATION_Players] + (CPlayer - players)*256;
}
FImageCollection Images; FImageCollection Images;
FImageCollection Faces; FImageCollection Faces;
FPlayerSkin *oldSkin; FPlayerSkin *oldSkin;
@ -1635,6 +1744,7 @@ private:
int faceIndex; int faceIndex;
int oldHealth; int oldHealth;
int mugshotHealth; int mugshotHealth;
int chainWiggle;
unsigned int invBarOffset; unsigned int invBarOffset;
}; };