## About The Pull Request
- Departmental orders are now an NTOS app
- To download, they require `ACCESS_COMMAND`.
- To use, they require one access from the department.
- This means you cannot order things from not-your-department unless you
have an ID.
- When newly downloading the app, it will prompt a head of staff to
insert an ID, to determine which department to be linked to.
- Changes chat room overlay from the kind that AI uploads use to a new
icon.
- Minor refactors to department order in general.


## Why It's Good For The Game
These two computers are surprising waste spacers for two things which
are tied together.
So why not combine them?
The lesser used cargobus chat is still there, and departmental orders
are front and center.
This gives mappers a ton more leeway when mapping departments out and is
overall less clutter.
## Changelog
🆑 Melbert
qol: Cargobus chat console and Departmental Order console are now
combined into one.
qol: Mod PCs active on the "chat client" apps no longer look like AI
uploads (and now have their own sprite)
refactor: Departmental order consoles were refactored a bit, report any
oddities.
/🆑
## About The Pull Request
Removes the camera assembly structure middleman between the camera
wallframe and camera machine. All its behavior has been instead moved to
the camera, and I've tried to keep as much of the behavior the same as
before.
This also fixes the issue that camera assemblies had where, upon the
construction being finished, it would move itself into the newly
finished camera machine, therefore taking itself off a wall, therefore
deconstructing itself. This resulted in 2 piece of iron being in each
camera machine (except roundstart ones), and because camera machines
rely on the assembly inside of them for upgrades and such, upgrading
didn't work at all.
I've also made camera nets use defines (not in map) so it's easier to
find a list of them all, and tried to add autodoc comments to nearly
every var in camera code.
## Why It's Good For The Game
Removes copy paste and spaghetti code between structure and machine
camera, thus making it easier to work around with.
Closes https://github.com/tgstation/tgstation/issues/79019
## Changelog
🆑
fix: Cameras built in-round can be upgraded again.
fix: Deconstructing cameras now more consistently return to you the
upgrades inside of the camera.
fix: RD's telescreen can now properly see Ordnance cameras again.
fix: [Deltastation] Library art gallery no longer has an invisible
camera.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Adds a photobooth machine to the HoP line which can be used to update
your security records photo.
It updates the records of the person's name, which means hiding your
identity and wearing an ID will let you change other people's photos. If
you aren't hiding your identity and are wearing someone else's ID, it
won't update at all because it will be unable to find your record.
There's 2 variants of this machine, one at the HoP line that's tied
behind Law Office access (so Lawyers have an extra thing they can help
out with if no one's available, but maybe it would be better behind
Library access since Curators are our "photographer" role?), and the
Security one that requires Security access.
The Security one has a special feature that it adds a height chart
behind the player.

