## About The Pull Request
Currently if you want to apply a HUD you usually add both its trait and
the HUD itself. Only exceptions are things like simplemobs where you
should avoid adding the hud trait since it adds security/med DB access
and such, but there is no cases where you'd want to apply the trait and
not apply the hud.
Requested by Melbert about a week ago.

## Why It's Good For The Game
This makes working with HUDs significantly easier, as you no longer have
to bother with manually adding/removing them. Also potentially removes
an edge case where if your hud could get removed while keeping the
trait.
## Changelog
🆑
refactor: HUD traits now apply their corresponding hud automatically
/🆑
#79995 removed the verb and secrets button for no reason. This means you
can no longer decide to do tri-ai in the lobby, you have to do it next
round or make players suffer thru another init cycle.
**__In general systems that require things be decided the previous round
are really fucking annoying and should be minimized to only specific
things that absolutely have to for technical reason.__**
This is not one of them.
I do not have the time to redesign the station trait to make use of the
existing admin code so this is a full revert instead.
If the station trait is re-added, it should be done so without removing
the secrets button or admin verb.
#81681 had an undocumented and un-atmoized change, in that it removed a
job related signal needlessly, that undocumented change has been
reverted because this system used that signal.
@Fikou
@JohnFulpWillard
(also cc @tralezab and @Ghommie as you merged the reverted prs)
## About The Pull Request
Adds a convenient switch to change the ability to vote dead (previously
only in the config), and also turns off the button and adds a tooltip to
let players know why they can't vote (previously, you could just click,
since the button wasn't turned off, but the vote didn't count).
https://github.com/tgstation/tgstation/assets/78199449/404aac9c-0b41-4c16-8ffd-2a435cf25e2c
## Why It's Good For The Game
At the right moments, you can just stop considering the opinions of dead
players.
The dead players will be able to understand why they can't vote.
## Changelog
🆑 Vishenka0704
qol: With voting turned off for the dead, you can now understand why you
can't vote (being dead).
admin: Voting switch for the dead players
/🆑
## About The Pull Request
This adds a menu to all admin narrate verbs that allows you to select a
span type for your message. This includes global, direct, world, subtle,
and headset narrates.
This includes (nearly) all forms of text span. Some were not included,
like OOC announcements, centcom priority announcement headers, the span
used for hyperlink text, stuff like that. They're mostly all there, but
the stuff that probably shouldn't be showing up under a generic chat
message has been excluded. There's well over 100 of these things, so
pick whatever you want.
Due to the way this works, you can close the spans in the message
mid-string, in case you wanted to have multiple text formats in the
message. You can also just format text the old-fashioned way if you
really wanted.

**_Fun fact -- When using admin OOC spans, the reply will copy whatever
your admin OOC color is._**

Yeah I'm sure you can tell I'm a super mature person by what the test
messages I used here were. Laugh it up. Just know that I'm laughing too,
like a grade schooler who just learned their first swear words.
## Why It's Good For The Game
No more futzing about with copypastes and big long text files with the
span formatting already written out. Now, you can just pick them from a
list. Neato!
This will increase adminbus immersion by a factor of at least 3-5%
assuming all projections and the data we have been provided holds true.
## Changelog
🆑 Rhials
admin: Narrate verbs will now allow you to pick what text formatting
span you want to use before you send them, if any.
/🆑
## About The Pull Request
Basically, adds a version of `randomize_human` that's a tad more
curated, IE, primarily picks results to create a more "coherent" result
than full randomization.
Shown here: Humans, Lizards, Felinids. Looks a bit boring, but that's
the point.

