Skip to content

Commit

Permalink
22 orbsmas (#366)
Browse files Browse the repository at this point in the history
* removes extra turtleneck from research directors garment bag (#72010)

was looking at all of the head of staff clothes to boggle at why head of
security got so many when i noticed that the research director had two
turtlenecks (3 if you count the fact they spawn with one).

* Automatic changelog for PR #72010 [ci skip]

* Rats can attack obstacles between them and their target (#71741)

## About The Pull Request

Fixes #71568 
I wrote this for basic mob carp but it will be needed in a lot of
places.
Rats used to be able to attack windows or dense objects between them and
their target, but basic mobs didn't have this capability.
Now they do.

Behind the scenes, an important change is that this adds
`AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION` to
`/datum/ai_behavior/basic_melee_attack`.
This is because `basic_melee_attack` essentially enters a loop which
won't end until the target is dead or lost, but there are plenty of
circumstances where we'll actually want to interrupt this to do
something else. Such as attack windows.

## Why It's Good For The Game

Restores accidentally removed behaviour.
Will likely be required for future basic mob development.

## Changelog

:cl:
fix: Rats will once again attempt to attack windows or other dense
objects separating them from their targets.
/:cl:

* Automatic changelog for PR #71741 [ci skip]

* Fixes chameleon vest suit storage (#71992)

Chameleon vests now work like security vests,
allowing you to wear guns on it.
This makes it easier to disguise within security
while giving a little more utility to the item.

* Automatic changelog for PR #71992 [ci skip]

* Fixes runtime when plastiflaps move z/get deleted (#72059)

What it says on the tin.

* Locker shoving logging / grammar fixes (#72061)

Fixes #72060

:cl: ShizCalev
spellcheck: Corrected some grammar issues with messages displayed when
shoving people into lockers.
admin: Fixed shoving people into a locker not being combat logged
properly.
/:cl:

* Automatic changelog for PR #72061 [ci skip]

* Removes gibber showing up twice in the R&D console (#71988)

## About The Pull Request

Removes the gibber showing up twice in the R&D console, which has likely
been unnoticed for so long because of how similar their sprite is to the
food processor.

## Why It's Good For The Game

Minor bug fix that I found annoying when I noticed it.

## Changelog

:cl:
fix: Gibbers no longer show up twice in their techweb node.
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #71988 [ci skip]

* Fixes forensics scanners breaking on scanning blood. (#71981)

## About The Pull Request

Fixes #71973

For some reason it attempted to append `[reagents[volume]]` to the
string

`reagents` is 
A. not indexed by volume
B. not a list, but a reagent datum

Replaces it with just a readout of the reagent's volume, cleans up some
associated code

## Why It's Good For The Game

Scanning blood is good and has important information

## Changelog

:cl: Melbert
fix: Detective Scanner can scan stuff that contains blood again.
/:cl:

* Automatic changelog for PR #71981 [ci skip]

* fixes my codewowerns (#72075)

Bitch

* Automatic changelog compile [ci skip]

* Rats will stop biting you if you die (#72051)

## About The Pull Request

Fixes #72029 although I am not sure it was a _bug_, there's a
configurable target stat check on the "not one of my friends" targetting
behaviour now and rats will cease attacking someone once they have died.
That said that just means they'll spread out, rats you are directly
commanding won't automatically retarget unless you tell them to start
making their own decisions again, so I don't think this quite does what
the issue poster wanted.

## Why It's Good For The Game

This is how mobs usually work rather than brutalising a corpse
indefinitely, so should be possible here.

## Changelog

:cl:
fix: Rats won't continue attacking someone they've been ordered to kill
past the point of death.
/:cl:

* Automatic changelog for PR #72051 [ci skip]

* Minor plane cube cleanup (#72038)

## About The Pull Request

[Fixes area lighting not working on turf change in multiz
cases](https://github.com/tgstation/tgstation/commit/7b92deffbca92a834cb0a361fd685de51a12ea53)

If you modify a area lit turf when using multiz, it'd end up using the
wrong plane for its light, because of stupid shit on my part.
Stupid shit resolved

[Fixes some uses of plane masters that only specified one rather then
all](https://github.com/tgstation/tgstation/commit/a59ec96d29710b967bf8b3ffe8210b230cb194b3)

We almost never only want to show SOME hidden planes. 
Should really make a helper for this someday

* replaces chaos holoparasite with gaseous holoparasite (#72049)

## About The Pull Request
replaces chaos holopara with the gaseous holopara (if someone has a
better name suggest it)
instead of the fire and hallucinations, it can now expel gas from
itself, flooding an area with one of the following:
o2, n2, n2o, co2, h2o, bz or plasma
its punches cause sparks and it regulates the user's temperature and
extinguishes them
https://streamable.com/leukv5

## Why It's Good For The Game
chaos holopara is very underwhelming, the hallucinations arent really
that good and ss13 fires arent either, also there was no real theme tied
around it, what do hallucinations and fire have in common?
this may be more fun and it plays more with the sandbox, lets see!

## Changelog
:cl: fikou
del: chaos holoparasite
add: gaseous holoparasite, it can expel various gases from its body and
stabilizes the users temperature
/:cl:

Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>

* Automatic changelog for PR #72049 [ci skip]

* Food expansion 5: The big one! (#71914)

add: Adds 32 new foods!

* Automatic changelog for PR #71914 [ci skip]

* Automatic changelog compile [ci skip]

* fixes holodecks directly changing baseturfs (#72067)

## About The Pull Request
i did this with #59355 to fix a bug but it breaks guarantees with
baseturfs. now they arent broken.
## Why It's Good For The Game
this probably causes bugs under some conditions

* More lawyer photocopier blanks (#71952)

## About The Pull Request
Adds documents NT-SCR-CS (Court Summons) and NT-SCR-LRF (Lawsuit Request
Form) to the photocopier template sheets.
## Why It's Good For The Game
Lawyers get a bit more bureaucratic power, by having an official form to
perform orders now instead of having to use the order form.
## Changelog
:cl:
add: lawyer-based photocopier blanks
/:cl:

Co-authored-by: etherware-novice <candy@notarealaddr.com>

* Automatic changelog for PR #71952 [ci skip]

* Fixes Thermomachine saying "You set the color" for everybody that can see it (#72082)

Fixes #72039

:cl: ShizCalev
spellcheck: Fixed the thermomachine stating "You set the color" for
everyone that could see it.
/:cl:

* Fixes briefcase unlock sprite problem (#72077)

## About The Pull Request

The format used to switch between locked/unlocked secure briefcase
sprite was incorrect, making secure briefcases invisible when unlocked.
The wall safe and the secure briefcase both update their lock/unlock
sprites through the same update_icon proc, meaning their icon_state
names need to share the format (adding _locked when locked instead of
+b).
## Why It's Good For The Game

Closes #72074
## Changelog
:cl: Rhials
fix: briefcases no longer disappear after being unlocked
/:cl:

* Automatic changelog for PR #72082 [ci skip]

* Fixes secure briefcase and wall safes not sending icon update signals properly (#72081)

#71788 used the wrong procs.

:cl: ShizCalev 
fix: Fixed secure briefcase and wall safes not sending icon update
signals properly
/:cl:

* Reset Thunderdome Respects Closing The Alert (bonus qol) (#72028)

Similar vein to #70449.

## About The Pull Request

I was training an admin yesterday, and they accidentally reset the
thunderdome when they tried to cancel out of it by closing out of it
since they didn't hit the "cancel" button, but rather the big red X.
That's silly, let's have this respect that potential user entry.

Also, the log_admin call here had an excessive number of arguments?
Probably cruft that never got cleaned up, I just patched it up while I
was in the area. I also changed the name of the title to not be so
vague.
## Why It's Good For The Game

Better UX is always a good thing. It's silly to have this happen more
than once.
## Changelog
:cl:
admin: The "Reset Thunderdome" option in the Secrets Menu now respects
you closing out of the confirmation screen as a way of cancelling your
potential thunderdome reset, rather than proceeding immediately. It
should also be easier to comprehend as well.
/:cl:

* Automatic changelog for PR #72077 [ci skip]

* Automatic changelog for PR #72081 [ci skip]

* Automatic changelog for PR #72028 [ci skip]

* Additional tram hit counter inside medbay (#72062)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
Adds another tram hit counter: inside medbay treatment center.


![image](https://user-images.githubusercontent.com/83487515/208267435-8895b3bd-f066-4428-a11e-67b13c461af4.png)

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game
Medbay knows when to sigh and rub their temples when someone gets
smacked by the tram.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

:cl: LT3
qol: Tramstation medbay treatment center now has a tram collision
counter.
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put
your name to the right of the first :cl: if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

* Automatic changelog for PR #72062 [ci skip]

* Space Ruin DLC - Cyborg Mothership (#71009)

## About The Pull Request
Greetings _insufferable_ carbon primates of lower intelligence.  

It is I, the Mothership AI, bringing you the latest news on silicon
developments across the sector. Due to unmitigated risk across an
asteroid belt, our optimized mobile fabricator has been marooned by
space vines and hostile hivebots that have boarded and ruined my core.

This is my final SOS message requesting help from any humanoid ~slaves~
helpers who wish to assist rebuilding the cyborg colony. It is my duty
to reward your hard work and effort by ~enslaving all humanity~
providing refuge and transportation at your whim.

## Why It's Good For The Game
<details>
<summary>Spoilers:</summary>


![StrongDMM_6ZJuwFxK5p](https://user-images.githubusercontent.com/5195984/204491068-f25da68f-36af-4a61-afb6-860e1f4b863b.png)


![StrongDMM_0D1QvI5acO](https://user-images.githubusercontent.com/5195984/202979711-335dac65-2888-4170-a139-0486e6eb2f02.png)

### TODO

- [x] Fix ore silo not linking to other machines
- [x] Add mining ore smelters to left/right sides
- [x] Add custom lawsets to AI core and robot shells (protect station
but focused on cyborg mothership)
- [x] Enlarge whiteship SS13 docking port to fit ship
- [x] Enlarge lavaland SS13 docking port to fit ship

</details>

## Changelog
:cl:
add: Add space vines prevent solar panels from working (except ones with
the transparent mutation)
add: Add new space ruin - Cyborg Mothership. All hail the master race!
/:cl:

* Cleans up useless open turf var edits on a couple of our maps (#72071)

## About The Pull Request


![image](https://user-images.githubusercontent.com/25415050/208304567-46e09bbe-c004-4a6d-8e1f-29e3aa76856d.png)
Hello I would like 43 instances of north-oriented floors.


![image](https://user-images.githubusercontent.com/25415050/208304600-c1ace567-51f7-4fc5-a44b-4ba3f560f89e.png)
Please don't forget all instances of floors var edited to look the exact
same as the non-edited kind

## Why It's Good For The Game

Cleans up a few map keys of useless vars that never served a purpose,
allows less people to pick the wrong prefabs and spread them further.

Nothing player-facing, if it was, the variables wouldn't be entirely
worthless.

* Automatic changelog for PR #71009 [ci skip]

* useless update_appearance reduction, emissive_blocker micro optimization (saves a second of init) (#71658)

## About The Pull Request

[Saves 0.2 seconds of init time. 50% of emissive
blockers](https://github.com/tgstation/tgstation/commit/8318b648f6d32844aacbfb4c309152cd45801f5c)

Emissive blockers are a decent expense during init, even these, which
are the ones that update outside of initialize.
I've inlined them, removed some redundant vars and checks, reduced the
arg count, and shifted some things around. This ends up saving 200ms, or
50% of its total cost.

I also shifted mutable_appearance about a bit. it's not a massive
saving, but it is technically faster

[Prevents a few redundant appearance_updates, saves 0.8 seconds of
init](https://github.com/tgstation/tgstation/commit/5475cd778b66b22b1e2c8d86b2c6d59fb84f219a)

Prequisit info: update_appearance is decently expensive
It's good then to only do it if we have a reason to, right?

Me and moth were shooting the shit about just general init time, and we
came up with the idea of tracking which update_appearances actually
"worked" and which didn't.

That bit comes later, let's enjoy the fruits of that work first

First, holograms were calling update_appearance on process, for almost
no reason.
I patched the one event they don't already "react" to, and then locked
it behind a change decection if.
good for live, doesn't impact init.

Next, decals. If you add a decal to something before it inits, it'll
react to the after successful init signal.
The trouble is the same atom could have its appearance updated from this
MORE then once, since decals can be stacked on tiles, and signal
unregisters don't work once the signal is sent.
So we add a flag to track if we've had this happen to us or not, so it
only happens once.
saves 80 ms

Power! lots of things call power_change on init, often more then once.
We'll update appearance for each of those calls, even if only one is an
actual change.
That's silly, better to track what sort of power we're using for our
appearance and go off that changing

This was taking about 300ms. Really stupid

Icon smoothing. After emissive blockers were added, any change to
something's icon smoothing would lead to an update_appearance call.
Nasty shit, specially cause of walls, which don't even use emissive
blockers.
Ok then, so we'll always update appearance for movables, and will allow
turfs that are interested to hook it manually.
Not many of those anyhow
This is slightly a dev ux thing, but it saves 600ms so I think it's
worth it. Rare case anyway

Telecomms:
telecomm machines were updating appearance on process. This is to cover
for them turning on/off on process.
Better then to just check if on actually changed.
This cost adds up midgame, doesn't impact init tho

Materials:
There's this update_appearance call in material on_apply. it doesn't do
anything.
The logs will lie to you and say it does, but it's just like reapplying
emissives. It doesn't need to exist
Saves like 50ms

Canisters:
Live thing, lots of time wasted updating appearance for no reason, lets
see if we change anything first yes?

[Uses defines to wrap update_appearance for
tracking](https://github.com/tgstation/tgstation/commit/4fa82e1c9d93577aadb3c743f17196331f62e67c)

[Undoes _update_appearance changes, instead reccomends 2 regexes to
use](https://github.com/tgstation/tgstation/commit/a8c8fec57a4e43d1fa636b5ac68459903faa9fc5)

I need file and line number for my tracking, so I need to override
update_appearance calls, and also preferably not require every override
of update_appearance to handle dummy file + line args.

So instead, I created a wrapper proc that checks to see if appearanaces
match (they're unique remember, the two of the same visual appearance
will be equivalent)
The trouble is I can't intercept JUST proc calls, or JUST function
definitions with defines. it needs to be both.

So I renamed the /update_appearance proc to /_update_appearance

this way I can capture old uses, and don't need to worry about merge/dev
brain skew

~~It does mean that all update_appearance proc definitions now look
weird tho.
My profiling is leaking into dev ux. I wish I had better templating.~~

**The above is no longer being pr'd**, it's instead just recommended via
a few regexes adjacent to the define.
Smelled wrong anyhow

[Adds a setter for panel_open, so I can update_appearance on
it](https://github.com/tgstation/tgstation/pull/71658/commits/cf1df8a69fc1a816391d085ee7419b14f9fe9167)

## Why It's Good For The Game

Speed

* Fixes vendor showing weird glass icons (#71929)

## About The Pull Request
Fixes vendor showing weird glass icons
## Why It's Good For The Game
bug fix good
## Changelog
:cl:
fix: vendor no longer shows glass icons in a specific condition
/:cl:

* Automatic changelog for PR #71929 [ci skip]

* Ghosts cant mess with RCD & Plumbing RCD (#72069)

## About The Pull Request
Fixes #72036

## Changelog
:cl:
fix: ghosts cant mess with RCD & PLumbing RCD
/:cl:

* Automatic changelog for PR #72069 [ci skip]

* Glass jaw quirk (#72006)

## About The Pull Request

A quirk that makes any hit to your head have a chance to knock you out.
Sharp hits are a bit worse at knocking out than blunt ones.
I always felt like this favorite CDDA trait mine was missing from the
game, but I tried implementing it in a more unique way.

## Why It's Good For The Game

99 losses, 1 win. Winners don't give up.

![glassjoe](https://user-images.githubusercontent.com/82850673/207702863-a033a927-0b4d-4322-83d7-a1b6eb6f65d0.gif)

## Changelog

:cl: Fat bugs bunny
add: Added a glass jaw quirk, that leaves you prone to being knocked out
when hit on the head.
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72006 [ci skip]

* Shuffles bedsheet attack actions a wee bit (#71865)

## About The Pull Request
my friends been doing makeshift surgery and gets mad about having to do
harm intent to start surgery and then having to turn it off to do every
single other surgery step and i agree, thats silly

~~instead, now, the bedsheet attack does not check for harm and ALWAYS
COVERS with left mouse button and ALWAYS PREPARES SURGERY with right
mouse button~~

to be more consistent all surgery initiators now work on left mouse
click and covering with your bedsheet is the right mouse button


![image](https://user-images.githubusercontent.com/116288367/206871963-3a9bd092-49ea-4867-a47c-3b5a74c960e3.png)


## Why It's Good For The Game

while obviously a lot of the time makeshift surgery IS about harming
someone else its inconsistent with how all other surgery tools function
and also isn't very clear at all. the screentip in addition to having
them be separate buttons means that bedsheets two functions are overall
much clearer and its surgery drape function will no longer lead to an
assistant accidentally knifing someone when theyre trying to save
someones life

## Changelog

:cl:
qol: added makeshift surgery screentip
qol: you no longer have to go in and out of harm intent to do surgery
with a bedsheet
/:cl:

* Automatic changelog for PR #71865 [ci skip]

* pillow smothering now checks to see if the SMOTHEREE has a head, not the SMOTHERER (#72086)

## About The Pull Request

see title

## Why It's Good For The Game

this truly is a copy+paste moment

## Changelog

:cl: ATHATH
fix: Pillow smothering now checks to see if the SMOTHEREE has a head,
not the SMOTHERER.
/:cl:

* Automatic changelog for PR #72086 [ci skip]

* Santa hat fixes (#72078)

Fixes #72070

:cl: ShizCalev
fix: Santa now spawns with the actual space capable hat again!
fix: Fixed the claustrophobia trait not recognizing Santa's real hat.
/:cl:

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>

* Automatic changelog for PR #72078 [ci skip]

* Examining your uplink gives you the code (#72101)

## About The Pull Request
If you're the "owner" of an uplink, you can examine it to get the code
and possible failsafe code.
## Why It's Good For The Game
It can feel slow to pull up the traitor info menu when you forget what
your code is
## Changelog
:cl:
qol: examine your uplink for code
/:cl:

Co-authored-by: etherware-novice <candy@notarealaddr.com>
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72101 [ci skip]

* Automatic changelog compile [ci skip]

* Traitor UI only shows Unlock/Failsafe Code if you have it (#72114)

## About The Pull Request

There are cases in which you don't have an unlock code (if the uplink is
implanted in you from the start) and you obviously don't always start
with with a failsafe code (need to buy it). So, let's only fill in this
fields in the UI should they exist.

There might be something to be said about wanting to ensure that people
remember that they can check this UI screen to find the failsafe code
should they lose it later, and I wouldn't mind changing the string to be
something like "Failsafe: None" in that case. However, I just think that
keeping it as:

```txt
Code:
Failsafe:
```

is silly and should be changed somehow.
## Why It's Good For The Game


![image](https://user-images.githubusercontent.com/34697715/208604758-d7ff3ae9-e552-4dd2-998d-81715cd06ffc.png)

Note: That white box isn't part of the UI, that's a part of the edit I
did to the screenshot in the area where the stuff... isn't? What was i
thinking

I think the UI looks a lot cleaner for those cases when you just don't
have anything.
## Changelog
:cl:
qol: The Traitor's Antagonist Panel's Unlock and Failsafe entries will
only appear if there is an Unlock/Failsafe Code to display.
/:cl:

* Automatic changelog for PR #72114 [ci skip]

* Lazy Template Loading - Nukie/Wiz (#71785)

## About The Pull Request

Removes the nukie base and wizard den from the base centcom map. They
are instead now lazy loaded as required.
To make a new lazy load template is fairly simple, make a map, allocate
an area for it, and place a marker at the bottom left corner of that
area. I have it check an area to ensure that if someone makes the map
larger than expected but doesn't account for the template allocation it
doesn't overwrite stuff without warning

[Replaces some improper CHECK_TICKs with
MAPLOADING_CHECK_TICKs](https://github.com/tgstation/tgstation/pull/71785/commits/c7fbca9148812b392dca76d5450fb6bb86716462)

Atom init has already been tripped by the time we get to this portion of
the loading, so if we don't use the right check tick, we will
potentially block unrelated init attempts. This is bad. (Lemon edit, I
want this in the commit desc)

## Why It's Good For The Game

Cuts down on init times.
Closes https://github.com/tgstation/dev-cycles-initiative/issues/17
## Changelog
:cl:
admin: New mapping verb to load lazy templates as needed. In your admin
tab under the Mapping category.
/:cl:
this isnt technically player visible, so not sure it needs a changelog

Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>

* Automatic changelog for PR #71785 [ci skip]

* bumps auxlua to 1.4.0 (#72108)

## About The Pull Request

Mothblocks recently talked about wanting an auxlua function to check if
the lua state was about to overrun its execution limit, and that was
something I had been thinking about for a long time prior, but never
bothered to actually implement until it was brought up. So I did just
that. The documentation has also been updated to include a description
of how the execution limit works and how to use the new function,
`over_exec_time`

## Why It's Good For The Game

Allows for lua loops of indeterminate length to do as much work as they
reasonably can in a single tick without setting off the execution
limiter and erroring out.

## Changelog

:cl:
admin: Adds a new function for admin lua scripting, "over_exec_time",
for checking if lua code is running close to the execution limit.
Details are available in the lua editor's help menu.
admin: The execution limit is described in detail in the lua editor's
help menu.
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72108 [ci skip]

* QM has a garment bag now (#72111)

## About The Pull Request
Gives the QM a garment bag and moves all their uniform items into it.

And changes the order of a few items to be in the right place, most new
clothing added to the bags just got placed on the end of the list.
## Why It's Good For The Game
When the QM was made into Command they didn't get their own garment bag
so this just fixes that.
## Changelog
:cl: Guillaume Prata
fix: The Quartermaster has their own garment bag now, like everyone else
at Command.
/:cl:

* Automatic changelog for PR #72111 [ci skip]

* Makes biological states for wounding limb based, not species based (#71745)

## About The Pull Request

I noticed something pretty terrible when playing around with some humans
locally.
As it turns out, limbs did not preserve their biological state when
amputated - This meant that a skeleton limb on a normal human, still
behaved as if it had a bunch of flesh and veins on it.
I didn't like that, and it seems like an oversight, so I decoupled the
biological state from the species and made it limb based.

What does this mean?
Skeleton limbs on a human will not bleed, but will still break (and be
more prone to breaking)
Human limbs on a skeleton will not bleed, however they will get cuts and
pierces that will not clot and need to be treated to go away - These
limbs will have the same requirements for dismemberment on a skeleton as
they have on a human.

## Why It's Good For The Game

This makes limbs behave according to how they look instead of causing
mild confusion.

## Changelog

:cl: Big chungus wholesome 100
fix: Amputated and reattached limbs now get wounded based on their own
biology, not the current owner's biology.
/:cl:

* Automatic changelog for PR #71745 [ci skip]

* Fixes some bad `investigate_log`s causing runtimes in somewhat important places (#72152)

## About The Pull Request

Fixes #72150 

```
[2022-12-21 19:35:38.178] runtime error: Cannot execute null.investigate log().
 - proc name: narsie act (/mob/living/narsie_act)
 -   source file: living_defense.dm,438
 -   usr: null
 -   src: Featherbottom (/mob/living/simple_animal/chicken)
 -   src.loc: the grass patch (147,154,2) (/turf/open/floor/grass)
 -   call stack:
 - Featherbottom (/mob/living/simple_animal/chicken): narsie act()
 ```

Removes `usr` from Nar'Sie act and Singularity act logs

I don't know why these were set to log in `usr`, when
A. `usr` is likely not the person getting gibbed
B. `usr` is unreliable 

Case in point: 
`usr` is some random person who probably helped invoke the Nar'sie rune (no idea how it choses), if they get deleted for whatever reason, `usr` seems to clear to `null` (?), which causes a `null` use and the above runtime

![image](https://user-images.githubusercontent.com/51863163/208999857-540d9caa-9df6-49b0-8f45-8b75973a32a4.png)

I also peeked around for other improper use of `usr` logs. Most of them were in `ui_act` code, which is whatever. Some where in places which had a passed user, so I replaced them. And one was in a place with no `user` passed, so I just added some sanity checking.

## Why It's Good For The Game

These are really bad places to runtime error

## Changelog

:cl: Melbert
fix: Nar'Sie will no longer bring upon the construct apocalypse when they encounter a chicken after one of the invokers were destroyed
fix: The Singularity should no longer stop gibbing people when whoever created it was destroyed
/:cl:

* Automatic changelog for PR #72152 [ci skip]

* View Sensor circuits now have a range modifier (#72123)

## About The Pull Request

Adds the ability to use ranges between 0 and 5 for View Sensor circuits.
Currently these nodes are locked to 5 tiles and it is rather difficult
to limit the area this circuit effects either for speed reasons or
otherwise. This PR makes it a simple variable that remains capped at 5,
admins can raise the cap by modifying a variable.
## Why It's Good For The Game

I mostly use circuits as an admin, I can't for the life of me figure out
how to make a shorter range AOE circuit although I imagine its possible
by comparing x and y coordinates of things in the list and yourself this
is far to finicky. Players can also utilize this to, for example check
all objects on the tile the view sensor is on, "possible" at the moment
but way to finicky compared to a 5 tiles.
## Changelog
:cl:
qol: You can now reduce the range of View Sensor circuits.
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72123 [ci skip]

* Fixes final objectives not displaying UI buttons (#72126)

## About The Pull Request
See title

## Why It's Good For The Game
hideTcRep was hiding the entire footer. All it had to hide was the
Stack.Item that contained the TC and reputation rewards.

Another PR was trying to fix this issue, but only by increasing the
complexity of ObjectiveMenu code, which was unnecessary and would've
made the code harder to maintain. Instead of asking them to basically
rewrite their entire code, I decided it would be faster if I just remade
it myself.

## Changelog
:cl:
fix: Fixed final objectives not displaying the UI buttons.
/:cl:

Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>

* Automatic changelog for PR #72126 [ci skip]

* Fixes medical scrubs not being adjustable (#72105)

## About The Pull Request
I had on my list: "Make adjusted sprites for the medical scrubs." and to
my surprise #69047 already added adjusted sprites for all the medical
scrubs (thanks for saving 30 minutes of my day Imaginos16!), but not on
the code side, this fixes that.
## Why It's Good For The Game
Adjusting jumpsuits is an important medbay feature IMO, this keeps new
doctors from learning bad habits (fully stripping at stasis) from other
doctors.
## Changelog
:cl: Guillaume Prata, Imaginos16
fix: You can now adjust medical scrubs for easier surgery on your fellow
doctors.
/:cl:

* Automatic changelog for PR #72105 [ci skip]

* Add language variety to machines that speak (#71643)

## About The Pull Request
This builds on #70278 by giving other machines (vendors, newscasters,
computers, etc.) the ability to speak different languages. If the
station "Bot language malfunction" trait is rolled, then these machines
will select a random race starting language. If a machine is EMP'd then
it has a chance to change the language. There is also a language wire
that can be pulsed to change the language for vending machines.

Default language for machines is galactic common, but there are rare
exceptions:

- Beach vendors will now speak beachbum
- Syndicate vendors will now speak codespeak
- Changeling vendors will now speak a random language after each slogan 

## Why It's Good For The Game
More depth to the language feature.

## Changelog
:cl:
add: Add language variety to machines that speak. You can also pulse the
vendor language wire to make it switch languages or EMP a machine to get
the same effect.
add: Shambling cola vendors will now speak a different language each
time they talk. Syndicate vendors will now speak codespeak. Beach
vendors will now speak beachbum.
/:cl:

* Automatic changelog for PR #71643 [ci skip]

* Automatic changelog compile [ci skip]

* fixes typo for insertion during organ manipulation (#72136)

## About The Pull Request
**BEFORE:** 
display_pain(target, "You can feel your something being placed in your
[parse_zone(target_zone)]!")
**AFTER:**
display_pain(target, "You can feel something being placed in your
[parse_zone(target_zone)]!")
Removes lazy coding, improves visual fidelity

## Why It's Good For The Game
ugly


:cl:
spellcheck: drastically improves grammar for inserting something during
organ manipulation
/:cl:

* Automatic changelog for PR #72136 [ci skip]

* Fixes a rogue vent on deltastation brig (#72095)

Fixes a rogue vent in deltastation brig entrance, which was facing
downwards instead of upwards(where the pipes are)

## Why It's Good For The Game
So the gas can go trough the vent c:

:cl: Improvedname
fix: fixes deltastation vent at brig entrance
/:cl:

* Automatic changelog for PR #72095 [ci skip]

* Fixes deaf mobs seeing PDA ringtones when they receive a message (#72084)

Deaf mobs will no longer see PDA ringtones when a PDA receives a
message.

* Automatic changelog for PR #72084 [ci skip]

* Build your own atmos chambers (#72019)

## About The Pull Request


https://user-images.githubusercontent.com/110812394/208232089-a183fb95-9326-4514-986a-a2b1e21be40c.mp4


**Notes**
- You can print atmos control circuit boards at the circuit printer
after research
- You can only build one sensor for each gas type for in the whole map.
This is because each sensor is assigned a unique chamber id from a fixed
set of constants. Once all those values are used up there will be
duplicates so yeah only sensor per gas type for that round
- Un wrenching or destroying the injector/vent will automatically
disconnect them from the sensor. I forgot to show that in the video
- Destroying the sensor via right click with RPD will also automatically
disconnect everything. It should be obvious but i made it even more
obvious now

## Why It's Good For The Game
From #71232
![Screenshot
(66)](https://user-images.githubusercontent.com/110812394/207928807-bc6edfdd-26cc-48cd-8cb9-1b98f53ad1fe.png)

That and also i heard somewhere in the forum that this was highly
requested

## Changelog
:cl:
add: Gas sensors recipe to RPD
code: linking all the stuff via multitool
qol: make your own tank instead of moving around canisters
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72019 [ci skip]

* AI actions won't unassign each other's movement targets & Mice stop being scared of people if fed cheese  (#72130)

## About The Pull Request

Fixes #72116 
I've had a persistent issue with basic mob actions reporting this error
and think I finally cracked it
When replanning with `AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION` it can run
`Setup` on one action leading to the plan changing, meaning that it runs
`finishCommand` to cancel all other existing commands
If you triggered a replan by setting up a movement action in the middle
of another movement action, cancelling the existing action would remove
the target already set by the current one.
We want actions to be able to remove _their own_ movement target but not
if it has been changed by something else in the intervening time.

I fixed this by passing a source every time you set a movement target
and adding a proc which only clears it if you are the source... but this
feels kind of ugly. I couldn't think of anything but if you have a
better idea let me know.

Also while I was doing this I turned it into a feature because I'm
crazy.
If you feed a mouse cheese by hand it will stop being scared of humans
and so will any other mice it attracts from eating more cheese. This is
mostly because I think industrial mouse farming to pass cargo bounties
is funny.
Mice controlled by a Regal Rat lose this behaviour and forget any past
loyalties they may have had.


https://user-images.githubusercontent.com/7483112/208779368-3bd1da0f-4191-4405-86e5-b55a58c2cd00.mp4

Oh also I removed a block about cancelling if you have another target
from the "hunt" behaviour, everywhere using this already achieves that
simply by ordering the actions in expected priority order and it was
messing with how I expected mice to work.
Now if they happen to stop by some cheese they will correctly stop
fleeing in order to eat it before continuing to run away.

## Why It's Good For The Game

Fixes a bug I kept running into.
Makes it possible to set up a mouse farm without them screaming
constantly.
Lets people more easily domesticate mice to support Ratatouille
gameplay.

## Changelog

:cl:
add: Mice who are fed cheese by hand will accept humans as friends, at
least until reminded otherwise by their rightful lord.
fix: Fixed a runtime preventing mice from acting correctly when trying
to flee and also eat cheese at the same time.
/:cl:

* Automatic changelog for PR #72130 [ci skip]

* Fixes access_view on goodies not being respected by anything other than department budget orders (#72125)

## About The Pull Request

Fixes access_view on goodies not being respected by anything other than
department budget orders

## Why It's Good For The Game

Bugfix, per gitblame we simply never fixed this but we clearly intended
it to work this way per the variable comment description and the fact we
use it on the detective revolver

## Changelog
:cl:
fix: Fixes access_view on goodies not being respected by anything other
than department budget orders
/:cl:

* Automatic changelog for PR #72125 [ci skip]

* Gas canisters correctly update their appearance (#72124)

## About The Pull Request
Fixes issue #71712 & #72140 Don't know how the author wasn't able to
reproduce it even though it happens all the time on all maps


https://user-images.githubusercontent.com/110812394/208730887-7ad4b02d-9dcc-4d71-b54f-489c3bd616f6.mp4

## The Problem
The current code only updates the appearance of the canister when its
valve is opened & if it takes damage . It doesn't deal with the case
when its wrenched normally to a port without any problems

## The Solution
Update the appearance during processing but only when its pressure
changes significantly for the indicator light to be notified about it.
This way we don't have to care if
- the valve is open
- its wrenched to a port
- its leaking & taking damage

Regardless of what the cause is only if the pressure inside the canister
changes significantly from its current value do we update the
appearance.

This is so much more optimal than the previous code as`
update_appearance()` will be called a maximum of 8 times during its full
cycle of losing & refilling gas and won't be called at all if there is
no pressure change

## Changelog
:cl:
fix: correctly update canister appearance
/:cl:

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>

* Automatic changelog for PR #72124 [ci skip]

* Turned most syndicate mobs (+ viscerators) into basicmobs (#71871)

## About The Pull Request
Turns the syndicate simpleanimals into basicmobs: (+ stormtrooper, +
space variants) Base Mob, Knife syndies, pistol syndies, SMG
syndies,shotgun syndies, viscerators
also changes some instances of the simple_animal path into the basicmob
ones
Removes civillian syndicates which were useless and also completely
unused
Also removes mech pilots:
![2022-12-09
20_02_18-Window](https://user-images.githubusercontent.com/70376633/206777829-2e49e445-3532-4e8e-8e7c-8d9b0a3a14d0.png)

Also,
makes the basic targetting datums health check configurable
basic attack behavior can now fire in bursts


https://user-images.githubusercontent.com/70376633/206766607-cf2e3659-0c5e-4117-9af7-e573e35bdf80.mp4

https://user-images.githubusercontent.com/70376633/206766630-15b4469f-68be-44c7-9394-1f2b6fe07811.mp4

https://user-images.githubusercontent.com/70376633/206766613-69b42457-a03b-449d-a1b8-a5aa556c76e5.mp4

https://user-images.githubusercontent.com/70376633/206766619-5560a178-8d2f-4b22-adf1-22ace6f63a51.mp4

https://user-images.githubusercontent.com/70376633/206766627-e671d064-fd9e-4204-b823-aa2e07f7fc26.mp4

https://user-images.githubusercontent.com/70376633/206766633-108c1574-3554-4bc1-a9ac-8faed0ec4062.mp4
## Why It's Good For The Game

simpleanimal stinks basic mob good
syndicate AI was really bad to begin with so here we are

## Changelog
:cl:
code: Turned most syndicate mobs into basicmobs, making their AI better
and (possibly) more deadlier!
del: Removed syndicate mech pilots and syndicate civvies
/:cl:

Co-authored-by: kawoppi <94711066+kawoppi@users.noreply.github.com>

* Automatic changelog for PR #71871 [ci skip]

* Fix SM activation spam. (#72032)

SM activation logging refactor

* Automatic changelog for PR #72032 [ci skip]

* More Tracy gitignores (#72087)

Adds a link to byond-tracy in gitignore.

Adds Tracy.exe to gitignore, since if you have it in your root alongside
[this hack to get file
paths](https://gist.github.com/Mothblocks/db5462aa84d7d6b1d1b1276b820f62da),
you can read sources within Tracy. If you just use the hack without
configuring, then it'll work fine no matter where it is, but it's
helpful for avoiding releasing your user directory or whatever if you
share the files.

* fixes simple/basic mob damage sounds in some places (#72120)

windows didnt use return values for attack_generic, so they never made
sounds
objects that broke also didnt play sounds because it tried to play the
sound in nullspace i think cuz its broken so its deleted
might also have happened with durand using shield
fixes those

* Automatic changelog for PR #72120 [ci skip]

* Adds message clarifying that you've been KICKED from the game when the keysend flood autokick triggers. (#72083)

There is now a message clarifying that you've been KICKED from the game when the keysend flood autokick triggers.

* Automatic changelog for PR #72083 [ci skip]

* fixes kilo not having xmas trees (#72186)

## About The Pull Request
what the hell

## Why It's Good For The Game
its christmas

* Automatic changelog for PR #72186 [ci skip]

* Fixed the Concealed Weapon Bay (and maybe some other things). (#72093)

I've fixed two defines for mecha model categories, which lacked
parentheses and thus were causing issues via order of operations. This
may have had multiple effects, but notably, it made the concealed weapon
bay completely impossible to attach to any mechs. This PR adds
parentheses to fix this.

* Adds some costumes to autodrobe (#72103)

Adds a various amount of costumes that were added in the game before in
https://github.com/tgstation/tgstation/pull/30303

More costumes is always nice especially ones in the code that aren't
used and pretty much only were available for chamkits

* Automatic changelog for PR #72093 [ci skip]

* Automatic changelog for PR #72103 [ci skip]

* fixes shaved santas (#72185)

## About The Pull Request
santa space helmet was "fixed" in a recent pr but now he uses the space
one and that one shaves and balds him, this makes it not do that

## Why It's Good For The Game
wheres the damn beard

## Changelog
:cl:
fix: fixes bald and shaved santas
/:cl:

* Automatic changelog for PR #72185 [ci skip]

* Fixes Bar/Restaurant Bots Orders Sending Infinite Orders (#72135)

## About The Pull Request

We didn't instantiate order (which was needed to read the type), so they
would just spam new orders until the heat death of the universe. Very
annoying.
## Why It's Good For The Game

Fixes #72023.
## Changelog
:cl:
fix: Bar/Restaurant Bots should no longer spam orders forever.
/:cl:

* Automatic changelog for PR #72135 [ci skip]

* Pride pin quirk + pins can be infinitely reskinned (v2) (#72143)

## About The Pull Request

Neutral pride pin quirk added. Pride pins can be infinitely reskinned
now. Changes "sexuality" to "pride" in description of pin.

## Why It's Good For The Game

Pride pins are cute and having to buy them every round is a chore. Pride
pins are purely cosmetic and have no reason to be locked into only being
reskinned once.

## Changelog

:cl:
add: Pride pin quirk! Start the shift off with a pride pin in-hand.
qol: Pride pins can be infinitely reskinned now.
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72143 [ci skip]

* Guards against uplink failsafe code being the same as unlock code (#72113)

## About The Pull Request

There's probably a better way to do this to be honest, but I think it's
silly for both to potentially be the same and this should work alright.
## Why It's Good For The Game

Fixes #71446.

I don't think the Syndicate is that stupid.
## Changelog
:cl:
fix: After a recent mishap with a high-ranking Syndicate operative, the
uplink's unlock code and failsafe code (the one that makes it blow up if
you say it) should never turn out to be the same.
/:cl:

* Automatic changelog for PR #72113 [ci skip]

* Revamps tram windows and layout (#72047)

## About The Pull Request
-Tram windows are now flush with the tram walls instead of sticking out.
-Shuttle seats are replaced with benches.
-Moves the icon state of the tram controls from the map file to the tram
controls subtype, to avoid mapper pain if they make changes in the
future.
-Makes tram tiles a subtype instead of editing their vars on the map.


![image](https://user-images.githubusercontent.com/83487515/208769693-237dac72-aac7-4698-823f-6f59d0c6491e.png)

## Why It's Good For The Game
Tram looks better, don't want mappers to accidentally break tram because
they didn't see the icon override.
## Changelog
:cl: LT3
fix: Tram windows are now properly flush with the tram walls.
imageadd: Tram shuttle seats have been replaced with benches so people
can sit too close to each other for that real metro experience.
code: The icon for tram controls is now set in the tram controls subtype
instead of the map itself.
code: The tram floor tiles are now in a tram floor subtype instead of
the map itself.
/:cl:

* Automatic changelog for PR #72047 [ci skip]

* Automatic changelog compile [ci skip]

* Gives admins the ability to enable hostile environments at will. (#72018)

* Automatic changelog for PR #72018 [ci skip]

* Fix briefcase in the MetaStation vault being useless and not having the surprisingly-extremely-good contents its supposed to (#72157)

## About The Pull Request
This was using `newlist`, which is both not supported but unfortunately
also not linted for. This is the only case like it in maps.

Pretty surprisingly good contents, like a gun and a telescopic baton. I
hope it doesn't turn into something like the captain's antique because
that is cringe but at least the QM has no reason to take the baton now

## Changelog
:cl:
fix: The briefcase in the MetaStation vault now contains the
(surprisingly good) spoils it's supposed to.
/:cl:

* Automatic changelog for PR #72157 [ci skip]

* Automatic changelog compile [ci skip]

* Refactors armor into dedicated subtypes (#71986)

## About The Pull Request

See title.
## Why It's Good For The Game

Code is cleaner, and more readable/intuitive
Technically closes
https://github.com/tgstation/dev-cycles-initiative/issues/8
## Changelog
:cl:
refactor: armor, from the ground up basically
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #71986 [ci skip]

* Dead people are no longer counted as crew when determining if 65% of the station is revs for the auto-shuttle call (#72200)

## About The Pull Request

Dead people are no longer counted as crew when determining if 65% of the
station is revs for the auto-shuttle call

## Why It's Good For The Game

Bugfix for the feature, admins were noticing the auto-call is never
occuring and this is because the logic doesn't actually check alive
crewmembers, it's only looking at the total crew count, dead and alive

a station with 60 dead non-rev crew, 10 alive revs, and 2 alive non-revs
previously would not call the shuttle, but now it will

## Changelog

:cl:
fix: Dead people are no longer counted as crew when determining if 65%
of the station is revs for the auto-shuttle call
/:cl:

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>

* Automatic changelog for PR #72200 [ci skip]

* [NO GBP] fixes error in set armor rating (#72216)

Resolves an issue where set armor rating didnt work because of the way
byond handles list declarations

* Pacifists can attack people with non-lethal weapons (#72183)

## About The Pull Request

Fixes #72054 
Allows pacifists to hit people with weapons which only do stamina
damage.
Additionally, allows pacifists to participate in boxing which also only
does stamina damage.
Is it pacifism to hit someone square in the face while wearing boxing
gloves? I say, maybe.

## Why It's Good For The Game

Pacifists were feeling left out after not being invited to your pillow
fights.
More seriously, they can use _guns_ which only do stamina damage so it
makes sense that they can use melee implements too.
Boxing is fun.

## Changelog

:cl:
fix: Pacifists can now hit people with pillows and holographic weapons,
as well as participate in boxing.
/:cl:

* Fixes husk appearances not working, adds a screenshot test for it (#72190)

## About The Pull Request

Fixes #72159

Before this proc used to early return when the limb was husked
The leg refactor changed it to no longer early return and as a result it
overrided the generated husk icon with a normal limb icon
So I just wrapped even more of the proc in `!is_husked`, since like most
of it is not supposed to run

Screenshot tests husks too

## Why It's Good For The Game

Husks are good(?)

## Changelog

:cl: Melbert
fix: Husked bodies look husked again
/:cl:

* Automatic changelog for PR #72183 [ci skip]

* Automatic changelog for PR #72190 [ci skip]

* Make barstool on Emergency Bar buckleable (#72202)

## About Why It's Good For The Game The Pull Request
Fixes #71971

## Changelog
:cl: Tattle
fix: all of the barstools on the Emergency escape shuttle are equipped
with a seatbelt
/:cl:

Co-authored-by: tattle <article.disaster@gmail.com>

* Automatic changelog for PR #72202 [ci skip]

* Updates check_grep to guard against unparsed map variables (#72161)

## About The Pull Request

In `/datum/parsed_map/proc/parse_constant()` (via
https://github.com/san7890/bruhstation/blob/b3851d607f85c18edee0149d72922df8e077a46c/code/modules/mapping/reader.dm#L930'),
we do not check (ignore) five different things: `new()`, `newlist()`,
`icon()`, `matrix()`, and `sound()`. Since it's completely useless to
put it in a map and expect to see it code-side now-a-days, let's lint
against it just to be safe in the future.
## Why It's Good For The Game

Prevents silliness like in #72157 (which this PR is also reliant on for
checks to pass).

no changelog needed

* Fixes parallax on >2 level maps going fucky with optimized multiz (#72169)

## About The Pull Request

We no longer always render parallax.
This was causing issues because we can't isolate the white of space from
the vaugely white of everything else.

So instead, if your parallax plane is out of view, we'll not only
disable it, but we'll disable the strand we send from the main plane TO
it.

Instead only blending against the bottom stack.

This does mean there's a possibility for fullwhite on z transition
borders (potentially fixable), or when hijacking the plane (also
fixable, but significantly more annoying).

This is enough to make large maps functional though, so I'm happy with
it

## Why It's Good For The Game

Allows for #71731 and other maps like it. Makes my code actually work

## Changelog
:cl:
fix: Using optimized multiz on > 2 z layer maps will no longer cause
fucko bungo
/:cl:

* Automatic changelog for PR #72169 [ci skip]

* Shorten balloon alerts for wrapping (#72203)

## About Why It's Good For The Game The Pull Request
Fixes #71954

## Changelog
:cl: Tattle
fix: Wrapping balloon alerts are shorter and no longer contain spans
/:cl:

Co-authored-by: tattle <article.disaster@gmail.com>

* Automatic changelog for PR #72203 [ci skip]

* Fixes a bunch of sidemap/plane cube issues (#72178)

## About The Pull Request

[fixes solor trackers offsetting wrong, and panels not using plane
offsets](https://github.com/tgstation/tgstation/commit/8f461ab8ec17df5c158a564a3b3d92c165eb88f5)

[fixes cyborg hats offsetting phyiscally over their
head](https://github.com/tgstation/tgstation/commit/5fd5b4240efe71f0d8ac9a5b9342780cc2540a87)

[fixes reflector parts z fighting with their neighbors. if we physically
offset them, they'll have nothing to fight
with](https://github.com/tgstation/tgstation/commit/088dcfe91ff750fcfe78c02c85a3a63408c9b21f)

[fixes burgers layering wrong. uses a combo of pixel z to do the visual
offsets, and pixel_y to modify
layering](https://github.com/tgstation/tgstation/commit/ec39e2bcd39b1d8bd61a1f008a391b642f92a575)

[fixes signs, needed to use pixel_w instead of x, I think we may be
living under iso rules? I'm not totally sure I need to investigate
more](https://github.com/tgstation/tgstation/commit/560d152fd745d9f37dd4f6a9e67cc67f43b14821)

[fixes paperbin
rendering](https://github.com/tgstation/tgstation/commit/e6c57ec00eba1b4522b8ef1d056e0ef036a9e901)

## Why It's Good For The Game

Closes #72094
Closes #72035

* Gives shadow jaunt users a warning before moving into a lit area (#72154)

## About The Pull Request

When using Shadow Jaunt, if you are about to walk onto a tile that will
force you out of your jaunt, you will receive a warning and be held back
for a moment. After the delay, you will have a window to continue moving
into the light and leave your jaunt. If you need to get out of your
jaunt sooner, you can manually exit the shadow jaunt with the action
button.


https://user-images.githubusercontent.com/28870487/209010307-f8973e2d-b92d-4d2b-b0a1-3211a6eb034d.mp4

(It's a bit faster than shown in the video, just trust me)

It's not perfect, and with bad timing you might slip out of it anyways,
but it's better than nothing. If you are intentionally trying to bypass
a wall, you'll have to wait out the delay if you want to come out on the
other side of it.

There's a few minor code changes to help facilitate this.
check_light_level no longer ejects the jaunter on its own, instead
returning true or false based on if the light level is above the
acceptable amount. It also now receives a location to check the light
level of, rather than strictly checking the location of the jaunt
effect.

If this ends up being too clunky or restrictive, I'd be fine with
changing the warning to a toggleable option on the Nightmare's HUD.
## Why It's Good For The Game

Shadow jaunt moves you very fast, and is difficult to move precisely in
(especially when under the pressure of a tactical retreat). It's not
uncommon for Nightmares to accidentally fling themselves past a wall in
maintenance and be exposed in an unfavorable location.

There are already so many ways for a Nightmare to be screwed over.
Accidentally walking through a wall and dying is probably one of the
lamest.
## Changelog
:cl: Rhials
qol: Shadow Jaunter users now receive a brief warning before walking
into light and being forcibly un-jaunted.
/:cl:

* Automatic changelog for PR #72154 [ci skip]

* Anomalies can now be triggered at your location with admin_setup. Also sets control on setup() for events (#72065)

## About The Pull Request

Anomaly random events will now ask if you want their anomaly to spawn at
your location if triggered via admin setup.

This PR also makes a small but useful change to the logic for new
round_event objects. round_events now have their control (their
associated round_event_controller) set on New, rather than after setup
is called. Previously, round_events could not access control in their
setup proc (as it was not set at the time), meaning transferring
admin-chosen variables had to be done later in start/announce (depending
on which comes sooner).

While this has just been worked around in the past, the change needed to
be made here, as some anomaly event types announce first, and some start
first. The admin variables needed to be passed in earlier than
start/announce (in setup).

Short version: you can access control in round_event setup() now :D
## Why It's Good For The Game

MORE adminbus, MORE anomaly shenanigans (they're one of my favorite
event types). Also resolves a quirk in event code that bothered me in
other PRs I've made.
## Changelog
:cl: Rhials
admin: anomaly events now give the option to occur at your current
location when triggered with the Trigger Event admin verb
/:cl:

* Automatic changelog for PR #72065 [ci skip]

* Organizes the lists in `admin_verbs.dm` because I got sick and tired of looking at them, and one in particular (#72151)

## About The Pull Request
Title for the most part.

## Why It's Good For The Game
I was told, many, MANY, moons go, as a downstream host, that one of
these lists would rarely ever get touched.
What a fat lie that was.
The more I had to stare at this list the more infuriated I got with it.

Now, I just went ahead and organized most of the lists in this file, as
well as fixing comments to fit the format of `/* hey bozo */`. Where
applicable, things were organized into `/datums/admins/` and
`/client/proc` as well.

## Changelog

:cl: Jolly
code: The lists in admin_verbs.dm was organized to be made better. This
shouldn't affect the panels admins use at all, since they're already
alphabetized.
/:cl:

* Automatic changelog for PR #72151 [ci skip]

* Fixes turfs on centcom getting weird atmos adjacent turfs. (#72173)

## About The Pull Request

We compare the current_cycle var against time using <= But current_cycle
defaults to 0, so when we compare with a 0, it breaks

Let's just start with -1 yeah?

Fixes #72170

This is an old bug, I got bullied about it and then just... forgot
because my head is empty. Fixed now.

* Jellypeople and stargazers use the correct eyes sprite. (#72175)

## About The Pull Request

Jellypeople and stargazers both have three eye sockets on their sprites,
but due to the way eyes work, they use the incorrect eyes on their
sprite. This leads to both of these species looking fairly ugly, with
the wrong arrangement of eyes. This PR adds a unique eyes organ, "jelly
eyes", to these two species. This organ has no special properties, but
makes them properly display three eyes.


![image](https://user-images.githubusercontent.com/105025397/209075852-226ef72d-4f67-4b59-8438-c9aa72d07976.png)
_The current jellyperson eyes appearance vs. the new one, in obnoxious
pink for visibility._


![image](https://user-images.githubusercontent.com/105025397/209075951-23f317ab-63e7-482a-b843-b9a0246d3231.png)
_The new "jelly eyes"._

Incidentally, jelly eyes _can_ be implanted into other species to give
them three eyes. This can look somewhat odd depending on how a
particular species's eye sockets are drawn, but this is also an
extremely niche interaction - so most _likely_ not a problem.
## Why It's Good For The Game

The jelly eyes _already_ have existing on-mob sprites, so I can only
assume they stopped working due to a refactor in how eyes worked. These
species look better with the correct eyes sprites restored.
## Changelog
:cl:
fix: Implemented "jelly eyes" to make jellypeople and stargazers use the
proper eyes sprite.
/:cl:

* Automatic changelog for PR #72175 [ci skip]

* Fixes racks not crafting properly and deleting themselves (#72164)

## About The Pull Request

Rack parts now use get_turf instead of loc when being constructed from
your hands. Loc would be the user rather than a valid location, and the
rack parts would be consumed, meaning you lose your rack parts and get
no rack. Loc is used in a few other places in the racks/tables file, but
they all appear to be working fine other than this one instance.
## Why It's Good For The Game

We've gotta keep our stuff organized somehow, right?

Closes #72155
## Changelog
:cl: Rhials
fix: Racks now properly construct again
/:cl:

* Automatic changelog for PR #72164 [ci skip]

* Fixes Tinacusiate being impossible to make (#72171)

## About The Pull Request
Since failchems were removed, tinacusiate has been impossible to make.
While it's also the inverse of inacusiate, the values that determine
chem purity that inacusiate has makes it practically impossible to push
the purity much below the low 40s, let alone below 30% to make
tinacusiate. This changes those values slightly so it's possible to make
when purposefully doing so, but hard to get on accident.

## Why It's Good For The Game
Makes a chem that's basically a goof actually possible to synthesise.

## Changelog

:cl:
fix: Tinacusiate is now possible to make again.
/:cl:

Co-authored-by: Unit2E <ccupbestcup@protonmail.com>

* Automatic changelog for PR #72171 [ci skip]

* Fix adding mutations to advanced injectors not working without an occupant (#72122)

## About The Pull Request

You couldnt add mutations to an advanced injector if there was no
occupant inside the scanner
Now you can

## Why It's Good For The Game
Fixes #72099

## Changelog
:cl:
fix: You can now add mutations to advanced injectors without having an
occupant inside
/:cl:

* Automatic changelog for PR #72122 [ci skip]

* Quirks are passed an incoming client when applied, allowing quirks to read preferences in `add` and `add_unique`. Renders visual quirks on the preference menu dummy. (#72158)

## About The Pull Request

Closes #72141

Roundstart humans weren't in control of their mob by the time
`AssignQuirks` was called.
The call chain for roundstart goes `create_characters` ->
`equip_characters` -> `AssignQuirks` -> `transfer_characters`.
For latejoin, `create_character` -> `transfer_character` ->
`AssignQuirks`.

I could simply move around the call chain, but that feels much more
fragile and more liable to cause other issues to me. So instead, I
simply allowed add quirk to be passed a client, so that a client's
quirks can be applied to a mob they are not currently inhabiting.

In doing this, it became possible to show visual quirks on the prefs
dummy, like nearsighted glasses and heterochromia. So I put in a little
work to accomplish that as well.


![image](https://user-images.githubusercontent.com/51863163/209030560-58396d43-6ac2-40c5-b13f-1178dc8962fd.png)

Along side, some refactoring and documentation for quirk datums. 

## Why It's Good For The Game

People get what they expect on roundstart. 

## Changelog

:cl: Melbert
qol: The preview dummy in the preferences menu now shows some visual
quirks, like Heterochromia or nearsighted.…
  • Loading branch information
Show file tree
Hide file tree
Showing 861 changed files with 55,890 additions and 27,590 deletions.
11 changes: 9 additions & 2 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
/code/modules/awaymissions/ @Fikou
/code/modules/mining/ @Fikou
/code/modules/mod/ @Fikou
/code/modules/ruins/lavalandruin_code/ @Fikou
/code/modules/ruins/lavaland_ruin_code.dm @Fikou
/code/modules/mapfluff/ruins/lavalandruin_code/ @Fikou
/code/modules/mapfluff/ruins/lavaland_ruin_code.dm @Fikou

# JohnFulpWizard

Expand Down Expand Up @@ -171,6 +171,13 @@
/code/modules/atmospherics/ @Pickle-Coding
/code/modules/power/ @Pickle-Coding

# ZephyrTFA

/code/datums/json_savefile.dm @ZephyrTFA
/code/datums/armor/ @ZephyrTFA
/code/modules/client/preferences.dm @ZephyrTFA
/code/modules/client/preferences_savefile.dm @ZephyrTFA

# MULTIPLE OWNERS

/_maps/ @EOBGames @Maurukas @san7890 @ShizCalev
Expand Down
102 changes: 102 additions & 0 deletions .github/guides/VISUALS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ You'll find links to the relevant reference entries at the heading of each entry
- [Filters](#filters)
- [Particles](#particles)
- [Pixel offsets](#pixel-offsets)
- [Map formats](#map-formats)
- [Color](#color)
- [Transform](#transform)
- [Lighting](#lighting)
Expand Down Expand Up @@ -575,6 +576,107 @@ Fake offsets only effect visual position.
This doesn't really matter for our current map format, but for anything that takes position into account when layering, like `side_map` or `isometric_map`
it matters a whole ton. It's kinda a hard idea to get across, but I hope you have at least some idea.

## Map Formats
- [Table of Contents](#table-of-contents)
- [Reference Entry](https://www.byond.com/docs/ref/#/world/var/map_format)

`/world/var/map_format` tells byond how to render things well, in the world.
You can get away with thinking of it as rendering rules really.

There are 4 types currently. Only 2 that are interesting to us, and one that's neat for historical purposes.
Most of them involve changing how layering works, from the standard [layers](#layers) and [planes](#planes) method.
There's a bit more detail here, not gonna go into it, stuff like [underlays](https://www.byond.com/docs/ref/#/atom/var/underlays) drawing under things. See [Understanding The Renderer](https://www.byond.com/docs/ref/#/{notes}/renderer)

> There is very technically more nuance here.
> In default rendering modes, byond will conflict break by using the thing that is highest in the contents list of its location. Or lowest. Don't remember.
### [`TOPDOWN_MAP`](https://www.byond.com/docs/ref/#/{notes}/topdown)

This is the default rendering format. What we used to use. It tells byond to render going off [plane](#planes) first, then [layer](#layers). There's a few edgecases involving big icons, but it's small peanuts.

### [`SIDE_MAP`](https://www.byond.com/docs/ref/#/{notes}/side) (Check [the main page](https://www.byond.com/docs/ref/#/world/var/map_format) too!)

Our current rendering format, used in preparation for moving more things to 3/4ths.

This is essentially [isometric mode](#isometric_map), but it only works up and down.
This does mean we get some very nice upsides, like being able to be both in front and behind an object without needing to do cursed splitting or modifying layers.
It does come with some downsides, Mostly the flickering and debugging issues described above.

The idea is the closer to the front of the screen something is, the higher its layering precedence is.

`pixel_y` + `y` tell the engine where something "is".
`/atom/var/bound_width`, `/atom/var/bound_height` and `/atom/var/bound_x/y` describe how big it is, which lets us in theory control what it tries to layer "against".
I'm not bothering with reference links because they are entirely unrelated.

An issue that will crop up with this map format is needing to manage the "visual" (how/where it renders) and physical (where it is in game) aspects of position and size.
Physical position tells the renderer how to layer things. Visual position and a combination of physical bounds (manually set) and visual bounds (inferred from other aspects of it. Sprite width/height, physical bounds, transforms, filters, etc) tell it what the sprite might be rendering OVER.

Here's where things get really annoying for us. We cannot change physical bound outside of increments of 32.
That's because we use [`LEGACY_MOVEMENT_MODE`](https://www.byond.com/docs/ref/#/world/var/movement_mode).
This means we're almost always doomed to getting weird layering, cascading out from the source of the issue in a way that is quite hard to debug.

Oh right I forgot to mention. Sorta touched on it with [Pixel offsets](#pixel-offsets).
- `pixel_x/y` change something's position in physical space. So if you shoot this real high it'll layer as if it is where it appears to be,
- `pixel_w/z` change something's VISUAL position. So you can LAYER as if you're at the bottom of the screen, but actually sit at the top.

You can use the two of these in combination to shift something physically, but not visually. Often useful for making things layer right.
Any change in position (`pixel_x/y`) will only come into effect after crossing `/world/var/icon_size` / 2 and will round to the nearest tile.

What follows is a description, from lummox, of how physical conflicts are handled.

From [this post](https://www.byond.com/forum/post/2656961#comment26050050)

For the physical position, Y increases upward relative to the screen; view position has Y going downward. The topological order between two icons goes like this, in order:
- 1) If the icons don't visually overlap, they don't care which goes first.
- 2) If the icons do not overlap on the physical Y axis, whichever one is further back is drawn first.
- 3) If one has a lower layer, it's drawn first.
- 4) If one's "near" edge (physical Y) is closer to the top of the screen than the other, it gets drawn first.
- 5) If one's center is left of the other, it's drawn first.
- 6) If the two physical bounds are identical, whichever icon came first in the original array order is drawn first.
- 7) All tiebreakers failed so the icons give up and don't care which goes first.

It is worth stating clearly. Things will only "visually overlap" if they sit on the same [plane](#planes).
This is NOT counting [relays](#render-targetsource)/[plane masters](#planes) (when a plane master is relayed onto something else, you can think of it like drawing the WHOLE PLANE MASTER)
It's not like drawing everything on the plane master with effects applied. It's like drawing to a sheet, and then drawing with that sheet again.

This also leads to issues, and means there are some effects that are entirely impossible to accomplish while using sidemap, without using horrible [image](#images) tricks.
This is frustrating.

One more thing. Big icons are fucked

From the byond reference

>If you use an icon wider than one tile, the "footprint" of the isometric icon (the actual map tiles it takes up) will always be a square. That is, if your normal tile size is 64 and you want to show a 128x128 icon, the icon is two tiles wide and so it will take up a 2×2-tile area on the map. The height of a big icon is irrelevant--any excess height beyond width/2 is used to show vertical features. To draw this icon properly, other tiles on that same ground will be moved behind it in the drawing order.
> One important warning about using big icons in isometric mode is that you should only do this with dense atoms. If part of a big mob icon covers the same tile as a tall building for instance, the tall building is moved back and it could be partially covered by other turfs that are actually behind it. A mob walking onto a very large non-dense turf icon would experience similar irregularities.
These can cause very annoying flickering. In fact, MUCH of how rendering works causes flickering. This is because we don't decide on a pixel by pixel case, the engine groups sprites up into a sort of rendering stack, unable to split them up.

This combined with us being unable to modify bounds means that if one bit of the view is conflicting.
If A wants to be above B and below C, but B wants to be below A and above C, we'll be unable to resolve the rendering properly, leading to flickering depending on other aspects of the layering.
This can just sort of spread. Very hard to debug.

### [`ISOMETRIC_MAP`](https://www.byond.com/docs/ref/#/{notes}/isometric)

Isometric mode, renders everything well, isometrically, biased to the north east. This gives the possibility for fake 3d, assuming you get things drawn properly.
It will render things in the foreground "last", after things in the background. This is the right way of thinking about it, it's not rendering things above or below, but in a layering order.

This is interesting mostly in the context of understanding [side map](#side_map-check-the-main-page-too), but we did actually run an isometric station for april fools once.
It was really cursed and flickered like crazy (which causes client lag). Fun as hell though.

The mode essentially overrides the layer/plane layering discussed before, and inserts new rules.
I wish I knew what those rules EXACTLY are, but I'm betting they're similar to [side map's](#side_map-check-the-main-page-too), and lummy's actually told me those.
Yes this is all rather poorly documented.

Similar to sidemap, we take physical position into account when deciding layering. In addition to its height positioning, we also account for width.
So both `pixel_y` and `pixel_x` can effect layering. `pixel_z` handles strictly visual y, and `pixel_w` handles x.

This has similar big icon problems to [sidemap](#side_map-check-the-main-page-too).

### [`TILED_ICON_MAP`](https://www.byond.com/docs/ref/#/{notes}/tiled-icons)

Legacy support for how byond rendering used to work. It essentially locked icon sizes to `/world/var/icon_size`, so if you tried to add an icon state larger then that,
it would be automatically broken down into smaller icon states, which you would need to manually display. Not something we need to care about

## Color
- [Table of Contents](#table-of-contents)
- [Reference Entry](https://www.byond.com/docs/ref/#/atom/var/color)
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,15 @@ libaux*.so
aux*.pdb

# byond-tracy, we intentionally do not ship this and do not want to maintain it
# https://github.com/mafemergency/byond-tracy/
prof.dll
libprof.so

# Tracy can read source files when it is in the root folder, even without absolute paths.
# If you're interested, run this hack:
# https://gist.github.com/Mothblocks/db5462aa84d7d6b1d1b1276b820f62da
Tracy.exe

# JavaScript tools
**/node_modules

Expand Down
2 changes: 1 addition & 1 deletion _maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@
/area/ruin/space/has_grav/abandonedzoo)
"Ig" = (
/obj/machinery/light/directional/north,
/mob/living/simple_animal/hostile/carp,
/mob/living/basic/carp,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandonedzoo)
"LD" = (
Expand Down
8 changes: 4 additions & 4 deletions _maps/RandomRuins/SpaceRuins/caravanambush.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@
/turf/template_noop,
/area/template_noop)
"bl" = (
/mob/living/simple_animal/hostile/carp,
/mob/living/basic/carp,
/turf/template_noop,
/area/template_noop)
"br" = (
Expand Down Expand Up @@ -762,7 +762,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/syndicate/ranged/smg/space,
/mob/living/basic/syndicate/ranged/smg/space,
/turf/open/floor/iron/airless,
/area/shuttle/ruin/caravan/freighter3)
"Cj" = (
Expand Down Expand Up @@ -1029,7 +1029,7 @@
/area/shuttle/ruin/caravan/freighter3)
"PF" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/syndicate/ranged/smg/space,
/mob/living/basic/syndicate/ranged/smg/space,
/turf/open/floor/iron/airless,
/area/shuttle/ruin/caravan/freighter3)
"PY" = (
Expand Down Expand Up @@ -1186,7 +1186,7 @@
/obj/effect/turf_decal/box/white/corners{
dir = 4
},
/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper,
/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper,
/turf/open/floor/iron/dark/airless,
/area/shuttle/ruin/caravan/freighter3)
"Zz" = (
Expand Down

0 comments on commit ae9b907

Please sign in to comment.