* Adds bacteria rich moldy food to random trash spawners. (#74276)
## About The Pull Request
So, as bacteria bread from perma vendor was nerfed, the only way to
obtain mold for cytology is from the mini-fridges. And they won't even
spawn when needed. Correct me if i'm wrong.
And so this adds moldy breadslices and pizzaslices to
`random/trash/garbage` spawner which appears in trashcarts and in
trashbagsfrom the trashcarts. Also added it to `grille_or_waste` spawner
so it can just randomly spawn on the floor.
About the damp rag. Just thought that there should be at least some
piece of cloth at pile of garbage, as there is none at the moment. And
it's quite usefull also, you can clean yourself or your fingerprints
with it. Can cut it out if needed, not a big deal.
## Why It's Good For The Game
More chances to find what you want to do cytology.
Cytology slightly more practical.
Damp rag is usefull.
## Changelog
🆑
add: Bacteria rich moldy food (like breadslices and pizzaslices) now
spawn in trashcarts, trashbags and randomly on the floor.
add: Damp rag now spawns in the trashcarts and etc.
/🆑
* Adds bacteria rich moldy food to random trash spawners.
---------
Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com>
* Fixes decals not layering as expected in world (#74232)
## About The Pull Request
They just... were not passing their layer into the element. Stupeeed
Rearranges some layers to ensure things work as they do now
## Why It's Good For The Game
Closes#74165
Should fix weird decal layering. If it doesn't yell at me.
## Changelog
🆑
fix: Fixes decals layering weird in some cases
/🆑
* Fixes decals not layering as expected in world
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Roundstart Xeno egg deliveries create a Captive Xenomorph team, gives regular xenos a fluff objective so their popup isn't blank. (#73852)
## About The Pull Request
Xenomorphs who are a product of the roundstart xenobio egg delivery will
now spawn as "Captive Xenomorphs", who receive an objective to break
containment. Here's how it works:
When a delivery egg is generated that area will be marked as the
"captivity area". Xenomorphs born within this area now have their own
team, and have their own section in the roundend report that will
greentext them based on if they were able to survive and escape
captivity. Xenomorphs born outside of this area will spawn as normal
Xenomorphs, with no escape objective or special fanfare.
To further encourage people from actually taking the role and
potentially resigning themselves to an hour in Xenobio CBT prison, the
first of the hive gets their own header on the roundend report.
(When I say "team" here, I mean they receive a different antag team
datum. They're still able to collaborate and cooperate with other
Xenomorphs, they just have a different title and extra objective in
addition to the bonus roundend report limelight.)


(This also adds a basic "survive and advance the hive" objective for all
xenomorphs, since their objective popup was otherwise completely blank).
Since the captivity area is entirely dependent on the location of the
egg itself, admins can plop one of these down anywhere, and mappers
don't have to put the egg mapping helper specifically in Xenobio.
For clarification -- To be qualified for the Captive Xenomorph team, **a
delivery egg must be spawned**, and the xeno you inhabit must be born in
the same area the egg was spawned. If the queen breaks captivity and
starts nesting elsewhere on the station, their children will be born as
normal Xenomorphs, not Captive Xenomorphs.
## Why It's Good For The Game
Adds a bit of distinction, and gives bragging rights, to anyone bold
enough to take a roundstart xeno roll and escape with it.
The Xeno egg delivery is already rare enough, I think it deserves a bit
more fanfare (especially considering the dramatic impact it sometimes
has on the direction of a round).
## Changelog
🆑
add: Xenomorphs born in the room the roundstart delivery egg was spawned
in will be part of a special "captive xenomorph" team, tasked with
escaping and tracked in the roundend report.
fix: Regular Xenomorphs no longer receive a blank objectives popup on
spawn.
/🆑
* Roundstart Xeno egg deliveries create a Captive Xenomorph team, gives regular xenos a fluff objective so their popup isn't blank.
---------
Co-authored-by: Rhials <Datguy33456@gmail.com>
* Macro Helper For Re-Used Turf_Decal Patterns (#74171)

oh that's sexy
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
Hey there, blast from the past PR format. Can you spot the issue here?

Well, I did while working on #74169, and it pissed me off. This is a
really simple pattern, and the only reason why it's just copypasted (and
prone to such errors) is because no one took the time to do it properly
like this. So, I just decided to do it while I had time today. Very
nice.
I also removed all the names because there was no point in them: in all
contexts you would be operating off the typepath, the name would never
come up. like so:

memory save? it's just un-needed anyways
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
Silly error proofing is nice! Way easier to add new colors! No need to
ctrl+c/ctrl+v everything to death anymore! whoopie
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
Nothing that players should fret about.
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
* Macro Helper For Re-Used Turf_Decal Patterns
---------
Co-authored-by: san7890 <the@san7890.com>
* Makes all CTF windows actually indestructible (#74021)
## About The Pull Request
Adds a spawner for indestructible shuttle windows
Replaces all "hardened windows" (which were actually not unbreakable)
with proper unbreakable windows
## Why It's Good For The Game
Fixes#73297, people shouldn't be breaking into space in CTF
## Changelog
🆑
fix: All CTF windows are now indestructible, fixes breaking into space
during CTF.
/🆑
* Makes all CTF windows actually indestructible
---------
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
* Adds the Smoking Room icebox surface ruin (#73876)
## About The Pull Request
My contribution to the March Into Mapping/Mapness event -- The forlorn
homestead of mister Charles Morlbaro, a high-brow individual with a
taste for cigarettes. This ruin spawns on the surface level of Icebox.

A local of the ice planet, Morlbaro lived a peaceful life at home, until
an _incident_ compromised one of his windows. Fearing the cold and
unable to keep anything larger than a cigarette lit, he sequestered
himself in his private smoking room, and hasn't been seen since.
...
Oh, right, the loot. That's the most important part for some of you
guys.

Where there's smoke, there's fire, and where there's cigarettes, there's
lighters. Mister Morlbaro collected novelty lighters, which have to be
worth something to someone, right? You might be able to find some if you
dig around in his belongings. Just try not to disturb him if you choose
to enter his smoking room.
### Mapping March
<!-- If your pull request is part of Mapping March and you want to earn
an antagonist token for your FIRST mapping pull request submitted this
month, please include your ckey. For more information, read about the
event here: https://hackmd.io/@ EOBGames/BkwuRlxkh -->
Ckey to recieve rewards: theduffelbag
## Why It's Good For The Game
Ruin variety is nice. This one doesn't have any particularly spectacular
loot, but it's a surface ruin.
Bro space ruins are sooooo 2020 bro, it's all about icebox ruins now
bro.
## Changelog
🆑 Rhials
add: Adds the Smoking Room icebox ruin, found on the station level!
/🆑
* Adds the Smoking Room icebox surface ruin
---------
Co-authored-by: Rhials <Datguy33456@gmail.com>
* Adds Pinatas that can be purchased by cargo and clown operatives! (#73868)
## About The Pull Request
Pinata's drop various items when struck with a sufficiently powerful
weapon. This PR adds two types, a standard one which can be bought from
cargo which contains various candy items and a syndicate one which
contains both candy items and explosives purchasable by clown
operatives.
The pinata functionality is also a component so admins can turn any
structure/machine/mob into a pinata and customize the "candy" inside
Sprites by @ Mey-Ha-Zah animated versions by me
## Why It's Good For The Game
Adds a cute little celebration themed structure that can be bought by
players to accommodate a celebration based gimmicks or the party trait.
I think the options on things to do as a crew during a celebration are a
bit limited at present with most of the options being making/purchasing
food, activity wise the main example of a celebration item is pin the
tail on the corgi which is a bit uninteresting, the pinata on the other
hand is more cathartic and provides a "reward" in the form of various
candy items for people who participate in smashing it. I also think its
just funny to have clown operative gambling half their TC to try and get
explosives.
## Changelog
🆑 Mey-Ha-Zah & NamelessFairy
add: Added pinata crates to cargo, they contain various candy items. Fun
at parties.
add: Clown operatives can now purchase a weapons grade pinata, this
contains both candy and explosives. Still fun at parties.
admin: Admins can now turn players, mobs and objects into pinata's with
the new pinata component.
/🆑
* Adds Pinatas that can be purchased by cargo and clown operatives!
---------
Co-authored-by: NamelessFairy <40036527+NamelessFairy@users.noreply.github.com>
* Restores Spell Card targetting behaviour (#73706)
## About The Pull Request
Fixes#52946
This has been broken ever since #44112 which apparently removed the proc
in this component which selected a target for performance reasons and
just... didn't replace it with anything else? So it's been bricked ever
since.
In order to restore the removed mouse tracking behaviour I implemented
the pattern used in scoped weapons and the kinesis module. As this was
the third thing I could find to use this code, I abstracted it out into
an object where most of the shared behaviour lives. I tested those
things too and they still seem to do what they used to.
Here it is in action:
https://user-images.githubusercontent.com/7483112/221954852-22244bb1-7c87-452d-a9b0-ebed81c4c1ef.mp4
Because this spell now applies a full screen overlay in order to
function, it's really begging for someone to make some touhou-style art
with cards and patterns around the edge of the screen while you are in
aiming mode, but I'm not going to be the one to make it.
I tidied this component up and refactored it as best I could while I was
reworking it to use a full screen overlay but I am... not totally
confident that it should be a component at all given that it keeps being
created and destroyed. But also it has worked that way for like four
years now, so who am I to say.
Oh yeah also the icon for this spell broke, so I fixed it.
## Why It's Good For The Game
Makes a reasonably terrible wizard spell marginally less bad.
Maybe now that this component works, some other things can use it?
If we make a fourth thing which follows your cursor it won't need to
copy/paste code around.
## Changelog
🆑
fix: Spell Cards from the Wizard spell will now home in somewhat on the
target nearest to your cursor.
fix: The Spell Cards spell now displays the correct icon instead of a
big red "error" text.
/🆑
* Restores Spell Card targetting behaviour
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Some more RCD Designs & Patches (#72757)
Adds some more stuff you can build with the RCD
1. Under structures you can now build/deconstruct catwalks & construct
Reflector Frames. Destorying a catwalk will cut any cable on it leaving
pieces of it behind

2. If you have the frames upgrade you can construct APC, Air Alarm &
Fire Alarm frames on walls & Flood light fixtures[fully wired]. It only
creates the wall mount and sticks it on the wall. Wiring, Circuits and
finishing the frame is still your job

3. If you have the furnishing upgrade you can create racks & beds &
additional bar stool

**Important Code Refractors**
1. `/turf/closed/wall/proc/try_wallmount()` will return true only after
you have successfully mounted the wallframe or stuck an poster on it &
not simply check if you are trying to mount a valid thing on it
2. `apc_tool_act/rcd_act()` was incorrectly checking passed_mode for the
simple circuit upgrade and not the `the_rcd.upgrade `flag. Thats fixed
now to
3. newly created APC's weren't assigning themselves to their areas
allowing multiple to be created in one area. Thats fixed now
4. Walls, Airlocks & other stuff could be built on tiles having
something dense that would block it. For example a wall could be build
on top of a machine frame!!. Thats also fixed now
More stuff you can build rapidly with the RCD
🆑
add: more designs for the rcd
refactor:` try_wallmount()` to return true only after successful mount
fix: `apc_tool_act/rcd_act()` incorrecly checking for simple circuits
upgrade in the wrong variable
fix: newly created APC's not assigning themselves to their areas.
fix: rcd building structures [walls, airlocks etc] on turf's that
already have structures on them
/🆑
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
* Grand Ritual: Alternate Wizard objective (Wizard Events II) (#72918)
Adds an alternate greentext objective for Wizards known as the "Grand
Ritual". This was initially the gimmick of a different wizard-related
antagonist downstream. I didn't get permission to port it, so I'm
attaching it to regular Wizards instead.
Wizards will spawn in with a new Grand Ritual button next to their
antagonist info button. Pressing it will pinpoint them towards their
next Ritual Location (a randomly chosen region of the space station).
Once within that location, pressing it will summon a magic circle and
obliterate any dense objects which are in the way. This also puts the
ability on a two minute cooldown.
Clicking on the magic circle with an empty hand will begin a three-stage
invocation to gather magical power. You can interrupt this invocation at
any time and will resume from the last stage you completed (if you
finished two stages you only need to do one more).
Once you complete a ritual, a random event will be triggered based on
how many rituals you have performed so far. These tend to be ones which
annoy the crew in some manner, and Wizard Events are included in the
list. Additionally, something weird will usually happen to the room you
are in.
Then you are assigned a new location and can toddle off to do it again.
Once you have done this three times, you will be picked up by the
station's sensors every time you start a subsequent ritual and should
expect annoyed company to come investigate.
Once you have done this six times, you can finally spend all of that
accumulated power on the seventh Grand Finale ritual. Completing this
grants you victory at the end of the round and will have a larger,
flashier effect which you can pick from a list of options, think of it
like a wizard equivalent of a Traitor Final Objective or Heretic
Ascension.
After that you can still keep doing rituals if you want to pester the
crew further by summoning more random events, you've already "won" at
this point so now it's your job to make them want to go home.
I think it'd be more fun to just find out what the Finale ritual can do
by seeing it happen but maintainers will probably want a list of its
precise capabilities, so here it is:
Currently completing a ritual also has a chance to create Heretic
Reality Tears (of both varieties, available for Heretics to eat and
visible to crew) as a kind of cross-antagonist interaction which seemed
to make sense to me but if this seems thematically or mechanically
inappropriate it's easy to strip out.
* wew
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Forcing an embed means that it will always happen (Effects trapped posters, accidental consumption, and bullet shrapnel) (#73729)
## About The Pull Request
Addresses #73105
I confidently asserted in the issue that the current behaviour was not a
bug, but lo and behold when I went to investigate this on March 1st what
did I find... a bug! Force embed actually never worked in the first
place because the passed arguments were in the wrong order. Now they are
named, so the order doesn't matter any more.
Also there was an argument called "silent" which did literally nothing,
I just deleted it.
Sending the force flag will now mean that the forced embed _always_
embeds unless it is literally impossible. The only other place this
effects is when you accidentally eat glass, so a similar case to this
one.
While I was in there, I made posters _very slightly_ more discerning
about what gloves block glass. Unfortunately there's no widely applied
and useful trait like `THICK_MATERIAL` for gloves so I mostly just
exluded latex and fingerless gloves... but that's better than nothing.
Anyway now if you bother to place a glass shard inside a poster and
someone tries to pull it down and they're not wearing thin or fingerless
gloves it will _always_ embed in their hand.
Oh and I put some balloon alerts in there.
**Unrelatedly to this change** fixing this seems to also fix an ancient
bug where bullet shrapnel would roll its embed chance twice in a row,
meaning that it had an (x/100)^2% chance of applying rather than an
(x/100)% chance, significantly less than written.
It is weird for that to go in this PR, but seems to be an effect of
fixing this bug? Not sure there's a way of not fixing both at the same
time.
## Why It's Good For The Game
You go to the effort of putting a glass shard behind a poster (the only
way to associate your own fingerprints with the deed) and are lucky
enough that the person who pulls it down isn't wearing gloves (almost
everyone does) and it _still_ only has a 50% chance to embed the glass?
The trap should work at least _some_ of the time.
## Changelog
🆑
fix: Something which is "forced" to embed will now always actually
embed. Resultingly, accidentally swallowing glass or encountering it
behind a poster without adequate protection will now always cause it to
embed into your body.
balance: Thin and fingerless gloves may no longer protect you from
having glass in your hand after pulling down a poster
fix: Bullets containing shrapnel now use their correct chance to embed,
which may cause bullet wounds to contain shrapnel more frequently.
/🆑
* Forcing an embed means that it will always happen (Effects trapped posters, accidental consumption, and bullet shrapnel)
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Refactors lizard fake canned food into real canned food (#73469)
## About The Pull Request
/obj/item/food/canned_jellyfish, /obj/item/food/desert_snails, and
/obj/item/food/larvae are now all /canned subtypes. All this means is
that to eat them, you use them once, and now they drop an empty tin
rubbish item.
## Why It's Good For The Game
Making fake false versions of real types that exist is such a pet peeve
of mine, we recently had a bug from it where the snails would go bad.
But even with that fixed you're just chomping the container of snails
and it's not the same behavior as all the other cans
grumgrugmrg I FIXED IT.
## Changelog
🆑
refactor: Lizard related canned food now acts like canned food
/🆑
* Refactors lizard fake canned food into real canned food
* updates all the modular canned stuff
* desert_
---------
Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com>
Co-authored-by: Paxilmaniac <paxilmaniac@gmail.com>
* Adds the Ectoplasmic Outburst, a rare ghost-centric anomaly event (#73024)
## About The Pull Request
This PR description might be a bit rushed because I accidentally
submitted the PR and want to bang out a quick explanation of what this
is before people start asking questions.
Adds a new, rare, ghost-themed anomaly event -- The Ectoplasmic
Outburst.

This event increases in power as more ghosts orbit it, with three
important thresholds to meet.
If 10% or more of all active observers are orbiting the anomaly, an
effect will occur in the nearby area akin to the revenant's defile
spell, damaging flooring, windows, and making a mess.
If 35% or more are orbiting the anomaly, nearby objects in the effect
radius have a chance to become haunted, and will fling themselves at
anyone nearby for a bit. Spooky!
Now, at 50% or more participation, things get serious. Ghosts orbiting
the anomaly will be polled to be brought back into the world for a brief
period as a vengeful spirit, anchored to a SUPER spooky ghost portal.
The portal closes after two minutes (alternatively, smash it with a
toolbox) and deletes all of the ghosts it spawned. Vengeful spirits are
mostly just meant to smash stuff and be a nuisance while they can. It's
a wonderful opportunity to let deadchat desalinate a little.

Oh, also, the anomaly is deadchat controlled. With enough ghosts, you
could theoretically outrun anyone trying to neutralize it!
The associated reactive armor has an effect similar to the anomaly,
haunting nearby objects for a time when the wearer is struck. Not
particularly outstanding, but it can introduce an element of chaos into
a fight that your opponent might not expect.
## Why It's Good For The Game
Anomaly events are great for ghosts. Why not make one tailored just for
them!
Gives admins something to spawn when a wizard has killed half of the
crew but it's not quiiiite time for an ERT.
It's a bit of a silly event with a novelty reward, but I think it's rare
enough not to be a huge issue.
## Changelog
🆑 Rhials
add: Ectoplasmic Outburst anomaly event
add: Reactive Ectoplasm Armor
/🆑
* Adds the Ectoplasmic Outburst, a rare ghost-centric anomaly event
---------
Co-authored-by: Rhials <Datguy33456@gmail.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Starlight Polish (Space is blue!) (#72886)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
Adds support to underlays to realize_overlays
Ensures decals properly handle plane offsets
Fixes space lighting double applying if it's changeturf'd into. this
will be important later
Makes solar vis_contents block emissives as expected
Moves transit tube overlays to update_overlays, adds emissive blockers
to them
#### Adds render steps
An expansion on render_target based emissive blockers.
They allow us to hijack an object's appearance and draw it somewhere
else, or even modify it, THEN draw it somewhere else.
They chain quite nicely
Fixes shuttles deleting z holder objects
#### Makes space emissive, makes walls and floors block emissives
The core idea here goes like this:
We make space glow, and give its overlays some color
This way, the tile and space parallax remain fullbright, along with
anything that doesn't block emissives, but anything that does block
emissives will instead get shaded the color of starlight
This requires a bit of extra work, see later
This is done automatically with render relays, which now support
specifiying layer and color (Need to make an editor for these one of
these days)
The emissive blocking floor stuff requires making a second render plate
to prevent double scaling
Also adds some new layering defines for lighting, and ensures all turf
lights have a layer. We'll get to this soon
#### Makes things in space blue
We color them the same as starlight, by taking advantage of space being
emissive
This means that things in space that block emissive will block it
correctly and be colored blue by the light overlay, but space itself
will remain fullbright
This does require redefining what always_lit means, but nothing but
cordons use that so it's fineee
#### Makes glass above space glow, and some other stuff
Glass tiles that sit above space will now shine light with matching
color to the glasses color. This includes mat tiles.
Glass tiles (not mat because they have no alpha) also only partially
block emissives.
Adds a new proc that uses render steps to acomplish this, essentially
we're cutting out bits below X alpha and drawing what remains as an
emissive.
#### Modifies partial space showing to support glow
Essentially, alongside displaying space as an underlay, we also display
a light overlay colored like starlight.
That starlight overlay gets masked to only be visible in bits that do
not contain any alpha.
We also mask the turf lighting to not go into bits that have no alpha,
to ensure we get the effect we want.
This is done with that lighting layer thing I mentioned earlier.
#### Makes appearance realization's list output ordered
I want it output in order of overlay, sub overlay suboverlay, next
overlay
Need to use insert for that
## Why It's Good For The Game
Pretty!
Also having space be emissive is a very very good way to test for fucked
emissive blockers (If it's broken why are we even drawing the overlay)
I know for a fact mob blockers on lizards and socks are kinda yorked, I
think there's more
<details>
<summary>
Old
</summary>



</details>
<details>
<summary>
New
</summary>



</details>
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
add: Space now makes things in it starlight faintly blue
fix: Glass floors that display space now properly let space shine
through them, rather then hiding it in the dark
add: Glass floors above space now glow faintly depending on their glass
type
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
* update modular
* Update _decal.dm
* Update _decal.dm
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Fixes immortal anomalies having a death timer overlay (#68694)
Fixes immortal anomalies having a death timer countdown overlay
(cherry picked from commit 1c95f34e27)
# Conflicts:
# code/game/objects/effects/anomalies.dm
Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
* Effects no longer runtime on being attacked (#73300)
## About The Pull Request
Effects didn;t override generic attack, which caused runtimes when
attacked
## Why It's Good For The Game
Closes#73295
## Changelog
Signed-off-by: GitHub <noreply@ github.com>
* Effects no longer runtime on being attacked
---------
Signed-off-by: GitHub <noreply@ github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
* Sign/plaque contextual screentips and file reorganizing (#73246)
## About The Pull Request
This PR adds contextual screen tips to signs and plaques based on the
held tool. Wrenches unfasten, and welders repair. Behaves the same with
plaques, but plaques also get a screentip for using a fountain pen on
them if they can be engraved. Also adds a tip to editable-item signs
with a pen out.
Tested to avoid issues with posters from cropping up, and it appears to
still behave correctly with paper posters, which are apparently a type
of sign. Go figure.

I've also reorganized the sign and plaque files to follow our more
standard object hierarchy of base type -> inherited procs -> subtype
specific procs, where these were interspersed throughout the file. I did
however leave the armor datums below the object, as they appear to
follow new convention.
## Why It's Good For The Game
Screentips avoid ambiguity and improve readability of construction. Easy
improvement.
Plus, improves consistency of the signs file layout-wise.
## Changelog
🆑
qol: Adds screentips to both signs and plaque construction/modification.
/🆑
* Sign/plaque contextual screentips and file reorganizing
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
* Makes some improvements to how AI can use JPS with movement loops (#72685)
## About The Pull Request
This PR makes some changes to how JPS is used in movement loops, as it
was causing a variety of issues:
- Fixed some code where JPS would fail because the path is still being
made. Instead, the movement loop will now wait.
- Reduced the subsystem wait for the pathfinder subsystem from 2 seconds
to 0.1 seconds. @ LemonInTheDark told me that this is better, I'll update
this with a better explanation once I squeeze it out of him :D
- Allows you to provide an initial path to the movement loop, in case
you pre-calculated one while making a plan.
## Why It's Good For The Game
Makes working with JPS a bit easier when making AI.
---------
Co-authored-by: Capybara <Capybara@ CapybaraMailingServices.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
* Makes some improvements to how AI can use JPS with movement loops
---------
Co-authored-by: CapybaraExtravagante <110635252+CapybaraExtravagante@users.noreply.github.com>
Co-authored-by: Capybara <Capybara@ CapybaraMailingServices.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
* Adds nutriment factor to liquid gibs. (#73033)
## About The Pull Request
Over the years I've heard quite a few lizard players scratch their heads
in confusion due to the lack of gibs filling you up. I gave it a fairly
low value of 2 so people don't end up trying to power game it.
## Why It's Good For The Game
Adding an alternative use to gibs is always nice, at the moment it's
mostly just used for soap and cytology (Which barely anyone does.)
## Changelog
🆑
balance: Gibs now provide a small amount of nutriment.
/🆑
* Fixes the modular uses of liquid gibs
* Fixes an error that somehow slipped through.
---------
Co-authored-by: carshalash <carshalash@gmail.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
Fixes critical plane masters improperly not being readded in show_to (#72604)
## About The Pull Request
[Adds support for pulling z offset context from an atom's
plane](9f215c5316)
This is needed to fix paper bins, since the object we plane set there
isn't actually on a z level.
Useful elsewhere too!
[Fixes compiler errors that came from asserting that plane spokesmen had
a plane
var](b830002443)
[Ensures lighting backdrops ALWAYS exist for each lighting
plane.](0e931169f7)
They can't float becuase we can see more then one plane at once yaknow?
[Fixes parallax going to shit if a mob moved zs without having a
client](244b2b25ba)
Issue lies with how is_outside_bounds just blocked any plane readding
It's possible for a client to not be connected during z moves, so we
need to account for them rejoining in show_to, instead of just blocking
any of our edge cases.
Fixing this involved having parallax override blocks for show_plane and
anything with the right critical flags ensuring mobs have JUST the right
PMs and relays.
It's duped logic but I'm unsure of how else to handle it and frankly
this stuff is just kinda depressing.
Might refactor later
[show_to can be called twice successfully with no hide_from
call.](092581a5c0)
Ensures no runtimes off the registers from this
## Why It's Good For The Game
Fixes#72543
Fixes lighting looking batshit on multiz. None reported this I cry into
the night.
## Changelog
🆑
fix: Fixes parallax showing up ABOVE the game if you moved z levels
while disconnected
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Time-Green <timkoster1@hotmail.com>
Posters now say that you can trap them (#72974)
## About The Pull Request
Examining a poster will now say that you can trap it with a glass shard
## Why It's Good For The Game
While trapping posters with shards is a fun mechanic, not everyone knows
that you can do that. This PR makes easier to find out about this
mechanic for new players.
## Changelog
🆑
qol: Posters now tell that you can trap them with a glass shard when
examined
/🆑
---------
Co-authored-by: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com>
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
One use portals will only become used up when they successfully teleport (#71034)
Makes one use portals self-qdel only when they confirm that whatever
tries using them has teleported.
(cherry picked from commit ecd62aed24)
Co-authored-by: Striders13 <53361823+Striders13@users.noreply.github.com>
* adds atmospheric gloves, small resprite of firefighter gear, repaths stupid glove paths (#72736)
repaths a lot of gloves off /color because they were incredibly stupid
firefighter gear has gotten an update (it doesnt cover hands anymore
though, you need something else)
firefighter helmets no longer hide your mask or glasses

fixed engine goggles starting with darkness vision
to the atmos lockers adds atmospheric gloves, a pair of thick (chunky
fingers) gloves that are fireproof and fire protective, slightly shock
resistant and let you fireman carry people faster.
atmospheric firefighter helmets now are a subtype of welding hardhats,
you can enable a welding visor.
welding hardhats change mode with right click instead of altclick
im not a good spriter but i think this resprite makes them fit nicer
with other engi equipment
lets me firefighter rp
🆑
add: Atmospheric Gloves, thick gloves that are fully fireproof and fire
protective and let you fireman carry people faster.
fix: fixes engine goggles starting with darkness vision
qol: firefighter helmets can now enable a welding visor
qol: welding hardhats change mode with right click instead of altclick
balance: firesuits no longer protect your hands
/🆑
* Makes shit compile
* Updates the digi and snouted stuff to match the new sprites (thanks Halcyon!)
* Fixes a whole ton more issues that popped up
---------
Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
* Refactor lighting items that use fuel (#72146)
Fixes#71826
This does the following:
- Makes candles a subtype of flare
- Fixes candles having lighting inconsistencies
- Fixes burning items (welder, candles, flares, etc.) not causing
ignition effects when held in hand
- Adds burnt flares and melted candles to maint loot and trash spawners
- Add match lighting sound when candles are lit
- Add time defines for fuel amounts and rounded them (ex. instead of
32.3333 minutes, it's now 35 minutes)
- Light sources that burn will now spawn a trash item once fuel is spent
- Light sources that burn now have a welder hitsound
- Light sources that burn can now be extinguished by a fire extinguisher
(except flares)
- Light sources that burn can now be used to ignite another object on
fire (ex. a lit candle can be used to light a cigarette)
- Light sources that burn and are lit now do `BURN` damage while
attacking
Code is more cleaner and consistent. Also fixes some bugs.
🆑
soundadd: Candles will now use the match lighting sound when lit
soundadd: Light sources that burn will now have a welding hitsound
fix: Fix candle light behaving erratically
fix: Fix burning items that are held in hand will now have an ignition
effect on the turf. (ex. lit welders in hand will now ignite plasma in
the air)
balance: Light sources that burn and are lit now do `BURN` damage while
attacking
balance: Light sources fuel amounts were rounded to exact numbers (ex.
instead of 32.3333 minutes, it's now 35 minutes)
qol: Light items that burn can now be extinguished by a fire
extinguisher (except flares), used to ignite another object on fire, and
will now leave a trash item once fuel is used
qol: Add burnt flares and melted candles to trash spawners
refactor: Refactor lighting items that use fuel to be more robust
/🆑
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
* Modular!
* Toggle Light
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
Co-authored-by: Funce <funce.973@gmail.com>
* Smoothing groups optimization, save 265ms with configs, more on production & w/ space ruins (#71989)
This one is fun.
On every /turf/Initialize and /atom/Initialize, we try to set
`smoothing_groups` and `canSmoothWith` to a cached list of bitfields. At
the type level, these are specified as lists of IDs, which are then
`Join`ed in Initialize, and retrieved from the cache (or built from
there).
The problem is that the cache only misses about 60 times, but the cache
hits more than a hundred thousand times. This means we eat the cost of
`Join` (which is very very slow, because strings + BYOND), as well as
the preliminary `length` checks, for every single atom.
Furthermore, as you might remember, if you have any list variable set on
a type, it'll create a hidden `(init)` proc to create the list. On
turfs, that costs us about 60ms.
This PR does a cool trick where we can completely eliminate the `Join`
*and* the lists at the cost of a little more work when building the
cache.
The trick is that we replace the current type definitions with this:
```patch
- smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH)
- canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH, SMOOTH_GROUP_CLOSED_TURFS)
+ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH
+ canSmoothWith = SMOOTH_GROUP_FLOOR_ASH + SMOOTH_GROUP_CLOSED_TURFS
```
These defines, instead of being numbers, are now segments of a string,
delimited by commas.
For instance, if ASH used to be 13, and CLOSED_TURFS used to be 37, this
used to equal `list(13, 37)`. Now, it equals `"13,37,"`.
Then, when the cache misses, we take that string, and treat it as part
of a JSON list, and decode it from there. Meaning:
```java
// Starting value
"13,37,"
// We have a trailing comma, so add a dummy value
"13,37,0"
// Make it an array
"[13,37,0]"
// Decode
list(13, 37, 0)
// Chop off the dummy value
list(13, 37) // Done!
```
This on its own eliminates 265ms *without space ruins*, with the
combined savings of turf/Initialize, atom/Initialize, and the hidden
(init) procs that no longer exist.
Furthermore, there's some other fun stuff we gain from this approach
emergently.
We previously had a difference between `S_TURF` and `S_OBJ`. The idea is
that if you have any smoothing groups with `S_OBJ`, then you will gain
the `SMOOTH_OBJ` bitflag (though note to self, I need to check that the
cost of adding this is actually worth it). This is achieved by the fact
that `S_OBJ` simply takes the last turf, and adds onto that, meaning
that if the biggest value in the sorting groups is greater than that,
then we know we're going to be smoothing to objects.
This new method provides a limitation here. BYOND has no way of
converting a number to a string at compile time, meaning that we can't
evaluate `MAX_S_TURF + offset` into a string. Instead, in order to
preserve the nice UX, `S_OBJ` now instead opts to make the numbers
negative. This means that what used to be something like:
```dm
smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS)
```
...which may have been represented as
```dm
smoothing_groups = list(15, MAX_S_TURF + 3)
```
...will now become, at compile time:
```dm
smoothing_groups = "15,-3,"
```
Except! Because we guarantee smoothing groups are sorted through unit
testing, this is actually going to look like:
```dm
smoothing_groups = "-3,15,"
```
Meaning that we can now check if we're smoothing with objects just by
checking if `smoothing_groups[1] == "-"`, as that's the only way that is
possible. Neat!
Furthermore, though much simpler, what used to be `if
(length(smoothing_groups))` (and canSmoothWith) on every single
atom/Initialize and turf/Initialize can now be `if (smoothing_groups)`,
since empty strings are falsy. `length` is about 15% slower than doing
nothing, so in procs as hot as this, this gives some nice gains just on
its own.
For developers, very little changes. Instead of using `list`, you now
use `+`. The order might change, as `S_OBJ` now needs to come first, but
unit tests will catch you if you mess up. Also, you will notice that all
`S_OBJ` have been increased by one. This is because we used to have
`S_TURF(0)` and `S_OBJ(0)`, but with this new trick, -0 == 0, and so
they conflicted and needed to be changed.
* Sorting how did I miss it
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: Funce <funce.973@gmail.com>
* Rescale SM health from 900 to 100, UI improvements, visual changes. (#72252)
Rescaling because i saw someone think that the number on the supermatter
UI are actually the percent damage over time, which is wrong.
Added delta symbol to damage and energy since they actually denote
change, not the actual value.
Chose the numbers that look good instead of doing a 1:1 rescale of the
old one (i.e. im dividing or multiplying things by 10 instead of 9). In
practice this means I'm lowering the damage cap but increasing damage
over the board for atmos (since it's mostly divisors). Lowered the
damage overall for external stuffs.
A bit of modification on the filter helpers to suit my needs. Added
documentation because I'm awesome.
* Rescale SM health from 900 to 100, UI improvements, visual changes.
Co-authored-by: vincentiusvin <54709710+vincentiusvin@users.noreply.github.com>
* Frog Basic Mob Refactor (#72044)
## About The Pull Request
Refactors the frog into a basic mob. The frog now does the same as the
old frog and can now properly be commanded by the regal rats.
## Why It's Good For The Game
## Changelog
🆑
refactor: Refractors the frog into a basic mob
/🆑
* Frog Basic Mob Refactor
Co-authored-by: Comxy <tijntensen@gmail.com>
* Changes the missing food icon test to cover ALL /obj's
* Update implant.dm
* Hopefully fixes all the failing integration tests!
* Fixes more missing icons
* Even more icon fixes
* Hopefully that was all of them
* Okay now SURELY that's all of them
* I'm tired of this shit man
* Hopefully that's all, for real this time!
Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* Adds the Sandstorm random event, directional meteor functionality, space sand. (#71802)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request

Hey guys, it's your boy. Back at it again with another meteor-adjacent
event PR.
Adds the Sandstorm random event, inspired by the long-unused admin only
one. It picks a direction to approach from, alerts the crew of its
imminent arrival, and after a little over a minute of preparatory time,
sends waves of sand and dust to grind down everything in that direction.
To accomplish this, some minor adjustments had to be made to meteor
generation code. They can now be passed an optional arg for a direction
to be thrown from, and will pick a random one if no direction is given.
Also introduces the newest addition to our cast of meteors -- space
sand! It's even weaker than space dust, and shows up exclusively in this
event. Space sand is **ineffective against rwalls**, and will not damage
the arrivals area's high-tech sand-resistant glass. This is to prevent
this event from venting one of the most dust-vulnerable areas on the
station, and to make sure new players aren't shafted into firelock hell
when the right angle is picked.
I did a lot of testing and tweaking of numbers to get the damage to
average at about the level I'm comfortable with. This is meant to be a
high-impact event that isn't as destructive (or unavoidable) as a meteor
wave. Speaking of avoidance, let's talk about mitigation:
You get an early warning and a direction the sand will come from. You
have time to grab repair supplies, move to safety, get a MODsuit. You
can make worthwhile repairs as the sand comes in from inside (or
outside, if you're brave enough) with nothing more than a welder and
iron sheets. If you're feeling particularly spicy, you can leverage your
prep time setting up shield generators, which spawn in engineering and
have been added to the maintenance machines loot pool. Anyone can
contribute, so do your part as a good crewmate and help out!
All that being said, the event can't be prevented entirely. Shit's going
to get shredded, especially on the outside of the station. Damage will
vary heavily based on the station and direction, ranging from
inconsequential to threatening. It should happen late enough into the
round that, at the bare minimum, the crew shouldn't be caught
unprepared.
For those of you who are worried, the ORIGINAL sandstorm admin event is
still with us too. It's been moved from the space dust file into the
Sandstorm event file. This PR also makes a very minor change to the
naming of the space _dust_ events, for better menuing.
So, to sum it all up: Sand hits grinds down one side of the station, you
get a minute of warning, shield generators now spawn in maintenance. Be
a good crewmate and help where you can.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
More event variety is good, and events that give the players agency on
how bad the impact will be is even better.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑 Rhials
add: Sandstorm random event! A random side of the station is pummeled by
an onslaught of sand and dust. If you hear that one is approaching, grab
a welder and some iron to help with repairs!
add: Space sand! It's weak and doesn't hurt reinforced walls, but
shouldn't be underestimated in high quantities.
code: You can now pass a start direction to the
spawn_meteors/spawn_meteor global procs.
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
* Adds the Sandstorm random event, directional meteor functionality, space sand.
Co-authored-by: Rhials <Datguy33456@gmail.com>
* Replace moveToNullspace in decal Destroy() to loc = null -- Saves 0.11s of init time (#71706)
This calls Exited(), Entered(), etc etc etc etc, and it is not necessary
for this. Was 119ms, now 9.
* Replace moveToNullspace in decal Destroy() to loc = null -- Saves 0.11s of init time
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
* converts contraband file into poster file, makes holiday posters work (kind of) (#72131)
## About The Pull Request
The first part of this is just something that bothered me when I was
messing around with something that I will PR in the new year,
contraband.dm and dmi is ONLY posters. There's nothing else in there and
there are plenty of official posters, and if with #71717 we will also
add holiday posters to the mix then I think that its time to retire
contraband and make it poster.
Some small things I did while messing with it was change some variables
that were single letters into actual variable names, but overall this
part of the pr is not a player facing change.
That said, speaking of #71717 I think that it didn't work? Or didn't
work the way that it was supposed to? All of the spawned posters aren't
instances of festive posters, they are instances of normal posters, so
the code on initialize was not doing anything and the only reason the
holiday_none poster was showing up was because of the proc in randomize
spawning the posters in as those other posters. Because it didn't
actually _become_ poster/official/festive it never could do the proc
that turns it into a poster for the holiday that is actually occurring.
But then when I made it work and it turned into the generic posters I
decided that it would be better if instead of 30% of all posters being a
half finished mess, that if there wasn't a holiday poster it just
wouldn't replace them at all. I have poster Ideas and Dreams so I will
try to help with adding to more holiday posters but not in this PR.
What IS in this PR though, is a new traitor poster that appears during
the holidays.

This is a generic evil holiday poster that will replace normal evil
posters in the evil poster objective, because I agree with #72003 that
it should be a feature.
## Why It's Good For The Game
Contraband file is just posters already, this is easier for people to
find the posters.
I like holiday posters and think that we should have them and add more,
it is a fun easy thing to add to a lot of the microholidays to make them
more visible in addition to the name generation, but I don't want to see
the unfinished holiday poster so I do think that it's better to only
have them spawn if the holiday actually has a poster. Looking forward to
febuary!
## Changelog
🆑
add: during holidays the spread syndicate propaganda through posters
objective has a chance of spawning evil holiday poster
fix: framework for holiday posters is more functional and modular
code: contraband.dm file and contraband.dmi file are both now poster.dm
and poster.dmi
/🆑
* converts contraband file into poster file, makes holiday posters work (kind of)
Co-authored-by: Sol N <116288367+flowercuco@users.noreply.github.com>
* Changes our map_format to SIDE_MAP (#70162)
## About The Pull Request
This does nothing currently, but will allow me to test for layering
issues on LIVE, rather then in just wallening.
Oh also I'm packaging in a fix to one of my macros that I wrote wrong,
as a joke
[removes SEE_BLACKNESS usage, because we actually cannot use it
effectively](c9a19dd7cc)
[c9a19dd](c9a19dd7cc)
Sidemap removes the ability to control it on a plane, so it basically
just means there's an uncontrollable black slate even if you have other
toggles set.
This just like, removes that, since it's silly
[fixes weird layering on solars and ai portraits. Pixel y was casuing
things to render below who
shouldn't](3885b9d9ed)
[3885b9d](3885b9d9ed)
[Fixes flicker
issues](2defc0ad20)
[2defc0a](2defc0ad20)
Offsetting the vis_contents'd objects down physically, and then up
visually resolves the confliciting that was going on between the text
and its display.
This resolves the existing reported flickering issues
[fixes plated food not appearing in
world](28a34c64f8)
[28a34c6](28a34c64f8)
pixel_y'd vis_contents strikes again. It's a tad hacky but we'll just
use pixel_z for this
[Adds wall and upper wall plane
masters](89fe2b4eb4)
[89fe2b4](89fe2b4eb4)
We use these + the floor and space planes to build a mask of all the
visible turfs.
Then we take that, stick it in a plane master, and mask the emissive
plane with it.
This solves the lighting fulldark screen object getting cut by emissives
Shifts some planes around to match this new layering. Also ensures we
only shift fullscreen objects if they don't object to it.
[compresses plane master
controllers](bd64cc196a)
[bd64cc1](bd64cc196a)
we don't use them for much rn, but we might in future so I'm keeping it
as a convienince thing
🆑
refactor: The logic of how we well, render things has changed. Make an
issue report if anything looks funky, particularly layers. PLEASE USE
YOUR EYES
/🆑
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
* Changes our map_format to SIDE_MAP
* Modular!
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
Co-authored-by: Funce <funce.973@gmail.com>