diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 5a3df77944..32cdc57135 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1212,7 +1212,7 @@ public: { if (forceWidth < 0) dx -= (texture->GetScaledWidthDouble()/2.0)-texture->GetScaledLeftOffsetDouble(); else dx -= forceWidth*(0.5-(texture->GetScaledLeftOffsetDouble()/texture->GetScaledWidthDouble())); - //Unoptimalized formula is dx -= forceWidth/2.0-(texture->GetScaledLeftOffsetDouble()*forceWidth/texture->GetScaledWidthDouble()); + //Unoptimalized ^^formula is dx -= forceWidth/2.0-(texture->GetScaledLeftOffsetDouble()*forceWidth/texture->GetScaledWidthDouble()); if (forceHeight < 0) dy -= (texture->GetScaledHeightDouble()/2.0)-texture->GetScaledTopOffsetDouble(); else dy -= forceHeight*(0.5-(texture->GetScaledTopOffsetDouble()/texture->GetScaledHeightDouble())); diff --git a/src/v_draw.cpp b/src/v_draw.cpp index 3d896ed656..3312fca472 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -796,6 +796,23 @@ void DCanvas::VirtualToRealCoords(double &x, double &y, double &w, double &h, } } +DEFINE_ACTION_FUNCTION(_Screen, VirtualToRealCoords) +{ + PARAM_PROLOGUE; + PARAM_FLOAT(x); + PARAM_FLOAT(y); + PARAM_FLOAT(w); + PARAM_FLOAT(h); + PARAM_FLOAT(vw); + PARAM_FLOAT(vh); + PARAM_BOOL_DEF(vbottom); + PARAM_BOOL_DEF(handleaspect); + screen->VirtualToRealCoords(x, y, w, h, vw, vh, vbottom, handleaspect); + if (numret >= 1) ret[0].SetVector2(DVector2(x, y)); + if (numret >= 2) ret[1].SetVector2(DVector2(w, h)); + return MIN(numret, 2); +} + void DCanvas::VirtualToRealCoordsFixed(fixed_t &x, fixed_t &y, fixed_t &w, fixed_t &h, int vwidth, int vheight, bool vbottom, bool handleaspect) const { diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 7cce7fbc6e..ce43e35b8c 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -164,6 +164,7 @@ struct Screen native native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...); native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...); native static void DrawFrame(int x, int y, int w, int h); + native static Vector2, Vector2 VirtualToRealCoords(Vector2 pos, Vector2 size, Vector2 vsize, bool vbottom=false, bool handleaspect=true); } struct Font native diff --git a/wadsrc/static/zscript/statusbar/strife_sbar.txt b/wadsrc/static/zscript/statusbar/strife_sbar.txt index d5c21f1edd..bcbe2c85db 100644 --- a/wadsrc/static/zscript/statusbar/strife_sbar.txt +++ b/wadsrc/static/zscript/statusbar/strife_sbar.txt @@ -229,10 +229,19 @@ class StrifeStatusBar : BaseStatusBar ItemFlash = 0.75; } - private void FillBar(int x, int y, int start, int stopp, Color color1, Color color2) + private void FillBar(double x, double y, double start, double stopp, Color color1, Color color2) { - // right now there is no function to draw this. - // The old code used a crude texture hack to work arounf this omission. + Vector2 virt = Scaled? (320., 200.) : (screen.GetWidth(), screen.GetHeight()); + Vector2 pos, sizev; + + start *=2; + stopp *=2; + + [pos, sizev] = screen.VirtualToRealCoords((ST_X + x + start, ST_Y + y), (stopp - start, 1), virt, true, Scaled); + screen.Dim(color1, 1.0, pos.X + 0.5, pos.Y + 0.5, sizev.X + 0.5, sizev.Y + 0.5); + + [pos, sizev] = screen.VirtualToRealCoords((ST_X + x + start, ST_Y + y + 1), (stopp - start, 1), virt, true, Scaled); + screen.Dim(color2, 1.0, pos.X + 0.5, pos.Y + 0.5, sizev.X + 0.5, sizev.Y + 0.5); } protected void DrawHealthBar(int health, int x, int y) @@ -251,7 +260,7 @@ class StrifeStatusBar : BaseStatusBar if (health == 999) { - FillBar (x, y, 0, 200, gold1, gold2); + FillBar (x, y, 0, 100, gold1, gold2); } else { @@ -259,23 +268,23 @@ class StrifeStatusBar : BaseStatusBar { if (health <= 10) { - FillBar (x, y, 0, health*2, red1, red2); + FillBar (x, y, 0, health, red1, red2); } else if (health <= 20) { - FillBar (x, y, 0, health*2, gold1, gold2); + FillBar (x, y, 0, health, gold1, gold2); } else { FillBar (x, y, 0, health, green1, green2); } - FillBar (x, y, health, 200, 0, 0); + //FillBar (x, y, health, 100, 0, 0); } else { - int stopp = 100 - (health - 100); - FillBar (x, y, 0, stopp*2, green1, green2); - FillBar (x, y, stopp*2, 200, blue1, blue2); + int stopp = 200 - health; + FillBar (x, y, 0, stopp, green1, green2); + FillBar (x, y, stopp, 100, blue1, blue2); } } }