## About The Pull Request
Adds a food truck.


Also, adds a team of MI13 fugitive hunters. There's 3 in a team, and one
is pre-equipped with a cunning disguise.
## Why It's Good For The Game
So the primary intent here is making a fugitive hunter team that
operates stealthily instead of directly. They have less direct combat
power than other hunters, but they have a few things that help them
infiltrate the crew and assassinate the fugitives.
All agents are issued a makarov, a suppressor, a spare clip of 9mm ammo
(20% chance to be a subtype), a random melee weapon (flash, e-dagger or
combat knife), and a random low-level syndicate gadget (c4 brick,
codespeak manual, freedom implant, etc), and a pair of zipties. Every
agent also gets a agent ID.
Shuttle is equipped with surgery tools (good for plastic surgery),
clothing vendors (good for getting disguised), and a bunch of computers
for cameras and vitals monitors. Spare cyanide pills and 9mm ammo is
provided, as is a single space suit. As an added bonus, you're
opereating out of the back of an old food truck giving you bulletproof
cover for your operations. Spare food is provided, a functional kitchen
is not.
## Changelog
🆑
add: Ghost role food truck merchants may occasionally turn up at the
station.
add: Adds a new fugitive hunter type, MI13 secret agents.
/🆑
---------
Co-authored-by: Afevis <ShizCalev@users.noreply.github.com>
## About The Pull Request
Since non-clothing items can also be worn on several slots, there's no
need for cigarettes/vapes to be subtypes of masks anymore, since that
comes with a few oddities like #82870.
## Why It's Good For The Game
This should fix#82870, with about no side-effect aside them no longer
being edible by moths 🤢.
## About The Pull Request

