## 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
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
This PR moves random name generation for species onto their languages.
What does this mean?
- For species with a predefined name list, such as Lizards and Moths,
nothing.
- For species without predefined name lists, such as Felinids, their
names will now be randomly generated from their language's syllables.


(In the prefs menu:)

Why?
- Well, we actually had some dead code that did this. All I did was fix
it up and re-enable it.
- Generates some pretty believable in-universe names for various
languages that are lacking name lists. Obviously defined lists would be
preferred, but until they are added, at least.
- Moves some stuff off of species, which is always nice.
- Also hopefully makes it a tad easier to work with name generation.
There's now a standard framework for getting a random name for a mob,
and for getting a random name based on a species.
Misc:
- Adds a generic `species_prototype` global, uses it in a lot of places
in prefs code.
- Makes `GLOB.species_list` init via the global defines
- Deletes Language SS
- Alphabetizes some instances of admin tooling using the list of all
species IDs
- Docs language stuff
- Deletes random_skin_tone, it does pretty much nothin
## Changelog
🆑 Melbert
refactor: Random Name Generation has been refactored. Report any
instances of people having weird (or "Unknown") names.
qol: Felinids, Slimepeople, Podpeople, and some other species without
defined namelists now automatically generate names based on their
primary language(s).
qol: More non-human names can be generated in codewords (and other misc.
areas) than just lizard names.
/🆑
## About The Pull Request
I'm still not satisfied with how ghost notifications work. This gives
every notification with a source (99% of all notifications, in other
words) a link to jump/orbit. Currently, notifications with "play"
interactions would only get the interact link, so jumping to the source
was pretty annoying.
It removes posting the entire message in the alert tooltip, as some got
pretty lengthy and it didn't seem to fit. To replace this, they will
always use headers
After:



