- the status bars work as objects.

# Conflicts:
#	source/common/menu/menudef.cpp
This commit is contained in:
Christoph Oelckers 2020-10-28 19:27:12 +01:00
parent 3b7ce26c86
commit 7de6528a1f
19 changed files with 630 additions and 307 deletions

View file

@ -627,6 +627,7 @@ file( GLOB HEADER_FILES
common/utility/*.h common/utility/*.h
common/engine/*.h common/engine/*.h
common/menu/*.h common/menu/*.h
common/statusbar/*.h
common/fonts/*.h common/fonts/*.h
common/objects/*.h common/objects/*.h
common/filesystem/*.h common/filesystem/*.h
@ -806,7 +807,6 @@ set (PCH_SOURCES
core/raze_sound.cpp core/raze_sound.cpp
core/palette.cpp core/palette.cpp
core/zcompile.cpp core/zcompile.cpp
core/statusbar.cpp
core/statusbar2.cpp core/statusbar2.cpp
core/gi.cpp core/gi.cpp
@ -943,6 +943,7 @@ set (PCH_SOURCES
common/menu/resolutionmenu.cpp common/menu/resolutionmenu.cpp
common/menu/menudef.cpp common/menu/menudef.cpp
common/menu/savegamemanager.cpp common/menu/savegamemanager.cpp
common/statusbar/base_sbar.cpp
common/rendering/v_framebuffer.cpp common/rendering/v_framebuffer.cpp
common/rendering/v_video.cpp common/rendering/v_video.cpp
@ -1109,6 +1110,7 @@ include_directories(
common/console common/console
common/engine common/engine
common/menu common/menu
common/statusbar
common/fonts common/fonts
common/objects common/objects
common/rendering common/rendering

View file

@ -108,8 +108,9 @@ struct POWERUPDISPLAY
class DBloodStatusBar : public DStatusBarCore class DBloodStatusBar : public DBaseStatusBar
{ {
DECLARE_CLASS(DBloodStatusBar, DBaseStatusBar)
enum NewRSFlags enum NewRSFlags
{ {
RS_CENTERBOTTOM = 16384, RS_CENTERBOTTOM = 16384,
@ -241,7 +242,7 @@ private:
stats.spacing = 6; stats.spacing = 6;
} }
if (hud_size <= Hud_StbarOverlay) stats.screenbottomspace = 56; if (hud_size <= Hud_StbarOverlay) stats.screenbottomspace = 56;
DStatusBarCore::PrintAutomapInfo(stats, textfont); DBaseStatusBar::PrintAutomapInfo(stats, textfont);
} }
if (automapMode == am_off && hud_stats) if (automapMode == am_off && hud_stats)
{ {
@ -253,7 +254,7 @@ private:
stats.secrets = gSecretMgr.Founds + gSecretMgr.Super; stats.secrets = gSecretMgr.Founds + gSecretMgr.Super;
stats.maxsecrets = gSecretMgr.Total; stats.maxsecrets = gSecretMgr.Total;
DStatusBarCore::PrintLevelStats(stats); DBaseStatusBar::PrintLevelStats(stats);
} }
} }
@ -846,6 +847,8 @@ private:
} }
}; };
IMPLEMENT_CLASS(DBloodStatusBar, false, false)
static void UpdateFrame(void) static void UpdateFrame(void)
{ {
@ -864,14 +867,12 @@ static void UpdateFrame(void)
void UpdateStatusBar() void UpdateStatusBar()
{ {
DBloodStatusBar sbar;
if (automapMode == am_off && hud_size <= Hud_Stbar) if (automapMode == am_off && hud_size <= Hud_Stbar)
{ {
UpdateFrame(); UpdateFrame();
} }
sbar.UpdateStatusBar(); StatusBar->UpdateStatusBar();
} }

View file

@ -44,6 +44,7 @@
#include "vm.h" #include "vm.h"
#include "printf.h" #include "printf.h"
int ListGetInt(VMVa_List &tags); int ListGetInt(VMVa_List &tags);

View file

@ -556,6 +556,8 @@ OpenALSoundRenderer::OpenALSoundRenderer()
ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect"); ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect");
ALC.SOFT_HRTF = !!alcIsExtensionPresent(Device, "ALC_SOFT_HRTF"); ALC.SOFT_HRTF = !!alcIsExtensionPresent(Device, "ALC_SOFT_HRTF");
ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device");
ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device");
ALC.SOFT_output_limiter = !!alcIsExtensionPresent(Device, "ALC_SOFT_output_limiter");
const ALCchar *current = NULL; const ALCchar *current = NULL;
if(alcIsExtensionPresent(Device, "ALC_ENUMERATE_ALL_EXT")) if(alcIsExtensionPresent(Device, "ALC_ENUMERATE_ALL_EXT"))
@ -592,6 +594,11 @@ OpenALSoundRenderer::OpenALSoundRenderer()
else else
attribs.Push(ALC_DONT_CARE_SOFT); attribs.Push(ALC_DONT_CARE_SOFT);
} }
if (ALC.SOFT_output_limiter)
{
attribs.Push(ALC_OUTPUT_LIMITER_SOFT);
attribs.Push(ALC_TRUE /* or ALC_FALSE or ALC_DONT_CARE_SOFT */);
}
// Other attribs..? // Other attribs..?
attribs.Push(0); attribs.Push(0);

View file

