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

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

Merged
merged 10 commits into from Jan 12, 2021

Conversation

Mothblocks
Copy link
Member

@Mothblocks Mothblocks commented Jan 5, 2021

About The Pull Request

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.

Why It's Good For The Game

Revolutionaries is unique in that it is the only antagonist on dynamic that will end the round in a livable state (cult and nuclear operative wins end the round, of course). This generally leads to very abrupt rounds, not just falling far behind what we'd like rounds to end at but also simply just feeling anticlimactic for people not involved in the final killing. What follows is usually a few people asking why the round ended, proving the unintuitive behavior.

Plus, I simply like the flavor of a lawless station, run by the wielders of makeshift weapons used to kill command. But you know, it's actually intentional this time.

Remaining work

  • Give security officers (and command who may have just bailed) a survive objective (@Cyberboss).
  • Make the revs victory policy text in an admin configurable setting.
  • Change method of blocking them from joining so bureaucratic error doesn't allow more in. (And double check this doesn't let you add more).
  • Show former rev in traitor panel, for admins.
  • Fix Command's Approval Rating being 100% on revs victory.
  • Play testing, if you are interested in merging this PR let me know so I can run a test merge of it.

Changelog

🆑
add: A victory for revolutionaries will no longer end the round on dynamic, instead no new security and command will be allowed to join.
/:cl:

@tgstation-server tgstation-server added the Feature Exposes new bugs in interesting ways label Jan 5, 2021
@zxaber
Copy link
Contributor

zxaber commented Jan 5, 2021

With this Captain's death, the thread of prophecy is severed. Restore a saved game to restore the weave of fate, or persist in the doomed world you have created.

@Mothblocks
Copy link
Member Author

@MrStonedOne Unsure if a new file in strings counts as config, seeing as it's not compiled into the rsc, so I'll play it safe and let you know (as owner of config).

@Livrah
Copy link

Livrah commented Jan 5, 2021

"This has been replaced by all revolutionaries being deconverted"
Can former revolutionaries lynch the rest of security officers and vice versa?

@Fakka6969
Copy link

if your goal was to get boring extended "everyone has AA and gamer gear" rounds then this is precisely how you get boring extended "everyone has AA and gamer gear" rounds

revs win and then what? lets say 40 ppl survive, 15 were active revs and have looted HoP CaP and whatever percentage of sec that got killed, they have AA and gear and have done (at least in the usual way these shifts play out) nothing much to enjoy the shift previously but play rev. Ill tell you whats gonna happen. Youre gonna have 15 bored validhunters, 25 people that might aswell play singleplayer because they just missed out on something like 25 minutes utterly unmissable action throughout multiple departments and across all hallways and approximately half of the rounds will feel like they have 0 antags left, either because theres actually no threat left, or threat is something like 15-20 and happens to spawn 2 farts. On the rare occasion that you will roll something actually powerful like wizard you will still have the 15 bored validhunters with AA to deal with them which already overthrew sec/heads seemingly indicating they should know what theyre doing compared to the dead people now rolling.

Not sure if theres still absolutely an*l admins that would punish someone for ending the prospects of that which is left for such a shift, if there still are then you should ask yourself logically, how the shift is supposed to end after NT workers revolted and successfully overthrew the Station? Im thinking Deathsquad everytime. Would be a very logical Response by NT since theres nukes and secrets on that station, but that would create yet another "this will destroy the station & round for almost everyone" -state, which you seemingly want to avoid.

Also what if someone wants to play command or sec, or wants to play on an actually functioning station with a clear hierarchy within departments? I guess my point is, the round left after a successful revolution is already not worth playing, because the entire games balance gets thrown overboard and all thats left is the tide, which mind you, can be fun and can be strong for like 30 minutes, but then everyone's just gonna get bored and log off in approx. half of the rounds.

