* Emergency shuttle is aware of security level (#78271)
## About The Pull Request
The emergency shuttle maintains its security level coefficient and does
the calculation instead of outside procs that aren't aware of what alert
it was when the shuttle was first called.
If the shuttle auto-call timer should be capped at the current security
level timer, that can be done in a different PR.
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/78159
## Changelog
🆑 LT3
fix: Emergency shuttle should correctly scale timer up/down when
changing security levels
/🆑
* Emergency shuttle is aware of security level
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Increases midround traitor starting reputation (#78189)
## About The Pull Request
Reputation for traitors serves two goals:
_Primarily_ it is a timelock. Secondarily, it can drive interaction with
secondary objectives by giving you a little reward.
The way that progression traitors work is that reputation is earned
every minute, so that when a developer is adding a new item for the rep
cost they can just write "30 MINUTES" and it means that the item will be
available when 30 minutes have passed, or a little earlier if the
traitor does some secondary objectives.
_Currently_ when traitors arrive on the station they get reputation
equal to _60%_ of the reputation that they would have had if they became
a traitor at the start of the round and then had hidden in a locker
until the current time.
This PR increases that to 100%, so if you are activated as a sleeper
agent 30 minutes into the round you will immediately have 30 minutes of
reputation. With this and your standard 20TC you can buy almost anything
in the uplink, such as a syndicate bomb.
## Why It's Good For The Game
Given that it is primarily supposed to be a time lock to prevent people
from immediately accessing items which can rapidly pivot the round, it
doesn't make sense that late joining traitors are "penalised" in this
way. If we're ok with a roundstart traitor having a bomb right now, we
should be ok with a latejoin one having one too.
As far as I am concerned secondary objectives should be something you do
for a _bonus_, and anything which can drag people away from being 100%
mechanically focused in order to chase the increasing number in favour
of just being able to do their damn gimmick is a good thing.
## Changelog
🆑
balance: Traitors who are activated as sleeper agents or arrive late on
the arrivals shuttle will begin with more reputation and likely be able
to immediately access most of the uplink catalogue.
/🆑
* Increases midround traitor starting reputation
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Demonic Frost Miner can spawn again (#78067)
## About The Pull Request
Fixes#72943Fixes#62901
This fixes specifically icebox multi-z ruins not spawning with their
counterpart below ruins because the area for the underground portion of
icebox was not whitelisted so there were no valid spawn positions.
## Why It's Good For The Game
Multi-z icebox ruins working is good.
## Changelog
🆑
fix: Multi-z Icebox ruins including the Demonic Frost Miner can now be
placed again
/🆑
---------
Co-authored-by: Changelogs <action@ github.com>
* Demonic Frost Miner can spawn again
---------
Co-authored-by: Whoneedspacee <yougotreallyowned@gmail.com>
Co-authored-by: Changelogs <action@ github.com>
* Emergency Profile Dumps (#75924)
## About The Pull Request
Adds some hooks to the MC that detect if something ate a ton of real
time last tick, and reacts by dumping our current profile into a file
It's really frustrating to see a spike in td in our performance logs,
but see no reason in the profile because it's only taken every 5
minutes. This resolves that
I'm throwing this up so mso can give it a look over, not sure if I want
to use defines or configs here, taking suggestions
🆑
server: Adds a system to emergency dump profiles if too much time passes
between ticks
config: Added configs that control how often emergency profiles are
allowed to dump, alongside the threshold for what counts as too much
time between ticks
/🆑
* Emergency Profile Dumps
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
Co-authored-by: Bloop <vinylspiders@gmail.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Generate theft objective target list more consistently (#78045)
## 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.
/🆑
* Generate theft objective target list more consistently
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Initial draft, most of the stuff is implemented, not really tested or cleaned up yet
* Refactors the handling into a datum-based approach, for more abstraction
* Added migration, properly hooked up the verb to the new system
* Removed some more dead code
* Fixes some missing stuff from the .dme because VSC is stupid sometimes with merge conflicts
* Fixes the schema
* Wow I was really getting tired huh
* A fool, I say, a fool!
* I hate lists of lists I hate lists of lists I hate lists of lists
* I somehow missed this one twice. TWICE!
* This won't actually work if it's defaulting to true, lmao
* Makes it not log stuff if the adding or removing of players is unsuccessful
* Adds a way to update all of the unlock_contents for preferences datums once the donator list is initialized
* Runs update_prefs_unlock_content on mob Login() (hopefully this helps)
* Fixes the bajillion of runtimes caused by my dumb ass trying to make some client calls on ckeys
* Man I was really tired that day
* I had this ready for three hours and forgot to push it
* makes mice not spawn on multiz cable hubs (#77753)
## About The Pull Request
makes them not spawn on multiz cable hubs
## Why It's Good For The Game
this is good because rats can no longer spawn on some isolated cable hub
in the middle of nowhere in maint and depower an entire floor
## Changelog
🆑
qol: rats no longer spawn on multiz cable hubs
/🆑
* makes mice not spawn on multiz cable hubs
---------
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
* Achievements now show how many people have unlocked them. (#77083)
## About The Pull Request
Checking the achievements UI now shows a line below the Unlocked/Locked
status for normal achievements, informing the user of how many players
have unlocked said achievement. It also contains a tooltip; within it is
a percentile comparison with the most unlocked achievement.
Beside that, I've added a check in the achievement unit test to
ascertain that all award categories are actually present in the UI, and
as well moved all `ui_data` to `static_ui_date` considering it is not
the sort of interface that has to be constantly updated like an air
alarm or an APC.
Here's a screenshot of the UI, with the tooltip where my cursor would be
(the hot damn! achievement was var-edited of course):

## Why It's Good For The Game
This should provide some fundamental statistics for achievements, from
which contributors and players can deduct the rarity and bragging
rights.
## Changelog
🆑
qol: The Achievements UI now shows how many people have unlocked a given
achievement.
fix: The "Skills" Category for achievements should no longer be hidden.
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Jordie0608 <4343468+Jordie0608@ users.noreply.github.com>
* Achievements now show how many people have unlocked them.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Jordie0608 <4343468+Jordie0608@ users.noreply.github.com>
* Fixes Define Sanity (#77845)
## About The Pull Request
Hey there,
This was broken in an update from #74573
(3902973978), the RegEx was only catching
a fraction of the cases it was meant to be.
This is what we were finding on 74573 version of the RegEx:

This is what we should be finding for all of the cases that
`define_sanity` will need to check for:

This is what was broken as a consequence:

As stated in the introductory PR #74333
(ccef887efe), it's not the end of the
world if we miss unmanaged local defines, but it's still useful to have
this as a maintainability tool to ensure that everything remains as
clean as it possibly can. I wish we could do the whole matching method
like the aforementioned PR supposed could happen, but it simply doesn't
appear to work the way we want it to.
## Changelog
Nothing player facing.
I tried to experiment with `UNLINT()` but I got absolutely ganked by
getting the regex to work, so the fix for the FA Icon file may not be
super duper great unfortunately. Let me know if you have a showstopper
idea, this is just a stopguard so this PR can get merged and I don't
have to keep talking about unmanaged local defines while reviewing PRs.
* Fixes Define Sanity
---------
Co-authored-by: san7890 <the@san7890.com>
* Fixes a bunch of callbacks that were being qdeleted, and code cleanup (#77904)
## About The Pull Request

Continuing the work of
https://github.com/tgstation/tgstation/pull/77850.
it started with finding one that was being missed and causing a
runtime...then I noticed a whole lot more. While I was doing this I
found callbacks that weren't being nulled in `Destroy()`, so I added
that wherever I found these spots as well as some general code cleanup.
There were a lot more of these than I initially hoped to encounter so
I'm labeling it as a refactor.
## Why It's Good For The Game
Fixes lots of runtimes, improves code resiliency.
## Changelog
🆑
refactor: fixed a bunch of instances of callbacks being qdeleted and
cleaned up related code
/🆑
* Fixes a bunch of callbacks that were being qdeleted, and code cleanup
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Makes explosions consistently throw debris (#77880)
## About The Pull Request
It was possible for explosions to process throwing FIRST, then the
actual explosion. That's dumb, let's not do that.
Fixes a bug with SS explosions, it used SSair defines for its currentrun
default, which because of misordered defines lead to it running throwing
first for ONLY the first explosion. DUMB.
Changed how objects pick where they land. instead of using get_dir we
get the angle to the center, then invert it. Should lead to a nicer
picture
Unanchors broken disposal pipes so they'll get flung around Ups the
throw range for explosions. This needs more tweaking someday, but this
is ok for now
## Why It's Good For The Game
Throwing will happen consistently now, less fuckin floating shit sitting
in spac
* Makes explosions consistently throw debris
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Adds error on qdeling callback, fixes errors this causes (#77850)
## About The Pull Request
You shouldn't ever qdel a callback. If you don't want to own it free
your ref (remove it from a list/set it to null). When all refs are
cleared it'll get cleaned up by byond itself
* Adds error on qdeling callback, fixes errors this causes
* Update cell_component.dm
* Update acid.dm
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Implements byond_status() for harddel hunting (#77818)
## About The Pull Request
In addition, improves dump_harddel_deets usage to hopefully hit in unit
testing
byond_status() will dump as a part of find_references(). While I'd like
to expand that if we ever get a proper version, this is good for how we
have things setup rn.
* Implements byond_status() for harddel hunting
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Loads Away Missions for Unit Testing (#76245)
Hey there,
A pretty bad bug (#76226) got through, but it was fixed pretty quickly
in #76241 (cf92862daf). I realized that if
we were testing all the away missions, that this could theoretically get
caught and not happen again. Regardless, unit testing gateway missions
has been on my to-do list for a while now, and I finally got it nailed
down.
Basically, we just have a really small "station" map with the bare bones
(_teeny_ bit of fluff, maploading is going to take 30 seconds tops
anyways let me have my kicks) with a JSON map datum flag that causes it
to load all away missions in the codebase (which are all in one folder).
Just in case some admins were planning on invoking the proc on
`SSmapping`, I also decided to gate a `tgui_alert()` behind it because
you never can be too sure of what people think is funny these days (it
really does lock up your game for a second or so at a time).
I also alphabetized the maps.txt config because that was annoying me.
Things that break on production could(?) be caught in unit testing? I
don't know if the linked issue I mentioned above would have been caught
in retrospect, but it's likely to catch more than a few upcoming bugs
(like the UO45 atmospherics thing at the very top) and ensure that these
gateway missions, which tend to be the most neglected part of mapping,
stay bug-free.
This is also helpful in case someone makes a new away mission and wants
to see if stuff's broken. Helps out maptainers a bit because very, very
technically broken mapping will throw up runtimes. Neato.
Nothing that players should be concerned about.
Let me know if there's a better way to approach this, but I really think
that having a super-duper light map with the bare basics to load up
gateway missions and then all nine-ish gateway missions can sequentially
load during init. I can't think of a better way to do it aside from some
really ugly `#ifdef` shit. Also also, it has the added benefit of being
a map that will always load your away mission without touching a single
shred of config (and it's not likely to break if you follow sane
practices such as making your own areas)
* Update gateway_test.json
* Map Reset
* Gets rid of an area that was in a space turf
* Attempting to fix some runtimes
* Map Reset
* Lets remains spawn in xen water
* and acid, too
* Update remains.dm
* Removes extra airlock helper
* Delete research2.dmm
Surely this was a mistake?
* Merge branch 'master' into pr/22534
* Map Reset
* Update snowdin.dmm
* Revert "Update snowdin.dmm"
This reverts commit c860c6f4fbb463954d5b8da1b494305a2f45b44b.
* Update snowdin.dmm
* Update snowdin.dmm
* Revert "Update snowdin.dmm"
This reverts commit 47e7916056a47e12adfcb8b94b9748b7e56f378d.
* Update snowdin.dmm
* Revert "Update snowdin.dmm"
This reverts commit c82576bee69e09eda649d3cbf63d96dddaeeb380.
* Update immerse.dm
* Revert "Update immerse.dm"
This reverts commit 2ad622f3029a3ed17a05f8269299d0f25e747d11.
* Update immerse.dm
* Update maps.txt
* Fix hard dels in area spawn
* Update gateway_test.json
* Actually we can just get away with keeping a list of types here, no refs needed.
* Update area_spawn_subsystem.dm
* Update automapper.dm
* Let's just test to see if getting rid of black mesa stops the segfaults...
* Let's try deleting astrum too
* Revert "Let's just test to see if getting rid of black mesa stops the segfaults..."
This reverts commit de9a05708d451abbb78a635a3e03b2f460004496.
* Revert "Let's try deleting astrum too"
This reverts commit 2121a6357a54faf5719a42a762ba8b4698c008fb.
* Update waypointstation.dmm
* Update blackmesa.dmm
* Update decaySS.dm
* Update gateway_test.json
* Revert "Update gateway_test.json"
This reverts commit 93adc08819f05aecc8599980385e3fb10d02a1d2.
* Testing
* Revert "Testing"
This reverts commit 1d476d236953daac6adf59b93e56f2fab218085b.
* Testing
* Revert "Testing"
This reverts commit de05a74636c1f43e50fb7ec9f24978d270db4b88.
* Now try and actually fix the stupid thing
* Update clockwork_research.dm
---------
Co-authored-by: san7890 <the@san7890.com>
* Refactors Regal Rats into Basic Mobs (more titles edition) (#77681)
## About The Pull Request
I literally can't focus on anything nowadays, so I just did this to
break a never-ending chain of distress. Anyways, regal rats! These
fellas are mostly player controlled, but did have _some_ AI capabilities
(mainly tied to their actions), so that was incorporated too. Everything
should work as-expected (as well as look a shitload cleaner).
Instead of doing weird and awful conditional signals being sent out, I
made the `COMSIG_REGAL_RAT_INTERACT` (not the actual name) have a return
value so we can always rely on that working whenever we have that signal
registered on something we attack. I also cleaned up pretty much every
proc related to regal rats, gave them AIs to reflect their kingly nature
(and action capabilities (as well as move the action to
`mob_cooldown`)).
Since I thought they needed it, Regal Rats now get a special moniker!
This is stuff like "the Big Cheese" and what-not, like actual regents in
history. That's nice.
## Why It's Good For The Game
Two more off the list. Much better code to read. Way smarter rats with
spawning their army as part of a retaliatory assault (war). More sovl
with better regal rat names. The list goes on.
## Changelog
🆑
refactor: Regal Rats have been refactored into basic mobs. They should
be a bit smarter and retain their docility (until attacked, in which
case you should prepare to get rekt by summoned rats), and properly flee
when they can instead of just sit there as you beat them to death. The
framework for them interacting with stuff (i.e. opening doors while
slobbering on food) is a bit more unified too, now. They also have
cooler names too!
/🆑
FYI: Beyond a few code touchups, I haven't touched the actions at all. I
do not believe myself to be enthusiastic about fixing anything involving
the actions code as of this moment so that this PR is more overbloated
unless it's unbelievably stupid or easy to fix.
* Refactors Regal Rats into Basic Mobs (more titles edition)
---------
Co-authored-by: san7890 <the@san7890.com>
* Revert "Add the ability to use blips as your character's voice" (#77715)
Reverts tgstation/tgstation#77640

This is causing big problems right now and we've agreed to a, at
minimum, temporary revert so that we can re-approach this at a later
date and do things properly
@ MrStonedOne pls i need that TTS repo im begging you pls
* Revert "Add the ability to use blips as your character's voice"
---------
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
* Add the ability to use blips as your character's voice (#77640)
## About The Pull Request
- Adds the ability to force your TTS voice to always be blips, default
is still normal speech
- Probably fixes a bug with silicon voices not transferring properly?
There was an entire argument missing from tts_request/New
- Fixes problems I got from the Docker build not working at all. Only
thing interesting is `--no-cache-dir` which was to fix the container
running out of RAM even though I literally just got 64GB of RAM today
Got permission from @ optimumtact as alternative to being able to disable
your voice, CC @ Iamgoofball
## Why It's Good For The Game
I spent two hours trying to find a voice that didn't make me
uncomfortable to use and that was even in the realm of being the voice I
would actually want people to hear. Characters still have distinct
"voices" because the blips are chopped together from the voice itself
## Changelog
🆑
add: You can now set your voice to just blips.
/🆑
* Add the ability to use blips as your character's voice
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
* Save 180ms on GetElement by avoiding more stringifying unless necessary (#77604)
list2params does all this normally and faster. Also avoids going through
the ID generation proc at all if there's only one argument in the list,
which happens with every item description attachment, which happens
frequently.
* Save 180ms on GetElement by avoiding more stringifying unless necessary
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
* More lua harddel fixes (#77556)
## About The Pull Request
Fixes some more lua harddel problems with lingering refs on the gc_guard
variable. This variable has been changed to a list instead and will get
cleared every time the SSlua subsystem fires so that lua instantiated
objects that are not tracked by the subsystem will essentially delete
themselves on the next tick, aka whenever the lua script sleeps.
Also removed the unnecessary and not completely functional
lua_reference_cleanup proc which wasn't even being called reliably
because the signal handler was the datum itself.
## Why It's Good For The Game
Fixes more harddel bugs, increases consistency.
Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
* More lua harddel fixes
---------
Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
* Spiders don't automatically grant an antag datum (#77523)
## About The Pull Request
Fixes#77501
Spider egg ghost role spawners grant the spider antag datum, rather than
the act of being a spider.
This means that gold core, mapstart, polymorph belt, and other spiders
will not have an antagonist datum.
While doing this I also made a new abstract `mob/living/basic/spider`
type which all three kinds of spider life stage (`spiderling`, `young`,
`giant`) extend from, because there was a gross amount of copied code.
Now there isn't.
Also the Flesh Spider and Event Midwife eggs now simply hatch adult
spiders instead of child ones.
This is because there is no reason for either of these to have a two
minute wait time before they get going. Midwife spiders spawned by the
event should just start spidering immediately, and Flesh Spiders are
made by changelings and shouldn't be effected by measures introduced to
balance the spider gamemode.
Eggs which are laid during a round and _can_ hatch into midwife spiders
still hatch baby spiders.
Also I swapped some white pixels on the animation of the ambush
spiderling for a different colour because they looked bad.
## Why It's Good For The Game
While the policy is always "if you turn yourself into something, you're
not an antagonist" the presence of the antag datum still confuses
people. Plus that code was gross and I didn't like it.
## Changelog
🆑
fix: Giant Spiders only have an antag datum if created by the round
event.
balance: Flesh spider eggs hatch into adult spiders instead of baby
spiders.
balance: The eggs spawned by the start of the spider infestation event
hatch into adult Midwife spiders instead of baby ones.
/🆑
* Spiders don't automatically grant an antag datum
* Modular paths
* Modular paths
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Wait for db queries to finish during db shutdown (#77311)
* Try waiting for db queries to finish during db shutdown
---------
Co-authored-by: oranges <email@oranges.net.nz>
* Adds a system for logging metadata about hard deletes (#76956)
## About The Pull Request
I'm sick of the progress bar harddel, and I've ran into this problem in
the past, so I'm just gonna do something about it
If you want to provide an individual logged bit of info about a harddel,
you can override `/datum/proc/dump_harddel_info()` and return a string
containing "whatever"
Use of this should be limited, this could potentially clutter del logs,
especially if it's used on something that fails often, like pipes
I do think it's still useful tho. It's output ingame, in the logs, and
in unit test failures. Hopefully all nicely tho I'm only really 100%
sure about in game.
* Adds a system for logging metadata about hard deletes
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Add "Hall of Fame" emergency shuttle (#77074)
## About The Pull Request
This adds a new emergency shuttle called the **Hall of Fame**.

It's designed around persistence. The goal is to have the shuttle store
memories, photos, and trophies for the crew to see!
## Why It's Good For The Game
Cool way for the crew to store and share memories.
## Changelog
🆑
add: Add a new 'Hall of Fame' emergency shuttle. It even comes with it's
own nifty photo album.
/🆑
* Add "Hall of Fame" emergency shuttle
---------
Co-authored-by: Tim <timothymtorres@gmail.com>
* [no gbp] Fixes runtime in SSstation (#77231)
No excuse, just dumb. Random layer is the randomly generated parallax
layer, which is null 30% of the time, so this would runtime in SSstation
setup in 30% of rounds
Also another thing where I added extra params and didn't add them to the
proc, fucking parallax for some roundstart clients and latejoins
🆑
fix: fixes a runtime in SSstation setup
fix: fixes parallax not rendering correctly for latejoins
/🆑

* [no gbp] Fixes runtime in SSstation
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
* Improves the RPG loot wizard event. (#77218)
## About The Pull Request
As the title says. Adds a bunch more stat changes to various different
items and a somewhat simple way of modifying them whilst minimizing
side-effects as much as possible.
Added a new negative curse of polymorph suffix that can randomly
polymorph you once you pick up the item.
Curse of hunger items won't start on items that are not on a turf.
Curse of polymorph will only activate when equipped.
Bodyparts, two-handed melees, bags, guns and grenades, to name a few,
have a bunch of type-specific stat changes depending on their quality.
Some items won't gain fantasy suffixes during the RPG loot event, like
stacks, chairs and paper, to make gamifying the stats a bit harder.
I'm sure there'll still be other ways to game the event, but it's not
that big of a deal since these are the easiest ways to game it.
High level items also have a cool unusual effect aura
## Why It's Good For The Game
Makes the RPG item event cooler. Right now, it's a bit lame since
everything only gains force value and wound bonus on attack. This makes
the statistic increases more type-based and make it interesting to use
It's okay for some items to be powerful since this is a wizard event and
a very impactful one too. By making the curse of hunger items not spawn
on people, it'll also make it a less painful event too.
## Changelog
🆑
add: Expanded the RPG loot wizard event by giving various different
items their own statistic boost.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
* Improves the RPG loot wizard event.
---------
Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
* Doubles the time you can get the "Long shift" achievement, makes it not grant on admin restarts (#77195)
## 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
/🆑
* Doubles the time you can get the "Long shift" achievement, makes it not grant on admin restarts
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Adds a unit test to stop elements from using identical lists for their arguments. (#76322)
## About The Pull Request
Ok, so a few days ago I made an issue report about multiple instances of
identical elements being generated because of uncached lists.
ninjanomnom (the mind being the element datums) cleared it up and said
an implementation of GetIdFromArguments() that also checks the list
contents wouldn't be worth the performance cost, while adding that a
unit test should be written to check that it doesn't happen at least
during init, which should catch a good chunk of cases.
Also, i'm stopping RemoveElement() from initializing new elements
whenever a cached element is not found. Ideally, there should be a focus
only unit test for that too, but that's something we should tackle on a
different PR.
Some of the code comments may be a tad inaccurate, as much as I'd like
to blame drowsiness for it. Regardless, the unit test takes less than
0.2 seconds to complete on my potato so it's fairly lite.
## Why It's Good For The Game
This will close#76279.
## Changelog
No player-facing change to be logged.
* Adds a unit test to stop elements from using identical lists for their arguments.
* Fixes unit test
* seeing double
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Converting crabs to basic mobs (#77109)
## About The Pull Request
Exactly what it reads on the tin. As a bonus, they will flee from
attacking targets, hunt tiny critters (crabs are now small-sized) and
actually move sideways (it's an element that covers both client and
basic movement)
## Why It's Good For The Game
Another simple to basic mob refactor.
## Changelog
🆑
refactor: Crabs refactored into basic mobs. They now hunt tiny critters
and flee from attackers.
fix: Fixed crabs not crab-walking.
/🆑
* Converting crabs to basic mobs
* UpdatePaths
* More path changes
* Update simple_animal_freeze.dm
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* flame_range and flash_range autoset fix (#77118)
## About The Pull Request
From #27184 flame_range and flash_range should automatically default to
light_impact_range and devastation_range
4abf35e4a7/code/controllers/subsystem/explosions.dm (L285-L288)
But it was broken, probably after moving to subsystem, because now
functions set arguments to 0.
Please note I don't play tg and haven't tested this change. Fix changes
default behavior and may cause unwanted effects.
* flame_range and flash_range autoset fix
---------
Co-authored-by: Alexander V <volas@ya.ru>
* Sets a saner length limit to ID assignments and paintings' titles. (#76723)
* Sets a saner length limit to ID assignments and paintings' titles.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Adds a runtime protection check to play_tts (#77106)
## About The Pull Request
I see this stack trace on occasion
```
[2023-07-25 19:04:56.970] RUNTIME: runtime error: get_language_holder() called on a QDELing atom, this will try to re-instantiate the language holder that's about to be deleted, which is bad.
- proc name: get language holder (/atom/movable/proc/get_language_holder)
- source file: code/game/atoms_movable.dm,1458
- usr: null
- src: AdipemDragon (/mob/dead/new_player)
- src.loc: null
- call stack:
- AdipemDragon (/mob/dead/new_player): get language holder()
- Text To Speech (/datum/controller/subsystem/tts): play tts(L.E.M.O.N. (/mob/living/silicon/robot), /list (/list), /sound (/sound), /sound (/sound), /datum/language/common (/datum/language/common), 7, 0)
- Text To Speech (/datum/controller/subsystem/tts): fire(0)
- Text To Speech (/datum/controller/subsystem/tts): ignite(0)
- Master (/datum/controller/master): RunQueue()
- Master (/datum/controller/master): Loop(2)
- Master (/datum/controller/master): StartProcessing(0)
```
Evidently, the list of listeners is *somehow* getting new players or
observers that are being qdeleted (maybe hard deleting?)
That might be a little hard to track down so until then I figure it's
fine to throw in a stack trace and continue so it doesn't brick the
message for everyone else
## Why It's Good For The Game
Prevents the proc from runtiming and cancelling execution, ergo not
playing to everyone else
## Changelog
🆑 Melbert
fix: Fixes some occasions which result in TTS messages not playing
/🆑
* Adds a runtime protection check to play_tts
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>