NOTIFY_JUMP and NOTIFY_ORBIT have been merged, since the only difference
seems to be whether it's a turf. The result shaves off some redundant
lines of code, since most-every usage of notify_ghosts uses
NOTIFY_ORBIT.
## Why It's Good For The Game
More standardization for the ghost notification system. Adds a few alert
headers that never had them. All in all, makes it easier for creators to
throw alerts at ghosts
## Changelog
🆑
qol: Nearly every ghost alert should now feature a "VIEW" button, even
those with click interaction.
del: Ghost alerts no longer show the entire message in the tooltip,
instead have been replaced with titles.
/🆑
## About The Pull Request
This helps clean up my favorite helper proc in the whole codebase,
`notify_ghosts()`.
The notify_suiciders, ignore_mapload, and flashwindow args are GONE.
They have been replaced with the notify_flags bitflag argument. This was
intended to make deadchat announcements a bitflag argument too, but
those got reverted right before I originally wanted to submit this PR.
The on-screen popup now shows the notification body when you hover it
with your mouse again. The format is now `[notify_ghosts message] --
[click action (orbit/jump/play)]`
Every single `notify_ghosts()` call has been changed to multiline format
and has been given trailing commas. Pretty!
## Why It's Good For The Game
Cleans up a proc that is very popular and going through a lot of changes
at the time.
Allows for further flexibility when this proc inevitably gets tweaked or
improved. 12 -> 10 args is an improvement, and it doesn't impact the
helper's flexibility at all.
## Changelog
🆑 Rhials
code: The notify_ghosts proc has been cleaned up. Please report any
abnormal changes in deadchat notification behavior.
qol: The on-screen deadchat popups now contain the notification blurb
when hovered with your mouse again.
/🆑
## About The Pull Request
#79139 turned out to be quite annoying, it wasn't taken into account
that these alerts can stack (ie: spiders).
Of course, I poked around the code and found some inconsistencies in the
process. For instance, there were usages of Topic for custom action
behavior which could've been consolidated. There were other instances
where jump (the default action) doesn't give a link at all, which I
think it should anyway, since the screen toast gives you this.
I've standardized it more, meaning you can use "NOTIFY_PLAY" without
writing a custom link and topic handler (for instance, MMIs)
## Why It's Good For The Game
Fixes#79198Fixes#79195
## Changelog
🆑
fix: Ghost alerts have been tuned down a bit.
/🆑
## About The Pull Request
There's two policies:
* Normal lazarus injector gives you the 'friendly revived mob' policy
since it normally makes mobs friendly to everyone,
* Default text: "The lazarus injector has brought you back to life! You
are now friendly to everyone."
* EMPed lazarus injector gives you the 'slaved revived mob' policy since
it normally makes mobs only friendly to you,
* Default text: "You have been revived by a malfunctioning lazarus
injector! You are now enslaved by whoever revived you."
* The EMPed lazarus injector now also enslaves the mob to the person who
revived them, giving them the text: "Serve [reviver], and assist
[reviver.p_them()] in completing [reviver.p_their()] goals at any cost."
Suggestions for default text welcome,
## Why It's Good For The Game
There's currently no policy for lazarus revived mobs, so can be
confusing. See https://tgstation13.org/phpBB/viewtopic.php?f=33&t=34538
Now it's more clear what they should do.
Admins can also change the text if they want.
## Changelog
🆑
add: Add policy for sentient mobs that were revived by lazarus injector
(depends on config)
add; Sentient mobs that were revived by malfunctioning lazarus injector
now get enslaved to whoever revived them.
fix: Servant golems get their master's real name (Won't be serving
"Unknown" if their master is wearing a mask)
/🆑
## About The Pull Request
New areas created by standard blueprints are not safe for golems, which
is why I'm touching blueprints and create_area code and making the
blueprints found in the free golem ship an actual subtype rather than a
map-edited instance.
## Why It's Good For The Game
This will fix#77354.
## Changelog
🆑
fix: Areas created with the "land claim" blueprints are no longer
hazardous to free golems.
/🆑
## About The Pull Request
Due to a mental breakdown caused by unfathomable abomination that is
icons folder, I swore to myself to one day clean it. Today is kind of
that day. Been at it for around 6, you gotta understand I need a rest. I
tracked most changes in descriptions of commits if you are looking for
details.
## Why It's Good For The Game
Saner spriters make better sprites. And also, just helps keep track of
things.
## Changelog
🆑
image: added sprites for different variants of scrolls.
image: modified couple posters with ghost pixels.
/🆑
---------
Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com>
## About The Pull Request
The autolathe free golem shells created on the free golem ruin now
create free golems rather than servant golems.
On the backend, this was done by delegating the responsbility for what
to do with the "owner" to the spawned subtype.
Now the three golem ghost spawners are:
- Default, which creates a normal free golem.
- Adamantine, the "leaders" on the free golem ruin, who get special
vocal cords.
- Servant, which enslaves itself to whoever finished building the shell.
Previously the servant subtype did not do anything at all, but now it
holds all of the relevant behaviour and the other two simply don't care
who their creator was.
## Why It's Good For The Game
Makes item does what it was supposed to, not sure how long it has been
broken but it has been a while.
Makes raiding free golem ruin for autolathe design create free rather
than loyal golems, which could backfire.
Free golems constructed in the ruin by other free golems are no longer
forced into a hierarchy, which can be a good or bad thing depending on
the temperament of whoever made them but might reduce the incidence of
one guy ordering everyone else to tide cargo.
This PR implements this design document:
https://hackmd.io/@Y6uzGFDGSXKRaWDNicSiEg/BkRr176st
Put briefly, this will remove every existing golem subtype and
consolidate golems into a single species with cool new sprites.
NOT implemented from that PR is the ability to eat Telecrystals, I
couldn't come up with an appropriate visual that can stack with the
existing ones, but that should be a reasonably trivial add for a future
artist & developer.
New Golems have a food-based mechanic where their hunger decays pretty
quickly and can only be replenished by eating minerals. They start
moving slower as they get hungrier, until eventually they become
completely immobilised and need to be rescued.
Eating different kinds of minerals will visually change your sprite and
give you a special effect in a similar way to old golems, but temporary.
While transformed, you can't eat any other kind of mineral which would
transform you (but can still consume glass).
To see the full list of effects, look at the hackmd above.
In service of these sprites working I have refactored the
`species/offset_features` feature by killing it and delegating that
responsibility to limbs instead. Rather than applying an offset to items
due to your species, it is due to your weird head or arms. This makes
overall more sense to me, but it inflates the code changes in this PR
somewhat.
It doesn't make a lot of sense to atomise unfortunately because that
code also seemed to be entirely unused until I tried to use it in this
PR, so you wouldn't be able to tell if my changes broke anything. I
might make a downstream sad by doing this.
All of the actual numbers in this PR are made up and only loosely
tested, it will need some testmerges to gather feedback about whether it
sucks or not.
Other relevant changes:
I reworked how bioscrambling works based off bodypart bodytypes, to
automatically exclude golem limbs in either direction. There's really no
way to have those work on humans or vice versa. Organs still fly though.
## About The Pull Request
A mob being enslaved to another is now logged in game logs. This hits
sentience potions, guardians, and Golems. This helps admins know through
logs who made/used what.
## Why It's Good For The Game
I was told that it's pretty hard to tell who made Golems because this
type of info isn't logged, so you can't check it post-round. This should
help admins with that.
## Changelog
🆑
admin: Enslaving mobs is now logged in game.log
/🆑
## About The Pull Request
Fixes#73368
Golems didn't mind transfer on body swap until after the body was
finished creating, this created an issue as golems also did mind
assignment business while creating the body. So the
`mind.enslave_to_creator()` part runtime error'd and caused the create
to fail, which in turn caused the shell to not be consumed.
While sorting this out, I noticed that shells and golems hold a hard
reference to their owner. Yep, hard deletes. Changes mind `enslaved_to`
to a weakref, changes golem `owner` to a weakref, straight up removes
golem `owner` tracking on species because it was ONLY used for card
board golems when it could've just grabbed mind master
## Why It's Good For The Game
No more infinite golem shells
## Changelog
🆑 Melbert
fix: Transferring golem shells no longer make you a free man and also
results in infinite golem shells
fix: Servant golems are considerably less free
fix: Fixes some hard deletes related to mob minds being enslaved to
other mobs
/🆑
# Don't merge this without leading the headmins know so they can update
the server configs
### For headmins:
The following roles need to be updated:
- "Obsession" -> `/datum/antagonist/obessed`
- "Heretic" -> `/datum/antagonist/heretic` (Though this one will still
work, change it to message them on spawn)
- "Headslug Changeling" -> `/datum/antagonist/changeling/headslug`
- "Pyroclastic Anomaly Slime" -> `/datum/antagonist/pyro_slime` (Though
this one will still work, technically, change it to message them on
spawn)
## About The Pull Request
So, we have this whole system in the code to allow all mob typepaths,
species typepaths, and even antag datum typepaths to have a set policy
But we like, don't use it? For some reason we rather set a million
`get_policy` calls than use this. They're all stuck in the policy verb
and not sent to the player in any obvious.
(Also, it's super fragile, which I hate. Change the typepath and the
policy silently fails. Maybe someone can change that afterwards)
This PR updates that. All antag datums will check in `on_gain` for
policy to show to the player if there's any.
It doesn't solve the entire issue. Mob policy and species policy is not
conveyed to the player in any way BESIDES the policy verb which no one
uses. So people have no idea that it's a thing. But it helps a bit.
## Why It's Good For The Game
Better ways to convey to players how they should be playing.
Also Valentines day, because... it's crazy.
## Changelog
🆑 Melbert
config: Policy.json config got updated. The following values need to be
updated:
config: "Obsession" -> /datum/antagonist/obessed
config: "Heretic" -> /datum/antagonist/heretic
config: "Headslug Changeling" -> /datum/antagonist/changeling/headslug
config: "Pyroclastic Anomaly Slime" -> /datum/antagonist/pyro_slime
config: ALL antags in the policy.json file will now get notified of any
existing policy set by the admin team, rather than only a handful.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Tim <timothymtorres@gmail.com>
## About The Pull Request
Closes#72141
Roundstart humans weren't in control of their mob by the time
`AssignQuirks` was called.
The call chain for roundstart goes `create_characters` ->
`equip_characters` -> `AssignQuirks` -> `transfer_characters`.
For latejoin, `create_character` -> `transfer_character` ->
`AssignQuirks`.
I could simply move around the call chain, but that feels much more
fragile and more liable to cause other issues to me. So instead, I
simply allowed add quirk to be passed a client, so that a client's
quirks can be applied to a mob they are not currently inhabiting.
In doing this, it became possible to show visual quirks on the prefs
dummy, like nearsighted glasses and heterochromia. So I put in a little
work to accomplish that as well.

