ZScript: Status Bar Questions

Ask about ACS, DECORATE, ZScript, or any other scripting questions here!

Moderator: GZDoom Developers

Forum rules
Before asking on how to use a ZDoom feature, read the ZDoom wiki first. If you still don't understand how to use a feature, then ask here.

Please bear in mind that the people helping you do not automatically know how much you know. You may be asked to upload your project file to look at. Don't be afraid to ask questions about what things mean, but also please be patient with the people trying to help you. (And helpers, please be patient with the person you're trying to help!)
User avatar
Major Cooke
Posts: 8193
Joined: Sun Jan 28, 2007 3:55 pm
Preferred Pronouns: He/Him
Location: QZDoom Maintenance Team

Re: ZScript: Status Bar Questions

Post by Major Cooke »

Actually I meant "only the menus will draw at capped framerates". :P

And naturally it is harmless. Especially since we have to pick apart the stuff ourselves...
User avatar
Graf Zahl
Lead GZDoom+Raze Developer
Lead GZDoom+Raze Developer
Posts: 49130
Joined: Sat Jul 19, 2003 10:19 am
Location: Germany

Re: ZScript: Status Bar Questions

Post by Graf Zahl »

Sometimes reading the already existing source may give good clues:

Code: Select all

	override void Draw (int state, double TicFrac)
See the TicFrac? ;)
User avatar
Graf Zahl
Lead GZDoom+Raze Developer
Lead GZDoom+Raze Developer
Posts: 49130
Joined: Sat Jul 19, 2003 10:19 am
Location: Germany

Re: ZScript: Status Bar Questions

Post by Graf Zahl »

ZZYZX wrote:How do I point the statusbar to a ZScript class?
Will it completely replace all statusbars or like SBARINFO did it (separate for fullscreen, separate for regular, and althud disables any custom statusbars)?
How do I make something draw over statusbar hudmessage-style that'd work with any statusbar even the internal ones? I made RenderOverlay for that, but then Graf said it's going to be in the statusbar.
1) MAPINFO's gameinfo section - check the repo.
2) A status bar is one object that contains all logic for drawing both the HUD and the status bar. This cannot be changed because otherwise all existing code would break. There's simply too much SBARINFO stuff out there that requires this handling.
3) Once the status bars are fully implemented, this will be addressed. The reason I disabled it is that it was done in the completely wrong spot - outside the HUD code. This needs to be done in DBaseStatusBar::DrawTopStuff - the function where HUD messages are being processed - and pass on some information about the current HUD. But since I haven't even touched that part of the code yet, it's still on hold.
User avatar
Xaser
 
 
Posts: 10773
Joined: Sun Jul 20, 2003 12:15 pm

Re: ZScript: Status Bar Questions

Post by Xaser »

Well, this is progressing much quicker than expected. :D

A quick question: Are there any consequences to calling SetSize after the statusbar class has been initialized? I'm basically looking to call it in DrawMainBar/DrawFullScreenStuff to make the statbar and fullscreen HUD have different sizes.

[EDIT] Well, I'm now noticing that those two functions are just things in doom_sbar to simplify Draw() in doom_sbar.txt, so what I'm really asking is "can I safely call SetSize() in Draw()?" :P

[also hey, a 'protected' keyword! :]
User avatar
Graf Zahl
Lead GZDoom+Raze Developer
Lead GZDoom+Raze Developer
Posts: 49130
Joined: Sat Jul 19, 2003 10:19 am
Location: Germany

Re: ZScript: Status Bar Questions

Post by Graf Zahl »

Yes, you can. All you have to look out for is that the setting when returning is ok, because the status bar's height is used in far too many places in the code to deteming the view window size.
This really needs to be done differently, it's an open invitation for problems, but so far I do not have any good idea, because of SBARINFO considerations.

This code still needs a bit of cleanup from almost 20 years of non-maintenance.
User avatar
Nash
 
 
Posts: 17454
Joined: Mon Oct 27, 2003 12:07 am
Location: Kuala Lumpur, Malaysia

Re: ZScript: Status Bar Questions

Post by Nash »

Image

First!!! :mrgreen: Compass written in ZScript as a custom status bar.

Just gotta wait for the clipping rectangle and I can dump my ACS for good. >8D
User avatar
Graf Zahl
Lead GZDoom+Raze Developer
Lead GZDoom+Raze Developer
Posts: 49130
Joined: Sat Jul 19, 2003 10:19 am
Location: Germany

Re: ZScript: Status Bar Questions

