woof icon indicating copy to clipboard operation
woof copied to clipboard

There is no toggle-able option for "Vertical Level Stats & Player Co-ords Widgets"

Open PorpiangWriter opened this issue 1 year ago • 28 comments

Even Woof 15.2.0 offers the Vertical Level Stats & Player Co-ords Widgets option, but I can't toggle it either on the game itself or the CFG file.

PorpiangWriter avatar Feb 04 '25 09:02 PorpiangWriter

It's toggleable in SBRADEF, see woof.pk3/sbardef.lmp: "vertical": true

rfomin avatar Feb 04 '25 09:02 rfomin

Same is true for centered messages (i.e. they can be modified by SBARDEF), and nevertheless we added a switch to the menu for them. Maybe another such exception could be added here as well?

fabiangreffrath avatar Feb 04 '25 10:02 fabiangreffrath

Well, I'm going to check out the pk3 files, however, I think this Vertical Level Stats & Player Co-ords Widgets option should be easier to access.

PorpiangWriter avatar Feb 04 '25 10:02 PorpiangWriter

I second PorpiangWriter motion. Stats look great vertically in Automap but I can't handle them horizontally on HUD so I turned them off there. Hopefully a convenient menu toggle is not too far away :)

Btw while drifting through the SBARDEF forest I noticed one in .\all-all & .\id1-wad folders differ on line 1239. Intentional? LoR-specific weapon carousel related perhaps?


I'm thinking about modifying HUD stats coordinates for myself to match Automap ones, before menu toggle or editor come about. To that end if you could indulge me, a couple of quick questions to get me started.

Where's the origin of the X/Y coordinates (they go up to 320/200 right)? Do all 3 stats share the same widget coordinate or each one has its own?

That should be enough to find my way around, thank you!

NiIex avatar Feb 12 '25 09:02 NiIex

Btw while drifting through the SBARDEF forest I noticed one in .\all-all & .\id1-wad folders differ on line 1239. Intentional? LoR-specific weapon carousel related perhaps?

This is intentional. id1.wad has a different sprite for cells.

Where's the origin of the X/Y coordinates (they go up to 320/200 right)?

It's the upper left corner of a 4:3 screen, so from (0, 0) to (320, 200). If you want widgets to move to the left in widescreen mode, you need to enable the wide alignment flag ("alignment": 16).

Do all 3 stats share the same widget coordinate or each one has its own?

They share widget coordinate.

rfomin avatar Feb 12 '25 10:02 rfomin

Managed to do it but it'll look like butcher job to you pros :)

Had to delete sbardef.lmp from pk3 (all 3, not sure if less is sufficient) for my changes to apply. Seems Woof overrides the .lmp loaded with -file parameter with default ones in pk3. That was what stopped me yesterday, after I figured that out it was pretty easy since it's all about the coordinates and I grew up on 320x200. Thanks for your help!

NiIex avatar Feb 13 '25 10:02 NiIex

Small guide how I did it, for future Internet travelers. It matches Stats widget position & orientation with one in Automap. (works only for wide-screen ratios "alignment": 16)

  1. Extract "sbardef.lmp" from "woof.pk3" that comes with Woof! (7-Zip or similar will do) Take one from all-all folder for regular Doom WADs, or id1 for Legacy of Rust.
  2. Open it with any text editor that shows lines (Notepad++ for example)

Stats "widget" appears 4 times, once for every HUD (Classic with Status Bar, Crispy, LoR, and no HUD) and you'll want to change all 4 places. Or simply ignore 3 other HUDs you never use, your call. Btw there is another widget entry exclusive to Automap - you may adjust that one too if you really want to. Each HUD's widget section starts at specific line of the document. Simply adjust its "y" and add "vertical". Note that adding lines will shift everything down slightly.

Status Bar and Crispy HUD - lines 843 and 2727 ("y" was 160) LoR HUD - line 1684 ("y" was 155) No HUD - line 3017 ("y" was 192)

"widget" ("type": 0 & "alignment": 16)
  "y": 8,
  "vertical": true, (add bellow "Digits")
  1. Save changes and load "sbardef.lmp" with -file parametar as you would a normal PWAD.

Note that changes won't work if any WAD you load is named either all-all, extras, or id1. That's because Woof has a built-in lumps for such names and will prioritize them from its default woof.pk3 over -file. It normally applies only to Legacy of Rust which is named id1. Simplest workaround is to rename id1 to something else, or you may use the autoload trick described bellow.