Along side, some refactoring and documentation for quirk datums.
## Why It's Good For The Game
People get what they expect on roundstart.
## Changelog
🆑 Melbert
qol: The preview dummy in the preferences menu now shows some visual
quirks, like Heterochromia or nearsighted.
fix: Fixed some quirks which read a preference roundstart not applying
the preference.
refactor: Refactored some bits of quirk datums and the quirk application
process.
/🆑
Co-authored-by: Time-Green <timkoster1@hotmail.com>
About The Pull Request
replaces a ton of log_game with user.log_message so the log is added to individual and global logs.
adds a few logs for individual LOG_VICTIM, LOG_ATTACK etc logging.
adds logging for bluespace launchpad's tele coords being changed.
took the word "has" out of log_combat, as it's extra and just lengthens the log.
Why It's Good For The Admins
It's extremely laggy to open game.txt so an alternative is individual game logs
Changelog
cl
admin: A lot of game logs will now also be in individual game logs, for convenience in log diving.
admin: Added logging for bluespace launchpad x and y offset changes, which go to individual game logs.
admin: Attack logs will now be slightly shorter, one useless word was removed.
/cl
Fixes names of golems from golem shells.
This whole manual transfer mess (golems having a special ability to swap into another mob spawner) needs better implementation.
About The Super Hyper Ultra Ultimate Deluxe Perfect Amazing Shining Mob Spawn Refactor
The Super Hyper Ultra Ultimate Deluxe Perfect Amazing Shining Mob Spawn Refactor is my attempt to clean up the file structure, the code, and the type tree for mob spawns.
Splits mob spawn types into corpses (dead spawns) and ghost roles (living spawns you can possess). The vars that didn't make sense for corpses and vice versa for ghost roles are now appropriately there
Because of above, there are no longer the fucking "death, roundstart, and instant" vars. thank god
Removes a lot of single or very few used vars, whose properties can be applied on special().
All Mob Spawns are given fitting folders instead of just being stuck in a single ghost roles file. Corpses are in the corpse folder, Ghost Roles are in the ghost role folder. Only exception are drones which should stay near their respective homes
Just generally cleaner all around you know
spider structures file renamed to spiderwebs now that spider eggs are gone
Why Super Hyper Ultra Ultimate Deluxe Perfect Amazing Shining Mob Spawn Refactor Is Good For The Game
The Super Hyper Ultra Ultimate Deluxe Perfect Amazing Shining Mob Spawn Refactor cleans up so many terrible cases and uses
Changelog For The Super Hyper Ultra Ultimate Deluxe Perfect Amazing Shining Mob Spawn Refactor
cl armhulen
refactor: Mob spawns are refactored, no more assortment of "random, instant, and roundstart" vars on every mob spawn type
refactor: if there are some minimal differences in how mob spawners feel, that's why!
/cl