Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Infinite Gun Culling: Gun Kit Edition #56133

Merged
merged 4 commits into from
Jan 15, 2021
Merged

Infinite Gun Culling: Gun Kit Edition #56133

merged 4 commits into from
Jan 15, 2021

Conversation

necromanceranne
Copy link
Contributor

About The Pull Request

Every prototype firearm in the game now utilizes crafting to construct it, usually sacrificing a standard version of that firearm in order to produce the new one. The guns are made using gun part kits you print from the security protolathe (or buy, in the case of hellfire lasers).

The weapons that utilize Energy Guns in their crafting include:

  • Advanced Energy Guns (duh)
  • Temperature Guns
  • Particle Acceleration Rifles

The weapons that utilize Laser Guns in their crafting include:

  • X-ray Laser Guns (duh again)
  • Hellfire Laser Guns (this is a given)
  • Decloner
  • Ion Carbine

Some weapons are outliers and use different parts

  • Particle Acceleration Rifles use a flux anomaly and a gravity anomaly as part of their construction.
  • Tesla Revolvers use flux anomalies as part of their construction and need no other gun. You build the gun around the anomaly!
  • Decloners require 40 units of mutagen (their old protolathe recipe) and 30 units of baldium (ayy lmao).
  • Energy Crossbows require a Proto-Kinetic Accelerator and 15 units of radium to construct.

In addition:

Hellfire Laser Guns now come as gun part kits and are significantly cheaper as goodies.

Energy Crossbows (the big ones) are bulky. They are called large for a reason.

Every weapon that was printed from the lathe now actually spawns with a firing pin when constructed.

Why It's Good For The Game

20210113_023931

@Timberpoes I've somewhat disappointed you in NOT making them use anomalies but...

I didn't think it entirely fair to lock x-rays behind specifically the limited station supply of anomalies, but I did think they should be more limited. Now, they're limited by station supply and cargo credits. All the more reason for security to contribute to the station funds.

Real Talk
Somewhere along the lines we decided that printing out Saber SMGs from the science protolathe was a bad idea, but yet here we are with a ton of some quite powerful weapons freely printable from our current lathes. Then we moved our guns to the security protolathe and the results were pretty much roughly equivalent in my opinion, a gun printer is a gun printer whether it's in science or security, and a bunch of easily produced guns is easily produced guns for the whole crew. If we want to limit weapon access, we can't have these weapons stay in the state they're in. Not if we want cargo to represent an important part in gun distribution.

On the other side of this coin, I am fairly sure I heard people calling for the removal of beam rifles all the way back when I started playing the game in mid 2018. They rendered blob a cakewalk, and you had plenty of firing pins to just print off half a dozen and decimate any blob threat on the station regardless of where they are or how well they're doing. This change doesn't stop them from being good against blobs, but it should help justify giving beam rifles a broader niche than JUST blob killing, since I'm of the opinion they were deliberately handicapped explicitly because of their mass producibility. It is out of scope for this PR, but I hope this will give some justification for making the beam rifle a weapon worth using in a separate PR.

Changelog

🆑
add: Guns are no longer directly printable from the protolathe.
add: Gun kits to craft the various prototype firearms once printable from the security protolathe.
balance: Large energy crossbows now are bulky, like most other printed weapons.
balance: Crafted weapons now come with a firing pin.
/:cl:

@tgstation-server tgstation-server added Balance Changes to functionality that modifies how effective certain methods are at powergaming Feature Exposes new bugs in interesting ways Sprites A bikeshed full of soulless bikes. labels Jan 12, 2021
@necromanceranne
Copy link
Contributor Author

gun kit

@Son-of-Space
Copy link
Contributor

Making it so every gun starts with an electronic pin is a pretty big balance change.

Currently, you have a limited number of non-mindshield firing pins, which are available in a separate room (Secure Gear Storage).

If the advanced guns are researched, you also have the mindshield pins, but those only work on mindshielded people, and there are a limited number of extra mindshields.

So what this means, effectively, is you can mass print weapons to hand out to the entire crew with no recompense on modes like nukies, wizard, revolution, cult, etc.

Everything else is great imo, but I have serious problems with the pins.

@necromanceranne
Copy link
Contributor Author

necromanceranne commented Jan 12, 2021

There is literally zero net loss or gain in weapons with these changes, so if you had the base weapons to begin with, you are effectively taking them and making them into a new weapon.

It wouldn't matter if the kits produced guns with pins or not. They used weapons with pins to begin with. And if you mulched you gun without a pin to put into your new gun, that's...just kind of a feels bad, you know?

Also, just take out the pins in your current weapons if you wanna use mindshield pins. It's a craft recipe.

Edit: I tell a lie, the telsa revolver definitely makes a new gun, but you can have at maximum 8 in the round PERIOD. I don't foresee this being a problem.

@Son-of-Space
Copy link
Contributor

I don't understand what you're saying. Do the recipes require the gun to have the pin installed? If so, make the recipe either have a pin or not have a pin based on if the base gun had a pin.

You're wrong to say that having the pins at the start isn't a massive buff. Previously, you had to use the limited supply of pins if you wanted to distribute weapons from the lathe. Now, every weapon that can be printed from the lathe can be mass distributed. Not good.

@Son-of-Space
Copy link
Contributor

Son-of-Space commented Jan 12, 2021

Are you saying that using a gun kit installs a pin here?
image

If so then I retract my comment, but you should still have the kit check if the base gun has a pin and make the new one accordingly.

@Tlaltecuhtli
Copy link
Contributor

why not attackby on gun with mod?