So yeah Id worry less about confusing out of the blue round-endings and actually consider about how to piece a round together from "what remains after revs" which still has interesting and powerful antagonists to reveal themselves and a working station. Granted I understand the appeal in just killing all of command and continuing the round, I really do, its not a way this game should work imo. Theres two parts of SS13 to me, one is the roleplaying and social conflicts, the other is the "strategy"-game ontop of the simulation and RP. Id argue continuing rounds after revs likely wont satisfy either of these since all social conflicts must either go nuclear or not happen because everyone has gear yet no authority, and theres no strategy game left to play in for a decent chunk of those rounds.

Revs are a fun, quick antag. Fun to play with and against. Your logic on the round ending "arbitrarily" for everyone that doesnt join the fun but just wants to autism instead is correct but solves no problem on its own, and is also not unique to revs but a common problem for literally every antag type that ends the round. If you want to extend rev-rounds, then give a new Meaning to Revs and the Consequences of Revs and dont just hammer in a bandaid fix that blocks a ton of roles, likely leaves people from former command and sec dead and makes it extended after X people acquiring AA and gamer gear with no chain of command or other kinds of structure left on the station for rounds that likely have less threat left than 30 and have only lasted for some 30 minutes.

Personally, lorewise, I like the Deathsquad coming to nuke station Idea, but im sure many people would oppose it on the grounds that it ends the round for good. What a reasonable alternative could be, I dont know, because the roundstate is already fucked beyond repair by revs. Some rounds simply are not worth continuing on, revs often are those kind. While ending the round instantly is not particularly beautiful, I strongly prefer it over NOT ending a round in that state. 2h rounds with greytide supreme just are boring to me. And that likely all your change would create, please consider that.

@Cyberboss
Copy link
Member

@MrStonedOne Unsure if a new file in strings counts as config, seeing as it's not compiled into the rsc, so I'll play it safe and let you know (as owner of config).

The /strings directory can be considered same-as code in this regard.

Comment on lines 392 to 394
for (var/job_name in GLOB.command_positions + GLOB.security_positions)
var/datum/job/job = SSjob.GetJob(job_name)
job.total_positions = 0
Copy link
Member

Choose a reason for hiding this comment

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

Can I suggest using the /datum/job/proc/special_check_latejoin proc instead of setting total_positions to 0? That value can be altered by the "Bureaucratic Error", and the Hop tablet/console.

Although, on the otherhand, it is amusing to think that a Bureaucratic Error results a new Captain being sent to a station full of revolutionaries. Problem is, they're technically not antagonists because they got deconverted when they won?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yeah, I'd kinda like to see a new joining security just get pummeled, but you're right in that it'd lead to weird administration problems.

Copy link
Member

Choose a reason for hiding this comment

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

cough You said you'd do this. 😋

@AlinaStarkova
Copy link
Contributor

if your goal was to get boring extended "everyone has AA and gamer gear" rounds then this is precisely how you get boring extended "everyone has AA and gamer gear" rounds

revs win and then what? lets say 40 ppl survive, 15 were active revs and have looted HoP CaP and whatever percentage of sec that got killed, they have AA and gear and have done (at least in the usual way these shifts play out) nothing much to enjoy the shift previously but play rev. Ill tell you whats gonna happen. Youre gonna have 15 bored validhunters, 25 people that might aswell play singleplayer because they just missed out on something like 25 minutes utterly unmissable action throughout multiple departments and across all hallways and approximately half of the rounds will feel like they have 0 antags left, either because theres actually no threat left, or threat is something like 15-20 and happens to spawn 2 farts. On the rare occasion that you will roll something actually powerful like wizard you will still have the 15 bored validhunters with AA to deal with them which already overthrew sec/heads seemingly indicating they should know what theyre doing compared to the dead people now rolling.

Not sure if theres still absolutely an*l admins that would punish someone for ending the prospects of that which is left for such a shift, if there still are then you should ask yourself logically, how the shift is supposed to end after NT workers revolted and successfully overthrew the Station? Im thinking Deathsquad everytime. Would be a very logical Response by NT since theres nukes and secrets on that station, but that would create yet another "this will destroy the station & round for almost everyone" -state, which you seemingly want to avoid.