@ -48,6 +48,262 @@
#include "printf.h" #include "printf.h"
#include "s_music.h" #include "s_music.h"
#include "i_interface.h" #include "i_interface.h"
#include "base_sbar.h"
//==========================================================================
//
// status bar exports
//
//==========================================================================
static double StatusbarToRealCoords(DStatusBarCore* self, double x, double y, double w, double h, double* py, double* pw, double* ph)
{
self->StatusbarToRealCoords(x, y, w, h);
*py = y;
*pw = w;
*ph = h;
return x;
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, StatusbarToRealCoords, StatusbarToRealCoords)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
self->StatusbarToRealCoords(x, y, w, h);
if (numret > 0) ret[0].SetFloat(x);
if (numret > 1) ret[1].SetFloat(y);
if (numret > 2) ret[2].SetFloat(w);
if (numret > 3) ret[3].SetFloat(h);
return MIN(4, numret);
}
void SBar_DrawTexture(DStatusBarCore* self, int texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY)
{
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
self->DrawGraphic(FSetTextureID(texid), x, y, flags, alpha, w, h, scaleX, scaleY);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawTexture, SBar_DrawTexture)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_INT(texid);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_INT(flags);
PARAM_FLOAT(alpha);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
PARAM_FLOAT(scaleX);
PARAM_FLOAT(scaleY);
SBar_DrawTexture(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY);
return 0;
}
void SBar_DrawImage(DStatusBarCore* self, const FString& texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY)
{
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
self->DrawGraphic(TexMan.CheckForTexture(texid, ETextureType::Any), x, y, flags, alpha, w, h, scaleX, scaleY);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawImage, SBar_DrawImage)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_STRING(texid);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_INT(flags);
PARAM_FLOAT(alpha);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
PARAM_FLOAT(scaleX);
PARAM_FLOAT(scaleY);
SBar_DrawImage(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY);
return 0;
}
void SBar_DrawString(DStatusBarCore* self, DHUDFont* font, const FString& string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing, double scaleX, double scaleY);
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawString, SBar_DrawString)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_POINTER_NOT_NULL(font, DHUDFont);
PARAM_STRING(string);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_INT(flags);
PARAM_INT(trans);
PARAM_FLOAT(alpha);
PARAM_INT(wrapwidth);
PARAM_INT(linespacing);
PARAM_FLOAT(scaleX);
PARAM_FLOAT(scaleY);
SBar_DrawString(self, font, string, x, y, flags, trans, alpha, wrapwidth, linespacing, scaleX, scaleY);
return 0;
}
static double SBar_TransformRect(DStatusBarCore* self, double x, double y, double w, double h, int flags, double* py, double* pw, double* ph)
{
self->TransformRect(x, y, w, h, flags);
*py = y;
*pw = w;
*ph = h;
return x;
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, TransformRect, SBar_TransformRect)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
PARAM_INT(flags);
self->TransformRect(x, y, w, h, flags);
if (numret > 0) ret[0].SetFloat(x);
if (numret > 1) ret[1].SetFloat(y);
if (numret > 2) ret[2].SetFloat(w);
if (numret > 3) ret[3].SetFloat(h);
return MIN(4, numret);
}
static void SBar_Fill(DStatusBarCore* self, int color, double x, double y, double w, double h, int flags)
{
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
self->Fill(color, x, y, w, h, flags);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, Fill, SBar_Fill)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_COLOR(color);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
PARAM_INT(flags);
SBar_Fill(self, color, x, y, w, h, flags);
return 0;
}
static void SBar_SetClipRect(DStatusBarCore* self, double x, double y, double w, double h, int flags)
{
self->SetClipRect(x, y, w, h, flags);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, SetClipRect, SBar_SetClipRect)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(w);
PARAM_FLOAT(h);
PARAM_INT(flags);
self->SetClipRect(x, y, w, h, flags);
return 0;
}
void FormatNumber(int number, int minsize, int maxsize, int flags, const FString& prefix, FString* result);
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, FormatNumber, FormatNumber)
{
PARAM_PROLOGUE;
PARAM_INT(number);
PARAM_INT(minsize);
PARAM_INT(maxsize);
PARAM_INT(flags);
PARAM_STRING(prefix);
FString fmt;
FormatNumber(number, minsize, maxsize, flags, prefix, &fmt);
ACTION_RETURN_STRING(fmt);
}
static void SBar_SetSize(DStatusBarCore* self, int rt, int vw, int vh, int hvw, int hvh)
{
self->SetSize(rt, vw, vh, hvw, hvh);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, SetSize, SBar_SetSize)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_INT(rt);
PARAM_INT(vw);
PARAM_INT(vh);
PARAM_INT(hvw);
PARAM_INT(hvh);
self->SetSize(rt, vw, vh, hvw, hvh);
return 0;
}
static void SBar_GetHUDScale(DStatusBarCore* self, DVector2* result)
{
*result = self->GetHUDScale();
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, GetHUDScale, SBar_GetHUDScale)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
ACTION_RETURN_VEC2(self->GetHUDScale());
}
static void BeginStatusBar(DStatusBarCore* self, bool fs, int w, int h, int r)
{
self->BeginStatusBar(w, h, r, fs);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, BeginStatusBar, BeginStatusBar)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_BOOL(fs);
PARAM_INT(w);
PARAM_INT(h);
PARAM_INT(r);
self->BeginStatusBar(w, h, r, fs);
return 0;
}
static void BeginHUD(DStatusBarCore* self, double a, bool fs, int w, int h)
{
self->BeginHUD(w, h, a, fs);
}
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, BeginHUD, BeginHUD)
{
PARAM_SELF_PROLOGUE(DStatusBarCore);
PARAM_FLOAT(a);
PARAM_BOOL(fs);
PARAM_INT(w);
PARAM_INT(h);
self->BeginHUD(w, h, a, fs);
return 0;
}
//=====================================================================================
//
//
//
//=====================================================================================
DHUDFont* CreateHudFont(FFont* fnt, int spac, int mono, int sx, int sy)
{
return nullptr;// (Create<DHUDFont>(fnt, spac, EMonospacing(mono), sy, sy));
}
DEFINE_ACTION_FUNCTION_NATIVE(DHUDFont, Create, CreateHudFont)
{
PARAM_PROLOGUE;
PARAM_POINTER(fnt, FFont);
PARAM_INT(spac);
PARAM_INT(mono);
PARAM_INT(sx);
PARAM_INT(sy);
ACTION_RETURN_POINTER(CreateHudFont(fnt, spac, mono, sy, sy));
}
//========================================================================== //==========================================================================
@ -662,3 +918,14 @@ DEFINE_GLOBAL_NAMED(PClass::AllClasses, AllClasses)
DEFINE_GLOBAL(Bindings) DEFINE_GLOBAL(Bindings)
DEFINE_GLOBAL(AutomapBindings) DEFINE_GLOBAL(AutomapBindings)
DEFINE_GLOBAL(generic_ui) DEFINE_GLOBAL(generic_ui)
DEFINE_FIELD(DStatusBarCore, RelTop);
DEFINE_FIELD(DStatusBarCore, HorizontalResolution);
DEFINE_FIELD(DStatusBarCore, VerticalResolution);
DEFINE_FIELD(DStatusBarCore, CompleteBorder);
DEFINE_FIELD(DStatusBarCore, Alpha);
DEFINE_FIELD(DStatusBarCore, drawOffset);
DEFINE_FIELD(DStatusBarCore, drawClip);
DEFINE_FIELD(DStatusBarCore, fullscreenOffsets);
DEFINE_FIELD(DStatusBarCore, defaultScale);
DEFINE_FIELD(DHUDFont, mFont);