name = "Tesla Revolver"
tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
result = /obj/item/gun/energy/tesla_revolver
reqs = list(/obj/item/assembly/signaler/anomaly/flux = 1,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this garbage of gun really need an anomaly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you read the open post? I said adding anomalies to the recipes gives reason to make these weapons better. They suck right now because they've been hugboxed to shit.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but this pr doesnt make them better, and i imagine nobody will care enough to buff it

Copy link
Contributor Author

@necromanceranne necromanceranne Jan 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't want to do too much in one PR. If I overbloat this one with a bunch of unrelated balance changes, it'll only slow things down. One step at a time.

Besides, if they were too shit to use before, you wont miss them when they're harder to make and have yet to be buffed back up. You could also do the job yourself if you feel so inclined.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ill buff them eventually if no one else does

@necromanceranne
Copy link
Contributor Author

necromanceranne commented Jan 12, 2021

why not attackby on gun with mod?

I've been asked to not use slapcraft so shrug.

You're wrong to say that having the pins at the start isn't a massive buff. Previously, you had to use the limited supply of pins if you wanted to distribute weapons from the lathe. Now, every weapon that can be printed from the lathe can be mass distributed. Not good.

You seem to be confused as to how this process is working, so lemme re-articulate this as best I can.

You use the kits you print out of the protolathe as an ingredient in the recipe for making the weapon you want from the kit. This includes guns previously printed directly from the protolathe. The protolathe no longer prints the guns. Only the parts to make the guns.

To do this, many of the recipes use either a laser gun or an energy gun. Yes, the end result might grant said weapon a firing pin. But the recipe weapons that you use to make your new weapon will, upon initialization, have a firing pin added to those weapons.

Every single energy gun or laser gun that appears in the game roundstart will have a firing pin. If somewhere in this process said firing pin is removed, I literally don't fucking care. What does it matter? That's an outlier situation not worth worrying about because few people deliberately go out of their way to unpin the station weapons to leave them unpinned on purpose. There are plenty more lasers where that came from, and under most any other circumstance, if you managed to acquire that energy gun or laser gun, chances are it has a firing pin already, and thus is an entirely workable weapon as is for your shooting needs. They come in cargo crates pre-pinned. They spawn in the armory pre-pinned. I picked them explicitly because they are so ubiquitous and reasonable to acquire.

Does that help?

@Son-of-Space
Copy link
Contributor

Yup! We're good!

@ATH1909
Copy link
Contributor

ATH1909 commented Jan 12, 2021

"Particle Acceleration Rifles use a flux anomaly and a gravity anomaly as part of their construction."
Blob winrate skyrockets to 200%.

Forgive me if this sounds dumb, but, uh, how is the crew currently expected to deal with a blob WITHOUT spamming beam rifles?

Also, uh, making PARs require both a flux anomaly AND a gravity anomaly is a bit TOO excessive, IMO. Wouldn't making them require either a flux anomaly OR a gravity anomaly be more reasonable?

@ShibaInuLord
Copy link

"Particle Acceleration Rifles use a flux anomaly and a gravity anomaly as part of their construction."
Blob winrate skyrockets to 200%.

Forgive me if this sounds dumb, but, uh, how is the crew currently expected to deal with a blob WITHOUT spamming beam rifles?

literally everything else

@necromanceranne
Copy link
Contributor Author

Lasers are usually pretty good. I've seen blobs lose to crew without beam rifles. I genuinely do not believe you need to have them. But when they pop up, beam rifles are typically a death knell for the blob.

If they only thing keeping blobs from autowinning is an autoloss in the form of a beam rifle, that's...entirely unrelated to this PR and is in fact a good time to have a hard look at the balance of blob.

@Tlaltecuhtli
Copy link
Contributor

can you set the craft time to something normal like 5s instead of 20 whole second standing still?

@SkeletalElite
Copy link
Contributor

Too bad someone has to actually research the tech for these guns first before someone could even think of getting a new gun and that happens almost never.

@CRITAWAKETS
Copy link
Contributor

  • Particle Acceleration Rifles use a flux anomaly and a gravity anomaly as part of their construction.

the worst weapon in the game which can literally only kill blobs who suck and nothing else now costs more than the phazon, sounds good to me

@necromanceranne
Copy link
Contributor Author

necromanceranne commented Jan 13, 2021

  • Particle Acceleration Rifles use a flux anomaly and a gravity anomaly as part of their construction.

the worst weapon in the game which can literally only kill blobs who suck and nothing else now costs more than the phazon, sounds good to me

I'm not going to repeat myself a whole ton on this, as I specifically mentioned beam rifles in the PR body and why they are so weak being as a direct result of their mass production issue, but I'm not touching specific gun balance in a general gun restriction pr. I totally acknowledge that the weapon is terrible beyond blob. I also don't think making any changes to that in this PR is a wise decision.

can you set the craft time to something normal like 5s instead of 20 whole second standing still?

An improvised shotgun takes 10. I figured if putting one together is 10 seconds, taking one apart is maybe roughly the same. So 20.

@D4C-420
Copy link
Contributor

D4C-420 commented Jan 13, 2021

Correct me if I’m wrong but are firing pins not the way guns are limited? By stopping sec from printing off a mind shielded firing pin you can prevent this infinite gun issue. Cargo can already buy more firing pins. Rather than forcing sec to waste time crafting new guns (and preventing the distribution of guns during say nuke ops by limiting their numbers severely ) behind an already time limited gate just remove some of the round start firing pins (leave like 1-2 in case of the need for replacement) and take out test range (because an Emag just makes them regular firing pins and sec will abuse that) and mind shielded firing pins. That way they still have to bother cargo for firing pins to make actual use of the guns.

Tldr: just remove printable firing pins if you don’t want sec from printing guns for themselves and remove a few roundstart firing pins from the armory to prevent mass distribution of guns to the crew.

@necromanceranne
Copy link
Contributor Author

necromanceranne commented Jan 13, 2021

Correct me if I’m wrong but are firing pins not the way guns are limited? By stopping sec from printing off a mind shielded firing pin you can prevent this infinite gun issue.

I was saying to people in coding-general how often mindshield pins don't really do their job very well in being a way to prevent people from getting access too these weapons, since any roundtype that relies on mindshields often end far too quickly for mindshield pins to see use. They're late, late tech, and a lot of these guns are as well. Cult and Rev rounds end very quickly, or stagnate hard, preventing any research being done in the first place. But once you have them, the mindshield pins allow security to never bother with cargo.

I personally would actually like to see mindshield firing pins be available earlier than later rather than remove them outright or use them as the basis of gun availability balance. Allow security the chance to get their weapons secured in time for opponents who might want to grab them from their corpse, and not force a premium item into being a balance point for guns as a whole.

Something like mindshield pins should be a QoL benefit for security and an effective sidegrade at most to the standard electronic pin. The merit of the item is there, but they're used for an entirely different purpose and not very well at that. So I'd prefer to see them made better than removed outright.

Cargo can already buy more firing pins. Rather than forcing sec to waste time crafting new guns (and preventing the distribution of guns during say nuke ops by limiting their numbers severely ) behind an already time limited gate just remove some of the round start firing pins (leave like 1-2 in case of the need for replacement) and take out test range (because an Emag just makes them regular firing pins and sec will abuse that) and mind shielded firing pins. That way they still have to bother cargo for firing pins to make actual use of the guns.

Tldr: just remove printable firing pins if you don’t want sec from printing guns for themselves and remove a few roundstart firing pins from the armory to prevent mass distribution of guns to the crew.

This is an entirely arbitrary limitation achieving the same results but with less player signposting as to what the next step in the procedure is to getting an operational new weapon, while attached to a fairly redundant system to begin with. I'll leave cargo gun bloating issues to cargo balance, and remove security gun bloat as an additional factor. It seems like a win-win for weapon control to make cargo the sole domain for gun acquisition, since it is less factors to have to worry about.

Moreso, cargo gets a significant discount if they're ordering electronic firing pins compared to ordering guns wholesale. If security is printing the guns, you're paying maybe a 10th of the price of a gun out of cargo per pin in actual credits, while the only limit for security gun printing is material costs. If cargo is flushed enough to be ordering pins en-masse, it's a safe assumption security has the materials to print off guns too.

This method at least keeps it 1:1 since a gun is consumed in the process of making the experimental weapons, and so the security weapons don't jeopardize cargo gun credit values in any way. The alternative to this is charging the full price of a gun per firing pin, which is I guess an option but a shitty option only because none of the pins in a round are actually recoverable once used, as well as the spaghetti weirdness that occurs every so often as a result of gun operation being reliant on the contents of those guns. Like when material datum was first introduced, and guns were being bricked when blown up from their pins + cells being deleted, which couldn't be reversed. Oddities like that wouldn't happen if it wasn't using actual objects for the same functionality.

(I've also never seen the experimental weapons make much of an impact in nukie rounds. they are all too expensive per node most of the time and you're only reasonably able to rush toward WT-550 ammo in a war round a lot of the time, unless you're using bombs)

@D4C-420
Copy link
Contributor

D4C-420 commented Jan 13, 2021

@necromanceranne thanks for the explanation on why you did this like ya did. Was mainly wondering why not use the already in place system for limiting the amount of guns. Was not aware of the code issue I’m not on the discord or even understand a tenth of the code.

On a side note you would be a dick for doing it but it’s is possible to rush up to advance weapons with the aid of strange objects, toxins and Xenobiology. Wether or not mining has gotten enough ore to print shit is a separate issue.

@Pugie
Copy link

Pugie commented Jan 13, 2021

Yep, this PR sounds good to me, infinitely printed guns at techlathe always seemed dumb to me.

@Tlaltecuhtli
Copy link
Contributor

can you mappedit revert the seclathe in armory change from #55886 ? as the guns are no longer printable without having a gun in your hand already so there isnt a need to lock modkits in armory, solving the OP's issue and making rest of the printable items available without warden supervision

@wesoda25
Copy link
Contributor

This is good except particle acceleration rifles should not call for two anomalies. AFAIK that’s currently unprecedented, and beam rifles aren’t powerful enough to justify such a thing.

@Son-of-Space
Copy link
Contributor

Son-of-Space commented Jan 13, 2021

That PR only just got merged, why would I add a revert in this one?
cause the point was to have funny printable guns more restricted, but this does it already

If you paid attention, you'd have realized that the PR moved the lathe back to the offices before it was merged.

Stop trying to get other people to revert work that was literally just done, Tlal. That's a scumbag move.

@necromanceranne
Copy link
Contributor Author

This is good except particle acceleration rifles should not call for two anomalies. AFAIK that’s currently unprecedented, and beam rifles aren’t powerful enough to justify such a thing.

I have spoken already that any change to beam rifles is out of scope for the pr. This should serve as justification for improving them. It is unprecedented, but that's what lends credit to making them stronger possibly.

@ATH1909
Copy link
Contributor

ATH1909 commented Jan 14, 2021

This is good except particle acceleration rifles should not call for two anomalies. AFAIK that’s currently unprecedented, and beam rifles aren’t powerful enough to justify such a thing.

I have spoken already that any change to beam rifles is out of scope for the pr. This should serve as justification for improving them. It is unprecedented, but that's what lends credit to making them stronger possibly.

Can't you just... put the cost increase in the same PR that buffs the beam rifle?

Make the beam rifle cost ONE of either of those two cores to build if you're worried about bullying blobs. Make it cost TWO cores in whatever future PR you make that buffs beam rifles. There's no need for it to undergo a period of being insanely overpriced for what it does.

@ATH1909
Copy link
Contributor

ATH1909 commented Jan 14, 2021

Also, uh, are you sure that it's a good idea to even HAVE a gun in the game that's of a power level appropriate for the expenditure of two specific kinds of anomaly cores? Like, unless you turn the beam rifle into a goddamn taser or a no charge up time, rechargeable missile launcher or something, it's not gonna be worth the time and effort (and wrangled cats) you'd have to go through to obtain it. I really don't think that that much power should be in the hands of a single person/gun.

@ghost
Copy link

ghost commented Jan 14, 2021

cool story ath

@wesoda25
Copy link
Contributor

I have spoken already that any change to beam rifles is out of scope for the pr. This should serve as justification for improving them. It is unprecedented, but that's what lends credit to making them stronger possibly.

??? Or instead of nerfing them to force a buff, you could just make them use one anomaly so that they remain balanced.

@necromanceranne
Copy link
Contributor Author

necromanceranne commented Jan 15, 2021

You'll get used to it. I've made my point at least three times now. I'm not arguing it further.

@ATH1909
Copy link
Contributor

ATH1909 commented Jan 15, 2021

You'll get used to it. I've made my point at least three times now. I'm not arguing it further.

if we'll "get used to it", how is it supposed to passive aggressively nudge people into maybe deciding to buff the beam rifle?

@Timberpoes
Copy link
Member

Okay.

It'll make the armory more important, sec may now need to protect it better or alternatively interface with cargo for weapons out of necessity instead of convenience.

I want to see how this shakes up the meta, Also allows for more streamlined changes to weapons - They can be nerfed with additional crafting requirements and buffed with additional power which can be locked behind additional crafting requirements.

@adamkad1
Copy link

xray guns are kinda eh, particle rifles needing a core means blobs are going to win all the time now

FernandoJ8 pushed a commit to FernandoJ8/tgstation that referenced this pull request Apr 13, 2022
* throw_at() will not quickstart a throw if the throw was triggered from the same stack as SSthrowing/fire() (tgstation#56004)

throw_at will not quickstart a throw if the throw was triggered from the same stack as SSthrowing/fire()

Infinite throwing loops are fine, as long as they don't loop at the stack level.

* what did he mean by this (tgstation#56042)

Potato goofed 7 months ago so here's a fix (Fridges were defaulting to a force of true, which was... jank)

* Automatic changelog generation for PR tgstation#56042 [ci skip]

* Banana & peel resprite. (tgstation#56015)

imageadd: Bananas & peels have been resprited.

* Automatic changelog generation for PR tgstation#56015 [ci skip]

* fixies (tgstation#56054)

You can now ride the banana glutton properly.

* Automatic changelog generation for PR tgstation#56054 [ci skip]

* Adds Rocket Backblast (tgstation#55681)

This PR adds the backblast element, which when attached to a gun, creates giant plumes of fire when said gun is fired. The PM9 rocket launcher that nuke ops can buy kinda sucks and even a direct hit with the standard rockets loaded isn't enough to guarantee a one-hit crit on a direct hit against an armored opponent, which sucks for how much you pay for it. In that vein, I've also buffed the standard rockets a bit, they now do 50 brute up from 30 on a direct hit, and they create flames on their explosion.

Also makes a tweak to /proc/get_turf_in_angle(), since tile coordinates start at 1,1 instead of 0,0 that proc is now clamped to min 1,1 rather than 0,0

* Automatic changelog generation for PR tgstation#55681 [ci skip]

* Sticky syndicate access (tgstation#56032)

Adds sticky access. Sticky access will be readded if removed in the identification console. Currently only used to fix tgstation#54429. Also converts some comments in card_ids.dm to DMdoc comments and adds some new ones.

* Automatic changelog generation for PR tgstation#56032 [ci skip]

* Fix wheel error for ci_suit workflow (tgstation#56053)

Adds wheel package since its required by some setup.py
Workflow run with this option added: https://github.com/Gamer025/tgstation/pull/1/checks?check_run_id=1672278250

Gets rid of all the
error: invalid command 'bdist_wheel'
errors in the ci_suite workflows

* Tweak the RD's suplexing ability into a skillchip (tgstation#55870)

Although this doesn't change the power level of the Research Director,
it's important to rework "job title" checks into traits or something
similar.

Moving job title specific behaviour out of checks by job name and into
traits means there's more flexibility to trigger behaviour. If an admin
feels the station really needs the ability, they can var edit it in, or
spawn the chip.

* Automatic changelog generation for PR tgstation#55870 [ci skip]

* tgui: List Input (tgstation#56065)

Ported over from https://gitlab.com/cmdevs/colonial-warfare/-/merge_requests/613 which provides an input box to select an option from a list.
Has a search bar to allow filtering for results and an onKeyDown event to replicate default behaviour from the default list input boxes that BYOND provides (where you are able to type the first letter of an element in the list and it'll jump to the first element that matches and then the next and so on)
Right now, it is only applied to the holopad and "Drop Bomb" verb for administrators.

Credits to bobbahbrown for the Loader element from AlertModal.js which allows for a timed input (was needed on the CM codebase for timed inputs) and for the majority of the DM code.

Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Aleksej Komarov <stylemistake@gmail.com>

* Automatic changelog generation for PR tgstation#56065 [ci skip]

* Sets the charset and collation for the SQL schema to utf8mb4 (tgstation#56060)

Changes the charset and collation in the SQL schema to utf8mb4 (which is default in ubuntu 20.04 and debian 10 for MariaDB). This solves all the problems with russian or other non-latin1 characters in many cases related to the use of the database, because surprisingly the rest is already ready for such use cases.

I am not adding any SQL script to migrate from latin1 to utf8mb4, as this is an extremely destructive action. It must be performed manually with the data of all tables backed up before doing so.
However, this can be done by using the following queries, one time for database:
ALTER DATABASE databse_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
and one for each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

* [READY] Nukes archeology component and icon_plating and environment_type in favor of base_icon_state. Dig behaviour code improvement (tgstation#55819)

* aa

* Removes archeology component. Nukes icon_plating and environment_type in favor of base_icon_state

* Actually maybe lets not use a proc for updating asteroid icon state when its dugged up

* Update plating.dm

* Automatic changelog generation for PR tgstation#55819 [ci skip]

* Correctly transfer skillchips when ahealing someone (tgstation#56064)

When ahealing someone via the player panel their skillchips weren't transfered correctly.
The actually skillchip object was left in the old brain and eventually hard deleted.
This caused a runtime when ahealing someone a second time (after the harddel).
This then caused the target to actually have 2 brains because of the runtime while ahealing

* Automatic changelog generation for PR tgstation#56064 [ci skip]

* Telekinesis can throw non items (vending machines, lockers) only 1 tile far (tgstation#56063)

Telekinesis users can now only throw items 10 tiles, everything else can only be thrown 1 tile

* Automatic changelog generation for PR tgstation#56063 [ci skip]

* Fixes 2 really annoying cytology virus bugs. (tgstation#56062)

This PR fixes the generate_sample proc so it properly uses virus_chance to determine when to generate a virus. Now most samples will be virus free as intended.

It also fixes the bug where virus penalty and spaceacillin consumption would be multiplied by the number of cell lines, rather than the number of viruses, as intended.

* Automatic changelog generation for PR tgstation#56062 [ci skip]

* Added a standardized json unit test results log and added my vscode test runner to recommendations (tgstation#56058)

Link to the test explorer: https://marketplace.visualstudio.com/items?itemName=Donkie.vscode-tgstation-test-adapter

The test explorer adapter lets you compile and run the code in one click of a button, with no messing about with defines necessary

The extension supports reading test results from the unit test logs, but its shitty having to parse logs for that, so this PR also adds support for a somewhat standardized method of logging unit test results to a json file instead.

* Automatic changelog generation for PR tgstation#56058 [ci skip]

* Xenomorph embryos now grow based on consistent timers instead of 100% RNG (3% chance every 2s) (tgstation#55755)

• Adds documentation to alien_embryo.dm
• Refactors how alien embryos increase their stage var, aka their cute ickle baby development stage. Now it increases stage every minute, which means 5 minutes to grow as opposed to taking 15 seconds to the end of time to grow.
• Growth time is now defined by a variable, so admins can var-edit it in game and future coders can easily change the variable to make it take more or less time to grow. It also means it's a simple one-line edit if any of TG's plentiful downstreams want to change this for their server.

* Automatic changelog generation for PR tgstation#55755 [ci skip]

* Removes the ANIMATION_PARALLEL flag from floating and fixes another issue with the refactor. (tgstation#55930)

Co-authored-by: Rohesie <rohesie@gmail.com>

* Automatic changelog generation for PR tgstation#55930 [ci skip]

* Automatic changelog compile [ci skip]

* Replaces 'Goebbles' random last name (tgstation#56074)

* Automatic changelog generation for PR tgstation#56074 [ci skip]

* Fixes removing AIs from mechs (tgstation#55986)

Basically the old code attempted to use locate(AI), but the AI in this case is a ref that is supposed to be provided by the card. Since the card is initially empty when removing AIs from the mech, it couldn't find the null in the occupants list and thus failed with a report that there was no AI in the mech.

Now it checks all occupants and makes a list of any AIs it finds, then gives the user the option to pick an AI (though since we don't have any multi-pilot mechs yet the most you can get is one AI, and input with one option just auto-chooses).

* Automatic changelog generation for PR tgstation#55986 [ci skip]

* Optimize mapmerge's DMM.generate_new_key method (tgstation#56068)

Tested on tgstation#55867, takes the merge driver's runtime from 148.1s to 4.8s

* stops code from seeping into ic chat (tgstation#56088)

changes the reference in the modular computer code from src to computer as src is a datum

* Automatic changelog generation for PR tgstation#56088 [ci skip]

* Flesh to stone no longer makes you immune to bleeding, refactors bleedsuppress into a trait (tgstation#56078)

Being hit by the Flesh to Stone makes you bleed immune to prevent you from getting petrified while bleeding, and bleeding out while turned into stone. However, it doesn't make you vulnerable when you get unpetrified. This is a bug. This also makes bleedsuppress into a trait, as both is broken and should be a trait.

* Automatic changelog generation for PR tgstation#56078 [ci skip]

* Fixes vehicles like skateboards and wheelys moving multiple times. (tgstation#56070)

 So wheelys would have 3 instances of the riding component attached on initialize with a different argument, causing them to move 3 tiles at once instead of 1. Skateboards will have 2 attached and move 2, etc.

* Automatic changelog generation for PR tgstation#56070 [ci skip]

* moves quirk stating from medhud to a button instead of being spammed on your chat (tgstation#56067)

 shift clicking people with medhud shouldnt fill your whole chat with stuff u dont want except when u press button to see it

* Automatic changelog generation for PR tgstation#56067 [ci skip]

* Move module creation up in Initialize (tgstation#56086)

This is caused by Initialize trying to link the Cyborg to an AI, when this is done successfully toggle_headlamp is called
Toggle_headlamp however calls update_icons which tries to set icon_state to module.cyborg_base_icon however module at this point is null because the default module is assigned later in Initialize.
This PR moves the module creation up inside Initialize to prevent this.

* Automatic changelog generation for PR tgstation#56086 [ci skip]

* Fixes tgstation#55670, AIs will be able to see clearly after getting un-pied (tgstation#56087)

Fixes tgstation#55670. There was a bug where AIs wouldn't have their blurriness lowered after getting cleaned up. This fixes it by enabling the system that allows living things to lower blurriness on AIs.

* Automatic changelog generation for PR tgstation#56087 [ci skip]

* Add nanite lab to Runtime Station (tgstation#56044)

Doing any testing of new nanite stuff involves spawning in a bunch of
machinery and equipment, so including it on Runtime helps with
development.

* Automatic changelog generation for PR tgstation#56044 [ci skip]

* Finishes the allocation refactor (tgstation#55965)

tgstation#53841 continuation
I recall that the reason for infinite stuns and such was that the priority wasn't being cleared properly when something hitched and I fixed it and I don't remember where exactly but it works now (TM)
A variation of this is TMed on TGMC and it works fine

* Automatic changelog generation for PR tgstation#55965 [ci skip]

* Adds forgotten kit to armament beacon (tgstation#56016)

Adds the forgotten kit to the armament beacon, holding the same stats as knight armor and stone sentinel, But with the sprites for the old clockwork armor and helmet, as they are very nice looking sprites. Moves said sprites to the suit and hat file respectively. as-well as adding forgotten helmet/armour to the game, which are said armors.

Makes it easier to do any clockcult themed gimmick as the chaplain without wearing the god awful craftable armor, uses sprites that really shoulden't die on the same hill as clockcult. a few others have also told me they'd love to see the old clockcult armor and helmet sprites used for something, as they look nice.

* Automatic changelog generation for PR tgstation#56016 [ci skip]

* Rework job food/alchohol benefits into livers  (tgstation#55721)

By moving the "special behaviour" of something like security officers
eating donuts, or engineers losing radiation by drinking Screwdrivers,
into traits on the liver, this makes the "origin" of that behaviour more
clearly defined, rather than something that's attached to the mind of
the person. (For example, now if a wizard mindswaps into a Security
Officer, they too can now digest donuts good.)

Having this behaviour be partially visible to the more medically
inclined members of the station (like doctors, and the chaplain for
"entrails reading mystic" themes), means that a dismembered liver tells
a story to those who know how to read it.

Some jobs have more "benefits" than others, for example the only thing
that the liver of a Quartermaster gives them is a sense of inadequacy
when consuming royal carpet.

Clowns having livers that honk make them easier to identify, and plays
into the retconned "bike horns are clown livers lore"? Also, why not cut
out a clown's liver then honk them with it? You monster.

* Automatic changelog generation for PR tgstation#55721 [ci skip]

* Makes it possible to create an /obj/item/sharpener with multiple uses (tgstation#55958)

Whetstones will now become worn when at 0 uses instead of being either used or not used. All currently existing whetstones start at 1 use.

* Automatic changelog generation for PR tgstation#55958 [ci skip]

* Refactor caltrop component into element (tgstation#56020)

Refactors the nearly completely stateless component "caltrop" into an
element. The previous limit on "one message per caltrop per second" has
been changed to "one message (about caltrops) per mob per second".

This avoids a unique component for each shard of glass, and each cactus
in the world, so saves some much needed memory.

A message about "sliding over" caltrops has been removed, since it's
now intended that you only trigger caltrops if you're not lying down.

* Automatic changelog generation for PR tgstation#56020 [ci skip]

* Regular CTF no longer has wounding (tgstation#56093)

:cl: coiax
tweak: Regular Capture-The-Flag players can no longer be wounded.
Simulated participants in the Medieval Shuttle can still be violently
murdered with wounds however.
/:cl:

CTF is very fast paced, and if you've taken damage without your shield,
you are nearly dead most of the time. However, if you do survive, you're
supposed to slowly heal, but wounds are untreatable on the battlefield.

People still being able to be bloodily stabbed in the Medieval Shuttle
is definitely a feature.

- Aliens (xenomorphs) are still immune to wounds, but that immunity is
  now done with a trait, rather than a typecheck.

* Automatic changelog generation for PR tgstation#56093 [ci skip]

* Automatic changelog compile [ci skip]

* [READY] A victory for revolutionaries will no longer end the round on dynamic, instead no new security and command will be allowed to join (tgstation#55956)

Currently, a victory for revoutionaries leads to the round abruptly ending on dynamic. This has been replaced by all revolutionaries being deconverted, and no new security or command positions being available.

Also attempts to unionize (pun intended) copy and paste code in the round start and late join revolutionary rulesets into being handled under the revolutionary team instead.

* Automatic changelog generation for PR tgstation#55956 [ci skip]

* Fixing bugs about the worst simple_animal coded in and material tiles. (tgstation#54885)

Fixed floorbots applying floor tiles onto already tiled turfs.
Fixed floorbot issues with material tiles.
Fixed emagged floorbots spawning lattice when deconstructing floor into plating.

* Automatic changelog generation for PR tgstation#54885 [ci skip]

* Makes jaunting work properly again (tgstation#56028)

Fixes an if check that was checking the area flags of a turf. Prevents a runtime in phased_check, and makes the area noteleport flag work properly. These were introduced by tgstation#55973

* Gives CE an engineering skillchip. (tgstation#56082)

Literally gives CE an existing skillchip.

* Automatic changelog generation for PR tgstation#56082 [ci skip]

* HFR: Better observation of delta_time (tgstation#56009)

This changes HFR's fusion_process() to better observe delta_time.

* Automatic changelog generation for PR tgstation#56009 [ci skip]

* Fix moth aheal runtime (tgstation#56109)

Fixes misplaced square bracket to solve runtime issue.

* Automatic changelog generation for PR tgstation#56109 [ci skip]

* Removes the gen_turfs from icebox arrivals, they don't god damn do anything because they are literally just placeholders for areas, and they aren't in the right fucking area. Also gets rid of some dumb plating that makes the area looks worse imo (tgstation#56107)

* Automatic changelog generation for PR tgstation#56107 [ci skip]

* Upgrade extools version (tgstation#56104)

thanks willox. fixes the game not working on BYOND 513.1539
.dll is from appveyor for the v0.0.7 tag: https://ci.appveyor.com/project/MCHSL/extools/build/job/gbyo64ou0ny01g75/artifacts

* Removes the firealarm from the meta freezer, it activated at roundstart due to the cold. (tgstation#56106)

* Automatic changelog generation for PR tgstation#56106 [ci skip]

* Fix runtime in bolts hallucination (tgstation#56108)

Fixes requesting .len from null when the list was never initialized.

* Automatic changelog generation for PR tgstation#56108 [ci skip]

* [bounty code moment] Adds a way to view the 'Server's Last Round' (tgstation#55646)

* Adds "View Last Server Round Report" option.

* Automatic changelog generation for PR tgstation#55646 [ci skip]

* Now brain trauma paralysis works in arms as intended (tgstation#56105)

Fixing issue tgstation#56076 making arms affected by the corresponding brain trauma. Fixing brain trauma paralysis in non-human limbs is impossible without a partial or complete refactor of paralysis code or species code, and since this situation happens very rarely, I doubt someone want to waste time in this. But if someone wants to do it anyway feel free to ask me about how it can be done.

* Automatic changelog generation for PR tgstation#56105 [ci skip]

* Fixes double catwalks on Delta Station. (tgstation#56110)

Removes double and triple catwalks from DeltaStation map.

* Automatic changelog generation for PR tgstation#56110 [ci skip]

* Added autofocus for the first button in the TGUI list input. (tgstation#56114)

Ported over from https://gitlab.com/cmdevs/colonial-warfare/-/merge_requests/647
When you open the TGUI list input, it'll auto-focus the first element so that you can easily navigate with the arrow keys without having to click on the page beforehand.

Small QoL when opening the thing, don't have to click on it if you want to navigate via arrows keys, etc.

* Automatic changelog generation for PR tgstation#56114 [ci skip]

* Automatic changelog compile [ci skip]

* [READY] Changes MetaSec Offices Layout, lathe location, and adds walls to maintenance by upload. (Attempt 2) (tgstation#55971)

* Try 2

* Missed the edits by Upload

* Someone threw the sec couch out the airlock.

* Added a few officer spawns

* Junk commit for mergability testing

* Yet another junk commit

* lathe moved.

* That gosh darn sec lathe has been moved with prejudice. Tricksy lathe.

* Automatic changelog generation for PR tgstation#55971 [ci skip]

* Revert "Finishes the allocation refactor (tgstation#55965)" (tgstation#56137)

This reverts commit 87234f3.

* Comms consoles now have a GPS signal. (tgstation#56121)

Helps solve the issue of hidden comms consoles delaying (or forcing) a round end.

* Automatic changelog generation for PR tgstation#56121 [ci skip]

* Fixes null-named painting issue (tgstation#56113)

There was an issue where you could name paintings nothing, which would cause issues with persistency. This was because the stripped_input didn't actually check that you put something in, so the PR adds that check. It now ensures, both when saved and loaded, that there is a title. If not, it sets them to the default 'Untitled Artwork'

* Automatic changelog generation for PR tgstation#56113 [ci skip]

* Prevents everything except carbons, PAIs and cats from resting to fix Ian paralysis (this time with bitflags). (tgstation#56089)

There is now a mobility flag that determines a mob's ability to rest. Only works with living mobs. Most living mobs shouldn't be able to rest, so it's only true for carbons, cats and PAIs. Fixes tgstation#56034. Fixes tgstation#55975 by making borgs unable to rest.

* Automatic changelog generation for PR tgstation#56089 [ci skip]

* Makes hulk more susceptible to cold damage (tgstation#56131)

cl Qustinnus
tweak: Hulks now get more damage from freeze damage, take it in brute, and get the damage at higher temps than normal
/cl

requested by oranges, makes the temp-gun better against hulkies

* Automatic changelog generation for PR tgstation#56131 [ci skip]

* Automatic changelog compile [ci skip]

* Add testing rule to contribution guidelines (tgstation#56147)

Adds a clause to the contributing guidelines that you are expected to have tested your code, which implicitly bans webedited larger PRs. Also updates the wording about changelogs.

* Fix elevators (tgstation#56117)

Currently elevators are broken since they try to use the z level of the assembly inside the button to determine how to move
The assemblies z level is however always 0 and instead the z level of the button containing the assembly must be used
This fixes this

* Automatic changelog generation for PR tgstation#56117 [ci skip]

* Fix briochecake icon, add tastes and foodtypes (tgstation#56125)

- Adds a missing `icon_state` to the full brioche cake
- Adds `SUGAR` to the brioche cake's and slice's `foodtypes`, as they're glazed (according to the description)
- Adds butter and cream to the `tastes` as well

* Automatic changelog generation for PR tgstation#56125 [ci skip]

* var/hacked now actually does something in vendor spawners (tgstation#56144)

Oversight made by @TiviPlus when making tgstation#55147
var/hacked wasn't actually used in code and instead, all spawner vendors were instantly hacked.
fixes tgstation#56101

* Automatic changelog generation for PR tgstation#56144 [ci skip]

* Common Build Tooling (tgstation#55373)

Add Common Build Tooling

## Information for Developers

On Windows, the build scripts will automatically install Node. Other 
platforms should use their package manager or download it from 
https://nodejs.org/en/download/

Pick one:

- VSCode: `Ctrl+Shift+B`
- VSCode: `F5` (build & run with debugger) or `Ctrl+F5` (build & run 
  without debugger)
- Windows: double-click root `Build.bat` (pause to see output) or 
  `tools/build/build.bat` (no pause)
- Git Bash and non-Windows: `tools/build/build`

## Information for Server Admins

- TGS scripts will automatically install the version of Node specified 
  in `dependencies.sh`
- Either use this build script, or compile tgui by running any script 
  in `tgui/bin` folder.

## Details

Both dm and tgui are now built with a single script. It's pretty easy 
to launch: just press `Ctrl+Shift+B` in VSCode, and tada! 🎉 

**It's smart.** It will skip certain steps if source files were 
untouched for that step. So, if you're only touching dm code, it will 
only rebuild dm code, and will skip tgui.

**Syntax is fairly readable and maintainable.**

```js
const { Task, runTasks, exec } = require('./cbt');

const taskTgui = new Task('tgui')
  .depends('tgui/yarn.lock')
  .depends('tgui/packages/**/*.js')
  .provides('tgui/public/*.bundle.*')
  .provides('tgui/public/*.chunk.*')
  .build(async () => {
    await exec('tgui/bin/tgui');
  });

runTasks([taskTgui]);
```

**This is a long term solution to the js bundle hell.** Now that we 
have a single script to build everything, bundles have been excluded 
from the repo, and they will no longer cause conflicts in PRs. This 
results in quicker PR turnaround time and less time wasted on 
rebuilding tgui for PRs.

**CI pipelines have been updated.** They're not coded in the most 
optimal way, just making them green for now.

## Possible future work

- Support compiling with DM defines by passing them as an argument, 
  like `-D LOWMEMORYMODE`.
- Instead of explicitly listing the task sequence in `runTasks()`, 
  support specifying tasks in `.depends()`, which in turn will allow 
  building a graph of dependencies and running things in parallel.

Co-authored-by: Tad Hardesty <tad@platymuus.com>

- Add root Build.bat
- Add trio of tools/bootstrap/ scripts for Node
- Add tools/build/README.md
- Ensure build script and VSC configuration works properly on Linux
- Update TGS4 PreCompile scripts

Co-authored-by: Jordan Brown <Cyberboss@users.noreply.github.com>

- Keep PreCompile scripts compatible with TGS3 as well
- Update LinuxOneShot PreCompile scripts
- Update TGS4 configuration

* Fixes checking a person's inventory requiring a do_after and causing a buckle notification. (tgstation#56153)

`/atom/movable/proc/mouse_buckle_handling(mob/living/M, mob/living/user)` has functionality that is too generic for `/mob/living/carbon/human/`

`/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)` contains code that is better suited for `mouse_buckle_handling()`

`/mob/living/carbon/human/MouseDrop_T()` results in a call stack that calls the generic `/atom/movable/proc/mouse_buckle_handling()` when the prerequisites for piggybacking or fireman carrying are not satisfied. But this makes no sense and means that when the game state is such that you should be inspecting the inventory, the game state is ALSO such that you are attempting to erroneously buckle a player to yourself.

In addition, `MouseDrop_T()` should really not be holding mouse buckling logic in this scenario. As a result, this proc override has been removed from /living/carbon/human entirely. All functionality has been shifted into an overriden `mouse_buckle_handling()` at the /living/carbon/human level.

Piggybacking and fireman carrying now actually return a value on success.

Finally, if we have successfully handled the MouseDrop_T event through a parent proc call chain, we no longer go on to show the mob's inventory.

All these tweaks combined mean that you can now click-drag to view inventories without a do_after and without attempting buckling, /mob/living/carbon/human buckling logic is now appropriately in `mouse_buckle_handling()` and no longer falls through to generic buckling checks, which is not relevant when trying to air quotes "buckle" a mob to a /mob/living/carbon/human. Successfully buckling a player to yourself (in this scenario through fireman carrying) no longer opens the inventory window.

I have tested the following behaviours and they work as intended.

- [x] Piggybacking
- [x] Fireman carrying
- [x] Inspecting inventory of /mob/living/carbon/human
- [x] Inspecting inventory of /mob/living/simple_animal/pet/dog/corgi/ian
- [x] Buckling /mob/living/carbon/human to a chair.
- [x] Buckling /mob/living/simple_animal/pet/dog/corgi/ian to a dog bed.

* Automatic changelog generation for PR tgstation#56153 [ci skip]

* Fixes ghost_roles spawning as transgenders. (tgstation#56151)

About The Pull Request

An oversight made in tgstation#51058. Almost every other source of changing gender was complete with changing body_type as well, but not the ghost_role spawners.

Right now ghost roles can spawn with one gender, but get the other body_type.
This results in looking at "her", while the person in question got a surprise.

For such things, we already added "Other" gender.


cl
fix: Ghost roles can no longer spawn as a male with female body_type and vice-versa.
/cl

* Automatic changelog generation for PR tgstation#56151 [ci skip]

* Automatic changelog compile [ci skip]

* ID Card access change logging, Part 2 (tgstation#56155)

I've condensed the logging into a single define, to allow ID card logging to be easily tweaked and to clean up some messy copy-pasted code.

There is no longer admin messaging for Head of Staff accesses, but it's all still logged as it was before.

There is a new option for the Investigate verb.

Which has the complete logging history for ID card changes that are currently tracked, all in one place.

Which admins can ALSO access from Get Current Logs and Get Server Logs for past rounds via id_card_changes.html

* Automatic changelog generation for PR tgstation#56155 [ci skip]

* Fixes comms console runtime that stops you paying off pirates (and reply to any other messages) (tgstation#56135)

This is because JS-side it does a string concat instead of integer addition at messageIndex + 1, as messageIndex is a string and nothing in JS is typed because it is an evil programming language that is a cross between Hitler and Skeletor, with piss of pure liquid malevolence.

We appropriately parse the messageIndex to an int radix 10 before adding 1, and everything just works.

Also removes two text2num conversions following a recent tgui change that made this no longer necessary.

* Automatic changelog generation for PR tgstation#56135 [ci skip]

* Icebox Xenobio maint fixes (tgstation#56139)

Fills in a hole in Icebox lower Xenobio maint causing active turfs and replaces a magic locker that I'm told is unintentional with a regular one.

* Automatic changelog generation for PR tgstation#56139 [ci skip]

* fixes grenades with prox sensors (landmines) not working (tgstation#56150)

* Automatic changelog generation for PR tgstation#56150 [ci skip]

* Improves Bleeding Feedback + Misc Wound/Organ Decay Tweaks (+ Removes Teeth) (tgstation#56056)

* Automatic changelog generation for PR tgstation#56056 [ci skip]

* Update build process in documentation (tgstation#56173)

Building tgstation is a bit different nowadays, so I've updated the 
docs a bit.

* Makes build all default task in vscode. (tgstation#56178)

* Update Dockerfile for CBT (tgstation#56175)

Follow-up to fix the failing Docker CI on master.

- Reorganize the entire Dockerfile to be more readable
- Inline the tgstation/byond Dockerfile into our own, so we can change the base distro at will
- Also allows us to trash the dependencies.sh<->Dockerfile hack
- Use 32-bit libs on a 64-bit distro so that we can download and run recent 64-bit Node binaries
- Call tools/build/build rather than DreamMaker directly

* Force UTF-8 encoding in tools/bootstrap/node_.ps1 (tgstation#56177)

* Try to not do anything after calling TgsReboot() (tgstation#56161)

We want to use the script TGS executes when calling this to do ops stuff

* Replaces iftrue for scope building with do while in compile overlays (tgstation#56159)

* Updates Contribution Guidelines regarding Prior Approval for Station Maps (tgstation#56166)

Updates the contribution guidelines to require the addition, removal or replacement of station maps to require prior approval before making the PR.

Ultimately shouldn't change much about how the PRs are handled, but gives an early warning that approval should be sought and should help cut down on lost time mapping if I would reject a PR outright. With how long station maps take to make, prior warning that it outright won't be merged is, in my opinion, good.

* Explosive lance icons update properly (tgstation#56164)

Fixes tgstation#56154. Spears were missing an update_icon on initialize, this adds one. Now, spears will show their grenade upon construction. Works just fine in testing.

* Automatic changelog generation for PR tgstation#56164 [ci skip]

* Wooden tables now obey The Law of Conservation of Mass (tgstation#56156)

## About The Pull Request
Fixes Issue tgstation#56152 making wood tables deconstruct at they should be.

Bug vivisection:
Okay, see here? This is the proc for creating a table, we can introduce three arguments. One of them is _buildstack. _buildstack overrides Buildstack on initialize, a variable used for storing the type of raw "ore" that the table is supposed to drop in deconstruction. Here is supposed to be null unless we want to override the buildstack with another ore.

```DM
/obj/structure/table_frame/proc/make_new_table(table_type, custom_materials, _buildstack) 
	var/obj/structure/table/T = new table_type(loc, _buildstack)
	T.frame = type
	T.framestack = framestack
	T.framestackamount = framestackamount
	if(custom_materials)
		T.set_custom_materials(custom_materials)
	qdel(src)
```

What happened? The proc for building a wood table from a wooden frame, shown below, passed the "type" variable, used for storing the type of table_frame, as a _buildstack argument to the make_new_table proc. This overrides the buildstack variable of the final wooden table, causing it to drop a wooden frame as it was an ore on deconstruction. 

```DM
/obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params)
[...]
		if (toConstruct)
			if(material.get_amount() < 1)
				to_chat(user, "<span class='warning'>You need one [material.name] sheet to do this!</span>")
				return
			to_chat(user, "<span class='notice'>You start adding [material] to [src]...</span>")
			if(do_after(user, 20, target = src) && material.use(1))
				make_new_table(toConstruct, null, type)
```
This is funnier (not very much, to be honest) when we consider that deconstructing with a screwdriver would drop a frame normally, causing it to drop two frames. We could repeat this ad nauseam, essentially cloning wood frames in place as we pleased.

So TL;DR: this is another of those simple but hard to hunt bugs that would be prevented with testing and a null on its right place.

* Automatic changelog generation for PR tgstation#56156 [ci skip]

* Allow dynamic to be configured when used as the forced secret mode (tgstation#56122)

Allow dynamic to be configured (roundstart rulesets) when used as the forced secret mode

* Automatic changelog generation for PR tgstation#56122 [ci skip]

* Makes excited breakdowns independent of adding new turfs. This prevents the dreaded stationwide firelock, at least mostly, and moves us away from being dependant on room size. As a downside, we're closer then ever to ZAS. This also allows us to raise the breakdown timer and decrease the amount of overtime experienced in each tick. (tgstation#56081)

## About The Pull Request

This prevents the dreaded station-wide firelock, at least mostly, and moves us away from being dependent on room size. As a downside, we're closer then ever to ZAS, and the transition between pre-breakdown and post-breakdown is a lot more visible. This also allows us to raise the breakdown timer and decrease the amount of overtime experienced in each tick.

See video, I'm not sure I'm happy with the current rate, it does look somewhat shit. I'm considering tweaking the alpha curve for gas visuals to try and make it look less not good. [Video](https://cdn.discordapp.com/attachments/326831214667235328/797766078389813298/2021-01-10_01-55-53.mp4)

Closes tgstation#56066

## Why It's Good For The Game

Station spanning excited groups are rarer, and will settle down more often. Cold things like space will cool down their group faster, preventing station spanning non updating excited groups.

* Automatic changelog generation for PR tgstation#56081 [ci skip]

* separates malf ai from traitor dynamic ruleset (tgstation#56090)

Separates malf ai from traitor so admins can treat it separately

* Automatic changelog generation for PR tgstation#56090 [ci skip]

* Redone Metastation Science (tgstation#55867)

* fixed conflicts

updated the branch and pasted in all the changes again, conflicts and all roundstart turf diffs should be gone now

* Update MetaStation.dmm

Opened up the cytology lab directly to xenobio, its all one room, with shutters to lockdown cytology in case of an emergency - Nari

* Update MetaStation.dmm

softened some internal walls on xenobio sat, they dont need to be reinforced, added a small weakpoint to xenobio sat, its not a secure area and doesnt need to be a roundstart gigafort, removed the windows the buttons were on for the slime pens, buttons directly on windows looks bad, replaced with a table - Nari

* Remove minor tweak

remove the biobag and labcoat tweak from this branch

* Update MetaStation.dmm

tile under a door had a random disposals pipe, but missing a wire. fixed - Nari

* Update MetaStation.dmm

fixed merge conflict

* Update MetaStation.dmm

why???

* Update MetaStation.dmm

fix?

* Update MetaStation.dmm

cant fix sorry

* Update MetaStation.dmm

trying a fix

* fixed conflicts?

i think this fixes it?? - Nari

* Update MetaStation.dmm

Added experimentor - Nari
re-tiled sec post -Nari
rearranged mech bay so it actually works - Nari
re-did the connection between xenobio and the cytology area - Nari
added a few requests consoles - Nari
added a sci drobe - Nari
removed one of the extra deliveries areas - Nari

* Update MetaStation.dmm

fixed the department request consoles departmentType and name - Nari

* Update MetaStation.dmm

fleshed out the support line for the bomb site - Nari

* Update MetaStation.dmm

removed lattices under catwalks, hopefully this fixes

* Update MetaStation.dmm

fix

* Automatic changelog generation for PR tgstation#55867 [ci skip]

* Makes the manifest always have a certain department order (tgstation#55917)

Makes the manifest always have a certain order to the departments in it.

* Automatic changelog generation for PR tgstation#55917 [ci skip]

* Infinite Gun Culling: Gun Kit Edition (tgstation#56133)

Every prototype firearm in the game now utilizes crafting to construct it, usually sacrificing a standard version of that firearm in order to produce the new one. The guns are made using gun part kits you print from the security protolathe (or buy, in the case of hellfire lasers).

* Automatic changelog generation for PR tgstation#56133 [ci skip]

* Use draft pull requests instead of the 'Work In Progress' and 'Needs Review' labels. (tgstation#56168)

* Automatic changelog compile [ci skip]

* 513.1536 is the stable BYOND version (tgstation#56182)

* Stack overflow detection for the Master Controller. (tgstation#56008)

* Stack overflow detection for the Master Controller.

Using a weakref, we can detect if the mc's stack was ended by byond due to a stack overflow, and restart it without waiting the entire defcon countdown in the failsafe controller.

I built a system around this concept under /datum/stack_end_detector and deployed it to the MC's main loop with checks in the failsafe controller.

* Makes wayfinding great again (tgstation#56055)

Interacting with the wayfinding pinpointer dispenser recently after leaving it untouched basically since I added it I realised it has a bunch of bad design decisions that make it unpleasant to interact with so while this can never solve the lack of desirability of the pinpointers themselves hopefully it prevents the machine from contributing to the problem.

* Automatic changelog generation for PR tgstation#56055 [ci skip]

* Fix Docker build failing on a clean checkout (tgstation#56190)

Follow-up to tgstation#56175 which turned out to be accidentally relying on Node already being downloaded.

* Makes the rest of large guns bulky (sans traitor objectives and a few others) (tgstation#56132)

## About The Pull Request

What it says on the tin.
Practically everything but pistols, SMGs, and traitor weapons can no longer be stashed into bags.

I had considered making some large guns that traitors can order (like the blast cannon) also bulky, but concealment is important for some of those things.
However, the bulldog shotgun and sniper rifle have been made bulky, because they're shotguns and sniper rifles!

Traitor objectives are still normal size and can fit in backpacks.

## Why It's Good For The Game

Makes previous changes to weapons and thus balance consistent across our full list of guns. Players can clearly understand what can fit in the bag based on the size of the weapon.

* Automatic changelog generation for PR tgstation#56132 [ci skip]

* Superior auto comment blocks VSCode extension (tgstation#56194)

* Adds toggling shower's refills (tgstation#55895)

Adds the ability to toggle showers water reclaimers with a multitool
Adds some delta_time handling to showers.

* Automatic changelog generation for PR tgstation#55895 [ci skip]

* Fixes parallax runtime when observing someone without client (tgstation#56092)

When observing someone without client (because they for example disconnected) a runtime happened:
This was because update_parallax didn't take a mob as parameter but instead always updated the parallax of the mob to which the HUD datum belonged (which was the HUD of the person who you tried to observe)
If that mob had no client this caused a runtime.
If you observe someone now the game updates parallax for your client and not the client of the person you tried to observe.

* Automatic changelog generation for PR tgstation#56092 [ci skip]

* [READY] Bespoke Datum Mats (tgstation#55296)

* Bespoke Material Backend

- Adds support for bespoke materials:
  - Reimplements [/datum/material/var/id]
  - Ports GetIdFromArguments from SSdcs
  - Adds a wrapper define for GetMaterialRef
  - Adds [MATERIAL_INIT_BESPOKE]
  - Adds [/datum/material/proc/Initialize]
- Does not actually add any bespoke materials

- [ ] TODO: Code docs
- [ ] TODO: Actually adding bespoke materials

* Some has_material procs and cleaning up some spaghetti

- Adds a pair of has_material procs for use in checking whether a given atom has a given material

* Adds meat

- Adds bespoke meat variants
  - Does not make them accessible
- Shuts up the linter

* Implements bespoke meat

- Makes the material container preserve bespoke materials
- Makes the sheetifier accept bespoke materials
- Makes the autolathe accept bespoke materials
- Makes the gibber produce bespoke meats

* Makes butchering produce bespoke meats

This is jank and really needs to be folded into a unified butchering and gibbing system

* Material documentation

- Adds, fixes, and touches up some documentation

* Material container insertion callback

- Changes the proc used to expand the material container's material list ot a proc used to check whether a material fits into a material container
- Instantiating new materials is no longer O(n) relative to the number of autolathes in existence.

* Makes processing meat conserve materials

- Makes bespoke meat carry over into meatballs

* Makes preserving custom materials an option

- Implements the ability to turn preserving custom materials _off_ for processor recipes

* Fixes all bespoke materials of the same type using the same singleton

- We use ids now, not just types.

* Makes the fat sucker produce bespoke meats

- Because consistency is good.

* Fixes autolathes merging bespoke stacks into normal stacks.

* Makes the callback to test materials for holdibility optional

- @floyd

* GetMaterialRef -> GET_MATERIAL_REF

- We capitalize macros.

* Removes an extraneous callback

- Makes the sheetifier use functionality I didn't notice I implemented a few commits ago.

* Makes mob and species meat null compatible

* Fixes the ore silo

- The ore silo had really snowflake material handling that has been brought in line with the rest.
- The materials should show up in the correct order.

* Fixes minor lathe bugs

- Fixes stack_traces caused when lathes tried to fetch materials using reagent typepaths
- Fixed the selective reagent disposal topic. I have no idea how long this has been broken.

* Various documentation fixes

- Clarified a couple comments
- Removes an extraneous ?. operator
- Fixed mat floor tiles having bugged reagent temperatures

* More fixes

-/datum/material/meat/mob -> /datum/material/meat/mob_meat
- Adds atom typecheck to material containers.

* Fixes old typepaths

* Automatic changelog generation for PR tgstation#55296 [ci skip]

* Fixes showers overexposing washed targets (tgstation#55894)

Makes showers consistently expose washed atoms to 5u of their internal reagents
Makes showers effectively double the reagents targets are exposed to as per a comment by ArcaneMusic

Apparently there were balance concerns over synthflesh showers capable of instantly healing and de-husking anyone you put under them.

* Automatic changelog generation for PR tgstation#55894 [ci skip]

* Temperature Pump Sanity (tgstation#55926)

* fix temperature pump

* Cleanup and ui stuff

* Punctuation is important you know

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>

* tgui rebuild

Co-authored-by: Ghilker <minefap44@gmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>

* Add weakref support to qdel (tgstation#56171)

qdel() should allow usage of weakrefs to avoid harddels on long duration qdel_in usage

* invert an if statement in beefmen code

linter was complaining about returning inside a spawn call and this made enough sense to just flip

Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
Co-authored-by: spessbro <51048066+spessbro@users.noreply.github.com>
Co-authored-by: tgstation-server <tgstation-server@tgstation13.org>
Co-authored-by: Krysonism <49783092+Krysonism@users.noreply.github.com>
Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
Co-authored-by: interestingusernam3 <51925758+interestingusernam3@users.noreply.github.com>
Co-authored-by: Gamer025 <33846895+Gamer025@users.noreply.github.com>
Co-authored-by: coiax <yellowbounder@gmail.com>
Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Aleksej Komarov <stylemistake@gmail.com>
Co-authored-by: Vladimir Veisman <v.veisman@fl45h13.me>
Co-authored-by: Azarak <azarak10@gmail.com>
Co-authored-by: Donkie <daniel.cf.hultgren@gmail.com>
Co-authored-by: KathrinBailey <53862927+KathrinBailey@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: Rohesie <rohesie@gmail.com>
Co-authored-by: Changelogs <action@github.com>
Co-authored-by: Coffee <CoffeeDragon16@gmail.com>
Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com>
Co-authored-by: Tad Hardesty <tad@platymuus.com>
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
Co-authored-by: Tlaltecuhtli <33834933+Tlaltecuhtli@users.noreply.github.com>
Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com>
Co-authored-by: Coastfront <50342376+Coastfront@users.noreply.github.com>
Co-authored-by: coiax <jack@billbuddy.co.uk>
Co-authored-by: Mothblocks <35135081+Jared-Fogle@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: EgorDinamit <53223414+EgorDinamit@users.noreply.github.com>
Co-authored-by: esainane <esainane+github@gmail.com>
Co-authored-by: Emmanuel S <mrdoomboyo@gmail.com>
Co-authored-by: Manybones <miguelbasket1@gmail.com>
Co-authored-by: Cartographer-D <63861499+Cartographer-D@users.noreply.github.com>
Co-authored-by: Qustinnus <Floydje123@hotmail.com>
Co-authored-by: Rob Bailey <actioninja@gmail.com>
Co-authored-by: Alex 'Avunia' Takiya <git@takiya.cloud>
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
Co-authored-by: dragomagol <66640614+dragomagol@users.noreply.github.com>
Co-authored-by: AnturK <AnturK@users.noreply.github.com>
Co-authored-by: Jordan Brown <Cyberboss@users.noreply.github.com>
Co-authored-by: EOBGames <58124831+EOBGames@users.noreply.github.com>
Co-authored-by: Fikou <piotrbryla@onet.pl>
Co-authored-by: 小月猫 <alina.r.starkova@gmail.com>
Co-authored-by: Seris02 <49109742+Seris02@users.noreply.github.com>
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
Co-authored-by: cacogen <25089914+cacogen@users.noreply.github.com>
Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
Co-authored-by: Ghilker <minefap44@gmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: spookydonut <github@spooksoftware.com>
Co-authored-by: windarkata <windarkata@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Balance Changes to functionality that modifies how effective certain methods are at powergaming Feature Exposes new bugs in interesting ways Sprites A bikeshed full of soulless bikes.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet