## About The Pull Request
https://github.com/tgstation/tgstation/assets/28870487/2451bc69-db1e-420d-9a18-2f899ca65427
This introduces a new unfavorable situation (non-antagonist random
events that dynamic triggers under certain circumstances), restricted to
planetary maps (Icebox). An earthquake occurs, felt by everyone on the
map, forming a fault that tears the a hole somewhere on the station.
The fault zone is indicated by shaking tiles, which gives a chance
(about 30 seconds) for you to move your machinery/property/crewmembers
out of the way. If you're on those tiles when the fault forms, get ready
to take a nasty fall.
Anything caught in the fault zone as it collapses inward will be
destroyed, violently, _before_ being dropped down into the z-level
below.

These can also happen as a random event, however their rarity is on-par
with that of a meteor storm.
This also adds a helper for finding a midpoint turf between two provided
turfs, thanks to ZephyrTFA.
This idea basically possessed me over the course of a few days, and I
found myself unable to work on anything else until I had it complete.
I'm glad its done.
## Why It's Good For The Game
Gives Icebox its own big "environmental disaster" event. I'm hoping it
isn't received as being too destructive, but mind that this is meant to
be an equal to the dreaded meteor storm.
Also makes it so that unfavorable events aren't a coinflip between a
portal storm/rod on planetary maps.
## Changelog
🆑 Rhials
add: Chasmic Earthquake random event, exclusive to Icebox. Tears a huge
chasm in the hull of the station. Watch out for shaking tiles!
sound: Adds sounds for distant rumbling, metal creaking, and rubble
shaking.
imageadd: Achievement icon for getting sucked up in an earthquake chasm.
/🆑
## About The Pull Request
This PR is a re-pr of ##70522 , with some tweaks:
Notably:
- Wavespeak is not a say override, but instead uses a mindlink. Meaning
carp and space dragons can still talk verbally, but they can also use
telepathy to talk to all carp and the dragon.
- I would refactor Mind Linker a bit further to be a full datum rather
than a component but that's for another time.
- Removed the gravity aura component in favor of using the existing
forced gravity proximity monitor.
- Also fixed a bug involving that. Lol.
- Minor refactoring around the place.
- Reduced the volume on a lot of space dragon sounds.
- Edited the roundend report for Space Dragons to collate all entries
into one per player.

## Why It's Good For The Game
Space dragon still plays pretty "play lame win game" right now, the
optimal strategy for them is to find the cheesiest spot for a portal and
spam their stun / fire breath to make it unreachable.
I was a fan of the original PR so I updated it and brought it back.
## Changelog
🆑 IndieanaJones, Melbert
balance: Space Dragon can no longer choose its rift locations freely,
and instead is given 5 pre-determined locations to pick from instead
balance: Space Dragon itself has been buffed in order to support a more
confrontational playstyle, however its wing gust now requires a line of
sight to targets in order to affect them.
balance: Player Space Carp from rifts now have buffed health, but
reduced object damage values. They also gain a temporary speed boost
when hit by Space Dragon's fire breath instead of taking damage.
balance: Carp rift spawn times have been reduced, the healing AOE is now
a 3x3 instead of a 1x1, and apply normal gravity in a large radius
around them
balance: Space Dragon and rift carps now communicate on a private mind
link channel via action button similar to Raw Prophets and Slimepeople.
fix: Fixed Gravity Generator forced gravity not applying.
fix: Intern Announcer will no longer replace Space Dragon announcements.
qol: The roundend report for space dragons now collates all players who
played a carp into one entry, rather than one per carp spawned.
qol: Space Dragon sounds are much less ear piercingly loud.
/🆑
---------
Co-authored-by: IndieanaJones <mariosuperstar384@gmail.com>
Co-authored-by: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com>
## About The Pull Request
it looked if a typepath was in the list of station traits instead of an
instance
## Why It's Good For The Game
we did it
## Changelog
🆑
fix: fixes clown planet report
/🆑
Copies the weights of roundstart changelings, these were too low and I
was linked some reasonably low threat rounds on low pop getting them.
## Changelog
🆑
balance: Adjusted stowaway changeling requirements to be closer to
roundstart Changelings.
/🆑
## About The Pull Request
Messed up changing this to an early returns, results in latejoins
triggering much earlier than they should be.
## Why It's Good For The Game
Oops
## Changelog
🆑 Melbert
fix: Latejoins triggering before the minimum time set
/🆑
## About The Pull Request
White Dwarf report = For 0 threat rounds.
Pulsar Star report = For random chance of Nanotrasen having no intel.
## Why It's Good For The Game
This adds extra flavor to Nanotrasens advisory level reports, showing
Nanotrasens incompetence and adding this for the lore. Also I thought it
was funny.
## Changelog
🆑
add: Add new White Dwarf and Pulsar Star reports.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
### Before:
Dynamic wants a latejoin.
Dynamic will collate all latejoin rulesets that are eligible to execute.
The latejoin-er is guaranteed to become an antagonist, so long as any
ruleset is valid.
It runs down the list of rulesets and tries to apply it until it
succeeds
Then the latejoin injection timer is incremented for the next time.
<Details>
<Summary> This leads to the following: </Summary>

