## About The Pull Request
Adds a new negative quirk, called Limper. This quirk, as you could
probably guess, will make you limp. Specifically, the limp it gives you
is the same level as a compound fracture, so it's pretty significant.
Luckily, you spawn with a cane, which as long as you are holding you
won't be slowed down. This quirk is -6 points as it is pretty
significant (have to hold an item in one of your hands at all times,
losing this item makes you hella slow) but not quite as devastating as
other disability quirks.
## About The Pull Request
Title.
Closes https://github.com/Bubberstation/Bubberstation/issues/5632
The exact implementation is a new variable on quirks that qdels the
items they spawn or early returns if its a path.
Family heirloom and medicine allergy are exempt.
## Why It's Good For The Game
bugs bad
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="1556" height="628" alt="image"
src="https://github.com/user-attachments/assets/0162d509-4dab-48a5-8a78-ded340fad641"
/>
ignore the runtimes thats a tg error
</details>
## Changelog
🆑
fix: Item quirks no longer give items on char slot change
/🆑
## About The Pull Request
Main changes
- `handle_mutations` is gone, DNA Injectors are now managed via a status
effect
- `handle_diseases` is gone, disease stages are just handled via life
signal
- `handle_bodyparts` is gone, it was unused and in the future any
implementations should use a life signal
- `spec_life` is gone, the main content of it is now in `human/Life`,
most children implementations now use life signal, zombie tongues now
handle zombie groans
- Life signal was split in two (pre and active)
Other changes
- DNA injector code was cleaned up considerably
- HARS now alerts admins when you inject someone else with it like
Monkey
- `COPY_DNA_SE` is no longer mistakenly unused (meaning stuff like
transformation sting no longer copies "active mutations")
## Why It's Good For The Game
Across the course of a full round we spend the same amount of time doing
literally nothing in life as we spend on handling human breathing.
Now in the context of a full round this is 8 seconds. Which in the grand
scheme of things, not a whole lot, but if we can get a tiny performance
gain from... not doing literally nothing (especially when we can do
these things cleaner with signals) that's a win in my book
## Changelog
🆑 Melbert
refactor: Refactored dna injectors (both the ones that change appearance
and activate mutations), report any oddities with them like failing to
revert your appearance or mutations not applying correctly
code: Ever so slightly changed how diseases tick, report any oddities
code: Ever so slightly changed how some species mechanics tick, like
golems and slimes, report any oddities
code: The code behind printing appearance modifying dna injectors from
genetics has changed, report any oddities
code: Some backend transformation sting code changed slightly, report
any oddities
code: Zombie "idle" groaning is now tied to the tongue rather than the
species itself
admin: Force-injecting someone with HARS give an admin alert, the same
as force-injecting someone with Monkey
fix: Several methods of copying DNA (including transformation sting)
mistakenly copied "active mutations", this has been fixed
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
## About The Pull Request
Splits `inertia_move_multiplier` in two,
`inertia_move_multiplier_passive` and `inertia_move_multiplier_active`
When calculating drift speed, only the better of the two is used.*
Spacer now buffs the former, jetpacks now buff the latter
In short, the bonus to drift speed applied from being a spacer no longer
applies multiplicatively with the bonus to drift speed from jetpacks.
**(If we want further nuance we'd probably have to look at something
like movespeed modifiers. But in the meanwhile this aims to
differentiate "this atom innately drifts faster" and "something is
making this atom drift faster".)*
## Why It's Good For The Game
The 0.75x modifier from Spacer combined with the 0.66x modifier jetpacks
apply ultimately comes out to a bonus of like 0.5x, or in other words, a
2x speed bonus which is a liiiiiiiiiiittle ridiculous. Jetpack jousting
is chaotic enough as-is.
With the changes Spacers will still get mileage out of especially poor
jetpacks (i.e. improvised jetpacks), but with a normal or advanced
jetpack, they'll go as fast as anyone else does.
## Changelog
🆑 Melbert
balance: Spacer: Bonus to drift speed no longer stacks with jetpack
speed - only the greater of the two effects is applied.
/🆑
## About The Pull Request
`add()` runs before `add_unique()`, and `add()` includes randomization
of `reagent_type` in lieu of an already defined one. `add_to_holder()`
runs before both, so that's where the pref will be read.
## About The Pull Request
Spacers who manage to get nograv on a planet are given a positive
moodlet, and are considered in space for their buffs/debuffs
## Why It's Good For The Game
I don't remember if I was opposed to this in the past or why I didn't
make it work this way in the first place.
It's sensible that, if you manage to disable your own gravity, all of
the negative effects (which are tied to you feeling heavy gravity) would
be lifted.
## Changelog
🆑 Melbert
add: Spacers who manage to get nograv while on a planet are given a
positive moodlet, and are considered in space for the purpose of their
buffs/debuffs
/🆑
## About The Pull Request
This adds a new positive quirk called "**Keen Nose**" that costs 3
points.
It lets you examine any open container with reagents to smell them. It
generates the smell based on the taste description. Also added an effect
to pepper spray, where it causes you to lose your sense of smell
temporarily.
This quirk is blacklisted against the Anosmia quirk, which is the
opposite. (no sense of smell)
## Why It's Good For The Game
Since there is a serious lack of positive quirks, I figured this one
might be useful as a utility quirk. It's a niche thing that could come
in handy. Keep in mind, there are several ways to identify chemicals,
like using the bartender's beer goggles, the science goggles, a chem
machine, or just eyeballing the color. Also, many chems have overlapping
taste descriptions (several different things taste like "death") so it's
not foolproof.
## About The Pull Request
That part wasn't finished. It won't! The other change just makes it so
non-vox aug brains can die from emps.
## Proof Of Testing
it didn't work then, it's gone now
## Changelog
🆑
balance: vox get to keep their min brain health threshold from emps,
removed it from roundstart aug brains.
del: surplus cybernetic brain is gone again
/🆑
## About The Pull Request
Would you like to play as John Madden.Job: Assistant.Status: Traitor.?
## Why It's Good For The Game
Would you like to play as John Madden? Job: Assistant, Status: Traitor?
## Changelog
🆑
spellcheck: Changed spacing an punctuation in thanatorenasia offer to
ghosts
/🆑
## About The Pull Request
Adds `Thanatorenasia`, a 0 point neutral quirk
Those with `Thanatorenasia`, upon DNRing, their body will be made into a
"recovered crewmember" - meaning when the body is revived, ghosts will
be polled and allowed to take control over it
The body will retain `Thanatorenasia` after the fact, so the new
controller can DNR as well, continuing the cycle
## Why It's Good For The Game
A random idea I had based on a recent interaction that I thought could
be cool character gimmick. Every time someone dies, they get revived
with a different player, so they act differently, think differently, and
don't remember the rest of the round.
## Changelog
🆑 Melbert
add: Adds Thanatorenasia, a 0 point neutral quirk that turns your body
into a "recovered crewmember" if you choose to DNR - meaning if revived,
any ghost could take control of it
refactor: Refactored "ghostrol on revive" behavior a fair bit, report
any oddities with it / the spawners menu
/🆑
## About The Pull Request
- The `prosthetic replacement` surgical operation has been reverted to
be closer to how it used to work: The operation is done targeting the
limb that's missing
The change was made out of necessity, as surgical state was tied to
limbs - you had to operate on the chest to re-attach limbs because there
was no limb to operate on.
To circumvent that, I have done the unthinkable of adding stumps when
you are dismembered.
- Missing limbs are now represented as an invisible, un-removable,
un-interactable limb.
Making this change was not as difficult as originally anticipated, and
(at least surface level) seems to have broken very little.
Surprisingly little had to change to make this work.
Direct accesses to `mob.bodyparts` was changed to `mob.get_bodyparts()`
with an optional `include_stumps` argument.
Similarly, `get_bodypart()` had an optional `include_stumps` added.
This means we ultimately barely needed to change anything, and in fact,
some loops/checks were able to be streamlined.
## Why It's Good For The Game
- As mentioned, this change was out of necessity and was easily the
least intuitive part of the broader changes. Reverting it back to how it
used to work should make it far easier for people to pick up on, and
means we can cut out a bunch of bespoke instruction sets that I had to
include.
- The addition of stumps also adds a ton of future potential - code wise
it allows for stuff like better damage tracking (we can transfer damage
between limb <-> stump rather than limb <-> chest), and feature we can
do "fun" stuff like have stumps bleed on dismemberment that you can
bandage.
## Changelog
🆑 Melbert
del: "Add prosthetic limb" surgical operation has been reverted to be a
bit closer to how it used to work - you operate on the missing limb /
limb stump, rather than on the chest.
refactor: Missing limbs are now represented as limb stumps. In practice
this should change nothing (for now), as no features were rewritten to
make use of these besides surgery. Please report any oddities with
missing limbs, however.
/🆑
## About The Pull Request
Cybernetic/Cortical brain touch-up. Discuss.
Also because vox use cortical brains, we touched their code a little.
Tangent: I wish there was a way to make the brain restore surgery
capable of taking a multitool without being a separate op :\
# But why?
It's been noticed that people are using cortical brains to shoot up some
meth without consequences. This was a) not originally intended b)
genuine power creep, as previously the only way to be able to process
chems without the brain damage was to be a vox, who do start with
robotic-only brains. So, this PR is to address it. Sure you get an EMP
weakness, but this server has a soft-stigmatization against using EMPs
so that's leery on the social contract.
Fret not! You'll still have the option of a roundstart brain which
doesn't take meth damage. It just also takes slightly more EMP damage,
has less health than an ordinary brain, and if it ever gets removed, it
explodes as the other prosthetics do (but doesn't qdel). So really,
there's not much of a consequence.
## Proof Of Testing
https://github.com/user-attachments/assets/f48efc8b-9f4b-4fd1-b71f-145a1d4b63c5
<img width="255" height="167" alt="Screenshot_10"
src="https://github.com/user-attachments/assets/0334b931-0593-4721-9de2-a02211253e28"
/>
yeah i flipped it on the below one. it's correct now though
<img width="661" height="171" alt="Screenshot_11"
src="https://github.com/user-attachments/assets/554eaf09-8ee4-4a1a-a95b-c7332a078610"
/>
## Changelog
🆑
add: Previously-unobtainable surplus-cybernetic brain added to
Prosthetic Organ quirk
add: Cybernetic brains given the ORGAN_PROMINENT trait, following normal
brains.
add: Vox Primalis unique cybernetic brain has been finally added to
their species descriptions. (Bet you didn't know they had one)
balance: (Roundstart) Cortical brains given ORGAN_ORGANIC, so they can
be fixed with both mannitol and a multitool. Vox brains are excluded
balance: Brain options in character prefs have been given a 1
quirkiness-point cost.
fix: Cybernetic/Cortical brains have their repair hints updated to
reflect what they can actually be repaired by
code: Prosthetic Organ quirk moved to modular_zubbers
code: 'Vox Primalis' now considered a collective noun
code: dangerous_organ_removal has a new variable to toggle between organ
qdel or having its damage set to max health.
/🆑
## About The Pull Request
Revamps Echolocation effect
- Echolocation no longer pulses, at least, not as noticeably. The world
around you is consistently black and white, and objects will fade into
view as you approach or fade out of view as you move away.
- Echolocaters are now really blind. But you can still "see", so long as
you're not also deaf.
- Echolocaters can now "hear" mobs through walls, ie, see mobs through
walls like thermal vision.
- While echolocating you have the option of selectively ignoring things
which would make the screen busier - currently, blood, items, and floor
objects like vents or holopads.
https://github.com/user-attachments/assets/d559482c-e6e2-4b97-8387-54bca4074db0https://github.com/user-attachments/assets/aeddd805-230c-4e82-b93f-1e537f4186eb
## Why It's Good For The Game
Echolocation is such a cool effect but it currently is basically
unplayable
This revamp aims to make it more playable, particularly by making it
update constantly so you can react easier.
## Changelog
🆑 Melbert
balance: Revamped echolocation effect entirely. Now updates constantly,
rather than on a cooldown.
balance: Echolocaters can filter out certain objects that they would
really prefer not to see at the moment.
balance: Echolocaters are mechanically (but not visually) blind, which
means they have flash immunity and whatnot. Because of course they are.
balance: Echolocater lose their ability to echolocate if they've gone
deaf. Then you're truly fully blind.
balance: Echolocaters can see (or rather, hear) mobs through walls.
refactor: Refactored Prosopagnosia to make the effect a bit more
generic.
/🆑
---------
Co-authored-by: Jordan Dominion <dominion@tgstation13.org>
## About The Pull Request
### Rewrite stuff
Reagent addictions are written in terms of "units to addict" kinda like
how they were ages ago
For example `addiction_types = list(/datum/addiction/hallucinogens =
60)` says "We can expect to get addicted if we consume 60 units of this
reagent alone"
For easily converting units, I used the following equation
```
x = 1 / ((o * 0.2 / m / 2) / 600)
o = the old addiction number
m = the metabolism rate
x = the converted threshold
```
Example (Nicotine)
```
x = 1 / ((o * 0.2 / m / 2) / 600)
o = 15
m = 0.025
x = 10 (10 units to addict)
```
FULL TRANSPARENCY: Some reagents had some really weird results like
`33.33u` or `685.78u`
I rounded them to nicer numbers like `30u` or `685u`. I don't think
anyone would really care.
I anticipate this being easier to work with than the arbitrary point
values
### Mechanics stuff
Addiction gained is now calculated based on units metabolized, rather
than the static metabolism rate.
So if you metabolize less than a full metabolism tick, you aren't given
the full addiction points.
## Why It's Good For The Game
### Rewrite stuff
Addiction rates are kinda insane.
If you look at nicotine you see: `list(/datum/addiction/nicotine = 15)`
Then if you look at maintenance powder:
`list(/datum/addiction/maintenance_drugs = 14)`
You would assume that these give you addiction at a similar rate... but
ACTUALLY
you would get nicotine addiction from 10u consumed
and you would get maintenance drug addiction from 50u consumed
This was because nicotine's metabolism rate is 0.025 vs maintenance
powder's 0.1 metabolism rate - this is not exactly obvious at a glance
which makes tweaking addiction values kind of painful
Putting them in terms of "units to addict" makes it a lot easy to parse
at a glance - metabolism rate nor any other variable is necessary to
know how potent a substance is
(In particular you can see some reagents take **upwards of 1,200u** to
addict on their own. Which is INSANEEE. I want to go through in a second
pr and tweak all these values down)
### Mechanics stuff
This ultimately changes very little, it just makes sense that
metabolizing more or less of a reagent at once would give you more or
less addiction progress.
## Changelog
🆑 Melbert
refactor: Rewrites how addiction points are applied from reagents. Some
reagents may be marginally more or less addictive as a consequence.
balance: Addiction gained per metabolism tick now scales to the amount
of reagents metabolized. In other words if you metabolize 0.2 units
instead of the expected 0.4 units, you get 0.5x of the amount of
addiction gain. This ultimately changes very little and I would imagine
it's how most people expected it to work in the first place...
/🆑
## About The Pull Request
Increases the time that these quirks check from 30s to 90s, hopefully
giving a bigger window before you NEED to drink or smoke.
## Why It's Good For The Game
Quirks that require you to have a vice are good, but needing it every
second without fail or you get the big negative moodlet is kinda bonkers
and unfun.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
num change :) it worked
</details>
## Changelog
🆑
qol: Smoker, Junkie, and Addict now take longer to make you crash out.
/🆑
---------
Co-authored-by: Alexis <catmc8565@gmail.com>
## About The Pull Request
Medbay, the CMO, the Psychologist, (possibly) the Library, and some
maint rooms across all maps now have multiple copies of the SDSM-35
This exists as an in game ability to reference what brain traumas do. No
special bells or whistles, not even a search bar - it's a book after
all.
<img width="819" height="589" alt="image"
src="https://github.com/user-attachments/assets/ace867b9-a0f0-4302-99f9-46ed4d6fe377"
/>
<img width="802" height="546" alt="image"
src="https://github.com/user-attachments/assets/c96941d3-8da8-48f7-859b-93953fe01473"
/>
## Why It's Good For The Game
De-wikification: Rather than needing to pull up the wiki to figure out
what the brain trauma is doing, you can refer to the in game book and
cross reference the patient's behavior.
Medial larp: It's a reference to the DSM-5. If that wasn't obvious.
## Changelog
🆑 Melbert
add: You can now find the SDMS-35 in Medbay, the CMO's office, the
Psychologist's office, and possibly the Library. Quite simply, it's a
reference book for all the brain trauma's you may experience.
/🆑
## About The Pull Request
This PR removes the quirk "Big Hands" from the game
## Why It's Good For The Game
https://superset.moth.fans/superset/dashboard/28/?native_filters_key=U_1PwGbC9S0Sdb6We7h4rZiXiq-2OqlJo28rmbtiCXl6s7Cbi_Nhw-uLWDvHMTrw
In the last quarter-year of played rounds, Light Drinker was assigned
35,600 times.
Big Hands was assigned 57 times.
Nobody uses this quirk.
It's boring.
It says nothing about your character.
We already have a better, more fun, and more-used quirk that makes you
bad at using guns (stormtrooper aim).
Sometimes it feels like we add negative quirks just because we can, and
this is one of those.
## Changelog
🆑
del: It's no longer considered quirky to have Big Hands.
/🆑
## About The Pull Request
What it says on the tin. `times_fired` is the most unused parameter in
all mob procs. I say most because there were just 2 cases where it was
used
- handling breathing
- handling heartbeat
Besides these 2 cases this parameter did nothing in every proc. Removing
it does 2 things
- Makes those procs more readable as it now has 1 less parameter that
was documented poorly and did nothing
- Makes those procs slightly faster as we are passing 1 less variable to
its parameter call stack
It can easily be substituted with `SSmobs.times_fired` which was its
original value anyways
## Changelog
🆑
code: removes an unused parameter `times_fired` from mob life procs.
Making them function slightly faster
/🆑
Fixes 1 single grammatical error. Feels pretentious but grammar good
mmm.
## About The Pull Request
This pull request converts a singular "a" into "an" in the asthma.dm
file to change the phrase that is visible during quirk selection.
Converting the phrase:
## Why It's Good For The Game
While the grammar mistake is relatively small, and hence this has
incredibly low priority, it is still a SPaG error that should probably
be corrected. It may improve the sentence's flow/readability by a tiny
amount as well.
## Changelog
🆑
spellcheck: fixed asthma.dm typo
/🆑
## About The Pull Request
Phobias have been refactored to use the new fear system instead of
handling their effects via simple triggers on themselves. The overall
idea is still the same, triggering upon seeing/hearing/saying a scary
word or thing, but instead of instantly sending you into a panic it adds
some fear and has a chance of triggering a new startle fear effect,
which mirrors some of the previous phobia effects that weren't already
included in other handlers.
To complete the phobic trio, I've added monophobia as a quirk - its
quite interesting compared to nycto- and claustrophobia, as it forces
you to stick to other people, thus indirectly incentivizing social
interactions, and could make for actually interesting moments.
Additionally, I've cleaned up some of the related code and added message
CDs to all other handlers that were missing them as to avoid chat spam
which could sometimes occur when the effect triggered far too
frequently.
## Why It's Good For The Game
Using the new system makes phobias much more immersive and interesting
to play around, as they no longer absolutely cripple you to the point of
making the game unplayable in case of some of them due to random stuns
or knockouts. It also makes them natively interact with other phobias
and quirks, which is a neat thing for character building.
Currently getting a phobia basically forces you to go to medbay as to
not risk randomly falling unconscious every once in a while if you roll
a common one (like cyborgs, blood, doctors or authority), and picking
one as a quirk is basically not an option.
## Changelog
🆑
add: Monophobia is now availible as a negative (-3) quirk.
balance: Phobias now have accumulating, and less debilitating effects
due to conversion to the new fear system.
qol: Fear effects now have a cooldown between messages as to avoid chat
spam.
code: Cleaned up some of fear code.
refactor: Refactored phobias to use the fear system
/🆑
## About The Pull Request
The real reason I made this is because twice now I've accidentally
thrown away my heirloom because it just looked like job equipment, but
some other quirks have key memories and I think it's fun flavor to add
to something like the heirloom quirk because of the significance of the
item to the character.
## Why It's Good For The Game
Carve up the walls with scenes of your character stealing the beloved
family lighter from their ungrateful no-good sibling
## Changelog
🆑
add: Added a key memory to the family heirloom quirk
/🆑
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.
<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>
I'll upload the .cs script I used to do it shortly.
## Why It's Good For The Game
Just minor code cleanup.
Script used is located at https://metek.tech/camelTo-Snake.7z
EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
static async Task Main(string[] args)
{
var readFile = new FileStreamOptions
{
Access = FileAccess.Read,
Share = FileShare.ReadWrite,
Options = FileOptions.Asynchronous | FileOptions.SequentialScan
};
FileStreamOptions writeFile = new FileStreamOptions
{
Share = FileShare.ReadWrite,
Access = FileAccess.ReadWrite,
Mode = FileMode.Truncate,
Options = FileOptions.Asynchronous
};
RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
Dictionary<string, int> changedProcs = new();
string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
Regex camelCaseProcRegex = new(regexPattern, regexOptions);
string snakeify(Match matchingRegex)
{
var vals =
matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
string logString = $"{vals[0]} => {newVal}";
if (changedProcs.TryGetValue(logString, out int value))
{
changedProcs[logString] = value + 1;
}
else
{
changedProcs.Add(logString, 1);
}
return newVal;
}
var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();
// uses default ParallelOptions
// https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
{
var reader = new StreamReader(filePath, readFile);
string oldContent = await reader.ReadToEndAsync();
string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
if (oldContent != newContent)
{
var writer = new StreamWriter(filePath, writeFile);
await writer.WriteAsync(newContent);
await writer.DisposeAsync();
}
reader.Dispose();
});
var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
foreach (var pair in logToList)
{
Console.WriteLine($"{pair.Key}: {pair.Value} locations");
}
}
}
```
## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑
## About The Pull Request
If you try to add back organs to qdeleting mobs you get weird stuff like
this:
<img width="575" height="66" alt="image"
src="https://github.com/user-attachments/assets/2000a344-0ecb-42a4-941d-fd97c163f935"
/>
Also, there were two versions of `remove()`, one of which was never
being reached because it was overridden with no parent call.
So now the signals should actually get unregistered.
## Why It's Good For The Game
Less runtiming code
## Changelog
Not player-facing
## About The Pull Request
Moves all blood handling into procs and adds ways to easily hook into
basically every basic blood behavior.
This PR is not meant to fix every single case of janky blood logic in
the game. The main point and motivation of this PR is to add hooks for
blood behaviors. This allows for way more flexibility with blood code.
I am not going to fix our 3000 instances of single-letter vars, wacky
blood transfers, etc. This is just the groundwork for future PRs to
build off of, and by itself, should do very little to change blood
behavior.
I also added a rigorous set of unit tests for verifying that all of the
basic blood volume procs work correctly.
## Why It's Good For The Game
Previously, blood was handled via directly reading/writing
[var/blood_volume]. This was INCREDIBLY inconsistent and there was no
way to hook into it. This PR makes blood handling way more consistent,
which is great for all sorts of features.
## About The Pull Request
During a big refactor the allergies quirk wasn't quite modified
correctly and its usual add proc got overwritten by an add proc with
vital functionality. However it clobbered the logic that actually gave
the quirk recipient any chemicals to be allergic to.
## Why It's Good For The Game
Extreme Medicine Allergy should not be a free quirk points source I
think
## Changelog
🆑
fix: Extreme Medicine Allergy quirk will no longer lead to you being
allergic to nothing
/🆑
## About The Pull Request
Fixes all instances of numbers being used as assoc list keys in things
that aren't alists, either by turning them into alists or changing the
keys to something else. Also adds new macros to support creating global
alists, as a few global lists became alists. Most of these are pretty
simple and self-explanatory but
- The GLOB.huds one necessitated rewriting because code depended on it
being a non-assoc list, which it technically was because the defines it
used as keys were numbers so BYOND turned it into a regular list, most
of this was for loops through all the subtypes of
`/datum/atom_hud/data/diagnostic` of which there's only one, so I just
changed it to get that type directly by key
- NT Frontier used number indexes which it looped through for some
reason and also passed to TGUI, changed these to strings and adjusted
the TGUI to match, I tested this and it works fine
## Why It's Good For The Game
Makes the code compile, I couldn't test everything but I tried to check
all usages of affected vars to make sure they wouldn't break from being
switched to alists, a TM might be in order just to be sure nothing's
fucked
## Changelog
🆑
refactor: rewrote all cases of numbers being used as keys in non-alist
associative lists
/🆑
## About The Pull Request
Empath has become a component instead of a trait, letting it store
variables or whatever components are good for. Also, it works slightly
differently for empath quirk users and moon heretics alike.
Additionally:
- You can only shiver when you see an evil person once. After that it
won't happen again.
- Empaths no longer get a mood debuff from seeing someone distressed.
- Moon heretic empaths no longer get smited by evil people.
- Moon heretic empaths aren't scared of evil people.
The component also supports empaths being able to tell if a fake dead
body is actually dead, and being able to use empath on yourself, but
those aren't enabled for the empath quirk or moon heretics. (Self-empath
would probably powercreep self aware)
## Why It's Good For The Game
While the empath quirk is incompatible with the evil quirk, the trait
wasn't. That means you could potentially become an evil empath and still
feel bad about other people feeling bad and get smited by other evil
people. Being an empath is different from having empathy, and there's
now a personality trait (compassionate) that has a very similar feature
so the mood debuff got axed and moon heretics can't get smited by
mending touch anymore.
I think being a heretic and looking into pierced realities probably
means you have the mental fortitude to not freak out when you see an
evil person. Evil people are (probably) a lot less scary than whatever
mind destroying thing is in those holes.
As for the only-getting-scared-once bit, freaking out when you see an
evil person is flavorful but annoying after it happens multiple times.
Especially if it happens after examining the same person multiple times.
## About The Pull Request
Saves us like, 10,000 - 20,000 lists per round by not initing a list for
every reagent
Uses a signal to handle allergic reactions blocking metabolism rather
than adding behavior `/reagent`
## Why It's Good For The Game
Will it matter? Probably not, is it cleaner? Heck yeah
## Changelog
🆑 Melbert
qol: Tox damage from allergic reactions is affected by tox damage
modifiers
refactor: Changed how allergic reactions to chem pause metabolism,
report any oddities
/🆑
## About The Pull Request
Fixes up some of the blaring problems with the woefully unloved
dullahans, making them at least playable in time for halloween. List of
individual fixes in the changelog, but notable code changes include that
visible/audible messages can (currently exists for dullahan heads and
holopad projections) now be proxied, so that detached cameras can
optionally relay TTS, emotes, and other messages to the proper client.
## Why It's Good For The Game
Its spooky month!
## Changelog
🆑
fix: Dullahans spawn with their intended organs
fix: Dullahans can hear/see emotes
fix: Dullahan heads properly have preferences applied to them
fix: Dullahan heads no longer appear eyeless
fix: Dullahans can hear things from their head regardless of if their
body is nearby
fix: Dullahans can hear TTS messages
fix: Dullahans have a TTS voice
qol: Dullahans have a head in the character preview, for the sake of
easier customization
/🆑
## About The Pull Request
(In case people don't know, a stabilized cerulean extract is an item
that creates a clone of you that is catatonic while you hold it. If you
become a corpse (doesn't work if you're gibbed, decapitated, or dusted,
or completely deleted in any other fashion) and the clone is still alive
your soul is pulled into the clone)
Currently, the clone is just the equivalent of a catatonic monkey human
with your dna moved onto it. It looks the same as you, but the
similarities end there. It doesn't share your traits, sex, or voice.
This PR changes the clone to copy more of your old self so it actually
feels like you and you can't use it to get rid of all your brain traumas
but the clone does keep any positive ability you get from your traits as
well.
## Why It's Good For The Game
Bugfix. I mean maybe it's intended that way but that seems unlikely.
Also I should mention that because addictions are tied to your mind
(whatever that means) the only addictions that swap to your clone are
ones that you have from traits. Also your allergies will be randomized
again since you're getting new traits.
## Changelog
🆑
fix: stabilized cerulean extract clones keep your traits
fix: certain traits now function properly when added midround
/🆑
---------
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Removes the brain itch damage from the chipped quirk, as well as its
var, datums, and procs, and flavor text that refers to it. (give me an 👀
if you didn't know about this)
Also removes mannitol as a mail item for chipped crew given that its
unnecessary now.
## Why It's Good For The Game
A good quirk should not give you an unadvertised brain damaging status
effect when you can just go get chipped on the station without any of
the downsides. Also the downside should be taking a negative quirk (and
even then we gave everyone two free points).
I'm also accepting suggestions on reworking the flavor text.
## Changelog
🆑
del: Removes chipped's brain damage status effect and flavor text
del: Removes mannitol from the mail list for chipped crew
/🆑
## About The Pull Request
`/proc/flatten_list()` -> `/proc/assoc_to_values()`, also changes the
code doc to mirror the language of `assoc_to_keys()`'s code doc
## Why It's Good For The Game
Having a proc called `assoc_to_keys` that takes an associative list and
returns a list of the keys, and also having a proc that takes an
associative list and returns a list of the values, and the latter not
being called `assoc_to_values` is very funny
## Changelog
🆑
code: renamed flatten_list proc to assoc_to_values
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>