View file

@ -1,10 +1,10 @@
/* /*
** shared_sbar.cpp ** base_sbar.cpp
** Base status bar implementation ** Base status bar implementation
** **
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** Copyright 1998-2006 Randy Heit ** Copyright 1998-2016 Randy Heit
** Copyright 2017 Christoph Oelckers ** Copyright 2017-2020 Christoph Oelckers
** All rights reserved. ** All rights reserved.
** **
** Redistribution and use in source and binary forms, with or without ** Redistribution and use in source and binary forms, with or without
@ -35,36 +35,26 @@
#include <assert.h> #include <assert.h>
#include "build.h"
#include "templates.h" #include "templates.h"
#include "statusbar.h" #include "base_sbar.h"
#include "c_cvars.h" #include "printf.h"
#include "c_dispatch.h" #include "v_draw.h"
#include "c_console.h"
#include "v_video.h"
#include "filesystem.h"
#include "s_soundinternal.h"
#include "serializer.h"
#include "serialize_obj.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "vm.h"
#include "gstrings.h"
#include "utf8.h"
#include "texturemanager.h" #include "texturemanager.h"
#include "cmdlib.h" #include "c_cvars.h"
#include "v_draw.h"
#include "v_font.h" #include "v_font.h"
#include "v_draw.h" #include "utf8.h"
#include "gamecvars.h" #include "v_text.h"
#include "m_fixed.h" #include "vm.h"
#include "gamecontrol.h"
#include "gamestruct.h"
#include "razemenu.h"
#include "mapinfo.h"
FGameTexture* CrosshairImage; FGameTexture* CrosshairImage;
static int CrosshairNum; static int CrosshairNum;
IMPLEMENT_CLASS(DStatusBarCore, true, false)
//IMPLEMENT_CLASS(DHUDFont, true, false);
CVAR(Color, crosshaircolor, 0xff0000, CVAR_ARCHIVE); CVAR(Color, crosshaircolor, 0xff0000, CVAR_ARCHIVE);
CVAR(Int, crosshairhealth, 2, CVAR_ARCHIVE); CVAR(Int, crosshairhealth, 2, CVAR_ARCHIVE);
CVAR(Float, crosshairscale, 1.0, CVAR_ARCHIVE); CVAR(Float, crosshairscale, 1.0, CVAR_ARCHIVE);

View file

@ -0,0 +1,194 @@
#pragma once
#include "dobject.h"
#include "textureid.h"
#include "zstring.h"
#include "v_draw.h"
class FGameTexture;
class FFont;
extern FGameTexture* CrosshairImage;
void ST_LoadCrosshair(int num, bool alwaysload);
void ST_UnloadCrosshair();
void ST_DrawCrosshair(int phealth, double xpos, double ypos, double scale);
enum DI_Flags
{
DI_SKIPICON = 0x1,
DI_SKIPALTICON = 0x2,
DI_SKIPSPAWN = 0x4,
DI_SKIPREADY = 0x8,
DI_ALTICONFIRST = 0x10,
DI_TRANSLATABLE = 0x20,
DI_FORCESCALE = 0x40,
DI_DIM = 0x80,
DI_DRAWCURSORFIRST = 0x100, // only for DrawInventoryBar.
DI_ALWAYSSHOWCOUNT = 0x200, // only for DrawInventoryBar.
DI_DIMDEPLETED = 0x400,
DI_DONTANIMATE = 0x800, // do not animate the texture
DI_MIRROR = 0x1000, // flip the texture horizontally, like a mirror
DI_ITEM_RELCENTER = 0x2000,
DI_MIRRORY = 0x40000000,
DI_SCREEN_AUTO = 0, // decide based on given offsets.
DI_SCREEN_MANUAL_ALIGN = 0x4000, // If this is on, the following flags will have an effect
DI_SCREEN_TOP = DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VCENTER = 0x8000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_BOTTOM = 0x10000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VOFFSET = 0x18000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VMASK = 0x18000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_LEFT = DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HCENTER = 0x20000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_RIGHT = 0x40000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HOFFSET = 0x60000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HMASK = 0x60000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_LEFT_TOP = DI_SCREEN_TOP | DI_SCREEN_LEFT,
DI_SCREEN_RIGHT_TOP = DI_SCREEN_TOP | DI_SCREEN_RIGHT,
DI_SCREEN_LEFT_BOTTOM = DI_SCREEN_BOTTOM | DI_SCREEN_LEFT,
DI_SCREEN_LEFT_CENTER = DI_SCREEN_VCENTER | DI_SCREEN_LEFT,
DI_SCREEN_RIGHT_BOTTOM = DI_SCREEN_BOTTOM | DI_SCREEN_RIGHT,
DI_SCREEN_RIGHT_CENTER = DI_SCREEN_VCENTER | DI_SCREEN_RIGHT,
DI_SCREEN_CENTER = DI_SCREEN_VCENTER | DI_SCREEN_HCENTER,
DI_SCREEN_CENTER_TOP = DI_SCREEN_TOP | DI_SCREEN_HCENTER,
DI_SCREEN_CENTER_BOTTOM = DI_SCREEN_BOTTOM | DI_SCREEN_HCENTER,
DI_SCREEN_OFFSETS = DI_SCREEN_HOFFSET | DI_SCREEN_VOFFSET,
DI_ITEM_AUTO = 0, // equivalent with bottom center, which is the default alignment.
DI_ITEM_TOP = 0x80000,
DI_ITEM_VCENTER = 0x100000,
DI_ITEM_BOTTOM = 0, // this is the default vertical alignment
DI_ITEM_VOFFSET = 0x180000,
DI_ITEM_VMASK = 0x180000,
DI_ITEM_LEFT = 0x200000,
DI_ITEM_HCENTER = 0, // this is the deafault horizontal alignment
DI_ITEM_RIGHT = 0x400000,
DI_ITEM_HOFFSET = 0x600000,
DI_ITEM_HMASK = 0x600000,
DI_ITEM_LEFT_TOP = DI_ITEM_TOP | DI_ITEM_LEFT,
DI_ITEM_RIGHT_TOP = DI_ITEM_TOP | DI_ITEM_RIGHT,
DI_ITEM_LEFT_BOTTOM = DI_ITEM_BOTTOM | DI_ITEM_LEFT,
DI_ITEM_RIGHT_BOTTOM = DI_ITEM_BOTTOM | DI_ITEM_RIGHT,
DI_ITEM_CENTER = DI_ITEM_VCENTER | DI_ITEM_HCENTER,
DI_ITEM_CENTER_BOTTOM = DI_ITEM_BOTTOM | DI_ITEM_HCENTER,
DI_ITEM_OFFSETS = DI_ITEM_HOFFSET | DI_ITEM_VOFFSET,
DI_TEXT_ALIGN_LEFT = 0,
DI_TEXT_ALIGN_RIGHT = 0x800000,
DI_TEXT_ALIGN_CENTER = 0x1000000,
DI_TEXT_ALIGN = 0x1800000,
DI_ALPHAMAPPED = 0x2000000,
DI_NOSHADOW = 0x4000000,
DI_ALWAYSSHOWCOUNTERS = 0x8000000,
DI_ARTIFLASH = 0x10000000,
DI_FORCEFILL = 0x20000000,
// These 2 flags are only used by SBARINFO so these duplicate other flags not used by SBARINFO
DI_DRAWINBOX = DI_TEXT_ALIGN_RIGHT,
DI_ALTERNATEONFAIL = DI_TEXT_ALIGN_CENTER,
};
//============================================================================
//
// encapsulates all settings a HUD font may need
//
//============================================================================
class DHUDFont //: public DObject - need to keep it POD for now.
{
// this blocks CreateNew on this class which is the intent here.
//DECLARE_ABSTRACT_CLASS(DHUDFont, DObject);
public:
FFont* mFont;
int mSpacing;
EMonospacing mMonospacing;
int mShadowX;
int mShadowY;
DHUDFont() = default;
DHUDFont(FFont* f, int sp, EMonospacing ms, int sx, int sy)
: mFont(f), mSpacing(sp), mMonospacing(ms), mShadowX(sx), mShadowY(sy)
{}
};
class DStatusBarCore : public DObject
{
DECLARE_CLASS(DStatusBarCore, DObject)
protected:
public:
enum EAlign
{
TOP = 0,
VCENTER = 1,
BOTTOM = 2,
VOFFSET = 3,
VMASK = 3,
LEFT = 0,
HCENTER = 4,
RIGHT = 8,
HOFFSET = 12,
HMASK = 12,
CENTER = VCENTER | HCENTER,
CENTER_BOTTOM = BOTTOM | HCENTER
};
int ST_X;
int ST_Y;
int SBarTop;
int RelTop;
int HorizontalResolution, VerticalResolution;
double Alpha = 1.;
DVector2 SBarScale;
DVector2 drawOffset = { 0,0 }; // can be set by subclasses to offset drawing operations
DVector2 defaultScale; // factor for clean fully scaled display.
double drawClip[4] = { 0,0,0,0 }; // defines a clipping rectangle (not used yet)
bool fullscreenOffsets = false; // current screen is displayed with fullscreen behavior.
bool ForcedScale = false;
bool CompleteBorder = false;
int BaseRelTop;
int BaseSBarHorizontalResolution;
int BaseSBarVerticalResolution;
int BaseHUDHorizontalResolution;
int BaseHUDVerticalResolution;
void BeginStatusBar(int resW, int resH, int relTop, bool forceScaled = false);
void BeginHUD(int resW, int resH, double Alpha, bool forceScaled = false);
void SetSize(int reltop = 32, int hres = 320, int vres = 200, int hhres = -1, int hvres = -1);
virtual DVector2 GetHUDScale() const;
virtual uint32_t GetTranslation() const { return 0; }
void SetDrawSize(int reltop, int hres, int vres);
virtual void SetScale();
void ValidateResolution(int& hres, int& vres) const;
void StatusbarToRealCoords(double& x, double& y, double& w, double& h) const;
void DrawGraphic(FGameTexture* texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent);
void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent);
void DrawString(FFont* font, const FString& cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY);
void TransformRect(double& x, double& y, double& w, double& h, int flags = 0);
void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0);
void SetClipRect(double x, double y, double w, double h, int flags = 0);
};

View file

@ -132,6 +132,8 @@ void LoadScripts();
void MainLoop(); void MainLoop();
void SetConsoleNotifyBuffer(); void SetConsoleNotifyBuffer();
DBaseStatusBar* StatusBar;
bool AppActive = true; bool AppActive = true;
@ -536,6 +538,8 @@ int GameMain()
} }
DeleteScreenJob(); DeleteScreenJob();
DeinitMenus(); DeinitMenus();
if (StatusBar) StatusBar->Destroy();
StatusBar = nullptr;
if (gi) if (gi)
{ {
gi->FreeGameData(); // Must be done before taking down any subsystems. gi->FreeGameData(); // Must be done before taking down any subsystems.
@ -745,6 +749,7 @@ static TArray<GrpEntry> SetupGame()
currentGame = LumpFilter; currentGame = LumpFilter;
currentGame.Truncate(currentGame.IndexOf(".")); currentGame.Truncate(currentGame.IndexOf("."));
PClass::StaticInit();
CheckFrontend(g_gameType); CheckFrontend(g_gameType);
gameinfo.gametype = g_gameType; gameinfo.gametype = g_gameType;
return usedgroups; return usedgroups;
@ -761,6 +766,36 @@ void InitLanguages()
GStrings.LoadStrings(language); GStrings.LoadStrings(language);
} }
void CreateStatusBar()
{
int flags = g_gameType;
PClass* stbarclass = nullptr;
if (flags & GAMEFLAG_BLOOD)
{
stbarclass = PClass::FindClass("BloodStatusBar");
}
else if (flags & GAMEFLAG_SW)
{
stbarclass = PClass::FindClass("SWStatusBar");
}
else if (flags & GAMEFLAG_PSEXHUMED)
{
stbarclass = PClass::FindClass("ExhumedStatusBar");
}
else
{
stbarclass = PClass::FindClass(isRR() ? "RedneckStatusBar" : "DukeStatusBar");
}
if (!stbarclass)
{
I_FatalError("No status bar defined");
}
StatusBar = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
GC::AddMarkerFunc([]() { GC::Mark(StatusBar); });
}
//========================================================================== //==========================================================================
// //
// //
@ -871,6 +906,7 @@ int RunGame()
SetupGameButtons(); SetupGameButtons();
gameinfo.mBackButton = "engine/graphics/m_back.png"; gameinfo.mBackButton = "engine/graphics/m_back.png";
gi->app_init(); gi->app_init();
CreateStatusBar();
SetDefaultMenuColors(); SetDefaultMenuColors();
M_Init(); M_Init();
BuildGameMenus(); BuildGameMenus();

View file

@ -38,8 +38,8 @@
#include "dobject.h" #include "dobject.h"
#include "v_text.h" #include "v_text.h"
#include "renderstyle.h" #include "renderstyle.h"
#include "base_sbar.h"
class player_t;
struct FRemapTable; struct FRemapTable;
#if 0 #if 0
@ -89,265 +89,52 @@ struct FLevelStats
// //
//============================================================================ //============================================================================
class DHUDFont //: public DObject class DBaseStatusBar : public DStatusBarCore
{ {
// this blocks CreateNew on this class which is the intent here. DECLARE_ABSTRACT_CLASS (DBaseStatusBar, DStatusBarCore)
//DECLARE_ABSTRACT_CLASS(DHUDFont, DObject);
public: public:
FFont *mFont; DBaseStatusBar ();
int mSpacing; virtual ~DBaseStatusBar() = default;
EMonospacing mMonospacing;
int mShadowX;
int mShadowY;
DHUDFont() = default;
DHUDFont(FFont *f, int sp, EMonospacing ms, int sx, int sy)
: mFont(f), mSpacing(sp), mMonospacing(ms), mShadowX(sx), mShadowY(sy)
{}
};
class DStatusBarCore //: public DObject
{
//DECLARE_CLASS (DStatusBarCore, DObject)
//HAS_OBJECT_POINTERS
public:
// Popup screens for Strife's status bar
enum
{
POP_NoChange = -1,
POP_None,
POP_Log,
POP_Keys,
POP_Status
};
// Status face stuff
enum
{
ST_NUMPAINFACES = 5,
ST_NUMSTRAIGHTFACES = 3,
ST_NUMTURNFACES = 2,
ST_NUMSPECIALFACES = 3,
ST_NUMEXTRAFACES = 2,
ST_FACESTRIDE = ST_NUMSTRAIGHTFACES+ST_NUMTURNFACES+ST_NUMSPECIALFACES,
ST_NUMFACES = ST_FACESTRIDE*ST_NUMPAINFACES+ST_NUMEXTRAFACES,
ST_TURNOFFSET = ST_NUMSTRAIGHTFACES,
ST_OUCHOFFSET = ST_TURNOFFSET + ST_NUMTURNFACES,
ST_EVILGRINOFFSET = ST_OUCHOFFSET + 1,
ST_RAMPAGEOFFSET = ST_EVILGRINOFFSET + 1,
ST_GODFACE = ST_NUMPAINFACES*ST_FACESTRIDE,
ST_DEADFACE = ST_GODFACE + 1
};
enum EAlign
{
TOP = 0,
VCENTER = 1,
BOTTOM = 2,
VOFFSET = 3,
VMASK = 3,
LEFT = 0,
HCENTER = 4,
RIGHT = 8,
HOFFSET = 12,
HMASK = 12,
CENTER = VCENTER | HCENTER,
CENTER_BOTTOM = BOTTOM | HCENTER
};
DStatusBarCore ();
virtual ~DStatusBarCore() = default;
void SetSize(int reltop = 32, int hres = 320, int vres = 200, int hhres = -1, int hvres = -1);
void ShowPlayerName ();
double GetDisplacement() { return Displacement; }
int GetPlayer ();
static void AddBlend (float r, float g, float b, float a, float v_blend[4]);
// do not make this a DObject Serialize function because it's not used like one! // do not make this a DObject Serialize function because it's not used like one!
void SerializeMessages(FSerializer &arc); //void SerializeMessages(FSerializer &arc);
void SetScale();
virtual void Tick (); virtual void Tick ();
void AttachToPlayer(player_t *player);
DVector2 GetHUDScale() const;
void NewGame ();
int GetTranslation() { return 0; }
void DrawGraphic(FGameTexture *texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent);
void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0, ERenderStyle style = STYLE_Translucent);
void DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY);
void TransformRect(double &x, double &y, double &w, double &h, int flags = 0);
void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0);
void ValidateResolution(int& hres, int& vres) const;
void BeginStatusBar(int resW, int resH, int relTop, bool forceScaled = false);
void BeginHUD(int resW, int resH, double Alpha, bool forceScaled = false);
void StatusbarToRealCoords(double &x, double &y, double &w, double &h) const;
void PrintLevelStats(FLevelStats& stats); void PrintLevelStats(FLevelStats& stats);
void PrintAutomapInfo(FLevelStats& stats, bool forcetextfont = false); void PrintAutomapInfo(FLevelStats& stats, bool forcetextfont = false);
int GetTopOfStatusbar() const int GetTopOfStatusbar() const
{ {
return SBarTop; return SBarTop;
} }
void DoDrawAutomapHUD(int crdefault, int highlight);
short CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading); short CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading);
void Set43ClipRect(); void Set43ClipRect();
virtual void UpdateStatusBar() = 0;
void SetClipRect(double x, double y, double w, double h, int flags);
//protected:
void DrawPowerups ();
void RefreshBackground () const;
void RefreshViewBorder ();
private: private:
DObject *AltHud = nullptr; DObject *AltHud = nullptr;
public: public:
void DrawCrosshair ();
// Sizing info for ths status bar.
int ST_X;
int ST_Y;
int SBarTop;
DVector2 SBarScale;
int RelTop;
int HorizontalResolution, VerticalResolution;
bool Scaled; // This needs to go away.
bool Centering; bool Centering;
bool FixedOrigin; bool FixedOrigin;
bool CompleteBorder;
double CrosshairSize;
double Displacement;
bool ShowLog;
bool ForcedScale = false;
double Alpha = 1.;
DVector2 drawOffset = { 0,0 }; // can be set by subclasses to offset drawing operations
double drawClip[4] = { 0,0,0,0 }; // defines a clipping rectangle (not used yet)
bool fullscreenOffsets = false; // current screen is displayed with fullscreen behavior.
DVector2 defaultScale; // factor for clean fully scaled display.
private: private:
void SetDrawSize(int reltop, int hres, int vres);
int BaseRelTop;
int BaseSBarHorizontalResolution;
int BaseSBarVerticalResolution;
int BaseHUDHorizontalResolution;
int BaseHUDVerticalResolution;
}; };
extern DStatusBarCore *StatusBar; extern DBaseStatusBar *StatusBar;
// Status bar factories ----------------------------------------------------- // Status bar factories -----------------------------------------------------
DStatusBarCore *CreateCustomStatusBar(int script=0);
// Crosshair stuff ---------------------------------------------------------- // Crosshair stuff ----------------------------------------------------------
void ST_Clear(); void ST_Clear();
void ST_CreateStatusBar(bool bTitleLevel);
extern FGameTexture *CrosshairImage; extern FGameTexture *CrosshairImage;
int GetInventoryIcon(AActor *item, uint32_t flags, int *applyscale = nullptr);
enum DI_Flags
{
DI_SKIPICON = 0x1,
DI_SKIPALTICON = 0x2,
DI_SKIPSPAWN = 0x4,
DI_SKIPREADY = 0x8,
DI_ALTICONFIRST = 0x10,
DI_TRANSLATABLE = 0x20,
DI_FORCESCALE = 0x40,
DI_DIM = 0x80,
DI_DRAWCURSORFIRST = 0x100, // only for DrawInventoryBar.
DI_ALWAYSSHOWCOUNT = 0x200, // only for DrawInventoryBar.
DI_DIMDEPLETED = 0x400,
DI_DONTANIMATE = 0x800, // do not animate the texture
DI_MIRROR = 0x1000, // flip the texture horizontally, like a mirror
DI_ITEM_RELCENTER = 0x2000,
DI_MIRRORY = 0x40000000,
DI_SCREEN_AUTO = 0, // decide based on given offsets.
DI_SCREEN_MANUAL_ALIGN = 0x4000, // If this is on, the following flags will have an effect
DI_SCREEN_TOP = DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VCENTER = 0x8000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_BOTTOM = 0x10000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VOFFSET = 0x18000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_VMASK = 0x18000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_LEFT = DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HCENTER = 0x20000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_RIGHT = 0x40000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HOFFSET = 0x60000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_HMASK = 0x60000 | DI_SCREEN_MANUAL_ALIGN,
DI_SCREEN_LEFT_TOP = DI_SCREEN_TOP|DI_SCREEN_LEFT,
DI_SCREEN_RIGHT_TOP = DI_SCREEN_TOP|DI_SCREEN_RIGHT,
DI_SCREEN_LEFT_BOTTOM = DI_SCREEN_BOTTOM|DI_SCREEN_LEFT,
DI_SCREEN_LEFT_CENTER = DI_SCREEN_VCENTER | DI_SCREEN_LEFT,
DI_SCREEN_RIGHT_BOTTOM = DI_SCREEN_BOTTOM|DI_SCREEN_RIGHT,
DI_SCREEN_RIGHT_CENTER = DI_SCREEN_VCENTER | DI_SCREEN_RIGHT,
DI_SCREEN_CENTER = DI_SCREEN_VCENTER|DI_SCREEN_HCENTER,
DI_SCREEN_CENTER_TOP = DI_SCREEN_TOP | DI_SCREEN_HCENTER,
DI_SCREEN_CENTER_BOTTOM = DI_SCREEN_BOTTOM|DI_SCREEN_HCENTER,
DI_SCREEN_OFFSETS = DI_SCREEN_HOFFSET|DI_SCREEN_VOFFSET,
DI_ITEM_AUTO = 0, // equivalent with bottom center, which is the default alignment.
DI_ITEM_TOP = 0x80000,
DI_ITEM_VCENTER = 0x100000,
DI_ITEM_BOTTOM = 0, // this is the default vertical alignment
DI_ITEM_VOFFSET = 0x180000,
DI_ITEM_VMASK = 0x180000,
DI_ITEM_LEFT = 0x200000,
DI_ITEM_HCENTER = 0, // this is the deafault horizontal alignment
DI_ITEM_RIGHT = 0x400000,
DI_ITEM_HOFFSET = 0x600000,
DI_ITEM_HMASK = 0x600000,
DI_ITEM_LEFT_TOP = DI_ITEM_TOP|DI_ITEM_LEFT,
DI_ITEM_RIGHT_TOP = DI_ITEM_TOP|DI_ITEM_RIGHT,
DI_ITEM_LEFT_BOTTOM = DI_ITEM_BOTTOM|DI_ITEM_LEFT,
DI_ITEM_RIGHT_BOTTOM = DI_ITEM_BOTTOM|DI_ITEM_RIGHT,
DI_ITEM_CENTER = DI_ITEM_VCENTER|DI_ITEM_HCENTER,
DI_ITEM_CENTER_BOTTOM = DI_ITEM_BOTTOM|DI_ITEM_HCENTER,
DI_ITEM_OFFSETS = DI_ITEM_HOFFSET|DI_ITEM_VOFFSET,
DI_TEXT_ALIGN_LEFT = 0,
DI_TEXT_ALIGN_RIGHT = 0x800000,
DI_TEXT_ALIGN_CENTER = 0x1000000,
DI_TEXT_ALIGN = 0x1800000,
DI_ALPHAMAPPED = 0x2000000,
DI_NOSHADOW = 0x4000000,
DI_ALWAYSSHOWCOUNTERS = 0x8000000,
DI_ARTIFLASH = 0x10000000,
DI_FORCEFILL = 0x20000000,
// These 2 flags are only used by SBARINFO so these duplicate other flags not used by SBARINFO
DI_DRAWINBOX = DI_TEXT_ALIGN_RIGHT,
DI_ALTERNATEONFAIL = DI_TEXT_ALIGN_CENTER,
};
void SBar_DrawString(DStatusBarCore* self, DHUDFont* font, const FString& string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing, double scaleX, double scaleY); void SBar_DrawString(DStatusBarCore* self, DHUDFont* font, const FString& string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing, double scaleX, double scaleY);
void setViewport(int viewSize); void setViewport(int viewSize);

View file

@ -78,11 +78,11 @@ EXTERN_CVAR (Bool, noisedebug)
EXTERN_CVAR(Bool, vid_fps) EXTERN_CVAR(Bool, vid_fps)
EXTERN_CVAR(Bool, inter_subtitles) EXTERN_CVAR(Bool, inter_subtitles)
extern DStatusBarCore *StatusBar; //extern DBaseStatusBar *StatusBar;
extern int setblocks; extern int setblocks;
IMPLEMENT_CLASS(DBaseStatusBar, true, false)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// ST_Clear // ST_Clear
// //
@ -104,14 +104,11 @@ void ST_Clear()
// Constructor // Constructor
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
DStatusBarCore::DStatusBarCore () DBaseStatusBar::DBaseStatusBar ()
{ {
CompleteBorder = false; CompleteBorder = false;
Centering = false; Centering = false;
FixedOrigin = false; FixedOrigin = false;
CrosshairSize = 1.;
Displacement = 0;
ShowLog = false;
SetSize(0); SetSize(0);
} }
@ -121,7 +118,7 @@ DStatusBarCore::DStatusBarCore ()
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void DStatusBarCore::Tick () void DBaseStatusBar::Tick ()
{ {
} }
@ -139,7 +136,7 @@ static DObject *InitObject(PClass *type, int paramnum, VM_ARGS)
// //
//============================================================================ //============================================================================
void DStatusBarCore::PrintLevelStats(FLevelStats &stats) void DBaseStatusBar::PrintLevelStats(FLevelStats &stats)
{ {
double y; double y;
double scale = stats.fontscale * hud_statscale; double scale = stats.fontscale * hud_statscale;
@ -212,7 +209,7 @@ void DStatusBarCore::PrintLevelStats(FLevelStats &stats)
// //
//============================================================================ //============================================================================
void DStatusBarCore::PrintAutomapInfo(FLevelStats& stats, bool forcetextfont) void DBaseStatusBar::PrintAutomapInfo(FLevelStats& stats, bool forcetextfont)
{ {
auto lev = currentLevel; auto lev = currentLevel;
FString mapname; FString mapname;
@ -256,7 +253,7 @@ void DStatusBarCore::PrintAutomapInfo(FLevelStats& stats, bool forcetextfont)
// //
//============================================================================ //============================================================================
short DStatusBarCore::CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading) short DBaseStatusBar::CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading)
{ {
// Determine amount in clip. // Determine amount in clip.
short clip_amount = ammo_remaining % clip_capacity; short clip_amount = ammo_remaining % clip_capacity;
@ -274,7 +271,7 @@ short DStatusBarCore::CalcMagazineAmount(short ammo_remaining, short clip_capaci
// //
//============================================================================ //============================================================================
void DStatusBarCore::Set43ClipRect() void DBaseStatusBar::Set43ClipRect()
{ {
auto GetWidth = [=]() { return twod->GetWidth(); }; auto GetWidth = [=]() { return twod->GetWidth(); };
auto GetHeight = [=]() {return twod->GetHeight(); }; auto GetHeight = [=]() {return twod->GetHeight(); };

View file

@ -512,8 +512,10 @@ void MoveStatus()
} }
class DExhumedStatusBar : public DStatusBarCore class DExhumedStatusBar : public DBaseStatusBar
{ {
DECLARE_CLASS(DExhumedStatusBar, DBaseStatusBar)
DHUDFont textfont, numberFont; DHUDFont textfont, numberFont;
public: public:
@ -938,7 +940,7 @@ private:
if (automapMode == am_full) if (automapMode == am_full)
{ {
DStatusBarCore::PrintAutomapInfo(stats, true); DBaseStatusBar::PrintAutomapInfo(stats, true);
} }
else if (hud_stats) else if (hud_stats)
{ {
@ -950,7 +952,7 @@ private:
stats.secrets = 0; stats.secrets = 0;
stats.maxsecrets = 0; stats.maxsecrets = 0;
DStatusBarCore::PrintLevelStats(stats); DBaseStatusBar::PrintLevelStats(stats);
} }
} }
@ -958,7 +960,7 @@ private:
public: public:
void Draw() void UpdateStatusBar()
{ {
if (hud_size <= Hud_full) if (hud_size <= Hud_full)
{ {
@ -968,6 +970,9 @@ public:
} }
}; };
IMPLEMENT_CLASS(DExhumedStatusBar, false, false)
void UpdateFrame() void UpdateFrame()
{ {
auto tex = tileGetTexture(nBackgroundPic); auto tex = tileGetTexture(nBackgroundPic);
@ -1000,8 +1005,7 @@ void DrawStatusBar()
{ {
UpdateFrame(); UpdateFrame();
} }
DExhumedStatusBar sbar; StatusBar->UpdateStatusBar();
sbar.Draw();
} }

View file

@ -208,8 +208,6 @@ void OffMotorcycle(player_struct *pl);
void OnBoat(player_struct *pl, int snum); void OnBoat(player_struct *pl, int snum);
void OffBoat(player_struct *pl); void OffBoat(player_struct *pl);
void drawstatusbar_d(int snum);
void drawstatusbar_r(int snum);
void cameratext(int i); void cameratext(int i);
void dobonus(int bonusonly, const CompletionFunc& completion); void dobonus(int bonusonly, const CompletionFunc& completion);
void dobonus_d(int bonusonly, const CompletionFunc& completion); void dobonus_d(int bonusonly, const CompletionFunc& completion);

View file

@ -295,8 +295,8 @@ void drawoverlays(double smoothratio)
} }
DrawBorder(); DrawBorder();
if (isRR()) drawstatusbar_r(screenpeek);
else drawstatusbar_d(screenpeek); StatusBar->UpdateStatusBar();
if (ps[myconnectindex].newowner == -1 && ud.camerasprite == -1) if (ps[myconnectindex].newowner == -1 && ud.camerasprite == -1)
{ {
@ -307,6 +307,9 @@ void drawoverlays(double smoothratio)
fi.PrintPaused(); fi.PrintPaused();
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// //

View file

@ -44,6 +44,7 @@ source as it is released.
BEGIN_DUKE_NS BEGIN_DUKE_NS
IMPLEMENT_CLASS(DDukeCommonStatusBar, true, false)
//========================================================================== //==========================================================================
// //
// very much a dummy to access the methods. // very much a dummy to access the methods.
@ -211,7 +212,7 @@ void DDukeCommonStatusBar::PrintLevelStats(int bottomy)
else stats.spacing = stats.font->GetHeight() + 1; else stats.spacing = stats.font->GetHeight() + 1;
stats.standardColor = (isNamWW2GI() && am_textfont)? CR_ORANGE : CR_UNTRANSLATED; stats.standardColor = (isNamWW2GI() && am_textfont)? CR_ORANGE : CR_UNTRANSLATED;
stats.letterColor = CR_GOLD; stats.letterColor = CR_GOLD;
DStatusBarCore::PrintAutomapInfo(stats, textfont); DBaseStatusBar::PrintAutomapInfo(stats, textfont);
} }
else if (hud_stats) else if (hud_stats)
{ {
@ -242,7 +243,7 @@ void DDukeCommonStatusBar::PrintLevelStats(int bottomy)
stats.standardColor = stats.standardColor =
stats.completeColor = CR_UNTRANSLATED; stats.completeColor = CR_UNTRANSLATED;
} }
DStatusBarCore::PrintLevelStats(stats); DBaseStatusBar::PrintLevelStats(stats);
} }
} }

View file

@ -7,8 +7,10 @@
BEGIN_DUKE_NS BEGIN_DUKE_NS
class DDukeCommonStatusBar : public DStatusBarCore class DDukeCommonStatusBar : public DBaseStatusBar
{ {
DECLARE_ABSTRACT_CLASS(DDukeCommonStatusBar, DBaseStatusBar)
protected: protected:
DHUDFont numberFont; DHUDFont numberFont;
DHUDFont indexFont; DHUDFont indexFont;

View file

@ -54,6 +54,7 @@ BEGIN_DUKE_NS
class DDukeStatusBar : public DDukeCommonStatusBar class DDukeStatusBar : public DDukeCommonStatusBar
{ {
DECLARE_CLASS(DDukeStatusBar, DDukeCommonStatusBar)
public: public:
DDukeStatusBar() DDukeStatusBar()
{ {
@ -438,21 +439,20 @@ public:
PrintLevelStats(-1); PrintLevelStats(-1);
} }
void UpdateStatusBar()
{
if (hud_size >= Hud_Mini)
{
DrawHud(screenpeek, hud_size == Hud_Nothing ? 0 : hud_size == Hud_full ? 1 : 2);
}
else
{
Statusbar(screenpeek);
}
}
}; };
IMPLEMENT_CLASS(DDukeStatusBar, false, false)
void drawstatusbar_d(int snum)
{
DDukeStatusBar dsb;
if (hud_size >= Hud_Mini)
{
dsb.DrawHud(snum, hud_size == Hud_Nothing ? 0 : hud_size == Hud_full ? 1 : 2);
}
else
{
dsb.Statusbar(snum);
}
}
END_DUKE_NS END_DUKE_NS

View file

@ -46,6 +46,7 @@ BEGIN_DUKE_NS
class DRedneckStatusBar : public DDukeCommonStatusBar class DRedneckStatusBar : public DDukeCommonStatusBar
{ {
DECLARE_CLASS(DRedneckStatusBar, DDukeCommonStatusBar)
public: public:
DRedneckStatusBar() DRedneckStatusBar()
@ -448,21 +449,22 @@ public:
} }
PrintLevelStats(-1); PrintLevelStats(-1);
} }
void UpdateStatusBar()
{
if (hud_size >= Hud_Mini)
{
DrawHud(screenpeek, hud_size == Hud_Nothing ? 0 : hud_size == Hud_full ? 1 : 2);
}
else
{
Statusbar(screenpeek);
}
}
}; };
void PrintLevelName_r(double alpha); IMPLEMENT_CLASS(DRedneckStatusBar, false, false)
void drawstatusbar_r(int snum)
{
DRedneckStatusBar dsb;
if (hud_size >= Hud_Mini)
{
dsb.DrawHud(snum, hud_size == Hud_Nothing ? 0 : hud_size == Hud_full ? 1 : 2);
}
else
{
dsb.Statusbar(snum);
}
}
END_DUKE_NS END_DUKE_NS

View file

@ -67,8 +67,10 @@ static const short icons[] = {
ID_PanelCaltrops, ID_PanelCaltrops,
}; };
class DSWStatusBar : public DStatusBarCore class DSWStatusBar : public DBaseStatusBar
{ {
DECLARE_CLASS(DSWStatusBar, DBaseStatusBar)
DHUDFont miniFont, numberFont; DHUDFont miniFont, numberFont;
enum enum
@ -967,7 +969,7 @@ private:
stats.spacing = 6; stats.spacing = 6;
} }
else stats.spacing = SmallFont->GetHeight() + 1; else stats.spacing = SmallFont->GetHeight() + 1;
DStatusBarCore::PrintAutomapInfo(stats, textfont); DBaseStatusBar::PrintAutomapInfo(stats, textfont);
} }
// JBF 20040124: display level stats in screen corner // JBF 20040124: display level stats in screen corner
else if (hud_stats && !(CommEnabled || numplayers > 1)) else if (hud_stats && !(CommEnabled || numplayers > 1))
@ -984,7 +986,7 @@ private:
stats.standardColor = CR_TAN; stats.standardColor = CR_TAN;
stats.completeColor = CR_FIRE; stats.completeColor = CR_FIRE;
DStatusBarCore::PrintLevelStats(stats); DBaseStatusBar::PrintLevelStats(stats);
} }
} }
@ -1034,6 +1036,8 @@ public:
}; };
IMPLEMENT_CLASS(DSWStatusBar, false, false)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// //
@ -1080,7 +1084,7 @@ void UpdateStatusBar()
UpdateFrame(); UpdateFrame();
} }
sbar.UpdateStatusBar(); StatusBar->UpdateStatusBar();
PLAYERp pp = &Player[screenpeek]; PLAYERp pp = &Player[screenpeek];
if (pp->cookieTime > 0) if (pp->cookieTime > 0)
{ {

View file

@ -53,3 +53,30 @@ class RazeMenuDelegate : MenuDelegateBase
native override void MenuDismissed(); native override void MenuDismissed();
} }
// dummy definitions for the status bar. We need them to create the class descriptors
class StatusBarCore native ui
{}
class BaseStatusBar : StatusBarCore native
{}
class BloodStatusBar : BaseStatusBar native
{}
class DukeCommonStatusBar : BaseStatusBar native
{}
class DukeStatusBar : DukeCommonStatusBar native
{}
class RedneckStatusBar : DukeCommonStatusBar native
{}
class ExhumedStatusBar : BaseStatusBar native
{}
class SWStatusBar : BaseStatusBar native
{}