Non-humans I left almost entirely untouched, as they generally form a
more "coherent" mob from pure randomization already.
## Why It's Good For The Game
Basically just aiming to perform a more "consistent" style for humonkeys
and corpses.
For monkeys, it doesn't make the most sense when they pop up with a
giant red afro.
For corpses, it's a bit hard to feel immersed in the ruins when they've
all got pink and green mustaches.
## Changelog
🆑 Melbert
add: Humonkeys and random corpse spawns now look more... human.
/🆑
## About The Pull Request
As the title says. A standard power cell now only stores 10 KJ and
drains power similar to how it did before the refactor to all power
appliances.
The new standard megacell stock part stores 1 MJ (what cells store right
now). APCs and SMESs have had their power cells replaced with these
megacell stock parts instead. Megacells can only be used in APCs and
SMESs. It shouldn't be possible to use megacells in any typical
appliance.
This shouldn't change anything about how much 'use' you can get out of a
power cell in regular practice. Most should operate the same and you
should still get the same amount of shots out of a laser gun, and we can
look at expanding what can be switched over to megacells, e.g. if we
want mechs to require significantly more power than a typical appliance.
Thanks to Meyhazah for the megacell icon sprites.
## Why It's Good For The Game
Power cell consumption is way too high ever since the power appliance
refactor that converted most things to be in joules. It's a bit
ridiculous for most of our machinery to drain the station's power supply
this early on.
The reason it's like this is because regular appliances (laser guns,
borgs, lights) all have a cell type that is identical to the APC/SMES
cell type. And it means that if we want to provide an easy way to charge
these appliances without making it easy to charge APCs/SMESs through a
power bug exploit, we need to introduce a new cell type to differentiate
between what supplies power and regular appliances that use power. This
is primarily what the megacell stock part does.
This moves us back to what it was originally like before the power
refactor, where recharging power cells wouldn't drain an exorbitant
amount of energy. However, it maintains the goal of the original
refactor which was to prevent people from cheesing power generation to
produce an infinite amount of power, as the power that APCs and SMESs
operate at is drastically different from the power that a regular
appliance uses.
## Changelog
🆑 Watermelon, Mayhazah
balance: Drastically reduces the power consumption and max charge of
power cells
balance: Added a new stock part called the battery, used primarily in
the construction of APCs and SMESs.
add: Suiciding with a cell/battery will shock you and potentially dust
you/shock the people around you if the charge is great enough.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
Turns out, the only way to do this, if desired as an admin, is through
SQL. And that's lame!
So, this adds an admin secret to mass heal and revive everyone on the
station with a mob. Not much else nuance to it really.
## Why It's Good For The Game
Turns out we've been asking about it in bus for like, 3-4 years now?
I was also asked about it in a round today, so here we go.
## About The Pull Request
Recently we allowed items held in your hands to catch fire if you catch
fire.
This makes sense but the code had a few oversights, then we reverted it.
This PR reintroduces the feature, but with a few refinements.
The basic feature is simple: If you are on fire then items you are
holding will also catch fire, in the same vein as items you are wearing
on your head or hands.
There are also a few caveats we forgot about the first time we added
this:
- If your gloves cannot catch fire, your held items will not catch fire
(because your hands aren't on fire).
- If you are extinguished, your held items will also be extinguished.
- Stopping, Dropping, and Rolling on top of any items will also
extinguish those items.
As part of this change, after an argument about whether or not this is
an oversight in coding-general, I've made the proc `get_equipped_items`
take a bitflag instead of a series of booleans as an argument and added
a new one for "include held items", so that we need no longer argue
about whether holding something counts as "equipping" it (in all other
parts of the game than this proc, it does). This is what gives the PR
most of its code footprint, don't be scared.
## Why It's Good For The Game
Items you are holding in your hands _should_ catch fire if everything
else on your person is on fire, and taking an item off of your body to
put it in your hands shouldn't protect it from fire, because those
things don't make intuitive sense.
If we want an item to be able to catch fire when worn, then it should do
so.
This might expose some issues where we were improperly setting the
flammability flags on items, but any weapon which will burn in your
hands now would also have burned if you were wearing it on your belt or
back, so making those issues more visible should be a bonus (we'll also
stop them from burning on your back or belt).
If you see someone holding a piece of paper that you really don't want
them to read you can now set them on fire to stop them from reading it,
whereas previously they would deftly hold the very flammable object out
of reach of their flaming body.
## Changelog
🆑
balance: Items held in your hands can catch fire.
balance: Items you are holding won't catch fire if your hands cannot
catch fire.
balance: When you stop being on fire so will items you are holding.
balance: If you roll around on your burning items they will stop being
on fire.
/🆑
## About The Pull Request
Mouse drag & drop has been refactored into its own attack chain. The
flowchart below summarizes it

Brief summary of each proc is as follows
**1. `atom/MouseDrop()`**
- It is now non overridable. No subtype should ever touch this proc
because it performs 2 basic checks
a) Measures the time between mouse down & mouse release. If its less
than `LENIENCY_TIME`(0.1 seconds) then the operation is not considered a
drag but a simple click
b) Measures the distance squared between the drag start & end point. If
its less than `LENIENCY_DISTANCE`(16 pixels screen space) then the drag
is considered too small and is discarded
- These 2 sanity checks for drag & drop are applied across all
operations without fail
**2. `atom/base_mouse_drop_handler()`**
- This is where atoms handle mouse drag & drop inside the world. Ideally
it is non overridable in most cases because it also performs 2 checks
- Is the dragged object & the drop target adjacent to the player?.
Screen elements always return true for this case
- Additional checks can be enforced by `can_perform_action()` done only
on the dragged object. It uses the combined flags of
`interaction_flags_mouse_drop` for both the dragged object & drop target
to determine if the operation is feasible.
We do this only on the dragged object because if both the dragged object
& drop target are adjacent to the player then `can_perform_action()`
will return the same results when done on either object so it makes no
difference.
Checks can be bypassed via the `IGNORE_MOUSE_DROP_CHECKS` which is used
by huds & screen elements or in case you want to implement your own
unique checks
**3. `atom/mouse_drop_dragged()`**
- Called on the object that is being dragged, drop target passed here as
well, subtypes do their stuff here
- `COMSIG_MOUSEDROP_ONTO` is sent afterwards. It does not require
subtypes to call their parent proc
**4. `atom/mouse_drop_receive()`**
- Called on the drop target that is receiving the dragged object,
subtypes do their stuff here
- `COMSIG_MOUSEDROPPED_ONTO` is sent afterwards. It does not require
subtypes to call their parent proc
## Why It's Good For The Game
Implements basic sanity checks across all drag & drop operations. Allows
us to reduce code like this
8c8311e624/code/game/machinery/dna_scanner.dm (L144-L145)
Into this
```
if(!iscarbon(target))
return
```
I'm tired of seeing this code pattern `!Adjacent(user) ||
!user.Adjacent(target)` copy pasted all over the place. Let's just write
that at the atom level & be done with it
## Changelog
🆑
refactor: Mouse drag & drop attack chain has been refactored. Report any
bugs on GitHub
fix: You cannot close the cryo tube on yourself with Alt click like
before
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
## About The Pull Request
Fixes the admin borg panel's upgrade functionality. Caused by not
registering the signals for deletion and also by the upgrade code
checking the robot's contents instead of upgrades list (since the borg
panel spawns the item in the borg, it appears in the borg's contents,
making the check think the borg already has it installed.)
## Why It's Good For The Game
Easier testing new borg modules
## Changelog
🆑
fix: Fixes admin borg panel upgrade functions
/🆑
## About The Pull Request
Makes the turfs' temperatures be set to their initial values when
fix_air is used on them.
## Why It's Good For The Game
Prevents the turfs from heating the air back up after an admin uses
fix_air on a very hot room.
## Changelog
🆑
admin: fix_air will also fix the turfs' temperatures.
/🆑
## About The Pull Request
As the title says. This should significantly improve the performance of
running lua scripts.
## Why It's Good For The Game
There is a lot of performance overhead in logging each individual
function called by a lua script as can be seen in the following
screenshot:
This is a test done on a local server where I run the
`zombie_controller.lua` script that can be found on the auxlua-cookbook
repository with a lot of AI zombies spawned in.


Logging these calls is not necessary as it doesn't provide any real
information to anyone looking for bad actors. Lua scripts are already
logged when ran and they can be examined to spot if the script being run
is done so in bad faith.
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
1. Removes code duplication
2. Fully documents `sortTim()`
3. Makes a define with default sortTim behavior, straight and to the
point for 95% of cases
4. Migrates other sorts into the same file
5. Removes some redundancy where they're reassigning a variable using an
in place sorter
For the record, we only use timSort
## Why It's Good For The Game
More documentation, easier to read, uses `length` over `len`, etc
Should be no gameplay effect at all
## About The Pull Request
This PR moves random name generation for species onto their languages.
What does this mean?
- For species with a predefined name list, such as Lizards and Moths,
nothing.
- For species without predefined name lists, such as Felinids, their
names will now be randomly generated from their language's syllables.


(In the prefs menu:)

Why?
- Well, we actually had some dead code that did this. All I did was fix
it up and re-enable it.
- Generates some pretty believable in-universe names for various
languages that are lacking name lists. Obviously defined lists would be
preferred, but until they are added, at least.
- Moves some stuff off of species, which is always nice.
- Also hopefully makes it a tad easier to work with name generation.
There's now a standard framework for getting a random name for a mob,
and for getting a random name based on a species.
Misc:
- Adds a generic `species_prototype` global, uses it in a lot of places
in prefs code.
- Makes `GLOB.species_list` init via the global defines
- Deletes Language SS
- Alphabetizes some instances of admin tooling using the list of all
species IDs
- Docs language stuff
- Deletes random_skin_tone, it does pretty much nothin
## Changelog
🆑 Melbert
refactor: Random Name Generation has been refactored. Report any
instances of people having weird (or "Unknown") names.
qol: Felinids, Slimepeople, Podpeople, and some other species without
defined namelists now automatically generate names based on their
primary language(s).
qol: More non-human names can be generated in codewords (and other misc.
areas) than just lizard names.
/🆑
## About The Pull Request
Fixes#82882
## Why It's Good For The Game
Corrects nonintentional regression in expected behavior by re-adding
this verb back to the context menu.
## Changelog
🆑
admin: Possess Object is now back in the right-click context menu.
/🆑
## About The Pull Request
Subsystems currently come in two different flavors:
1. Systems that process at intervals with the master controller
2. Global data containers that do not fire
And I think they should be split up...
This moves 4 non firing, non init subsytems -> datasystem
## Why It's Good For The Game
Clarity in code
## About The Pull Request
See title.
## Why It's Good For The Game
Some admins wanted all the jump verbs back, aswell as making them not
AGhost you.
Also make the Jump To Area verb use a sorted list again
## 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
Cleaned up the SS13.register_signal and SS13.unregister_signal, removing
the weird list shifting.
Also adds a new lua file that can be included for the use of registering
different signals on various datums and being able to clear them all in
1 function.
Removed the make_easy_clear_function option when registering a signal
via lua because I don't think it's used by anyone and it lacks any sort
of versatility. Users can just create their own function for clearing
signals from a datum.
Also updates the documentation for HARDDELETES.md as
COMSIG_PARENT_QDELETING was renamed to COMSIG_QDELETING
## Why It's Good For The Game
New handler file makes registering signals in batches a lot easier if
you want to clear them in one go without clearing unrelated callbacks on
the same datum. The list shifting in SS13.register_signal had pretty
significant performance problems, so removing that will make registering
and unregistering signals faster.
## Changelog
🆑
admin: LUA - Adds a new library called handler_group. Include it in your
files by doing require('handler_group')
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## 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>
## About The Pull Request
Adds a new final objective option with a classic premise; the forced
battle to the death.
The concept is that the Syndicate will provide you with an implanter
tool you can use on an arbitrary number of crew members. Once you have
at least 6 (though there is no ceiling) you can activate the implants to
start the Battle Royale and broadcast the perspectives of everyone you
implanted live to the entertainment monitor.
After activation these implants cause you to explode upon death. If at
the end of 10 minutes, more than one person remains unexploded then all
of the remaining implants will detonate simultaneously.
Additionally, one of the station's departments (Medbay, Cargo, Science,
or Engineering) will be chosen as the arena. If after 5 minutes pass
you're not within that department (or if you leave it after that time
has passed) then you will be killed.
The Syndicate plan on both using the recorded footage to study
Nanotrasen technology, and also to sell it as an underground blood
sport, and so have employed a pirate broadcasting station to provide
colour commentary.
The implantation is silent, however it requires you and your target to
be adjacent and stood still for one and a half seconds.
Once implanted, it will occasionally itch and eventually signal to the
implantee that something is up, so once you start implanting someone
you're on a soft timer until you are given away. You can also implant
yourself if you want to do that for some reason.
Removing an implant from someone has a 70% chance of setting it off
instantly, but it _is_ possible. If the implant is exposed to EMP, this
value is randomised between 0 and 100%. You could also try doing surgery
while the patient is wearing a bomb suit or something, that puzzle is
for you to solve and I'm not going to tell you the answers. I'm sure
you'll think of ones I haven't.
## Why It's Good For The Game
Adds a somewhat more down-to-earth but still hopefully exciting and
threatening option which should let people mess around with the sandbox.
The mutual death element provides some roleplaying prompts; nothing
actually _forces_ you to fight apart from fear of death and it may be
possible to find other ways to survive, or perform some kind of
solidarity behaviour with your fellow contestants. Maybe you'll try that
but one of your fellow contestants just wants to be the last survivor
anyway. Maybe you'll pretend you're setting up some kind of mutual
survivorship thing in order to make sure you're the sole survivor.
Gives some people to watch on the bar TV channel.
The crew apparently love playing Deathmatch while dead so we might as
well enable doing it while alive.
Also I'm going to follow this up with a separate PR to remove the Space
Dragon objective and it felt like it'd be a good idea to do one out one
in
## Changelog
🆑
add: Adds a new Final Objective where you force your fellow crew to
fight to the death on pain of... death.
/🆑
## About The Pull Request
Using these search regexes:
Ending in 0:
`addtimer\((.*),\s?(\d{1,3})0\b\)`
replacement:
`addtimer($1, $2 SECONDS)`
Two digit ending in odd:
`addtimer\((.*), (\d)([1-9])\)$`
replacement:
`addtimer($1, $2.$3 SECONDS)`
Single digit ending odd:
`addtimer\((.*), ([1-9])\)$`
replacement:
`addtimer($1, 0.$2 SECONDS)`
## Why It's Good For The Game
Code readability
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
My lua scripts were hitting the topic byte limit, so this makes file
upload of lua scripts able to bypass the topic limit.
## Why It's Good For The Game
Removes arbitrary restriction on how big a lua file can be in bytes.
## Changelog
🆑
admin: Admins can now run lua files bigger than 36 KB by importing them
directly.
/🆑
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.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
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
Lua errors don't get logged when `call_function` is called
Timer.start_loop was just straight up broken due to me not properly
testing it, so this fixes that.
## Why It's Good For The Game
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
Makes debugging lua scripts easier. Also fixes bugs.
## 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. -->
🆑
fix: Fixed lua error logging.
fix: Fixed the SS13.start_loop function not working properly.
/🆑
<!-- 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. -->
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
Refactors a lot of the unused defines.
## Why It's Good For The Game
Refactors a lot of the unused defines.
## Changelog
Nothing player facing
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Lua uses the timer subsystem, which can end up holding the entire timer
subsystem if lua is creating a lot of timers.
The solution to this is to use an internal scheduler instead so that the
load gets placed onto the lua subsystem.
## Why It's Good For The Game
Performance improvement when using lua scripts.
## Changelog
🆑
refactor: Auxlua no longer uses the timer subsystem to get stuff done,
lua scripts shouldn't slow down timers anymore.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
What it reads on the tin. `puzzle_id` vars and the such are now
supported by the map exporting verb.
## Why It's Good For The Game
If anyone ever so wishes to export maps with puzzle doors and stuff.
## Changelog
N/A
When I made SSpolling, jlsnow gave me his blessing to delete the orbit
polling component [where you orbit something for 20 seconds before it
chooses a ghost from the orbiters]
It's only used in a few places like soulstones replacing
jobbanned/inactive players, etc.
Also upgraded SSpolling; you can now place a little icon on the sides in
the chat message, chat message looks a lot nicer, the alert pic and the
jump target don't have to be the same anymore, and I made it be able to
pre-pick candidates since 90% of the use cases would just want 1
candidate
Also prints to chat who the chosen one was
Also made slime intelligence potions ask the user for a reason, which
will be displayed in the alert poll
## About The Pull Request
This is not player-facing, however it's a good QOL that i made for
downstream modular ruins. The pick-list of maps makes it a bit..
annoying to really grab a ruin quickly - so all this does is add an ID
to the front of them for Space, Lava and Ice respectively.
## Why It's Good For The Game
## Changelog
:cl:Zergspower
admin: renames ruin names to have an identifier in front of it
refactor: converts map plate and jump to ruin to tguilist
/🆑
## About The Pull Request
Remakes a button in admin secrets panel from everyone is traitor to
everyone is admin chosen antag.
## Why It's Good For The Game
Slightly better buttons for admin to push
## Changelog
🆑
admin: remade everyone is traitor into everyone is antag in secrets
panel
/🆑
## About The Pull Request
You can now get station goals in a slightly better way over using a
`locate() in` call on a global list.
The Meteor Satellite goal no longer stores a giant list of ALL OBJECTS
in view. And now correctly only counts turfs.
## Changelog
🆑
fix: Meteor Satellites no longer erroneously count every piece of paper
as a protected turf.
fix: As a result the station goal is slightly more difficult
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Newspapers work as a static newscaster that is not affected by things
like D-notices and changing wanted issues after its been printed. It
doesn't store comments or get any updates after its been printed.
You can also scribble on the paper to leave notes on a specific page,
which is a feature I have never seen in my life but it is still here I
guess.
Minor things I've added:
- Sound effect when printing the newspaper in the first place
- 2 second do-after when scribbling just for some player feedback and
consistency
- Balloon alerts
- Context tips for scribbling and burning
I also fixed an issue with wanted issues on newscasters when there isn't
an image.
As a minor note, I replaced the instances of ``content`` in Buttons I
saw in newscaster's UI because it's marked as deprecated.
Too lazy to take a video sorry



## Why It's Good For The Game
Fixes an issue with newscasters and makes newspapers use a nice TGUI
that feels more responsive than before.
Helps further https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA even more.
## Changelog
🆑
refactor: Newspapers now use TGUI.
fix: Fixed the newscaster's wanted section showing a non-existent photo.
/🆑
## About The Pull Request
Yello!
This one is reasonably quick, tho I did some fixes too
This is the big one, fixes the buildmode tool sometimes locking disabled
for the whole round.
We do this by replacing the static var on buildmode with global var and
a global proc
This keeps a harddel on the buildmode datum from permalocking is_running
to TRUE
Also makes flipping the var BACK if something breaks significantly
easier for admins, so that's nice
Alright, smaller things now
Fixes lists of numbers failing to encoded improperly This was fixed on
shiptest, we failed to actually port their most recent revision
Fixes the shuttle flag not actually working because it used istype
instead of ispath
Changes obj_blacklist to a typecache for optimization's sake
Renames/moves some vars around to prevent weird double typing things
Removes a checktick in key gen, it's just costing more time then it
would save in overtime
Properly handles lists. We were only doing var encoding one layer deep,
need to do it alll the way down
Alright, now the optimizations
This proc is fucking HOT, and it's for really dumb reasons
This is a text gen proc, and it makes the mistake of generating text and
concatinating it with MORE text.
This is HORRIFICALLY EXPENSIVE because byond caches strings (can only be
one of each) and string churn fucks up that caching system something
fierce
Moving from strings to lists of strings we join at the end takes us from
like idk 100 seconds to save bare metastation to like 1.5
This is applied basically everywhere for obvious reasons
While I'm here, storing keys in a flat list and then using find to find
them, then using that index to lookup into another flat list is a bit
silly. Let's just make it an assoc list. Faster lookup, cleaner.
Oh also rather then iterating over all the vars on an object, let's
iterate over just the ones we care about yeah?
Let's see... no sense genning a key we'll never use, and having suffixes
be often non existent is silly just embrace the slight mess.
That's it I think, this takes us from 100 seconds to save metastation to
2.5 seconds to save ALL of metastation (I removed the vars limiter so I
could make sure var saving didn't fuck me up)
## Why It's Good For The Game
Cleans up some issues that we failed to port the fixes for, MASSIVELY
optimizes this (so it can finish in like 5/10 seconds and not 300!) and
ensures admins can always use the thing and don't risk dropping their
pet buildastation to the void.
Worth noting, this tool really should not be used for station mapping
outside an event context. It produces sorta buggy var edits, and WILL
fail to pull over context for shit. Please don't use it as such
Profiles (csv files I promise)
[Before](https://github.com/tgstation/tgstation/files/13853313/profiler.json)
[After](https://github.com/tgstation/tgstation/files/13853271/profiler.json)
I'd include my line by lines but I don't know how much you'd get out of
them. Here's an image tho

## Changelog
🆑
fix: The map saving tool will no longer lock up and prevent all further
action at random
fix: Map saving now takes on the order of seconds, not minutes
fix: Fixes an issue with lists that caused strongdmm to report saved
maps as broken
/🆑
## About The Pull Request
Situation: areas have a list of all turfs in their area.
Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune
Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.
replaces `area.get_contained_turfs()` with a few new procs:
* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.
The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.
## About The Pull Request
Goes through and changes some `in area` / `in a` loops to use
`get_contained_turfs` to cut down on `in_world` loops. Saves some free
lag.
## Changelog
🆑 Melbert
fix: Some things which affect everything in an area are less laggy, the
"all lights are broken" station trait especially
/🆑
## About The Pull Request
The base for the PR was taken from
https://github.com/shiptest-ss13/Shiptest/pull/206 and thank them for
that.
The point of this verb is to save pieces of the map to your computer for
further use. It's not that necessary, but rarely, it can be useful.
[Video](https://i.imgur.com/M6mdDTC.mp4)
## Why It's Good For The Game
Transferring buildings from one round to another, preserving the decor
made in the game.
## Changelog
🆑 Vishenka0704
admin: The ability to export a part(or z-level) of the map has been
added.
/🆑
## About The Pull Request
After https://github.com/tgstation/tgstation/pull/80628, these shouldn't
be needed anymore right?
## Why It's Good For The Game
Cleans up some vestigial code
## Changelog
EDIT: Not player-facing.
## About The Pull Request
Revived my old PR https://github.com/tgstation/tgstation/pull/68901
Replaces the annoying tgui alert popup "Do you want to be X? | Yes | No
| Never for this round" that is hard to read and steals window focus,
with a nice clean alert in the top right that counts down. If it's the
same event/mob they stack with 2x, 3x, etc. It also shows how many
candidates/ghosts are signed up.
The poll alerts have screentips too, they countdown and show if you're
signed up, how many people are signed up, if you chose "never for this
round" (which is cancelable)
## Why It's Good For The Game

Way easier to see what role is available, you get a nice pic of the role
and get it's name in big text, you can cancel "never for this round",
and you can cancel signing up for a role before the timer is up
## Changelog
🆑
refactor: Ghost roles now offer ghosts a clickable poll button. Ghosts
can select a role, deselect it, alt-click it for "Never For This Round",
can cancel "Never", can see the countdown, and can see how many other
people are signed up for the role poll.
/🆑
## About The Pull Request
The current admin announce is just notice span text, which is easily
missed mixed in with all the other white noise of the chat box.
Currently admins have to fill it with linebreaks or manually add their
own spans to increase visibility.
This updates the admin announcement proc to use the new alert box divs,
similar to other announcements, making it more visible.
## Why It's Good For The Game
Admin server-wide announcements are generally things you want the
players to notice

## Changelog
🆑 LT3
admin: Server wide admin announcements now use an alert box like other
announcements
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
as we added a command role that isn't a head of staff, itd be good to
untie some checks from the command department
so i added a job flag for that, and moved what made sense to different
traits that are added to head of staff minds
## Why It's Good For The Game
revs (the gamemode not the players) shouldnt care about the bridge
assistant existing
## Changelog
🆑
fix: bridge assistant no longer passes some head of staff checks
qol: if you steal a command member's liver, you can now sabre better!
/🆑
## About The Pull Request
adds a station trait which adds a new role, the bridge assistant
he is designed to help commandeer the bridge and help out other heads
when needed. he is armed with the mini energy gun (the one heads used to
have on kilostation), a flash, a toolbelt (with an inducer), some cool
shades and a swanky scarf.
as he is a nerd he is weak and unable to twohand weapons, preventing him
from wielding the fire axe.
currently he does not have a mindshield but he cannot roll antag
he currently has access to the bridge, announcement console, eva,
teleporter, gateway, maint, and a weapon permit (somewhat (not really
other than for nerds) interestingly this is the first job that isnt
assistant that doesnt have access to any lathes, so he doesnt have orm
access unlike all the other jobs (except assistant))
the trait also makes a coffee machine spawn on the bridge
here is some useful art of your role

and ingame screenshots



## Why It's Good For The Game
Adds upon the station trait job system with a straight forward role that
IS just a human (unlike the cargorilla), and is pretty basic with no
custom assets or whatever other than hud icons
Having the bridge assistant in some rounds seems like a neat way to
protect it since it gets fucked up in like half the time, while also not
having enough mechanical depth or gameplay as to warrant it as a
permanent role
## Changelog
🆑
add: Bridge Assistant job accessible from a station trait.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request

this shit is UGLY to see in Discord, let's not automatically bake in
`span_admin()` every time we send this stuff out and only use it in the
context where it matters (sending the message results `to_chat()` to an
admin who is actually in the game)
## Changelog
irrelevant