## About The Pull Request
Fixes several errors to spelling, grammar, and punctuation.
## Why It's Good For The Game
Improves readability and user experience.
## Changelog
🆑
spellcheck: fixed a few typos
/🆑
## About The Pull Request
Changes references to "reflector trenchcoat" in objective_items.dm to
match the name of the actual item "ablative trenchcoat"
## Why It's Good For The Game
Quality of life to prevent confusion from using the old name.
## Changelog
🆑
qol: Changes description of steal objective to match the name
/🆑
## About The Pull Request
The game adds the Contractor Baton to the "global tracker" whatever the
hell that is, from what I understand it's what determines the potential
bounty item pool, since the contractor baton is a subtype of the
telescopic baton; Which of course is not very appropriate considering
the baton came from the Syndicate in the first place. The code excludes
all subtypes of the telescopic baton so that we don't get something
goofy like this:

Credit: _shod for the image
## Why It's Good For The Game
When problem is fixed, problem no longer bad.
Originally I wanted to just add a custom text saying what a contractor
baton is instead of the telescopic baton, but was told it's not a good
idea. Boowomp. Anyways, stealing back a contractor baton from the
Syndicate who just GAVE someone that baton is a little weird I
suppooosseee.....
## Changelog
🆑
fix: You may no longer submit, or obtain, a spy bounty for the
contractor baton.
/🆑
## About The Pull Request
QM will not longer be tasked with stealing telescopic batons and the
captain's spare ID like all other command members are.
## Why It's Good For The Game
I just found it and thought it might've been unintentional since QM
spawns with a baton and is in line for acting captain.
## Changelog
🆑
fix: QM is now excluded from getting tasked with stealing telescopic
batons and the captain's spare ID, like all other command personnel are.
/🆑
## About The Pull Request
What are their goals? Why are they doing this? gets weird with Spy
objectives - namely by adding a lot more ways spies might be asked to
affect various targets around the station.
the first of these is by several flavors of Protecting targets (these do
NOT print a success at roundend in keeping with Spy design:)
- Protect (get a humanoid target off alive)
- Protect Nonhuman (get an entity off alive)
- Jailbreak (make sure a humanoid target escapes free)
- Detain (make sure a humanoid target gets taken out arrested)
the second of this is by a new escape condition:
- Exile (get off-station or off the Z-level by the end of the shift -
sometimes it's not just pods, you need to fuck off to space to win.)
the third is through a massive increase in the number of possible:
- objective templates
- departments to target (Command + Service added)
- specific locations to target
- general classes of objects to target (medicines, floor tiles, critical
infrastructure, etc.)
- efforts to target (such as meals, mechs, public supplies)
- ways to leave (you can be asked to abscond from the scene of your
crimes?)
## Why It's Good For The Game
More goofy and weird prompts to do more interesting things with Spies.
One thing I think we're sorely missing in our lineup is antagonists that
can act a bit more as deuteragonists - very possibly helping the crew
under certain conditions and frustrating the Hell out of them in others.
Since there's no way to check their objectives, and they get their
gear/progression through stealing shit, they're still very much an
antagonist and exist under the suspicion of doing bad... but, just going
by their objectives, introducing more varied (and in some cases even
benign) goals for them creates suggestions pointing to a lot more varied
and interesting stories if people choose to run with it.
## About The Pull Request
This PR aims to take care of a few potential hard dels and fix the
fenced goods category first and foremost.
The PR also adds a new one that enables you to buy mobs captured by
antags in advance, before they're sent back to the station. Unlike other
categories, it doesn't have "Launch" and "Teleport" as delivery methods,
instead it uses a special "Supply Pod" delivery method that ships the
chattel directly to your location. This method costs 400 credits,
however, if you've built the LTSRBT, shipment will be free.
Another thing, I always felt LTSRBT to be pretty fucking dumb as is. Way
too overpriced for the benefits it offers: a slighty cheaper delivery
method that, while definitely better than the other two, doesn't really
pay off or honestly even remotely compensate the 4000 credits you just
spent to get it, especially if you're only buying a couple items at
most. So I decided to remove it from cargo and add it to the blackmarket
as a 500 to 750 creds item, available every round.
Human mobs sold by the pirate bounty pad are no longer deleted, instead
they're properly ransomed and sent to the holding facility, much like
for contractors and tots. This means they're also added to the black
market.
## Why It's Good For The Game
The blackmarket system has some issues to it that need to be fixed
(otherwise the "Fenced Goods" and "Hostages" categories wouldn't work).
The Pirate Pad deleting "ransomed" mobs instead of actually ransoming
them is lame. The LTSRBT shouldn't suck as much. Also more market stuff.
This will fix#81809.
## Changelog
🆑
fix: Fixed the "Fenced Goods" black market category.
balance: Removed the LTSRBT from cargo and added it to the blackmarket,
reduced the price from 4000 to 625 on average.
balance: The time it takes for captured mobs to be automatically sent
back to the station from the holding facility has been increased from
3-4 minutes to 6.
add: You can buy mobs captured by contractors, traitors and pirates from
the black market and have them sent back to the station in advance. For
safety, they'll also be handcuffed (not always) upon delivery.
add: Human mobs sold by pirates are not deleted anymore. Instead,
they're now captured and sent to the holding facility.
/🆑
# Disclaimer: No Goon code was referenced or used in the making of this
PR
## About The Pull Request
[Design Document (Read this for more
information)](https://hackmd.io/@L9JPMsZhRO2wI25rNI6GYg/rkYKM9Yc6)
This PR adds Spies as a new roundstart antagonist type, inspired by
Spy-Thiefs from Goonstation.
Spies are tasked with stealing various objects around the station, from
insulated gloves to the black box, from the clown's left leg to the
bridge's communications console.
For every item stolen, the Spy is rewarded with a random item from the
Syndicate Uplink, plus some items uniquely available to the Spy. Stolen
items are then shipped off and sold on the Black Market Uplink, allowing
the crew - or maybe some other evil-doers - to get their hands on them.

More ideas for theft items and bounties are welcome.
## Why It's Good For The Game
See the design document for more information.
In short: Adds a solo antagonist which has less impact than your
Traitors and Heretics, but more impact than Paradox Clones and Thieves.
In other words: On the same tier as old traitors.
Seeks to embrace the sandbox aspect of antagonists more by having no
precise greentext objective, and instead some suggestions for chaos you
can embark in. Have fun with it!
## Changelog
🆑 Melbert
add: Spies may now roam the halls of Space Station 13. Watch your
belongings closely.
/🆑
## About The Pull Request
What it says on the tin. I also replaced checks with it everywhere I
found appropriate, hopefully without accidentally breaking anything.
## Why It's Good For The Game
We have a helper for most other antags, and it makes code a lot cleaner
and easier to read. I'm surprised we didn't have this one already.
## Changelog
🆑
code: added an IS_CHANGELING() helper and used it where applicable
/🆑
## About The Pull Request
I woke up today and thought 'what would be easy thing to do today so I
can say I've done something?'. Then I remembered I saw several gangtool
usages the time I split radio up, and I could remedy those. 7 hours
later, device.dmi is split in a folder of its own, and I've also given
unique sprites to door remotes and landing desginators.
## Why It's Good For The Game
The device.dmi was kind of a mess.
## Changelog
🆑
/🆑
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
Crew with TRAIT_NO_DNA_COPY are no longer valid targets for identity
theft objectives. Changes some code to make it easier to exclude
potential objective targets.
Changelings that roll an identity theft objective while there are no
valid targets will now get an ordinary escape objective rather than a
free objective.
Fixes#77764
## Why It's Good For The Game
Objectives are usually meant to be achievable.
## Changelog
🆑
fix: Changelings will no longer get an objective to impersonate crew
without absorbable DNA.
fix: Changelings will no longer start without an escape objective.
/🆑
## About The Pull Request
Instead of choosing 2-3 brothers, *one* person will be selected and
given a flash which can convert one other person over. In accordance to
the existing 10% chance for 3 members, there is a 10% chance that the
first person converted will receive a flash of their own.
Expectation is people will flash a friend or a robust guy or whatever.
My intent is primarily to see if this kind of blood brothers is more
enjoyable to play with/against, and if their inclusion in a round
increases the general chaos of it. My theory is that since most likely
blood brothers will be people who know each other, that it can become
more consistently interesting to the rest of the crew. That or they just
murderbone together idk
Fikou and head admins said they wanted this to replace rather than add
which I agree with.
## Why It's Good For The Game
Keeps the sandboxy aspect of blood brothers (no uplink) while likely
making it more enjoyable to play. Conversion is equally as simple as
revs for the user, and is just as intuitive to the one being converted
since there are no new mechanics thrown in your face.
Blood brothers is currently disabled everywhere on the main servers
except for MRP. I think this form will be more appealing to all
rulesets. If left enabled, Dynamic now has more antagonists to make
rounds diverse with and I want that
## Changelog
🆑
add: Instead of teaming up random people together, blood brothers will
now start out with one player and let them convert a single other person
over to blood brother using a flash.
/🆑
## About The Pull Request
I'm still not satisfied with how ghost notifications work. This gives
every notification with a source (99% of all notifications, in other
words) a link to jump/orbit. Currently, notifications with "play"
interactions would only get the interact link, so jumping to the source
was pretty annoying.
It removes posting the entire message in the alert tooltip, as some got
pretty lengthy and it didn't seem to fit. To replace this, they will
always use headers
After:



NOTIFY_JUMP and NOTIFY_ORBIT have been merged, since the only difference
seems to be whether it's a turf. The result shaves off some redundant
lines of code, since most-every usage of notify_ghosts uses
NOTIFY_ORBIT.
## Why It's Good For The Game
More standardization for the ghost notification system. Adds a few alert
headers that never had them. All in all, makes it easier for creators to
throw alerts at ghosts
## Changelog
🆑
qol: Nearly every ghost alert should now feature a "VIEW" button, even
those with click interaction.
del: Ghost alerts no longer show the entire message in the tooltip,
instead have been replaced with titles.
/🆑
## About The Pull Request
This helps clean up my favorite helper proc in the whole codebase,
`notify_ghosts()`.
The notify_suiciders, ignore_mapload, and flashwindow args are GONE.
They have been replaced with the notify_flags bitflag argument. This was
intended to make deadchat announcements a bitflag argument too, but
those got reverted right before I originally wanted to submit this PR.
The on-screen popup now shows the notification body when you hover it
with your mouse again. The format is now `[notify_ghosts message] --
[click action (orbit/jump/play)]`
Every single `notify_ghosts()` call has been changed to multiline format
and has been given trailing commas. Pretty!
## Why It's Good For The Game
Cleans up a proc that is very popular and going through a lot of changes
at the time.
Allows for further flexibility when this proc inevitably gets tweaked or
improved. 12 -> 10 args is an improvement, and it doesn't impact the
helper's flexibility at all.
## Changelog
🆑 Rhials
code: The notify_ghosts proc has been cleaned up. Please report any
abnormal changes in deadchat notification behavior.
qol: The on-screen deadchat popups now contain the notification blurb
when hovered with your mouse again.
/🆑
## About The Pull Request
- As the size of the announcement proc has grown over the past few PRs,
did a pass over them for readability and consistency
- Include the arg names for coders unfamiliar with the new announcement
format
- Replaced leftover hardcoded Central Command text with the command name
proc, so all announcements reflect the command name if changed by an
admin
- Replaced hard coded emergency shuttle timer text with the actual
timeleft vars, so it's correct if the timers are changed for any reason
- Darkens the dark mode blue/red headers to be more red less pink, while
staying in accessibility standards
- Adds a lower profile grey colour for automated non-Central Command
announcements
## Changelog
🆑 LT3
code: Emergency shuttle announcements no longer use hardcoded values
code: Central Command announcements now correctly use its new name when
changed
spellcheck: Consistency pass on event announcements
/🆑
## About The Pull Request
Oopsie doopsie: Observers don't have minds, so this excluded them from
midround
## Why It's Good For The Game
More midround candidates
Fixes#79437
## Changelog
🆑
fix: Fixes midround selection for observers
/🆑
<!-- 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
Adds the roundstart pop count and the calculated max threat to blackbox
logging of dynamic threat.
This allows for identifying lowpop shifts and more intelligent analysis
of dynamic threat.
<!-- 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
I need this added to better track what's going on when analysing threat
distribution, as all threat stats will bias low with the inclusion of
lowpop shifts capping max threat.
<!-- 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
No player-facing changes.
<!-- 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: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## About The Pull Request
Someone forgot to put `as anything` on an iteration of an array
of typepaths. Easy fix.
## Changelog
🆑
fix: You will no longer be asked to construct meteor shields on stations
which cannot be hit by meteors.
/🆑
## About The Pull Request
Reputation has been renamed to 'Threat Level' to more accurately
represent what it means.
Midround and latejoin traitors no longer have access to secondary
objectives, the ones which give TC and objectives.
## Why It's Good For The Game
Midround antagonists, like traitor, shouldn't really have the
progression system that is meant for roundstart. Final objectives in
particular are only suited for traitors who have worked towards it from
the start.
Reputation wasn't really a good name for the player-facing progression
system of traitors as you'd passively gain progression which didn't make
since if it was supposed to be your reputation.
## Changelog
🆑
balance: Removed secondary objectives from midround and latejoin
traitors.
grammar: Renamed reputation to threat level.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
Mirrors logging of various dynamic parameters to the blackbox database.
## Why It's Good For The Game
When people want to gather data about dynamic threat, it's usually
wanting this kind of information. And wanting it in quantifies several
orders of magnitude greater than is reasonably practicable to download
and parse logs.
Chucking some Dynamic logging in the blackbox allows information for an
arbitrary number of shifts to be gathered in seconds.
Server name and curve parameters are stored alongside it, allowing data
to be filtered onto to specific servers and further filtered/categorised
by the curve parameters.
“A codebase grows great when old coders store logs whose data they know
they shall never create meaningful statistics from.” -Poes Proverb
## Changelog
No player-facing changes.
## About The Pull Request
In large PRs (#78782 (3415828c6b)), some
mistakes tend to be made.
Backend Fixes:
* Removes excess and un-necessary `on_creation()` procs for the status
effects. The work is already done in the parent
`/datum/status_effect/revenant`, no need to duplicate it.
User Facing Fixes:
* I copy-pasted too hard and accidentally nerfed the holy hand grenade's
effect on revenant. It was originally intended to stun for 10 seconds,
and I had no interest in changing that to 2 seconds. My bad.
* Revenant midrounds were broken because I thought observers had minds,
whoops. I really wish there was a better way to transfer clients into a
new mob than key mutations in these instances though.
* Revenant Harvesting is fixed, because I forgot that we would be
incapacitating the mob with the paralyze status effect. The proper flags
are now passed into the `do_after()` and it should now give you
delicious essence.
## Why It's Good For The Game
Mea culpa.
## Changelog
🆑
fix: The Holy Hand Grenade's effect on revealing a revenant had its
duration accidentally nerfed, it is now back to 10 seconds.
fix: Revenant midrounds should now properly run.
fix: Revenant harvesting should now let you actually pass the final
do_after so you can harvest that sweet essence.
/🆑Fixes#78925
## About The Pull Request
I felt bad about taking all the "easy" ones, so let's change it up with
a decently difficult one. Revenants are now basic mobs! This alone
doesn't change much of anything because it pretty much overrode much of
simple_animal code. However we do a few new things.
* Multiple code improvements! No more weird proc names that aren't
`snake_case`, cleaner variable names, more dmdoccing, etc.
* Files are now reorganized, Rather than a 800-line dogshit monofile,
we're all nice now
* Multiple logic improvements, like early returns to make stuff more
readable and the like. many `isnull()` yes
* Instead of abusing key ownership logic, we use `mind.transfer_to()`
instead for much cleaner behavior when we need to change stuff
* Instead of iterating over the entire list of mobs to find dead mobs,
we use a new `revenant_relay()` system that automatically handles
broadcasting revenant messages to all observers and fellow revenants
(like `blob_talk()`)
* Instead of having a weird invisible "corpse", we move the revenant
inside the actual ectoplasm when they die. This drastically simplifies a
lot of wacky code that was completely useless since we still had the mob
to work with, but now it's a lot cleaner when it comes down to it.
* Some more hooks into stuff like `Life()` that might be useful for
other people in the same way this is.
* Less <span> crap, more macros, wahoo
* Uses an `examine_block()` for when we relay instructions to new
revenants. also cache those instructions to save time in the long run
* Revenants being stunned, inhibited, and revealed are now managed by
status effects rather than being chicanery on `Life()`
* Everything should now just in general be a lot nicer to work with.
This list is not exhaustive but a lot of the junk 7-year-old code has
been gutted and replaced with the modern standards.
There are stuff that I explicitly didn't touch and will not be touching
in this PR as it's already rather large.
* Revenant actions. I touched some proc names but I didn't alter the key
ways they work.
* Revenant movement. That's another can of worms.
* Revenant event code. I just made it use the transfer to system to make
a closed loop and that's about it.
* Revenant AI. They don't have any, it's an event/admin spawn. I'm not
adding AI here.
## Why It's Good For The Game
Revenants are more extensible now rather than being a real big
clusterfuck of bullshit, should be much easier to tweak stuff here and
there or logically follow how the code for this fella should go. The
number of weird revenant bugs should go down since we do stuff more
simply- but there could be some sleeper bugs that can bite us.
## Changelog
🆑
refactor: Revenants, the mob that's split between planes of Life and
Death, have been refactored into a basic mob. While this alone shouldn't
touch behavior, a lot of the backend code has been gutted and refactored
to try and furnish a better antagonist experience. This might mean that
some weird stuff can come up and around, report something if it's
utterly broken.
code: In order to better facilitate some code, you do not ghost outside
of a revenant on death, you simply get transferred into the ectoplasm.
You should still be able to speak with your ghost friends on how hard
you got wrecked or if you'll be able to resurrect though.
code: The timing on revenant stuff such as being revealed, stunned, and
inhibited (by holy weapons) should be tweaked a bit to allow better
management. This should mean that getting unstunned and such should be a
bit more precise now.
qol: Revenant instructions are now relayed in a neat little examine
block.
/🆑
## About The Pull Request

This PR adds a very ugly menu which allows admins to force dynamic
rulesets to be enabled or disabled.
Some admins asked if someone could add this and it seems reasonably
useful.

The information you have available becomes slightly more detailed once
the game is actually running, because then we know how many players and
how much threat there is.

I don't know why the weight of every midround is 0 when I run locally.
It's fine.
Unfortunately, the interface I have crafted is hideous. This is because
it's not part of tgui and I am not very good at working with byond UIs
without my beautiful typescript. It functions though.
If anyone has any pointers I'll take 'em.
"Force disabling" a ruleset simply ensures it will never run.
"Force enabling" a ruleset disregards minimum population and minimum
threat rules, but doesn't ensure that the ruleset will run. It might
still be skipped due to low weight, insufficient threat to _buy_ it, or
other disqualifying factors.
## Why It's Good For The Game
It was an admin request so presumably they have some plans for it.
It's a less-intrusive way of theming a round than disabling dynamic and
running all the midround rules yourself.
If they want to temporarily set the game to traitorling I guess they can
do that. Or only heretic/cult.
## Changelog
🆑
admin: Admins can turn off dynamic rulesets (or force them on despite
not meeting the qualification criteria) on a per-round basis.
/🆑
## About The Pull Request
The parent/default for rulesets had all the other metaprotected roles
except warden. Adds warden to the list as I suspect this was an
oversight.
## Why It's Good For The Game
It's an edge case, but if you're using the default required enemies for
some reason, you probably should count the other guy with access to all
the guns too.
## Changelog
🆑
fix: Added warden to list of default required enemies for rulesets.
/🆑
## About The Pull Request
As the title says, headrevs and heads of staff during a revolution won't
be disqualified when they either disconnect or go AFK. Instead, they're
given a 2 minute timer to reconnect or stop being AFK and a warning is
sent out to admins so that they can offer up the player if time is close
to running out.
Two admin messages are sent, one when they're initially disconnected or
AFK and one sent a minute after, giving the admin a minute to act on the
log.
## Why It's Good For The Game
Disconnects can happen for any number of reasons, but sometimes they can
be unintentional, like the game crashing or briefly losing connection.
This will give headrevs and heads more leeway. Additionally, a solo
headrev who disconnects before they've converted anyone could be spotted
by admins and replaced so that the revolution gamemode isn't wasted.
## Changelog
🆑
balance: Head revolutionaries and heads of staff are no longer
immediately considered disqualified when going AFK or disconnecting and
are given a 2 minute grace period.
admin: Admins now get a log when a head revolutionary or head of staff
disconnects or goes AFK during a revolution. They also get the same log
1 minute after to give them a chance to act on the information.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
See title
## Why It's Good For The Game
You can still end up qualifying for a role if you get lucky. The message
is primarily there to tell players they weren't able to become an
antagonist because their preferences are set up in a way that they're
likely to return back to lobby.
## Changelog
🆑
spellcheck: Tweaks the message that players get when not being able to
qualify for roundstart antag to be more accurate as to what's happening.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
small tweaks for bitrunning
- ability disks grant a huge power spike which should let me balance
megafauna health more closely to the real thing
- added a check for bit avatars to skip dynamic midround checks
- more info for netpods mostly
<!-- 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
fixes#78513fixes#78575
<!-- 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. -->
🆑
add: Netpods and quantum servers now have more examination info
fix: You no longer lose antag status if you receive it in the vdom.
fix: Beach bar shouldn't have visible atmos piping anymore.
fix: Adds more lighting to the vaporwave vdom level.
balance: Buffed vdom megafauna health to compensate for new ability
disks.
/🆑
<!-- 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
Fixes#67318
Secret documents inserted into a folder would result in failure. This
was frustrating for people who kept the original folder it was spawned
in. It has now been fixed properly.
## Why It's Good For The Game
Greentext is good.
## Changelog
🆑
fix: Fix secret documents steal objective failing while inside folder.
/🆑
## About The Pull Request
As the title says, you can no longer become an antagonist if you can't
qualify for a role beforehand. How this works is that it runs job
assignment before antagonist roles are handed out to see which players
can qualify for a job role. It then undoes job assignments and then runs
antagonist assignment.
This is to prevent players from setting a highly contested role to low
priority so that they have a 0% chance of ever getting it, whilst still
being eligible for every antag role.
It's not completely foolproof as it's not really possible to account for
the fact that some players may become antagonists, thereby freeing up
some job slots. Since it's an approximation, it means that players who
put themselves at a high chance of returning back to lobby due to their
preference choices have an overall lower chance of becoming an
antagonist as they can be excluded from the antagonist roll due to the
random nature of job selection.
If players want to prevent this from happening, simply set a lot of jobs
to low/medium priority or adjust the "Return back to lobby" preference
to any other preference.
## Why It's Good For The Game
Prevents players from rolling antag without ever intending to play the
game as a non-antagonist.
## Changelog
🆑
fix: Fixed players being able to roll antagonist without ever being
eligible to play any role. Players who have their preferences set up so
that they're likely to return to lobby when the round starts have a
lowered chance of becoming antagonist.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
## About The Pull Request
yeah uh its a lazyloaded template
the ruleset loads the template
if a heretic gains the sacrifice knowledge and it somehow wasnt loaded
already by the ruleset, loads it
## Why It's Good For The Game
closes#77917
## Changelog
🆑
refactor: heretic sacrifice room is now lazyloaded
/🆑
## About The Pull Request
Let's take an example of a threat roll of 50 on 0 pop.
```
threat_level = 50
low_pop_maximum_threat = 40
max_threat_level = 100
SSticker.totalPlayersReady = 0
low_pop_player_threshold = 20
threat_level = min(threat_level, LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold))
```
Subbing in, we get
```
threat_level = min(50, LERP(40, 100, 0 / 20))
```
What does the LERP churn out?
```
#define LERP(a, b, amount) ( amount ? ((a) + ((b) - (a)) * (amount)) : a )
a = low_pop_maximum_threat = 40
b = max_threat_level = 100
amount = SSticker.totalPlayersReady / low_pop_player_threshold = 0 / 20
LERP(40, 100, 0 / 20)
```
( 0 ? ((40) + ((100) - (40)) * (0 / 20)) : 40 )
So, for 0 pop - since 0 is FALSEY, it always returns 40 threat no matter
what. This effectively means all threat rolls > 40 on 0 pop get clamped
down to 40.
And how about 10 pop, somewhere in the middle of that and the 20 lowpop
limit?
( 10 ? ((40) + ((100) - (40)) * (10 / 20)) : 40 )
Which means we're using ((40) + ((100) - (40)) * (10 / 20). Which equals
70. So all threat rolls > 70 get clamped to 70.
So all LERP(low_pop_maximum_threat, max_threat_level,
SSticker.totalPlayersReady / low_pop_player_threshold) is doing is
LERPing the max_threat level.
Of course I didn't need to really break it down, but I felt it was
useful to showcase that yes the LERP is LERPing as expected. It's fed
two max threat levels, an amount and lerps between them.
So we're not really **scaling** the threat in any way for low pops,
we're just clamping it to this LERP'd max threat value. It massively
biases the high threat ranges at lowpop. How does this look in practice?
Well, I quickly mocked up a dynamic sim in Python. Here's what I found:
0 pop, current dynamic config, old code

10 pop, current dynamic config, old code

20 pop, current dynamic config, old code

Instead of using the LERP'd max threat to clamp after we've calculated
everything, I think it would be better to use the LERP'd max threat **in
the Lorentz calculation itself** to create more predictable lowpop
threat curves.
This is my simulated output using the LERP'd max threat to generate the
Lorentz curve:
0 pop, current dynamic config, new code

10 pop, current dynamic config, new code

20 pop, current dynamic config, new code

And just for good measure, 100 pop, current dynamic config, new code

This should lead to WAY more sensible threat scaling for dynamic at low
and **especially** extreme low pop levels.
## Why It's Good For The Game
Current low pop threat distribution is really bad and biases towards the
highest threat dynamic could possibly role for that pop level the
farther away from the lowpop limit the shift starts as.
This really shouldn't be the intent and it makes balancing lowpop threat
basically impossible. By generating a more constrained Lortentz curve,
dynamic threat scales across all population levels in a more sensible
and balanced way.
## Changelog
🆑
fix: Fix poor dynamic threat distribution at lower population levels,
causing dynamic to generate better threat curves at lower population
levels than it did before.
/🆑
## About The Pull Request


This PR adds the ability for solo antagonists (Traitor, Changeling,
Heretic, Wizard, Malfunctioning AI, and Ninja) to "write-in" their own
objectives in place of the ones the game gave them.
For traitors this is located on the uplink (though the button is not
present if you aren't the owner of the uplink, thieves can't give you a
troll objective) and for everyone else it is on the antagonist
information panel.
Pressing this button will replace all of your objectives _except_ ones
like "escape alive" or "survive" or "die a glorious death".
By default a player can only do this once per round, but the Traitor
Panel admin tool contains a button which can display the prompt again.
Custom-entered objectives are not mechanically tracked in any way and do
not report success or failure on the round end screen, whether they were
successful or not is up to you the audience. Resultingly, doing this
will make you ineligible for getting the hardcore random points from
completing your objectives.
Admins are capable of using this button to show the prompt to _any_
antagonist, including team antagonists, but do so at their own risk. A
single cultist changing their objective to something else only updates
them, not their team.
Admins can also choose whether or not it replaces existing objectives or
just adds a new one entered by the player.
When someone sets a new objective, it informs any active administrators
of their choice and provides linked buttons to send them a syndicate
radio message or immediately smite them, because unfortunately our
players cannot always be trusted with arbitrary text entry.
I _didn't_ make this a system which requires approval because I don't
think admins _want_ that level of micromanagement, although plausibly if
it is thought to be a good idea I could add a time delay and reject
button similar to the "rename the station" charter item.
Heretics work slightly differently and have an "Are you sure?"
confirmation other antagonists lack.
This is because Heretic objectives are directly tied to ascension, thus
by replacing the objectives you are locking yourself out from being able
to do it.
I don't _necessarily_ think this is a terrible thing, because "try to
ascend" _is_ the default objective. There's no point entering a new one
if that is what you want to do anyway.
While I was in here I gave Ninjas a very rudimentary custom antagonist
panel, because they didn't have one.
I also made their C4 display where it can be detonated on examine, in
case you no longer have the relevant objective to reference.
<details>
<summary>Other previews</summary>





</details>
## Why It's Good For The Game
It's a reasonably frequent refrain that "Objectives are just guidelines"
and that more interesting players should strive to ignore them and do
something else, I would hope this would encourage that kind of
behaviour.
If you _are_ going off and doing your own thing, now other players can
actually see what it was that you were trying to do when the round ends
(and judge you based on whether you actually did it).
## Changelog
🆑
add: Traitors, Changelings, Heretics, Wizards, Malfunctioning AIs, and
Ninjas can now all reject their original objectives and provide one of
their own in its place. A Heretic doing this will no longer be able to
ascend.
add: "Custom" objectives which aren't mechanically tracked will no
longer report success or failure upon round end.
qol: Space Ninja spider charges will now display where they can be
detonated when examined, if you are a ninja.
/🆑
## About The Pull Request
Fixes#77943
Moves the generation of traitor theft objective targets from `new` of
`/datum/objective/steal` to `initialize` of
`/datum/controller/subsystem/traitor`
`/datum/objective/steal` we would generate the full list of possible
theft targets _only_ if the list was already empty.
A recent PR added a secondary "destroy item" objective which has no rep
prerequisite, as a result it is initialised as soon as a traitor datum
is assigned. Importantly this happens _before_ the traitor's theft
objective is assigned.
The "destroy item" objective generates its own item targets using the
"theft item" datum as it is a type of thievery, this pollutes the list
to contain more than 0 entries.
From this point on the only things people can be assigned to steal are
the items that traitors can be assigned to destroy early in a round,
which aren't valid for most kinds of theft objective.
Making the subsystem generate the list before traitor datums are
assigned resolves the race condition, the number of rounds where
_nobody_ has any kind of theft objective and this list is unused is
exceedingly small.
## Why It's Good For The Game
You can get primary theft objectives again.
## Changelog
🆑
fix: Traitors should generate with "free objective" less often, and will
once more be assigned to steal things.
/🆑
## About The Pull Request
This pr seeks to re-add the compact shotgun (slightly buffed with 1 more
ammo) and buff up its larger brother the combat shotgun (with 2 more
ammo.)
## Why It's Good For The Game
With the recent laser buffs, there is a real possibility for the compact
shotgun to return as a unique weapon to make the HOS slightly more
powerful. I am aware that it was a warden's weapon previously but the
HoS doesn't really have many fun toys to play with. The warden already
has crav maga (100x cooler than the laser) so giving this beast to the
HOS could help make it a more attractive and powerful head to play.
(Given 1 extra shot to keep up with the crazy lasers nowadays.)
In regards to the slight combat shotgun buff. The gun itself is ass,
it's barely ever used and the riot shotgun is superior because you can
actually put it in your armour slot. The hope is that this buff will
make people actually use it because it carries a lot of shots now so the
viability may increase.
## Changelog
🆑
add: Added compact shotgun to the hos locker
add: Added compact shotgun as a traitor objective
balance: gives the compact shotgun 1 extra shot
/🆑
## About The Pull Request
With the blessings of @Watermelon914 I am removing the two objectives
for placing posters and spraying graffiti.
These old objectives are not dead. Their items have moved to the
Badassery section of the uplink.
A box of 3 demotivational posters can be bought for 1TC with 0 rep.
The spraycan can be bought for 1TC with 0 rep.
In their place comes one new objective and one extended objective.
The new objective is Assault a Crewmember. This objective requires you
to attack the specified target 2-5 times (random on objective
generation). It tallies from any attack that filters through the
`/datum/element/relay_attackers` element and has an "attacker"
associated with it.
Although it asks you not to kill the other player, it doesn't fail if
you kill them.
I have expanded the low-risk theft objectives with items like a mime
mask, lawyer badge and a fake moustache (commonly on cooks).
Finally, I've added a very low level set of steal-and-destroy objectives
aimed at some items that will require a bit of basic breaking and
entering, and the destruction of which may hurt crew morale.
```
/datum/objective_item/steal/traitor/donut_box
/datum/objective_item/steal/traitor/rpd
/datum/objective_item/steal/traitor/space_law
/datum/objective_item/steal/traitor/granted_stamp
/datum/objective_item/steal/traitor/denied_stamp
/datum/objective_item/steal/traitor/lizard_plush
/datum/objective_item/steal/traitor/moth_plush
/datum/objective_item/steal/traitor/insuls
```
This PR also fixes clown shoes missing a proc override to allow them to
actually register as a theft objective.



## Why It's Good For The Game
Basically my discussion with Watermelon focused on the idea that the
graffiti and poster objectives weren't really crimes. They baited
antagonists into very passive play early-game.
These new replacements encourage a more antagonistic playstyle. Starting
fights plus B&E are two bread-and-butter play paradigms for antaggery.
Giving a few early game theft + destroy options with a mix of impactful
items (like insuls and RPDs) versus more symbolic or emotive items
(plushies, donut boxes, Cargonia stamps) gets antagonists out and about
in the station, warming themselves up.
And having an objective to assault players (even if you don't kill them)
allows cheeky antags with a penchant for shittery to start fights with
players and start genuinely impacting the shift, involving sec and
drawing players into their antaggery.
Both of these natually ease players into the more substantive theft and
murder objectives.
The existing spray and posters are actually thematically super cool.
Traitors now have even more access to them since they can be bought for
1TC per spraycan/3-pack of posters. This lets antags with TC to spare
run gimmicks around them and adds extra fun to the Badassery section.
## Changelog
🆑
del: Traitor objectives to place posters and graffiti the station have
been removed.
add: The items associated with the poster and graffiti objectives can
now be purchased from the Badassery section of the uplink. The posters
come in a box of 3 for 1TC, and the spraycans are 1TC each.
add: Adds a new Assault traitor objective, requiring you to the attack
the target a few times without needing to kill them. Earn TC and
reputation by starting barroom fights and bait players into escalation
battles for fun and profit.
add: Expands low-risk steal objectives to include the Chef's fake
moustache, Lawyer's badge, and Mime's mask.
add: Adds brand new shift start Steal & Destroy objectives for early
breaking and entering. Smash your way into a sec checkpoint to grab a
Space Law book, engineering to grab some insulated gloves or the psych
office to kidnap their moth plush.
fix: Fixes an issue where the steal clown shoes objective would never be
valid.
/🆑
## About The Pull Request
Yeah, the built-in `arctan()` proc actually returns degrees rather than
radians so I had to revert the change to the macro. Also, I had to
revamp the whole formula once again because the old one was eh. The
random location of -0.5 to 0.5 meant it never went lower/higher than the
40-60% threat range, and the RNG deviation was crappy.
As a bonus, I slighly lowered the threat requirements for the wizard's
gun/magic/events rituals, since reaching a full 100 is a smidge less
likely now (previously the odds were one in ten if the threat score was
higher than 90%, now it's a 0.5% chance in total, as the threat is
rounded to intervals of 1).
## Why It's Good For The Game
This will fix#77726.
Here's the updated desmos graph:
https://www.desmos.com/calculator/fpc7gwtwla (the red curve is the one
without the deviation, the black one is with the deviation)
Gimme a few minutes to run one last test, tho. I cannot trust myself too
much.
## Changelog
🆑
fix: Fixed dynamic.
/🆑
Alternative Title: I'm bad at maths but thank goodness graphing
calculators exist.
## About The Pull Request
So, it was reported on #77329 that `dynamic/proc/lorentz_to_amount` is
kinda "jagged", as you can see in the issue report yourselves. There,
they also suggested a better version with the actual segments connected.
However, as I internally shouted "It's copypasting time!", My gears came
to a halt. I promptly realized, looking at the graph, how it looked like
an approximation of a comulative distribution.
Fuddled, I wondered if we could replace that switch() call and its
indented crude algebra with the actual macro of the lorentz cumulative
distribution, which I did, not without the use of softwares to alleviate
my incapacity at performing such complex mathematical functions off the
top of my head, and with some peculiarities and improvements attached to
this PR, such as, instead of clamping, multiplying the value of the
distribution by the maximum threat.
## Why It's Good For The Game
This will fix#77329. The formula was tested a graphing calculator,
though it may work differently than the original proc, a testmerge is
reccomended.
## Changelog
🆑
fix: Fixed some jank with the dynamic threat curve.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Ressurects this old concept from (#64530), if we're making pAIs conform
to being personal assistants more often then they should be better at
assisting your person.
You can insert a pAI into a MODsuit simply by using the card on a
MODsuit with an open panel. You can eject it again from the MODsuit
control panel UI (though the maintenance panel still needs to be
unscrewed).
Inserted pAIs can:
- Deploy and undeploy suit parts.
- Turn the suit on and off.
- Monitor any stats on the MODsuit panel.
- Activate any of your suit actions.
Inserted pAIs cannot:
- Move the suit.
This does not remove the ability to place AIs into your suit. AIs can do
all of the above but can _also_ move the suit around while you are
critically injured.
You can't have _both_ an AI and a pAI in your suit at the same time.
Additionally I had to mess around with the backend for pinning actions a
little bit.
AIs who tried to pin MODsuit actions to their screen would pin them to
the UI of the person wearing the suit instead, because it passed through
`grant_item_action`. We _want_ to use that interface for the other stuff
it does, but we need to catch and override who is _actually_ being
granted the action so it goes to the person who pinned it rather than
the person wearing the suit.
## Why It's Good For The Game
Gives more things for your pAI to do, now you can delegate manging some
suit functions to your little buddy.
## Changelog
🆑
add: pAIs can be inserted into MODsuits and can control suit modules
(but are not capable of moving the suit).
fix: AIs/pAIs in MODsuits can properly pin actions
/🆑
## About The Pull Request
- "Long shift" can now be earned from sub 10 minute rounds rather than
sub 5 minute rounds
- Admin restarts no longer give out "Long shift"
## Why It's Good For The Game
I do not think this achievement can *possibly* be earned right now. Like
at all.
Nuke Ops and cult are the only antags that can possibly do it and it's
incredibly infeasible (requiring that they nuke the station or summon
Nar'sie in just 3 minutes!)
So I bumped up the timer to 10 minutes. This means that ops can get it
if they nuke the station in 8 minutes, cult can get it if they REALLY
speedrun, and revs can get it if they beeline the heads.
I checked the DB for stats on this achievement and it's only been earned
in 3 rounds across the last year - `208780` (admin restart due to a bug)
`192892` (admin restart due to a bug?) `186192` (admin restart).
So I also prevented admin forcing the round to end. (I don't know if it
catches admin reboots directly I'll have to check that.)
## Changelog
🆑 Melbert
balance: The "Long Shift" achievement is now feasibly obtainable, and
admins can no longer trigger it unknowingly
/🆑
## About The Pull Request
Fixes a bunch of stuff broken by #76822, including APC control console,
malf blackout ability, shunted malf pinpointing, Admin APC recharge and
others.
## Why It's Good For The Game
Yes.
## Changelog
:cl:Thebleh
fix: Fixed several APC related issues.
/🆑
## About The Pull Request
Adds a new station trait: Radioactive Nebula!
The station is located inside a radioactive nebula. Space background and
lighting is different shades of green. Objects in space will also glow
green. (This is kinda lying, since the glowing stuff isn't radioactive,
you just get an element that slowly irradiates you, though people and
certain objects that get the 'IRRADIATED' status may still double-whammy
you)
Do not go into space without rad-protected gear, or you will get very
sick very fast. RAD-protection MODsuit modules spawn in robotics and are
also immediately researched.
The nebula does protect against external threats, like pirates, ninja's
and nukies. They can still get to the station pretty well, but they
can't stay in space for extended periods of time
To make it more livable, public rad protection gear will spawn in
lockers around the station. Everyone will also spawn with potassium
iodide pills in their emergency box. Dynamics threat is also reduced by
30, so there's a proclivity towards more lower threat rounds when the
radioactive nebula is present. Radioactive resonance virus cannot be
generated though, since it kinda obliterates any and all challenge and
threat

**Shielding**

In order to protect the station from radiation, nebula shielding units
need to be constructed. Five spawn ready-to-built in engineering, and
more can be bought pretty cheap from cargo. (Normal radstorms are
disabled)
The gravity generator has 20 minutes of innate shielding, where every
nebula shielding unit adds another 20 minutes. 5 are needed to
completely block all radiation even when the gravity gen is down, but
constructing more is recommended in-case of sabotage/destructions/power
outtages.
Active nebula shielding will passively generate tritium. You can either
vent/ignore this, or use it for something. I'm not an atmos tech but I'm
sure you can do something with it
_What happens when no shielding units are constructed/they all fail?_
The station will suffer a 5 minute long radiation storm, with only
shuttles being excempt. The storm is nerfed strongly, and you can tank
the 5 minutes, but you'll be pretty sick. After the 5 minutes are over,
central command will send an emergency shielding unit which will block
the radiation for 10 minutes and warn the station to set up nebula
shielding.
## Why It's Good For The Game
The station being inside a radioactive nebula shakes up a pretty major
aspect of the game (that being the 'space' in space station 13). Hallway
decals are colored green, display screens will display radiation
markings, carps blend with the nebula, etc. Putting the station inside a
radioactive nebula shakes up the rules of the game and what people can
expect. Suddenly, you can no longer just go outside without taking meds
or getting proper radiation protection, encouraging people to stay cozy
and inside.

Inside, the crew gets the goal to set-up radiation shielding to defend
themselves against the nebula, rewarding a creative engineering
department with passive resource income and protecting the station
against massive radiation storms. I think it's nice to give engineering
something to set up. Even if they don't care, they can just plop it down
somewhere in a closed room and be done with it.
The radiation storm is pretty aggressive, but very survivable if you use
your potassium iodide pills, the extra radiation suits or whatever
chemistry has whipped up.
Most importantly, it gives the entire station a common enemy: the
nebula. Everyone is encouraged to prepare against the mechanics.
Chemistry can make meds, viro can make protective virusses, robotics
gets encouraged to make radprotected MODsuits, engineering gets to
set-up radiation shielding, assistants can look at space or whatever
assistants do.
<details>
<summary>Cool images</summary>




</details>
## Changelog
🆑
add: Adds a new rare radioactive nebula station trait! Get ready and
PREPARE, before it gets in...
tweak: Nearstation space area lighting may look slightly different
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Removes all of the duplicate global lists for specific machine types
where the only thing they do is store all machines of that type.
Adds machine tracking to SSmachines in the form of a list for all
machines, and then an associative list for machines by their type.
Previously we have machines in multiple global lists, such as airlocks
being in GLOB.doors, GLOB.airlocks, GLOB.machines.
This makes that not a thing, and also means that iterating through
GLOB.machines looking for a specific type is no longer as expensive.