Adds Misha the bear to icebox HoS office, a snow bear with the same
health stats as Sgt. Araneus.
## Why It's Good For The Game
With how easy it is to break into the HoS office on icebox (you don't
need any space protection) it never made sense to keep a slow pet in the
office. The bear is fast and deals 15 damage, while also resistant to
cold.
I think it adds more depth that the HoS tamed a bear on icebox and
trained it. Also the bear fits the map.
## Changelog
🆑 grungussuss
add: Added Misha the bear to the HoS office on icebox.
/🆑
## About The Pull Request
What it says on the tin. Currently we are adding all dead `mob/living/`
to the list of potential revenant spawns whether or not they are valid
harvest targets.
Decreases the odds of getting a spawn that is not immediately useful as
revenant.
## Why It's Good For The Game
Fix good.
Harvesting only works with `mob/living/carbon/human/` so naturally we
should avoid adding other mobs to the list of potential spawn points.
## Changelog
🆑
fix: Fixed revenant spawning next to brains and other unharvestable dead
mobs.
/🆑
Yes, I know preventing the nuke disk teleporting to the icebox syndicate
base (or possibly the wendigo arena) is removing soul. Please don't kill
me :(
## About The Pull Request
Adds some missing variables to instances of get_safe_turf() so they will
only teleport to the given z-level.
Replaces some instances of get_safe_turf() with
get_safe_random_station_turf().
## Why It's Good For The Game
First, the differences between get_safe_turf() and
get_safe_random_station_turf():
### get_safe_turf()
- gets a random safe turf on a z-level (usually any of the staiton
z-levels), not accounting for the /area/
- should be used if you don't care if it spawns on the station or not,
or if you need to specifically teleport to a z-level
- not very expensive performance wise
### get_safe_random_station_turf()
- gets a random safe turf that will always be a station area, ignoring
z-level.
- should be used if you NEED the turf to be on a station's area
- slightly more expensive performance wise than get_safe_turf, but still
very cheap
Some code was using get_safe_turf() when it should've been using
get_safe_random_station_turf(), and some code that should be using
get_safe_turf() were incorrectly using the zlevels arg instead of zlevel
arg (Yes, there is a difference), or didn't include it at all.
All the changes were made to my best judgement. If you're curious about
a change, please ask and I will explain why I did it.
## Changelog
🆑 BurgerBB
fix: Tweaks some instances of get_safe_turf so things like the nuclear
disk doesn't accidentally teleport to the Icebox Syndicate Base
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
I was looking at sounds (as you do) and I noticed this

These sounds don't exist
We have `portal_open_1`, not `portal_open1`.
This wasn't caught on compile because they used `""` and not `''`.
So I went through and audited a bunch of playsound uses that don't use
`''`. Only one error, fortunately
Likewise there was a ton of places running `get_sfx` pointlessly
(because `playsound` does it for you) so I clened that up.
However while auditing the portal stuff I noticed a few oddities, so I
cleaned it up a bit.
Also also I added the portal sounds to the wormholes event and gave it a
free ™️ optimization because it was an in-world loop
## Changelog
🆑 Melbert
sound: Portals made by portal guns now make sounds as expected
sound: Wormholes from the wormhole event now make sounds when formed
/🆑
## About The Pull Request
Adjusts tram malfunction and the tram malfunction event to be more
straightforward and similar to other telecoms machinery.
- Tram malfunction now requires engineering, borg, or AI to visit either
the tram or the tram controller in telecoms to press 'reset'
(previously: open the tram panel and find the appropriate tool to repair
it)
- Tram malfunction event only stops the tram once per event roll
- Adjust announcement to include message that engineers need to reset
the tram
- Removed loud priority_announce when the tram is fixed. Players know
the tram is fixed because they are using it again
- Tram doors no longer force crush during malfunction, since engineers
have no method to fix this
- EMP/communications blackout event will temporarily degrade crossing
signals, otherwise the tram continues to function normally
- Loss of telecoms power will degrade crossing signals, otherwise the
tram continues to function normally
Frequency of tram malfunction event is reduced to be in line with
communications blackout and grav gen blackout, and a maximum of 3
occurrences per round
Signal failure:
Previously: Signals fail until reset has physically been done on the
controller
New: Signal failure is moved to be part of the Communications Blackout
event, lasting the duration of EMP blast that hits telecoms
Communication loss:
Previously: For the duration of the Tram Malfunction event there is a 5%
chance the tram does a degraded stop, ending when the controller is
repaired or the timer ends
New: A guaranteed 1 degraded stop per event roll. To balance the
increase in occurrences it's been made easier to reset on the
controller. If the tram is not reset by the end of the timer, it is done
automatically
New telecoms room tram controller:

## Why It's Good For The Game
Making the tram friendlier for engineering to pick up/understand, it
will function more predictably in the tram malfunction and
communications blackout event.
## Changelog
🆑 LT3
add: Telecoms now has a central tram controller
add: Tram controller is now included in communications blackout event
qol: Tram malfunction event only stops tram once, requiring engineering
to reset (no tools required)
qol: Tram malfunction event no longer sends a Central Command
announcement when fixed
del: Tram doors no longer force crush you during tram malfunction event
del: Silicons can no longer control the tram when communication is lost
/🆑
## About The Pull Request
Reworks sneezing. Instead of a range check that checks if you're facing
someone, it is now a skill check
https://github.com/tgstation/tgstation/assets/7501474/c11ffa16-9bd2-4ed1-8022-2094360657bc
All sneezes shoot projectiles, but depends on the virus if they're
infectious. Using the sneeze emote is the only method that doesn't shoot
a sneeze
## Why It's Good For The Game
I think the invisible infection mechanics are unfun. A lot of station
dangers challenge your knowledge and mechanical skill, while viruses are
gotten by being around people in a roleplay game. You can get a round
seriously ruined if you walk past someone with a sneezing virus and
don't immediately rush spaceillin or chemistry, which I don't think is
mechanically interesting.
Now if you get infected, it's a skill issue. Get good and dodge the
sneeze
Note that this is just one method of infection. I didn't touch coughing
and airborne viruses, which do constant area checks and infect everyone
around. I plan to, but not now. I'll probably make coughing do a cone or
something, and ignore the airborne viruses since they can't be modified
and are generally less broken
## Changelog
🆑
balance: You can now dodge sneezes
balance: Infectious simple diseases that use sneezes now infect with
sneezes and have lowered airborn transmission
balance: Damageless attacks, projectiles, hugs etc no longer drain
shields
/🆑
- [x] Make sneezes shoot to your cursor so you can either intentionally
sneeze on people or sneeze away from people if you react fast
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Adds a few laws that basically do this:

Has a chance to select a concept that is related to other lawsets, just
in case.
## Why It's Good For The Game
I think it is funny when the AI has to care about the station pets. I
have added the AI law "POLY IS HUMAN" in the past to relative hilarity,
especially when Poly decides to give the AI an order. The other pets
aren't likely to do this, but it's still cute to make the AI care about
the existence of lower lifeforms.
## Changelog
🆑 Vekter
add: Adds an ion law possibility that changes the human status of
station pets.
/🆑
## About The Pull Request
1. Rather than checking every life tick to try to spread via air, it
checks every breath tick. IE, every 8 seconds.
2. Wearing a mask now protects you from catching airborne diseases,
rather than only protecting you from spreading it.
3. Wearing a mask is no longer guaranteed effective (unless on
internals), it now scales based on BIO armor. This is doubly effectively
for people wearing a mask to stop spreading to others vs wearing a mask
to block spreading to them.
## Why It's Good For The Game
Wearing any kind of mask means airborne viruses will never spread, but
also wearing any kind of mask on the opposite end is pointless unless on
internals. Kinda silly.
This PR unifies those behaviors. Wearing a mask to stop spread is still
rewarded, as BIO armor is doubly effective at stopping a spread attempt
as blocking a spread attempt.
Ultimately the goal of this is to give players a realistic way to
protect themselves against airborne transmission vectors besides staying
on internals 100% of the time.
## Changelog
🆑 Melbert
balance: Wearing a mask can now prevent you from being spread airborne
diseases. Prior, it only stopped you from spreading it yourself.
balance: Wearing a mask no longer 100% guarantees you don't spread
viruses to others people - it now scales on the masks BIO armor. Get a
sterile mask from Medical for max safety.
balance: Wearing a mask to stop you from spreading to other people is
doubly effective than wearing a mask to prevent spread to yourself -
Mask up for the greater good!
balance: Passive airborne virus spread attempts are now done every time
you breathe (every eight seconds), rather than every two seconds. The
chance of spread is the same, though - it has been scaled up to
accommodate.
code: Cleaned up a fair bid of airborne-transmission-code. Report any
oddities.
/🆑
## About The Pull Request
This PR turns gondolas into basic mobs and does some fiddling with
gondola pods
Their verbs are now action buttons which they lose upon delivering. If
set to stay, they won't have their abilities afterwards (or wont get
them in the first place if the delivery is already done).
Lets them survive without a pod requirement in case admins want to spawn
one for their own stuff, so I also removed it from the snowflake checks
to exclude them from stuff.
Also replaced the hardcoded "cant speak" with simply giving the mute
trait, so admins can make gondolas speak if they want to for any reason.
## Why It's Good For The Game
The pet level of simple animals can finally be killed off, also gives
admins more control over gondola-related stuff if they so wish.
## Changelog
🆑
refactor: Gondolas (including gondola pods) are now basic mobs.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Saw this in the wild and fixed what I believe was the cause: `!@!$&: THE
MEDICAL DOCTORSIS IN NEED OF THREE NAKED CHAPLAINS` (Round ID: 229577)
## Why It's Good For The Game
Spellcheck good.
## Changelog
🆑
spellcheck: Fixed a missing space typo in ion law logic.
/🆑
## About The Pull Request
Completely removes sentient disease from the game
## Why It's Good For The Game
Sentient disease is a unique antag and seems fun on paper, but really
doesn't work that well.
Sentient disease is a pretty binary antagonist: you either get cured and
watch helplessly as you lose all your hosts, or you infect everyone and
wipe out the entire station. Its everything bad about conversion antags,
but there's not even any fighting.
I also don't think any amount of balancing can fix sentient disease. If
we make it harder to cure, the disease gets an easier station wipe, but
if we make it less lethal, it loses all ability to stop cure generation.
The core gameplay pitches the entire crew against one disease, and it's
merely a timer before either it gets cured or wipes out everyone
This is my latest sentient disease round, where I wiped out the entire
station. I only even greentexted because there was one guy on the escape
shuttle in crit that barely made it because they had the sense to take
spaceilline.