Post by Graf Zahl »

I'm not even done with the status bar and some people still use it... Be careful that stuff doesn't break, right now I do not care about breaking changes and if something isn't good it gets changed.

The clipping rectangle will be the last thing I do, I only need it for the Hexen status bar which still waits for being converted.
User avatar
Nash
 
 
Posts: 17454
Joined: Mon Oct 27, 2003 12:07 am
Location: Kuala Lumpur, Malaysia

Re: ZScript: Status Bar Questions

Post by Nash »

Hehe, I know. I even said in the last page that I'm expecting this stuff to break. I was just toying around with it to get a feel for writing status bar classes. It's just a tiny class anyway, nothing I won't mind to throw away.
User avatar
Major Cooke
Posts: 8193
Joined: Sun Jan 28, 2007 3:55 pm
Preferred Pronouns: He/Him
Location: QZDoom Maintenance Team

Re: ZScript: Status Bar Questions

Post by Major Cooke »

Graf Zahl wrote:I'm not even done with the status bar and some people still use it... Be careful that stuff doesn't break, right now I do not care about breaking changes and if something isn't good it gets changed.
If it's of any comfort, I'm holding off until it's actually done this time. I learned my lesson previously. :P
(Plus I need to work on documenting menus...)
User avatar
ZZYZX
 
 
Posts: 1384
Joined: Sun Oct 14, 2012 1:43 am
Location: Ukraine

Re: ZScript: Status Bar Questions

Post by ZZYZX »

Nash wrote:Image

First!!! :mrgreen: Compass written in ZScript as a custom status bar.

Just gotta wait for the clipping rectangle and I can dump my ACS for good. >8D
DTA_Clip...something.
Use this viewtopic.php?p=986562#p986562
It does clipping automatically.
User avatar
Nash
 
 
Posts: 17454
Joined: Mon Oct 27, 2003 12:07 am
Location: Kuala Lumpur, Malaysia

Re: ZScript: Status Bar Questions

Post by Nash »

ZZYZX: I'm aware of the clipping DTA tag, but I wasn't sure if Screen.DrawTexture can be used inside status bars. Right now I'm just using BaseStatusbar.DrawImage, like what gzdoom.pk3 is doing.

Will give your library a try later, I kinda don't understand how to use it yet...
User avatar
ZZYZX
 
 
Posts: 1384
Joined: Sun Oct 14, 2012 1:43 am
Location: Ukraine

Re: ZScript: Status Bar Questions

Post by ZZYZX »

It should work.
Also, basically:

Code: Select all

class SpecialSbar : Element
{
  override void OnCreate()
  {
    mRect = Rect.FromXYWH(0, 0, Screen.GetWidth(), Screen.GetHeight()); // these are coordinates in parent element's coordinates. for root element = screen coordinates
    mScale = 1; // this is a float, change if you need to scale to some resolution, e.g. if you want to have virtual 1024x768, do mScale = double(Screen.GetHeight())/768.0;

    // you can add other init stuff here
  }

  override void Draw()
  {
    Drawer d = GetDrawer();
    // use Drawer methods here
  }
}
In your status bar, call

Code: Select all

SpecialSbar sbd = new('SpecialSbar').Init();
Then store sbd somewhere and call sbd.OnDraw() from statusbar's draw function.

Then if you need statusbar data inside that object, just set some field to your sbar or wherever Graf stores the relevant info.
Note: there is no VirtualWidth/VirtualHeight directly because you generally don't want squished graphics. So mScale defines the scaling and VirtualWidth/VirtualHeight are readonly (using Element.GetClientRect).

Note that this kinda replaces half of the existing weird resolution/scaling heuristics in the statusbar. I won't be surprised if Graf suddenly appears and says that this won't work under some weird conditions.
Blue Shadow
Posts: 5016
Joined: Sun Nov 14, 2010 12:59 am

Re: ZScript: Status Bar Questions

Post by Blue Shadow »

Is modifying existing status bars currently possible? I have this code which is based on DoomStatusBar, but GZDoom (2.5pre-178-ge865ba6) aborts with this error:

Code: Select all

Can't call play function DrawFullScreenStuffCustom from ui context

Code: Select all

class CustomDoomStatusBar : DoomStatusBar
{
    override void Draw (int state, double TicFrac)
    {
        BaseStatusBar.Draw (state, TicFrac);
        //Super.Draw (state, TicFrac);

        if (state == HUD_StatusBar)
        {
            BeginStatusBar(320, 200, 32);
            DrawMainBar (TicFrac);
        }
        else if (state == HUD_Fullscreen)
        {
            BeginHUD(320, 200, 1., false);
            DrawFullScreenStuffCustom ();
        }
    }