</Details>
### After ( with this pr ):
Dynamic wants a latejoin.
Dynamic will collate all latejoin rulesets that are eligible to execute.
Dynamic will then select **one** of the valid rulesets, based on weight,
to attempt to apply to the incoming latejoiner.
If the latejoiner is not a valid candidate, such as not having that
antagonist enabled in their preferences, it will not reroll the ruleset.
Do not pass go, do not collect 200 dollars, do not get antag.
The latejoin injection timer will not be incremented, so the very next
latejoin will be checked the same, until one eventually succeeds.

## Why It's Good For The Game
Dynamic latejoin handling is kinda poor, I believe Mothblocks has talked
about this a bit before but hasn't done much to it yet.
Compared to roundstart and latejoin, which can select out of everyone
which has the preference enabled, latejoin rulesets are not spoiled for
choice, which makes weighting the rulesets useless.
If you only have traitor enabled, the only latejoin antag you can be is
traitor. And if dynamic wants a latejoin, while you can only be traitor,
**you will ALWAYS become a traitor**. The weight of the traitor ruleset
or any other ruleset doesn't matter, because at the end of the day, the
only valid ruleset is traitor.
This makes latejoins much less of a guaranteed thing, and will
(hopefully) spread it out a bit more, reducing likelihood of rarer
latejoin antags.
## Changelog
🆑 Melbert
balance: You are now slightly less likely, statistically, to get an
antag role on latejoin
fix: Fixed latejoin antags being logged as "midround" antags
/🆑
## About The Pull Request
Adds a latejoin form of Changeling flavored as a stowaway.
## Why It's Good For The Game
We don't have a latejoin form of Changelings. It ups the paranoia that
anyone can be a Changeling, latejoin or not. They're also one of the few
non-progression antagonists which would work perfectly as a late join.
## Changelog
🆑
add: Stowaway Changelings will now appear as a late join form of
Changeling.
/🆑
---------
Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
## About The Pull Request
Most calls of runEvent() now provide a cause that is read out to
deadchat. announce_deadchat() has been slightly adjusted to accommodate
this.
Previously, everything that wasn't a truly random event would broadcast
with the same generic "XYZ has just been triggered!" message. Now, you
get a little bit more detail as to why/what triggered the event.
Some helpers in the __HELPERS/events.dm file have been made, for forcing
events normally/async/after a delay (using an addtimer). This also moves
a lot (but not all) instances of events being forced to these helpers.
Some samples:

Traitors using uplink viruses to turn off the power/comms.

Beer nuke!

For when a traitor takes an Space Dragon final objective, which summons
a carp migration event.

Wizard ritual events!

