## About The Pull Request
port of https://github.com/Monkestation/Monkestation2.0/pull/11506,
alongside some additional improvements
makes it so the color changing from regen rainbow/adamantine and stable
pyrite extract now use color transition filters instead of a static atom
color - and also the rainbow protection effect from a regenerative
rainbow now makes you actually animate all rainbowy (caramelldansen
extract).
(thank you smartkar for the rainbow extract animation code!)
https://github.com/user-attachments/assets/8177ee19-40cf-45a9-8683-ec163933d1bf
also did some minor misc code improvements while i was in that file -
adding `tick_interval = STATUS_EFFECT_NO_TICK` to stuff that didn't
tick, converting durations to use the `SECONDS` macro, converting a
couple of things to use `seconds_between_ticks`, and nulling some
references on removal.
## Why It's Good For The Game
less of an eyesore, and more eyecandy
Also code improvement is nice.
## Changelog
🆑 Absolucy, SmArtKar
qol: The color changing from regenerative rainbow, adamantine, and
stabilized pyrite extracts now looks far better.
qol: The protection effect from regenerative rainbow extracts now
actually makes you all rainbowy.
code: Minor improvements to crossbreed status effect code.
/🆑
## About The Pull Request
Removes a lot of cargo cult copypasta with
`default_deconstruction_screwdriver`, `default_deconstruction_crowbar`,
and to a lesser extent `default_pry_open` and
`default_change_direction_wrench`
ALL you gotta do now if you want your machine to have an openable panel
or be deconstructible with a crowbar is this
```dm
/obj/machinery/dish_drive/screwdriver_act(mob/living/user, obj/item/tool)
return default_deconstruction_screwdriver(user, tool)
/obj/machinery/dish_drive/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(user, tool)
```
`default_deconstruction_screwdriver` no longer directly sets
`icon_state`, requiring the user pass in the open and closed icon
states. Now, it just calls `update_appearance`, and everything that once
passed the icon state now uses `base_icon_state` and
`update_icon_state`.
## Why It's Good For The Game
Many of these procs were terribly overcomplicated and difficult to work
with for what should be a relatively simple action
Streamlining it makes it easier for coders to understand and work with
## Changelog
🆑 Melbert
refactor: A majority of machines had their screwdriver/crowbar/wrench
interactions rewritten, report any oddities like being unable to open a
machine's panel or deconstruct a machine
/🆑
## About The Pull Request
- Merged a lot of procs into procs `attempt_picture()` and
`interact_with_atom()` reducing proc overhead
- Taking pictures will now always use the cameras internal
`picture_size_x` & `picture_size_y`. It no longer accepts variable sizes
as parameters
- All camera operations are asynchronous and respects checks on if the
target can be captured on camera or not.
- A bunch of other code rearrangement that makes readability easier
- Fixes the following camera bugs. They fall under the same category
- Fixes#95286
- Fixes#95256
## Changelog
🆑
fix: camera devices work again, camera flash turns on in most instances
refactor: camera code has been refactored. Report bugs on github
/🆑
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
## About The Pull Request
This is a port/revival of Kapu's
https://github.com/DaedalusDock/daedalusdock/pull/883
By god, please TM this for a while, as HUDs are rather volatile and I
might've missed something (also the original PR had harddel issues, so
we should probably be on the lookout for those)
Instead of being stored in a metric ton of separate variables, all HUD
elements are now kept in a ``key -> element`` assoc list, and separate
category lists have been turned into a single ``group_key -> list of
elements`` assoc list for easier management.
This massively simplifies HUD creation and management, and allows us to
sanely dynamically modify HUDs without having to keep track of our
elements ourselves (harddel fuel)
I've also noticed that plasma vessels had... interesting, to say the
least, way of managing their HUD and in humans were unable to display
it, which I've changed (the element itself is displayed below stamina in
non-aliens, as latter occupies the spot where you'd normally see it)
Also fixes a bunch of minor unlikely to occur issues with HUD not
updating when it should've sometimes.
## Why It's Good For The Game
The two most important results of this is that A) we can fix the issue
with items larger than 32x32 not displaying properly in inventories (in
a separate PR) and B) this paves the way for datumized inventory slots,
although that is a separate nightmare
Some of this code is also actually over a decade old, and is an absolute
nightmare to work with.
## Changelog
🆑
qol: Non-aliens with an implanted plasma vessel now see their plasma
level in their HUD instead of just the stat panel
refactor: Refactored the entirety of HUD management code, report if
anything breaks!
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
closes#95453
Not soon after the coroner organ thing got merged, "someone" removed
being able to mutate objects
I can't really be that pissed because I did merge the PR that did that
## Changelog
🆑
fix: Coroner cytology grown organs can mutate again
/🆑
## 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
Converts anomaly refineries, tank compressors, doppler arrays,
anomacores, slime extracts and crossbreeds from attackby() to
item_interaction.
## Changelog
🆑
refactor: Converted crossbreeds/anomacores/RND machinery to
item_interaction
/🆑
## About The Pull Request
What it says on the tin-- with having a nice abstract types system now,
we can utilize that in create_and_destroy.
## Why It's Good For The Game
Removes a lot of the need for snowflake item exclusions, and makes this
test likely a lot more stable (and a little faster even).
## Changelog
Not player-facing
## About The Pull Request
old crossbreed code is jank and just set your color directly, while it
should just be using `add_atom_colour` and `remove_atom_colour`
## Why It's Good For The Game
you can exploit this to become pitch black by having someone put a
stable pyrite extract in your pocket while ur being electrocuted.
## Changelog
🆑
fix: Fixed a rare bug that could result in people permanently becoming
pitch black as a result of stabilized pyrite or regenerative rainbow
extracts.
/🆑
## About The Pull Request
Does what it says on the tag. Lets you vat-grow goats with a sample of
their cells and a couple reagents.
These cells can be found in both living goats and maintenance sludge,
similar to cows and chickens.
## Why It's Good For The Game
Goats are a common animal and there's no real reason not to have them be
grown by cytology.
Additionally, #95022 gave me the idea of fighting kudzu with an endless
army of goats and I was pretty disappointed to find out you couldn't do
it.
## Changelog
🆑
add: Pigs and goats can now be grown in a cytology vat
/🆑
## About The Pull Request
Cytology samples no longer have an RNG chance to fail from other
mid-grown samples present
The two cell lines that used failure for unique events had them reworked
slightly
- Clown cell lines: Now get boosted by mutagen, but using mutagen has a
chance of spawning a mutant clown instead.
- Queen bee cell line: Every other successful growth will spawn a swarm
of bees instead of a queen bee.
Also, grown bees can mutate into random toxin bees.
## Why It's Good For The Game
Collecting the necessary reagents and samples to grow something in
cyology can take you between thirty minutes to a full hour of your round
And if you're unlucky, your hard grown mob can just get nuked, wasting
all the reagents you collected! That's VERY unfun.
You are *supposed* to mitigate it by using suppressants and whatnot, but
sometimes you get samples like this which are nigh impossible to mix
successfully
<img width="603" height="396" alt="image"
src="https://github.com/user-attachments/assets/34b422a3-9788-4efb-ac93-ce66bd80a0e9"
/>
Thus, in the interest of making cytology less of a time waste, I think
removing RNG failures is a step in the right direction
The minigame still exists - you still need to outpace the other samples
to grow successfully. You just no longer get owned for not managing to
get enough random suppressants and boosters.
## Changelog
🆑 Melbert
del: Cytology creations no longer have a random chance to fail if
another sample in the vat has growth process. All growth is still reset
on any successful creation. As growth failure has been removed, some
cell lines that had unique fail interactions have been altered.
add: Clown cell lines are now all boosted by supplying mutagen. However,
using mutagen may cause a mutant clown to spawn. (Before, failure caused
a mutant clown to spawn.)
add: Queen bee lines now alternate between spawning a queen bee and a
swarm of bees. (Before, failure caused a swarm of bees to spawn.)
add: Cytology created bees have a rare chance of having a random toxin.
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
## About The Pull Request
This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.
``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists
I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.
Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)
## Why It's Good For The Game
Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.
## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
## About The Pull Request
The Slime Management Console will include a random stored_monkeys in a
to_chat if there aren't enough. This removes it so that it reads better.
## Why It's Good For The Game
Reads like proper english in a player facing console.
## Changelog
🆑
spellcheck: The slime management console no longer reads a variable name
out incorrectly.
/🆑
## About The Pull Request
The overall behaviour of everything should stay the same but the memory
& speed of these components has been slightly improved and when you
scale that across large plumbing factories you get a substantial
improvement. Here's a list of the most noticeable changes along with
many others that aren't worth mentioning
- Removed vars `use_overlays`, `turn_connects`,
`recipient_reagents_holder`
- `active` var is now replaced with a proc which simply returns is the
machine wrenched or not
- `turn_connects` has been removed because all machines have their pipes
rotate when the machine is rotated. This also removed all the static
icon states ending with `-s` from the `dmi` file thus reducing that file
size as well
- `extend_pipe_to_edge` var is directly integrated into `cut_overlays()`
because it's use cases were limited such for showers & sinks
- Simplified `Initialize()` a lot. Removed params `start`,
`turn_connects`, `custom_receiver`, `extend_pipe_to_edge`. We now only
pass `bolt_layer` making that proc faster & less convoluted
- Replaced `set_recipient_reagents_holder()` proc with
`recipient_reagents_holder()` which returns the reagent holder for
holding reagents instead of storing it in the component. This removes
the need to hook a qdel signal on the holder & we don't need to keep
track of it
- Merged a ton of procs to reduce overhead & reduce file size
- Plumbing ducts creating the network at mapload is faster without using
recursion and the timer subsystem
- Deconstructing plumbing ducts is faster in reconstructing the network
without using recursion and the timer subsystem
This makes managing plumbing code less convoluted & overall better for
the foreseeable future. See the lines of code removed vs added and still
preserves behaviour
## Changelog
🆑
qol: added examines & screentips for ducts & stack of ducts
qol: you can wrench a stack of ducts on the ground to create a pipe
refactor: plumbing code has been improved overall. Report bugs on github
sprite: removed unused static(does not rotate with machine) icon states
for plumbing connections
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
## About The Pull Request
Inspired by #94233. `grind_results`(list) & `juice_typepath`(typepath)
are only used when grinding & juicing after which the atom is deleted.
This means if that object is not processed these vars occupy memory &
don't do anything.
Now these values are only generated on demand by calling their
respective procs. Considering how these vars are on the obj level the
memory savings are quite significant
## Changelog
🆑
refactor: grinding & juicing have been refactored to occupy low memory.
Report bugs on github
code: improved grinding & juicing code
/🆑
## About The Pull Request
<img width="579" height="67" alt="image"
src="https://github.com/user-attachments/assets/d7a4427e-2a6e-44d3-94ba-c90a2d474984"
/>
Simple rotation components number in the 8-9k range per round, and each
contains a needless callback datum as well.
These do not need to hold any state and can be bespoke elements, and the
proc to do things post_rotation can just be a normal atom proc.
<details><summary>Still works as you'd expect, including items that have
flag requirements like the wrench</summary>