    protected void DrawFullScreenStuffCustom ()
    {
        Vector2 iconbox = (40, 20);
        // Draw health
        let berserk = CPlayer.mo.FindInventory("PowerStrength");
        DrawImage(berserk? "PSTRA0" : "MEDIA0", (20, -2));
        DrawString(mHUDFont, FormatNumber(CPlayer.health, 3), (44, -20));

        let armor = CPlayer.mo.FindInventory("BasicArmor");
        if (armor != null)
        {
            DrawInventoryIcon(armor, (20, -22));
            DrawString(mHUDFont, FormatNumber(armor.Amount, 3), (44, -40));
        }
        Inventory ammotype1, ammotype2;
        [ammotype1, ammotype2] = GetCurrentAmmo();
        int invY = -20;
        if (ammotype1 != null)
        {
            DrawInventoryIcon(ammotype1, (-14, -4));
            DrawString(mHUDFont, FormatNumber(ammotype1.Amount, 3), (-30, -20), DI_TEXT_ALIGN_RIGHT);
            invY -= 20;
        }
        if (ammotype2 != null && ammotype2 != ammotype1)
        {
            DrawInventoryIcon(ammotype2, (-14, invY + 17));
            DrawString(mHUDFont, FormatNumber(ammotype2.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT);
            invY -= 20;
        }
        if (CPlayer.inventorytics == 0 && CPlayer.mo.InvSel != null && !level.NoInventoryBar)
        {
            DrawInventoryIcon(CPlayer.mo.InvSel, (-14, invY + 17));
            DrawString(mHUDFont, FormatNumber(CPlayer.mo.InvSel.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT);
        }
        if (deathmatch)
        {
            DrawString(mHUDFont, FormatNumber(CPlayer.FragCount, 3), (-3, 1), DI_TEXT_ALIGN_RIGHT, Font.CR_GOLD);
        }

        // Draw the keys. This does not use a special draw function like SBARINFO because the specifics will be different for each mod
        // so it's easier to copy or reimplement the following piece of code instead of trying to write a complicated all-encompassing solution.
        Vector2 keypos = (-10, 2);
        int rowc = 0;
        double roww = 0;
        for(let i = CPlayer.mo.Inv; i != null; i = i.Inv)
        {
            if (i is "Key" && i.Icon.IsValid())
            {
                DrawTexture(i.Icon, keypos, DI_SCREEN_RIGHT_TOP|DI_ITEM_LEFT_TOP);
                Vector2 size = TexMan.GetScaledSize(i.Icon);
                keypos.Y += size.Y + 2;
                roww = max(roww, size.X);
                if (++rowc == 3)
                {
                    keypos.Y = 2;
                    keypos.X -= roww + 2;
                    roww = 0;
                    rowc = 0;
                }
            }
        }
        if (CPlayer.inventorytics != 0 && !level.NoInventoryBar)
        {
            DrawInventoryBar(diparms, (0, 0), 7, DI_SCREEN_CENTER_BOTTOM, HX_SHADOW);
        }
    }
}
All I did was inherit from DoomStatusBar class, overriding Draw() so I can call DrawFullScreenStuffCustom(), whose definition is exactly the same as DoomStatusBar's DrawFullScreenStuff().
sbar_testing.pk3
User avatar
ZZYZX
 
 
Posts: 1384
Joined: Sun Oct 14, 2012 1:43 am
Location: Ukraine

Re: ZScript: Status Bar Questions

Post by ZZYZX »

...ok, that's extremely weird. Are statusbars not ui? Why? I see BaseStatusBar is declared as ui but it doesn't work apparently.

Anyway, this particular issue can be fixed by explicitly marking your draw function as ui (e.g. protected ui void DrawFullScreenStuffCustom).
Blue Shadow
Posts: 5016
Joined: Sun Nov 14, 2010 12:59 am

Re: ZScript: Status Bar Questions

Post by Blue Shadow »

ZZYZX wrote:Anyway, this particular issue can be fixed by explicitly marking your draw function as ui (e.g. protected ui void DrawFullScreenStuffCustom).
With that done, I get this:

Code: Select all

Script error, "sbar_testing.pk3:zscript.txt" line 20:
Unexpected identifier
Expecting ';' or ','

Return to “Scripting”