The removal of the virologist lets us balance viruses to be fairer
challenges to the player, but as long as sentient disease exists we'll
always have to balance viruses somewhat in favor of the enjoyment of the
disease blowing your head and making you spontaneously combust.
## Changelog
🆑
del: Removes sentient disease from the game
/🆑
Hopefully, once we get virology truly sorted out, we can readd sentient
disease, but this would require our diseases to have endgoals that
aren't focused around killing every person, being widespread while also
not being instantly curable. A reworked sentient disease would have to
be so different, it's better to leave it out, fix virology and then
consider if we can truly add a new sentient disease and have it be fun
and fair
## About The Pull Request
Random events can now be rerolled by admins, much like how they can
reroll dynamic rulesets. During the ten-second warning window, you can
choose "Something Else" to have a (randomly selected) different event
run in its stead. You still get the 10-second delay when this new one is
picked, meaning you can keep rerolling until you get something
interesting.
The option to just cancel a random event remains.
## Why It's Good For The Game
Cancelling a random event sets back the random event clock, meaning you
have to wait a few minutes for another one to roll. Now you can just
reroll dangerous events into something calmer (or y'know, calm events
into something more dangerous).
## Changelog
🆑 Rhials
admin: Admins can now reroll random events into something else.
/🆑
## About The Pull Request
Grants the Research Director TRAIT_STRENGTH via their skill chip. This
trait is only relevant to athletics-related activities. They still need
to actually do the workout before they see any results.
Fitness bros will overestimate the RD's power level due to their ability
to suplex an immovable rod.
Suplexing a rod grants an incredible amount of athletics skill,
increased by how many people the rod has taken out. The frequency of
this happening is bound to be pretty small, but it's a nice in-round
reward for accomplishing the task (and maybe blowing up a department as
a result), and also potentially a large number of casualties on top of
that.
## Why It's Good For The Game
The athletics changes didn't acknowledge that there is already someone
on the station that is, for some reason, unnaturally stronger than
everyone else. The Research Director. So now, fitness bros think they're
naturally swole. Mind over matter, I guess?
I just think it'd be funny if by suplexing the rod once, you gain
incredible physical power and then need to take a nap because boy that
sure was an explosive amount of strength you had to apply. Since this
only happens with looping rods, I don't imagine it will disrupt fitness
as a skill too much.
## Changelog
🆑
add: The Research Director is now actually strong.
add: Fitness bros will determine the Research Director to be stronger
than they actually are, without even working out. How does he do it?
balance: Suplexing a rod grants a large burst of athletics experience.
add: The more sentient casualties of the rod, the more experience
suplexing that rod grants. Absorb the souls of the weak and feeble.
/🆑
poll_ghost_candidates can return null if nobody signs up, these weren't
properly checking for that case.
Also moved the Santa ghost role over to the proper subtype (not sure if
it was outright broken, but it'll now properly update the Santa's role
and trigger automatically.)
```
[14:41:54] Runtime in code/modules/events/ghost_role/sentience.dm, line 77: Cannot read null.vars
proc name: spawn role (/datum/round_event/ghost_role/sentience/spawn_role)
src: /datum/round_event/ghost_role/... (/datum/round_event/ghost_role/sentience)
call stack:
/datum/round_event/ghost_role/... (/datum/round_event/ghost_role/sentience): spawn role()
/datum/round_event/ghost_role/... (/datum/round_event/ghost_role/sentience): try spawning()
/datum/round_event/ghost_role/... (/datum/round_event/ghost_role/sentience): start()
/datum/round_event/ghost_role/... (/datum/round_event/ghost_role/sentience): process(2)
Events (/datum/controller/subsystem/events): fire(0)
Events (/datum/controller/subsystem/events): ignite(0)
Master (/datum/controller/master): RunQueue()
Master (/datum/controller/master): Loop(2)
Master (/datum/controller/master): StartProcessing(0)
```
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Monkey knockover is now on a new mob-bump signal instead of being on
crossed, fixing some consistency issues and getting rid of our need for
snowflake "can bump into mob" check.
We should try to get rid of all our instances of Crossed and remove its
use to prevent this bug from occurring in the future.
## Why It's Good For The Game
Closes https://github.com/tgstation/tgstation/issues/66983
## Changelog
🆑
fix: Monkeys can no longer be knocked over by walking into a windoor on
combat mode while they're behind it.
/🆑
## 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
Makes all plunging actions (pretty much anything using `plunger_act`)
have a visible balloon alert.
## Why It's Good For The Game
Makes sense that others would easily notice you plunging the shit out of
something.
Also, more people might finally learn that you can plunge the vent clogs
instead of welding them.
## Changelog
🆑
qol: Added balloon alerts whenever you start plunging something (i.e )
/🆑
## About The Pull Request
you cant bodyslam yourself as a slaughter/laughter demon
also