</details>
## Why It's Good For The Game
Makes a heavily used element much more lightweight, saves a few mb of
memory.
## Changelog
🆑
refactor: simple rotation component has been refactored into an element
Please report any bugs to github.
/🆑
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## 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
The console called attack() on the potion, which, after the recent
refactor, no longer works. This switches it to interact_with_atom.
## Why It's Good For The Game
fixes#94120
## About The Pull Request
Makes slime potions, injector, and cookies use item_interaction.
generizices behavoir that potions typed under
`obj/item/slimepotion/slime/` only affect slimes, moves the handful of
potions that did not do that out of that type.
removed a random type casting for slime cookies to verify there human
before it checks for `TRAIT_AGEUSIA` as there is no reason other mobs
wouldn't be able to taste it.
do to the refactor you wont "bash" a lot of items if the interaction
fails.
## Why It's Good For The Game
<img width="439" height="68" alt="image"
src="https://github.com/user-attachments/assets/f398fb6c-8cbd-4092-9a64-8cccce87f8b6"
/>
## 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
`/proc/find_safe_turf()` was cleaned up so that it did not have two
arguments that accomplished the same thing, removing opportunities for
user errors when calling the proc. Additionally, since I was here, I
decided to clean up some of the code and document it.
Some thresholds were changed in this PR (the max temperature threshold
was dropped from 360K to 340K), but I believe that it's better to keep
them consistent instead of using arbitrary values.
## Uncomfortably large gap
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
## Changelog
No user facing changes.
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
closes#93805
## Why It's Good For The Game
we actually have almost no emp logging at all lol, not even emp chem
reaction, so you barely can track potential griefer?
## Changelog
🆑
admin: EMP logs are improved, additionally chemical EMP reactions are
now logged.
/🆑
## About The Pull Request
When a camera update is triggered, it is instead added to a queue on a
background subsystem
An AI entering a camera chunk which is queued to update will force the
update immediately (bypassing the queue)
While the root problem of this is, ultimately, not addressed...
<img width="554" height="58"
alt="467828777-eff3f0e5-49d6-4997-b4d7-05eff6432155"
src="https://github.com/user-attachments/assets/c2d6a5f5-d958-463e-959f-116bd0dab475"
/>
...the change will ultimately prevent update spam from consuming all of
the server's resources - instead allocating updates to the backburner in
times of high server stress (or on multi-z maps)
## Changelog
🆑 Melbert
refactor: Refactored the way camera updates are handled to hopefully
reduce some lag. Report any oddities
/🆑
## About The Pull Request
Items(i.e yellow stabilized/regenerative extract, glowshroom cap,
voltaic cybernetic heart) now recharges cells of mob equipment as they
are supposed.
## Why It's Good For The Game
After [(this)](https://github.com/tgstation/tgstation/pull/92987) PR was
merged items, that were supposed to recharge cells in items, stopped
functioning due to change in code of how batteries inside items
recharge. This PR supposed to fix the issue.
## About The Pull Request
Most screen alerts that use the midnight hud style no longer have the
button baked in their icon. Other screen alerts with their own
background or shape (robot and mech alerts, atmos, heretic buffs or
debuffs etc.) are not affected. Also updated a couple sprites but didn't
spend too much time on them. Mostly reusing existing assets.
Montage of how the alerts look on threee different hud styles
(Operative, Trasen-Knox, Detective, ALSO I FIXED THE BUCKLED ALERT
ALREADY):
<img width="293" height="323" alt="image"
src="https://github.com/user-attachments/assets/3a2b972b-aa5a-4c27-a454-c8c39acf6e20"
/>
It looks only a smidge iffy on the syndicate since the top and bottom
borders aren't layered over all the overlays, but it isn't something to
worry about in this PR.
## Why It's Good For The Game
Screen alerts always had the midnight hud button baked in their icon
states (now overlays), which completely disregard the player's hud
setting, much unlike action alerts buttons. Melbert has also said that
it'd be nice if the code for action buttons could also be used in screen
alerts and viceversa, to slim things down. That's obviously not what I'm
doing today, but having most of the screen alerts already without the
baked background will surely help if we ever pursue that objective.
## Changelog
🆑
refactor: Refactored screen alerts a little. Most should now fit the
player's hud style. Report any issue.
imageadd: A few screen alerts have been polished/updated a little.
/🆑
## 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
Fixes slime extract bugs with selfstaining slime and clusterbuster.
Fixes: #93315
## Why It's Good For The Game
Fixes slime extract bugs
## Changelog
🆑
fix: Self sustaining slime and clusterbuster now correctly fill required
reagents
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Fixes#93359
Caused by #93165
Inventory screen elements were no longer considered reachable, which
broke mousedrop handing on objects that check "is dragging into
inventory slot"
I don't know the best way to fix this yet but I figured the next best
thing would be to make all of these use the `drag_pickup` element, which
skips this reach-ability check
Thus I refactored it slightly to accommodate for items which should
contextually not be drag-pick-up-abble and bam, works like a charm
## Changelog
🆑 Melbert
fix: Dragging defibs and modsuits off your back works again
/🆑
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
## About The Pull Request
Closes#93285
Mood event from the death of a mob spawned "artificially" is 75% weaker,
lasts 80% the duration, and don't compound
An artificial monkey's death will now result
- -8 * 0.25 * 0.5 = floor(1) = 1 strength moodlet for the average crew
member
- ...Lasting 30 seconds (unless refreshed)
- -8 * 0.25 * 1.5 = floor(3) = 3 strength moodlet for animal friends
- ...Lasting 1.5 minutes (unless refreshed)
- -8 * 0.25 = floor(2) = 2 strength moodlet for compassionate crew
members
- ...Lasting 1 minute (unless refreshed)
Artifical spawning includes
- Moneky Cube
- Xenobiology Console
- "Life" reaction
- Summoned rats
- Spawner grenades
- Cult ghosts
Lemmie know if I'm missing any obvious spawns
## Why It's Good For The Game
While funny it was not my intention to have Xenobiology / Genetics /
Virology nuke your mood.
## Changelog
🆑 Melbert
balance: Death of artifical mobs (such as monkey cube monkeys) result in
a 75% weaker, 80% shorter moodlet that does not compound with more
deaths.
/🆑
## About The Pull Request
Anything that iterates contents for all cells now use a new helper,
`get_all_cells`, which only checks equipped items and storage contents
for cells, rather than... everything
This means we avoid grabbing abstract cells, and thus avoid this
<img width="676" height="113" alt="image"
src="https://github.com/user-attachments/assets/955f38e5-7428-477d-ab6a-dcc338960c99"
/>
Note:
This means these random recharge-all objects (like Xenobio stuff) no
longer recharges Ethereals
If we want these objects recharging Ethereals, we should *probably* add
a bespoke interaction
## Changelog
🆑 Melbert
fix: Things that recharge "all cells on your person" now avoid
recharging Ethereal stomachs, and thus, will no longer cause spontaneous
overcharge or weird chat messages
/🆑
## About The Pull Request
- All slimes of the same color share the same `slime_type`, saving a
tiny amount of memory whenever a xenobiologist exists
> Also slime_types were never manually deleted by the code, only
possibly being deleted by the GC later on. This makes the whole thing a
bit a bit more sane.
<details>
<summary>Minor changes</summary>
- Charged rainbow now properly uses `/mob/living/basic/slime/random`
instead of `/mob/living/basic/slime` and then randomizing its color
- `set_slime_type` now actually updates its name and icons like it says
in the comment description instead of them being set at initialize()
- `random_colour` was deleted, being replaced by calling
`set_slime_type` with no argument or with null as its argument
- the random color slime subtype now calls the `set_slime_type` proc and
lets it randomize the color instead of doing it itself
</details>
## Why It's Good For The Game
> All slimes of the same color share the same `slime_type`, saving a
tiny amount of memory whenever a xenobiologist exists
- Its a slight improvement but its still good since most shifts will
have a xenobiologist making a good chunk of slimes
<details>
<summary>Minor change explanations</summary>
> Charged rainbow now properly uses `/mob/living/basic/slime/random`
instead of `/mob/living/basic/slime` and then randomizing its color
- Very minor nitpick, still should be just spawning that subtype
> `set_slime_type` now actually updates its name and icons like it says
in the comment description instead of them being set at initialize()
- if any admin or a future coder wants to change a slime's color now it
should properly work with just that proc
> `random_colour` was deleted, being replaced by calling
`set_slime_type` with no argument or with null as its argument
- there are 2 places calling it, 1 of them that shouldn't be calling it
in the first place, i think its fine to squish it under that proc
> the random color slime subtype now calls the `set_slime_type` proc and
lets it randomize the color instead of doing it itself
- Its a bit cleaner
</details>
## Changelog
Edited this out since these aren't player-facing changes. - Ghommie
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Converts as many time vars expressed in deciseconds as I could find to
use time defines.
## Why It's Good For The Game
Makes these values neater and more readable.
## Changelog
🆑
code: Converted a lot of time-based variables to be expressed with time
defines.
/🆑
## About The Pull Request
So it seems like it was possible for the `slime_pickup(...)` proc to be
called on a slime we were already picking up when spam-clicking,
especially on high time dilation, leading to the slime being added to
the list of stored slimes twice.
This just adds an early return in case we have already added this slime
to our list.
This fixes our issue.
## Why It's Good For The Game
Fixes#92270.
Fixes#91909.
Fixes#91686.
## Changelog
🆑
fix: Xenobio console can no longer pick up the same slime multiple
times.
/🆑
## About The Pull Request
fixes#92156
<img width="72" height="74" alt="image"
src="https://github.com/user-attachments/assets/607384a8-b0d1-4cdf-ac42-fdf071df1789"
/>
## Why It's Good For The Game
Fix bug
## Changelog
🆑
fix: Fish tails now correctly show up
fix: Mutant colors and other features now apply correctly in some cases
where they previously didn't
/🆑
## About The Pull Request
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)
Both features and identities have been tested through and through, and
seem to be working fine.
Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however
## Why It's Good For The Game
I've been told the maintainers will love me for doing this
## Changelog
🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
## About The Pull Request
So a previous pr of mine caused #91625, because xenobio consoles
actually implement their own weird shift click signals:
https://github.com/tgstation/tgstation/blob/9447820886ea5f1063a7ae161a4527d734cefed2/code/modules/research/xenobiology/xenobio_camera.dm#L389-L398
So! I decided I might as well clean up some of the related code!
...And then I continued doing so, as I found more issues.
Anyhow, this is broadly just a cleanup of some old code, trying to avoid
some of the older issues.
Notable changes:
- We no longer keep a list of all connected xenobio consoles on the
monkey recycler, and instead use weakrefs on the xenobio console. Much
cleaner, and lets us easily avoid some of the bugs not properly the old
system not properly cleaning up after itself had caused.
- There was a lot of unnecessary getting of the user's remote control
eye followed by getting the associated xenobio console followed by
calling procs on that var:
https://github.com/tgstation/tgstation/blob/9447820886ea5f1063a7ae161a4527d734cefed2/code/modules/research/xenobiology/xenobio_camera.dm#L408-L412
This tries to minimize that to places where it's actually necessary, and
moves getting the `remote_eye` to the `validate_area(...)` proc itself.
This is now called `validate_turf(...)`, and no longer has the eye
parameter.
- A lot of `to_chat(...)` messages have been kept, just supplemented
with balloon alerts, because the additional information oftentimes feed
better to have.
- `attackby(...)` has been refactored to `item_interaction(...)` and
split into three `[item]_act(...)` procs.
- The click interactions have all been renamed into snake_case into the
format of `[type]_click_[target](...)`, with a core signal handler proc
selecting between such based on the clicked target. Good riddance
`COMSIG_XENO_SLIME_CLICK_SHIFT` and `COMSIG_XENO_TURF_CLICK_SHIFT`
- Moved checking for the connected recycler to a new
`can_recycle_monkeys(...)` proc, and checking whether we can recycle a
monkey to `can_recycle_target_monkey(...)` to keep those checks in one
place, instead of scattered wherever. For similar reasons the monkey
handling code has been split off into
`try_recycle_monkeys_on_turf(...)`, `try_recycle_target_monkey(...)`,
and `recycle_monkey(...)`
## Why It's Good For The Game
Fixes#91625.
Less jank.
## Changelog
🆑
refactor: Refactored xenobio console item interaction and click code.
Please report any issues!
fix: When using the xenobio console, you no longer examine slimes/turfs
when trying to deposit or pick up slimes.
fix: Xenobio consoles properly check whether the turf they're
interacting with is visible to cameras when deciding whether to block
interaction, rather than whether the turf of the remote control eye
itself is obscured by static.
fix: Using a xenobio console and ctrl-clicking on a tile with dead
monkeys on it without a connected monkey recycler no longer runtimes.
fix: Destroying a monkey recycler that was once linked to a xenobio
console but no longer is no longer disconnects the currently linked
monkey recycler from those xenobio consoles.
fix: Multiple monkey recyclers mapped into the same xenobiology area no
longer enter a weird state of half-connection with the mapped in xenobio
consoles.
qol: Adds screentips to the xenobio console's item interactions.
qol: More xenobio console item or click interactions have balloon alert
feedback.
/🆑
## About The Pull Request
This PR makes a number of changes focusing on improving the blob
minions, spores, nauts, zombies and their associated component.
## New sprites
The blob spore, blob zombie and blobbernaut has been resprited.
The spore and zombie have been lightly touched to preserve the most of
the original characteristics while given a cleaner look.
The spore and zombie have a partially desaturated version used to let
more of the strain colour through instead of them all ending up dark
brown.
The blobbernaut has been reshaded and the side sprite has been made
coherent with the front state, I made decided how the front state was
shaded should be the "canon" one (this might be a bit controversial but
the wild inconsistency was bugging me.)
The blobbernaut is a bit less veiny, but the veins look more natural and
use the strain complementary colour. Many combinations are cool, some
are a bit lacking due to the weird choices of complementary colour.


