* Adds very common (3+) crayon prefabs for maps (#82072)
## About The Pull Request
Adds a bunch of crayon prefabs for the maps.
## Why It's Good For The Game
Reduces 45 map Var edits, and completely removes some Var edits.
* Adds very common (3+) crayon prefabs for maps
---------
Co-authored-by: Bilbo367 <163439532+Bilbo367@users.noreply.github.com>
* Add corner filled striped decals (#82116)
## About The Pull Request
Adds a corner version of the filled/warning decal.

## Why It's Good For The Game
The filled/warning decal is pretty and I wished it were easier to use in
more places but without a corner sprite corners can look weird with it
## Changelog
🆑
add: Added corner filled warning decals
/🆑
* Add corner filled striped decals
---------
Co-authored-by: Sable <102194057+Thlumyn@users.noreply.github.com>
* Revamps irradiated meteor effects (#81941)
## About The Pull Request
Irradiated meteors have been given a little tune-up, because they are
kind of underwhelming right now.
Presently, they do less damage than a standard meteor. At some point its
impact effect was reduced to a single radiation pulse (which does
absolutely nothing).
Now, they hit harder, deeper, and leave behind a pile of radioactive
sludge. Let's see how it looks:

Oof, wouldn't want that hitting MY department!
You'll have to clean up the radioactive sludge, and should probably wear
protective equipment while doing so. Also, they will show up slightly
less often now, as they are more threatening now.
## Why It's Good For The Game
Re-implements Flavor for an effect that lost its taste since being added
10 years ago. An irradiated meteor doesn't do anything besides look
pretty and green right now.
Currently irradiated meteors are really boring and not threatening --
antithetical to the idea of a "radioactive meteor". Now, there's a much
more interactive and measurable impact when one hits.
## Changelog
🆑 Rhials
balance: Irradiated meteors now hit harder and leave behind radioactive
goop.
/🆑
* Revamps irradiated meteor effects
---------
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
museum away mission (#81208)
adds a new gateway map, the Nanotrasen Museum it is filled with
""""Mannequins"""" and Common Core lore
im not putting the preview here because you really should explore it
yourself but if youre that curious i think the Checks tab in mapdiffbot
would have it
this gateway map contains no combat unless you count falling into chasms
because you did not carry a light
or going into the boarded room with no loot or any incentive with
obvious signs that there is the sole enemy on the map in there
the loot is the lore ok thanks
also makes mines detonate if theyre detonated by a non-mob im pretty
sure this couldnt have been intentional
trams stop chasms
and also the relevant items
<details>
<summary>on second thought if you want spoilers check this</summary>

</details>
more gateway maps = good
🆑
add: nanotrasen museum gateway map
/🆑
---------
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Revenants no longer make noise walking into gibs (#81420)
## About The Pull Request
Turns the hardcoded sound that plays when you walk into some gibs into
an Element and adds a check for flying to avoid playing the sound,
fixing Revenants, Holoparasites, and other mobs that fly from making
noise when "walking" into a pool of blood.
## Why It's Good For The Game
I was observing a revenant and heard them making noise from walking over
blood, thought it was kinda f*cked up
## Changelog
🆑
fix: Revenants (and other flying mobs) will not make noise when walking
into pools of gibs,
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Revenants no longer make noise walking into gibs
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Adds fire ants as a chem (#81214)
## About The Pull Request
Adds fire ants as a chem. They work pretty much exactly the same as
normal ants, but they deal roughly 2x damage. Also mildly cleans up
whatever ant code I touched
## Why It's Good For The Game
Doesn't really make sense that when you scoop up an anthill of fire
ants, you get a beaker full of normal ants. It's honestly an injustice.
Also, new flavours for the bartender and chef to work with are always
nice.
## Changelog
🆑
add: Fire ants can now be scooped up and used as a chem like normal
space ants
/🆑
---------
Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@ users.noreply.github.com>
* Adds fire ants as a chem
---------
Co-authored-by: Nick <42454181+Momo8289@users.noreply.github.com>
Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@ users.noreply.github.com>
ArcMining Pr Beta: Version 1.2 (#78524)
This one's not like the last one, so much so that I'm not even going to
outsource the PR description to a robot this time!
Basically, **You should read the PR body before assuming that everything
is the same as last time. It's not.**
Click the link below to see a video summary of the main features of this
pull request.
https://youtu.be/Aho2omR0mjY?feature=shared
This pull request serves as a large rework of minerals produced by
mining, and by extension mining itself. I'll try and list each change
and it's associated nuance here.
The biggest addition to the game with ArcMining is **Ore Vents**. Ore
vents spawn as a ruin on the map, placing a randomized ore vent onto map
generation. Ore vents spawn in 3 different sizes, **Small, Medium, and
Large**. These vents will pick from a pool of materials they can
generate, and will hang out across the map. A player can use a mining
scanner to discover an ore vent, granting a small quantity of **mining
points** to begin with. Once scanned, ore vents will show what minerals
that ore vent will generate after they're fully tapped.
Scanning the vent again will trigger the extraction process. A small
drone will fly down, called the NODE drone, and buckle onto the vent.
Your job during wave defense is to protect the drone and to defeat waves
of randomly spawning mobs (dependent on if you're on lavaland or on
icebox). The quantity, duration, and time between waves is scaled to the
size of the vent you're protecting. Starting by scanning and protecting
lower tier vents earlier in the shift is a safer bet than doing a large
vent in the first few minutes. The drone has 500 health, and can take a
good few hits, but leaving it alone will cause it to meet an unfortunate
end quite quickly.
Cooperation can be your best asset, as mining with allies can greatly
help with wave defense, and mineral points are granted to anyone who
helps with defending the ore vent equally (So 500 * size tier,
regardless of how much help you receive). Once complete, the ore vent
will have a mining machine constructed on top of it, and will start to
dredge up **Boulders** from the earth automatically. More on boulders
later.
Ore vents can be located based on your mining scanner, and will provide
an appropriate audio cue based on if the ore vent has been discovered or
not, and once processed will no longer alert you to it's presence.
**Each station comes with a free vent that produces exclusively iron and
glass, free of charge.** This is to help with shifts where the station
may not have shaft miners to produce minerals, and to provide the
station with a baseline amount of minerals where none may exist
otherwise.
Mineral generation has been completely reworked. Previously, Mineral
Generation had a flat 13% spawn rate in-game. Once minerals spawned,
they would also have a chance to propagate their minerals to nearby
tiles, resulting in a rather massive pool of minerals that could spawn
throughout lavaland on the whole.
This tweaks that, by making minerals in walls spawn based on their
proximity to ore vents on maps that use cave generation. Both the
probability, and quantity of ores spawning in walls is scaled based on
distance, with ore vents looking like large caches of ores found in
walls. This makes following ores found in walls and checking their
quantity of minerals spawned a good indicator of how close you are to a
nearby vent in-round.
This means you can collect some points form both discovering ore vents
first, as well as collecting their surrounding ores, turn those in for
mining points, and then trading them in for gear upgrades to more
effectively take on ore vents. As a result of tweaking the balance of
this, the total amount of ores spawned in walls overall has been
decreased. However, by making more of the process time based, we still
result in a mostly balanced finished product.
On station, there are now three new machines. These are the BRM, the
Refinery, and the Smelter.
- The BRM acts as a teleporter. Instead of needing to carry boulders
back to the station, you can activate the BRM, and it will automatically
pick boulders to teleport back to itself. You can use this to teleport
boulders dredged up from lavaland onto the station for processing. **The
BRM will only lock on to boulders that are resting on an ore vent.**
Moving boulders back by hand will mean you'll have to haul it back by
hand.
- The refinery processes the non-metallic materials out of boulders.
This process sends the materials straight to the ORM, and collects
mining points from the ores smelted in the machine. Swiping with an ID
card lets you withdraw those points for your own personal account, but
remember that these points are for your whole team to share from. The
**Mining points obtained from this process is only 75% of the amount an
equivalent amount of ores would provide.**
- The smelter works nearly identically, however the smelter produces
metallic materials out of boulders instead.
- Once a boulder has had all of it's materials extracted, it's broken
down and deleted from the line. Otherwise, the boulder is spat out for
the next machine to process it (either the refinery or smelter).
- Once there's no minerals left in a boulder of any type, the refinery
or smelter will break the boulder down.
- Boulders **do not stack onto tiles with each other**, so they'll block
each other when pulled or when moving on a conveyor belt.
Boulders can also be processed by hand. Using a mining tool on a boulder
with right click will allow you to break down a boulder into it's
composite ores, but limits you to a maximum of 10 ore per boulder, where
the full amount can be extracted using the proper processing machines.
Also, processing by hand does deal small amounts of stamina damage over
time, do breaking a full large boulder can be particularly taxing.
Additional Boulder Processing Machines can be built, with the BRM board
being obtained from the Protolathe, while the Smelter and Refinery
boards being obtainable from the Autolathe instead. A _boulder
processing beacon_ can also be obtained from the mining points vendor as
a reward to assist with boulder processing. Boulder processing beacons
can be used to spawn in a new BRM, refinery, and smelter on the tile the
user is standing on, however **you'll still need to link them to the
ORM**!
All three machines can be upgraded with Stock Parts, allowing for **more
boulders to be processed at a time**. It does not, however, increase the
amount of minerals received from boulders, or points earned.
Mining borgs have been given some minor adjustments to compensate for
the changes to mining. Their mineral scanner, which now has an active
component to gameplay, is now a module as opposed to built into the mob.
This module allows for the same ability to discover and start waves of
monsters to fight.
Mining modules will find that their PKA now has a total of 90% mod
capacity as compared to the 80% they had before, to allow for more
robust defense of ore vents.
In addition, all borgs and AIs can interact with the BRM for boulder
collection.
Mining Mechs have had their utility tweaked as a result of these changes
as well. Mineral scanners to be used on mining mechs now have a larger
radius by comparison to their handheld cousins. Similarly, it now has an
active scanning button, which will actively discovery nearby ore vents.
To begin wave defense, you will need to hop out and scan a second time
however, so that you can properly accept the risks of drawing a horde of
bloodthirsty wildlife towards you and your companions.
Mechs can also manually process boulders, similar to mining tools using
their drill.
Golems, being more gentle and less aggressive than humans, while being
made out of LITERAL ROCKS, have a greater need to secure access to ores
and minerals to eat. As such, they have adapted to be able to do two new
things:
- Golems may now right click ore vents to be able to manually haul a
boulder out of the vent. This costs a hefty amount of stamina, but it
allows for golems to avoid combat during regular gameplay.
- Golems may now left click a boulder with an open hand in order to
manually process a boulder like a pickaxe. While not faster, it is
consistent and prevents golems from starving if they have access to a
vent, but no ores, somehow.
The labor camp, being a camp for rehabilitation and ~~excessive manual
labor~~ has been tweaked. Boulders now replace the random minerals
located on their island, and to acquire their prizes inside, much be
excavated and then broken out of the rock. Now YOU TOO can excavate
minerals and become a true mineral hero by working your way to freedom.
As a result of fewer mining points being available across the map due to
the new ore spawning mechanics, and the shift in how and when ores will
be coming in, almost every progress based mining point cost has been
reduced by around 10-20%. Many numbers are still subject to change at
present, but the idea is that core progress unlocks should be made a bit
more available earlier in the round before players can start to solo or
duo larger or more difficult ore vents, after which they'll be rolling
in ores.
Every once in awhile, an unusual boulder will get hauled up from the
mineral rich depths of lavaland. These **Artifact boulders** can
occasionally produce rare items, but for now they've mostly just been
pulling up **Strange objects** for science. Nanotrasen Natural Sciences
department will reward you extra points to be collected by boulder
processing machines for successfully extracting one. In the future, this
opens up a passive reward space that mining can reward to the station,
like providing cytology DNA samples, ancient seeds, or other artifacts.
- Boulders can be stored in all varieties of ore boxes (ground, mech)
should you choose, however as mentioned it's best to leave them where
they spawn and teleport them to the station for convenience.
- Maps that are not subject to cave generation will find that they are
largely untouched in terms of mineral balance.
- Future or existing ruins can now be tweaked to have a mineral balance
cost, as the ore vent ruin does. This will allow us to spawn in more
interesting ruins for pre-made combat challenges.
- There are unique ore vents that spawn across the map, that will summon
a boss mob relevant to that map. If the boss mob is defeated, that vent
will spawn large boulders pulling from every possible ore type that can
spawn. Not for the faint of heart!
- Similarly, the number of ore vents and mineral budget is now
adjustable in the cave generation procs, so maps may spawn with more or
less ore vents as desired for balance.
- Artifact boulders opens up a LOT of room for possible future content
like archaeology, xenoarch, artisci, and other design spaces!
- Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in
addition to boss ore vents.
- **I'll add more to this as I get asked questions and remember things,
this is a huge PR and I'm confident I've missed at least something**
I outlined a lot of this in #78040, so I'll try and keep this relatively
snappy this time, while noting that I've made some concessions to make
the whole system a lot more playable while not trying to break out
design decisions that are at the end of the day, better for the game and
the overall resource balance in round.
Minerals are a very poorly balanced system, and have been since their
inception many years ago. We heavily rely on mineral balance in round,
and yet we've really only balanced it by introducing so much supply that
there's no equivalent exchange for materials that doesn't just heavily
flood the exchanged material. For example, items printed from materials
that are otherwise considered "rare" on master exist in such quantities
and they'll never practically run out in our allotted 90 minute time
slot design. This PR adjusts how ores spawn to a point where we can
minimize the amount of ores that need to exist on the map for mining to
be able to progress, while still providing enough resources for the
station that it covers the needs of the station adequately.
Miners will need to be more strategic about what resources they've
collected, and be able to make decisions about which vents are worth the
risk of attempting to fight, how to prepare for a wave defense, and when
to head back up for upgrades, while finally giving them at least some
kind of incentive to work together and use different equipment.
Resonators make cleaning up the caves around vent easy, sandbags set up
easy defenses for your vent, mechs can serve as a wider range radar
while mining, all while still providing a new gameplay loop to mining.
By limiting the amount of ores that can enter the round from the
massive, massive amounts that were coming into the round beforehand (see
gameplay to the processing of minerals. I have some plans for that,
however this PR already got bloated really REALLY badly due to scope
creep and the number of intersecting systems that rammed into each other
to make this PR possible. So that'll be next. Plus, as I've mentioned,
we open up places for ore processing to find fossils, relics, and other
things that can implemented down the line.
Overall, I don't expect this PR to save or kill ore balance, but we gain
a LOT more control over it through the use of our mining defines
attached to this PR, and at the end of the day, that's a great place to
start off of.
🆑
add: Added ore vents. Scanning them with mining scanners shows what
minerals they contain. Scan again to fight off a horde of beasts as your
drone assistant excavates the vent, so the ore vent will produce mineral
boulders!
bal: Ores that spawn in walls now spawn based on their proximity to ore
vents, with their chance to spawn and their minerals contained scaling
from low to high.
add: Added the BRM, Refinery, and Smelter. These pieces of equipment are
used to process ore boulders into minerals for the station. Stock Part
upgrades allow more boulders to be processed at one time. They collect
mining points as well, to be redeemed with an ID card swipe.
add: Boulders are teleported to the station via the BRM if left
untouched. Boulders can also be cracked open for a reduced amount of ore
using pickaxes or golems hands.
add: All stations come equipt with a pre-excavated ore vent, which
produces a basic supply of iron and glass only. Scan other vents for
your critical resources!
add: Look there's a shit ton of changes on mining, for more detail check
out the Pull Request: https://github.com/tgstation/tgstation/pull/78524.
sound: New sounds and noises for your high octane factorio-like
gameplay!
image: All new boulder sprites for the new minerals and rocks added to
the mining gameplay loop, as well as mining machines!
image: Overlays appear over vents when scanned to let you know their
contents at a glance when actively scanned with any mining scanners.
/🆑
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Adds a sleeve of tiling colors for several holidays. (#79188)
## About The Pull Request
Inspired by #79108. This concerns Christmas, many national holidays and
a few gimmicky ones where it'd make sense.
Oh, yeah, I've also added "Sacrebleu" to the list of possible station
prefixes for the Bastille day, since "Merde" is already there.
<details>
<summary>some screenshots (got tired of restarting the server over and
over halfway through)</summary>
### St. Patrick (Ireland) :

### Bastille Day (France) :

### Waitangi Day (Union Jack colors, New Zealand) :
**No, it isn't the french flag again, it's the tram tiles that always
display the pattern in vertical stripes...**

### Christmas (Before I realized it looks like the italian flag so I've
removed the white) :

</details>
## Why It's Good For The Game
Implemeting a smidge of festivity and/or celebration to several
holidays. Open to suggestions and thoughts.
## Changelog
🆑
image: Several holidays now have themed floor and tram tiling.
/🆑
* Adds a sleeve of tiling colors for several holidays.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Dehardcodes microwave cleaning, allows spray cleaner to work on dense objects such as windows (#79354)
## About The Pull Request
- Dehardcodes microwave cleaning
- Instead of hard istyping for a rag, soap, or space cleaner, we just
use `wash`.
- Gets rid of a redundant signal
- `COMSIG_ATOM_WASHED`: not only was it misleading (only sent to items),
but it was pointless because `COMSIG_COMPONENT_CLEAN_ACT` is the same
signal.
- Improves microwave attackby code, splitting tool stuff into tool-procs
- Allows spray cleaner to work on dense objects such as windows
- Clicking on a dense object or mob adjacent to you with spray cleaner
will spawn the puff cloud on the target, rather than on your own
position.
- This will skip the moveloop and just clean everything on the target
turf alone.
- This means you can spray down a bloody window with a spray bottle, as
janitor gods intended.
- It also means you can fill the spray with other stuff to spray onto
dense objects directly, which might be worth noting. Especially for
stuff like Napalm.
Fixes#79261
## Why It's Good For The Game
Opens up the sandbox to allow more objects to clean microwaves + better
code.
## Changelog
🆑 Melbert
qol: Clicking on an adjacent dense object (or mob) with Spray Cleaner
will now spritz it rather than doing nothing. This means you can use
Spray Cleaner to clean bloodied windows, as the janitor gods intended.
It also means you can fill a spray bottle with Napalm, I guess.
refactor: Any cleaning object can now clean a microwave.
/🆑
* Dehardcodes microwave cleaning, allows spray cleaner to work on dense objects such as windows
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Optimization pass focused on foam code (saves about 30% of cpu usage I think) (#76104)
## About The Pull Request
Foam is crummy at high load rn, both because it runs on a low priority
background subsystem, and because it wastes a bit of time.
Let's reduce usage (while speeding up a bunch of other stuff too), and
give it more cpu generally.
[Optimizes reagent processing
somewhat](d409bd4afc)
Turns out most of the cost of foam is the reagents it carries, and the
varying effects they have
I'm doing my best here to optimize them without touching "user space"
too much
That means doing things like prechecking if we're gonna spawn on top of
an existing decal (from glitter, flour, etc), and using that same proc
to also avoid spawning on unacceptable turfs (I had to convert
inheritance to a bitflag system to make this work, but I think that's ok
since we want it imparative anyhow)
It's actually nice for code quality too, since it lets me clean up code
that was using raw locates and weird var pong.
god I wish I had implied types man
[Optimizes foam spreading in its most accursed aspect, reagent
copying](5cc56a64ad)
Holy shit reagent code is a lot.
I'm doing a bunch of small things here. istype in init -> typecache,
removing procs that are called once and loop over a list we JUST looped
over (ph and the caching for reactions in particular)
I am mainly trying to optimize copy_to here, since that's what foam
spams
As a part of this, I removed a pair of update_total and handle_reactions
calls that were done on the reagents we are copying FROM
I have no god damn idea why you would want to do that, but if anything
is relying on the copy proc modifying the source, then that code
deserves to break
Speaking of, I cleaned up handle_reaction's main filter loop a lot,
removed a lot of redundant vars and changed it from a full loop w
tracker vars to an early exit pattern
This meant using a loop label, which is unfortunate, but this is the
fastest method, and it does end up cleaning up the code significantly,
Which is nice
Oh also I made the required_other var function even if there is no atom
attached to the reaction, since I don't see why it wouldn't
This last bit is gonna get a bit esoteric so bear with me
Failing calls (which are most of them) to handle_reactions are going to
be fastest if they need to check as few reactions as possible
One reagent in a reaction's required list is marked as the "primary",
and thus gets to trigger checking it.
We need all the reagents to react anyhow, so we might as well only check
if we have one particular one to avoid double checking
Anyhow, in order to make most calls the fastest, we want these reactions
distributed as evenly as possible across all our reagents.
The current way of doing this is just taking the first reagent in the
requirements list and using it, which is not ideal
Instead of that, lets figure out how many reactions each reagent is in,
then divy reactions up based off that and the currently divvied
reactions
This doubles the reagent index count, and takes the most common reagent,
water, from 67 reactions to I think like 22
Does some other general cleaning in reagent code too, etc etc etc
[Fixes runtimes from the forced gravity element being applied more then
once](941d067611)
I feel like this element should take a trait source or something to make
them potentially unique, it's too easy to accidentally override one with
another
[Removes connect_loc usage in atmos_sensitive, replaces it with direct
reg/unreg](de1c76029d)
I only really used it because I liked the componentization, but it costs
like 0.2 seconds off init alone which is really stupid, so let's just do
this the very slightly harder way
[Micros foam code slightly by inlining a LinkBlockedWithAccess
call](744da3694c)
This is in the space of like 0.05 seconds kinda save so I can put it
back if you'd like, the double loop just felt silly
[Changes how foam processes
slightly](ee5e633e32)
Rather then treating spreading and processing as separate actions, we do
both in sync.
This makes foam fade faster when spreading, which is good cause the
whole spread but unclearing foam thing looks silly.
It also avoids the potential bad ending of foam spreading into itself,
backwards and forwards. This is better I promise.
[Bumps fluid priority closer to heavy eaters, moves it off
background](811797f09d)
Also fixes a bug where foam would travel under public access airlocks.
## Why It's Good For The Game
Saves a lot of cpu just in general, from both init and live.
In theory makes foam faster, tho I'd have to test that on live at
highpop to see if I've actually succeeded or not. Guess we'll see.
* Optimization pass focused on foam code (saves about 30% of cpu usage I think)
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Bloop <vinylspiders@gmail.com>
* Macros multi-z code, removes the false premise of manual offsets (#76248)
## About The Pull Request
[Removes the pretense of relative multiz
levels](0293fdc2bd)
Our multiz system does not support having a z level that is only
connected one way, or which goes down backwards or anything like that.
That's a fiction of the trait system, the actual backend has never
really supported this.
This pr removes the assumptions we were making backend around this, and
uses that to save cpu time.
I am also converting multiz_levels from an assoc list to a pure one,
which saves significantly on access times and cleans up the code
somewhat.
Also I'm making the get_below/get_above procs into macros, for the sake
of cpu time.
[Converts the starlight disease to use BYOND's directional defines
instead of our
own](7d698f02d9)
To some extent spurred on by
https://github.com/DaedalusDock/daedalusdock/pull/298, tho it was known
before
## Why It's Good For The Game
Faster multiz code, faster init, etc etc etc
* modular files how very dare you
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes silly siding sprites (#76586)
## About The Pull Request
Detaches siding code from the macro in #74171 because it wasn't doing
its job properly. I tried to fix it, but I'm not a very good coder and
opted to manually define each of the variations of siding. So this is
more of a bandaid fix than anything.
## Why It's Good For The Game
Fixes#76195, fixes#75059
Correct turf decals look better than wrong ones
look at how much nicer this corner looks now

## Changelog
🆑
image: Siding now uses the correct sprite on corners and endpieces.
/🆑
* Fixes modular icon states
---------
Co-authored-by: norsvenska <73006946+norsvenska@users.noreply.github.com>
* Icon folder cleaning wave one
* Fixe a merge conflict
* Fixes some more merge conflicts
* Fixes some modular icon paths
* Fixes even more modular icon paths...
Hopefully that's the last of them
* Fixes some merge discrepencies
* More merge issues
* ok
* not ok
---------
Co-authored-by: YesterdaysPromise <122572637+YesterdaysPromise@users.noreply.github.com>
Co-authored-by: Giz <vinylspiders@gmail.com>
* Makes decals only caught on mapload & removes turf_loc_check (#76130)
Theres one player-facing change in this PR and it's that I removed human
gibs from being valid in space turfs, making it more consistent with the
other gib decals.
I've cleaned up many instances of decals spawning in bad turfs on
mapload in https://github.com/tgstation/tgstation/pull/75189, but making
it error anytime in-game a decal is put over an invalid turf is bad as
it punishes contributors for not optimizing their decals properly.
This changes it so it only errors if it's on mapload, unit testing or
not.
I've also removed ``turf_loc_check`` and replaced instances of it with
overwriting ``NeverShouldHaveComeHere``, which gives us greater control
of where decals can be placed.
This let me remove 2 subtypes that were made to have decals in specific
places (which then got placed elsewhere, ruining it all).
Mappers are still able to set decals to be placed anywhere, they just
need to add it as a valid turf for that decal.
* Makes decals only caught on mapload & removes turf_loc_check
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
* Proper broken tiles (#75623)

## About The Pull Request
The current broken tiles have some visual issues:
- There is an ambient occlusion shade when it touches normal tile
- It has a layer higher than it should be which leads to things that are
normally above the floor layer, render below it. Such as atmos
machinery, cleanable overlays, etc.
This PR makes the render on a proper layer and work like a partially
destroyed floor tile that can be reclaimed with crowbar.
Also, the cleanables are now on FLOOR_CLEAN_LAYER to make dirt appear
above catwalks and these new tiles.
And the flat dirt now has 4 variants of sprites, while dust uses the old
dirt sprite. It seems like dust was just dirt with different description
before.
## Why It's Good For The Game
A broken tiling with no visual bugs and proper floor-like logic.
## Changelog
🆑 MTandi, Borbop
fix: Dust now has dust icon, instead of dirt icon. Dust on all maps
replaced with dirt
image: Flat dirt now picks from 4 new sprites
refactor: Made broken tiling work more like tiling and have
corresponding visuals. Added directional mapping variants.
fix: Cleanables now use FLOOR_CLEAN_LAYER to make sure that trash is
visible above catwalks
/🆑
* Proper broken tiles
* Update north_star.dmm
* Update north_star.dmm
---------
Co-authored-by: Andrew <mt.forspam@gmail.com>
Co-authored-by: Jolly-66 <70232195+Jolly-66@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Fixes moveloop shit (#75675)
## About The Pull Request
I was using the step_x procs when I should have been using get_step_x
and Move()
This was causing some mob behavior to not properly respect things like
gravity or potentially entered/exited signals.
Also ensures we pass direction into Move consistently, and deletes a
function that was meant to like, use step_to but with directions? Was
never actually used properly
I forgot to properly respect the "don't change dir" flag
Closes#75673🆑
fix: Mobs will fly around space... less
/🆑
* Fixes moveloop shit
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Massive Spraycan and Crayon Powercreep: smaller graffiti cost less to draw. (#75588)
## About The Pull Request
Currently, drawing a small circle on the floor consumes as much charge
as any other drawable but the larger horizontal ones that cost five
times as much, which is a bit dull for non-cyborg players, having to
burn through a ton of spraycans just to cover the floor in several small
dots if ever attempting to do some floor art.
This PR aims to reduce the cost of some of the smaller drawables, like
"shortline", "smallbrush", "pawprints" etc., in virtue of the smaller
area they cover. The balances changes may seem bit of an arbitrary and
not include ones that are a bit on the edge between "small" and not
"small", but I'd rather keep it simple than have other values such like
"semi-small" integrated and snowball this balance PR into a more
finnicky, disputable or not agreeable with version of itself.
This also covers re-coloring and existent graffiti. Currently it always
costs 2 charges to change its color regardless if it costed 1 or 5 to
spray in the first place. With this PR, the costs should match that of
when they were drawn. To boot, It also takes into account the tagger
quirk now.
Code had to be cleaned up and improved a bit for a smoother
implementation of these changes.
A fairly unrelated but small change: Trying to suicide with an empty
spraycan will now fail, because it's empty. It's that simple.
## Why It's Good For The Game
Enables non-cyborg players to engage in jolly floor-vandalizing-art in a
more consistent, slightly more enjoyable way.
## Changelog
🆑
balance: Drawing small graffiti like paw/foot/claw prints, small brush
dots and short lines should cost half as many charges off your spraycan
or crayon.
balance: The cost of recoloring graffiti decals is now consistent with
that of drawing them.
balance: Trying to suicide with an empty spraycan will now fail, because
it's empty. It's just that simple.
/🆑
* Massive Spraycan and Crayon Powercreep: smaller graffiti cost less to draw.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Audio File Cleanup (#74863)
## About The Pull Request
Removes a bunch of sound files that we don't use and moves some sound
files into better locations. I'm hoping to get an archive repo for
sounds going, much like the
[map_depot](https://github.com/tgstation/map_depot) and
[SS13-sprites](https://github.com/tgstation/SS13-sprites).
EDIT: The old sound files are being moved here:
https://github.com/tgstation/SS13-sounds
Also increased the volume of the clownana rustle sound and clipped off
some dead air from shockwave_explosion
## Why It's Good For The Game
Removes a total of 1.95MB worth of unused sound files from the codebase.
## Changelog
🆑 Tattle
soundadd: increased the volume of the clownana rustle
/🆑
---------
Co-authored-by: tattle <article.disaster@ gmail.com>
* Audio File Cleanup
* Fixes the missing sound files ;)
---------
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
Co-authored-by: tattle <article.disaster@ gmail.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.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>
* 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>
* 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>
* 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>
* 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>
* 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>
* 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>
* Reinforced plating for all your Multi-Z mapping needs (#71576)
## About The Pull Request
This PR adds reinforced plating and a corresponding baseturf_helper,
plating that cannot be deconstructed with the RCD and requires a few
steps to degrade to regular plating.
The plating is designed to serve the same purpose as R-Walls but for
verticality. It shares its heat resistance with reinforced floor and
hull, and in texting it can endure a single C4 blast but not X4 assuming
the floor placed on it is already removed.
It is currently is unused on the existing maps due to it being poor
practice to place secure locations that would justify reinforced floors
on the lower Z levels, however I have spoken to people working on maps
actively at the moment and they have express interest in being able to
use these floors.
The plating can be constructed by using 2 sheets of plasteel on standard
plating and is disassembled using wrench > welding tool > crowbar. The
first stage of deconstruction causes the bolts holding the
reinforcements in place to fall to the Z level below playing a sound and
leaving a cleanable decal, adding a audio-visual alert that someone is
about to come through your ceiling.
UPDATE: I've added a ceiling variant of the baseturf editor, this can be
placed on a lower Z level where it will modify the baseturfs of the Z
level above within the original area. This will make it significantly
easier to ensure that you only cover tiles you want reinforced when
protecting lower Z levels.
If anyone has any recommendations for sounds please tell me and I might
swap them out but I think the two I've chosen work well. Additionally if
anyone is able to make a better sprite for the screws or plates then
that'd be a great help but I think the current ones work well enough.
## Why It's Good For The Game
Currently Multi-Z maps have a very tight restriction on where secure
areas can be put, only allowing for them to be placed on the top Z
level, under more secure Z levels or in exterior satellites and coated
with hulls. This is due to standard plating and/or reinforced floors are
very easy to get through without warning if you bring the right tools.
This PR effectively adds R-Walls but for floors allowing mappers to
properly protect lower Z levels from vertical infiltration methods. This
also adds a visual and audible indictor to the deconstruction of
reinforced floor tiles to bring them more in line with the visuals of
deconstructing a wall.
## Changelog
🆑
add: You can now reinforce plating to protect your department from the
troublemakers upstairs. Station builders might find these useful to put
the stations most secure locations on the lower floors.
imageadd: added sprites for reinforced plating
code: RCD proofing has been variablized and can now be applied to any
floor type instead of just reinforced floors.
/🆑
* Reinforced plating for all your Multi-Z mapping needs
Co-authored-by: NamelessFairy <40036527+NamelessFairy@users.noreply.github.com>
* Adds coordinates to the chess and checkers holodeck modules (#70866)
## About The Pull Request
This PR aims to add coordinates on both edges of the preset chess and
checkers (sure, why not) templates used in the holodeck feature: top row
and right column on the inner border of the board; the bottom and left,
just outside it.
## Why It's Good For The Game
This ought to help the player take advantage of the algebraic notation
if they wish to. It also adds, like, an itsy bitsy of decor to both
modules (alas, the checkers module still uses mapedited carboard cutouts
which partially cover some of the letters and numbers, but changing them
is outside the scope of this PR).
## Changelog
🆑
add: Added two sets of coordinates to the checkers and chess modules for
the holodeck.
/🆑
* Adds coordinates to the chess and checkers holodeck modules
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Fix Flypeople food consumption (#71432)
## About The Pull Request
This PR fixes#70716 by having flypeople ingest vomited reagents into
their stomach instead of directly modifying nutrition. To accomplish
this, flypeople no longer vomit their entire stomach contents every life
tick, which also fixes them vomiting immediately on spawn. Instead they
vomit only after taking bites of food.
Since flypeople aren't currently metabolizing food the same way as other
species there's a huge discrepancy in nutrition gained from food. For
example, a human gets 37 nutrition from a slice of pizza and 270
nutrition from a whole margherita pizza, but a flyperson only gets 10
and 70 respectively, meaning they'd need to eat 4 entire margherita
pizzas and slurp up the vomit to go from total starvation to being
satiated again. With this change flypeople get ~190 nutrition from a
whole margherita pizza.
## Why It's Good For The Game
Makes it easier for flypeople to stay satiated without having to consume
mass amounts of food. Also makes it easier and more predictable to deal
with flyperson interactions with other reagents getting in their stomach
- for example, currently taking a happy pill causes flypeople to vomit
due to the sugar.
## Changelog
🆑
fix: Flypeople gain a comparable amount of nutrients from vomited food
to other species (~70%, up from ~30%)
fix: Flypeople no longer vomit after drinking fluids
fix: Flypeople no longer vomit all contents of their stomach on spawn
code: Stomachs can now react to foods entering them by overriding the
`after_eat` proc
/🆑
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
* Fix Flypeople food consumption
Co-authored-by: Roryl-c <5150427+Roryl-c@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>