* [MDB IGNORE] Angled Lights & Lighting Prototyping Tool (#74365)
## About The Pull Request
Hello friends, I've been on a bit of a lighting kick recently, and I
decided I clearly do not have enough things to work on as it is.
This pr adds angle support to static lights, and a concepting/debug tool
for playing with lights on a map.
Let's start from first principles yeah?
### Why Angled Lights?
Mappers, since they can't actually see a light's effect in editor, tend
to go off gut.
That gut is based more off what "makes sense" then how things actually
work
This means they'll overplace light sources, and also they tend to treat
lights, particularly light "bars" (the bigger ones) as directional.
So you'll have two lights on either sides of a pillar, lights inside a
room with lights outside pointing out, etc.

This has annoying side effects. A lot of our map is overlit, to the
point that knocking out a light does.... pretty much nothing.
I find this sad, and would like to work to prevent it. I think dark and
dim, while it does not suit the normal game, is amazing for vibes, and I
want it to be easier to see that.
Angled lights bring how lights work more in line with how mappers expect
lights work, and avoids bleedover into rooms that shouldn't be bled
into, working towards that goal of mine.
### How Angled Lights?
This is more complex then you'd first think so we'll go step by step

Oh before we start, some catchup from the last time I touched lighting
code.
Instead of doing a lighting falloff calculation for each lighting corner
(a block that represents the resolution of our lights) in view we
instead generate cached lightsheets. These precalculate and store all
possible falloffs for x and y distances from a source.
This is very useful for angle work, since it makes it almost totally
free.
Atoms get 2 new values. light_angle and light_dir
Light angle is the angle the light uses, and light_dir is a cardinal
direction it displays in
We take these values, and inside sheetbuilding do some optional angle
work. getting the center angle, the angle of a pair of coords, and then
the delta between them.
This is then multiplied against the standard falloff formula, and job
done.
We do need some extra fenangling to make this all work nicely tho.
We currently use a pixel turf var stored on the light source to do
distance calculations.
This is the turf we pretend the light source is on for visuals, most
often used to make wall lights work nice.
The trouble is it's not very granular, and doesn't always have the
effect you might want.
So, instead of generating and storing a pixel turf to do our distance
calculations against, we store x and y offset variables.
We use them to expand our working range and sheet size to ensure things
visually make sense, and then offset any positions by them.
I've added a way for sources to have opinions on their offsets too, and
am using them for wall lights.
This ensures the angle calculations don't make the wall behind a light
fulldark, which would be silly.
### Debug Tool?
In the interest of helping with that core problem, lights being complex
to display, I've added a prototyping tool to the game.
It's locked behind mapping verbs, and works about like this.
Once the verb is activated, it iterates over all the sources in the
world (except turfs because those are kinda silly), outlining and
"freezing" them, preventing any future changes.
Then, it adds 3 buttons to the owners of a light source.

The first button toggles the light on and off, as desired.
The third allows you to move the source around, with a little targeting
icon replacing your mouse
The second tho, that's more interesting.
The second button opens a debug menu for that light

There's a lot here, let's go through it.
Bit on the left is a list of templates, which allow you to sample
existing light types (No I have no idea why the background is fullwhite,
need to work on that pre merge)
You can choose one by clicking it, and hitting the upload button.
This replaces your existing lighting values with the template's,
alongside replacing its icon and icon state so it looks right.
There are three types as of now, mostly for categorization. Bar, which
are the larger typically stronger lights, Bulb, which are well, bulbs,
and Misc which could be expanded, but currently just contains floor
lights.
Alongside that you can manually edit the power, range, color and angle
of the focused light.
I also have support for changing the direction of the light source,
since anything that uses directional lighting would also tie light dir
to it.
This isn't *always* done tho, so I should maybe find a way to edit light
dir too.
My hope is this tool will allow for better concepting of a room's
lights, and easier changing of individual object's light values to suit
the right visuals.
### Lemon No Why What
Ok so I applied angle lights to bars and bulbs, which means I am
changing the lighting of pretty much every map in the codebase.
I'm gonna uh, go check my work.
Alongside this I intend to give lighting some depth. So if there's room
to make a space warmer, or highlight light colors from other sources, I
will do that.
(Images as examples)

I also want to work on that other goal of mine, making breaking lights
matter. So I'll be doing what I can to ensure you only need to break one
light to make a meaningful change in the scene.
This is semi complicated by one light source not ever actually reaching
fullbright on its own, but we do what we must because we can.

I'm as I hope you know biased towards darker spaces, I think contrast
has vibes.
In particular I do not think strong lights really suit maintenance.
Most of what is used there are bulbs, so I'm planning on replacing most
uses with low power bulbs, to keep light impacts to rooms, alongside
reducing the amount of lights placed in the main tunnels

**If you take issue with this methodology please do so NOW**, I don't
want to have to do another pass over things.
Oh also I'm saving station maps for last since ruins are less likely to
get touched in mapping march and all.
### Misc + Finishing Thoughts
Light templates support mirroring vars off typepaths using a subtype,
which means all the templates added here do not require updating if the
source type changes somehow. I'd like to expand the template list at
some point, perhaps in future.
I've opened this as a draft to make my intentions to make my changes to
lights known, and to serve as motivation for all the map changes I need
to do.
### Farish Future
I'm unhappy with how we currently configure lights. I would like a
system that more directly matches the idea of drawing falloff curves,
along with allowing for different falloffs for different colors,
alongside extending the idea to angle falloff.
This would make out of engine lighting easier, allow for nicer looking
lights (red to pink, blue to purple, etc), and improve accessibility by
artists.
This is slightly far off, because I have other obligations and it's
kinda complicated, but I'd like to mention it cause it's one of my many
pipedreams.
## Changelog
🆑
add: Added angle lighting, applies it to most wall lights!
add: Adds a lighting prototyping tool, mappers go try it out (it's
locked behind the mapping verb)
/🆑
---------
Co-authored-by: MMMiracles <lolaccount1@ hotmail.com>
* [MDB IGNORE] Angled Lights & Lighting Prototyping Tool
* Update north_star.dmm
* Revert "Update north_star.dmm"
This reverts commit bb5b8b5a549f7edc3e23a369a147ed96bab41991.
* Updatepaths
* Update nukie_base.dmm
* Newer version of northstar with the penguins
* Update northstar_cryo.dmm
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: MMMiracles <lolaccount1@ hotmail.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@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>
* Converts sec armories to using the (not) random mapping spawners (#76392)
## About The Pull Request
Title.
## Why It's Good For The Game
Armories aren't really a dense area mapping wise, just a few guns there,
armor there, and some fluff security stuff (like HUDs or whatever).
This PR just converts most of the heavy stuff (armor, helmets, guns)
into spawning helpers with the aim to make mapping armories just a tad
bit quicker and easier.
The only thing this does kinda nuke is the neatly stacked stuff, which
the mapping helpers kinda suck at doing, but its not totally woeful.
## Changelog
🆑 Jolly, timothymtorres
code: Jolly: Armories across all maps have been tweaked slightly. Report
to a Nanotrasen security advisor for any missing guns, armor, helmets or
anything else that was there previously (that means, post an issue on
Github if theres an issue!!)
code: timothymtorres: Random item spawners now support better control of
their X/Y pixel offset.
/🆑
---------
Co-authored-by: Tim <timothymtorres@gmail.com>
* Adds the spawners to the modular armories where applicable
* Update random_spawners.dmi
* grr
---------
Co-authored-by: Jolly <70232195+Jolly-66@users.noreply.github.com>
Co-authored-by: Tim <timothymtorres@gmail.com>
* Machine list is now stored in SSmachines | Remove excessive use of global lists for specific machine types
* Resolve merge conflicts
* Modular adjustments
* destroy this double return on destroy
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Giz <vinylspiders@gmail.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>
* Goliath basic mob (#76754)
## About The Pull Request
Converts Goliaths to the basic mob framework and gives them some new
moves because I can't leave things well enough alone.
I am planning on touching all the lavaland fauna and then maybe even the
icebox ones if I haven't got bored. The Golaith is the first because it
is iconic.
https://www.youtube.com/watch?v=JNcKvMwT4-Q
Here's me getting killed by one as a demonstration. Despite my poor
performance I would contend that they aren't a _lot_ more dangerous, but
they are a little more dangerous.
The chief difference here is that they have two new attacks which they
will only use in response to being attacked.
If fired at from range, they will target the attacker with a line of
tentacles (it doesn't track you, so is easily sidestepped).
If attacked in melee, they will surround _themselves_ with tentacles, on
a longer cooldown.
Something else you may notice in this video: I discovered that basic
mobs are actually _too smart_ to be Lavaland fauna.
Typically (unlike their old form) a mob on our new AI system is smart
enough to attack someone _the moment they come into range_ rather than
only checking on predictable ticks, which would make using the Crusher
an essentially unviable prospect.
To counteract this, Goliaths now have a delayed attack component which
gives you a visual warning and short duration to get out of range before
they swing at you. I will probably put this on all mining fauna that get
reworked, it wouldn't be a terrible thing to put on other mobs to be
honest.
Other changes: The goliath stun is now a status effect with _buckles_
you to the tentacle as if grabbed, as well as its previous effects.
While this seems purely worse, any nearby helpers can now help-click on
you to instantly remove the debuff.
Experiencing the effect of a Lobstrosity Rush Gland makes you immune to
being grabbed by tentacles and an implanted one will automatically
trigger and free you if you are hit, and the explosive effect of
Brimdust also causes the tentacle to retract (although you'd need to
take damage for this to happen). Using the tools of the land, you can
make these creatures less threatening.
The ability for a Goliath to chain-apply the ability has now also been
reduced, it won't refresh its duration if you are hit when already
buckled.
When not occupied hounding miners, Goliaths will intermittently dig up
the asteroid sand and eat any worms that this produces.
I also made some new sprites for riding a Goliath because they've been
broken since the Lavaland mob update and also kind of were ugly before
then anyway:

Other code changes:
- I made an element which only lets an attached object move every x
seconds. This is because Goliaths are far too slow to use the speed
system (the glide just looks bugged as hell) but one thing I am invested
in when converting these is to make sure that they share the same
behaviour when player or AI controlled. This is disabled while you're
riding them because it was interminably slow.
- The Goliath tentacle trail uses a supertype object now shared with the
Meteor Heart which did something kind of similar.
## Why It's Good For The Game
It begins the process of moving one of our larger subsets of NPCs onto
the newer framework for NPC behaviour.
It adds a little bit more life to an iconic but slightly uninteresting
foe which mostly just walked at you slowly.
This PR contains a few components I expect to apply more widely to other
mobs in the future.
## Changelog
🆑
refactor: Goliaths now use the Basic Mob framework, please report any
unusual behaviour.
add: Goliaths learned a couple of new attacks which they will use in
self-defence.
balance: Help-clicking a miner grabbed by Goliath tentacles will
immediately free them, as will the effect of several items you can
scavenge from around Lavaland.
image: New sprites for the Goliath saddle.
/🆑
* Goliath basic mob
* Update ash_rituals.dm
* fixes icon diff
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
Co-authored-by: Giz <vinylspiders@gmail.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>
Various spider fixes (#76528)
## About The Pull Request
Fixes#76484
Then I noticed some weird stuff which slipped through the PR and poked
at that too.
- Spiderlings and Spiders once more have names ending in (###)
- Removed an unused property on Spiderlings.
- Rewrote the descriptions for a bunch of web-abilities and web-objects
to be clearer and have better capitalisation.
- Refactored the "Web Carcass" ability to not extend from "lay web" as
it didn't need to perform most of that behaviour.
- Also I renamed it and made the description give you a hint about why
you would want to instantly spawn a statue.
- The web effigy now despawns at the same rate as the ability cools down
so you're not dumping spider statues all over the place.
- I made spiderlings move at about the same speed as humans except if
they're on webs in which case they're still pretty fast.
To be honest I am not certain an instant statue spawning button is great
to begin with and I didn't even know it was added to the game but I am
not interested in messing much with the balance for now.
This made me look at spiderlings enough that I'm going to try and make a
new sprite for them that isn't awful.
## Why It's Good For The Game
Lets you differentiate individual spiders a little bit.
Makes usage of abilities clearer.
## Changelog
🆑
balance: Guard spider web statues despawn as the ability comes back off
cooldown.
balance: Spiderlings now only move at light speed if they're on webs,
stay safe little guys.
fix: Spiders once again have random numbers after their names.
/🆑
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Mini Fridges now have a grimy subtype, can go over tables, and start off anchored. (#76517)
## About The Pull Request
/obj/structure/closet/mini_fridge is now a clean nice one, which only
spawns beverages and does not have that cockroach reference in the
description, and starts off anchored. now
/obj/structure/closet/mini_fridge/grimy works like the old mini-fridge,
with syndicake, moldy bread, and now the chance of an ACTUAL cockroach.
I've replaced them on maps according to each one's needs, So, as an
example, Northstar gets a regular one (it var edited it before) while
tram maints get the grimy subtype.
mini-fridges now can properly go over tables, so you don't have to
deconstruct said table to put it on top again.
## Why It's Good For The Game
I've found the need for a nice subtype while doing a ruin, and so has a
few other mappers apparently, as northstar had a var edited variant. The
fact that it couldn't go over tables and started off unanchored was
annoying on tram and icebox, where it is present on the kitchen and you
could easily push it to the ground and suffer.
## Changelog
🆑
qol: It has been issued brand new mini-fridges for our active stations,
Featuring more booze and less moldy pizza!
/🆑
* Mini Fridges now have a grimy subtype, can go over tables, and start off anchored.
---------
Co-authored-by: DATAxPUNGED <44149906+DATA-xPUNGED@users.noreply.github.com>
Co-authored-by: Giz <vinylspiders@gmail.com>
* Fixes some inconsistencies with the chaplain revolver and gets rid of a weird ammo define (#76237)
## About The Pull Request
Firstly, I gave the revolver a new sprite. I mean, this isn't so much of
an improvement as it is a reference I wanted to go with, so if people go
'no not a new sprite' I don't mind reverting.
What's the reference? Check the new name I added as a potential name
roll.

Secondly; I applied to the gun itself revenant bane, the ability to
clear runes, and proper magic immunity as a full null rod would enable.
This last bit was a deliberate design choice, but the divine bow has
full magic protection, so I think this is now more of a consistency
consideration compared to the divine bow.
Thirdly, the revolver is a .38 revolver, HOWEVER, it uses a damage
multiplier to bring it back to the damage it did originally. It also
cannot be reloaded without the prayer action. No cheating. Effectively,
this is the same mechanically as it was before.
It rarely does a funny crit fanfare. This does nothing mechanically, I
just thought it was a funny nod to the sprite's reference (and I guess
another game that the crit fanfare is based on). Borrowed parts of the
code and sprite from this April Fool's pr by Wallemations >
https://github.com/tgstation/tgstation/pull/74425
## Why It's Good For The Game
I think this might have been a little forgotten since implementation now
that we have another projectile weapon for the chaplain. So I'm brushing
it up a bit.
## Changelog
🆑
fix: Makes the chaplain's revolver consistent with its immediate
sibling, the Divine Bow, by giving it similar statistics.
code: Makes the chaplain revolver a .38 but prevents it from being
loaded without using the special prayer action. Also applies a damage
multiplier to keep it at the original 18 force. Mechanically, no
different.
sprite: Gives the chaplain revolver a new sprite.
code: Removes an unnecessary admin log when removing runes.
/🆑
* Fixes some inconsistencies with the chaplain revolver and gets rid of a weird ammo define
---------
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
* Destroys /obj/vehicle/sealed/mecha/working with a W80 nuclear warhead (#76296)
## About The Pull Request
Title.
Also, fixes https://github.com/tgstation/tgstation/issues/75568 at the
request of @ TheVekter
## Why It's Good For The Game
This subtype only exists to append ore box behavior and is clearly a
relic of pre-2020 mechcode.
Keeping it around will only make it harder in the future to add new
mechs with ore box support.
## Changelog
🆑
fix: Clarke ore box now has a less confusing dump contents button.
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
* Destroys /obj/vehicle/sealed/mecha/working with a W80 nuclear warhead
* updatepaths
---------
Co-authored-by: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Jolly-66 <70232195+Jolly-66@users.noreply.github.com>
* Fix balloon alert runtime(timer added on deleted object) when spider webs are destroyed by hand (#76255)
## About The Pull Request
**Reproduction**
- Spawn a spider web
- Try destroying it with a wire cutter or any other object, but it must
be by hand
- If you are lucky (50% probability as the web uses the prob() proc) at
the moment the web is destroyed a balloon alert at the same time "stuck
in web" gets called causing the runtime because it added a timer on the
deleted spider web
**Solution**
Use loc for balloon alerts as that does not get deleted.
## Changelog
🆑
fix: fixes balloon alert runtime when spider webs are destroyed.
/🆑
* Fix balloon alert runtime(timer added on deleted object) when spider webs are destroyed by hand
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Expanding the Experimental MODsuit Bepis Node with three new modules. (#75801)
## About The Pull Request
So, I've had this idea to make a contribution to the Bepis feature with
some modsuit stuff. The gimmicky stuff is ok and a good way to even out
the better content since it has game of chance design it has (you can
find those disks in space anyway so...). However, the Experimental
MODsuit node feels very underwhelming right now, compared to how big
that feature is.
This PR adds three MOD modules to the Experimental MODsuit node, plus
two more:
- Magneto Charger: While the Modsuit is activated, each step the user
takes will charge the installed power cell by a tiny bit, enough to
sustain a standard modsuit of generic slow speed with only a few, easy
modules installed. It won't work in zero G, while flying, pulled by
someone else, on a conveyor belt, riding a vehicle or crawling on the
floor, though.
- Recycler: It collects (most) garbage and casings off the ground and
recycles them into material sheets that can be dispensed on an adjacent
location or storage with with Middle Mouse Button. Doesn't clean debris,
and scuffed because most trash doesn't yield material anyway.
- - It also has two subtypes, unbound from the node: one that dispenses
riot foam darts and can be found on the black market, and another that
dispenses the more innocuous foam darts, rarely found in maints.
- Shooting Assistant: A configurable module. On Stormtrooper mode, it
will give the user a faster fire rate (the double tap trait) at the cost
of accuracy. On Sharpshooter mode, it will improve the user accuracy and
make their shots ricochet against walls at least once (if the hit atom
allows that, that is, e.g. lasers don't ricochet against iron walls), at
the cost of movement speed. Both modes also prevent the user from dual
wielding guns.
To make the Stormtrooper mode stackable with the poor aim quirk and
refrain from making a new trait for the sharpshooter mode, the gun
spread code in gun.dm has also received a little refactor and cleanup.
Also, it's been tested.
## Why It's Good For The Game
The Experimental MODsuit node is quite shabby and could use something
extra to make it more appealing to MODsuit enjoyers.
Also doubles down as a small addition to the black market and maint
loot, and code cleanup, since gun code gives off some garbled vibes.
## Changelog
🆑
add: Expanded the Experimental MODsuit Bepis node with three new
modules: Magneto Charger, Recycler and Shooting Assistant.
add: Added a Riot Foam Recycler module to the black market, as well a
more innocuous version as maint loot.
/🆑
* Expanding the Experimental MODsuit Bepis Node with three new modules.
* update modular, I hate this file btw
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
* Maptext 2023 tweaks [NO GBP] (#76397)
## About The Pull Request
- In PR https://github.com/tgstation/tgstation/pull/76356 missed a few
bits of maptext around, such as shuttle signs and the supermatter. Small
text adjustments/fixes here.
- Large amount of feedback about the context tooltips. Increases size,
lightens default color as to not be too imposing.
🆑 LT3
qol: Context tooltip size increased
fix: Fixed remnants of old maptext code on various things
/🆑
* Maptext 2023 tweaks [NO GBP]
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
Now that I know it works, final touches:
- [x] Went over the code to see if anything can be made better
- [x] Added back emagging with toned down, less destructive rewards
- [x] Added the arcade machine into research and as a spawn
- [x] Tested everything
(Mainly just stuff I forgot because I went thru like 70 errors and was
tired of it)
## Changelog
🆑
add: Minesweeper arcade machines finally introduced to the station
add: Reported overheats of certain minesweeper machines as a result of
tampering
/🆑
* 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>
* Optimizes timer insertion by 80% (W QDEL_IN micro) (#76214)
<!-- 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
[Reduces timer insertion cost by
80%](c9e5b285ed)
Timer name generation involved a LOT of string shit, some in ways where
the string only existed for a moment.
This costs a good bit of time, and can be reduced with only minimal
impacts on the end product, so let's do that. Includes a compile flag to
flip it back if we ever have trouble in future.
This is about 0.1s off init, since we do a lot of timer stuff then too
[Removes STOPPABLE flag from QDEL_IN, moves it to a bespoke
macro](e7a5d7f2a7)
Its a waste most of the time, tho I would LOVE to analyze at compile
time to work out if we care
## Why It's Good For The Game
I like it when we don't spend all of our cpu time just setting the name
var on timers. that's good and not bad.
This saves time fucking everywhere. 15% off explosions, 0.1 seconds off
init, bunch of time off foam. it's just good.
Cherry picked out of #76104 since that was too cluttered (sannnnnn)
<!-- 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. -->
<!-- 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. -->
* Optimizes timer insertion by 80% (W QDEL_IN micro)
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Lighting object oddities (#76009)
## About The Pull Request
Fire stacks status effect no longer uses a weakref for the mob light, I
am pretty sure there was no real reason to use a weakref there.
Deleted weird luminescent glow dummy, now it just uses the standard
moblight obj.
Put all /obj/effect/dummy/lighting_obj together in a single file and
added a comment explaining why they exist.
(I severely dislike the /obj/effect/dummy typepath, but I am very much
unsure if just replacing all of them with /obj/effect/abstract would
break shit)
## Why It's Good For The Game
Code organization good
* Lighting object oddities
* Update kindle.dm
---------
Co-authored-by: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* The Forbidden Tuna Can (#76064)
## About The Pull Request
This PR was made to replace the well known uglymine sprite with
something that doesn't look like a coder-sprite filler and instead looks
like an actual landmine. Simple as that, there's not really anymore meat
to this PR.

## Why It's Good For The Game
Replaces an older, depreciated sprite with something that has needed an
upgrade for quite a long time now.
## Changelog
🆑
image: Added a new Land Mine sprite
/🆑
* The Forbidden Tuna Can
* update modular
---------
Co-authored-by: Youtubeboy139 <jared.klaas@gmail.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
* Stops particle holders from appearing on context menu (#76006)
## About The Pull Request
Basically, due to carbons using KEEP_TOGETHER, particles were appearing
on the context menu which is annoying. I have no idea why it behaves
like this.
Buuut, giving particle holders the KEEP_APART flag does fix this.
closes https://github.com/tgstation/tgstation/issues/75641
## Why It's Good For The Game
Bugfix good
## Changelog
no
* Stops particle holders from appearing on context menu
---------
Co-authored-by: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
* Fixes hungover closet spawner? (#76003)
## About The Pull Request
I don't have proof this is bugged, but does anyone have any memory of
this actually working?
`in contents` doesn't work? It's a landmark? There are no closets in the
contents of the landmark? Surely it should be looking at the contents of
the turf?
## Why It's Good For The Game
Makes this thing work?
## Changelog
🆑 Melbert
fix: Fix hungover people never spawning stuck in closets
/🆑
* Fixes hungover closet spawner?
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@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>
* No more un-pulsable syndicate anomalies (#75723)
## About The Pull Request
Prevents anomalies from spawning with the frequency 121.3, which you
can't select using signalers since it's a syndicate frequency. Switches
to using the sanitize_frequency proc since it covers this and the "only
uneven frequencies" check.
Alternatively, it might make sense to remove the frequency limitation
with signalers, as I don't believe there's any non-radio devices that
rely on signals on the syndicate frequency, and it's rather unintuitive
to have a frequency that just can't be selected without any feedback.
But I don't know enough about the relevant functionality to know if that
might break something.
## Why It's Good For The Game
Fix bugs. We can't let the syndicate keep getting away with this.
## Changelog
🆑
fix: Anomalies shouldn't spawn with frequencies that can't be selected
on signalers anymore
/🆑
* No more un-pulsable syndicate anomalies
---------
Co-authored-by: FlufflesTheDog <piecopresident@gmail.com>
* Adds a variable that allows invisible portals (#75712)
## About The Pull Request
Adds simple var that allows a portal to be without the spark effect
## Why It's Good For The Game
Because I am going to make an noneuclidean station with portals, and
sparks make it too obvious
## Changelog
🆑
qol: Admins can make a portal not spark when teleporting
/🆑
* Adds a variable that allows invisible portals
---------
Co-authored-by: Kubisopplay <38842052+Kubisopplay@users.noreply.github.com>
* Removes poseur tag graffiti (it's been dead for ~6 years Edition) (#75689)
## About The Pull Request
The _poseur tag_ graffiti option was not removed in the gang gamemode
removal back in #30056. Back then it would have chosen one of the gangs'
tags to mimic. Now, if selected, it will create an empty graffiti. This
will also apply to any mapped/generated graffiti. This sucks and this
derailed me from my other thing I was doing in the crayons.dm vicinity.
## Why It's Good For The Game
Removes a 6-year-old non-functioning graffiti option.
## Changelog
🆑
fix: exorcised a ghost of the gang gamemode from graffiti
/🆑
* Removes poseur tag graffiti (it's been dead for ~6 years Edition)
---------
Co-authored-by: Sealed101 <cool.bullseye@yandex.ru>
* Adds Ethereal Drinks (#75487)
## About The Pull Request
Adds 3 new electric-themed drinks for ethereals. They count as food for
etherials, (not much, one glass is about equivelant to a plasma burger),
but humans can drink them as well, among other effects.
## Why It's Good For The Game
As an ethereal player, I do feel while our food is convenient, that we
miss out on the RP other species get from going to the bar. This allows
for etherials to order drinks from the bartender. All effects work on
all races, with the hunger satiation as the exception.
## Changelog
🆑
add: Voltaic Yellow Wine - New "base" drink, found in booze-o-mat. No
special effects besides acting as a weak ethereal food. Not very potent
in terms of alcohol.
add: Telepole - New mixed drink themed after thunderstorms, gives the
same shock-resist grey bull does. Made from 1 part Voltaic Wine, 1 Part
Sake, and 2 parts Dark & Stormy. Moderately potent.
add: Pod Tesla - New mixed drink, themed after the old removed tesla
engine (the singulo gets a cocktail, it should too!) Grants a brave -
bull phobia resist, and a stronger grey bull shock resist allowing you
to (temporarily) resist tesla arcs from reactive armor and the SM's
tesla coils. Gives a pleasant thought to whoever drank it, because this
thing is a pain to make. Made from 5 parts admiralty, 5 parts telepole,
and 3 parts brave bull. Highly potent.
qol: Unsure if this counts as QOL or balance, but the fact sol dry is in
3 different cocktails but the bartender has to buy 30u cans of it made
me feel it deserved being added to the soda dispenser.
image: Added graphics for the above drinks, shown below, from left to
right: Pod tesla, Voltaic Yellow wine, Telepole, Voltaic Wine (bottle)
<img width="171" alt="image"
src="https://github.com/tgstation/tgstation/assets/69398298/901b2f64-1723-44b6-8f78-ef21bd477d96">
/🆑
---------
Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@ users.noreply.github.com>
* Adds Ethereal Drinks
---------
Co-authored-by: KingkumaArt <69398298+KingkumaArt@users.noreply.github.com>
Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@ 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>