## About The Pull Request
Ghost cafe fix. Adding allow_custom_character to our ghost cafe because
TG checking for it and removed user.started_as_observer check - everyone
can set it to true by observing after respawn anyways. And now
explicitly allowing custom characters for roundstart ghost spawners.
## Why It's Good For The Game
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
Spawned me with my prefs now. And tarkon works too, just for example
<img width="476" height="333" alt="image"
src="https://github.com/user-attachments/assets/dde2309c-3568-4d90-a6b1-3c3224888a65"
/>
<img width="887" height="692" alt="image"
src="https://github.com/user-attachments/assets/440298d5-79d4-4c16-9775-d55389437e94"
/>
</details>
## Changelog
🆑
fix: Fixed ghost cafe because I couldnt ERP once
/🆑
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
Reused the old pre-rework heretic robe and blade assets as a new set of
chaplain gear and null rod option.
Replaced the last few existing uses of the now spriteless generic robe:
- Deathmatch, changed heretic warrior to use blade robes
- Deathmatch, changed ripper to use the new chaplain armour
- Tribal mothman legion corpse, changed to use new chaplain armour
- Heretic preview and hallucination, changed to use rust robes
- Heretic virtual domain, changed to use rust robes
<img width="127" height="131" alt="image"
src="https://github.com/user-attachments/assets/690e848e-5191-44d4-bd58-5e338fa2aa4e"
/>
## Why It's Good For The Game
Chaplains are the playground of old magic content assets, where they
find a second life as cosplay outfits. Chaplains can already cosplay
cultists, it's only fair that they can pretend to be a heretic as well.
## Changelog
🆑
add: Added a new set of chaplain armour based on the generic heretic
robes unavailable since the path rework.
/🆑
## 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
`create_from_ghost` can be called from stuff like... dynamic executing a
ruleset, so putting a sleep/user input within it causes problems
So I refactored ghost spawns a fair bit, creating a clear delineation
between where you can and can't put user input
## Changelog
🆑 Melbert
fix: Pirates will no longer randomly spawn as human
fix: Servant Golems have numbered names again
refactor: Refactored ghost spawns (like spider eggs or pirate spawners),
report any oddities
/🆑
## About The Pull Request
When take a ghost role from a ghost role sleeper, if you became a ghost
by observing you will be offered the opportunity to spawn in as your
static. Obviously if you joined the round normally or have already
spawned in as a ghost role you won't be prompted. No cloning yourself
allowed.
Not every ghost role allows this, and you won't get the prompt if your
static is a race that breathes plasma (basically just those purple
skeletons) because that opens up a giant can of worms. However, you
_will_ get the prompt if you are playing as any other race. (I'm pretty
sure every ghost role has power for ethereals besides ashwalkers but
that's not one of the ghost roles that lets you spawn as your static for
super obvious reasons)
Some ghost roles, like pirates, will allow you to spawn in as your
static but overwrite your name.
## Why It's Good For The Game
Felinid comms agent felinid comms agent felinid comms agent felinid
comms agent felinid comms agent felinid comms agent felinid comms agent
felinid comms agent felinid comms agent felinid comms agent felinid
comms agent felinid comms agent felinid comms agent felinid comms agent
## Changelog
🆑
add: You may now spawn in as your static when picking a ghost role
/🆑
---------
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Fixes all instances of numbers being used as assoc list keys in things
that aren't alists, either by turning them into alists or changing the
keys to something else. Also adds new macros to support creating global
alists, as a few global lists became alists. Most of these are pretty
simple and self-explanatory but
- The GLOB.huds one necessitated rewriting because code depended on it
being a non-assoc list, which it technically was because the defines it
used as keys were numbers so BYOND turned it into a regular list, most
of this was for loops through all the subtypes of
`/datum/atom_hud/data/diagnostic` of which there's only one, so I just
changed it to get that type directly by key
- NT Frontier used number indexes which it looped through for some
reason and also passed to TGUI, changed these to strings and adjusted
the TGUI to match, I tested this and it works fine
## Why It's Good For The Game
Makes the code compile, I couldn't test everything but I tried to check
all usages of affected vars to make sure they wouldn't break from being
switched to alists, a TM might be in order just to be sure nothing's
fucked
## Changelog
🆑
refactor: rewrote all cases of numbers being used as keys in non-alist
associative lists
/🆑
## About The Pull Request
1. Adds `Heretical Hunt`, an easy difficulty domain that tasks you with
killing and sacrificing simulated crew members. The domain has a few
ways to conquer it, as you don't need to kill all the simulated crew
members and there's some hidden loot to make use of
It's an easy domain because
- You have quite decent armor,
- The mobs are pretty unintelligent,
- You can always fall back and heal passively on the rust tiles
- There are many ways to tackle it
Though it's not a complete pushover, the mobs can still overwhelm you if
you're not careful.
<img width="440" height="347" alt="image"
src="https://github.com/user-attachments/assets/a3f30204-0200-4197-80bb-aee083059164"
/>
2. Virtual beings are given a minor positive moodlet for killing people
instead of a negative one
## Why It's Good For The Game
1. I thought it'd be kinda fun if we had antag-themed domains which
soft-explains the gameplay loops or mechanics of certain antags, in this
case, heretics sacrificing people
2. You don't feel remorse for killing people in video games, right anon?
## Changelog
🆑 Melbert
add: Added a new easy difficulty bitrunning domain, "Heretical Hunt"
add: Digital mobs receive positive moodlets for killing people rather
than negative
fix: Madness Mask no longer affects corpses
fix: Fixed some heretic runtimes
/🆑
OOPS i forgot about this branch for like a month
## About The Pull Request
When someone takes one of those cryopod ghostroles a notification goes
out to observers advertising the ability to join up.
What better way to convince salty observers to commit to the bit than to
show them you've already done so?
## Why It's Good For The Game
Charlie station is great with friends, and as one of our better ghost
roles the game would benefit from turning heads when someone joins a
session.
## Changelog
🆑
qol: Charlie station ghostroles call on other observers to join in the
fun when taken.
/🆑
## About The Pull Request
a spooky special possession pr for october appears~~
(This is just some code cleanup)
Before, some procs had the `mob_possessor` arg, and some didn't. Which
made it a nightmare to add more positional args to it down the line.
This PR just ensures that all positional args are present in all the
instances of the proc.
## Why It's Good For The Game
Makes this proc chain slightly less of a mess to deal with.
## Changelog
N/A
## About The Pull Request
About what it says on the tin. Corpses from spawner legions (e.g. vent
legions, tendril legions) have the storm-hating component, which means
that when a storm starts the body is deleted.
Also makes it so that the `storm_hating` component clears itself when
the atom it's attached to is logged into, so skeletons you do decide to
brainswap into/bodyjack/etc. won't Thanos snap and turn into dust if you
get stormed on.
## Why It's Good For The Game
Ashes to ashes, dust to dust. Prevents corpses from piling up that
badly. I swear this was a feature but I don't know whatever happened to
it.
## Changelog
🆑
qol: The skeletal corpses left from spawner legions (e.g. from ore vent
defenses and legion necropolis tendrils) now disappear during ash
storms. This does not apply if the body gets brainswapped into.
/🆑
---------
Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
## About The Pull Request
Partially reverts #84594, removing forced tint from night vision goggles
(if anyone for some reason wants to experience it again, they can toggle
it via alt click like it could be done before the [aforementioned
PR](https://github.com/tgstation/tgstation/pull/84594))
Approved by Ghom (the original PR author)
## Why It's Good For The Game
NVG tint is a pretty sizeable accessibility issue, as forced screentint
can easily cause eye strain if they're used for prolonged periods of
time, being especially bad for blue-tinted NVGs. They're already locked
pretty deep down the techweb, and this change just made everyone avoid
them. If we need to make tintless variants of them for every single
antag and special role (and bitrunners, lol), we maybe shouldn't have
added the tint in the first place.
## About The Pull Request
Partially reverts #84594, removing forced tint from night vision goggles
(if anyone for some reason wants to experience it again, they can toggle
it via alt click like it could be done before the [aforementioned
PR](https://github.com/tgstation/tgstation/pull/84594))
Approved by Ghom (the original PR author)
## Why It's Good For The Game
NVG tint is a pretty sizeable accessibility issue, as forced screentint
can easily cause eye strain if they're used for prolonged periods of
time, being especially bad for blue-tinted NVGs. They're already locked
pretty deep down the techweb, and this change just made everyone avoid
them. If we need to make tintless variants of them for every single
antag and special role (and bitrunners, lol), we maybe shouldn't have
added the tint in the first place.
## About The Pull Request
Deletes the Void Torch from Cult
Mapped in uses have been replaced with similar red torches
Deathmatch uses were replaced with red torches as well (did they even
have a use in dm?)
## Why It's Good For The Game
Void Torch is maybe the # 1 example of bloat that comes to mind when I
think of "Cult"
- Very few people know that it does anything
- Even fewer people know how to use it
- Even FEWER people know how to use it effectively
- It isn't even uniquely produced, it comes with another object for no
reason
- In fact, I see people not even *realize* that they get a torch with
their veil shifter. In fact in fact, I see more people throw it *away*
than use it.
I don't really see a reason why it should stick around. A fair argument
I could see is "muh sandbox, you're pidgeonholeing cult in to just
swords and stun". But if that was the case, then why haven't people been
using it?
The only sad part to me is torches are cult kino thematically.
## Changelog
🆑 Melbert
del: Removes the Void Torch from Cult
/🆑
## About The Pull Request
Deletes the Void Torch from Cult
Mapped in uses have been replaced with similar red torches
Deathmatch uses were replaced with red torches as well (did they even
have a use in dm?)
## Why It's Good For The Game
Void Torch is maybe the # 1 example of bloat that comes to mind when I
think of "Cult"
- Very few people know that it does anything
- Even fewer people know how to use it
- Even FEWER people know how to use it effectively
- It isn't even uniquely produced, it comes with another object for no
reason
- In fact, I see people not even *realize* that they get a torch with
their veil shifter. In fact in fact, I see more people throw it *away*
than use it.
I don't really see a reason why it should stick around. A fair argument
I could see is "muh sandbox, you're pidgeonholeing cult in to just
swords and stun". But if that was the case, then why haven't people been
using it?
The only sad part to me is torches are cult kino thematically.
## Changelog
🆑 Melbert
del: Removes the Void Torch from Cult
/🆑
## About The Pull Request
In my infinite hubris and sloth, I foolishly assumed mob spawners
'spawn' 'mobs'. In truth, they actually do Absolutely Nothing and it's
just the ghost_role and corpse subtypes that actually do anything. It's
still my bad but, bruh. bruh uruhurb,,,
## Why It's Good For The Game
closes#91575
Cock
Roach
## Changelog
🆑
fix: Fixed cockroach spawners not doing anything
/🆑
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.
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.
🆑
refactor: Refactored mutation code backend. Report any issue.
/🆑
## About The Pull Request
In my infinite hubris and sloth, I foolishly assumed mob spawners
'spawn' 'mobs'. In truth, they actually do Absolutely Nothing and it's
just the ghost_role and corpse subtypes that actually do anything. It's
still my bad but, bruh. bruh uruhurb,,,
## Why It's Good For The Game
closes#91575
Cock
Roach
## Changelog
🆑
fix: Fixed cockroach spawners not doing anything
/🆑
## 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.
/🆑
## About The Pull Request
Adds bloodroaches.

These are cockroaches that have gorged themselves on blood in
maintenance. They're very gross!

Splatting one causes an explosion of blood all around the death
perimeter, splashing both turfs and mobs with blood.
They have a 1% chance of spawning in place of normal roaches.
They also spawn in:
- Abandoned crates, replacing the 30 roaches with 30 bloodroaches.
- As backup anomalous crystal possession targets.
- Grimy fridges
Added a trait given to things killed by pest spray, used to check on
death explosion for bloodroaches.
Changed roach spawns in maps to use mob spawners, so I can replace them
with bloodroaches 1% of the time.
## Why It's Good For The Game
Splatting a random roach in maintenance that explodes into blood sounds
hilarious. It also adds janitorial depth by requiring pest spray to
carefully eliminate these pests
## Changelog
🆑
add: Added bloodroaches, a rare variant of cockroaches that explode into
a shower of blood when squashed.
/🆑
It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270
This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.
The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)
The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.
Video demonstration
https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3
New sprites demonstration
https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf
Armor demonstration
https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80
Map

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too
https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d
The jump was taken from Savannah Ivanov, and Goof's bunny jumping.
This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.
Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.
🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Adds bloodroaches.

These are cockroaches that have gorged themselves on blood in
maintenance. They're very gross!

Splatting one causes an explosion of blood all around the death
perimeter, splashing both turfs and mobs with blood.
They have a 1% chance of spawning in place of normal roaches.
They also spawn in:
- Abandoned crates, replacing the 30 roaches with 30 bloodroaches.
- As backup anomalous crystal possession targets.
- Grimy fridges
Added a trait given to things killed by pest spray, used to check on
death explosion for bloodroaches.
Changed roach spawns in maps to use mob spawners, so I can replace them
with bloodroaches 1% of the time.
## Why It's Good For The Game
Splatting a random roach in maintenance that explodes into blood sounds
hilarious. It also adds janitorial depth by requiring pest spray to
carefully eliminate these pests
## Changelog
🆑
add: Added bloodroaches, a rare variant of cockroaches that explode into
a shower of blood when squashed.
/🆑
## About The Pull Request
It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270
This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.
The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)
The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.
Video demonstration
https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3
New sprites demonstration
https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf
Armor demonstration
https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80
Map

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too
https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d
The jump was taken from Savannah Ivanov, and Goof's bunny jumping.
##### Code bounty by Ezel/Improvedname
## Why It's Good For The Game
This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.
Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.
##### -Ezel/Improvedname
## Changelog
🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Revival of https://github.com/tgstation/tgstation/pull/86482, which is
even more doable now that we have rustg iconforge generation.
What this PR does:
- Sets up every single GAGS icon in the game to have their own preview
icon autogenerated during compile. This is configurable to not run
during live. The icons are created in `icons/map_icons/..`
- This also has the side effect of providing accurate GAGS icons for
things like the loadout menu. No more having to create your own
previews.

<details><summary>Mappers rejoice!</summary>


</details>
<details><summary>Uses iconforge so it does not take up much time during
init</summary>

</details>
---
this still applies:
Note for Spriters:
After you've assigned the correct values to vars, you must run the game
through init on your local machine and commit the changes to the map
icon dmi files. Unit tests should catch all cases of forgetting to
assign the correct vars, or not running through init.
Note for Server Operators:
In order to not generate these icons on live I've added a new config
entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in
the config.txt
No more error icons in SDMM and loadout.
🆑
refactor: preview icons for greyscale items are now automatically
generated, meaning you can see GAGS as they actually appear ingame while
mapping or viewing the loadout menu.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Revival of https://github.com/tgstation/tgstation/pull/86482, which is
even more doable now that we have rustg iconforge generation.
What this PR does:
- Sets up every single GAGS icon in the game to have their own preview
icon autogenerated during compile. This is configurable to not run
during live. The icons are created in `icons/map_icons/..`
- This also has the side effect of providing accurate GAGS icons for
things like the loadout menu. No more having to create your own
previews.

<details><summary>Mappers rejoice!</summary>


</details>
<details><summary>Uses iconforge so it does not take up much time during
init</summary>

</details>
---
### Copied from https://github.com/tgstation/tgstation/pull/86482 as
this still applies:
Note for Spriters:
After you've assigned the correct values to vars, you must run the game
through init on your local machine and commit the changes to the map
icon dmi files. Unit tests should catch all cases of forgetting to
assign the correct vars, or not running through init.
Note for Server Operators:
In order to not generate these icons on live I've added a new config
entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in
the config.txt
## Why It's Good For The Game
No more error icons in SDMM and loadout.
## Changelog
🆑
refactor: preview icons for greyscale items are now automatically
generated, meaning you can see GAGS as they actually appear ingame while
mapping or viewing the loadout menu.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Currently patches are a subtype of pills, and while they have the
``dissolveable`` var set to FALSE, barely anything checks it (because
people don't expect patches to be pills in disguise) so we end up
patches being dissolveable and implantable, which is far from ideal.
Both have been moved into an ``/obj/item/reagent_containers/applicator``
class, which handles their common logic and helps handling cases where
either one fits. As for gameplay changes:
* Pills no longer dissolve instantly, instead adding their contents to
your stomach after 3 seconds (by default). You can increase the timer by
dropping sugar onto them to thicken their coating, 1s per 1u applied, up
to a full minute. Coating can also be dissolved with water, similarly
-1s per 1u applied. Pills with no coating will work like before.
* Patches now only take half as long to apply (1.5s), but also slowly
trickle in their reagents instead of instantly applying all of them.
This is done via embedding so you could theoretically (if you get lucky)
stick a ranged patch at someone, although they are rather quick to rip
off. The implementation and idea itself are separate, but the idea for
having a visual display has been taken from
https://github.com/Monkestation/Monkestation2.0/pull/2558.

* In order to support the new pill mechanics, stomachs have received
contents. Pills and items that you accidentally swallow now go into your
stomach instead of your chest cavity, and may damage it if they're
sharp, requiring having them surgically cut out (cut the stomach open
with a scalpel, then cauterize it to mend the incision). Or maybe you
can get a bacchus's blessing, or a geneticist hulk to gut punch you,
that may also work. Alien devour ability also uses this system now. If
you get a critical slashing wound on your chest contents of your cut
apart stomach (if a surgeon forgot to mend it, or if you ate too much
glass shard for breakfast) may fall out. However, spacemen with the
strong stomach trait can eat as much glass cereal as they want.
Pill duration can also be chosen in ChemMaster when you have a pill
selected, 0 to 30 seconds.

## Why It's Good For The Game
Patches and pills are extremely similar in their implemenation, former
being a worse version of sprays and pills, with only change being that
pills cannot be applied through helmets while patches and sprays ignore
both. This change makes them useful for separate cases, and allows
reenactment of some classic... movie, scenes, with the pill change. As
for stomach contents, this was probably the sanest way of implementing
pill handling, and everything else (item swallowing and cutting stomachs
open to remove a cyanide pill someone ate before it dissolves) kind of
snowballed from there. I pray to whatever gods that are out there that
this won't have some extremely absurd and cursed interactions (it
probably will).
## Changelog
🆑
add: Instead of dissolving instantly, pills now activate after 4
seconds. This timer can be increased by using a dropper filled with
sugar on them, 1s added per 1u dropped.
add: Patches now stick to you and slowly bleed their reagents, instead
of being strictly inferior to both pills and sprays.
add: Items that you accidentally swallow now go into your stomach
contents.
refactor: Patches are no longer considered pills by the game
refactor: All stomachs now have contents, instead of it being exclusive
to aliens. You can cut open a stomach to empty it with a scalpel, and
mend an existing incision with a cautery.
/🆑
Converts `/datum/player_details` into `/datum/persistent_client`.
Persistent Clients persist across connections. The only time a mob's
persistent client will change is if the ckey it's bound to logs into a
different mob, or the mob is deleted (duh).
Also adds PossessByPlayer() so that transfering mob control is cleaner
and makes more immediate sense if you don't know byond-fu.
Clients are an abstract representation of a connection that can be
dropped at almost any moment so putting things that should be stable to
access at any time onto an undying object is ideal. This allows for
future expansions like abstracting away client.screen and managing
everything cleanly.
Adds a space ruin revolving around a studio where ghost roles can
provide entertainment to the station, the studio has a bunch of
construction stuff and costume vendors to create any set and portray any
character you'd want. Features 3 stages and a radio station (neutral
aligned syndie comms agent?) there's a total of 4 ghost roles, 3 actors.
1 director.

Studio also has a sizable living quarters and a mini-medbay for basic
provisions. a couple of paper fluff texts are strewn about on the
noticeboards
The cast:

In terms of things that can be balance-breaking, I can only name the gas
masks and agent ID actors/directors spawns in. But I think its a
necessary sacrifice for them to play "characters"
I think too many of the ghost roles have too little interactions with
the main station, this is for good reasons obviously, balance and
metagrudges and all that. But, say. what if we can have a ghost role
that interacts and give something to the station besides being their own
little isolated game? it can't be anything material of course. so what
if we have the ghost role centered around giving entertainment? which is
how this PR came to be
🆑
add: After some light bit of restructuring, the local TV station,
serving SPACE SECTOR 13 has opened up again!
/🆑
## About The Pull Request
Converts `/datum/player_details` into `/datum/persistent_client`.
Persistent Clients persist across connections. The only time a mob's
persistent client will change is if the ckey it's bound to logs into a
different mob, or the mob is deleted (duh).
Also adds PossessByPlayer() so that transfering mob control is cleaner
and makes more immediate sense if you don't know byond-fu.
## Why It's Good For The Game
Clients are an abstract representation of a connection that can be
dropped at almost any moment so putting things that should be stable to
access at any time onto an undying object is ideal. This allows for
future expansions like abstracting away client.screen and managing
everything cleanly.
## About The Pull Request
Adds a space ruin revolving around a studio where ghost roles can
provide entertainment to the station, the studio has a bunch of
construction stuff and costume vendors to create any set and portray any
character you'd want. Features 3 stages and a radio station (neutral
aligned syndie comms agent?) there's a total of 4 ghost roles, 3 actors.
1 director.