This machine is used by either right-clicking on it or by pressing a
button, so the HoP can do it remotely from their line (except on Tram
where it's in the library), and after a few delays it'll update your
records automatically to how you look like.
Emagging the machine will remove its access restrictions but every time
it updates your photos it will spam camera flashing and blind you.
Sprites
Open

Closed

Security version on the left, has a red tint on it

Video demonstration (old sprites):
https://github.com/tgstation/tgstation/assets/53777086/a2e59f08-2d58-4f5b-b081-e137c7606d35
## Why It's Good For The Game
Current security records has no way to change your photo ID, something
that was a feature before it was moved to TGUI. The only alternative is
to fully delete your record and make a new one with a photo and the same
name, but this shares a major issue with the HTML UI: You're immediately
sold out by the fact you have a background. No matter how well you try
to cover your tracks, any security officer looking at records will see
you are the only photo on the manifest that has a background and even a
camera in your hand, which makes it impossible to get away with it
unless security essentially takes pity on you.
This opens up the ability to fully mask yourself in records, finally.
This is also better even for non antagonists because you can now
properly update your photos to match what you look like in the event of
an appearance change or even just a job change, which makes it a benefit
for HoPs who likes to keep records as up-to-date as possible.
## Changelog
🆑 JohnFulpWillard, Twox
add: Added a new photobooth machine to the HoP's line.
fix: Things checking for access now checks your off hand, too.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Fixes#76495
This PR prevents (most) screen elements from running base
`/atom/proc/Click` and `/mob/proc/ClickOn()` when clickend.
(The only exception I found to it was the cursor catcher for scopes.)
Why?
Most, if not everything in `ClickOn` is considered "in world"
interacting. It abides by `incapacitated`, runs `faceAtom`, etc.
This means, currently, you can "interact" with screen elements using in
world elements. For example, TK-ing / pointing a gun at your mood face.
Right now this affects very little, but there is a large potential for
errors. All you have to do is forget a sanity check in `afterattack` and
suddenly you have an item that can affect your screen objects.
The only example I found was the `/item/godstaff`, which can color some
of your screen elements. But there may be more. Like guns.
Note:
Many, many screen elements ALREADY do not fall down into atom click.
They simply don't call parent. Which is totally fine.
I am just ensuring ALL* screen elements do not fall down into atom
click.
## Changelog
🆑 Melbert
fix: Blocks mobs from trying to "physically" interact with some of their
hud elements, such as using Telekinesis or point a gun at your mood
meter.
/🆑
## About The Pull Request
**1. Qol**
- Adds examines & screentips for screwdriver, crowbar & wrench acts.
- Adds examines & screentips for inserting, replacing & removing beaker,
Also for inserting items from bags or directly
- Adds an off icon overlay for when the reagent grinder is either
screwed open or loses power,
**2. Code Improvements**
- Replaced `attackby()` with `item_interaction()` so we can end the
attack chain early for non combat operations like inserting beakers/
ingredients for grinding etc.
- Removed custom shake animations & replaced it with the global
`Shake()` proc cause it did the same thing
- Removed constructed version of reagent grinder. We instead just check
`mapload` to see if we need the beaker to be created or not for round
start reagent grinders
- Grinding & Juicing use the same `operate_for()` rather than having
seperate procs for each operation
- Removed trait `TRAIT_MAY_CONTAIN_BLENDED_DUST`. Why do we have this?
Its just used to change the grinder description to warn it may contain
dust. It's a waste.
**3. Fixes**
- You cannot insert hologram items into the grinder. Rather than
destroying that item & making it vanish you simply won't be allowed to
put it inside the grinder so you can save that item
- You can hit the grinder with items like screwdriver, wrench, crowbar,
beaker & even with stuff you would normally put in the grinder when in
combat mode
- Adds `can_interact()` checks for using the UI & other stuff
- Fixes#46356. All items of type `obj/item/grown` can be put from any
bag into the grinder
- The item "and its contents" are now grinded/juiced recursively to get
all the reagents it has to offer just like a real grinder would
- An AI/Human with AI access examining the reagent grinder now actually
works.
**4. Refactors**
- The grinder now measures its available capacity based on the "total
weight" of all items present & not its number. This is more realistic
because the grinder has limited space inside & so inserting huge items
should have greater impact rather than deciding on an arbitrary number
like 10(The grinder having the capacity for 10 items of any size inside
its small compartment makes no sense). Examines are displayed to show
how much capacity of the grinder has been filled. Upgrading the grinder
with better matter bins will allow for higher storage capacities.
- Total power consumed is measured based on the duration & weight of all
items grinded cause you know its realistic.
🆑
qol: adds examines & screentips for tool acts & other operations for
reagent grinder
qol: adds an off icon for when the grinder panel is open/not powered
code: auto docs vars & procs. Shared common proc for grinding or juicing
code: removed trait for blended dust, changed some item interactions to
end the attack chain early & save time
fix: no inserting hologram items into the reagent grinder
fix: you can hit the reagent grinder tools like screwdriver, wrench,
crowbar & even beakers/ingredients etc when in combat mode
fix; adds sanity checks for when & how mobs interact with the reagent
grinder
fix: examining a reagent grinder by an AI/Human with AI access now
actually works.
fix: you can insert Nova flowers & other food items from any bag type
fix: reagent grinder now grinds all the contents of an item recursively
to produce maximum reagents like a real grinder would
refactor: reagent grinder now measures available capacity to store items
as total weight of stored items & not number. Capacity can be increased
with upgraded matter bin
refactor: reagent grinder power usage is now a function of duration &
total weight of items blended, meaining blending more number of
items/larger items will consume more power
refactor: reagent grinder code has been optimized overall. Report bugs
on github
/🆑
---------
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
<!-- 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
Add w_class flag with WEIGHT_CLASS_SMALL, so surgery caps now small
items.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
Surgery cap IRL can be easily folded or crumped, so it can can be in
space station.
Also surgery cap now can be put in medical belt, like gloves or medical
mask.
And also I think that normal size instead of small is too much for
decorative cap, that do nothing.
<!-- 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. -->
## 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. -->
🆑
qol: makes surgery cap small
/🆑
<!-- 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
Continuation of #82198
Fixes these issues in #82196
- Borg hypo spray
- Borg projectile dampen
- Borg chameleon
- Firelance
- MODlink scryer
- Emergency light usage
## Changelog
🆑
fix: Fixed more energy usages for cells(Part 3). See PR 82204 for
details
/🆑
---------
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
Continuation of #82197.
Fixes these issues in #82196
- Cyborg self repair
- Cyborg lollipop dispenser
- Mauna mug
- Plasma cutter (Initial charge not the number of laser shots so partial
fix)
## Changelog
🆑
fix: Fixed more energy usages for cells(Part 2). See PR 82198 for
details
/🆑
---------
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
Yeah i am not about to create 30 different PR's to address 1 issue at a
time. The changes are small enough to be grouped together in bulk.
This fixes the following issues specified in #82196
- Borg & exosuit RCD (Fixes#82193)
- Motorized wheelchair
- Canister shielding
- Electrolyser
- Potato cell
- Space heater
- Microwave
## Changelog
🆑
fix: Fixed cell energy usage for a bunch of stuff(Part 1). See PR 82197
for details
/🆑
---------
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
### Alternate title: "Label Hoarding PR"
You ever just want to add sounds to a thing and then end up just
refactoring half of the damn thing?
Yeah.
Anyhow.
So in rough chronological order!
### Putting items in racks actually plays the sounds
Picking things up from racks plays their pickup sound, but putting them
on them doesn't. Just dropping it or putting it on tables does make the
right sounds. This seems to be because of a `silent` parameter in
`transferItemToLoc` that's set by tables but not racks.
```dm
(/code/game/objects/structures/tables_racks.dm, line 273)
if(user.transferItemToLoc(I, drop_location(), silent = FALSE))
(/code/game/objects/structures/tables_racks.dm, line 867)
if(user.transferItemToLoc(W, drop_location()))
```
Adding this makes it work just fine.
```dm
(/code/game/objects/structures/tables_racks.dm, line 867)
if(user.transferItemToLoc(W, drop_location(), silent = FALSE))
```
### Attackby single letter parameters, 1 instead of TRUE
Then, I noticed `attackby` just returns `1` to mean true after calling
`transferItemToLoc`, when we just have the more readable `TRUE`.
Similarly it uses a single letter parameter `W`, which on its own is
already unreadable, but is also mismatched with the parent proc using
`attacking_item`.
```dm
(/code/game/objects/structures/tables_racks.dm, line 859-868)
/obj/structure/rack/attackby(obj/item/W, mob/living/user, params)
var/list/modifiers = params2list(params)
if (W.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION) && LAZYACCESS(modifiers, RIGHT_CLICK))
W.play_tool_sound(src)
deconstruct(TRUE)
return
if(user.combat_mode)
return ..()
if(user.transferItemToLoc(W, drop_location()))
return 1
(/code/_onclick/item_attack.dm, line 133-136)
/atom/proc/attackby(obj/item/attacking_item, mob/user, params)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, params) & COMPONENT_NO_AFTERATTACK)
return TRUE
return FALSE
```
So we change it `1` to `TRUE` and `W` to `attacking_item` to make it
more readable!
### Don't let them try to put Abstract items
While looking over the table code, though, I also noticed it has a check
for the `ABSTRACT` item flag when placing items. Having tested this, we
add this too for consistency and to avoid awkward situations down the
line.
```dm
(/code/game/objects/structures/tables_racks.dm, line 272-273)
if(!user.combat_mode && !(I.item_flags & ABSTRACT))
if(user.transferItemToLoc(I, drop_location(), silent = FALSE))
(/code/game/objects/structures/tables_racks.dm, line 859-868)
/obj/structure/rack/attackby(obj/item/attacking_item mob/living/user, params)
var/list/modifiers = params2list(params)
if (attacking_item.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION) && LAZYACCESS(modifiers, RIGHT_CLICK))
attacking_item.play_tool_sound(src)
deconstruct(TRUE)
return
if(user.combat_mode || attacking_item.item_flags & ABSTRACT)
return ..()
if(user.transferItemToLoc(W, drop_location()))
return TRUE
```
### Split off rack structure attackby wrenching into wrench_act procs
But that's still kind of bad! But wait, we have procs for wrenching
actions, so it should really be in there.
So we move this to its own proc.
```dm
(/code/game/objects/structures/tables_racks.dm, line 850-855)
/obj/structure/rack/wrench_act_secondary(mob/living/user, obj/item/tool)
if(obj_flags & NO_DECONSTRUCTION)
return FALSE
tool.play_tool_sound(src)
deconstruct(TRUE)
return ITEM_INTERACT_SUCCESS
(/code/game/objects/structures/tables_racks.dm, line 857-861)
/obj/structure/rack/attackby(obj/item/attacking_item mob/living/user, params)
if(user.combat_mode || attacking_item.item_flags & ABSTRACT)
return ..()
if(user.transferItemToLoc(W, drop_location()))
return TRUE
```
### Split off rack item attackby wrenching into wrench_act procs,
include sounds
But the _item_ can also be deconstructed, and sure enough, it does the
same thing.
```dm
(/code/game/objects/structures/tables_racks.dm, line 920-925)
/obj/item/rack_parts/attackby(obj/item/W, mob/user, params)
if (W.tool_behaviour == TOOL_WRENCH)
new /obj/item/stack/sheet/iron(user.loc)
qdel(src)
else
. = ..()
```
So we give this the same treatment, and include a `deconstruct` method
rather than just having it be separate. We also play the tool sound for
consistency with deconstructing the rack structure.
```dm
(/code/game/objects/structures/tables_racks.dm, line 948-953)
/obj/item/rack_parts/wrench_act(mob/living/user, obj/item/tool)
if(obj_flags & NO_DECONSTRUCTION)
return FALSE
tool.play_tool_sound(src)
deconstruct(TRUE)
return ITEM_INTERACT_SUCCESS
(/code/game/objects/structures/tables_racks.dm, line 955-958)
/obj/item/rack_parts/deconstruct(disassembled = TRUE)
if(!(obj_flags & NO_DECONSTRUCTION))
new /obj/item/stack/sheet/iron(drop_location())
return ..()
```
Note: this makes it so it only deconstructs rack items on left click. I
think that's perfectly fine.
### Ancient code removal
Now we get to the fun part! Ancient code.
When removing the single letter parameters from `attackby` previously, I
thought I might as well remove other such instances while we're at it.
This gets us to `MouseDrop_T`.
```dm
(/code/game/objects/structures/tables_racks.dm, line 850-857)
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
. = ..()
if ((!( isitem(O) ) || user.get_active_held_item() != O))
return
if(!user.dropItemToGround(O))
return
if(O.loc != src.loc)
step(O, get_dir(O, src))
```
What the fuck?
Right so, this lets us click-drag-drop an item onto the rack, but only
for our active item. And it just drops it and steps it in the right
direction.
So we just, we just kill it. We just kill it.
You can just click on the rack to do functionally the exact same thing,
so we just kill it.
It's blocking us from dumping storage item contents, so just.
We Just Kill It.
We Just Fucking Kill It.
### Combat mode kicking
Anyhow! With that out of the way, we move to the finishing touches:
usage context and kicking!
While writing up context I was reminded that currently clicking on a
rack with an empty hand would just, kick it, regardless of combat mode.
```dm
(/code/game/objects/structures/tables_racks.dm, line 873-882)
/obj/structure/rack/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(.)
return
if(user.body_position == LYING_DOWN || user.usable_legs < 2)
return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
user.visible_message(span_danger("[user] kicks [src]."), null, null, COMBAT_MESSAGE_RANGE)
take_damage(rand(4,8), BRUTE, MELEE, 1)
```
This is awkward, misclick a few times and you've kicked it back into
item form.
So we make it only kick it while in combat mode to avoid this.
```dm
(/code/game/objects/structures/tables_racks.dm, line 880-889)
/obj/structure/rack/attack_hand(mob/living/user, list/modifiers)
(...)
if(!user.combat_mode || user.body_position == LYING_DOWN || user.usable_legs < 2)
return
(...)
```
### Usage context
Then finally! Usage context!
This part's easy, just copying over the logic from tables and making it
show deconstruct context for the rack structure and item and
construction context for the item.
```dm
(/code/game/objects/structures/tables_racks.dm, line 840-851)
/obj/structure/rack/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
if(isnull(held_item))
return NONE
if(!(obj_flags & NO_DECONSTRUCTION))
if(held_item.tool_behaviour == TOOL_WRENCH)
context[SCREENTIP_CONTEXT_RMB] = "Deconstruct"
. = CONTEXTUAL_SCREENTIP_SET
return . || NONE
(/code/game/objects/structures/tables_racks.dm, line 931-946)
/obj/item/rack_parts/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
if(isnull(held_item))
return NONE
if(held_item == src)
context[SCREENTIP_CONTEXT_LMB] = "Construct Rack"
. = CONTEXTUAL_SCREENTIP_SET
if(!(obj_flags & NO_DECONSTRUCTION))
if(held_item.tool_behaviour == TOOL_WRENCH)
context[SCREENTIP_CONTEXT_LMB] = "Deconstruct"
. = CONTEXTUAL_SCREENTIP_SET
return . || NONE
```
And then don't forget to register said context.
```dm
(/code/game/objects/structures/tables_racks.dm, line 834-838)
/obj/structure/rack/Initialize(mapload)
. = ..()
AddElement(/datum/element/climbable)
AddElement(/datum/element/elevation, pixel_shift = 12)
register_context()
(/code/game/objects/structures/tables_racks.dm, line 927-929)
/obj/item/rack_parts/Initialize(mapload)
. = ..()
register_context()
```
And that's all!
Now please remind me not to be _this_ comprehensive again.
Not for something that's less than thirty lines, at least.
Thanks.
## Why It's Good For The Game
Doing this in chronological order.
First off, it's wonky that putting say a toolbox on a table or the
ground makes sound but putting it in a rack is perfectly silent,
especially when taking it from the rack isn't. This makes it consistent
with tables.
Returning TRUE is more readable than returning 1. Single letter
parameters are awful for readability, _especially_ when inconsistent
with the parent parameters. This resolves those.
It shouldn't let you attempt to place items tagged with `ABSTRACT`, as
you shouldn't be able to place those. This makes it consistent with
tables.
We have procs for wrench actions, better to use those than implementing
your own wrench checks in `attackby`. This makes it do so.
It's just nice to have a deconstruction sound, so this makes
deconstructing the item also play the sound of the used tool.
The ancient rack code we're removing is entirely just a more awkward way
of doing what we can already do without it, it only let you drag your
active item onto them, _but you can just click_. It was awkwardly
implemented, and blocked anything from doing its own click-drag onto
surface thing like say storage dumping contents.
Usage context is just nice to have. This adds context for deconstructing
to the rack structure and for deconstructing and constructing to the
rack item.
## Changelog
🆑
refactor: Touched most of the code for racks. It should function almost
entirely the same save for what's noted here, please report any issues.
code: Wrenching moved to wrenching procs. Side-effect, rack items are
only deconstructed on left-click
sound: Items that have sounds make them when placed on racks, much like
when placed on tables.
sound: Rack items now make a sound upon deconstructing them.
fix: Racks no longer let you attempt to place abstract items like the
slap hand or water tank spray nozzles on them.
qol: Clicking on a rack no longer kicks the shit out of it if you don't
actually have combat mode on.
qol: Racks and rack items have hover tooltip usage context.
del: Killed ancient rack code for dragging your active item onto a rack.
Just click it does the same thing. This allows you to actually dump
items onto racks, though currently disorderly.
/🆑
## About The Pull Request
https://github.com/tgstation/tgstation/pull/81579 overlooked some areas.
I suspect there are others. We'll find them eventually I'm sure.
## Why It's Good For The Game
These values weren't utilizing any define, so when power itself was
changed to use not only a define but one with a value immensely
disproportionate to the magic numbers added to these items, well...you
get these problems.
## Changelog
🆑
fix: Crank weapons now can actually be charged using their crank.
fix: Stun batons and their variants now actually meaningfully consume
charge when used.
/🆑
---------
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
Fixes flamethrowers by setting maxdecimals to 9 instead of INFINITY for
si unit formatting for its logging, and adds parenthesis in the ternary
operator.
## Why It's Good For The Game
Closes#82200
So flamethrowers work.
## Changelog
🆑
fix: Fixes flamethrower runtime preventing them from working.
/🆑
## About The Pull Request
The gold and silver crates desc now accurately reflects NT corporate
greed
## Why It's Good For The Game
More lore correct crate
## Changelog
🆑
qol: Gold and silver crates now accurately reflects NT's greed
/🆑
## About The Pull Request
you can no longer burn multiple at once to get a long name (definitely
unintentional)
some code shuffling
no more one letter variables
also no harddel
## Why It's Good For The Game
fixes#82158
## Changelog
🆑
fix: the virgin mary picture no longer makes its initiates harddelete
/🆑
## About The Pull Request
First examine block is roundstart examine, second one is as a disguised
Changeling

This PR adds the icon of the ID at the very bottom, something that was
forgotten about when ID trimming was introduced.
## Why It's Good For The Game
Removes a tell from disguised changelings by seeing that they have an ID
but no icon at the bottom of the examine list.
## Changelog
🆑
fix: Changelings with a flesh ID now properly show the icon of the
disguised ID in examine.
/🆑
## About The Pull Request
Wooden crates are now deconstructed with a crowbar. Cardboard crates are
now deconstructed with wirecutters. The context tips for deconstruction
are determined by the required tool now.
## Why It's Good For The Game
It doesn't make sense to deconstruct those crate types with a welder,
they would just burn. The logic for different cutting tool types was
already in there, and mentioned in a comment, but the variable was not
assigned to the sub types; I also changed the context tip to use that
instead of checking the held item for welder behavior.
## Changelog
🆑
add: Crowbars/wirecutters now deconstruct wooden/cardboard crates/boxes
/🆑
## About The Pull Request
Removes all arbitrary energy and power units in the codebase. Everything
is replaced with the joule and watt, with 1 = 1 joule, or 1 watt if you
are going to multiply by time. This is a visible change, where all
arbitrary energy units you see in the game will get proper prefixed
units of energy.
With power cells being converted to the joule, charging one joule of a
power cell will require one joule of energy.
The grid will now store energy, instead of power. When an energy usage
is described as using the watt, a power to energy conversion based on
the relevant subsystem's timing (usually multiplying by seconds_per_tick
or applying power_to_energy()) is needed before adding or removing from
the grid. Power usages that are described as the watt is really anything
you would scale by time before applying the load. If it's described as a
joule, no time conversion is needed. Players will still read the grid as
power, having no visible change.
Machines that dynamically use power with the use_power() proc will
directly drain from the grid (and apc cell if there isn't enough)
instead of just tallying it up on the dynamic power usages for the area.
This should be more robust at conserving energy as the surplus is
updated on the go, preventing charging cells from nothing.
APCs no longer consume power for the dynamic power usage channels. APCs
will consume power for static power usages. Because static power usages
are added up without checking surplus, static power consumption will be
applied before any machine processes. This will give a more truthful
surplus for dynamic power consumers.
APCs will display how much power it is using for charging the cell. APC
cell charging applies power in its own channel, which gets added up to
the total. This will prevent invisible power usage you see when looking
at the power monitoring console.
After testing in MetaStation, I found roundstart power consumption to be
around 406kW after all APCs get fully charged. During the roundstart APC
charge rush, the power consumption can get as high as over 2MW (up to
25kW per roundstart APC charging) as long as there's that much
available.
Because of the absurd potential power consumption of charging APCs near
roundstart, I have changed how APCs decide to charge. APCs will now
charge only after all other machines have processed in the machines
processing subsystem. This will make sure APC charging won't disrupt
machines taking from the grid, and should stop APCs getting their power
drained due to others demanding too much power while charging. I have
removed the delays for APC charging too, so they start charging
immediately whenever there's excess power. It also stops them turning
red when a small amount of cell gets drained (airlocks opening and shit
during APC charge rush), as they immediately become fully charged
(unless too much energy got drained somehow) before changing icon.
Engineering SMES now start at 100% charge instead of 75%. I noticed
cells were draining earlier than usual after these changes, so I am
making them start maxed to try and combat that.
These changes will fix all conservation of energy issues relating to
charging powercells.
## Why It's Good For The Game
Closes#73438Closes#75789Closes#80634Closes#82031
Makes it much easier to interface with the power system in the codebase.
It's more intuitive. Removes a bunch of conservation of energy issues,
making energy and power much more meaningful. It will help the
simulation remain immersive as players won't encounter energy
duplication so easily. Arbitrary energy units getting replaced with the
joule will also tell people more meaningful information when reading it.
APC charging will feel more snappy.
## Changelog
🆑
fix: Fixes conservation of energy issues relating to charging
powercells.
qol: APCs will display how much power they are using to charge their
cell. This is accounted for in the power monitoring console.
qol: All arbitrary power cell energy units you see are replaced with
prefixed joules.
balance: As a consequence of the conservation of energy issues getting
fixed, the power consumption for charging cells is now very significant.
balance: APCs only use surplus power from the grid after every machine
processes when charging, preventing APCs from causing others to
discharge while charging.
balance: Engineering SMES start at max charge to combat the increased
energy loss due to conservation of energy fixes.
/🆑
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.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
Resprites everything that used to use the old gangtool sprites (door
remotes, augment choice beacon, landing zone designators, and nuke op
borg spawners.)

- Added a new non-gangtool generic choice beacon, and a specific
S.E.L.F. one.
- Door remotes are now fancy garage door openers.
- Landing designators have cannibalised the cell phone sprites from the
less old version of gang.
- Nuke op borg spawners use the same walkie talkie as other
reinforcements
Door remotes now have individual sprites for each mode, so you can see
the mode at a glance.
## Why It's Good For The Game
Having a range of very different items sharing the same old sprites is
pretty confusing, better to have them all be unique and up to date.
## Changelog
🆑
image: Everything that used the old gangtool sprites (door remotes,
landing field designators, some choice beacons, windicate borg
reinforcements) has been resprited.
image: Door remotes now visibly show their current mode.
/🆑
## About The Pull Request
- Fixes#82060
We don't need information about the cost & delay. Just enough to know
the intent behind the action

This also removes the 2nd argument in `log_tool()` because it was unused
and nobody should look at json logs to see the mob behind the action
## Changelog
🆑
fix: RCD logs are more human readable & stores the player name behind
the action.
/🆑
## About The Pull Request
cultists can now convert pets on their side. when you convert a pet, it
will become much more dangerous and obedient to you, it will also gain a
new dangerous AI. cultist pets will look for fellow dead cultists, and
revive them by dragging them to nearby revival runes and activating it.
if there is no revival runes around them then they will create their own
and drag u to it. u can give them commands to follow, attack, or to
create revival runes. they will also go around to crit non cultists so
cultists can convert them

they will also now feed on organs and blood for healing
## Why It's Good For The Game
adds a extra layer to cult, u can now command non-sentient pets to aid
you
## Changelog
🆑
add: cultists can now convert pets to their side
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
- Fixes#82122
This is a 2 part fix.
- Reagent holders (cup & syringe the only cases i can find) will update
the target appearance only when their action succeeds. This way they
don't cause items like envelops to update after every interaction.
- Envelope returns the stamp overlay in the return value of
`update_overlays()` rather than calling `add_overlay()` so their
overlays don't add up but rather get removed & replaced correctly.
## Changelog
🆑
fix: reagent containers like cup & syringe only update target appearance
if action was successful.
fix: envelops don't stack overlays when interacting with cup & syringes.
/🆑
## 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
## About The Pull Request
After playing more than a few matches, I came to notice a couple
lingering issues with deathmatch modifiers, and also I came up with more
ideas.
For starters, the echolocation modifier doesn't work, and even if it
worked, I believe it'd be ass, so I'm removing it. The perma-flipping
also doesn't work quite well and gets interrupted by stuff like
knockdowns and the such, plus it's just fluff, so I'm removing it too.
Second, I've forgot to set the style of the deadmatch missiles, so they
look like normal pods right now.
About what's being added rather than removed: There're now a "No
Slowdown" modifier, a "Random Teleports" one that randomly teleports
everyone (and whatever they're buckled too) every 12 to 24 seconds,
"Snail Crawl" which works much like snailpeople's, "Forcefield Trail"
which also works pretty much like the cosmic heretic trail, albeit
lasting way shorter, and finally a "Manual Blinking/Breathing", if you
truly hate players to a misanthropistic level.
So yeah, 2 removed modifiers, and 5 new ones.
## Why It's Good For The Game
Fixing a couple of issues, and lading the feature with a few more
options.
## Changelog
🆑
del: Removed the (non-working) "Perma-Flipping" and "Echolocation"
deathmatch modifiers.
add: Added "No Slowdown", "Random Teleports", "Snail Crawl", "Forcefield
Trail" and "Manual Blinking/Breathing" modifiers.
fix: Fixed deathmatch cruise missiles looking like standard pods.
/🆑
## About The Pull Request
Adds the Chief Engineer's turtleneck and turtleneck skirt to the game,
and makes them and the Chief Medical Officer's turtlenecks available
from round start.

## Why It's Good For The Game
Provides more clothing variety for the Chief Engineer and makes the
turtlenecks more accessible to the Chief Medical Officer.
## Changelog
🆑 myraowo
add: Added the Chief Engineer's turtleneck and turtleneck skirt to the
game.
add: Added the Chief Engineer and Chief Medical Officer's turtlenecks to
their respectives garment bags.
/🆑
## About The Pull Request
Inspired by #82099
- Hand labels now has a small visual associated.
- Hand labels now function like stickers, meaning burning temperatures
will remove hand labels from objects.
- General refactor of hand labels. Hand labeler now uses the new
interaction functions. Labels are now objects.

## Why It's Good For The Game
I thought it'd be a nice small touch to show visually when things are
labelled, so you can tell at a glance rather than needing to examine (or
hover) it.
If people preferred or used the invisible labels for certain gimmicks, I
can add a translucent label option as well. Maybe one that requires
plastic to print.
## Changelog
🆑 Melbert
qol: Hand labels now have a visual effect associated, and are also
affected by heat / can be cleaned off like stickers.
refactor: Refactored hand labels. They're objects now!
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Adds a corner version of the filled/warning decal.

## Why It's Good For The Game
The filled/warning decal is pretty and I wished it were easier to use in
more places but without a corner sprite corners can look weird with it
## Changelog
🆑
add: Added corner filled warning decals
/🆑
## About The Pull Request
Adds a bunch of crayon prefabs for the maps.
## Why It's Good For The Game
Reduces 45 map Var edits, and completely removes some Var edits.
## About The Pull Request
Does what it says on the tin, adds a missing target argument in the
timer function
## Why It's Good For The Game
## Changelog
🆑
fix: You can't complete a genetic makeup scan when the targets moves out
of target anymore using a genetic sequencer
/🆑
## About The Pull Request
Stops cluster grenades from logging their children.
## Why It's Good For The Game
Helps out with https://github.com/tgstation/tgstation/issues/81865.
## Changelog
🆑
admin: cluster bombs stop spamming admin logs
/🆑
## About The Pull Request
So this is a PR i have had testmerged downstream for like a month now
because deathmatch SPAMS the hell out of admin logs. This makes doing
admin work kinda annoying when all the useful logs are drowned out by
people trying to smoke each other to death endlessly. I don't know how
bad the problem is upstream, but I'd imagine TG admins would likely
express the same gratitude to have less active logging in game, in the
case something important happens that they need to see.
This should still keep logging things to the actual log files so the
logs will still exist, but this merely suppresses the massive spam of
logs that admins actively see.
## Why It's Good For The Game
Lets admins do their job a little bit better being able to see when
things happen in the logs. Deathmatch logs can be rather disruptive
towards admins.
## Changelog
🆑 SomeRandomOwl
admin: Deathmatch Bombs, Smoke, and Liquid floods are now suppressed in
the logs and will not actively spam admin logs.
code: adds a area flag to suppress logging for floods and bombs
/🆑
## About The Pull Request
Turns the varedited fluff item into its own item so it no longer has a
varedited icon & icon state.
## Why It's Good For The Game
We're varediting this fluff item 17 times on current tg master and it's
pretty bad. Varediting icon/icon state in maps should be discouraged and
hopefully banned later, it's not hard to make a subtype of an item so we
should be able to expect mappers to do that rather than this.
## Changelog
Nothing player-facing.
## About The Pull Request
Currently, dice will give the same message directly to the user,
regardless of if they were thrown or rolled in hand. This means you can
throw a die far off screen or even out into space, and still know
exactly when the die landed and what was rolled despite not being able
to see it. This PR fixes that.
It also rearranges the code for dice a little bit, since for some reason
all the important procs were defined like, halfway down the file from
the initial `/obj/item/dice` definition.
## Why It's Good For The Game
Fixes a bug and something potentially exploitable
## Changelog
🆑
fix: You can no longer determine the result of a dice roll from
off-screen.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Okay, so, turns out smoke machines, cigarettes, vapes and all sorts of
things intentionally unmix your mixes.
Why? For chaotic effects. Well sadly it just deletes chems from mixes
and makes them completely useless.
It also tends to have very little effect on deathmixes and moreso just
gimps you ability to use them for healing.
This is pretty bad, especially for machines like the smoke machine that
are specifically intended for chemists.
This PR entirely removes all uses of remove_any as well as the proc
itself from the game. It's just bad.
## Why It's Good For The Game
As it turns out, the game intentionally gimping your chem mixes just to
fuck with you is bad.
Especially when it's both obscure and not really all that fun for
gameplay.
## Changelog
🆑
balance: Smoke Machines, Showers, Vapes, etc will no longer arbitrarily
delete a random amount of the chems they are processing
/🆑
## About The Pull Request
I originally was gonna make the captain's spare ID safe float in the air
if the wall under it was taken down, but it looked poor and was going
against the vision for wall items (and go against the wallening) so my
alternative proposition is this, taking the safe off the wall.
It's now a golden safe (like the one in the vault) but is interacted the
exact same, it's now just a thing on the floor rather than being on a
wall.
I'm not a spriter so I didn't give it a custom icon but if anyone wants
to they can feel free to add one, just a golden version of the regular
safe felt kinda eh.
I also added a wallframe version of the secure safe for when it is taken
down. It will conserve its contents and be permanently locked until put
back up. This doesn't apply to the new captain safe since it isn't a
wall item.
## Why It's Good For The Game
Closes https://github.com/tgstation/tgstation/issues/80588
Prevents people from cheesing the spare and/or it being too easy to
destroy.
## Changelog
🆑
fix: The captain's safe is no longer on the wall, therefore cannot be
cheesed by breaking the wall it sits on.
fix: Tearing down a wall that a safe is on now drops the safe with its
contents, rather than dropping the contents onto the floor. The safe's
contents cannot be interacted with while it's not on a wall.
/🆑
## About The Pull Request
If you use exercise equipment in an area with unusually high gravity,
you will get tired faster but will also earn a greater amount of fitness
experience points.
As far as I am aware the only particularly reliable way for regular crew
to gain access to high gravity is the bone-crushing strength (and
radiation?) of the gravity generator, but you could also use
gravitational anomalies or gravitational holoparasites for this if they
are available.
Conversely, if you lift weights when there's no gravity it won't cost
you any stamina at all!
## Why It's Good For The Game
I'll be honest this is a largely pointless and trivial change which
interacts with a similarly useless system, but I thought it would be a
cute interaction.
Training by wearing heavily weighted clothing or in an area where
gravity is increased are _somewhat_ common tropes in fiction (I have no
idea if people do this in real life) and I think our players would
appreciate the incredibly niche circumstances where they can benefit
from this.
I also think if even one round features someone building a gym in the
gravity generator room and encouraging people to get buff while it
crushes them into paste then this was a good addition.
## Changelog
🆑
balance: If you work out under heavier-than-earth gravity, you will get
gains faster.
/🆑
## About The Pull Request
This PR adds the base to simple modifiers that the host can select to
make the minigame ~~worse~~ more entertaining for everyone.
Here's the screenshot of the UI (without a few modifiers I added later):

## Why It's Good For The Game
I've seen this minigame is frankly popular lately, so I thought I could
contribute to it.
## Changelog
🆑
add: Added 20+ modifiers to the deathmatch minigame, which can be
enabled by the host.
/🆑
## About The Pull Request
We have a `crafted_food_buff` in the code meant for specific food buffs
(and perhaps one day, debuffs) that has gone unused ever since it was
created during the 'Foodening' PR.
Anyway, yeah, this PR takes the fire step to implement it with ice cream
and other frozen treats.
Frozen treats (all food found in the `food/frozen.dm` file) have it by
default. Other ice cream holders such as waffles cones (and now regular
waffles too!) can aquire it when filled with ice cream. Using the ice
cream vat also adds the 'Chef Made' trait now, which is required for
food effects to happen.
Also very slight food effect refactor. There's no need to have five
different alert screen objects when only have to switch icon states.
This PR also adds an action speed modifier to the generic 'haste' food
effect. I'm confident the original creator would have done that too, but
action speed modifiers aren't as well-known.
## Why It's Good For The Game
People tend to make one feature, call it a day and then move on to the
next. Food effects are nice, however they're barely implemented, and I
don't like food being all the same-ish in the end.
## Changelog
🆑
add: Ice cream and frozen treats now have a chilling effect.
add: You can add a scoop of ice cream on waffles.
balance: added an action speed modifier to the generic food haste effect
(you do things, and not just run, an itsy bitsy faster)
/🆑
## About The Pull Request
Posters now drop into your hand when you cancel the hanging process, or
snip them down with wirecutters. If they can't drop into your hands,
they go to the floor.
Oh, also, this makes it so that abductor wirecutters (or any wirecutters
with a toolspeed better than 0.2 in case of varedits/future additions)
are too weak to cut down abductor posters.
## Why It's Good For The Game
Posters getting dropped to the ground when cancelling the hanging
process has always really annoyed me and I want it to not happen
anymore.
If you want to get those unsightly abductor posters out of your
department you'll have to loot the abductor scientist first (or just
take the wall down but that's admitting defeat).
## Changelog
🆑 Rhials
qol: Posters now return to your hand when the hanging process is
cancelled, or they are snipped down.
qol: Abductor posters can now only be cut down with abductor-tier
wirecutters.
/🆑
## About The Pull Request
Originally part of the other blackmarket PR, but it seemed a tad awkward
to have it mandatorily installed on mobs rescued from the holding
facility.
But yeah, this PR adds a neck item that causes the wearer's death with a
5 seconds countdown when triggered, which can be bought from the market
uplinks. The box comes with a yellow button to trigger it, but it can
also hold a signaler (which the wearer cannot tamper) if you wish to use
assemblies. Take note that, upon being worn, the item cannot be removed
by any mean beside beheading iirc (so HARS should counter it), and
fire/acid if you have a ton of patience because of its high armor
values.
## Why It's Good For The Game
More mean and evilish stuff to populate the black market with.
## Changelog
🆑
add: Added a collar bomb to the black market.
add: Added a possible kit to the special syndie bundle B, which also has
uses these collars.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Closes https://github.com/tgstation/tgstation/issues/81981
## Why It's Good For The Game
Allows flyswatter to act as we would imagine. Takes 1 to 4 hits
depending on its type. Makes list static so we don't have to make it
every flyswatter.
## Changelog
🆑
fix: now young spiders get extra damage by fly swatter
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: san7890 <the@san7890.com>
This PR adds a new logging category and a logging message specific to
SSore_generation's initialize, logging the number of vents of each size,
as well as the number of random and proximity based ore spawns due to
cave generation and map generation.
Currently drafted as I could use some feedback as to why I'm not seeing
the logger.log() messages not appearing on any of the current in-game
log files 👍
Useful for data logging to determine how many of each type of ore is
spawned on the map, for the purposes of determining how much ore is
being spawned manually over the automatic amounts based on the vents,
with the quantity of ores spawning being a product of the ore vent sizes
being logged as well.
## About The Pull Request
This PR adds a **persistent** piggy bank to the station vault that,
while it can hold up to 3300 credits carried between shifts. However,
you can only insert up to 1600 (on top of the 50 creds it
auto-generates) each shift, so it does take a small, itsy bitsy of
patience to fill it to the brim.
## Why It's Good For The Game
I put some effort coding persistent piggy banks when making the
cafeteria PR for the museum away mission a while ago (which apparently
isn't enabled yet because the key holders forgot to ig). It'd be a shame
of all the existing code were only used for a single persistent piggy
bank.
## About The Pull Request
Irradiated meteors have been given a little tune-up, because they are
kind of underwhelming right now.
Presently, they do less damage than a standard meteor. At some point its
impact effect was reduced to a single radiation pulse (which does
absolutely nothing).
Now, they hit harder, deeper, and leave behind a pile of radioactive
sludge. Let's see how it looks:

Oof, wouldn't want that hitting MY department!
You'll have to clean up the radioactive sludge, and should probably wear
protective equipment while doing so. Also, they will show up slightly
less often now, as they are more threatening now.
## Why It's Good For The Game
Re-implements Flavor for an effect that lost its taste since being added
10 years ago. An irradiated meteor doesn't do anything besides look
pretty and green right now.
Currently irradiated meteors are really boring and not threatening --
antithetical to the idea of a "radioactive meteor". Now, there's a much
more interactive and measurable impact when one hits.
## Changelog
🆑 Rhials
balance: Irradiated meteors now hit harder and leave behind radioactive
goop.
/🆑
## About The Pull Request
The saboteur gun will now silence pAIs, toggle off radio broadcasting
(won't auto-relay nearby speech), disable turrets, chill out secbots a
little, and turn off APCs like power outages do.
The disrupt duration has also been buffed from 10/20 to 15/25 for ranged
and point-blank respectively.
Removed a conspicious chat message from an otherwise inconspicious gun.
Brought the code up to date.
## Why It's Good For The Game
The concept is cool, alas it's also undermined by how much of a joke
it's right now, and the game has plenty already.
The amount of interactions it has with things is underwhelming, so you
could barely consider it a stealth tool. The duration is also quite
scarce, I pointed that out in the original PR too.
Basically, I want to make the item cooler.
## Changelog
🆑
balance: Buffed the duration of the SC/FISHER Saboteur Handgun's
disruption effects. It's also stealthier and it won't conspiciously
alert living mobs hit by it.
add: Added saboteur interactions with radios, pAIs, turrets, secbots and
APCs.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
This PR does two fairly simple things.
Firstly, it triples the gulag point value of every material except
glass.
Secondly, it allows mining skill increases to effect the speed of
boulder breaking and reduce the stamina "exertion" you take.
I tried this out personally on Lavaland and Icebox and while this is
very much dependent on RNG (and storm timing) this got earning 1000
points purely from mining and smashing boulders down to _about_ ten
minutes of work, which I believe is the rough estimate of how much
effort it was before that. It may skew a bit higher than that if the ash
storm happens at a bad time or the game gives you predominantly iron,
but not a _lot_ higher.
The mining skill = faster smashing thing is... barely perceptible after
ten minutes of mining to be honest but it's saving _some_ time and I
think if it gives you the exp it might as well benefit from it too.
I didn't do anything for _glass_ because you can just pick that up off
the ground in Lavaland and I didn't want to make _that_ the ideal route
to getting your sentence finished.
## Why It's Good For The Game
Since ArcMining was merged, the gulag has changed to a system primarily
about digging up boulders and smashing them with a pickaxe for random
rewards. I think the chain gang thing is pretty flavourful, but the
inability to just target high-value materials (because you could see
them on the mining scanner) and the overall decrease in output has made
it take a lot longer to get a similar amount of points.
People are sending prisoners out to mine for 1000 points of materials
assuming this is about 10 minutes work, when in reality it was more like
30-35 minutes. Longer on Lavaland, where you need to take breaks for ash
storms.
This was not an intentional "nerf" to prisoner miners and should
hopefully bring it back down to somewhere closer to the previous level.
## Changelog
🆑
balance: All materials except glass are now worth more gulag points than
before.
balance: Mining skill decreases the time it takes to break boulders, and
makes it less tiring.
/🆑
## About The Pull Request
So a previous pr attempted to fix the fuck you coupon, by adding 1 to
the arguments.
```dm
(tgstation/code/modules/cargo/coupon.dm, line 87)
cursed.AddComponent(/datum/component/omen, 1)
```
But this was setting the `vessel` rather than the `incidents_left`
argument to 1.
```dm
(tgstation/code/datums/components/omen.dm, line 20)
/datum/component/omen/Initialize(obj/vessel, incidents_left, luck_mod, damage_mod)
```
Moving this argument over one fixes the issue.
```dm
cursed.AddComponent(/datum/component/omen, null, 1)
```
However! We're now skipping over the `vessel` value, which is used to
burn up a curse's vessel once the curse is expended.
Setting this to `src` rather than `null` means the fuck you coupon
actually gets 'expended', which I think it better than just using `null`
or `incidents_left = 1`. The coupon's useless once it's done, and this
way it's cooler anyway.
For consistency, we then also add this behaviour to when the coupon
gives you a heart attack instead.
Then! I noticed there was a _second_ bug with fuck you coupons, where it
would stop prematurely if the location wasn't a mob.
```dm
(tgstation/code/modules/cargo/coupon.dm, line 80-81)
if(!ismob(loc))
return FALSE
```
However, this also happens when you don't have a free hand for it to put
the coupon in, and thus entirely negating the curse and just giving you
a useless fuck you coupon.
We fix this by just adding a `user` argument to `generate`, which it
prefers to use when available, and is set to the user ripping off the
coupon in the first place.
## Why It's Good For The Game
Fixes#81946.
As fuck you coupons are pretty much useless after expending their curse,
and we have to add the vessel value anyway, I thought it'd be more
fitting to add the coupon as the vessel rather than just putting in
null. Then, for consistency, I felt it'd be best to make them *also*
burn when giving you a heart attack when you already have a curse.
Y'know, it's expending the coupon for it's one-time fuck you!
Also fixes fuck you coupons not actually applying their curse if you
didn't have any free hands for it to put the coupon in when ripping it
off.
## Changelog
🆑
fix: Fuck you coupons ACTUALLY trigger only once again. As a
consequence, they also burn up when expended for their one-time fuck
you.
fix: Fuck you coupons work regardless of whether you had a free hand or
not.
/🆑
## About The Pull Request
Ore vents can now no longer be scanned multiple times to spawn multiple
nodes, nor can they be used to duplicate lavaland bosses.
Vents now call for a `can_interact` check, as well as against the
cooldown timer, which has been moved a bit in the order of operations in
order to check things correctly when there's possibly multiple prompts
open for starting the defense waves.
Additionally, boss waves actually do what they're supposed to do, and
don't spawn in a node drone on boss summoning, but instead summon the
drone afterwards, which sets up the vent, then takes off visually. This
is reflected in the tgui alert before starting waves.
## Why It's Good For The Game
Fixes#81817. Improves visual clarity when doing boss vents so that
players don't get the wrong idea that they need to protect the drone as
well when fighting bosses.
## Changelog
🆑
fix: Ore vents have to be scanned while standing next to them.
fix: Menacing ore vents now correctly only spawn in a node drone after
the boss is defeated, instead of before.
/🆑
## About The Pull Request
This PR introduces a new station trait that lets people choose if they
want to be pro-skub or anti-skub (or neither, really). It works the same
lobby buttons that job-related station traits also use. Depending on
whether you chose to be pro or anti skub, you'll spawn in with a special
box that contains the (bulky) skub and a pro-skub shirt, or an anti-skub
shirt. EDIT: Both also receive a number of stickers to propagate their
causes.
Kudos to @Fikou for coding the lobby buttons to be accessible by any
station trait rather than only job-related ones when you made the
Cargorilla station trait.
Another thing this PR also halves the exaggerated weight of low-cost
traits such as scarves, wallets and glitched PDAs, which I clearly
underestimated.
## Why It's Good For The Game
We've learned that low-cost, high weight traits are a bit of a design
mistake, because they tend to tip the scales toward themselves over and
over and over, leveling the diverseness of the feature and therefore
making it shallow and boring.
Beside, I've been thinking of the popular [skub comic
strip](https://pbfcomics.com/comics/skub/) lately.
## Changelog
🆑
add: Added a Skub-related station trait. You can now choose if you want
to be pro-skub or anti-skub, complete of shirt and stickers. Please
don't shank each other over it.
balance: Halved the weight of station traits such as scarves, wallets
and glitched PDAs.
/🆑