Even this one!
This also changes runEvent() to run_event(), because I figured I'd be
touching every single instance of the proc anyways.
## Why It's Good For The Game
Better feedback, less confusion amongst deadchat's constituents.
Some of them may be a bit self-explanatory, but in some cases
(especially the apocalypse rune) it's beneficial to know that an admin
isn't the one behind it.
<!-- 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
🆑 Rhials
qol: Deadchat now gets more juicy details on what has triggered a
non-randomly occurring random event.
code: There are now helpers for forcing events in a variety of ways.
More events! More events!!!!!!!
/🆑
## About The Pull Request
Fixes#74842
So this issue is multi-part
1. Separatist antag datum used the wrong mob for applying laws to.
`mob_override` is not passed usually and should default to the antag
datum owner's mob if not passed
Fixes this by passing the right mob. AI still doesn't get law datums,
the issue is deeper - they don't even become separatists!
2. Separatists only iterates over human mobs, and not silicon mobs
Okay, fixes this by iterating over all living players. Still not
entirely fixed, new AIs don't have UN laws!
3. Changes the default law datum when nations executes to United Nations
so new unlinked silicons gain the lawset
Closer, would you believe it if this still doesn't fix everything, but
going further is out of scope.
Changing the round default lawset as a part of roundstart execution does
not update anything that set it from atom initialize. If we wanted we
could hook signals into "default lawset changed" and then update it
conditionally to circumvent ALL of these issues but whatever, someone
can do that later.
## Why It's Good For The Game
AIs stop crying on nations
## Changelog
🆑 Melbert
fix: AIs now get their proper lawset, and an objective related to said
lawset, on Nations
/🆑
## About The Pull Request
Adds two new global helper procs, find_maintenance_spawn and
find_space_spawn. These check the list of maintenance/space carp spawn
landmarks, and return the turf of a random one.
The find_maintenance_spawn helper has two arguments, for atmos safety
checks and making sure the spawn is properly shrouded in darkness.
This also includes some tidiness changes to the ghost_role event file,
because the helper was originally just going to be a proc on ghost role
events.
**Stuff moved to find_maintenance_spawn:**
- Spiders
- Nightmares
- Fugitives
- Paradox clones
- Morph
**Stuff moved to find_space_spawn:**
- Space Dragon
- Loneop
- Ninja
- Slaughter Demon
- Revenant backup spawn location
If we ignore all of the autodocing, this should remove about a dozen or
two lines of code.
## Why It's Good For The Game
Reduces an amount of duplicated code. Also makes future implementation a
bit easier and less copy-pastey.
## Changelog
🆑 Rhials
code: Adds two new super-duper helpful helper procs for finding a
maintenance/space spawn location, for all of your
event/midround/whatever needs!
code: Moves all midrounds/ghost_role events that hinged on
maintenance/space carp spawns to the aforementioned helpers.
code: The ghost_role event module file is now autodoced.
/🆑
## About The Pull Request
The xeno_spawn landmark, used to pick spawn locations for many different
midrounds (but NOT xenomorphs, ironically), has been killed and been
replaced with the generic_maintenance_landmark landmark.
This also adds atmos safety checks to some of the midround spawn
location selections that were missing them:
- Paradox Clone
- Nightmare
- Fugitives
- Morph
I decided to do both of these at the same time, since I'd be touching
most of the same files anyways.
This includes an updatepaths that, if you are on a downstream running a
custom map, should probably definitely run.
## Why It's Good For The Game
It may not be a secret that these landmarks aren't used for spawning
xenomorphs anymore, but the name is still deceptive. This should
communicate what they're used for a bit better to both coders and
mappers.
Atmos safety checks (for the midrounds I hadn't yet added them to) make
sure people can play the game.
Closes#74372.
## Changelog
🆑
code: The xeno_spawn landmark is now the generic_maintenance_landmark
landmark.
fix: Certain midrounds will now check for atmos safety before spawning.
/🆑
# MAINTAINER - USE THE BUTTON THAT SAYS "MERGE MASTER" THEN SET THE PR
TO AUTO-MERGE! IT'S MUCH EASIER FOR ME TO FIX THINGS BEFORE THEY SKEW
RATHER THAN AFTER THE FACT.
## About The Pull Request
Hey there,
This took a while to do, but here's the gist:
Python file now regexes every file in `/code` except for those that have
some valid reason to be tacking on more global defines. Some of those
reasons are simply just that I don't have the time right now (doing what
you see in this PR took a few hours) to refactor and parse what should
belong and what should be thrown out. For the time being though, this PR
will at least _halt_ people making the mistake of not `#undef`ing any
files they `#define` "locally", or within the scope of a file.
Most people forget to do this and this leads to a lot of mess later on
due to how many variables can be unmanaged on the global level. I've
made this mistake, you've made this mistake, it's a common thing. Let's
automatically check for it so it can be fixed no-stress.
Scenarios this PR corrects:
* Forgetting to undef a define but undeffing others.
* Not undeffing any defines in your file.
* Earmarking a define as a "file local" define, but not defining it.
* Having a define be a "file local" define, but having it be used
elsewhere.
* Having a "local" define not even be in the file that it only shows up
in.
* Having a completely unused define*
(* I kept some of these because they seemed important... Others were
junked.)
## Why It's Good For The Game
If you wanna use it across multiple files, no reason to not make it a
global define (maybe there's a few reasons but let's assume that this is
the 95% case).
Let me know if you don't like how I re-arranged some of the defines and
how you'd rather see it be implemented, and I'd be happy to do that.
This was mostly just "eh does it need it or not" sorta stuff.
I used a pretty cool way to detect if we should use the standardized
GitHub "error" output, you can see the results of that here
https://github.com/san7890/bruhstation/actions/runs/4549766579/jobs/8022186846#step:7:792
## Changelog
Nothing that really concerns players.
(I fixed up all this stuff using vscode, no regexes beyond what you see
in the python script. sorry downstreams)
## About The Pull Request
This PR splits the Pirate midround antagonists into two separate groups,
normal and dangerous. Normal pirates are the human, silverscale, and
psycker groups, and they are all light antagonists now, meaning they can
show up early in the round, similar to when a revenant or nightmare can
spawn. Dangerous Space Pirates only consist of the Skeleton Crew, and
they will remain as heavy weight antagonists with the same spawning
restrictions as it is currently. I also fudged with the crew required
value some for both, not that it makes a huge difference.
Since pirates were split into two separate groups, both versions have a
reduced dynamic weight of 3, from 4.
Also added a sanity check to the pirate's dynamic ruleset to make sure
there are remaining pirates to be spawned for the ruleset to be allowed.
Also added a check to the pirate event itself to prevent runtimes when
no pirate team is available to be chosen, unless an admin specifies what
pirate team they want to use.
## Why It's Good For The Game
As it is right now, there is a massive difference between the skeleton
pirates and the rest of the pirate types. Skeleton Pirates have cannons,
innate space immunity and other small benefits which make them much more
threatening than the other pirate crews. In our current system,
something like Psycker pirates can spawn in lieu of something like blob
or xenomorphs when they aren't anywhere near the same level of
threatening, so moving the less dangerous pirates off to be light weight
midrounds seems like a good move, especially since we need more
lightweight midrounds to keep the variety up anyway.
Keep in mind these designations are not permanent and may change at the
request of maintainers or as the pirate teams get nerfed/buffed.
## Changelog
🆑
balance: The pirate gangs have been split into two subcategories, one
which can spawn earlier in a shift and one that spawns later as they
currently do. While skeleton pirates will still be only seen later into
the shift, expect to see the other pirate gangs earlier on.
fix: Prevented the pirate event from runtiming when no possible pirate
gangs were available.
fix: Pirates can no longer be selected by Dynamic if there are no more
pirates gangs that can be used.
/🆑
## About The Pull Request
Refactors regenerate organs to be slightly more intelligent in handling
organ changes and replacements.
Noteably:
- We don't remove organs that were modified by the owner; such as
changing out your heart for a cybernetic
- We early break out of the for loop if they aren't supposed to have an
organ there and remove it
- We check for the organ already being correct, and just healing it and
continuing if it is
Also changes the names of some of the organ helpers into snake_case
### Mapping March
Ckey to receive rewards: N/A
## Why It's Good For The Game
## Changelog
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
This PR updates the dynamic.json file to add in entries for midround
rulesets which got added later in the code but never added to the
config. Also, gives them the _proper_ ascii art in the code, which aids
in navigation.
## Why It's Good For The Game
No need for server hosts to scratch their heads at why some dynamic
rulesets just aren't present in the configuration for some reason.
## Changelog
🆑
config: All dynamic midround rulesets are now properly accounted for in
the dynamic.json config.
/🆑
## About The Pull Request
This PR buffs abductor spawn weight from 2 to 4. With this, abductors
have the same weight as revenant and most other light midround
antagonists, and matches their spawn weight prior to getting moved to
being light weight antagonists as opposed to heavy.
## Why It's Good For The Game
Abductors in my opinion are currently needlessly too rare. This will
resolve the issue.
## Changelog
🆑
balance: Abductors' midround spawn weight has been increased. Expect to
see them more often
/🆑
## About The Pull Request
Syncs the codebase inherent values for dynamic rulesets with the current
config-side values used on our LRP servers.
## Why It's Good For The Game
This is technically irrelevant for the game as these numbers are the
ones currently used on the servers - it's more for the good of the
codebase than the game.
## Changelog
🆑
balance: Latejoin dynamic rulesets have been rebalanced to reduce the
frequency of midround revolution spawns.
/🆑
## About The Pull Request
`/datum/antagonist/nukeop/leader/move_to_spawnpoint()` overrides
`/datum/antagonist/nukeop/move_to_spawnpoint()`, which is responsible
for calling `SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NUKIEBASE)`
Nuke op leaders also get created first thing, so they always got sent to
arrivals
`move_to_spawnpoint` now is not overridden by anything, location is now
obtained though `get_spawnpoint`
But this doesn't solve the entire issue! Seemed like there was a race
condition in that, on nukie team creation, it looked for the nuke to
generate the nuke code. But it created the team before creating the nuke
(and template). So it runtimed and broke, no nukies.
So I had to go deeper.
Rulesets have this list, `ruleset_lazy_templates`, that none of the
midround rulesets used. CC @ZephyrTFA on this, but it seemed like it
caused a few issues related to lazyloading by missing them?
I added the keys to abductor and nukies. and also ninja even though
it'll probably never be used
I also also made the kidnapping objective for traitors pre-emptively
load the holding facility on objective *taken*, rather than waiting for
the exact moment which the victim is kidnapped.
(Should) Fix#72248
## Why It's Good For The Game
LATE FOR WORK
## Changelog
🆑 Melbert
fix: Nuke Ops Leaders midround don't spawn on Arrivals Shuttle late for
work
fix: (Maybe) fixes some additional issues related to midround nukie /
abductor spawns
/🆑
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## About The Pull Request
Fixes#69201
The dynamic subsystem will never roll a new antagonist once the shuttle
is past the point of no return, but this check is bypassed by Console
Hacks and Unfavourable Event rolls (which are chiefly triggered from
console hacks, but also from when the Revolution wins).
I have made these procs more discerning.
Unfavourable Events will now never pick any heavy dynamic midround if
the shuttle is past the point of no return.
Console Hacking will now never spawn sleeper agents if the shuttle is
past the point of no return, and won't spawn Fugitives or Pirates if the
shuttle is called at all even if it can still be recalled
It's my feeling that given the need to get organised and move a ship to
the station there isn't really time for either of those events to
actually start properly rolling, but if you feel like that information
might be metagamed in some way by messing around with the shuttle (not
sure why or to what end, but it's technically manipulatable if you know
how the code works?) I can just give these the same restriction as
Traitor even if it means the bounty hunters risk showing up after the
shuttle has already left.
## Why It's Good For The Game
To some extent it's your own fault for clicking the popup while knowing
full well how much round time is left until the game ends, but it's
still disappointing to see a Blob or Pirates or Wizard alert appear at a
time when they can't possibly do anything interesting.
This is more true for the Pirate and Fugitive events because they
involve teamwork, placing a space ship, travel between the ship and the
station, and in the case of Fugitives its own internal five minute timer
before the other team actually arrives.
## Changelog
🆑
fix: Hacking the Comms Console or winning a Revolution can no longer
spawn antagonists if there's not enough time left in the round for them
to antagonise anyone.
/🆑
## About The Pull Request
While I was trying to improve changeling meteor spawning on Icebox I
noticed that several other meteor-like events don't seem to be blocked
on Icebox either even though they don't do anything.
I added a new capability to events which can prevent them being loaded
under certain map conditions (specifically: whether the map is in space
or not). Currently there's no events which _only_ run on a planet but,
now someone could add one I guess?
Now all of the events which spawn meteors are filtered out on icebox and
you can't absent-mindedly try to trigger them.