Also what if someone wants to play command or sec, or wants to play on an actually functioning station with a clear hierarchy within departments? I guess my point is, the round left after a successful revolution is already not worth playing, because the entire games balance gets thrown overboard and all thats left is the tide, which mind you, can be fun and can be strong for like 30 minutes, but then everyone's just gonna get bored and log off in approx. half of the rounds.

So yeah Id worry less about confusing out of the blue round-endings and actually consider about how to piece a round together from "what remains after revs" which still has interesting and powerful antagonists to reveal themselves and a working station. Granted I understand the appeal in just killing all of command and continuing the round, I really do, its not a way this game should work imo. Theres two parts of SS13 to me, one is the roleplaying and social conflicts, the other is the "strategy"-game ontop of the simulation and RP. Id argue continuing rounds after revs likely wont satisfy either of these since all social conflicts must either go nuclear or not happen because everyone has gear yet no authority, and theres no strategy game left to play in for a decent chunk of those rounds.

Revs are a fun, quick antag. Fun to play with and against. Your logic on the round ending "arbitrarily" for everyone that doesnt join the fun but just wants to autism instead is correct but solves no problem on its own, and is also not unique to revs but a common problem for literally every antag type that ends the round. If you want to extend rev-rounds, then give a new Meaning to Revs and the Consequences of Revs and dont just hammer in a bandaid fix that blocks a ton of roles, likely leaves people from former command and sec dead and makes it extended after X people acquiring AA and gamer gear with no chain of command or other kinds of structure left on the station for rounds that likely have less threat left than 30 and have only lasted for some 30 minutes.

Personally, lorewise, I like the Deathsquad coming to nuke station Idea, but im sure many people would oppose it on the grounds that it ends the round for good. What a reasonable alternative could be, I dont know, because the roundstate is already fucked beyond repair by revs. Some rounds simply are not worth continuing on, revs often are those kind. While ending the round instantly is not particularly beautiful, I strongly prefer it over NOT ending a round in that state. 2h rounds with greytide supreme just are boring to me. And that likely all your change would create, please consider that.

problem is that revs ending the round SUCKS when on dynamic because there's other antags like tots and lings who get cucked for it

@Mothblocks
Copy link
Member Author

@Fakka6969 Thanks for the feedback. Ultimately, your message makes more sense in relation to the revs gamemode than the revs ruleset. In dynamic, there are more antagonists than just the revolutionaries, who are almost incentivized to lose so that they can keep their round going. In dynamic, the round generally ends when the shuttle is called unless the station is literally uninhabitable.

Also what if someone wants to play command or sec, or wants to play on an actually functioning station with a clear hierarchy within departments?

...Wait for the next round? Play on one of the three other servers we have online? You could say the same as an argument against bombing a department. The decisions you are able to make in SS13 are heavily influenced by your environment and the actions of players before you.

Personally, lorewise, I like the Deathsquad coming to nuke station Idea, but im sure many people would oppose it on the grounds that it ends the round for good.

This was something someone recommended to me, and I dislike it for a few reasons, but one of the big ones is that I don't want people over prepping for combat during revs. One of the things that is beautifully simple about revs is people quickly making makeshift weaponry needed to kill command. If they know there's a threat looming much bigger than the command, they're going to end up over preparing and make it less fun for everyone involved.

@Mothblocks
Copy link
Member Author

@Livrah

"This has been replaced by all revolutionaries being deconverted"
Can former revolutionaries lynch the rest of security officers and vice versa?

Interesting question. The reason behind the deconversion is so that you are no longer bound to team antag rules, but this is a good callout. I say yes, though I can't think of a better way to make that obvious through code other than for me to tell the admins, or if anyone gets bwoinked for it to link this comment. 😛

@Mothblocks
Copy link
Member Author

For any maintainers interested, please let me know beforehand as I'd rather this be TM'd before a full merge--a lot of the work seemed too easy.

@IndieanaJones
Copy link
Contributor

To be honest I think if this occurs it should inject some threat back into dynamic. It is possible to roll just revolutionaries on Dynamic and if the round persists if they win, there will be a bunch of geared up people with nothing to use their stuff on.

@Mothblocks
Copy link
Member Author

I'm okay with that, but you can probably say that about revs losing too.

@IndieanaJones
Copy link
Contributor

I'm okay with that, but you can probably say that about revs losing too.

Then you could make it happen when they lose too. More threat is more !!!fun!!!

@Mothblocks
Copy link
Member Author

I'm going to decide that that's out of scope for now, since I'd rather see that applied over the whole of dynamic (like it is on /vg/ now I believe) in that threat goes up when more antags are eliminated.

@MrStonedOne
Copy link
Member

https://github.com/tgstation/tgstation/blob/master/TGS3.json#L4-L7

@ATH1909
Copy link
Contributor

ATH1909 commented Jan 5, 2021

imo, the remaining revs shouldn't be deconverted if the revs win (they should still be deconverted if the revs lose, of course). that way, the remaining mindshielded members of the crew can feel like they're being hunted in hostile territory (and desperately try to bring the round to a draw by assassinating the remaining revheads), and the victorious revs with gamer gear can still pass the time by dragging unconverted people back to their revhead masters (and destroying any last bastions of resistance).

it'd also make the policy surrounding ex-revs much easier to deal with/understand.

@AlinaStarkova
Copy link
Contributor

imo, the remaining revs shouldn't be deconverted if the revs win (they should still be deconverted if the revs lose, of course). that way, the remaining mindshielded members of the crew can feel like they're being hunted in hostile territory (and desperately try to bring the round to a draw by assassinating the remaining revheads), and the victorious revs with gamer gear can still pass the time by dragging unconverted people back to their revhead masters (and destroying any last bastions of resistance).

it'd also make the policy surrounding ex-revs much easier to deal with/understand.

they deconvert only so they arent tied to team antags anymore (if you were a tot, you are cucked because you cant kill your team antags, so if revs won, everyones a rev pretty much)

@Jared-Fogle said revs winning would still be revs and should have the right to still validhunt sec and command members,

alternatively, jared, couldnt it be coded so, since new sec and heads cant join, make it so revs only deconvert if they win, if all heads or sec is completely dead, (or has been off station z for more than 5 minutes to prevent hiding on lavaland to prevent the deconversion). since at that point thats when revs truely have no purpose anymore, but tbh, i dont see the need, as long as people know that if revs take over sec and command become valid even your not actively a rev or antag, then thats fine, but i do agree they cant stay rev, it really cucks other antags HARDCORE (im still salty being converted as a ling and my target was a revhead, wasnt allowed to kill him, though once i found his body dead i made sure he didnt get revived, corpses arent revs 😄 )

@Mothblocks
Copy link
Member Author

Mothblocks commented Jan 5, 2021

that way, the remaining mindshielded members of the crew can feel like they're being hunted in hostile territory

That's not the feeling I'm aiming for. Revolutionaries goal is to kill command, if they have killed command (and won) then their job as a revolutionary is over.

@zxaber
Copy link
Contributor

zxaber commented Jan 6, 2021

The names of all the revs should be saved so they can be pushed to the round end screen later. Otherwise, it makes sense for gameplay reasons to wipe the rev status just to equalize the prior revs with the rest of the crew.

OOS for this PR but the head revs should gain a status of some sort, making them into the new heads of staff with randomly generated (and meaningless) titles.

@Mothblocks
Copy link
Member Author

The names of all the revs should be saved so they can be pushed to the round end screen later.

I'm pretty sure it already works this way, that's the goal of save_members().

@SkeletalElite
Copy link
Contributor

SkeletalElite commented Jan 6, 2021

What if after revs are successful, surviving security members become valid or antags?
Also does that policy text support policy config?