also moved antag datum stuff to mind init which means easier spawning
## Why It's Good For The Game
i wanted to brag in OOC about my supreme robust killcount but then i
realized theres no way to verify this
also hurting yourself is stupid
## Changelog
🆑
qol: slaughter/laughter demons have a cooler round end report
qol: you may not bodyslam yourself as a demon
code: slaughter and laughter demons are given their antag datum when
their mind initializes
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
The easter rabbit event looped through every single landmark in the
game, not checking for zlevel or purpose, just that they would not be
called "blobspawn". This PR makes the logic more curated, using generic
and maintenance event landmarks for normal bunnies, and carpspawn for
space rabbits.
Also added check_tick checks for a good measure.
There is a still a lot of them! I counted around 50 bunnies on average
per test.
## Why It's Good For The Game
A more curated list is better than a list that checks for name strings.
Ensures the rabbits spawn only on the station Z levels.
## Changelog
🆑
code: Made the easter rabbits spawn on a more curated list.
/🆑
## About The Pull Request
Wisdom Cows can now be milked for a random reagent (excepting the
randomly generated reagent blacklist).
Also I changed it to say `you milk the cow` instead of `you milk the
udder` because the latter is stupid.
## Why It's Good For The Game
My experience is that people totally ignore this event when it occurs,
which is _fine_ when we have so many events and they don't all need to
be high impact but I think someone discovering that you can milk the cow
for cognac or meth or something could add something to a round.
I want people to bicker over ownership of the cow, basically.
If the reagent is annoying you can simply speak to the cow to receive
its wisdom and it will disappear.
## Changelog
🆑
add: Wise cows produce surprising milk.
spellcheck: You now milk the owner of an udder, not the udder.
/🆑
## 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
Three changes to ghost orbit popups. Let's check them one-by-one.
First off -- The obsession awakening and blob host midrounds now have a
ghost popup when summoned via Dynamic. They already have them when
summoned by a random event roll, so this is mostly just bringing the two
different spawn methods in line with each other. None of the other
midround dynamic picks (autotraitor, revs, etc) have had this added,
because they're less focused on spectacle and require more mystery to
function properly.
Second -- The electrified railings on the tram no longer notify ghosts
every time someone gets shocked. Electrocute_act is called on anything
that passes by it, and the popup would be thrown regardless of whether
or not they've "fallen in the path of an oncoming tram" or not. Making
it check if the electrocute_act actually successfully stunned a player,
and that they're about to be hit, would probably require an unwieldy
rewrite to the behavior that I'd rather not resort to. I brought this
helper call into this world, and now I'm taking it out.
Lastly -- The supply pod random event can now be properly jumped to.
Originally, it would track the landing indicator, which would delete
almost immediately and leave an un-orbitable popup on your screen. Now
you jump to the landing zone, regardless of when you click the toast
popup.
This is really long PR body for such tiny changes please don't think
this is anything more than it actually is.
## Why It's Good For The Game
Minor improvements to some ghost orbit popups, because Observers are
players too!
## Changelog
🆑
qol: Dynamic midrounds "Obsession Awakening" and "Blob Host" now have
ghost orbit popups, so you can see them happening in real time.
qol: There is no longer a ghost orbit popup for players being shocked by
an electrified tram rail.
qol: The Stray Cargo orbit popup no longer has a half-second window to
orbit before it becomes useless.
/🆑
## 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
Fugitives hunters no longer spawn after 1 minute under any conditions.
The culprit was improper use of a macro, checking the shuttle status
against it instead of just using it.
## Why It's Good For The Game
Fugitives get some more breathing room and time to gear up.
## Changelog
🆑 Rhials
fix: Fugitive hunters no longer spawn after 1 minute of the fugitives'
arrival.
/🆑
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
In the event of a shuttle call, fugitive hunters will spawn early.
(Hunters will still spawn 10 minutes after the fugitives if the shuttle
is idle)
## Why It's Good For The Game
Hunters are currently able to spawn way too late to ever have a chance
to interact with the fugitives, this is lame for both parties involved.
## Changelog
🆑 PapaMichael
balance: Fugitive hunters will spawn early if the emergency shuttle is
called.
/🆑
## About The Pull Request
Big changes:
- Participation is Valentines day requires consent, as consent is
important.
- When the event triggers, all valid players are automatically signed up
to get a random date. However if you're uninterested, you can opt out of
getting a date.
- This uses the same system as ghost role polling, so it's a
non-obstrusive screen alert + chat box entry.
- AIs are now given a zeroth law to protect their date.
- This does not override existing zeroth laws (for malf ais).
- This zeroth is law is worded in a way such that they are not
effectively malf AIs. Their other laws still apply, but not for
situations pertaining to their date.
- Cyborgs are desynced from AIs and are given similar zeroth laws to
protect their date.