Also a couple of dynamic options had this applied too, chiefly ones
which expect you to be able to fly a space ship to the space station.
## Why It's Good For The Game
These events shouldn't run on Icebox (or soon, Chilled) because they
don't do anything there.
AFAICT Meteors were getting as far as trying to spawn, then would retry
trying to find space tiles which didn't exist until they failed 10
times, then give up. Once per every meteor it tried to spawn. Gross.
## Changelog
🆑
fix: Meteors can't be triggered automatically or manually on Icebox,
where they do nothing.
fix: Hacking a comms console as a traitor won't try to summon meteors or
pirates to Icebox, where they do nothing.
/🆑
## About The Pull Request
Adds a new dynamic midround opportunity and random event - Space
Changeling.
https://user-images.githubusercontent.com/28870487/215284465-f5c5c1b1-b83d-471a-89be-1b65a4d2f2d4.mp4
If you are fortunate enough to recieve this role, you will be stuffed
into a changeling meteor and hurled at the side of the station. With no
crew identities, no access, and no equipment, you'll have to rely on
your **free** organic space suit and armblade to infiltrate the station
and get settled.
With no disguises to fall back on, the midround changeling experience
may lead to some very unfavorable situations. It's not unlikely that
you'll be spotted making your way inside, or that someone will see the
impact site and cause a panic. This role is not easy, but keep in mind
that you also have nothing to lose in the event that you use Lesser
Form/Headslug.
Aside from the starting circumstances, you have the same objectives and
capabilities as a roundstart changeling. Getting inside of the station
will be the hard part, but from there you can do what changelings do
best and blend in.
<details>
<summary>A brief note on the free stuff you get:</summary>
<br>
You get the organic space suit and armblade for free. The space suit is
absolutely vital, but I decided that the armblade should be given for
free as well. It's necessary for breaking open windows or airlocks and
getting access to the station, since otherwise your options are limited
to arrivals/departures. Having to pay a 2 point tax to avoid walking
naked into the main hallways of the station and getting gibbed is lame,
and with the added difficulty of the role I think it's fair.
</details>
Also, this is my 100th PR here! :)
## Why It's Good For The Game
Adds midround changelings in a WAY COOLER way than just making a random
crew/new arrival a changeling.
Lets people experience Hardmode Changeling, and test the adaptability
and flexibility of the most versatile antagonist even harder than
before. Losing the option to bypass the whole shape-shifter thing by
disguising as your crew identity presents a welcome change to the
formula.
Adds a teensy bit more midround variety, so we stop getting Nightmare At
The Thirty Minute Mark every round.
## Changelog
🆑 Rhials
add: Midround changeling spawn event.
add: Changeling meteor. It has a present for you.
/🆑
## About The Pull Request
Damn that's a long title.
Admin Verbs can be used in the verb bar with hyphens instead of spaces
again.
## Why It's Good For The Game
Admin muscle memory
## Changelog
## About The Pull Request