Method is sadly locked to v15.2.0 as I presume future Woof updates will eventually scramble sbardef content, in particular "widget" positions in the document. Every time you update Woof you'll have to repeat the process but with different line positions. Or at least until Woof gets user-friendly UI support. Just remember to delete your trusty sbardef and its -file parametar when latter happens.

NiIex avatar Feb 13 '25 10:02 NiIex

Had to delete sbardef.lmp from pk3 (all 3, not sure if less is sufficient) for my changes to apply. Seems Woof overrides the .lmp loaded with -file parameter with default ones in pk3.

I can't reproduce it, woof -file sbardef.lmp should overwrite sbardef.lmp in woof.pk3. You could also put it in the autoload folder.

rfomin avatar Feb 13 '25 11:02 rfomin

Hmm, that's odd. Though maybe it was because of my -noautoload parametar so I removed it but it's still the same. Default woof.pk3 overrides -file sbardef.lmp.

After further testing and removing more -file parameters one by one... it turns out to be a pretty bizarre reason. When I removed Legacy of Rust "id1.wad" then sbardef lump finally started to override default woof pk3.

My full parametar order is -noautoload -save ..\rerelease\Saves -shotdir ..\rerelease\Screenshots -iwad ..\rerelease\DOOM2.WAD -file ..\Patches\D2SPFX20.WAD ..\rerelease\id1.wad ..\rerelease\sbardef.lmp ..\Patches\doom_wide.wad -config ..\rerelease\legacy.ini