@Mothblocks
Copy link
Member Author

What if after revs are successful, surviving security members become valid or antags?

The idea is they are valid to the past revolutionaries, yeah.

Also does that policy text support policy config?

It does not. I can add in that functionality.

@Fakka6969
Copy link

problem is that revs ending the round SUCKS when on dynamic because there's other antags like tots and lings who get cucked for it

i get that but we fix this problem by creating another problem, which is 15 greytide with gamer gear AA running the station rounds on barely any antags left probably most of the time that revs are successful, even considering the dynamic gamemode, which is kinda defeating cancer with aids.

another suggestion: maybe give revs objectives to form a new station government to bring order into the chaos or something, reestablishing some sort of order on the station with a new face (this would be great for rp too I think).

I really dislike the idea of just changing a 1 (round ends) to a 0 (round doesnt end) and simply blocking all roles that could fuck with the antag type & dooming ghosts of c*mmand players, some unlucky assistants and maybe even sec players into oblivion.

In the current state of this pr my expectation would be for the average successful rev round to get unnecessarily stale and dragged out with a decent chunk of players effectively roundremoved and another decent chunk of players in complete anarchy, having eradicated all sense of structure the station has to begin with. This sounds worse to me for the game as a whole than three cucked antags crying, although I agree neither should be a thing.

Thanks for the feedback. Ultimately, your message makes more sense in relation to the revs gamemode than the revs ruleset.

I was from the beginning specifically discussing this regarding the dynamic ruleset and am still of the opinion this change is gonna make a fair bit of rev rounds suck as hard as they did when fusion was still around. I understand what you're trying to fix, Im pretty sure I understand how dynamic (what is dynemic??) rolls antags and how the average successful rev round will look like, and I disagree that implementing this change is overall going to be a net positive. Completely detached from that, yes, the same point is trivially an even stronger one in a gamemode which literally doesnt have alternative non-event antags to show up like Secret. Why you would even bring this up other than to disregard the entirety of what ive said instead of challenging it, I do not know. It upsets me.

To the point you made regarding banning head roles entirely for the remainder of the round. that they should just

...Wait for the next round? Play on one of the three other servers we have online?

why shouldn't this apply to the three crying cucked antags aswell? (inb4 muh antag rolling)
you're replacing their pain with the pain of an many having to play out the absolute mess thats going to be created during a rev round with zero remaining hierarchy on the station, decent bit of dead people of which a certain faction will frankly never be revived, blocking out the entire chain of command and leaving the round in this weird void state possibly for hours just because... because some tots are gonna cry otherwise?

Im gonna admit this, I dont like long rounds, I dont see the point playing most rounds beyond the 1hr mark on highpop (lowpop maybe 2-4hrs) especially if theyre boring, and I dont want more of those rounds, especially in the kind of state a rev victory would put them in, and especially on med-highpop. id rather have some antags cry than play another hour on greytide station until eventually we can figure out whos the kinda tot that merely takes hours to do anything and whos being a regular greytider enjoying his victory gear with noone left that has to care about the station at all and nothing to do.

@wesoda25
Copy link
Contributor

wesoda25 commented Jan 6, 2021

I think it’d be neat if the shuttle went to either the Syndicate or just lava land at round end.

@Twaticus
Copy link
Contributor

Twaticus commented Jan 6, 2021

reading the title alone i didnt like the sound of it but your reasoning convinced me this is probably a good idea. i do think the round would be too far gone for it to continue normally after revs win though. jumping off wesodas idea of the shuttle landing at the syndicate base, what if once the revs win, the shuttle is auto called on a decent time with an announcement from the syndicate like "hey you killed all those stinky NT heads why dont we pick you guys up we could use you". it gives time for traitors to finish traitoring and it could count any revs as syndicate in case of a hijack objective

Copy link
Contributor

@TheChosenEvilOne TheChosenEvilOne left a comment

Choose a reason for hiding this comment

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

Just a few things on the dynamic side of this.