Small changes:
- Valentines cards are now paper. Meaning you can write on them, stamp
them, or yes, burn them.
- Third wheeling is more codified than before. Third wheels get their
own antag datum type.
- The antag panel listing in roundend takes up significantly less room
for each date. Additionally, dates are now paired up with each other.
- Adds implementations for getting pronouns from mind datums.

## Why It's Good For The Game
It's 2024 and our Valentines day is sooo 2012.
I'm a big fan of Valentines Day, personally - it gives me the
opportunity to mess around with another player that I probably would not
otherwise mess around with, getting into shenanigans I would not
otherwise.
But as the years have gone by it's gotten pretty lackluster. Some people
like it as much as I do, but others ditch it entirely and ignore the
objectives.
And if you get paired with someone ignoring it, well, now you're out of
luck!
This is something I'm aiming to rectify by making it opt-in when it
triggers rather than forced. All the people participating will be
guaranteed to get someone who cares about the event as much, which makes
it more fun.
As for the silicon changes, there's been lots of confusion around
silicons and their dates, so I thought I'd fix it here as well.
Also, better late than never?
## Changelog
🆑 Melbert
add: Valentines Day now polls all players for candidates when it
triggers rather than forcing all players to be a Valentine. Consent is
important.
add: Valentine silicons now gain special laws pertaining to their date.
qol: Valentines Cards are now paper, so you can write on them, stamp
them, or burn them.
qol: Valentine's roundend report no longer takes up a massive amount of
space and also no longer sound so, so weird.
/🆑
## 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
Added a negative station trait, which blocks the mail like it's sunday
or a official holiday. However! If it's actually sunday or a official
holiday, when the mail would be normally blocked already, instead it'll
unblock it. It was done this way because it's easier (station traits are
loaded before the events and economy subsystems are initialized) and
cooler.
## Why It's Good For The Game
Granted there are quite a few station traits around cargo already,
features interacting with other features is honestly a good thing.
## Changelog
🆑
add: Added a "postal workers strike" negative station trait. In the case
of holidays and sunday though, it'll be a "postal system overtime"
instead.
/🆑
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## 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
Fake Virus random event won't pick Virus Immune mobs.
Plus some code cleanup.
## Why It's Good For The Game
Feeling a virus when you can't feel a virus makes it pretty obvious
what's going on.
## Changelog
🆑 Melbert
fix: Crewmembers immune to viruses won't be picked by the fake virus
event.
/🆑
<!-- 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
Disease Outbreak events no longer consider players not on a mining or
station level as patient zero.
<!-- 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
Watching a single space explorer get smote by a hell virus is funny but
is a waste of this event. Diseases were made to spread, not be wasted on
a single person (except for the ones that are)!
<!-- 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. -->
🆑 Rhials
fix: Disease Outbreak events will only select players on the
station/lavaland as patient zero.
/🆑
<!-- 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: Jacquerel <hnevard@gmail.com>
## About The Pull Request
FOV as it is currently implemented is incompatible* with wallening.
I'm doin wallening, so we gotta redo things here.
The issue is the masking of mobs. Wallening relies on sidemap (layering
based off physical position), which only works on things on the same
plane (because planes are basically sheets we render down onto)
So rather then masking mobs, let's reuse the masking idea from old fov,
and use it to cut out a bit of the game render plane, and
blur/over-saturate the bit that's masked out.
My hope is this makes things visible in light, but not as much in
darkness, alongside making more vivid shit more easily seen (just like
real life)
Here's some videos, what follows after is the commits I care about
(since I had to rip a bunch of planes to nothing, so the files changed
tab might be a bit of a mess)
Oh also I had to remove the darkness pref since the darkness is doing a
lot of the heavy lifting now. I'm sorry.
Edit:
NEW FOV SPRITES! Thanks dongle your aviator glasses will guide us to a
better future.
https://github.com/tgstation/tgstation/assets/58055496/afa9eeb8-8b7b-4364-b0c0-7ac8070b5609https://github.com/tgstation/tgstation/assets/58055496/0eff040c-8bf1-47e4-a4f3-dac56fb2ccc8
## Commits I Care About
[Implements something like fov, but without the planes as layers
hell](a604c7b1c8)
Rather then masking out mobs standing behind us, we use a combo color
matrix and blur filter to make the stuff covered by fov harder to see.
We achive this by splitting the game plane into two, masking both by fov
(one normally and one inversely), and then applying effects to one of
the two.
I want to make the fov fullscreens more gradient, but as an effect this
is a good start
[Removes WALL_PLANE_UPPER by adding a WALL_PLANE overlay to material
walls (init cost comes
here)](2548933739)
@Mothblocks see this. comment in commit explains further but uh, we need
to draw material walls to the light mask plane so things actually can be
seen on them, but we can't do that and also have them be big, so they
get an overlay. Sorry, slight init time bump, about 0.5 seconds. I can
kill it with wallening.
[Moves SEETHROUGH_PLANE above
ABOVE_GAME_PLANE](beec4c00e0)
I don't think it actually wants to draw here
@Time-Green I think this was you so pinging for opinion
[Resprites FOV masks to be clean (and more
consistent)](f02ad13696)
[f02ad13](f02ad13696)
This is 100% donglesplonge's work, he's spent a week or so going back
and forth with me sharpening these to a mirror shine, real chill
## Why It's Good For The Game
Walls are closing in
## Changelog
🆑 LemonInTheDark, Donglesplonge
image: Redoes fov "mask" sprites. They're clean, have a very pleasant
dithering effect, and look real fuckin good!
del: Changed FOV, it no longer hides mobs, instead it blurs the hidden
area, and makes it a bit darker/oversaturated
/🆑
###### * It's technically possible if we start using render targets to
create 2 sets of sources but that's insane and we aren't doing it
## About The Pull Request
If the station rolls the "Cargo Gorilla" trait, a button will now be
visible on the lobby.
Clicking on this button before the round has started will add you to a
list of participants, one of whom will be selected to become a gorilla
when the round begins.
If nobody signs up (because they're really boring I guess) the job will
instead appear on the latejoin menu.
Once someone has become the gorilla the button will disappear.

While implementing this I noticed that an inverted check means we were
never populating the "GLOB.cargo_sloth" field which means the station
trait wasn't even working.
BEHIND THE SCENES
This also adds a generic "job station trait" which can be expanded in
the future.
Future developers can extend this to add other "rare jobs" with relative
ease.
By default I have made it so all subtypes of this trait are mutually
exclusive, only one can roll at a time.
This also means that I have converted "cargo gorilla" into a job, which
applies most of the code previously located in the mob's typepath or in
the station trait.
The fact that it is a job means that **admins** can enable any number of
gorillas to be present on the latejoin menu (but not the roundstart one,
as it is not possible to add Cargo Gorilla to your occupation
preferences) if they so desire.
The random beurocratic station trait, event, and traitor item (and the
job console) are not able to add gorilla slots.
Because I changed "Cargo Gorilla" to a job it now no longer exists on
the map until a player gains the role, and there wasn't a non-hacky way
to copy the name of this round's cargo sloth. Instead I just added a
small cargo gorilla name list.
## Why It's Good For The Game
Makes the presence of a fun trait more visible to players.
Means that people who aren't observing get a chance to be a monkey.
This is a framework several other people have wanted to exist for their
own features.
## Changelog
🆑 Jacquerel and Fikou
qol: If the station rolls the "Cargo Gorilla" station trait. you will be
able to sign up for the role from the game lobby.
qol: If nobody signs up to be the Cargo Gorilla then you can select it
from the Late Join menu and arrive on the arrival shuttle.
fix: The Cargo Gorilla will actually spawn.
/🆑
## About The Pull Request
Implements half of this (with some minor changes):

The ultimate goal of this is to split our attack chain in two:
- One for non-combat item interactions
- Health analyzer scanning
- using tools on stuff
- surgery
- Niche other interactions
- One for combat attacking
- Item hit thing, item deal damage.
- Special effects on attack would go here.
This PR begins this by broadining tool act into item interact.
Item interact is a catch-all proc ran at the beginning of attack chain,
before `pre_attack` and such, that handles the first part of the chain.
This allows us to easily catch item interaction and cancel the attack
part of the chain by using deliberate bitflag return values, rather than
`TRUE` / `FALSE`*.
*Because right now, `TRUE` = `cancel attack`, no matter what, which is
unclear to people.
Instead of moving as much as possible to the new proc in this PR, I
started by doing some easy, obvious things. More things can be moved in
the future, or technically they don't even need to move in a lot of
cases.
## Changelog
🆑 Melbert
refactor: Refactored some methods of items interacting with other
objects or mobs, such as surgery and health analzyers. Report if
anything seems wrong
/🆑
## About The Pull Request
- Fixes#80161
It's a seasonal bug i.e. occurs only during the holiday seasons. Yeah so
its caused by this code
2a359b8178/code/game/objects/items/food/pastries.dm (L191-L194)
So like it changes the icon state based on the season. Unfortunately
none of the icon states it picks are located in the icon file
`'icons/obj/holiday/halloween_items.dmi` i.e. it causes an invalid icon
state causing it to go invisible(not spooky just a bug).
We now make sure this cookie type does not change based on the season.
It will stay unique throughout the year
## Changelog
🆑
fix: coffin cookies are no longer invisible during the holiday seasons
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Making sure fake announcements have non-null references.
## Why It's Good For The Game
Just some quick runtime error I've seen in the runtime viewer.
## Changelog
🆑
fix: False anomaly alarms now work.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
I've stumbled across this enough to finally go through the entire
codebase and fix it. I left out changelogs simply because rewriting
history logs is bad.
## Why It's Good For The Game
I find it pretty annoying because I stumble across words that are
misspelled for a few seconds, and I'm likely not the only one who feels
like this. Less spelling mistakes in code are better.
## Changelog
🆑
spellcheck: Occurrences of "recieve" has been changed to "receive".
/🆑
I don't remember what was hard about this last time it took me like 20
minutes this time so I'm scared.
Removes dynamic simulations, only I have used them and it's a lot more
complicated now with this. I plan on making Dynamic simulations a part
of moth.fans anyway
## About The Pull Request
Standardizes vv_do_topic() procs on subtypes
Mostly formatting changes
- Add a !. check for every subtype
- Add a space in between each href_list
- Standardize !check_rights(), default is !check_rights(NONE) in the
event that something isnt specified
## About The Pull Request
Fixes https://github.com/tgstation/tgstation/issues/79866
Hadn't been updated to the new system where candidates are found during
round event setup. Changes the failure message for clarity on why it
fails, and sends a message to admins same as a successful outbreak.
## Changelog
🆑 LT3
fix: Disease outbreak: classic spawned from the admin secrets panel no
longer fails to start
fix: Disease outbreak provides a message about why it fails to start
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>