## About The Pull Request
this converts the dependency on byondstorage, which is laggy (due to
being a large json file written to disk every 10 seconds), to using
indexeddb, like we did prior to 516. this is achieved by using an iframe
to give us a persistent origin, as the web is evil and has invented
same-origin policy
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy.
this also hosts the iframe page on the github pages site for a secondary
repository (see tgstation/byond-client-storage) so it works OOTB without
requiring server operators to setup the webroot cdn (which i don't
believe is configured on the tg servers at the moment)
however, if a server is using the webroot cdn, it will use that instead
of github pages
you could also host the iframe.html page on a separate host from your
cdn or github pages if you wanted to
if we can't access the configured cdn at all, it failovers to use
byondstorage anyway, if the internet stops working and you still want
your chat history to save, i guess
## Why It's Good For The Game
saving this enormous json file is laggy, and this solution would fix
https://github.com/tgstation/tgstation/issues/89988 and fix
https://github.com/tgstation/tgstation/issues/92035
i am open to other solutions, but this does seem to require the least
amount of external dependencies of posed solutions
## Changelog
🆑
fix: you should experience less stutters every 10 seconds
server: server operators can now configure an alternative storage domain
for clientside data storage, read the example configuration for more
/🆑
---------
Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
## About The Pull Request
Adds `GLOB.unrecommended_builds`, for byond build which are broken for
the end user in some way, but not in a way that warrants outright
blacklisting players from connecting with them
Looks like this (Ignore the number I changed it for testing purposes)
<img width="493" height="267" alt="image"
src="https://github.com/user-attachments/assets/d31636e8-a106-4d13-a8fa-aee6a50c6d27"
/>
Uses this system for the new byond build, 1670+, which breaks text
rendering
Also adds 1670+ to the list of builds to warn on compile
## Why It's Good For The Game
1670 broke the compilation step, probably permanently
Whether we will fix this or flip a pragma or w/e remains to be seen, but
until then we can tell people to compile an earlier version
1670 also broke the user experience, causing map text to show up as
really big. This will be fixed in an upcoming version
<https://www.byond.com/forum/post/2983385>
## Changelog
🆑 Melbert
qol: If you are on Byond 516.1670+, you will get an alert on login that
your build is less than functional
/🆑
## About The Pull Request
#91419 removed change_view in mob login for un-inited clients, which
leaves 1 second delayed fit_viewport calls from
attempt_auto_fit_viewport as the only way for new clients to adjust
their viewport from the default square (which is also only ran once all
subsystems finish initializing).
Just calling apply() after applying our prefs to the view_size is enough
to make it work, also we don't need the said second delay in
attempt_auto_fit_viewport anymore either.
## Changelog
🆑
fix: Fixed delayed viewport fitting on server join/init
/🆑
## About The Pull Request
Tin.
Runtiming in this spot is really not good and may have potentially
caused a crash for one of our rounds.
Not sure how it happened exactly, but it costs nothing to be safe here.
<img width="696" height="38" alt="image"
src="https://github.com/user-attachments/assets/c56c5c18-8ae0-428f-a407-b2e3de79d87a"
/>
## Why It's Good For The Game
Let clients finish their destruction
## Changelog
Not player-facing
## About The Pull Request
Ok there's a lot here, sorry bout that.
- Cleaned up the permissions panel backend pretty signficantly
- Added some extra security measures to said code, mostly proc call
checks
- Properly implemented filtering code jordie wrote years and years ago
for permissions logs
- Cleaned up the permissions ui generally, more bars, nicer lookin
stuff, etc
- Fixed the Management panel's relationship with combined roles, and
renamed it to Housekeeping. Its display is expanded too.
- Added tracking to rank datums on where exactly they came from
- Added a new tab to the permissions panel which allows the modification
and deletion of ranks
- Beefed up rank modification to try and avoid accidential temp rank
additions to the db
I'm doing my best to avoid perms escalation issues, tho they are always
possible right.
Also, got mad at some query cleanup handling, did a pass on it. this
isn't nearly all of em, but it's some.
## Why It's Good For The Game
I realized there is no way to, in game, cleanly edit/create ranks, and
that the way the existing system worked was quite opaque.
I'm trying to fix that here. It does mean potentially opening up DB rank
deletion/modification to bad actors, but frankly I am not overly worried
about that. Admin modification has always been a vulnerability so like.
Here's a video with my changes (mostly, it's lightly outdated)
https://file.house/XqME7KWKk0ULj4ZUkJ5reg==.mp4
## Changelog
🆑
refactor: Fucked with admin rank setup very slightly, please yell at me
if anything is wrong.
admin: Updated the permissions panel to be a good bit more user
friendly, added rank management support to it.
server: I've added code that gives the game modification/deletion perms
for the rank table, be made aware.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
This is my second contribution to the move towards removing the stat
panel (first one being https://github.com/tgstation/tgstation/pull/90572
)
This moves the info buttons at the top right of the game's screen
(Changelog, Rules, Wiki, etc) to the Escape menu, except for Fullscreen
which is now a pref instead. This means you can set Fullscreen to be on
permanently and every launch will automatically fullscreen you (the
viewport will be a little off because it only fixes it once
initialization is complete). This follows through rounds and auto
updates if you set your game to fullscreen with the OOC button or F11,
so players will learn about the pref after playing a round with
fullscreen enabled.
What the game now looks like
##### Alt ideas for sprites: Changelog can be a newspaper and Forums can
be a newscaster
https://github.com/user-attachments/assets/7871a226-1e0b-410d-a690-88f3616bebb0
This is something I wanted to do since the Esc menu was added but just
never got around to it, but here it is.
## Why It's Good For The Game
These buttons don't warrant being in the player's face 24/7 and since
we've want to remove the stat panel and this has to be somewhere, I
thought it would be a better fit in the Escape menu. It helps make the
Esc menu the tool players use to access their OOC tools and overall I
think improves the appearance of the game's screen to something more
like an actual game would look like, especially when our comparison is
SS14.
## Changelog
🆑
qol: Info buttons previously at the top right of your screen (Changelog,
wiki, forums) is now in the Escape menu.
qol: Fullscreen is now a preferences and will follow you through rounds.
/🆑
## About The Pull Request
Currently the button to open a map in webmap is tied to a config entry,
which would then take the name of the map being played and get the link
to that, however for cases like new/tested/admin uploaded maps where
there is no webmap available, this would still have a link to a url that
doesn't exist.
Instead, we'll make the webmap link be in ``maps.txt``, same as
feedbacklink.
## Why It's Good For The Game
Explained in the about section, this prevents webmaps appearing for maps
that aren't supposed to have a webmap link available.
## Changelog
Nothing player-facing, webmaps aren't currently used (afaik) currently
cause they're broken for tg codebases.
## About The Pull Request
This PR started with the idea of adding support for map feedback
threads, which I added to the roundend report, escape menu, and stat
panel. To do this though I had to make pretty annoying changes to the
stat panel and had to touch every single time something to the stat
panel was added, so since we now have a way to have links in the stat
panel I thought of taking full advantage of it and add some QOL.
AIs can now track their borgs by clicking their status on the stat panel
https://github.com/user-attachments/assets/1789dc46-5d12-48e9-bb8d-d3278aa19639
With Melbert's comment, I added another stat panel entry that directs
you to the Webmap page, which currently seems to be a little messed up
(https://github.com/AffectedArc07/SS13WebMap/issues/41 &
https://github.com/AffectedArc07/SS13WebMap/issues/42) but if they get
fixed this would be a swag asf feature
##### Code bounty for Ezel/Improvedname
## Why It's Good For The Game
Feedback threads was a suggestion from a player and is fully in control
of admins as an optional thing, and while we still have stat panel I
think it's nice to be able to take advantage of its features.
## Changelog
🆑
admin: Admins can now link a URL for maps, used to give feedback on said
maps. Accessible through the roundend report, escape menu, and stat
panel.
qol: AIs can track their borgs by clicking on them in the stat panel.
qol: You can now directly go to the webmap of maps from the stat panel
(assuming it's set in config).
/🆑
## About The Pull Request
left over debug line that someone ...? forgot about
## Why It's Good For The Game
scalies:
## Changelog
🆑
fix: removes an excess debug line
/🆑
## About The Pull Request
various uis (tgui-say, vv, player panel, anything using
`/datum/browser`) would not correct for dpi. they now do
we also have a preference to allow you to have smaller windows that are
zoomed out, instead of larger windows that are not zoomed
#### of note, this does require a small change to the usage of css
viewport units, like `vh` and `vw`. they need to be fed through the
`vp(100vw)` function first. there was only one such unit in the codebase
on 4k monitor with 200% scaling:
fixed (pref on default)

pref disabled

## Why It's Good For The Game
516 fucked with uis again and this unfucks them a bit
## Changelog
🆑
qol: there's a new UI preference called UI scale which allows people
that use windows scaling to have their UIs original size with the
contents zoomed out, instead of the default, which is the UIs being
larger with the contents "normal" size
fix: various UIs did not respect windows scaling, they now do
/🆑
---------
Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
Ports the helpers from
https://github.com/BeeStation/BeeStation-Hornet/pull/12240
This should fix some more of the 516 issues that I've seen while giving
a quick check through the code
The remaining browse should work now.
Also fixing another sass warning while being on it.
## About The Pull Request
## Why It's Good For The Game
## Changelog
🆑
fix: tgui say 516 will no longer change channels when the button is used
to drag it
fix: tgui say 516 will no longer leak radio messages into the wrong
channel
fix: runechat flickering when faded up messages fade out
/🆑
## About The Pull Request
Converts `/datum/player_details` into `/datum/persistent_client`.
Persistent Clients persist across connections. The only time a mob's
persistent client will change is if the ckey it's bound to logs into a
different mob, or the mob is deleted (duh).
Also adds PossessByPlayer() so that transfering mob control is cleaner
and makes more immediate sense if you don't know byond-fu.
## Why It's Good For The Game
Clients are an abstract representation of a connection that can be
dropped at almost any moment so putting things that should be stable to
access at any time onto an undying object is ideal. This allows for
future expansions like abstracting away client.screen and managing
everything cleanly.
## About The Pull Request
Part 1 by grungussuss: https://github.com/tgstation/tgstation/pull/87529

## Why It's Good For The Game
gives players more control over how loud they want certain sounds to be
## Changelog
🆑 Rengan
sound: the volume that vox, admin sound, insturments play at can now be
tweaked in preferences, check your preferences!
sound: Elevator now uses ambience volume preference, jukeboxes uses
instrument volume preference and end of round musics uses admin music
volume preference.
/🆑
## About The Pull Request
This bumps the minimum compile version to 515.1642, due to [this BYOND
bug](https://www.byond.com/forum/post/2936624) where byondapi can
corrupt vars, and dreamluau is called regardless of whether a Lua script
is actually being ran (mostly via `DREAMLUAU_CLEAR_REF_USERDATA`), so
it's best to get rid of any potential of this bug triggering.
## Why It's Good For The Game
mrrrp mrrrp mrrrowww
## Changelog
No user-facing changes
## About The Pull Request
toggle_fullscreen:
collapsed 11 winsets into 3
is-maximised now is true for both sets, to ensure that the screen doesnt
sometimes go tiny when this is being toggled (was reported on tgmc) (and
yes this doesnt impact resizing)
now uses src instead of fickle usr
added a comment for a better implementation once its possible
toggle_status_bar
now uses src instead of fickle usr
p.s when will someone add prefs for this lmao
## Changelog
🆑
fix: fixed a case that could make untoggling fullscreen make your window
small
code: Cleaned up some fullscreen and status bar toggle code to function
better
/🆑
---------
Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
## About The Pull Request
so i discovered this downstream, but forgot to pr upstream til now, the
proper way to rebuild planemasters is `rebuild_hud`, not directly
calling `rebuild_plane_masters`
## Why It's Good For The Game
whoopsie breaking graphics is bad
## Changelog
🆑
fix: Fixed graphics getting screwed up when reconnecting with BYOND 515
after playing on BYOND 516.
/🆑
## About The Pull Request
Was just scrolling through the Paradise github since they seem to have
more work done for 516 to see if there's anything I can port over, found
this and thought why not.
Ports parts of https://github.com/ParadiseSS13/Paradise/pull/25105
Specifically, updaing all hrefs to use the internal ``byond://``, and
adding it to grep.
## Why It's Good For The Game
More work towards 516.
## Changelog
Nothing player-facing.
## About The Pull Request
Was investigating some stuff downstream related to undeleted SQL
queries, and these two queries were related.
thought it'd be best to make them not block
`/client/proc/set_client_age_from_db`, as the results are never checked
anyways, not even for errors.
I've added a new proc to SSdbcore, `FireAndForget` - takes the same
parameters as NewQuery, but instead of returning the query, it just
asynchronously executes and then deletes it.
## Why It's Good For The Game
less undeleted sql queries, less blocking. yay?
## Changelog
does this count as user-facing? unsure how i'd changelog this tbh
## About The Pull Request
This makes `/datum/player_details` properly track BYOND version and
build separately, as opposed to just the full version string.
Whenever a client logs in, and their BYOND version is 516, while their
previous version was 515, or vice versa, it'll set a newly added client
var, `rebuild_plane_masters`, to TRUE.
During the `COMSIG_MOB_LOGIN` signal handler of a mob's HUD
(`/datum/hud/proc/client_refresh`), it will check to see if
`rebuild_plane_masters` is TRUE - if so, it will set the appropriate
`relay_loc` of (based on client BYOND version) of its plane master
groups, and rebuild their plane masters.
## Why It's Good For The Game
Makes testing stuff across 515 and 516 easier, as your screen won't
break when switching between the two.
## Changelog
516 is _still_ in private alpha, so no user-facing changes.
## About The Pull Request

## Why It's Good For The Game
gives players more control over how loud they want certain sounds to be
## Changelog
🆑 grungussuss
sound: the volume that ship ambience, ambience, radio noise and
announcements play at can now be tweaked in preferences, check your
preferences!
/🆑
## What's going on here
Kept you waitin huh!
This pr resprites most all walls, windows and other "wall adjacent"
things to a 3/4th perspective, technical term is "tall" walls (we are
very smart).
If you're trying to understand the technical details here, much of the
"rendering tech" is built off the idea of split-vis. Basically, split a
sprite up and render it on adjacent turfs, to prevent seeing "through"
walls/doors, and to support seeing "edges" without actually seeing the
atom itself.
Most of the rest of it is pipelining done to accommodate how icons are
cut.
## Path To Merge
Almost* all sprites and code is done at this point.
There are some things missing both on and off the bounty list, but that
will be the case forever unless we force upstream (you guys) to stop
adding new shit that doesn't fit the style.
I plan on accepting and integrating prs to the current working repo
<https://github.com/wall-nerds/wallening> up until a merge, to make
contribution simpler and allow things like bounties to close out more
easily
This pr is quite bulky, even stripping away map changes it's maybe 7000
LOC (We have a few maps that were modified with UpdatePaths, I am also
tentatively pring our test map, for future use.)
This may inhibit proper review, although that is part of why I am
willing to make it despite my perfectionism. Apologies in advance.
Due to the perspective shift, a lot of mapping work is going to need to
be done at some point. This comes in varying levels of priority. Many
wallmounts are offset by hand, some are stuck in the wall/basically
cannot be placed on the east/west/north edges of walls (posters), some
just don't look great good in their current position.
Tests are currently a minor bit yorked, I thought it was more important
to get this up then to clean them fully.
## What does it look like?






## Credits
<details>
<summary>Historical Mumbojumbo</summary>
I am gonna do my best to document how this project came to be. I am
operating off third party info and half remembered details, so if I'm
wrong please yell at me.
This project started sometime in late 2020, as a product of Rohesie
trying to integrate and make easier work from Mojave Sun (A recently
defunct fallout server) with /tg/.
Mojave Sun (Apparently this was LITERALLY JUST infrared baron, that man
is insane) was working with tall walls, IE walls that are 48px tall
instead of the normal 32. This was I THINK done based off a technical
prototype from aao7 proving A it was possible and B it didn't look like
dogwater.
This alongside oranges begging the art team for 3/4th walls (he meant
TGMC style) lead to Rohesie bringing on contributors from general /tg/,
including actionninja who would eventually take over as technical lead
and Kryson, who would define /tg/'s version of the artstyle. Much of the
formative aspects of this project are their work.
The project was coming along pretty well for a few months, but ran into
serious technical issues with `SIDE_MAP`, a byond map_format that allows
for simpler 3/4th rendering.
Due to BULLSHIT I will not detail here, the map format caused issues
both at random with flickering and heavily with multiz.
Concurrent with this, action stepped down after hacking out the
rendering tech and starting work on an icon cutter that would allow for
simpler icon generation, leaving ninjanomnom to manage the project.
Some time passed, and the project stalled out due to the technical
issues. Eventually I built a test case for the issues we had with
`SIDE_MAP` and convinced lummox jr (byond's developer) to explain how
the fuckin thing actually worked. This understanding made the project
theoretically possible, but did not resolve the problems with multi-z.
Resolving those required a full rework of how rendering like, worked. I
(alongside tattle) took over project development from ninjanomnom at
this time, and started work on Plane Cube (#69115), which when finished
would finally make the project technically feasible.
The time between then and now has been slow, progressive work. Many many
artists and technical folks have dumped their time into this (as you can
see from the credits). I will get into this more below but I would like
to explicitly thank (in no particular order) tattle, draco, arcanemusic,
actionninja, imaginos, viro and kylerace for keeping the project alive
in this time period. I would have curled up into a ball and died if I
had to do this all myself, your help has been indispensable.
</details>
<details>
<summary>Detailed Credits</summary>
Deep apologies if I have forgotten someone (I am sure I have, if someone
is you please contact me). I've done my best to collate from the git
log/my memory.
Thanks to (In no particular order):
Raccoff: Being funny to bully, creating threshold decals for airlocks
aa07: (I think) inspiring the project
ActionNinja: Laying the technical rock we build off, supporting me
despite byond trying to kill him, building the icon cutter that makes
this possible
ArcaneMusic: Artistic and technical work spanning from the project's
start to literally today, being a constant of motivation and positivity.
I can't list all the stuff he's done
Armhulen: Key rendering work (he's the reason thindows render right), an
upbeat personality and a kick in the ass. Love you arm
Azlan: Damn cool sprites, consistently
Ben10Omintrix: You know ben showed up just to make basic mobs work, he's
just fuckin like that man
BigBimmer: A large amount of bounty work, alongside just like, throwing
shit around. An absolute joy to work with
Capsandi: Plaques, blastdoors, artistic work early on
CapybaraExtravagante: Rendering work on wall frames
Draco: SO MUCH STUFF. Much of the spritework done over the past two
years is his, constantly engaged and will take on anything. I would have
given up if not for you
Floyd: Early rendering work, so early I don't even know the details.
Enjoy freedom brother
Imaginos16: A guiding hand through the middle years, handled much of the
sprite review and contribution for a good bit there
Iamgoofball: A dedication to detail and aesthetic goals, spends a lot of
effort dissecting feedback with a focus on making things as good as they
can be at the jump
Infrared: Part of the impetus for the project, made all the xenomorph
stuff in the MS style
Jacquerel: A bunch of little upkeep/technical things, has done so much
sprite gruntwork (WHY ARE THERE SO MANY PAINTING TYPES)
Justice12354: Solved a bunch of error sprites (and worked out how to
actually make prs to the project) Thanks bro!
Kryson: Built the artstyle of the project, carrying on for years even
when it was technically dying, only stopping to casually beat cancer. So
much of our style and art is Kryson
KylerAce: Handled annoying technical stuff for me, built window frame
logic and fully got rid of grilles.
LemonInTheDark: Rendering dirtywork, project management and just so much
fucking time in dreammaker editing sprites
Meyhazah: Table buttons, brass windows and alll the old style doors
Mothblocks: Has provided constant support, gave me a deadline and
motivation, erased worries about "it not being done", gave just SO much
money to fill in the critical holes in sprites. Thanks moth
MTandi: Contributed art despite his own blackjack and hookers club
opening right down the road, I'm sorry I rolled over some of your
sprites man I wish we had finished earlier
Ninjanomnomnom: Consulted on gags issues, kept things alive through some
truly shit times
oranges: This is his fault
Rohesie: Organized the effort, did much of the initial like, proof of
concept stuff. I hope you're doin well whatever you're up to.
san7890: Consulting on mapper UX/design problems, being my pet mapper
Senefi: Offsetting items with a focus on detail/the more unused
canidates
SimplyLogan: Detailed map work and mapper feedback, personally very kind
even if we end up talking past each other sometimes. Thank you!
SpaceSmithers: Just like, random mapping support out of nowhere, and
bein a straight up cool dude
Tattle: A bunch of misc project management stuff, organizing the
discord, managing the test server, dealing with all the mapping bullshit
for me, being my backup in case of bus. I know you think you didn't do
much but your presence and work have been a great help
Thunder12345: Came out of nowhere and just so much of the random
bounties, I'm kind of upset about how much we paid him
Time-Green: I hooked him in by fucking with stuff he made and now he's
just doin shit, thanks for helping out man!
Twaticus: Provided artistic feedback and authority for my poor feeble
coder brain, believed in the project for YEARS, was a constant source of
❤️ and affirmation
unit0016: I have no god damn idea who she is, popped out of nowhere on
the github one day and dealt with a bunch of annoying
rendering/refactoring. Godspeed random furry thank you for all your
effort and issue reports
Viro: A bunch of detailed spriting moving towards 3/4ths, both on and
off the wallening fork. If anyone believed this project would be done,
it was viro
Wallem: Artistic review and consultation, was my go-to guy for a long
time when the other two spritetainers were inactive
Waltermeldon: Cracked out a bunch of rendering work, he's the reason
windows look like not dogwater. Alongside floyd and action spent a TON
of time speaking to lummox/unearthing how byond rendering worked trying
to make this thing happen
ZephyrTFA: Added directional airlock helpers, dealt with a big fuckin
bugaboo that was living in my brain like it was nothing. Love you
brother
And finally:
The Mojave Sun development team. They provided a testbed for the idea,
committed hundreds and hundreds of hours to the artstyle, and were a
large reason we caught issues early enough to meaningfully deal with
them. Your work is a testament to what longterm effort and deep detailed
care produce. I hope you're doing well whatever you're up to. Go out
with a bang!
</details>
## Changelog
🆑 Raccoff, aa07, ActionNinja, ArcaneMusic, Armhulen, Azlan,
Ben10Omintrix, BigBimmer, Capsandi, CapybaraExtravagante, Draco, Floyd,
Iamgoofball, Imaginos16, Infrared, Jacquerel, Justice12354, Kryson,
KylerAce, LemonInTheDark, Meyhazah, Mothblocks, MTandi, Ninjanomnom,
oranges, Rohesie, Runi-c, san7890, Senefi, SimplyLogan, SomeAngryMiner,
SpaceSmithers, Tattle, Thunder12345, Time-Green, Twaticus, unit0016,
Viro, Waltermeldon, ZephyrTFA with thanks to the Mojave Sun team!
add: Resprites or offsets almost all "tall" objects in the game to match
a 3/4ths perspective
add: Bunch of rendering mumbo jumbo to make said 3/4ths perspective work
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: = <stewartareid@outlook.com>
Co-authored-by: Capsandi <dansullycc@gmail.com>
Co-authored-by: ArcaneMusic <hero12290@aol.com>
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
Co-authored-by: SomeAngryMiner <53237389+SomeAngryMiner@users.noreply.github.com>
Co-authored-by: KylerAce <kylerlumpkin1@gmail.com>
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: Runi-c <5150427+Runi-c@users.noreply.github.com>
Co-authored-by: Roryl-c <5150427+Roryl-c@users.noreply.github.com>
Co-authored-by: tattle <article.disaster@gmail.com>
Co-authored-by: Senefi <20830349+Peliex@users.noreply.github.com>
Co-authored-by: Justice <42555530+Justice12354@users.noreply.github.com>
Co-authored-by: BluBerry016 <50649185+unit0016@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com>
Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
Co-authored-by: Rob Bailey <github@criticalaction.net>
Co-authored-by: MMMiracles <lolaccount1@hotmail.com>
## About The Pull Request
Automatically calls attempt_auto_fit_viewport() upon toggling fullscreen
## Why It's Good For The Game
Fullscreen changes your viewport height but not width so if you're
running stretch to fit (which is probably used by most of our players as
fullhd does not integer scale) you have to manually use Fit Viewport
verb every time you join the game and enter fullscreen which is rather
annoying to do.
## Changelog
🆑
qol: If you have auto fit viewport enabled, it will trigger upon
entering or exiting fullscreen
/🆑
## About The Pull Request
it's - conjunction of "it" and "is"
its - possessive form of "it"
grammar is hard, and there were a lot of places where "it's" was used
where it shouldn't have been. i went and painstakingly searched the
entire repository for these instances, spending a few hours on it. i
completely ignored the changelog archive, and i may have missed some
outliers. most player-facing ones should be corrected, though
## Why It's Good For The Game
proper grammar is good
## Changelog
🆑
spellcheck: Numerous instances of "it's" have been properly replaced
with "its"
/🆑
## About The Pull Request
It makes the automute use bigger, redder text and also balloon alert
I know ppl dont like punctuation in balloon alerts so I can remove the
exclamation mark if u want, i like it tho
I guess if u support darwinism u could leave it as is but in the era of
runetext and TTS ppl cant pay attention to the chat window they're too
busy watching subway surfers on their second monitor and scrolling
tiktok on their phone
Doesnt change the text so it stays deliberately vague like the comment
says it should
Before:
<img src="https://i.ibb.co/3hDnpQm/Automute-Before.png">
After:
<img src="https://i.ibb.co/0qSwJFB/Automute-After.png">
<img src="https://i.ibb.co/n3ch9fg/Automute-Balloon-Alert.png">
## Why It's Good For The Game
Being automuted when there's no admins on cuz u got a bit carried away
isnt cool and then u have to urgent ahelp it, which is understandable
cuz it's making the round unplayable for you but you did kinda bring it
on yourself and the admin might not be too happy with you about it.
## Changelog
🆑
admin: The auto-mute system yells at you harder when you send a bunch of
identical messages.
/🆑
## About The Pull Request
Right now parallax is like a quarter of SSinput, which is BAD. It's so
high mostly because of the animates we need to do, but also due to the
cost of setting screen_loc.

This sucks. The default step is to reduce the poll rate of the effect,
but I don't want to do that because it SUCKS. Sooooo how can we
optimize.
Well, if we stop thinking in terms of screen_loc, which is a string
(tree shit) and also unanimatable, and start working in pixel offsets,
this'd be a way cheaper.
We can make that happen by sticking all our parallax layers on one rock
screen object. Then they have relative positions and can be pixel offset
(I have stolen this concept wholesale from Ter)
This works unreasonably well, roughly a 65% cost reduction. S good shit.

While I'm here...
[uses KEEP_TOGETHER to reduce clientside load, makes the flying
animation
better.](52610398e2)
We were individually rendering all like fucking 24 480x480 overlays on
all 5 parallax layers, which means we had to apply our transform to EACH
ONE. This has GOTTA suck shit for clients, so let's... not? Should help.
The existing flying animation makes me depressed. it has some very
visible stutter, and jumps around a lot.
We can deal with the starting stutter by avoiding starting a new
animation on the layer until the old one is finished. This is what was
SUPPOSED to be happening, but because we fired one timer for all the
layers, they'd desync and jump in ugly ways.
This means we need to use one timer per layer, which does induce more
cost then I'd like. IDK how I feel about this to be honest.
I try and reduce ending weirdness by unscaling time at the end, so
different aspects don't slow down at different rates.
Speed on the parallax animation was weird, it'd spike up, then dip down
in flight.
This was because the percieved rate of change from the quad easing was
closer to 2x the existing.
I've handled this by halving the animation time in the loop
Oh also there's no sense calling the update animation proc if we are
coming to a stop, and thus have no follow up animation.
## Changelog
🆑 LemonInTheDark
refactor: I have reworked how parallax and its animations (space travel)
work. Please report any bugs lads!
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
It made me really mad to see a huge list in the middle of client/Destroy
for something that doesn't even run for 95% of users so I split it out
into another proc so the fingerprint of the very important `Destroy()`
stuff could be as minimal as possible without a big `pick()` so the
server can send the "I need a man 🥺" message could be punted off to
where no-one would care for it. It was already doing the async TGS
operation so it doesn't matter anyways as far as proc overhead in my
books.
I also fixed up the code for `adminGreet()` as well because that was
being really weird with not having proper booleans and running `pick()`
on things with literally one value (as well as excess
stringification)... it wasn't good so I just cleaned all that up too.
Ideally this all means we take up a little less CPU time but the aim of
this PR is to just clean it all up for modern coding standards.
alphabetized lists and early returns galore.
## Why It's Good For The Game
Code is better to read and less idented, and better yet it's no longer
necessary to read all the softie messages in the middle of `Destroy()`
## Changelog
Irrelevant
This uses a browser skin element to spy on the command bar and report
back to the server what verb is currently in it and how many characters
it has. it skips reporting if the text hasn't changed since the last
report.
im intentionally not providing the full text in the command bar to the
server, while designing the system so new verbs can be given typing
indicators by editing DM code, not html code.
The report rate is once a second but this could be lowered or tweaked.
Both the tgui say window being open and this system being active because
the command bar starts with `say "` is undefined behavior, mostly the
first one to end the indicator will just freeze indicators for the other
one until it too ends its current indicator session.
The system waits until something besides the `"` is in the argument to
say.
It is enabled for verbs `say`, `me`, and `whisper`.
I don't actually know if this is the case for tgui say. this is a one
line tweak anyways so let me know if this should be changed.
[(This pr closes a
bounty)](https://tgstation13.org/phpBB/viewtopic.php?p=726634#p726634)
🆑 MrStonedOne & Lilah Novi
add: Say commands typed in the command bar now trigger typing indicators
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
Do not merge this without coordinating with your server's host.
## About The Pull Request
Slightly refactors the way we handle IP intel.
You can still use the old data stored in the database.
Adds the ability to automatically reject connections determined by
config flags.
## Why It's Good For The Game
We used to have IP intel to check for VPNs, although it was disabled due
to being bad and unhelpful.
This refactor should make it much more manageable for hosts and admins.
## HOSTS BEWARE
This adds a new SQL table `ipintel_whitelist`
Look at the schema!
## Changelog
🆑
admin: The return of IPIntel
/🆑
---------
Co-authored-by: MrStonedOne <kyleshome@gmail.com>
Co-authored-by: oranges <email@oranges.net.nz>
## About The Pull Request
Fixes#82440
This PR just creates a new macro, `LOWER_TEXT()` (yes the irony is not
lost on me) to wrap around all calls of `lowertext()` and ensure that
whatever we input into that proc will be stringified using the `"[]"`
(or `tostring()` for the nerds) operator. very simple.
I also added a linter to enforce this (and prevent all forms of
regression) because I think that machines should do the menial work and
we shouldn't expect maintainers to remember this, let me know if you
disagree. if there is a time when it should be opted out for some
reason, the linter does respect it if you wrap your input with the
`UNLINT()` function.
## About The Pull Request
Remakes Battle Arcade from just about the ground up, with exceptions
taken for emagged stuff since I didn't really want to touch its
behavior.
The Battle Arcade now has stages that players can go through, unlocking
a stage by beating 2 enemies and the boss of the previous one, but this
must all be done in a row. You can choose to take a break between each
battle and there's a good chance you'll sleep just fine but there's also
a chance it can go wrong either through an ambush or robbery.
The Inn lets you restore everything for 15 gold and you can buy a sword
and armor, each level you unlock is a new sword and armor pair you can
buy that's better than the last, it's 30 gold each but scales up as you
progress through levels. They are really worth getting so it's best to
try to not lose your money early in.
The battle system is nearly the same as how it was before but I removed
the poor combo system that plagued the old arcade as one big knowledge
lock, now it's more just turn based. The game is built on permadeath so
dying means you restart from the beginning, but if you are going to lose
you can try to escape instead which costs you half of your gold.
Getting to higher levels increases the difficulty of enemies but also
increases the gaming exp rewards which could make this a better way to
get exp if you can get good at it.
Gaming EXP is used to increase chances of counterattacking but doesn't
give any extra health to the player.
I also removed the exploit of being able to screwdriver arcade cabinets
because people would do that if they thought they were on the verge of
losing to bypass the effects of loss. I instead replaced it with a new
interaction that the Curator's display case key can be used to reset
arcade cabinets (there's several keys on the chain so it made sense to
me), which I added solely because I thought Curators would be the type
of person to have run an actual arcade.
This is some gameplay
https://github.com/tgstation/tgstation/assets/53777086/499083f5-75cc-43b5-b457-017a012beede
As a misc sidenote, I also split up the arcade file just like how Orion
Trail was before, just for neat code organization.
The Inn keeper is straight up just a photo of my localhost dude, he's
not a player reference or anything it's not my actual character.
I also have no idea how well balanced this is cause I suck at it lol.
## Why It's Good For The Game
Battle Arcade is one of 3 last machines in my hackmd here to turn into
TGUI https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view
I've always thought the current version of battle arcade is quite lame
and lacks any progression, like Orion Trail I thought that since I was
moving this to TGUI, it would also be a perfect opportunity to revamp it
and try to improve on where it failed before, especially since the
alternative (NTOS Arcade) is also lame as hell and is even lamer than
HTML battle arcade (spam mana, then spam health, then just spam attack,
rinse and repeat).
This will hopefully be more entertaining and give players sense that
they are getting through a series of tasks rather than doing one same
one again and again.
## Changelog
🆑 JohnFulpWillard, Zeek the Rat
add: Battle Arcade has been completely overhauled in a new progression
system, this time using TGUI.
add: The Curator's keys can now reset arcade cabinets.
balance: You now need to be literate to play arcade games, except for
Mediborg's Amputation Adventure.
fix: You can no longer screwdriver emagged arcade consoles. Accept your
fate.
fix: Silicons can no longer play Mediborg's Amputation Adventure.
/🆑
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
This is a REALLY hot proc, takes up to like 2% of total cpu at highpop
Let's micro it then
First, clients do not go null at random. It's not predictable per say
but it is consistent.
We can use this understanding to remove a bunch of null checks here
For loops are expensive. So rather then doing one each keyLoop, let's
cache the client's intended move direction on the client. Simplifies
some other code too
There is no sense running a turn call if it would have no effect, let's
be more intelligent about this
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
refactor: Fucks with how movement keys are handled. Please report any
bugs
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
## About The Pull Request
Wrong fuckin name brother (also topic doesn't automake textnums into
nums)
## Why It's Good For The Game
Closes#80020
## Changelog
🆑
admin: Confirming that you have read an admin message now uh, works.
it's been 2 years bros
/🆑
## About The Pull Request
Tells the preferences datum to reload the savefile when we associate to
an already existing one
## Why It's Good For The Game
This trolled me locally for a good hour wondering "why aren't my prefs
updating when I swap out the file"
## Changelog
## About The Pull Request
Makes client upload limit a config. Increases max file size admins can
upload to 5mb, up from 2.5mb.
## Why It's Good For The Game
Makes it easier to do custom maps for events. Some of our in-game maps
are already larger than 2.5mb (delta is almost 3mb).
## Changelog
🆑
admin: admins can now upload files to the server up to 5mb (used to be
2.5mb)
config: file upload restriction is now config
/🆑
## About The Pull Request
this pr made me learn to webedit
## Why It's Good For The Game
turns out headmins have interesting functionality, probably good to have
them around
## Changelog
🆑
balance: Re-escalates terry powergaming by increasing the strength of
sec
/🆑
## About The Pull Request
This PR adds a bunch of sanity checking to the `prefs.chat_toggles` var
accesses.
Prefs can be null when client is creating/deleting and this causes a
runtime where you might not be able to use emotes.

EDIT: as per suggestion I stopped masking the issue and added stack
traces instead. And made them into helper procs to avoid code
duplication.
For some of these procs it is important that we are able to continue
running to get to the end. **A ghost having null prefs should not stop
everyone else from hearing/seeing the emote.**
So now they will put the stack trace and keep on trucking if that issue
occurs. This is the main 'point' of the PR, which has seemingly gotten
bogged down in the creation of the two helper procs--apologies.
See https://github.com/tgstation/tgstation/pull/70404 for essentially
the same issue but applied to chat messages. I have gone back and
replaced the duplicated code from that to use the new helper procs
instead.
## Why It's Good For The Game
Anything chat related is a bad place to runtime. Some messages can take
a while to type out and to have it not display is frustrating at worst,
possibly detrimental if you have to communicate something urgently.
## Changelog
🆑
fix: fixes a bug that can cause emotes to stop working if a client is
being created or deleted
/🆑