## New Cytology Related Features
Blob mobs can now have strains independently of an overmind.
The 15% mutation chance of vat grown creatures causes a spore or
blobbernaut to get a random strain.
When I first added the blob spore cell line, ghosts could click on cyto
blob spores to posses them, they would then presumably(?) but not
explicitly be free antags. This ability was lost when the blob spore
code was modernised.
Very few people knew about this, and no one grew blob spores anyway.
This feature is coming back in a big way, vat grown blob spores present
a new unique job hazard, they are automatically offered to ghost as an
extremely shitty, but free antag.
I have tested spawning like 15 antag pre-buff blob spores in a live
round and they failed completely to antagonise the crew effectively,
hopefully these buffed spores won't present too much of an issue to our
great administration team, if that ends up being the case, there are
many levers to pull to tone them down.
## Blob Spore Buffs
Blob spores prior to this PR were almost completely useless.
The main cause of this was the extremely dilute reagent smoke reaction;
10u divided over 20 seconds.
This resulted the smoke clouds dealing 0.15 - 0.6 DPS, a completely
negligible and useless amount.
The smoke reagent concentration has been massively increased(10u -> 40u)
and the smoke duration has been reduced(20s -> 8s).
The result of this is that blob spore clouds are something you want to
avoid standing in, but they provide less smoke cover for the blob and
nauts.
Blob spores have also gained the ability to vent crawl. Simple mobs that
can't either open doors or vent crawl feel super bad to play.
They also deal a little more melee damage, but this is still
pathetically low on account of their low attack speed.
I have adjusted their supplementary reagents and reduced the amounts of
spores produced per cycle(2 -> 1) to make them a bit harder to mass
produce.
## Blob Strain Buffs
I have not made this PR with the goal of buffing any particular strain,
but some changes have affected blob strain balance:
### Debris Devourer
This was the only strain that was strongly mechanically tied to the
core.
In order to allow for independent debris devourer mobs, they can now eat
trash(or any item really), they are independent, they store these items
inside their mob, and use these for the debris devourer reactions.
If they have an overmind, the item gets sent to the core.
This should result in a nice buff to the strain, which I've been told is
one of the bad ones.
### Regenerative Materia & Cryogenic Poison
5 years back another contributor removed the ability of blobs and
blobbernauts to transfer reagents with their attacks(as their expose
method is vapour).
This was a completely undocumented change and possibly unintentional, so
I am reverting it by giving blob reagents penetrates_skin = VAPOR again.
This only really affects these two strains. It makes regenerative
materia much stronger, while barely having any effect on cryogenic
poison, because temperature normalisation changes has made it completely
ineffective even with much more reagent applied.
### Electromagnetic Web
The spore reagent cloud buff might also give a boost to some strains
with good expose effects, like electromagnetic web.
## Blob Cooking
Blob spores now drop spore sacks, they can be ground for spore toxin, or
cracked on a griddle to create an egg-like treat!
I also added a detoxification reaction to reduce the amount of toxin
when cooked, might not work yet because I think griddles may not
actually heat the food?
## Sound Effects
Blob spores bursting and blobbernauts dying have sound effects.
## Why It's Good For The Game
level 5 biohazard
## Changelog
🆑
image: blob mobs have been respectfully resprited.
add: vat grown blob mobs can sometimes get born with a blob strain.
add: blob spores drop spore sacks, crack them on the griddle.
add: debris devourer mobs can now eat trash, sending it to the core, if
there is one.
add: vat grown blob spores are now sentient and evil.
balance: blob spores now have much more concentrated smoke.
balance: blob spores can ventcrawl.
fix: regenerative materia and cryogenic poison strain blob tiles & nauts
now inject chems again.
sound: blob spores & blobbernaut now have death sound effects.
/🆑
## About The Pull Request
This PR aims to clean or bring up to date portions of code about dna,
the dna console and mutations. This includes taking care of or removing
some of the awful choices like the pratically useless
`datum/mutation/human` pathing, or the class variable, in favor of using
sources to avoid potential issues with extraneous sources of a mutation.
The files changed are over a hundred just because I removed the
`datum/mutation/human` path, but the actual bulk of the code is mainly
shared between the datum/dna.dm, _mutations.dm and dna_console.dm.
## Why It's Good For The Game
Mutation shitcode is hurting my future plans for infusions a little.
Also it's a much needed refactor. Drafted 'till I'm sure it works
without issues.
## Changelog
🆑
refactor: Refactored mutation code backend. Report any issue.
/🆑