## About The Pull Request
Failing a fish suicide now shames you
Closes#96084
## Changelog
🆑
fix: Added an anti-softlock safety in case fish suicide fails
/🆑
## About The Pull Request
Refactor the majority of the current gasmix mole change use cases into a
proc called adjust_gas which simply adds the designated mole count of
the species into the gas mix while also handling asserting the gas and
garbage_collect()
I also added adjust_multiple_gases and convert_gas() for modifying
multiple gases and within a gasmix
## Why It's Good For The Game
Lemon wanted this to be done as part of the air group refactor
## Changelog
🆑
refactor: refactored majority of gas_mix mole change into adjust_gas()
proc
/🆑
## 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
(Some) tails, snouts, horns and other "solid" bodypart overlays are now
preserved on husked mobs, meaning that lizards or fishpeople will no
longer suddenly lose a chunk of their body when husked. Cybernetic
implants, being inorganic, are not colored and preserver their visuals
in full.
<img width="70" height="97" alt="dreamseeker_8CYayvB8ck"
src="https://github.com/user-attachments/assets/32df4ef4-4d20-4d46-8bf8-ccf043cab3ec"
/>
<img width="95" height="104" alt="image"
src="https://github.com/user-attachments/assets/47171a11-2228-4ef8-9d60-e169794fa6fd"
/>
## Why It's Good For The Game
Husking hasn't been an effective method of anonymizing corpses for a
very long while, and I think that visual consistency here doesn't hurt
it much more while making the game feel more immersive and cohesive.
## Changelog
🆑
balance: Husked mobs now keep some of their bodypart overlays, such as
snouts, tails and horns
/🆑
## About The Pull Request
Deletes `can_hear`, replaces it with trait-checking deafness.
The only two non-trait sources of deafness (hardcrit and lacking ears)
were refactored into using the trait.
## Why It's Good For The Game
Many places inconsistently check for the deaf trait rather than use
can_hear which meant behavior was not consistent.
Some code would treat "do we lack ears?" as being deaf, some would not.
This unifies all the behavior so being deaf means you're deaf
everywhere.
It also means we can now easily react to gaining and losing deafness via
signal, where before we could not react to it without hooking the trait,
organ remove, AND stat change. Which no one did, of course, because who
would ever think to do that?
## Changelog
🆑 Melbert
refactor: Refactored how deafness is tracked. Please report any weird
interactions with sounds, like messages or sfx being missing.
fix: Lacking ears and being in hard crit now consistently treats you as
"being deaf". This affects a few minor interactions like empath, the
jukebox, and sleeping.
/🆑
## About The Pull Request
Fixes#94662
Makes the remaining suicides I could find that gib or dust preserve
items, as generally suicide should be a personal decision that people
aren't using to spitefully deny traitor objectives or whatever.
ALSO I changed tadpole suicide to just make a big hole in your chest
instead of gib you because, unlike a space carp, I don't think a tadpole
growing into a single regularly sized frog is going to cause your body
to burst into pieces.
The thing about "good first issues" is unfortunately we do also still
want them to get fixed at some point, and people were mentioning that
"suicide drill to delete items" had actually happened in real rounds.
## Changelog
:cl:se
balance: Killing yourself with a tadpole now only bursts your chest open
and not your entire body, and frankly even that is pretty impressive
work for a single frog to manage.
fix: Killing yourself in various other ways that gib or dust you will no
longer delete the items you were wearing, consistent with most of the
other ways of killing yourself that gib or dust you.
/🆑
Alternative Title: Fish are no longer comically underweight from
real-life unit of measurements.
## About the Pull Request
Instead of mentioning grams, fish weight now uses a fictitious unit
called ~~kilokrill~~ kiloclam.
## Why It's Good For The Game
Realistically, weight increases exponentially with size, however, for
the sake of keeping this niche part of the game """simple""", we/I have
always avoided delving into it and stuck to length alone.
Not that it's hard, if you've a high school diploma of any kind, you
should be able to come with a more satisfying (albeit box-y)
approximation of weight if you add a few more variables like height,
width and density, but do we have to make fishing a bit more annoying to
maintain because of it? Maybe we should just replace "gram" with some
punny make-believe unit of mass instead.
This closes#93794
## Changelog
🆑
spellcheck: fish weight is now measured in "kiloclam" instead of grams.
Like, imagine being slown down by a big lake fish that only weighs "800
grams", bruh...
/🆑
## About The Pull Request
When you use a starfish (fished from Hyperspace) to commit suicide your
character will walk off screen until they exit the Z level or 30 seconds
have elapsed, at which point they are deleted.
Deleting a mob as it attempts to change Z level causes some runtime
errors. Happily, we can fix this by delaying and animating the deletion
which not only fixes the bug but makes it look a little nicer (although
in most cases, nobody but the suicidee will see it).
This _also_ currently causes the obliteration of all of your items which
we prefer to avoid in suicides in case something important is destroyed.
I have _also_ solved this in an appearance-based way.
Now you drop your entire inventory before beginning your final journey,
but because it would look stupid to do this in the nude it applies a
starry voidwalker texture to the mob as it starts to leave.
Finally I made it only say the meme line 20% of the time, because it's
funny but I hate fun.
## Changelog
🆑
fix: Killing yourself via starfish no longer causes a runtime error when
you float onto another Z level
fix: Killing yourself via starfish now unequips your pants before
turning you into an astral being
/🆑
## About The Pull Request
This PR makes the "Gullion" fish suicide work as originally intended,
meaning that if used in an environment with Oxygen it will petrify you
permanently.
This previously did not work because it was using an overcomplicated
check; `check_gases` looks for a list of gases within specified bounds
and returns the presence of unlisted gases (like Nitrogen which is
basically everywhere you would expect Oxygen to be) as a failure state.
We actually only care if there is a nonzero amount of oxygen present in
our tile, which we can check much more simply.
Also previously we never technically kill the mob, only left it
permanently alive and petrified. This meant that via some
pre-preparation you could teleport yourself out of the statue and
then... be walking around with the suicide flag enabled while still
alive? This seemed non-ideal and I figure that despite the vibes of
"being a living statue that cannot do anything except scream silently in
your head" is very cool, probably the desired outcome from players doing
this is to die. So now it kills you.
This suicide technically annihilates all of the objects you are wearing,
because smashing the statue deletes everything upon your person. I guess
I could have added a flag that unpetrifies all of the items you are
wearing on death but the whole thing collapsing into dust (as it does
now) is more satisfying... I reckon it's probably fine given that this
fish is only caught from fishing inside Heretic rifts.
## Changelog
🆑
fix: Killing yourself with a Gullion fish in an oxygenated environment
will correctly turn you into a statue
fix: Killing yourself with a Gullion fish will kill you rather than
leaving you as a living statue that can't do anything and forcing you to
Ghost manually
/🆑
## About The Pull Request
Silly goose, `^` is bitwise XOR. `**` is exponentiation.
## Why It's Good For The Game
Makes fish export pricing work as intended.
## Changelog
🆑
fix: The Spinward Sector Fishery Association would like to apologize for
using a bitwise XOR instead of exponentiation in the source code of
their automated fish price evaluation system.
/🆑
## 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
Huzzah! It's been a good while since I last added more fishing features
(instead I focused on small fixes now and then), but here I'm at it once
more.
This PR adds two designs to the Marine Utility techweb node (which
previously only had the bio-electric generator kit): The fish gene-gun
an as well as the bluespace fishing reel.
The fish gene-gun is a pretty easy concept. It's a device that takes
empty syringes. When used on a fish with an empty syringe loaded inside
it, It'll prompt the user to choose which trait to extract. Once the
trait is extracted, the syringe is replaced with a specialized 'fish
trait injector' containing said trait. You can then hit another fish
with the fish gene-gun again to inject the trait, or use it to remove
the injector, which can then be used on its own, or loaded into the
gene-gun later (the results are the same anyway). There are two caveats
though: Using the fish-gene gun on the same fish more than once
(extracting or injector) will kill it, and it also cannot be used on
dead fish. The fish can still be revived though.
The other thing is the bluespace fishing reel. It greatly increases the
cast range, and it also goes through walls and other solid objects and
is not disrupted by them. If used on objects, reeling the item in will
move it through wall and solid objects as well. Other than that. It's a
pretty standard fishing reel. However, it has one flaw, and that is it
cannot go through reinforced walls (as well as indestructible ones), so
no stealing from the armory etc.
## Why It's Good For The Game
I've been having some honest to god skill issues with aquariums at times
(they were also half-broken in the past but things have gone for the
better...). Some of the fish traits are good, some are bad, others are
utterly terrible (*looking at the anxious zip zap*) and kinda withhold
some of the potential stuff that can be done, which is what prompted me
to make this PR.
Also, bluespace fishing reel because ~~JoJo Vento Aureo reference~~ it's
such a neat concept.
## Changelog
🆑
add: Two items have been added to the The Marine Utility tech node: a
fish-gene gun to add and remove traits to/from fish, and a bluespace
fishing reel.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
High frequency blades, both null rod variant and admeme variant, can
block mech melee attacks. For the former, that is the only thing it can
block. Great if you're fighting a lot of mechs as a chaplain I guess.
And you're also really committed to the bit.
Weapons that were vibro subtypes are now claymore subtypes. The only
difference here is that they now have 30% block instead of 35% AP.
Null rod high frequency blades are now two-handed. This mostly
determines force changes (10 unwielded, 18 wielded), and mech attack
block chances.
Mech melee attacks respect block...assuming the blocking source can even
block the attack in the first place. Currently, the few sources that can
block/avoid mech attacks are;
- high frequency blades
- energy katanas
- Those staff nullrods (its a holy force field, iunno)
- wizard modsuit shield (and it will eat literally every single charge
it has to do that)
- Sleeping Carp evasion (and only at half the possible chance)
- CQC defense mode (themed as dodging the attack, and also halved)
- probably something I overlooked when I implemented OVERWHELMING_ATTACK
originally and have overlooked here as well.
Just think 'could this help avoid being hit by a road roller being
dropped on you' and go with your gut as to whether or not it is
appropriate if you spot something in the wild that seemingly can block a
mech.
## Why It's Good For The Game
> High Frequency Blade
I wanted to elevate the meme and that is as deep as this goes. Also I
wanted to make this two-handed, much like the true version.
The only thing it is lacking is the cool attack functionality, but I'll
be damned if I can get that to work in a sensible fashion for a crew
weapon...
> Vibro subtype
A lot less of these than I thought. And most of them seemed more
appropriate as claymore types anyway.
> Mech Block
I seeded this previously by making mech clamps respect block. I've now
come back to fully implement it in order to facilitate MGR memes.
For the most part, mechs should still enjoy being largely unblocked by
most sources, even from things like operative suit shields, and
certainly not from actual shields (which I've stripped the ability to
block the attack from entirely) and melee weapons.
The sources that can block them do so poorly. Or, in the case of the
high frequency blade, very well and that's pretty much the only thing it
IS good at blocking.
## Changelog
🆑
balance: High frequency blades (both null rod and admin versions) are
able to block melee attacks from mechs.
balance: High frequency blade null rods are now two-handed weapons.
balance: Mech melee attacks can be blocked or avoided by a few rare
sources.
/🆑
## 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
Played around with fishing and aquariums the other day. While it has
come a long way, aquariums are still a pain in the ass in many ways and
there are still things that don't work as intended as well as some pet
peeves. This PR:
- removes code that didn't work to begin with (rotating the fish when
mounted on for fish trophy wallmounts)
- fixes the predator and necrophage traits triggering when the fish is
NOT hungry and on fishes that are bigger than the not-so-hungry fish,
rather than smaller.
- Add an examine line to fish tanks when full.
- Fixes evolution probability for self-reproducing fishes (purple
sludgefish should be 1 in 20, not 1 in 40)
- Fixes fish analyzers not being usable on equipped/held items.
- Nit with examine lines for fishing rods.
- Experiments handler devices won't announce when an experiment that
they cannot perform is completed. The big exception is the generic
experi-scanner. This means fish analyzers and operating computers will
no longer bug you about material scan experiments being completed.
- the ping sound from using lures should be a smidge louder and can be
heard from more than 1 tile away.
## Why It's Good For The Game
Issues with fishing and aquariums mainly, also a smidge of a code
improvement for experiment handlers.
## Changelog
🆑
fix: Fixed some fishes trying to eat other (bigger) fish while not
hungry. Also a nit with purple sludgefish being a bit too rare.
fix: Fixes fish analyzers not working with held or equipped fish or
aquariums (not in your backpack).
balance: Fish analyzers and operating computers no longer announce
completed experiments that they aren't compatible with.
balance: the ping sound from using fishing lures should be a smidge
louder and can be heard from more than 1 tile away.
qol: Examining fish tanks (the item) when they're almost full will warn
you about it.
/🆑
so, the current `COMSIG_CARBON_SOUNDBANG` signal is kinda lame because:
1) it's relegated to carbon mobs
2) it means ear protection equipment actually has no effect when
`get_ear_protection` is called instead.
3) It's sent in more than one place in the code
So I replaced it with another signal, this one properly sent in
`get_ear_protection`, and therefore `soundbang_act` as well.
What's also lame is that the code for both `get_ear_protection` and
`soundbang_act` can be easily moved to the living type, and it wouldn't
make a huge impact aside causing simple mobs to be stunned very briefly
by flashbangs since they cannot be knocked down anyway. The less the
code is specific to a subtype, the easier it's to work with, the fewer
the paradigms etc.
Another lame thing is some of the code being kinda old. Also I wanted to
fix an issue with the shriek ling ability detailed in #93401. I wanted
to make the ability more consistent with how other sound-related
abilities work by making it use `soundbang_act`, but with an intensity
higher than any other feature so far, beside point-blank flashbangs
(holding on standing on one). I've also buffed the "ear protection"
offered by vacuums from 1 to 3, meaning nothing but point-blank
flashbangs will go through. Yes, this means shrieks are not good in a
vacuum because sound generally propagate in absence of molecules that
can transmit the vibration... at least IRL. The game's an approximation
anyway, but it's still inconsistent, like a fuckton of other things that
are even more outside of the scope of this PR. Well, at least it affects
simple/basic mobs too now.
## Why It's Good For The Game
This will fix#93401 and make some code less old and bad.
## Changelog
🆑
refactor: refactored code for ear/soundbang protection. Flashbangs and
other things can now affect simple/basic mobs as well, not just carbon
and occasionally silicons.
balance: Aliens are no longer impervious to soundbang_act. Still very
resistant to it due to their hardcoded ear protection
balance: How the resonant shriek changeling ability works is now
slightly more consistent with the ear/soundbang protection, meaning it
won't work well in a vacuum, but at least it works on simple mobs now.
fix: Everyone can now hear a changeling shriek, unless they're already
deafened or in a vacuum.
/🆑
## About The Pull Request
The fish analyzer now uses ui_data to fetch hunger, health, size, weight
and breeding cooldown rather than ui_static_data, meaning these values
are updated in real time on the UI. It also calls
update_static_data_for_all_viewers() whenever the user scans a new fish
or aquarium or if fishes are added/removed to/from the aquarium, and
closes the UI if the scanned object is out of normal view or further
than 7 tiles away.
I've also reduced the breeding cooldown for newly spawned fish from two
times the standard cooldown (usually 2 minutes, hence 4 minutes) to 60%
of it. Offsprings still retain the usual 200% cooldown however. This
should make it a bit easier for people who want to use the aquarium with
fish acquired through means other than fish farming itself.
Lastly, this PR introduces a small unit test to make sure that the
stable population of most fish is higher than 1. This was the problem
with #93043, where you couldn't breed a slimefish with a lavaloop
because the stable population of the latter wasn't set. I'm sure that's
a problem with other fishes as well, and that explains some of the
confusion with the feature (that and its opacity as a whole I guess).
## Why It's Good For The Game
This will close#93043, improve the fish analyzer UI updates, make fish
farming etc. less problematic.
## Changelog
🆑
qol: The fish analyzer UI should update more reliably.
fix: Fixed some of the fishes being unable to reproduce.
balance: Fish acquired through means other than fish farming itself
takes less time to be able to reproduce.
/🆑
## About The Pull Request
So, my original goal was just a refactor for the emissive overlays of
eyes, as a way to implement the specular emissive introduced by smartkar
some time ago, but somehow I found myself dragged into a bigger refactor
or cleanup of organ damage, thresholds, failures. One of the main
problem was that there were no procs called when a organ suffered enough
damage to fail or when recovering from failure. It'd just enable or
disable a bitflag, leaving it up to subtypes to decide how to tackle
organ failure their own ways: diverse, funky and sometimes incompatible.
More often than not relying on their very own "update_thingamajig" kinda
procs that run whenever the organ takes damage, rather than just when
the threshold is reached (low, high, failure. There are however a couple
organs with their own quirky thresholds, I let those slide).
There's also a bit of old code, especially for ears, with the
`AdjustEarDamage` and temporary deafness both predating the framework
for organ damage as far as I know. It really needed a coat of fresh
paint.
Oh, there were also more than a handful of organs that still heavily
relied on some ORGAN_TRAIT source instead of the `organ_traits` list and
the two add/remove procs `add_organ_trait` or `remove_organ_trait`. This
include organs that lose or gain specific traits when failing et
viceversa.
~~Lastly, felinids (and the halloween ghost species) having reflective
eyes. It's just a nod to the tapetum lucidum that animals with night
vision often have (including cats), which is why their eyes are a bit
brighter in the dark. Felinids however, do not have night vision (nor do
ghosts). This is merely cosmetic.~~ Cut out for the time being due to
issues with the specular emissive...
## Why It's Good For The Game
Refactoring / cleaning up old organ code.
## Changelog
🆑
refactor: Refactored organ damage code a little. Hopefully there won't
be issues (otherwise report them).
/🆑
## About The Pull Request
What it says on the tin. Cargo now has new math for market elasticity,
each parameter and what it does is explained below
**1. Refactor**
1. **k_elasticity**: This is the elasticity as before applied on all
exports except now this is a floating-point value that swings from
`0->1` instead of 10e-10 like is the current case. This in laymen terms
is the percentile of an items actual cost that is sold on cargo [0 means
you get no credits, 0.5 means you get 50% of the items cost, 1 means you
get 100% of the items cost]. Whenever an item is sold on cargo this
value decreases by an amount that is determined by the next variable
2. **k_hit_percentile(default 5%)**: This is the value by which an
export `k_elasticity` decreases whenever an export is successful for
every unit of an item sold. The real formulae by which the exports
elasticity decreases is dependent on the total amount sold and is as
follows
<pre>k_elasticity -= amount sold (1 for most cases except stacks) *
k_hit_percentile</pre>
So subsequent exports yield lesser profits cause the elasticity
decreases. Now the rate at which the elasticity recovers is as follows
3. **k_recovery_time(default 10 minutes)**: This is the time (minimum
unit should be seconds) it takes for the elasticity to rebound back to
100% after it has reached full 0 but recovery process starts immediately
if it decreases at any point. So if elasticity becomes say 50% it means
it would take 5 minutes to reach 100% again
**2. Some Balance changes**
1. Profits earned from exporting gas is linear per mole sold so the more
gas you put in the more profits you get HOWEVER the max number of
credits you can make per canister is 15000 cr
2. Selling fish yields higher prices because it's no longer subject to
the old elasticity formula
3. Selling 50 sheets of anything will decrease future sale price by 10%
and will take 8 minutes to rebound back to 100% if it reaches 0
**3. Improvements:**
- `SSProcessing` subsystem no longer processes more than 180+ export
datums from round start itself but now starts out empty. It instead
processes only those exports whose elasticity has been impacted and
later cancels it after elasticity has reached 100% so performance of
this subsystem has been drastically improved
- export datums now respect `abstract_type` meaning they won't be
created and can be used as a skeleton body for subtypes. So datums like
`datum/material` & `datum/material/market` are not created anymore but
only their subtypes are so we save processing power & memory
- Shaved of a lot of dead exports that went unused
## Changelog
🆑
balance: cargo exports now have different prices with applied elasticity
code: Improved performance of export code
qol: stock blocks can be recycled for materials & show up as stock
blocks in order console sold items
refactor: refactored cargo export code in whole. Report bugs on GitHub
/🆑
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
## About The Pull Request
The export multiplier for monocloning jumpercable fish has been lowered
by an order of magnitude, making each one sell for a value in the
ballpark of 200-300 credits each, in-line with a free crate as opposed
to... buying a whole crate for free.
The emagged fishing portal board has been removed from the treasure
chest loot table.
## Why It's Good For The Game
**The emagged fishing portal can still be obtained by emagging a fishing
portal as usual and intended.**
Currently, the ocean portal can spawn in a treasure chest,
`/obj/structure/mystery_box/fishing`. It's a time-gated rare item from
the ocean portal, which has a rare chance to spawn. The issue with the
fishing treasure chest is primarily that one of it's rewards is the
emagged fishing portal. Additionally, the treasure chest functions like
the christmas tree, one free gift per mind per box. On a decent pop you
run pretty good odds of getting the emagged fishing portal.
As a result, the fishing portal has been obtained a particularly large
number of times, far more than expected based on export data. I know
this due to the chart.
### Arcane what do you mean "the chart".
I mean the **chart.**
<img width="1550" height="274" alt="image"
src="https://github.com/user-attachments/assets/82e5dfd6-9f96-478b-b4f1-8259c5d4f905"
/>
This is a chart of the top most exported items based on all superset,
blackbox data. Number one, the monocloning jumpercable, aka
`/obj/item/fish/jumpercable`. On current patch, they have an average
export value in the ballbark of 2k-3k credits for each fish caught, with
a 25% chance to be caught from an emagged portal. As their name
suggests, they can clone themselves without a breeding pair, and breed
up to a tank maximum of 12 of themselves.
These fish make up 4x more export value than all sales across the stock
market, and believe me, I *already know* how unilaterally broken the
stock market is right now.
Keeping these as-is would be extremely unhealthy for game health. This
isn't just me being an asshole about balance as usual.
**The emagged fishing portal can still be obtained by emagging a fishing
portal as usual and intended.**
## Changelog
🆑
del: You can no longer obtain an emagged fishing portal board from
treasure chests. You can still, however, emag fishing portals.
balance: Monocloning Jumpercable fish have had their export values
decreased. Their cloning capacity and electrical output remain the same.
/🆑
## About The Pull Request
Fixes#85028
Obscured flags and covered flags are tracked on carbons, updated as
items are equipped and unequipped. It's that shrimple.
Closes#92760
Just removes the species exception checks for not making sense
Also refactors handcuffs / legcuffs removal. In all of these situations
they were hardcoded when they could easily just use an inventory proc to
work.
## Why It's Good For The Game
Stops a million excessive calls to `check_obscured_slots`
Makes obscured behavior more consistent
Makes obscured behavior easier to use
Cleans up human rendering (There was some cursed stuff before with
render item -> updated obscured -> update body -> cause side effects)
## Changelog
🆑 Melbert
del: Golems which somehow manage to grow wings and somehow manage to
equip something that covers their jumpsuit can no longer fly.
(Seriously, this will not affect anyone)
refactor: Refactored clothing obscurity entirely. Items should be a
loooot more consistent and what covers what, and should update a lot
snappier. As always, report any oddities, like mysteriously disappearing
articles of clothing, hair, or species parts
refactored: Refactored handcuffs and legcuffs a bit, report any odd
situations with cuffs like getting stuck restrained
/🆑
## About The Pull Request
Implements a poor imitation of specular surfaces by encoding "shinyness"
into blue channel of emissive overlays, which allows some pixels to be
more illuminated than others (by applying lighting multiplied by
specular mask onto them a second time)
This means that hazard vests, engineering coats, security jackets and
firefighter suits no longer outright glow in the dark, but instead
amplify light so even the tiniest amounts make them highly visible. I
made a pass through all of our emissive overlays and converted ones that
made sense into bloom-less/specular ones.
https://github.com/user-attachments/assets/2167e26e-f8b8-42d7-a67c-dfc643e1df29
I've also converted unrestricted access airlock overlays into overlay
lights instead of ABOVE_LIGHTING overlays, so they should no longer look
jank or catch people's clicks.
<img width="297" height="262" alt="dreamseeker_LovPHZ7xHQ"
src="https://github.com/user-attachments/assets/1bf4d7b8-219a-41ed-aee9-6cdc41803e21"
/>
Turns out that windoors had incorrect icon states assigned to theirs, so
I fixed that too - they should show up again after god knows how many
years.
## Why It's Good For The Game
~~Shiny lights make my moth brain go happy~~
Neat visual effects that look more believable than neon glowing stripes,
and airlocks no longer have inflated hitboxes with extremely weird
visuals.
## Changelog
🆑
add: Added specular overlays - some items like hazard vests or
firefighter suits no longer outright glow in the dark, but instead
amplify existing light to shine brighter than their surroundings.
add: Redid unrestricted access airlock overlays to look less bad
fix: Fixed unrestricted access overlays not showing up on windoors.
/🆑
(cherry picked from commit 3d730689f4)
## About The Pull Request
Because fish is an item, it inherits the use of integrity from objects,
however it also has its own health variable. For consistency, ~~damaging
its integrity should also lower its health and healing it should also
recover its integrity. Fish has a max integrity that's double its
health.
I've also renamed `adjust_health` to `set_health` since it doesn't
adjust the health by the provided value but sets it to said value.~~
I've scrapped the latter to instead use integrity.
## Why It's Good For The Game
A small bit of consistency. If you shoot a fish with a laser gun,
wouldn't it die?
(cherry picked from commit 940d73aeae)
## About The Pull Request
Implements a poor imitation of specular surfaces by encoding "shinyness"
into blue channel of emissive overlays, which allows some pixels to be
more illuminated than others (by applying lighting multiplied by
specular mask onto them a second time)
This means that hazard vests, engineering coats, security jackets and
firefighter suits no longer outright glow in the dark, but instead
amplify light so even the tiniest amounts make them highly visible. I
made a pass through all of our emissive overlays and converted ones that
made sense into bloom-less/specular ones.
https://github.com/user-attachments/assets/2167e26e-f8b8-42d7-a67c-dfc643e1df29
I've also converted unrestricted access airlock overlays into overlay
lights instead of ABOVE_LIGHTING overlays, so they should no longer look
jank or catch people's clicks.
<img width="297" height="262" alt="dreamseeker_LovPHZ7xHQ"
src="https://github.com/user-attachments/assets/1bf4d7b8-219a-41ed-aee9-6cdc41803e21"
/>
Turns out that windoors had incorrect icon states assigned to theirs, so
I fixed that too - they should show up again after god knows how many
years.
## Why It's Good For The Game
~~Shiny lights make my moth brain go happy~~
Neat visual effects that look more believable than neon glowing stripes,
and airlocks no longer have inflated hitboxes with extremely weird
visuals.
## Changelog
🆑
add: Added specular overlays - some items like hazard vests or
firefighter suits no longer outright glow in the dark, but instead
amplify existing light to shine brighter than their surroundings.
add: Redid unrestricted access airlock overlays to look less bad
fix: Fixed unrestricted access overlays not showing up on windoors.
/🆑
## About The Pull Request
Because fish is an item, it inherits the use of integrity from objects,
however it also has its own health variable. For consistency, ~~damaging
its integrity should also lower its health and healing it should also
recover its integrity. Fish has a max integrity that's double its
health.
I've also renamed `adjust_health` to `set_health` since it doesn't
adjust the health by the provided value but sets it to said value.~~
I've scrapped the latter to instead use integrity.
## Why It's Good For The Game
A small bit of consistency. If you shoot a fish with a laser gun,
wouldn't it die?
## About The Pull Request
https://github.com/SpaceManiac/SpacemanDMM/pull/435 added a new
dreamchecker lint, for SDMM `set` statements not at the top of the proc.
While this lint isn't in the current SDMM _release_, I was testing it
out earlier and saw these issues, so might as well fix them before they
even become an issue.
i also fixed a useless variable in moon heretic code that was right next
to the incorrectly placed `SIGNAL_HANDLER`
## Why It's Good For The Game
https://github.com/user-attachments/assets/5b063f41-32f3-490a-b0a3-199ca8147ec3
## Changelog
No player-facing changes.
(cherry picked from commit a2a43e2851)
## About The Pull Request
https://github.com/SpaceManiac/SpacemanDMM/pull/435 added a new
dreamchecker lint, for SDMM `set` statements not at the top of the proc.
While this lint isn't in the current SDMM _release_, I was testing it
out earlier and saw these issues, so might as well fix them before they
even become an issue.
i also fixed a useless variable in moon heretic code that was right next
to the incorrectly placed `SIGNAL_HANDLER`
## Why It's Good For The Game
https://github.com/user-attachments/assets/5b063f41-32f3-490a-b0a3-199ca8147ec3
## Changelog
No player-facing changes.
This is a big one so please bear with me, wounds are complicated
We've decreased the max contributed damage to wound rolls from 35 to 25.
This results, after the exponent, a max possible wound roll of 1 to 91
before any modifiers (assuming the attack, after armor, is 25 or above).
The minimum value to wound is still 5.
Most wounds were contributing significant numbers per wound type to the
potential for a new wound to occur. Getting wounded once meant you were
getting wound a lot, but actually getting past that first wounding may
be the tricky part.
We have significantly reigned in the wound penalty that having a wound
contributes, and instead utilize the series wound penalty to allow same
type wounds to escalate themselves faster as a priority. Having wounds
still makes you more wound vulnerable, just not to such an extreme
degree.
The priority here for what wounds matter most for contributing to
overall wounding vulnerability is ``Infected BURNS > BURNS >
SLASH|PIERCE > BLUNT.``
Wound armor, unlike all other kinds of armor, was used as a additive
value to the wound roll modifiers rather than a multiplicative value.
We have reworked how wound armor is determined by changing how wound
modifiers are calculated.
Firstly, we're passing our entire injury roll into the
``check_woundings_mod()`` proc, as we're not treating this as a proc
that just adds values anymore.
Secondly, bare wound bonus only applies if there is no potential wound
protection from any source, as expected. But it comes last in the
calculations.
Thirdly, wound protection is applied to the injury roll last, after
wound bonuses from the attack, wound bonuses from other wounds and wound
bonuses from a disabled limb are applied. This does not include serial
wound bonuses, which are determined outside of this proc.
Wound protection comes from two sources. Clothing and limb wound
resistance. Your chest and head have an amount of wound resistance so
long as they are not mangled in any fashion. Being mangled means having
either a hairline fracture or a weeping avulsion wound.
Wound protection reduces the final injury roll by a percentage. Say our
roll is 50, and we have effectively 50% wound protection. The final roll
would be 25.
~~Most clothing have had their wound armor values changed. As a loose
rule, I used the highest of melee or bomb armor, except where that value
was 100, in which case I used the lowest instead. I'm basing this
decision on how embeds are calculated, which is attack type agnostic.~~
~~Some armor have inconsistent values because they are alternative
armors to an existing armor type or are hyperspecialized armor.
Ablative, bulletproof and security vests all share a value of 35,
despite the former two not having decent melee or bomb armor.~~
~~Some clothing missing wound armor that should have had them now have
wound armor.~~
~~This may need a bit of scrutiny in case one or two seem weirdly high.
Some have maybe become too low. Its a bit hard to say.~~
I changed it to ``exposed_wound_bonus`` to better represent when it
applies. You can be naked and still not be affected by this bonus if the
limb has wound resistance.
I'm not promising anything with this PR, but this is an attempt to
sanity check the values on wounds so that we're not seeing what the data
that determined the removal of beheading presented. An extreme
over-representation of tier 3 wounds. ~~And, from that, maybe I can
argue for beheadings coming back. That's my goal. I think beheadings
happened so much because the numbers were in need of work.~~ Well okay I
just wanna make wounds a bit more workable actually more than I want
beheadings.
Why is it that tier 3 wounds were so over-represented? Because wounds
will often force more severe wounds of other types by merit of any
wounds existing at all on a limb. Having **_a_** wound makes you more
wound prone for any kind of wound, and not just making you more likely
to suffer a more severe type of the same wound.
The threshold mechanic was intended to simulate making a wound worse,
but oddly just made a limb broadly more prone to getting worse from any
kind of attack to such a degree that future wound rolls of different
types were often going to start at the threshold necessary to be a tier
3 wound.
Dismemberment, mind you, requires you to suffer a flesh wound while you
have a bone wound of tier 2 or higher (with tier 3 giving a bonus to
this). You can do this readily via just a sharp weapon, because having a
mangled limb causes the wound to turn into a bone wound. Technically,
this is meant to be less likely as the effective damage for this wound
is halved. But the wound bonus from having a flesh wound was almost
always significant enough to kick your new bone wound up to a tier 3.
In other words; its not surprising that you saw so many beheadings,
because the system wanted to behead you as fast as it possibly can
thanks to all these escalating values.
Wound armor was only applied as a flat reduction on the roll. The
average for wound armor was 10. After receiving a single wound, you can
expect wound rolls to reach upwards of 100, even if the actual damage
roll was not particularly high, due to wound stacking bonuses form being
wounded.
This meant that wounds, if they happened, came thick and fast after the
first, regardless of what your protection might be to wounds. It was
just a matter of getting past the initial bump.
This is why effects that forced wounds were so powerful. They basically
made a given limb more prone to taking a wound without having to deal
with the protection problem first.
Finally, this is just a broad flaw with the system that is not its
fault. It is actually a problem that isn't a problem. Most people in the
game are not wearing helmets that protect their head. So most people are
going to suffer from a higher proclivity of being wounded if people are
aiming for the head. There is this...kind of cargo cult belief that
aiming for the head means you do more damage, or can stun someone if
you're lucky or what have you. It's entirely nonsense, but it has a
grain of truth in that people rarely wear, or even have access too,
headwear that provides wound protection or any protection at all. People
have jumpsuits, which are universally wound protected, but that isn't
true of the head. Look, the point is, they're not aiming at the head
because it is usually less armored, its for other reasons but it just so
happens to become true due to wounds and how wounds roll their type.
To soften this issue, I've decided to treat wound resistance as armor
until the limb suffers a tier 3 wound. This way, hits to the head MAY
not necessarily escalate to tier 3 instantly as they would on live even
from relatively low power weapons. Some weapons have very low force, but
have extreme bare wound bonuses. This should be less likely after this
change. I doubt this will necessarily make high damage high wound
weapons like energy swords any less prone to cutting you clean open, but
it might thanks to the reduction to contributed damage to the injury
roll. The system is now _a bit more random_.
🆑
balance: Wounds do not make you as vulnerable to suffering wounds of all
types as before. Instead, wounds make you more vulnerable to suffering
worse versions of themselves as a priority.
balance: Wound armor is now more impactful when protecting you from
wounds when you have already been wounded.
balance: Your head and chest are more difficult to wound until they have
been mangled; either from suffering from a weeping avulsion or a
hairline fracture.
code: Changed the variable for bare_wound_bonus to exposed_wound_bonus
to better explain what that variable is doing.
/🆑
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>