From 9c89381400c0743bc156fc79284e0dde3e4c841d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 23 Dec 2007 20:59:06 +0000 Subject: [PATCH] - Added Blzut3's third SBARINFO update: * Added drawshader to draw Heretic style transparency gradients. * Added artiflash flag to drawselectedinventory. * Fixed: Drawgem used the wrong operator when determining the chain size. * Fixed: ZDoom would crash if an undefined font was used. * I also started cleaning up the source a little. I have been informed that when checking for flags the "== flagname" is redundant. - Added indexfont anf hudfont from GZDoom to zdoom.pk3 so that they are always available when defining custom status bars. SVN r629 (trunk) --- docs/rh-log.txt | 9 ++ src/g_shared/sbarinfo.cpp | 207 ++++++++++++++++++++++++++++++++++---- src/v_font.cpp | 14 ++- wadsrc/fontdefs.txt | 33 ++++++ wadsrc/zdoom.lst | 2 + 5 files changed, 247 insertions(+), 18 deletions(-) create mode 100644 wadsrc/fontdefs.txt diff --git a/docs/rh-log.txt b/docs/rh-log.txt index e8dd8f25a..804a6d58f 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,13 @@ December 23, 2007 (Changes by Graf Zahl) +- Added Blzut3's third SBARINFO update: + * Added drawshader to draw Heretic style transparency gradients. + * Added artiflash flag to drawselectedinventory. + * Fixed: Drawgem used the wrong operator when determining the chain size. + * Fixed: ZDoom would crash if an undefined font was used. + * I also started cleaning up the source a little. I have been informed that + when checking for flags the "== flagname" is redundant. +- Added indexfont anf hudfont from GZDoom to zdoom.pk3 so that they are always + available when defining custom status bars. - Added Karate Chris's 'sv_losefrag' submission. - Added Karate Chris's 'sv_degeneration' submission. - Fixed: 'Bot joined the team' message was passing an FString to Printf. diff --git a/src/g_shared/sbarinfo.cpp b/src/g_shared/sbarinfo.cpp index f2cfc5387..b05723422 100644 --- a/src/g_shared/sbarinfo.cpp +++ b/src/g_shared/sbarinfo.cpp @@ -25,6 +25,7 @@ static FRandom pr_chainwiggle; //use the same method of chain wiggling as hereti #define ST_RAMPAGETIME (TICRATE*2) #define ST_XDTHTIME (TICRATE*(3/2)) #define ST_NUMFACES 80 //9 levels with 8 faces each, 1 god, 1 death, 6 xdeath +#define ARTIFLASH_OFFSET (invBarOffset+6) EXTERN_CVAR(Int, fraglimit) @@ -73,6 +74,7 @@ enum //drawbar flags (will go into special2) enum //drawselectedinventory flags { DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY = 1, + DRAWSELECTEDINVENTORY_ARTIFLASH = 2, }; enum //drawinventorybar flags @@ -87,6 +89,12 @@ enum //drawgem flags DRAWGEM_TRANSLATABLE = 2, }; +enum //drawshader flags +{ + DRAWSHADER_VERTICAL = 1, + DRAWSHADER_REVERSE = 2, +}; + static const char *SBarInfoTopLevel[] = { "base", @@ -133,6 +141,7 @@ static const char *SBarInfoRoutineLevel[] = "drawinventorybar", "drawbar", "drawgem", + "drawshader", "gamemode", "playerclass", NULL @@ -147,6 +156,7 @@ enum SBARINFO_DRAWINVENTORYBAR, SBARINFO_DRAWBAR, SBARINFO_DRAWGEM, + SBARINFO_DRAWSHADER, SBARINFO_GAMEMODE, SBARINFO_PLAYERCLASS, }; @@ -344,6 +354,8 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block) SC_MustGetToken(','); SC_MustGetToken(TK_Identifier); cmd.font = V_GetFont(sc_String); + if(cmd.font == NULL) + SC_ScriptError("Unknown font '%s'.", sc_String); SC_MustGetToken(','); SC_MustGetToken(TK_Identifier); cmd.translation = this->GetTranslation(sc_String); @@ -435,16 +447,28 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block) case SBARINFO_DRAWSELECTEDINVENTORY: { bool alternateonempty = false; - SC_MustGetToken(TK_Identifier); - if(SC_Compare("alternateonempty")) + while(true) //go until we get a font (non-flag) { - alternateonempty = true; - cmd.flags = DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY; - SC_MustGetToken(','); SC_MustGetToken(TK_Identifier); + if(SC_Compare("alternateonempty")) + { + alternateonempty = true; + cmd.flags += DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY; + } + else if(SC_Compare("artiflash")) + { + cmd.flags += DRAWSELECTEDINVENTORY_ARTIFLASH; + } + else + { + cmd.font = V_GetFont(sc_String); + if(cmd.font == NULL) + SC_ScriptError("Unknown font '%s'.", sc_String); + SC_MustGetToken(','); + break; + } + SC_MustGetToken(','); } - cmd.font = V_GetFont(sc_String); - SC_MustGetToken(','); SC_MustGetToken(TK_IntConst); cmd.x = sc_Number; SC_MustGetToken(','); @@ -512,6 +536,8 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block) SC_MustGetToken(','); SC_MustGetToken(TK_Identifier); cmd.font = V_GetFont(sc_String); + if(cmd.font == NULL) + SC_ScriptError("Unknown font '%s'.", sc_String); } else { @@ -673,6 +699,39 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block) cmd.y = sc_Number - (200 - SBarInfoScript.height); SC_MustGetToken(';'); break; + case SBARINFO_DRAWSHADER: + SC_MustGetToken(TK_IntConst); + cmd.special = sc_Number; + if(sc_Number < 1) + SC_ScriptError("Width must be greater than 1."); + SC_MustGetToken(','); + SC_MustGetToken(TK_IntConst); + cmd.special2 = sc_Number; + if(sc_Number < 1) + SC_ScriptError("Height must be greater than 1."); + SC_MustGetToken(','); + SC_MustGetToken(TK_Identifier); + if(SC_Compare("vertical")) + cmd.flags += DRAWSHADER_VERTICAL; + else if(!SC_Compare("horizontal")) + SC_ScriptError("Unknown direction '%s'.", sc_String); + SC_MustGetToken(','); + if(SC_CheckToken(TK_Identifier)) + { + if(!SC_Compare("reverse")) + { + SC_ScriptError("Exspected 'reverse', got '%s' instead.", sc_String); + } + cmd.flags += DRAWSHADER_REVERSE; + 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: while(SC_CheckToken(TK_Identifier)) { @@ -922,6 +981,87 @@ protected: FTexture* image; }; +//Used for shadeing +class FBarShader : public FTexture +{ +public: + FBarShader() + { + WidthBits = 4; + HeightBits = 4; + WidthMask = 15; + } + + const BYTE *GetColumn(unsigned int column, const Span **spans_out) + { + if(spans_out != NULL) + { + *spans_out = DummySpan; + } + return Pixels + 10*(column & (Width-1)); + } + + const BYTE *GetPixels() + { + return Pixels; + } + + void Unload() + { + } + + void PrepareShader(int width, int height, bool vertical, bool reverse) //make an alpha map + { + Width = width; + Height = height; + Pixels = new BYTE[width*height]; + int value = vertical ? 256/height : 256/width; + int currentValue = value; + if(vertical) + { + for(int i = !reverse ? 0 : (width*height)-1;(!reverse && i < width*height) || (reverse && i >= 0);i += !reverse ? 1 : -1) + { + Pixels[i] = currentValue; + if(currentValue >= (value*height)) //time to reset + { + currentValue = value; + continue; + } + currentValue += value; + if(currentValue > 254) + { + currentValue = 254; + } + } + } + else + { + for(int i = reverse ? 0 : (width*height)-1;(reverse && i < width*height) || (!reverse && i >= 0);i += reverse ? 1 : -1) + { + Pixels[i] = currentValue; + if(i%height == 0) + { + if(currentValue >= (value*width)) //time to reset + { + currentValue = value; + continue; + } + currentValue += value; + if(currentValue > 254) + { + currentValue = 254; + } + } + } + } + Span Dummy[2] = {{0, height}, {0, 0}}; + DummySpan = Dummy; + } +private: + BYTE* Pixels; + Span* DummySpan; +}; + //SBarInfo Display class FSBarInfo : public FBaseStatusBar { @@ -932,15 +1072,16 @@ public: { "ARTIBOX", "SELECTBO", "INVGEML1", "INVGEML2", "INVGEMR1", "INVGEMR2", + "USEARTIA", "USEARTIB", "USEARTIC", "USEARTID", }; TArray patchnames; - patchnames.Resize(SBarInfoScript.Images.Size()+6); + patchnames.Resize(SBarInfoScript.Images.Size()+10); unsigned int i = 0; for(i = 0;i < SBarInfoScript.Images.Size();i++) { patchnames[i] = SBarInfoScript.Images[i]; } - for(i = 0;i < 6;i++) + for(i = 0;i < 10;i++) { patchnames[i+SBarInfoScript.Images.Size()] = InventoryBarLumps[i]; } @@ -957,6 +1098,7 @@ public: lastPrefix = ""; weaponGrin = false; chainWiggle = 0; + artiflash = 0; } ~FSBarInfo () @@ -1037,6 +1179,10 @@ public: oldHealth += clamp((CPlayer->health - oldHealth) >> 2, 1, 8); } } + if(artiflash) + { + artiflash--; + } } void SetFace (void *skn) @@ -1048,6 +1194,11 @@ public: { weaponGrin = true; } + + void FlashItem(const PClass *itemtype) + { + artiflash = 4; + } private: //code from doom_sbar.cpp but it should do fine. void SetFace (FPlayerSkin *skin, const char* defPrefix) @@ -1300,7 +1451,14 @@ private: case SBARINFO_DRAWSELECTEDINVENTORY: if(CPlayer->mo->InvSel != NULL && !(level.flags & LEVEL_NOINVENTORYBAR)) { - DrawImage(TexMan(CPlayer->mo->InvSel->Icon), cmd.x, cmd.y, CPlayer->mo->InvSel->Amount > 0 ? NULL : DIM_MAP); + if((cmd.flags & DRAWSELECTEDINVENTORY_ARTIFLASH) && artiflash) + { + DrawImage(Images[ARTIFLASH_OFFSET+(4-artiflash)], cmd.x, cmd.y, CPlayer->mo->InvSel->Amount > 0 ? NULL : DIM_MAP); + } + else + { + DrawImage(TexMan(CPlayer->mo->InvSel->Icon), cmd.x, cmd.y, CPlayer->mo->InvSel->Amount > 0 ? NULL : DIM_MAP); + } if(CPlayer->mo->InvSel->Amount != 1) { if(drawingFont != cmd.font) @@ -1310,7 +1468,7 @@ private: DrawNumber(CPlayer->mo->InvSel->Amount, 3, cmd.special2, cmd.special3, cmd.translation, cmd.special4); } } - else if((cmd.flags & DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY) == DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY) + else if((cmd.flags & DRAWSELECTEDINVENTORY_ALTERNATEONEMPTY)) { doCommands(cmd.subBlock); } @@ -1319,9 +1477,9 @@ private: { bool alwaysshow = false; bool artibox = true; - if((cmd.flags & DRAWINVENTORYBAR_ALWAYSSHOW) == DRAWINVENTORYBAR_ALWAYSSHOW) + if((cmd.flags & DRAWINVENTORYBAR_ALWAYSSHOW)) alwaysshow = true; - if((cmd.flags & DRAWINVENTORYBAR_NOARTIBOX) == DRAWINVENTORYBAR_NOARTIBOX) + if((cmd.flags & DRAWINVENTORYBAR_NOARTIBOX)) artibox = false; if(drawingFont != cmd.font) { @@ -1333,8 +1491,8 @@ private: case SBARINFO_DRAWBAR: { if(cmd.sprite == -1) break; //don't draw anything. - bool horizontal = ((cmd.special2 & DRAWBAR_HORIZONTAL) == DRAWBAR_HORIZONTAL); - bool reverse = ((cmd.special2 & DRAWBAR_REVERSE) == DRAWBAR_REVERSE); + bool horizontal = ((cmd.special2 & DRAWBAR_HORIZONTAL)); + bool reverse = ((cmd.special2 & DRAWBAR_REVERSE)); int value = 0; int max = 0; if(cmd.flags == DRAWNUMBER_HEALTH) @@ -1344,7 +1502,7 @@ private: { value = 0; } - if(!((cmd.special2 & DRAWBAR_COMPAREDEFAULTS) == DRAWBAR_COMPAREDEFAULTS)) + if(!(cmd.special2 & DRAWBAR_COMPAREDEFAULTS)) { AInventory* item = CPlayer->mo->FindInventory(PClass::FindClass(cmd.string[0])); //max comparer if(item != NULL) @@ -1474,7 +1632,21 @@ private: { wiggle = (cmd.flags & DRAWGEM_WIGGLE) == DRAWGEM_WIGGLE; } - DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, cmd.special3, cmd.special4-1, wiggle, translate); + DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate); + break; + } + case SBARINFO_DRAWSHADER: + { + bool vertical = (cmd.flags & DRAWSHADER_VERTICAL); + bool reverse = (cmd.flags & DRAWSHADER_REVERSE); + FBarShader* shader = new FBarShader(); + shader->PrepareShader(cmd.special, cmd.special2, vertical, reverse); + screen->DrawTexture (shader, ST_X+cmd.x, ST_Y+cmd.y, + DTA_320x200, Scaled, + DTA_AlphaChannel, true, + DTA_FillColor, 0, + TAG_DONE); + delete shader; break; } case SBARINFO_GAMEMODE: @@ -1754,6 +1926,7 @@ private: int oldHealth; int mugshotHealth; int chainWiggle; + int artiflash; unsigned int invBarOffset; }; diff --git a/src/v_font.cpp b/src/v_font.cpp index 639803302..d46b6ec8e 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -174,7 +174,19 @@ FFont * V_GetFont(const char *name) FFont *font = FFont::FindFont (name); if (font == NULL) { - int lump = Wads.CheckNumForName (name); + int lump = -1; + FString fullname; + + if (strlen(name) > 8) + { + fullname.Format("%s.fon", name); + lump = Wads.CheckNumForFullName(name); + } + else + { + lump = Wads.CheckNumForName (name); + } + if (lump != -1) { char head[3]; diff --git a/wadsrc/fontdefs.txt b/wadsrc/fontdefs.txt new file mode 100644 index 000000000..1e5f21108 --- /dev/null +++ b/wadsrc/fontdefs.txt @@ -0,0 +1,33 @@ + +// Fonts used by the alternative HUD + +HUDFONT_DOOM +{ + - STTMINUS + 0 STTNUM0 + 1 STTNUM1 + 2 STTNUM2 + 3 STTNUM3 + 4 STTNUM4 + 5 STTNUM5 + 6 STTNUM6 + 7 STTNUM7 + 8 STTNUM8 + 9 STTNUM9 + NOTRANSLATION 109 // don't touch the shadow color! +} + +HUDFONT_RAVEN +{ + - NEGNUM + 0 IN0 + 1 IN1 + 2 IN2 + 3 IN3 + 4 IN4 + 5 IN5 + 6 IN6 + 7 IN7 + 8 IN8 + 9 IN9 +} diff --git a/wadsrc/zdoom.lst b/wadsrc/zdoom.lst index 3d7b4fb00..95c2b4e50 100644 --- a/wadsrc/zdoom.lst +++ b/wadsrc/zdoom.lst @@ -239,6 +239,8 @@ acs/strfhelp.o strfhelp.o ======== # Font color ranges textcolors.txt textcolors.txt +fontdefs.txt fontdefs.txt +indexfont.fon indexfont.fon ======== # Decorate stuff