[DESIGN DOC]
https://hackmd.io/@tGKknGe5Q7qtddEspif79g/BJ3w9QLri/edit
Bluespace technology has destabilized the very fabric of reality, even
time itself!
Sometimes during a shift, it's possible for a PARADOX CLONE to spawn
somewhere on the station (usually maintenance). This paradox clone has
the exact appearance and DNA as a random crew member on the station,
wearing the same clothes they were at the start of the shift, including
their ID.
To maintain timeline coherency, the paradox clone must now hunt down and
kill the original and take their place or die trying, if the original
survives they have failed.
The only thing the paradox clone spawns with is a mechanical toolbox
that helps them from being stuck in maints if their ID doesn't have
maints access.
## Why It's Good For The Game
The inclusion of this antag encourages good crew coordination and adds a
less destructive, more personalized antag to the roster.
This antag rewards good detective work, as both the clone and the
original are identical in every way, and will therefore require a
detective to break out their detective skills to figure out who the
clone is.
Also a possible tie-in with the Chrono Legionnaires in the future.
## Changelog
🆑
add: Time and space has destabilized even further due to Nanotrasen
bluespace research, now, on occasion, clones from different timelines
can appear on the station and hunt you down to maintain timeline
stability! Beware the Paradox Clone!
/🆑
---------
Co-authored-by: 1bw0kopy <xz2rbf23@protonmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
## About The Pull Request
Part of a prior PR that was closed (#72562). This version does not add
the check in CI.
## Why It's Good For The Game
The work is already done, so I figured why not.
## Changelog
N/A Nothing player facing
Co-authored-by: Jeremiah Snow <jlsnow301@pm.me>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Title
## About The Pull Request
Ensures that we load templates for a ruleset before we attempt to place
or cache characters for that ruleset
Also makes wizard and abductor async load their template to improve
(apparent) loading times for them
## Why It's Good For The Game
This is the only thing left that I can think of that would cause antags
like nukies and abductors to spawn in wrong
## Changelog
This should not be player facing
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## About The Pull Request
Removes the nukie base and wizard den from the base centcom map. They
are instead now lazy loaded as required.
To make a new lazy load template is fairly simple, make a map, allocate
an area for it, and place a marker at the bottom left corner of that
area. I have it check an area to ensure that if someone makes the map
larger than expected but doesn't account for the template allocation it
doesn't overwrite stuff without warning
[Replaces some improper CHECK_TICKs with
MAPLOADING_CHECK_TICKs](https://github.com/tgstation/tgstation/pull/71785/commits/c7fbca9148812b392dca76d5450fb6bb86716462)
Atom init has already been tripped by the time we get to this portion of
the loading, so if we don't use the right check tick, we will
potentially block unrelated init attempts. This is bad. (Lemon edit, I
want this in the commit desc)
## Why It's Good For The Game
Cuts down on init times.
Closes https://github.com/tgstation/dev-cycles-initiative/issues/17
## Changelog
🆑
admin: New mapping verb to load lazy templates as needed. In your admin
tab under the Mapping category.
/🆑
this isnt technically player visible, so not sure it needs a changelog
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Admins now have a verb to add footnotes to the roundstart threat report.
These messages can be signed, and multiple can be submitted at once.

(If no footnotes are submitted, the report does not display the
"additional notes" section)
This ALSO adds a verb to delay the roundstart threat report
indefinitely, to give some extra time. If you turn it off, be sure to
toggle it back on when you're done!
## Why It's Good For The Game
Gives admins a way to set the tone for a shift, give IC advisory on
stuff, bully the command players, or just add some flavor to the report.
We already give these chuckleheads enough platforms to shitpost from.
What's one more?
## Changelog
🆑
admin: new admin verb -- Command Report Footnote. Lets you attach a
signed message to the roundstart command report.
admin: new admin verb -- Delay Command Report. Lets you delay the
roundstart command report indefinitely.
/🆑
So i left over some basic `/whatever/proc/format` uses in the original
PR this fixes it.
Notable exceptions to the rule:
- Paths in add_verb/remove_verb, we need full path instead of a name
there to access verb metadata so we can't use proc ref macros there.
- regex.Replace, found out that it does not accept call by name. Instead
i added new REGEX_REPLACE_HANDLER so we can at least try to mark these.
There's still leftover global procs that do not use GLOBAL_PROC_REF but
they functionally equivalent so that's for later.
I don't see any reasonable way to grep for this. But if you got any
ideas please share.
## About The Pull Request
A few roundend reports got lost from moving to dynamic and other prs.
This PRs re-allows them to occur. Namely: "Wizard Killed" (lost in
dynamic), "Blob nuked" (lost in dynamic), "Cult escaped" (lost in cult
rework), and "Nuke Ops Victory" (station destroyed via nuke) (lost from,
what I can see, an oversight / accidental swap of report values).
Additionally, small roundend report QOL for cult: Removes antag datums
from spirit realm ghosts after being dusted, so they do not show up on
the report. And in reverse, heads of staff who were dusted / destroyed
in revolution rounds are now also shown in roundend reports.
## Why It's Good For The Game
Some of these reports are dead, which is is a shame because I think
they're cool and fun.
## Changelog
🆑 Melbert
qol: Successfully fending off a blob now has a cross station news report
again. More pressing reports will take priority over it, though.
qol: Successfully killing a wizard (and all of their apprentices) now
has a cross station news report again.
qol: If more than half of a cultist team manages to escape on the
shuttle (rather than summoning Nar'sie), they will send a unique cross
station news report. This is still a loss, by the way. Summon Nar'sie!
qol: Nuclear Operatives successfully nuking the station now has its
unique cross station news report again, and no longer uses the generic
"The station was nuked" report.
qol: Nuking the station to stop a blob infection now has a unique cross
station news report again. Good luck convincing admins to allow this.
qol: Cult ghosts from "Spirit Realm" no longer persist on the cult's
team after being desummoned, meaning they will not show up on roundend
report.
qol: Heads of staff will now always show up on revolution roundend
report - even if their body was fully destroyed.
/🆑
Makes the code compatible with 515.1594+
Few simple changes and one very painful one.
Let's start with the easy:
* puts call behind `LIBCALL` define, so call_ext is properly used in 515
* Adds `NAMEOF_STATIC(_,X)` macro for nameof in static definitions since
src is now invalid there.
* Fixes tgui and devserver. From 515 onward the tmp3333{procid} cache
directory is not appened to base path in browser controls so we don't
check for it in base js and put the dev server dummy window file in
actual directory not the byond root.
* Renames the few things that had /final/ in typepath to ultimate since
final is a new keyword
And the very painful change:
`.proc/whatever` format is no longer valid, so we're replacing it with
new nameof() function. All this wrapped in three new macros.
`PROC_REF(X)`,`TYPE_PROC_REF(TYPE,X)`,`GLOBAL_PROC_REF(X)`. Global is
not actually necessary but if we get nameof that does not allow globals
it would be nice validation.
This is pretty unwieldy but there's no real alternative.
If you notice anything weird in the commits let me know because majority
was done with regex replace.
@tgstation/commit-access Since the .proc/stuff is pretty big change.
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
* Moves spawners and decals to a different init/delete scheme
Rather then fully creating and then immediately deleting these things,
we instead do the bare minimum.
This is faster, if in theory more fragile. We should be safe since any
errors should be caught in compile since this is very close to a
"static" action. It does mean these atoms cannot use signals, etc.
* Potentially saves init time, mostly cleans up a silly pattern
We use sleeps and INVOKE_ASYNC to ensure that handing back turfs doesn't
block a space reservation, but this by nature consumes up to the
threshold and a bit more of whatever working block we were in.
This is silly. Should just be a subsystem, so I made it one, with
support for awaiting its finish if you want to
* Optimizes garbage/proc/Queue slightly
Queue takes about 1.6 seconds to process 26k items right now.
The MASSIVE majority of this time is spent on using \ref
This is because \ref returns a string, and that string requires being
inserted into the global cache of strings we store
What I'm doing is caching the result of ANY \ref on the datum it's
applied to. This ensures previous uses will never decay from the string
tree.
This saves about 0.2 seconds of init
* Macro Defines the On-Station Year
Hey there,
This PR just removes the repeating pattern of (GLOB.year_integer+540) across several different code files and replaces it with a macro `CURRENT_STATION_YEAR`.
In case we decide SS13 will need to take place in a new year, it'll be easier to do such, but it also helps with mistakes in year transcription should that ever be a thing.
* double the define - define trouble
When 65% or more of the station is revs, the shuttle will automatically call. This shuttle can be recalled.
Approved with majority vote from me and @ninjanomnom
Should probably be test merged first, I touched some core shuttle code.
Roughly 60% of rev victories I checked called the shuttle shortly after. That's a lot, but there's still a high amount that aren't, either because the population genuinely wants to stay, or the revolutionary victory was a surprise. The latter of which I had happen to me like, recently! Remember that was the core problem revs victories continuing the round was trying to fix.
With that in mind, this plays nicely with both some player grievances with post-revs while keeping in line with the core of the feature. Players are still, in part, controlling the end of the round, but with affordance given to the most likely scenario.
this code was untestable because
it required a config flag to be set on, this flag is false by default on local
it requires multiple people on the server
so it turned out that leader spawning is broken. this should fix it
makes the nuke op player with the most nuke ops playtime the leader
makes the leader start with loud mode on on their radio
idea for that second one from BeeStation/BeeStation-Hornet#6631
making the most playtime nuke op the leader prevents 1st time players from rolling it, they will generally be more competent, and able to be entrusted, just like you can trust a head of staff more. a player with more competency will also probably be better at actually leading and not just clicking a button to open the ship, if they try.
the radio is a tiny change to make the leader matter more, and able to give better leadership, because im pretty sure most people dont even realize the leader has access to loud mode