Tried replacing id1.wad with "Doom the way id did" wad (only one I have on hand currently) just to see if maybe any PWAD (even though it's not Doom2) causes it but nope, only id1 messes up lump/pk3 override it seems. What do you make of that one? :)

NiIex avatar Feb 13 '25 11:02 NiIex

id1.wad has it's own SBARDEF lump. To overwrite it, put your sbardef.lmp in autoload\id1.wad folder.

rfomin avatar Feb 13 '25 11:02 rfomin

Suspected as much. Same thing happens if any wad with all-all/extras/id1 name is loaded. Thanks for getting to the bottom of that little detail. I'll update the guide above.

I don't like using autoload feature so I just renamed id1 to legacy :)

NiIex avatar Feb 13 '25 13:02 NiIex

So, I just tried to give it a shot, but oh well!

diff --git a/src/mn_setup.c b/src/mn_setup.c
index b6636cd5..de0fe729 100644
--- a/src/mn_setup.c
+++ b/src/mn_setup.c
@@ -325,6 +325,7 @@ enum
     str_center_weapon,
     str_screensize,
     str_stlayout,
+    str_stralign,
     str_show_widgets,
     str_show_adv_widgets,
     str_stats_format,
@@ -1830,6 +1831,10 @@ static const char *st_layout_strings[] = {
     "Original", "Wide"
 };
 
+static const char *st_align_strings[] = {
+    "Default", "Never", "Always"
+};
+
 #define H_X_THRM8 (M_X_THRM8 - 14)
 #define H_X       (M_X - 14)
 
@@ -1843,6 +1848,9 @@ static setup_menu_t stat_settings1[] = {
     {"Layout", S_CHOICE, H_X, M_SPC, {"st_layout"},
      .strings_id = str_stlayout},
 
+    {"Vertical Stats/Coords", S_CHOICE, H_X, M_SPC, {"st_align"},
+     .strings_id = str_stralign},
+
     MI_GAP,
 
     {"Status Bar", S_SKIP | S_TITLE, H_X, M_SPC},
@@ -4796,6 +4804,7 @@ static const char **selectstrings[] = {
     center_weapon_strings,
     NULL, // str_screensize
     st_layout_strings,
+    st_align_strings,
     show_widgets_strings,
     show_adv_widgets_strings,
     stats_format_strings,
diff --git a/src/st_sbardef.c b/src/st_sbardef.c
index 30cbe368..53299389 100644
--- a/src/st_sbardef.c
+++ b/src/st_sbardef.c
@@ -222,6 +222,7 @@ static boolean ParseSbarElemType(json_t *json, sbarelementtype_t type,
                             json_t *vertical = JS_GetObject(json, "vertical");
                             if (JS_IsBoolean(vertical))
                             {
+                                widget->default_vertical =
                                 widget->vertical = JS_GetBoolean(vertical);
                             }
                         }
diff --git a/src/st_sbardef.h b/src/st_sbardef.h
index 54f4500d..7240b96e 100644
--- a/src/st_sbardef.h
+++ b/src/st_sbardef.h
@@ -205,6 +205,7 @@ typedef struct sbe_widget_s
     int duration;
     int duration_left;
 
+    boolean default_vertical;
     boolean vertical;
 } sbe_widget_t;
 
diff --git a/src/st_stuff.c b/src/st_stuff.c
index c087b592..0d05baa2 100644
--- a/src/st_stuff.c
+++ b/src/st_stuff.c
@@ -1905,6 +1905,8 @@ void ST_BindSTSVariables(void)
 {
   M_BindNum("st_layout", &st_layout, NULL,  st_wide, st_original, st_wide,
              ss_stat, wad_no, "HUD layout");
+  M_BindNum("st_align", &st_align, NULL, st_align_default, st_align_default,
+             st_align_always, ss_stat, wad_no, "Vertical Stats/Coords");
   M_BindBool("sts_colored_numbers", &sts_colored_numbers, NULL,
              false, ss_stat, wad_yes, "Colored numbers on the status bar");
   M_BindBool("sts_pct_always_gray", &sts_pct_always_gray, NULL,
diff --git a/src/st_stuff.h b/src/st_stuff.h
index 5a935db9..32fb94c1 100644
--- a/src/st_stuff.h
+++ b/src/st_stuff.h
@@ -78,6 +78,15 @@ const char **ST_StatusbarList(void);
 
 void ST_BindSTSVariables(void);
 
+typedef enum
+{
+    st_align_default,
+    st_align_never,
+    st_align_always
+} st_align_t;
+
+extern st_align_t st_align;
+
 #endif
 
 //----------------------------------------------------------------------------
diff --git a/src/st_widgets.c b/src/st_widgets.c
index d5619cbb..4ff92ebd 100644
--- a/src/st_widgets.c
+++ b/src/st_widgets.c
@@ -702,6 +702,24 @@ static void ForceDoomFont(sbe_widget_t *widget)
     }
 }
 
+st_align_t st_align;
+
+static void ForceVertical(sbe_widget_t *widget)
+{
+    if (st_align == st_align_default)
+    {
+        widget->vertical = widget->default_vertical;
+    }
+    else if (st_align == st_align_always)
+    {
+        widget->vertical = true;
+    }
+    else
+    {
+        widget->vertical = false;
+    }
+}
+
 static void UpdateCoord(sbe_widget_t *widget, player_t *player)
 {
     ST_ClearLines(widget);
@@ -723,6 +741,7 @@ static void UpdateCoord(sbe_widget_t *widget, player_t *player)
     }
 
     ForceDoomFont(widget);
+    ForceVertical(widget);
 
     fixed_t x, y, z; // killough 10/98:
     void AM_Coordinates(const mobj_t *, fixed_t *, fixed_t *, fixed_t *);
@@ -816,6 +835,7 @@ static void UpdateMonSec(sbe_widget_t *widget)
     }
 
     ForceDoomFont(widget);
+    ForceVertical(widget);
 
     const int cr_blue = (widget->font == stcfnt) ? CR_BLUE2 : CR_BLUE1;
 
diff --git a/src/st_widgets.h b/src/st_widgets.h
index 7c47750e..b978e5e2 100644
--- a/src/st_widgets.h
+++ b/src/st_widgets.h
@@ -83,4 +83,4 @@ void ST_ResetMessageColors(void);
 
 void ST_BindHUDVariables(void);
 
-#endif
\ No newline at end of file
+#endif

Image

So, I have mistaken it the other way round. STBARDEF tells the engine if a widget has vertical alignment and which coordinates to use, it's not the engine that chooses vertical alignment for a widget. 😞

fabiangreffrath avatar Feb 13 '25 14:02 fabiangreffrath

So, I have mistaken it the other way round. STBARDEF tells the engine if a widget has vertical alignment and which coordinates to use, it's not the engine that chooses vertical alignment for a widget. 😞

We can add another condition and set coordinates for vertical widgets in various automap modes in SBARDEF. But I think this option is not worth it. At this point, editing without an editor is cumbersome even for me.

rfomin avatar Feb 13 '25 14:02 rfomin

Okay, sorry for disappearing for so long, but I decided to do what Nillex said, and the first attempt ended up like this:

Image

And to make matters worse, I attempted to edit the *.pk3 with the same code Nillex gave me, and the port ended up crashing over and over again.

PorpiangWriter avatar May 15 '25 01:05 PorpiangWriter

And to make matters worse, I attempted to edit the *.pk3 with the same code Nillex gave me, and the port ended up crashing over and over again.

Does it crash or exit with an error message? Could you post the modified SBARDEF lump here (or the PK3 file if that's easier for you)?

fabiangreffrath avatar May 15 '25 06:05 fabiangreffrath

Does it crash or exit with an error message? Could you post the modified SBARDEF lump here (or the PK3 file if that's easier for you)?

It just abruptly crashed when I launched every WAD I have.

I'll send you the code of sbardef lump I modified:

custom sbardef.txt

PorpiangWriter avatar May 15 '25 07:05 PorpiangWriter

It's an error message: "SBARDEF(843:23): read error: unexpected character, expected a valid JSON value"

"widget": ("type": 0 & "alignment": 16)

(, & are illegal characters in JSON.

I recommend waiting for the editor. There is one in the works: https://github.com/electricbrass/id24-editor

rfomin avatar May 15 '25 07:05 rfomin

Gosh!

fabiangreffrath avatar May 15 '25 07:05 fabiangreffrath

It's an error message: "SBARDEF(843:23): read error: unexpected character, expected a valid JSON value"

"widget": ("type": 0 & "alignment": 16) (, & are illegal characters in JSON.

I recommend waiting for the editor. There is one in the works: https://github.com/electricbrass/id24-editor

Image

Okay, this attempt works; however, another problem is, I don't know which line for the timer and the co-cords widgets.

PorpiangWriter avatar May 15 '25 08:05 PorpiangWriter

I accidentally closed the topic as completed, as I still can't solve the issue yet, so that's why I'll reopen this issue again.

Image

I've been messing around with woof.pk3 for a while. I'm still confused about the lines of each widget are in every variant (Map Status, Co-ords, Timer).

PorpiangWriter avatar May 15 '25 09:05 PorpiangWriter

It's an error message: "SBARDEF(843:23): read error: unexpected character, expected a valid JSON value"

This should probably be an I_Error().

fabiangreffrath avatar May 15 '25 20:05 fabiangreffrath

Does it crash or exit with an error message? Could you post the modified SBARDEF lump here (or the PK3 file if that's easier for you)?

It just abruptly crashed when I launched every WAD I have.

I'll send you the code of sbardef lump I modified:

custom sbardef.txt

Hey welcome back Porpi It's been a while I since I dealt with this but despite expecting the worst on account I forgot nearly everything I took a look at your custom file and compared it to my own. Luckily the problem is rather trivial and so is the solution:

"widget"# ("type": 0 & "alignment": 16)#
  "y": 8,
  "vertical": true,# (add bellow "Digits")#

Just delete everything between ## above, in 4 places they appear. That's it lol. Brackets are just added info, not part of the code :) I've attached my own file so you can use that with said stuff removed. The rest you edited pretty well on your own, kudos to you.

Thing to keep in mind is that when playing Legacy of Rust you'll want to edit "sbardef.lmp" in "id1" folder, inside the pk3, and use that one (in-game only one ammo graphic is different, while the difference is on line 1240). The attached one is for vanilla Doom and non-LoR WADs. Don't forget to rename the extension to .lmp.

sbardef.txt

NiIex avatar May 16 '25 02:05 NiIex

Hey welcome back Porpi It's been a while I since I dealt with this but despite expecting the worst on account I forgot nearly everything I took a look at your custom file and compared it to my own. Luckily the problem is rather trivial and so is the solution:

"widget"# ("type": 0 & "alignment": 16)#
  "y": 8,
  "vertical": true,# (add bellow "Digits")#

Just delete everything between ## above, in 4 places they appear. That's it lol. Brackets are just added info, not part of the code :) I've attached my own file so you can use that with said stuff removed. The rest you edited pretty well on your own, kudos to you.

Thing to keep in mind is that when playing Legacy of Rust you'll want to edit "sbardef.lmp" in "id1" folder, inside the pk3, and use that one (in-game only one ammo graphic is different, while the difference is on line 1240). The attached one is for vanilla Doom and non-LoR WADs. Don't forget to rename the extension to .lmp.

sbardef.txt

Hello @NiIex , I tried it, and here's the result.

Image

However, I need to understand the line where it shows the following types of widgets:

  • Status Bar Level Stats (Normal Mode)
  • Status Bar Level Stats (Automap Mode)
  • Status Bar Player Co-ords (Normal Mode)
  • Status Bar Player Co-ords (Automap Mode)
  • Status Bar Level Timer (Normal Mode)
  • Status Bar Level Timer (Automap Mode)
  • Legacy of Rust HUD Level Stats (Normal Mode)
  • Legacy of Rust HUD Level Stats (Automap Mode)
  • Legacy of Rust HUD Player Co-ords (Normal Mode)
  • Legacy of Rust HUD Player Co-ords (Automap Mode)
  • Legacy of Rust HUD Level Timer (Normal Mode)
  • Legacy of Rust HUD Level Timer (Automap Mode)
  • Crispy HUD Level Stats (Normal Mode)
  • Crispy HUD Level Stats (Automap Mode)
  • Crispy HUD Player Co-ords (Normal Mode)
  • Crispy HUD Player Co-ords (Automap Mode)
  • Crispy HUD Level Timer (Normal Mode)
  • Crispy HUD Level Timer (Automap Mode)
  • No HUD Level Stats (Normal Mode)
  • No HUD Level Stats (Automap Mode)
  • No HUD Player Co-ords (Normal Mode)
  • No HUD Player Co-ords (Automap Mode)
  • No HUD Level Timer (Normal Mode)
  • No HUD Level Timer (Automap Mode)

So overall, I want to know 24 lines of these widgets.

(I haven't even compared to nugget-doom.pk3 files yet.)

I'm still confused about this, so can you tell me about all of this?

PorpiangWriter avatar May 16 '25 06:05 PorpiangWriter

Oh you want to go real deep. I don't know where any of those are but there's a way to find out yourself using good old trial and error. Widgets are anchored either on the top left or top right (if alignment is right), that is its pixel coordinate on a 320x200 grid. Use your mark one eyeball to approximate which pixel it is, then search for closest or exact match inside sbardef. Change the coordinate of saif pixel and see which widget moved on the screen. Rinse and repeat for every widget you want to move (times 4 for every HUD).

Afaik only one other person was crazy enough to do actually delve into such depths (and more) - NightFright. If anyone has info you're looking for it has to be him. I only wanted stats widget in vertical mode so I'm all set for life.

NiIex avatar May 16 '25 14:05 NiIex

Oh you want to go real deep. I don't know where any of those are but there's a way to find out yourself using good old trial and error. Widgets are anchored either on the top left or top right (if alignment is right), that is its pixel coordinate on a 320x200 grid. Use your mark one eyeball to approximate which pixel it is, then search for closest or exact match inside sbardef. Change the coordinate of saif pixel and see which widget moved on the screen. Rinse and repeat for every widget you want to move (times 4 for every HUD).

Afaik only one other person was crazy enough to do actually delve into such depths (and more) - NightFright. If anyone has info you're looking for it has to be him. I only wanted stats widget in vertical mode so I'm all set for life.

Thank you, anyway, I've tried NightFright's SBARDEF HUD mod for both Woof and Nugget Doom already, and I like it.

PorpiangWriter avatar May 16 '25 18:05 PorpiangWriter

Okay, after I was messing around with woof.pk3 and nugget-doom.pk3, here is what I know about where the following lines are:

For Woof!

Status Bar Normal Level Stats - line 843 (x: 2 y: 160) Status Bar Normal Timer - line 863 (x: 2, y: 152) Status Bar Normal Co-ords - line 952 (x: 318, y: 8) Status Bar Automap Level Stats - line 911 (x: 2, y: 8 + vertical: true) Status Bar Automap Timer - line 932 (x: 2, y: 40) Status Bar Automap Co-ords - line 972 (x: 256, y: 8 + vertical: true) Legacy of Rust HUD Normal Level Stats - line 1684 (x: 2, y: 155) Legacy of Rust HUD Normal Timer - line 1704 (x: 2, y: 147) Legacy of Rust HUD Normal Co-ords - line 1793 (x: 318, y: 8) Legacy of Rust HUD Automap Level Stats - line 1752 (x: 2, y: 8 + vertical: true) Legacy of Rust HUD Automap Timer - line 1773 (x: 2, y: 40) Legacy of Rust HUD Automap Co-ords - line 1813 (x: 256, y: 8 + vertical: true) Crispy HUD Normal Level Stats - line 2727 (x: 2 y: 160) Crispy HUD Normal Timer - line 2747 (x: 2, y: 152) Crispy HUD Normal Co-ords - line 2836 (x: 318, y: 8) Crispy HUD Automap Level Stats 2795 (x: 2, y: 8 + vertical: true) Crispy HUD Automap Timer - line 2816 (x: 2, y: 40) Crispy HUD Automap Co-ords - line 2856 (x: 256, y: 8 + vertical: true) No HUD Normal Level Stats - line 3017 (x: 2, y: 192) No HUD Normal Timer - line 3037 (x:2, y: 184) No HUD Normal Co-ords - line 3126 (x: 318, y: 8) No HUD Automap Level Stats - line 3085 (x: 2, y: 8 + vertical: true) No HUD Automap Timer - line 3106 (x: 2, y: 40) No HUD Automap Co-ords - line 3146 (x: 256, y: 8 + vertical: true)

For Nugget Doom

Status Bar Normal Level Stats - line 844 (x: 2 y: 160) Status Bar Normal Timer - line 864 (x: 2, y: 152) Status Bar Normal Co-ords - line 967 (x: 318, y: 16) Status Bar Automap Level Stats - line 912 (x: 2 y: 8 + vertical: true) Status Bar Automap Timer - line 933 (x: 2, y: 40) Status Bar Automap Co-ords - line 987 (x: 256, y: 16 + vertical: true) Legacy of Rust HUD Normal Level Stats - line 1711 (x: 2, y: 155) Legacy of Rust HUD Normal Timer - line 1731 (x: 2, y: 147) Legacy of Rust HUD Normal Co-ords - line 1834 (x: 318, y: 16) Legacy of Rust HUD Automap Level Stats - line 1779 (x: 2, y: 8 + vertical: true) Legacy of Rust HUD Automap Timer - line 1800 (x: 2, y: 40) Legacy of Rust HUD Automap Co-ords - line 1854 (x: 256, y: 16 + vertical: true) Crispy HUD Normal Level Stats - line 2780 (x: 2 y: 160) Crispy HUD Normal Timer - line 2800 (x: 2, y: 152) Crispy HUD Normal Co-ords - line 2903 (x: 318, y: 16) Crispy HUD Automap Level Stats 2848 (x: 2, y: 8 + vertical: true) Crispy HUD Automap Timer - line 2869 (x: 2, y: 40) Crispy HUD Automap Co-ords - line 2923 (x: 256, y: 16 + vertical: true) No HUD Normal Level Stats - line 3096 (x: 2, y: 192) No HUD Normal Timer - line 3116 (x:2, y: 184) No HUD Normal Co-ords - line 3219 (x: 318, y: 16) No HUD Automap Level Stats - line 3164 (x: 2, y: 8 + vertical: true) No HUD Automap Timer - line 3185 (x: 2, y: 40) No HUD Automap Co-ords - line 3239 (x: 256, y: 16 + vertical: true)

You can correct me if I'm wrong.

PorpiangWriter avatar May 18 '25 17:05 PorpiangWriter

Also, after trials and errors, my "Total Vertical HUD for Woof & Nugget Doom" is now finished and available here. You can copy SBARDEF lumps into respective autoload directories (all-all for other wads and id1.wad for Legacy of Rust)

Woof! Total Vertical HUD.zip Nugget Doom Total Vertical HUD.zip

PorpiangWriter avatar May 19 '25 07:05 PorpiangWriter

For what it's worth, a look at Woof's source would reveal the IDs of the widgets quite easily: 0 (stats), 1 (time), 2 (coords), 3 (FPS), 4 (rate), 5 (cmd history), 6 (speed), 7 (message), 8 (announce), 9 (chat), 10 (title)

See st_sbardef.h (sbarwidgettype_t)

NightFright2k19 avatar May 21 '25 14:05 NightFright2k19