Studio also has a sizable living quarters and a mini-medbay for basic
provisions. a couple of paper fluff texts are strewn about on the
noticeboards
The cast:

In terms of things that can be balance-breaking, I can only name the gas
masks and agent ID actors/directors spawns in. But I think its a
necessary sacrifice for them to play "characters"
## Why It's Good For The Game
I think too many of the ghost roles have too little interactions with
the main station, this is for good reasons obviously, balance and
metagrudges and all that. But, say. what if we can have a ghost role
that interacts and give something to the station besides being their own
little isolated game? it can't be anything material of course. so what
if we have the ghost role centered around giving entertainment? which is
how this PR came to be
## Changelog
🆑
add: After some light bit of restructuring, the local TV station,
serving SPACE SECTOR 13 has opened up again!
/🆑
## About The Pull Request
Makes the Lavaland Syndicate base more sustainable without its crew.
Now, two more turrets guard previously unchecked access points, so
miners have to put some effort in something other than crossing the
lava.
On top of that, RTGs now generate 20kW of power, same as abductor and
debug ones, removing the need for the turbine to be set up every time.
Finally, the Syndicate agents inside now get a full mechanical toolbox
in their rooms, so they can break out if a miner managed to enter the
base and wall off their rooms.
On top of all that, a message monitoring console has been added to the
only telecomms random room that didn't have it, and its atmosphere has
been sealed off from outside (which it wasn't for some reason).
Finally, a single defibrillator has been added to the medbay
## Why It's Good For The Game
The base, despite being a decent ghost spawn, would be borderline
unrecoverable if it didn't get crew early in the shift.
Power-wise, the RTG output was insufficient, and APCs would start losing
power, until the entire base was practically non-functional. Setting the
turbine at this point was also marginally harder than before, which made
getting out of the powerless state unnecessarily hard.
Talking about the turbine, it's a deathtrap if the crew doesn't know
what they're doing. It not being necessary anymore would help the
operator stay alive and be able to do whatever they joined to do.
And now, even if you do die, you can be revived by your comrades with
the new defibrillator available in the base's medbay.
On the topic of defenses, it was rather easy for a miner with an RCD or
a lava boat to cross the lake, take all the loot with minimal effort,
and wall the agents inside. This is now slightly harder due to the
additional turrets.
On top of that, if a miner does manage to break in and take everything,
a simple wall won't lock the operatives in anymore, since they now have
tools to break out.
Finally, the changes to the telecomms random rooms seek to let the comms
agents do roughly the same things, most importantly, mess with the PDA
messages.
## Changelog
🆑
map: The Syndicate Lavaland base has been generally improved, with more
defenses and comms equipment.
/🆑
## About The Pull Request
Updates the Unnamed Turreted Outpost space ruin

Old version:

It has received a slight improvement in loot quality (SC/FISHER
disruptor in the armory and a couple of syndicate corpses - one with a
neat black ID!), but also an increase in difficulty in form of more
turrets with heavier armor, and some locked doors! Get those multitools
ready!
## Why It's Good For The Game
Its a rather outdated and plain-looking ruin, last updated when its'
camera bug got replaced with a floppy disk. This should make it look
nicer and more alluring to space explorers.
## Changelog
🆑
map: Updated the Turreted Outpost space ruin
/🆑
## About The Pull Request
This PR kills the abstract internal and external typepaths for organs,
now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds.
This PR also fixes fox ears (from #87162, no tail is added) and
mushpeople's caps (they should be red, the screenshot is a tad
outdated).
And yes, you can now use a hair dye spray to recolor body parts like
most tails, podpeople hair, mushpeople caps and cat ears. The process
can be reversed by using the spray again.
## Why It's Good For The Game
Time-Green put some effort during the last few months to untie functions
and mechanics from external/internal organ pathing. Now, all that this
pathing is good for are a few typechecks, easily replaceable with
bitflags.
Also podpeople and mushpeople need a way to recolor their "hair". This
kind of applies to fish tails from the fish infusion, which colors can't
be selected right now. The rest is just there if you ever want to
recolor your lizard tail for some reason.
Proof of testing btw (screenshot taken before mushpeople cap fix, right
side has dyed body parts, moth can't be dyed, they're already fabolous):

## Changelog
🆑
code: Removed internal/external pathing from organs in favor of a bit
flag. Hopefully this shouldn't break anything about organs.
fix: Fixed invisible fox ears.
fix: Fixed mushpeople caps not being colored red by default.
add: You can now dye most tails, podpeople hair, mushpeople caps etc.
with a hair dye spray.
/🆑
## About The Pull Request
On a downstream, we have an antagonist, that is a less competent
wizards. This antagonist's preview outfit has a beer bottle in their
hand, which has caused runtimes, as the bottle did not have any reagents
instantiated, and it tried check its length for sloshing. After putting
in a check for the `initial` argument of `on_equip`, I have noticed that
the problem goes deeper: the various procs that handle putting something
in your hand do not pass along if the items is put in your hand as a
preview or not. This PR adds a new optional var to these procs, ensuring
that unwanted behaviour during previews won't trigger.
I also swapped `visualsOnly` to snake case, as it looked inconsistent
with the rest of the code style.
## Why It's Good For The Game
Making the argument that ensures avoiding side effects during previews
work with all kinds of items is good.
## Changelog
🆑
fix: if an outfit puts a reagent container in the preview dummy's hand,
it will not try to slosh
code: outfits putting items in your hand will respect the visual_only
argument
/🆑