Comment on lines -185 to -189
/// Checks if round is finished, return true to end the round.
/// Only called if ruleset is flagged as HIGHLANDER_RULESET
/datum/dynamic_ruleset/proc/check_finished()
return FALSE

Copy link
Contributor

Choose a reason for hiding this comment

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

Not really sure about removing the possibility for rulesets to end the round completely. While this isn't used after this it does not mean it will stay unused, besides there is the ONLY_RULESET flag (which I have noticed won't actually work correctly because it can be picked after one ruleset has already been picked, this would be easy to fix though). Dynamic anyways has a few functions which are unused that I added in case they might have a use later.

Copy link
Contributor

Choose a reason for hiding this comment

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

dynamic shouldnt end the round outright based upon the results of a singular antag, it cucks all other antags and i personally dont agree with doing that. dynamic can have other ways for rounds to determine if it ends (nuke goes off, cult goes off etc.. but those can be hardcoded into their mechanic, since well... i dont think theres ever any reason not to end the round in those scenarios) elsewise admins can force end a round themselves if need be, or if admins arent on and theres SOME reason shuttle cant be called players can call a restart vote (though it would be cool if there was a shuttle call vote option, basically a softer restart that doesnt just bam, over, but is a more roleplay option thats for not super severe reasons (like stations in tact but the comms boards are gone and every method of obtaining one is gone, ie. lathe boards, spares and all, and circuit boards all cremated, perhaps a rare scenario but eh)

Comment on lines 123 to 128
var/winner = revolution.process_victory()
if (isnull(winner))
return

finished = winner
return RULESET_STOP_PROCESSING
Copy link
Contributor

Choose a reason for hiding this comment

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

couldn't this just be

finished = revolution.process_victory()
if (finished)
    return RULESET_STOP_PROCESSING

?

Copy link
Member Author

Choose a reason for hiding this comment

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

Probably, it was mostly a port from the older code.

Copy link
Contributor

Choose a reason for hiding this comment

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

funny thing actually, I were checking this on Crucible and found out that if you do if (var = proc()) it saves a whole GETVAR operation.

Copy link
Member Author

Choose a reason for hiding this comment

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

It's also more confusing and less readable, and should be avoided unless in really hot procs.

@tgstation-server tgstation-server removed the Test Merge Candidate You're our unpaid test team label Jan 9, 2021
@Tlaltecuhtli
Copy link
Contributor

can u increase threat by like 50 on rev winning? without internal conflicts, famine and devastation it would be kinda boring for the lynch mob that overthrew sec and heads

@Timberpoes Timberpoes added the Test Merge Candidate You're our unpaid test team label Jan 10, 2021
@ATH1909
Copy link
Contributor

ATH1909 commented Jan 10, 2021

they deconvert only so they arent tied to team antags anymore (if you were a tot, you are cucked because you cant kill your team antags, so if revs won, everyones a rev pretty much)

We could just make it so a rev victory sends a message to all of the traitors, changelings, wizards, etc. who got converted that says that they can work against their ""teammates"" now (since their imprinted revolutionary objective is now complete, they don't have to worry about their efforts to complete their traitor objectives interfering with the success of the revolution). The message would also be sent to antags who get converted after a rev victory, just in case.

@tgstation-server tgstation-server removed the Test Merge Candidate You're our unpaid test team label Jan 10, 2021
@Mothblocks
Copy link
Member Author

image

Ran on Bagil, with the +20 threat version.

@Mothblocks
Copy link
Member Author

Sybil
image

Manuel (very low pop)
image

@Mothblocks Mothblocks changed the title A victory for revolutionaries will no longer end the round on dynamic, instead no new security and command will be allowed to join [READY] A victory for revolutionaries will no longer end the round on dynamic, instead no new security and command will be allowed to join Jan 12, 2021
@Timberpoes Timberpoes merged commit a4c61a3 into tgstation:master Jan 12, 2021
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
Feature Exposes new bugs in interesting ways
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet