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

Refactors Get_Angle() and related procs #5212

Merged
merged 8 commits into from
Dec 22, 2023

Conversation

Doubleumc
Copy link
Contributor

@Doubleumc Doubleumc commented Dec 13, 2023

About the pull request

To begin, fixes #5206. Get_Compass_Dir() needed atoms with valid coordinates, but didn't test for them. Adding some checks and get_turfs resolved that issue.

But then if Get_Compass_Dir() needed those checks, Get_Angle() did too. And get_angle() (lowercase!). And get_angle_raw(). And half of Get_Compass_Dir() was just duplicated code from Get_Angle(). And--

So I took inspiration from how TG and TGMC did it and refactored the lot.
https://github.com/tgstation/tgstation/blob/32fb42d19e0c763f7e5e3dafb9844d0f05e86630/code/__HELPERS/maths.dm#L1-L17
https://github.com/tgstation/TerraGov-Marine-Corps/blob/3963b2d5b89dd60b88a7a1534ee77bd654abe953/code/__HELPERS/unsorted.dm#L99-L159

REMOVED:

  • get_angle_raw() - never used
  • get_angle() - used 3 places, identical use case to Get_Angle()
  • get_pixel_angle() - used once, replaced by delta_to_angle()

ADDED:

  • angle_to_dir() - pulls out the only unique thing Get_Compass_Dir() actually did
    • only difference from TGMC is it retains our angle breakpoints instead of theirs
  • delta_to_angle() - the only thing that actually calculates an angle, uses the 2-argument version of arctan()

CHANGED:

  • Get_Angle() - removed the tile_bound branch (never used), added checks and get_turfs, position deltas passed to delta_to_angle()
    • only difference from TGMC is it retains return 0s instead of CRASHes, retains get_pixel_position_x/y, and passing to delta_to_angle()
  • Get_Compass_Dir() - gutted, now just a convenience function of Get_Angle() piped into angle_to_dir()

Explain why it's good for the game

Having multiple unused or barely used functions trying to do the same thing makes code maintenance harder.

Testing Photographs and Procedure

  • doesn't crash
  • security tuner APC detection works
  • SL/queen tracker works
  • bullets face the right way

Changelog

🆑
fix: Fixed security tuner not dispalying direction to room's APC
refactor: Refactored code handling angles
/:cl:

@fira
Copy link
Member

fira commented Dec 13, 2023

Does that change anything functionally speaking or should have no practical effects?

@Doubleumc
Copy link
Contributor Author

Doubleumc commented Dec 13, 2023

The only potential difference is where get_angle() was replaced by Get_Angle().

get_angle() used (32 * start.x + start.pixel_x) while Get_Angle() uses get_pixel_position_x(start).
image
image

Since they're both calculating the pixel offset and get_pixel_position is just a more thorough solution to that, I can't think of a situation where a difference - if any - is less accurate instead of more.

Everything else is functionally or literally identical.

switching to the native function introduced in 513
no longer using its own bespoke copy of angle code
arctan(x, y) can handle nulls and zeroes by itself
Get_Pixel_Angle() renamed and refactored, Get_Angle() now calls it instead of having its own calcuation
@Doubleumc
Copy link
Contributor Author

Additional potential difference: projectile trajectory code used 280 as west. Now that it uses delta_to_angle() it will return 270 instead.
image

@Doubleumc Doubleumc changed the title TGMC-ifies Get_Angle() and related procs Refactors Get_Angle() and related procs Dec 14, 2023
@fira
Copy link
Member

fira commented Dec 16, 2023

WOOPS funny typo
Either way this looks good to me

@Drulikar Drulikar added Fix Fix one bug, make ten more Refactor Make the code harder to read Testmerge Candidate we'll test this while you're asleep and the server has 10 players labels Dec 19, 2023
@Red-byte3D
Copy link
Contributor

pretty sure this is making slugs and buckshot stuns pull you towards marines

@Birdtalon
Copy link
Contributor

dreamseeker_2023-12-20_19-42-13

This behaviour has been observed being caused by shotgun slugs while this PR has been on testmerge.

@Birdtalon Birdtalon marked this pull request as draft December 20, 2023 19:45
@Red-byte3D
Copy link
Contributor

dreamseeker_2023-12-20_19-42-13 dreamseeker_2023-12-20_19-42-13

This behaviour has been observed being caused by shotgun slugs while this PR has been on testmerge.

buckshot also moves you weirdly, if its not a pb

@Doubleumc
Copy link
Contributor Author

Thanks for the bug report. Looks like the cause is a combination of a few factors.

This is the relevant code being called on slug impact:

/datum/ammo/proc/slam_back(mob/living/living_mob, obj/projectile/fired_projectile)
/// Either knockback or slam them into an obstacle.
var/direction = Get_Compass_Dir(fired_projectile.z ? fired_projectile : fired_projectile.firer, living_mob) //More precise than get_dir.

It gets the direction of impact based on Get_Compass_Dir() between the projectile and the target.

The original Get_Compass_Dir() implementation did not take pixel offsets into account. The new one calls Get_Angle() which does, as mentioned previously: #5212 (comment)

The pixel offsets for a projectile can be very offset since they're used to animate pixel movement across multiple tiles at a time. Further, the pixel offsets are only adjusted once per flight processed, while it is entirely possible for a projectile to move multiple tiles in a flight and any hit will occur in the middle of a flight.

When Get_Compass_Dir() is called on such a projectile its visual offset relative to its actual position is very unpredictable, sometimes by several tiles. And so slam_back() throws the target in an unpredictable direction.

My solution is to get_turf() both inputs to Get_Compass_Dir(), effectively discarding any such offsets. I believe that is in line with the proc's intent of "like get_dir(), but with better angles."

If there are additional issues of this nature I intend to restore the tile_bound argument to Get_Angle() and have Get_Compass_Dir() and other impacted procs use it.

@Birdtalon
Copy link
Contributor

Birdtalon commented Dec 20, 2023

EDIT: I see you posted some fixes while I was writing this. 👍

Have done some investigation on this which would be interesting to get your input @Doubleumc .
See pic
dreamseeker_2023-12-20_21-23-13

I used this test scenario to test on master vs with this PR. I used this because we know with the position of these two mobs. The resulting knockback would be expected to be NORTHEAST.

These are the calculations I used for master

Master

Human x = 2, y = 2
Xeno x = 5, y = 5
Projectile x = 4, y = 4

(Projectile)
dy = 5 – 4 = 1
dx = 5 – 4 = 1
arctan(1/1) = 45
45 returns NORTHEAST
In game: NORTHEAST

Since we just use co-ordinates this is pretty simple and returns the expected result.

On this branch this is how my calculations result, this is kinda psudocode as I tried to do the math along with the execution of the code.

Get Angle
Human x = 2, y = 2
Xeno x = 5, y = 5 
Projectile x = 4, y = 4
dy = get_pixel_position_y(xeno) – get_pixel_position_y(projectile)
	get_pixel_position_y(xeno)
		. = (pixel_y = 0) + (base_pixel_y = 0) = 0
		. += 32 * 5 = 160
		. = 160
		. += (48 – 32) / 2 = 8
		. = 168
	get_pixel_position_y(projectile)
		. = 19 + 0 = 19
		. += 32 * 4 = 128
		. = 147
		. += 32 – 32 / 2 = 0
		. = 147
dy = 168 – 147 = 21

dx = get_pixel_position_x(xeno) – get_pixel_position_x(projectile)
	get_pixel_position_x(xeno)
		. = -12 + 0 = -12
		. += 32 * 5 = 160
		. = 148
		. += (48 – 32) / 2 = 8
		. = 156
	get_pixel_position_x(projectile)
		. = 22 + 0 = 22
		. += 32 * 4 = 128
		. = 150
		. += 32 – 32 / 2 = 0
		. = 150
dx = 156 – 150 = 6

delta_to_angle()
arctan(21,6) = 15.945
RETURNS NORTH

The drone moves north as per the pic above. But the expected behaviour is for the drone to move northeast.

Interestingly I also did the same math for the relative position of the Human and the Xeno.

Get Angle
Human x = 2, y = 2 | 
Xeno x = 5, y = 5 |
dy = get_pixel_position_y(xeno) – get_pixel_position_y(Human)
	get_pixel_position_y(xeno)
		. = (pixel_y = 0) + (base_pixel_y = 0) = 0
		. += 32 * 5 = 160
		. = 160
		. += (48 – 32) / 2 = 8
		. = 168
	get_pixel_position_y(human)
		. = 0 + 0 = 0
		. += 32 * 2 = 64
		. = 64
		. += (32 – 32) / 2 = 0
		. = 64
dy = 168 – 64 = 104



dx = get_pixel_position_x(xeno) – get_pixel_position_x(human)
	get_pixel_position_x(xeno)
		. = -12 + 0 = -12
		. += 32 * 5 = 160
		. = 148
		. += (48 – 32) / 2 = 8
		. = 156
	get_pixel_position_x(human)
		. = 0 + 0 = 0
		. += 32 * 2 = 64
		. = 64
		. += (32 – 32) / 2 = 0
		. = 64
dx = 156 – 64 = 92

delta_to_angle()
arctan(104,92) = 41.4694…
returns NORTHEAST

Bear in mind with this scenario I was shooting at the middle of the xeno sprite which resulted in the projectile being below the xeno, so maybe NORTH relative to the projectile in that case is expected? I haven't got time to do more testing but would be interesting to get your thoughts on the whole thing.
One thing worth noting although you may already know is that the usage of arctan() is changed with this PR as giving 2 arguments returns polar angle as the below quote from the Byond reference.

The two-argument form uses the polar angle. This angle starts at 0° for due east, and increases counter-clockwise from there. Therefore 1,0 has an arctangent of 0°, 0,1 is 90°, -1,0 is 180°, and so on. At point 0,0 the angle is undefined since it could be any angle, but arctan will return 0.

Have we accounted for this in angle_to_dir()?

My trigonometry is very rusty and you have been looking at this so would be interesting to hear your take.

--

@Doubleumc Doubleumc marked this pull request as ready for review December 20, 2023 22:15
@Doubleumc
Copy link
Contributor Author

@Birdtalon thank you for the detailed investigation. As far as I can tell your math is entirely correct, and that NORTHEAST is indeed the expected knockback direction. Your work gives me further confidence that the issue was in the pixel offsets. For example, here is projectile-to-xeno calculation using the get_turf() fix:

Get Angle
Human x = 2, y = 2
Xeno x = 5, y = 5 
Projectile x = 4, y = 4
dy = get_pixel_position_y(xeno) – get_pixel_position_y(projectile)
	get_pixel_position_y(xeno)
		. = (pixel_y = 0) + (base_pixel_y = 0) = 0
		. += 32 * 5 = 160
		. = 160
		. += 0 + 0 = 0
		. = 160
	get_pixel_position_y(projectile)
		. = 0 + 0 = 0
		. += 32 * 4 = 128
		. = 128
		. += 0 + 0 = 0
		. = 128
dy = 160 – 128 = 32

dx = get_pixel_position_x(xeno) – get_pixel_position_x(projectile)
	get_pixel_position_x(xeno)
		. = 0 + 0 = 0
		. += 32 * 5 = 160
		. = 160
		. += 0 + 0 = 0
		. = 160
	get_pixel_position_x(projectile)
		. = 0 + 0 = 0
		. += 32 * 4 = 128
		. = 128
		. += 0 + 0 = 0
		. = 128
dx = 160 – 128 = 32

delta_to_angle()
arctan(32,32) = 45
RETURNS NORTHEAST

It now returns NORTHEAST, as is expected.

You are absolutely correct that arctan(x, y) produces different results from arctan(x / y), giving east-counterclockwise angles instead of the north-clockwise ones we are more familiar with and which angle_to_dir() expects. Instead, this uses arctan(y, x) with the x and y transposed:
image
This transposition causes arctan() to return north-clockwise angles again. The Wikipedia article that I pulled it from explains it far better than I can:
https://en.wikipedia.org/wiki/Atan2#East-counterclockwise,_north-clockwise_and_south-clockwise_conventions,_etc.

Copy link
Contributor

@Drulikar Drulikar left a comment

Choose a reason for hiding this comment

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

Tuner finding and slug usage appears to be working as intended; not been any other reports as far as I've seen from test merging either.

@Drulikar Drulikar added this pull request to the merge queue Dec 22, 2023
Merged via the queue into cmss13-devs:master with commit c0c308f Dec 22, 2023
27 checks passed
cm13-github added a commit that referenced this pull request Dec 22, 2023
@Doubleumc Doubleumc deleted the TGMC-Get_Angle branch December 22, 2023 06:07
@Huffie56 Huffie56 mentioned this pull request Dec 22, 2023
3 tasks
Fray2 pushed a commit to RU-CMSS13/RU-CMSS13 that referenced this pull request Jan 11, 2024
* Automatic changelog for PR #5241 [ci skip]

* Additional ui_act checks for tacmap (#5255)

# About the pull request

This PR adds additional checks for the ui_acts when using the tacmap
interface.

# Explain why it's good for the game

Should shore up most flaws allowing weird usage of it.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


![image](https://github.com/cmss13-devs/cmss13/assets/76988376/efbf579c-814d-41fd-bea4-d2581b4bf4f7)

</details>


# Changelog

No player facing changes.

* Fix Santa Hats breaking due to map camouflage (#5268)

# About the pull request

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->
Simple as it can be - the map camouflage was applied on santa helmets
when they don't have camouflage variants

# Explain why it's good for the game
Spirit of holidays and all that

# Testing Photographs and Procedure
Spawn on a camo-enabled map


# Changelog
:cl:
fix: Fix Xmas helmets getting overriden by map camouflage.
/:cl:

---------

Co-authored-by: Drathek <[email protected]>

* Automatic changelog for PR #5268 [ci skip]

* minor tacmap ui change (#5264)

# About the pull request
it's kind of been bothering me for a bit, just some minor tacmap ui
changes.

# Explain why it's good for the game

I got ocd, please merge. 

# Testing Photographs and Procedure
<img width="534" alt="Screen Shot 2023-12-20 at 3 24 17 PM"
src="https://github.com/cmss13-devs/cmss13/assets/122310258/72b17b85-0453-49cc-94a7-dfe944b3cbb7">

<img width="389" alt="Screen Shot 2023-12-20 at 3 27 20 PM"
src="https://github.com/cmss13-devs/cmss13/assets/122310258/6f87f439-b8b8-4167-9bd3-c98af2fc8b2f">

# Changelog
:cl:
ui: tacmap ui tweaks
/:cl:

* Automatic changelog for PR #5264 [ci skip]

* Hopefully fixes hijack bug (#5261)

# About the pull request
Will hopefully stop hijack ending the round prematurely.
<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Hijack should no longer end the round immediately.
/:cl:

* Automatic changelog for PR #5261 [ci skip]

* Ghost listening device preference (#5219)

# About the pull request
Ghosts can now toggle between hearing and not hearing listening devices.

## THIS DEFAULTS TO OFF

# Explain why it's good for the game
Bit of peace of mind, a lot of text can be duplicated by hearing
listening devices as a ghost.
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
add: Ghosts can now toggle hearing listening devices or not. This is
dependant on hearing radios and will not function to allow hearing
devices without also hearing radios.
/:cl:

---------

Co-authored-by: Drathek <[email protected]>

* Automatic changelog for PR #5219 [ci skip]

* Fixes NE DS doorgun deployment bug (#5213)

# About the pull request
fixes #5236
fixes the issue that makes DS doorgun deploy itself into DS when placed
on NE gunslot

# Explain why it's good for the game

doorgun in wall bad


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog

:cl:
fix: bad DS doorgun placement
/:cl:

---------

Co-authored-by: Drathek <[email protected]>
Co-authored-by: harryob <[email protected]>

* Automatic changelog for PR #5213 [ci skip]

* Fixes fire resist spamming (#5253)

# About the pull request

Fixes #5247 and fixes #5124 by changing the
`if(!is_mob_incapacitated(TRUE))` check near the end of
`/mob/living/verb/resist()` to `if(mobility_flags & MOBILITY_MOVE)`.
This was causing the bug because `is_mob_incapacitated()` doesn't check
for the `WEAKEN` effect, which is what is added by `resist_fire()`.
(Editing `is_mob_incapacitated()` so that it checks for it would
probably work too, but since TG uses the `MOBILITY_MOVE` thing and this
system is ported from there, I figured I'd just go with that.)

# Explain why it's good for the game

Fixes fire being too easy to remove.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Before:**


https://github.com/cmss13-devs/cmss13/assets/57483089/0b5b6777-4286-4eb1-9293-09ffcaa4fb4b

**After:**


https://github.com/cmss13-devs/cmss13/assets/57483089/84097909-a081-4c4f-8400-59e955b8a443

(Ignore the "There are no pipes within range" message, that's from one
of my macros.)

</details>


# Changelog
:cl:
fix: Fixed being able to remove multiple stacks of fire by spamming
resist.
/:cl:

* Automatic changelog for PR #5253 [ci skip]

* Refactors Get_Angle() and related procs (#5212)

# About the pull request

To begin, fixes https://github.com/cmss13-devs/cmss13/issues/5206.
`Get_Compass_Dir()` needed atoms with valid coordinates, but didn't test
for them. Adding some checks and `get_turf`s resolved that issue.

But then if `Get_Compass_Dir()` needed those checks, `Get_Angle()` did
too. And `get_angle()` (lowercase!). And `get_angle_raw()`. And half of
`Get_Compass_Dir()` was just duplicated code from `Get_Angle()`. And--

So I took inspiration from how TG and TGMC did it and refactored the
lot.

https://github.com/tgstation/tgstation/blob/32fb42d19e0c763f7e5e3dafb9844d0f05e86630/code/__HELPERS/maths.dm#L1-L17

https://github.com/tgstation/TerraGov-Marine-Corps/blob/3963b2d5b89dd60b88a7a1534ee77bd654abe953/code/__HELPERS/unsorted.dm#L99-L159

REMOVED:
- `get_angle_raw()` - never used
- `get_angle()` - used 3 places, identical use case to `Get_Angle()`
- `get_pixel_angle()` - used once, replaced by `delta_to_angle()`

ADDED:
- `angle_to_dir()` - pulls out the only unique thing `Get_Compass_Dir()`
actually did
- only difference from TGMC is it retains our angle breakpoints instead
of theirs
- `delta_to_angle()` - the only thing that actually calculates an angle,
uses the 2-argument version of `arctan()`

CHANGED:
- `Get_Angle()` - removed the `tile_bound` branch (never used), added
checks and `get_turf`s, position deltas passed to `delta_to_angle()`
- only difference from TGMC is it retains `return 0`s instead of
`CRASH`es, retains `get_pixel_position_x`/`y`, and passing to
`delta_to_angle()`
- `Get_Compass_Dir()` - gutted, now just a convenience function of
`Get_Angle()` piped into `angle_to_dir()`

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game

Having multiple unused or barely used functions trying to do the same
thing makes code maintenance harder.
# Testing Photographs and Procedure
- [x] doesn't crash
- [x] security tuner APC detection works
- [x] SL/queen tracker works
- [x] bullets face the right way


# Changelog
:cl:
fix: Fixed security tuner not dispalying direction to room's APC
refactor: Refactored code handling angles
/:cl:

* Automatic changelog for PR #5212 [ci skip]

* Automatic changelog compile [ci skip]

* Liason typo fix and Goon construction buff. (#5227)

# About the pull request

Liason is not spelt like that, fixes the USS Almayer area and the ICC
path.

Goon could not build cades due to skills = and not additional_skills
allowing the parent, survivor, to give construction one to it's
subpaths.

# Explain why it's good for the game

Spell check good

I am pretty sure that the Goon is the only survivor not being able to
build basic cades, I don't see why we restrict that considering that all
the other security survivors are able to build them.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
balance: rebalanced goon skillset to include construction 1
spellcheck: fixed Liason area typos to Liaison
spellcheck: fixed the ICC Liason to ICC Liaison typo
/:cl:

---------

Co-authored-by: Jeff Watchson <[email protected]>

* Automatic changelog for PR #5227 [ci skip]

* nerfs window frames (#5267)

# About the pull request

any xeno can now apply acid ~~or slash~~ reinforced/normal window frames



# Explain why it's good for the game

Currently, building as a drone is extremely difficult in maps such as
New Valdero and Chances Claim due to your complete inability to clear
window frames, forcing you to yell at the AFK warriors in hive to spend
5 minutes clicking on a window frame. I don't see a good reason for
window frames to be completely invulnerable to smaller xenomorphs.


# Testing Photographs and Procedure

</details>


# Changelog



:cl:
balance: xenos can now acid all window frames.
/:cl:

* Automatic changelog for PR #5267 [ci skip]

* Fix Xmas barricade decorator not working (#5270)

# About the pull request

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->
Decorator changed the main icon of barricades. Not only this is bad due
to the file not being up to date, but also wiring doesn't care and
reuses the builtin icon file.

# Explain why it's good for the game
Event code not working

# Testing Photographs and Procedure
Spawn in, test


# Changelog
:cl:
fix: Fixed X-mas barricade wiring not applying properly.
/:cl:

---------

Co-authored-by: Drathek <[email protected]>

* Automatic changelog for PR #5270 [ci skip]

* Automatic changelog compile [ci skip]

* Allows Xenomorphs to turn off the dropship's launch alarm (#5210)

# About the pull request

Allows Xenomorphs to turn off the dropship's launch alarm without the
queen needing to launch.

# Explain why it's good for the game

Occasionally (2-3 times that I can think of, at least) someone turns on
the dropship's launch alarm after the queen calls it down, resulting in
a situation where if the queen wants to wait for evolutions or something
else, the entire hive has to listen to a beeping noise for multiple
minutes.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


https://github.com/cmss13-devs/cmss13/assets/57483089/9014b2bb-a68a-4ef8-b7ee-1f3e03ce2575

</details>


# Changelog
:cl:
add: Allowed Xenomorphs to turn off the dropship's launch alarm by
hitting the nav computer.
/:cl:

* Automatic changelog for PR #5210 [ci skip]

* Fixes Flight Control Operator surv + gave him a windbreaker and one more access. (#5257)

# About the pull request

Gives him a jacket, some flight W-Y flight control access and fixed the
type path.

# Explain why it's good for the game

I forgot to give him a jacket in the previous PR, fixes always good +
he's a flight control operator and should have access to at least the WY
flight control doors.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
add: Added a windbreaker to the Flight Control Operator surv.
add: Added W-Y Flight Control access to the Flight Control Operator
surv.
fix: fixed the Flight Control Operator path.
/:cl:

Co-authored-by: Jeff Watchson <[email protected]>

* Automatic changelog for PR #5257 [ci skip]

* Camera console green-ness fix (#5271)

# About the pull request

Fixes #5077.
This was caused by a green lighting filter which was accidentally
included in #4940.

If someone wants to add it properly then another PR could be opened
after this, or maybe this one could be treated as a sort of 'reverse PR'
and closed in order to keep the overlay.

# Explain why it's good for the game

It's technically a bug rather than a feature at the moment.

# Testing Photographs and Procedure
<details>
<summary>Screenshots</summary>

**Before:**

![UneAhPrK3C](https://github.com/cmss13-devs/cmss13/assets/57483089/3eb7fe0e-d526-4f56-aba8-09bafca8ad9c)

**After:**

![GZ9ZBPx3n1](https://github.com/cmss13-devs/cmss13/assets/57483089/34ee98a9-05f5-473a-b158-2af44912586b)

</details>


# Changelog
:cl:
del: Removed the green overlay from camera consoles.
/:cl:

* Automatic changelog for PR #5271 [ci skip]

* adds forced scream emote after warrior lunge (#5273)

# About the pull request

~~Created a new emote called panic, it's very similar to scream and
inherits virtually all of its properties and methods however the ogg
files are of course different.~~
Added a scream emote whenever a warrior lunges and grabs a human mob,
also added one more ogg audio file to the scream list.

# Explain why it's good for the game

~~Initially I just wanted to add a forced a scream emote whenever a
warrior lunged at a human mob, but I sort of found the existing scream
ogg sounds to be kind of lack luster. However, they are iconic in their
own right and removing them or modifying them would be a detriment to
the game. I chose to create a new emote entirely rather than adding
audio files to the existing one. The emote which is similar to scream
but the sounds are more "authentic" and erm, immersive. So far it's just
two sounds for each gender but this will be changed once I find more
audio files to add.~~

Warrior lunges at marines should be a traumatic experience that gives
them ptsd.

# Changelog

:cl:
add: human mobs now scream whenever they get lunged at by a warrior.
soundadd: added a new scream sound and put it into the existing scream
list.
/:cl:

* Automatic changelog for PR #5273 [ci skip]

* Fix Crusher Pass Flags (#5266)

# About the pull request

This PR is a followup to #5175 that overlooked that the usage of
throw_atom will by default add either `PASS_OVER_THROW_MOB` or
`PASS_OVER_THROW_ITEM` to the pass flags unless `LOW_LAUNCH` is used
instead.

# Explain why it's good for the game

Fixes #5220 

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


![croosh](https://github.com/cmss13-devs/cmss13/assets/76988376/dac2e275-e261-475a-b52d-8823e14d0bc4)

</details>


# Changelog
:cl: Drathek
fix: Fix crusher charge and tumble abilities going over unwired cades
/:cl:

* Automatic changelog for PR #5266 [ci skip]

* New Healer Drone Ability: Sacrifice, another go (#5173)

# About the pull request

New healer drone skill — sacrifice. If things get really bad, the healer
can instantly transfer 75% of its current health, but for the great cost
of the healer’s own life.

The sacrifice ability is an emergency button. You don’t have to use it,
but at some point you may find that sacrifice is a right thing to do, so
it’s a nice option to have. I want to emphasize that this skill is not a
necessary part of the healer gameplay. You don’t have to trade your life
for the life of another xeno. But you can if you are willing to.

Also healer drones gets a counter of the health it has transferred. If
healer drone transfers at least 10 000 health points, it will be able to
respawn after using the sacrifice ability (like acid runner after
kaboom).

# Explain why it's good for the game

Saving fellow xenos is the most satisfying part of healer drone’s
gameplay. This ability allows to save others in really dire situations,
but for the great cost. It’s still fitting, because drone already can
use heal ability until it goes into crit or dies, in some situations
it’s a worthy risk. Also rewards long living healer drones with the
opportunity to use the ability without dying.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl: ihatethisengine
balance: New healer drone ability — sacrifice. Healer drone can
instantly transfer 75% of its current health, but for the great cost of
the healer’s own life.
/:cl:

---------

Co-authored-by: ihatethisengine <[email protected]>
Co-authored-by: harryob <[email protected]>
Co-authored-by: Drathek <[email protected]>

* Automatic changelog for PR #5173 [ci skip]

* DS doorgun no longer drops the gun when destroyed (#5211)

# About the pull request

this bug has been around for a looong time, someone might be tempted to
abuse it with the MG changes

# Explain why it's good for the game

moveable m56d with 1500 rounds that can shoot over cover is not intended


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog

:cl:
fix: DS doorgun no longer drops the gun when destroyed
/:cl:

---------

Co-authored-by: vincibrv <[email protected]>
Co-authored-by: Drathek <[email protected]>

* Automatic changelog for PR #5211 [ci skip]

* Makes `xenoboldnotice` actually bold (#5279)

# About the pull request

Makes the `xenoboldnotice` span class actually bold, rather than italic.
Interestingly, it's correct on the 'old chat' stylesheet, so presumably
it just got missed when TG-chat was added.

https://github.com/cmss13-devs/cmss13/blob/53f62c436dabcea7970fcfde1faaa1dcc37a4229/code/stylesheet.dm#L102

# Explain why it's good for the game

The class called 'xenoboldnotice' should be bold.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Before:**

![before](https://github.com/cmss13-devs/cmss13/assets/57483089/46fa54cc-1ee6-4046-ba86-2f75deadc7fe)

**After:**

![after](https://github.com/cmss13-devs/cmss13/assets/57483089/896a8119-fcec-4c9f-be11-86e7cd95ac44)

<hr>

**Current 'old chat' version, for reference:**

![old](https://github.com/cmss13-devs/cmss13/assets/57483089/d14538d4-7abf-4b20-8b83-076863248cfc)

</details>


# Changelog
:cl:
spellcheck: Made the `xenoboldnotice` span class bold rather than
italic.
/:cl:

* Automatic changelog for PR #5279 [ci skip]

* Areas almayer qol (#5254)

# About the pull request
added some more areas to almayer
reworked lower engi areas position giving them parent for being lower
etc...
remove an extra light

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game
More areas allow to make it easier to navigate the ship and make the
localisation system more efficient...
better parent avoid repeating lines of code and make it easier to
maintain/change it in the future.
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: removed an extra light in bravo cryo room(to do just saw it)
maptweak: added more areas (stern_point_defense, Lower Deck Stern Hull,
Upper Deck port Hallway Upper Deck starboard Hallway)
/:cl:

---------

Co-authored-by: Julien <[email protected]>

* Automatic changelog for PR #5254 [ci skip]

* Automatic changelog compile [ci skip]

* Further vanguard tweaks that drop the root from 2.5 to 1.8 (#5215)

# About the pull request
I believe the latest buff pr i overtuned the root a bit too much,
thinking it wouldnt be too hard since you can still technically act.
# Explain why it's good for the game

2.5 root is a bit too much currently so im bringing it down to 1.8 so
its still good but not busted like 2.5

# Testing Photographs and Procedure
<details>
it works
</details>


# Changelog

:cl:
balance: Tweaks down the buffed root of vanguard down to 1.8 from 2.5
/:cl:

Co-authored-by: InsaneRed <[email protected]>

* Automatic changelog for PR #5215 [ci skip]

* Automatic changelog compile [ci skip]

* Dropship weapons console TGUI (#4812)

# About the pull request

Migrates the dropship weapons panel to TGUI. Design is primarily
inspired by the MultiFunction Displays used in modern aircraft.

The UI consists of two identical and independent panels. The pilot can
choose which panels to display.

Code wise this PR introduces the MFD which is a reusable component.

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game
nanoui bad tgui good
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.
## Update - Some styling improvements
Improving the overall look and feel, making the background a dark grey
over a black, rounding the edges. Making inactive buttons appear greyed
out.

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/0965b5cb-21b0-4b7f-84ea-40651e83a02e)



## Welcome screen - blurb for lore

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/5872dcb6-ba87-485e-a736-8de0b3e5e36d)

## Equipment panel and map 

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/85fde5cc-e4a8-439e-8c55-d010a4780d8c)

## Equipment panel with camera

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/034a2833-d37c-4c6b-8b08-64e3e09aefb0)

## Weapon panel and Camera 

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/ce246258-a879-4220-b481-3d5fbc800651)

## Target Acquisition with camera

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/2778b9da-76f9-4c37-b3ba-9d45a1bdc625)
 
## Medevac lift with stretcher camera

![image](https://github.com/cmss13-devs/cmss13/assets/101871009/7e9ef10b-811c-4922-9f24-ae805bae24d9)


</details>


# Changelog
:cl:
ui: tgui dropship weapons console
refactor: added MFD panel
refactor: creates datum component to manage camera code
qol: CAS weapons operator can see camera in UI
add: CAS can offset in X and Y coordinates
refactor: CAS can offset in different direction to attack vector
/:cl:

---------

Co-authored-by: fira <[email protected]>

* Automatic changelog for PR #4812 [ci skip]

* Executive Officer's Weapons Vendor + More Belt Options (#5179)

# About the pull request

This PR adds a new 'weapons' vendor for the Executive Officer to acquire
a suite of personal gear for their use. It also adds a new belt category
to their uniform vendor to give the Executive Officer more options in
what kind of belt they want to take.

The XO can chose to vend either a MK1 M41A weapon's kit, equilivant to
the armoury, or a MK221 shotgun kit which comes with a box of buckshot
and slug rounds each.

# Explain why it's good for the game

The Executive Officer exists as a sort of stepping stone to the
Commanding Officer to a degree, because of this, it has been somewhat
languishing in-between the Commander and Staff Officers.

The CO has a full suite of personal vendors and unique equipment to pick
from, and the Staff Officers have their own unique weapons vendor and
ancillary equipment from the armoury they can select, including special
medical and engineering kits.

The Executive Officer only has a uniform vendor to draw from, but
otherwise they are forced to skim off of the armoury and the staff
officer's equipment.

Due to the recent rule changes that allow the XO to deploy more freely
groundside, as well as deploying during a Nuclear weapon deployment, I
feel the time is now to address the issue.

Ergo, this PR adds a new vendor to give the XO more options on what
equipment they can take for when they deploy, or for hijack. The
equipment is somewhat in keeping with what the CO gets, minus the
special equipment. Ergo, it can help an aspiring CO get a better idea of
how their setup works for the CO just as it does for a XO.

In terms of abuse, I do not believe this will be a issue. The XO is held
to the highest standards of roleplay outside of whitelisted roles, an XO
already has the power to loot the armoury or requisitions, I do not
believe this will enable something negative considering they already
have that ability if they want to.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

![Screenshot 2023-12-10 16 24
09](https://github.com/cmss13-devs/cmss13/assets/6595389/67eea32f-8192-406f-9684-fe70e22b6542)

![Screenshot 2023-12-10 16 24
02](https://github.com/cmss13-devs/cmss13/assets/6595389/74cb5419-c34d-4c53-beb9-eb3e57fdb4e2)


</details>


# Changelog
:cl:
add: The Executive Officer now has a personal weapons vendor. It
includes the ability to acquire a full suite of combat and support gear,
giving the XO more agency in customizing their loadout.
add: Adds a new set of belts to the Executive Officer's uniform vendor. 
/:cl:

---------

Co-authored-by: Steelpoint <[email protected]>

* Automatic changelog for PR #5179 [ci skip]

* Fix acid resisting (#5288)

# About the pull request

This PR is a follow up to #5253 which happened to alter how acid was
detected, and it didn't do it correctly.

# Explain why it's good for the game

Resisting acid is intended.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


![acid](https://github.com/cmss13-devs/cmss13/assets/76988376/553ed812-1858-4713-8a28-30725bea527e)

</details>


# Changelog
:cl: Drathek
fix: Fixed resisting acid
/:cl:

* Automatic changelog for PR #5288 [ci skip]

* Fix queen death not readmitting banished xenos fully (#5281)

# About the pull request

This PR fixes either an oversight, or a recent bug that I've not been
able to find the source, of where the death of a queen resets the hive's
banished keys list, but doesn't fully unbanish those xenos leaving them
in a state that they can't be banished properly again nor readmitted.

# Explain why it's good for the game

A queen should retain her ability to banish and readmit all xenos freely
and not be beholden to the will of some former queen.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


![free](https://github.com/cmss13-devs/cmss13/assets/76988376/5817bf86-e7d1-4f05-a7ee-412cd0d7d25f)

</details>


# Changelog
:cl: Drathek
fix: Fix queen death not fully readmitting any banished xenos
/:cl:

* Automatic changelog for PR #5281 [ci skip]

* Fixes Yautja bracer lock (#5282)

# About the pull request
Preds can now unlock thrall bracers again. Whoops.
<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game
I stoopid
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Yautja bracer lock can now properly unlock thrall bracers.
/:cl:

* Automatic changelog for PR #5282 [ci skip]

* SStechtree startup optimisation (#5218)

# About the pull request

Optimises the initialisation time of the 'Tech Tree' subsystem.

Currently, `/datum/controller/subsystem/techtree/Initialize()` is
changing the turf of every tile on the tech tree's z-level to
`/turf/closed/void`, presumably so that it all appears black rather than
space-y. However since it's calling `ChangeTurf()` on the *entire*
z-level (300x226, or 67,800 turfs), this is pretty performance
intensive.

This PR fixes that by just... not changing the turfs, instead only
adding a few `/turf/closed/void`s around the edge of the tech tree area
so that it still looks the same in-game. This changes the subsystem's
init time from 6.4 seconds(ish), to 0.15 seconds(ish).

**Before:**
![before
1](https://github.com/cmss13-devs/cmss13/assets/57483089/b7423bfd-7cbf-434b-ac2b-49765d5a78cc)

**After:**
![after
1](https://github.com/cmss13-devs/cmss13/assets/57483089/543f1ef6-bf61-46c5-90f5-f85b171631bd)

Players viewing the tech tree through the console won't notice anything
different, as the remaining layer of `/turf/closed/void`s block their
view of the rest of the z-level.

# Explain why it's good for the game

About 6 seconds knocked off of the server's init time. (10%!) *(At least
on my end)*


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>
<hr>

### Before/after init times from a few different tests:
**Before:**
![before
1](https://github.com/cmss13-devs/cmss13/assets/57483089/2c81c7d2-6376-4bea-a7c4-8e071cf09e3f)
![before
2](https://github.com/cmss13-devs/cmss13/assets/57483089/06d21d9a-1c86-4246-bf2b-f0108875713a)
![before
3](https://github.com/cmss13-devs/cmss13/assets/57483089/5590723d-291e-48c9-b0ae-10fef6b05410)

**After:**
![after
1](https://github.com/cmss13-devs/cmss13/assets/57483089/481324cd-fc0d-4876-9359-d9544fcc37c6)
![after
2](https://github.com/cmss13-devs/cmss13/assets/57483089/ffb8c2c7-a09f-4b15-806e-481927a5099d)
![after
3](https://github.com/cmss13-devs/cmss13/assets/57483089/1e9cb315-56b6-47a6-a0be-2a7973b25f88)

<hr>

### Teleporting to it as an observer, there *is* a visible difference:

**Before:**

![(null)scrnshot2](https://github.com/cmss13-devs/cmss13/assets/57483089/a133f889-7020-4477-84e5-e49c8cde03aa)

**After:**

![(null)scrnshot1](https://github.com/cmss13-devs/cmss13/assets/57483089/b7fd8ca6-220c-4366-b367-115c339fe207)

<hr>

### But viewing it IC, it all works exactly the same as before:


https://github.com/cmss13-devs/cmss13/assets/57483089/14fc7b05-5279-489f-99df-e9acc83b1420

<hr>

### The new `/turf/closed/void` tiles highlighted for reference:


![techtreebounds](https://github.com/cmss13-devs/cmss13/assets/57483089/02159fee-bbe4-4c8a-b0b7-4ba7963f233d)

</details>


# Changelog
:cl:
code: Made the Tech Tree subsystem initialise faster.
/:cl:

* Automatic changelog for PR #5218 [ci skip]

* ARES Death and Consequences; The Prequel (#5275)

# About the pull request

Implements some backend stuff for planned Project ARES processor/death
gameplay.

- Destruction of ARES now disables the various functionalities ARES
provides (additional ones will be added, but makes it so ARES cannot
bioscan, cannot use radio, and cannot talk/log data)
- ARES Apollo proc and ARES alive check proc added
- ARES now plays an announcement upon death

Outside of ARES dying turning off the subsystems, there isn't any other
major consequences people will see. Plan is for ARES to handle systems
such as autopilot, and for that to be affected as well

ARES being destroyed also prevents it from speaking in APOLLO or over
radio, but this was already a thing. Feedback to admins over this has
been added

# Explain why it's good for the game

ARES dying was always meant to have consequences, this lays additional
groundwork for further changes, and has ARES's death have an impact
outside of making Working Joes cry.
 
# Changelog

:cl:
add: If ARES is destroyed, systems such as bioscan also shut down, this
will be expanded in the future
add: ARES plays an announcement when destroyed
code: Procs to check for APOLLO processor and if ARES is alive added
refactor: ARES subsystems modified to utilize new procs
admin: Prompt to force a Marine Bioscan only shows when ARES is unable
to perform the bioscan.
/:cl:

* Automatic changelog for PR #5275 [ci skip]

* Automatic changelog compile [ci skip]

* Removes unused crystal code for xenos (#5287)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->

# About the pull request

Removes a bunch of unused code for a historical resource collection
system.

# Explain why it's good for the game

<!-- Please add a short description of why you think these changes would
benefit the game. If you can't justify it in words, it might not be
worth adding, and may discourage maintainers from reviewing or merging
your PR. This section is not strictly required for (non-controversial)
fix PRs or backend PRs. -->


# Testing Photographs and Procedure
<!-- Include any screenshots/videos/debugging steps of the modified code
functioning successfully, ideally including edge cases. -->
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# 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
label your changes in the changelog. 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. -->
<!-- If you add a name after the ':cl', that name will be used in the
changelog. You must add your CKEY after the CL if your GitHub name
doesn't match. Maintainers freely reserve the right to remove and add
tags should they deem it appropriate. -->

:cl:
del: Removed old crystal code from xenos
code: Renames still used vars from crystal to plasma
code: Removes crystal define in place of plasma string
/:cl:

<!-- Both :cl:'s are required for the changelog to work! -->

* Automatic changelog for PR #5287 [ci skip]

* More WE/YOU fixes (#5276)

# About the pull request

fixes a few more stuff i missed

# Explain why it's good for the game

connsistency is good

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

it works

</details>


# Changelog
:cl:
spellcheck: More WE/YOU fixes for xenomorph side.
/:cl:

---------

Co-authored-by: InsaneRed <[email protected]>

* Automatic changelog for PR #5276 [ci skip]

* lowers DS sentrygun to 200 from 500 (#5225)

# About the pull request
lowers price of DS installed sentrygun to 200 from 500.

# Explain why it's good for the game

Based on git lense, the cost of 500 points has been fixed for at least 6
years ( from what I understand form the moment the fabricator was
added?). The sentryguns are not worth 500 points at the slightest, from
dozens of rounds of experience I can say that the fire off 20 shots max
before they die ( unless you do some DS hold after hijack, but that
hardly counts). The main issue anyone has with it is when you install 3
of them in south part of DS and I am willing t take suggestions how to
adress this issue, but it is minor one, as xenos never realy have to
fight them as they basicly get to shoot only while marines are pushed
into DS and are about to evac and queen can hijack without getting
anywhere near them ( or can just let marines evac and then take out the
sentryguns with ease after she calls the ship back down). More marines
evacing thanks to sentrguns might make the hijack more enjoyable for
both sides. Also lowering the price will only mean you see sentryguns
installed on ds more often, buying 20 of them will have no bigger effect
then 7.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
balance: DS installed sentrygun price lowered to 200
/:cl:

Co-authored-by: Zonespace <[email protected]>

* Automatic changelog for PR #5225 [ci skip]

* gets launchbay price in line with other equipment (#5224)

# About the pull request

reduces price of launchbay to 200, getting it in line with fulton and
medevac. Aims to set ground for omnisentry price changes ( and possible
further utility additions to launchbay?)

# Explain why it's good for the game

every other eqipment costs around 200 points and there is not any reason
to ever have more then one launchbay and you can sell it after you use
all the omnisentryguns you want (but that is pain, it counts as weapon
and all FMs that you made with it installed need to be remade). Unlike
with fulton, medevac and rappel that have real use when you buy second
or third one.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog

:cl:
balance: launchbay price 400 -> 200
/:cl:

Co-authored-by: Zonespace <[email protected]>

* Automatic changelog for PR #5224 [ci skip]

* Fixes CAS killing players with ammo crates instead of bullets (#5205)

# About the pull request

Fixes #3211 by making GAU-21 and Laser Cannon ammo pass the weapon to
its `cause_data` rather than the ammo crate/battery.

# Explain why it's good for the game

The dropship is meant to be firing the ammunition inside the crate, not
the crate itself. (Although that is fun to imagine)

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Fixed the death message from GAU-21 and Laser Cannon strikes saying
that the player was killed by the ammo crate.
/:cl:

* Automatic changelog for PR #5205 [ci skip]

* Spitter ability bugfix (#5296)

# About the pull request

Properly recalculates armor for when the ability is being used /
deactivated


# Explain why it's good for the game

bugfix

# Testing Photographs and Procedure
<details>
it works
</details>


# Changelog

:cl:
fix: Spitter's charge spit abiltiy now properly adds and removes the 5
armor like its supposed to initially.
/:cl:

Co-authored-by: InsaneRed <[email protected]>

* Automatic changelog for PR #5296 [ci skip]

* Fixes carriers being unable to reduce their 'reserved facehuggers' number (#5286)

# About the pull request

Fixes carriers being unable to reduce their 'reserved facehuggers'
number.
This was caused by `carrier.huggers_reserved` being set as the *minimum*
of the `tgui_input_number()`.

I've also changed the `default` argument from 0 to
`carrier.huggers_reserved` so that you can see the current number before
you change it.

# Explain why it's good for the game

Sometimes you might want to decrease the number.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Fixed carriers being unable to reduce their 'reserved facehuggers'
number.
/:cl:

* Automatic changelog for PR #5286 [ci skip]

* Admin audio cue toggle. (#5185)

# About the pull request
Changes the toggle for ARES interface pings to also include prayers (and
renames it due to this)
Also moved it from logs category to sound, because it's for sounds...
Added SPAN_BIGNOTICE which combines bold & big classes to get rid of
"<b><big></big></b>"

# Explain why it's good for the game

Admin QOL, the sound can be overly intrusive and larger text gets the
point across.

# Testing Photographs and Procedure

<details>
<summary>Screenshots & Videos</summary>

Test to confirm it works as intended.

</details>


# Changelog
:cl:
code: Added a new span class that combines bold and big.
code: Tweaked the way prayer sends notifications to be more efficient.
admin: Moved the prayer notification sound to a toggle preference,
combined with ARES Interface notifications.
/:cl:

* Automatic changelog for PR #5185 [ci skip]

* Fix xeno wounds layering over weeded xenos (#5289)

# About the pull request

This PR is a follow up to #5118 to fix the xeno wounds object appearing
above their weeded appearance. It now synchronizes its plane and layer
with the mob using vis_flags.

# Explain why it's good for the game

Fixes (defender near wall):

![image](https://github.com/cmss13-devs/cmss13/assets/76988376/186acf03-c686-4114-9d53-c82687e0129c)

Fixes (drone under door):

![image](https://github.com/cmss13-devs/cmss13/assets/76988376/49301147-d1cd-49fc-b977-df2c446cdf45)


# Testing Photographs and Procedure

![image](https://github.com/cmss13-devs/cmss13/assets/76988376/e5c4d69b-e9a3-429b-a2d5-e7a5915c5fee)

# Changelog
:cl: Drathek
fix: Fix xeno wounds layering over weeds when merged with the weeds
/:cl:

* Automatic changelog for PR #5289 [ci skip]

* Fixes being able to vend infinite alcohol (#5305)

# About the pull request

Fixes #5291.
This was caused by the booze vendor returning a brand new list of
products every time something asked for them with
`get_listed_products()`, rather than making a single list when
initialised in `populate_product_list()` and returning that.

I also edited the `get_listed_products()` proc of the 'Experimental
Tools' vendor (fancy synth items), since it seemed to be the only one
not returning a global list.
*(I feel like those would all be better as static variables on each
vendor, but there's probably a good reason that they're not.)*

# Explain why it's good for the game

Infinite booze is... bad? 🤔

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Fixed being able to vend infinite alcohol.
/:cl:

* Automatic changelog for PR #5305 [ci skip]

* Fixes the Queen Eye being stuck as immature (#5299)

# About the pull request

Makes the 'Queen Eye' mob update its name when the Queen passes the
'Immature' stage, by adding a `COMSIG_MOB_REAL_NAME_CHANGED` signal.

This would be better if it was more similar to TG's
`COMSIG_ATOM_UPDATE_NAME`, but from looking into that it would take a
*big* refactor to implement `update_name()`/`update_appearance()`, so
this'll probably do for the time being.

# Explain why it's good for the game

Fixes the queen eye being stuck as immature unless the queen toggles it
on and off.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Before:**


https://github.com/cmss13-devs/cmss13/assets/57483089/329b8e92-29b3-4629-bd94-c0096bea6508

**After:**


https://github.com/cmss13-devs/cmss13/assets/57483089/49746267-03f5-4e62-aa5b-6f36927cc3e9

</details>


# Changelog
:cl:
fix: Fixed the Queen Eye still showing as "Immature" after the Queen
ages.
/:cl:

* Automatic changelog for PR #5299 [ci skip]

* Automatic changelog compile [ci skip]

* Fixes synths being unlungeable while in "critical state" (#5303)

# About the pull request

Synths were given immunity to dragging from old code back when they
could go into 'crit' so they dont get dragged to hell, however they no
longer have a crit state but still keep the immunity lunges also do not
work because of this. this is not intended.

# Explain why it's good for the game

bugfix


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>
yeah i tested it also no you cant get dragged while dead

</details>


# Changelog
:cl:
fix: Synths are no longer immune to lunges / dragging while in 'critical
state' since they dont go into crit.
/:cl:

Co-authored-by: InsaneRed <[email protected]>

* Automatic changelog for PR #5303 [ci skip]

* Fixes a simple race condition in XRF Setup (#5312)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->

# About the pull request

As seen on ~~TV~~ Live game

Someone can remove the vial during the do_after, bricking the machine as
it runtimes and is stuck with processing = TRUE

# Changelog

:cl:
fix: Fixed XRF Scanner bricking if people were adding and removing vials
at same time.
/:cl:

<!-- Both :cl:'s are required for the changelog to work! -->

* Automatic changelog for PR #5312 [ci skip]

* Shoe item storage refactor (#5263)

# About the pull request

Refactors shoe item storage to fix #5245, adds a bit of documentation,
and generally just makes it a bit neater.
(The overall 'Files changed' view looks a bit messy, so I've tried to
keep each commit atomic to help with reviews.)

# Explain why it's good for the game

Code works gooder.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Inserting a knife manually:**


https://github.com/cmss13-devs/cmss13/assets/57483089/adf6267c-7a30-4c00-ae32-37524048ddc6

**Inserting a knife with the (un)holster hotkey:**


https://github.com/cmss13-devs/cmss13/assets/57483089/b66824cb-5ad8-433e-a732-4854c0f68ff4

**Inserting a knife while holding the shoes:**


https://github.com/cmss13-devs/cmss13/assets/57483089/0db1ac5c-7375-478a-9464-449657c7b659

**Picking up/dropping the shoes, and inserting a knife while they're on
the ground:**


https://github.com/cmss13-devs/cmss13/assets/57483089/404a8199-dee0-4cd0-92a9-d2a46cadfac6

**Trying a few different things with two pairs of shoes:**


https://github.com/cmss13-devs/cmss13/assets/57483089/c5aab994-1002-4ffe-80e9-ddbaff4f95af


</details>


# Changelog
:cl:
fix: Fixed inserting/removing an item from shoes sometimes acting
weirdly.
refactor: Refactored shoe item storage.
/:cl:

* Automatic changelog for PR #5263 [ci skip]

* Automatic changelog compile [ci skip]

* new sprites for predalien (abomination) and co. (#5269)

# About the pull request

this PR replaces the predalien sprites with some that i think match the
look of the rest of our xenos a bit better
also replaces the sprites for the predalien larva, adds wounded
overlays, and updates the corpse weed sprites


![paulblart](https://github.com/cmss13-devs/cmss13/assets/106241650/68ed6d5c-5536-41e2-9239-04917b6caea4)

# Explain why it's good for the game

visual consistency good 

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>


![46QUJQC](https://github.com/cmss13-devs/cmss13/assets/106241650/6813bc51-f009-4525-8fe8-f513642f5edf)

</details>


# Changelog

:cl:
imageadd: new sprites for predalien, predlarva and weeded corpse
imageadd: added predalien wound overlays
/:cl:

* Automatic changelog for PR #5269 [ci skip]

* Automatic changelog compile [ci skip]

* north facing m56d shooting angle fix (#5308)

# About the pull request

prevents m56d from shooting anywhere to the right when facing north

# Explain why it's good for the game

fix good


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: m56d can not longer shoot backwards when facing north
/:cl:

Co-authored-by: vincibrv <[email protected]>

* Automatic changelog for PR #5308 [ci skip]

* Makes the designation of a tunnel display in chat when entered (#5315)

# About the pull request

Makes the designation of a tunnel display in chat when a player enters
it.

# Explain why it's good for the game

I've quite often gone through a tunnel to drop a capture off at the
hive, and then had no idea which tunnel to select in order to get back.
It is possible to examine a tunnel before you go through it to see its
name, but this just streamlines the whole process.

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Before:**

![before](https://github.com/cmss13-devs/cmss13/assets/57483089/de1a4a73-0d39-456a-a7fd-b0ddf401dc4f)

**After:**

![after](https://github.com/cmss13-devs/cmss13/assets/57483089/75d139eb-5ea2-41b1-a003-e42b52d08ecd)

</details>


# Changelog
:cl:
qol: Made the designation of a tunnel display in chat when a player
enters it.
/:cl:

* Automatic changelog for PR #5315 [ci skip]

* Fixes a laser cannon bug which I added (#5319)

# About the pull request

Fixes CAS lasers only setting fire to a single tile, rather than in a
7x7 range around the target.

This was caused by me somehow incorrectly setting the target turf in
#5205.

# Explain why it's good for the game

uh, whoops

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Fixed the CAS laser cannon only setting fire to a single tile,
rather a 7x7 range.
/:cl:

* Automatic changelog for PR #5319 [ci skip]

* Moves around "Remove Splints" and "View playtime" (#5323)

# About the pull request
This pr moves "View Playtimes" under the "Records" tab of OOC and
"remove splints" into "IC" tab .

# Explain why it's good for the game

viewplaytimes s a record, and "remove splints" should be under IC for
new players, not even i remember where to look for it sometimes because
under objects doesnt make sense

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
qol: "View Playtime" is now under the "Records" section under OOC
qol: "Remove Your Splints" is now under the "IC" section.
/:cl:

Co-authored-by: InsaneRed <[email protected]>

* Automatic changelog for PR #5323 [ci skip]

* Tutorial System: Retutorializing (#5030)

# About the pull request
Reopening of #4442

Adds a tutorial system to the game, accessible from the lobby screen.
The tutorial system is entirely isolated from the main game, allowing
players to get a curated experience to be taught the mechanics of SS13
or specific roles within CM. The tutorial system is fully capable of
supporting a theoretically infinite amount of players at once, each
getting their own instance.

See below video for an example of the in-dev "Marine - Basic" tutorial.

https://www.youtube.com/watch?v=aWEtd6EAZWk 

# Explain why it's good for the game
Teaching new players how to play the game has always been a tough bit
for us, so why not add a full-on tutorial system to get people into the
know?


# To-Do:
This list is alive and will change over time.
If you are interested in coding a tutorial, know that it's very easy and
that most of the heavy lifting's done for you! You can find a [tutorial
creation guide
here](https://hackmd.io/@mRAdleXgRfmKqh97O8ixSA/BJQsmO8kT), and you can
additionally contact me on discord at any time with questions.

Also, you can find an example tutorial
[here](https://github.com/cmss13-devs/cmss13/pull/4442/files#diff-843b2f84360b9b932dfc960027992f2b5117667962bfa8da14f9a35f0179a926).

Backend:
- [x] TGUI
- [x] Add finished tutorials to save files
- [x] Communicate to players with little playtime
- [x] Suppress combat logs and similar done in tutorials

SS13:
- [x] Basics
- [x] Intents

Marine:

- [x] Basics
- [x] Medical
- [ ] Weaponry
- [ ] Comtech - Basics
- [ ] Medic - Basics
- [ ] FTL - Basics
- [ ] Smartgunner - Basics
- [ ] Specialist - Demolitionist
- [ ] Specialist - Scout
- [ ] Specialist - Pyrotechnician
- [ ] Specialist - Grenadier
- [ ] Specialist - Sniper
- [ ] Squad Leader - Basics

Xenomorph:

- [ ] Basics
- [ ] Builder Caste - Basics

# Changelog
:cl:
add: Added a tutorial system for various roles (and just general
information), find it in the lobby screen.
/:cl:

---------

Co-authored-by: fira <[email protected]>

* Automatic changelog for PR #5030 [ci skip]

* Fixes immobilized mobs being able to buckle onto chairs (#5317)

# About the pull request

#5277, fixes the issue outlined here, incapacitated marines should not
be able to buckle themselves.

# Explain why it's good for the game

bug bad

# Changelog

:cl:
fix: fixes immobilized mobs being able to buckle themselves
/:cl:

* Automatic changelog for PR #5317 [ci skip]

* migrated js components to jsx (#5307)

# About the pull request

First round of refactors for TGUI-5 migration. Here all TGUI interfaces
and components have been changed from .js to .jsx. This is to closer
align us to the standards of tgstation. Within the components themselves
there are no functional changes.

Files of interest:

- tgui/webpack.config.js
- tgui/packages/tgui/routes.jsx
- tgui/packages/tgui/interfaces/Filteriffic.jsx
- tgui/packages/tgui/debug/KitchenSink.jsx

The rest of the file changes should just be .js -> .jsx

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game

Groundwork prep for TGUI 5
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
refactor: tgui js components now jsx
/:cl:

* Automatic changelog for PR #5307 [ci skip]

* Fixes runtime in stripping (#5320)

# About the pull request

The dummy as an example doesn't have skills so we runtime when stripping
them.

```
[2023-12-27 21:52:42.147] runtime error: Cannot execute null.get skill level().
 - proc name: get strip delay (/mob/living/carbon/human/proc/get_strip_delay)
 -   source file: code/modules/mob/living/carbon/human/inventory.dm,498
 -   usr: (src)
 -   src: Jack Samerus (/mob/living/carbon/human)
 -   src.loc: the floor (140,46,3) (/turf/open/floor/almayer)
 -   call stack:
 - Jack Samerus (/mob/living/carbon/human): get strip delay(Jack Samerus (/mob/living/carbon/human), Professor DUMMY the Medical Ma... (/mob/living/carbon/human))
 - Jack Samerus (/mob/living/carbon/human): stripPanelUnequip(Professor DUMMY tablet (/obj/item/device/professor_dummy_tablet), Professor DUMMY the Medical Ma... (/mob/living/carbon/human), "r_hand")
 - Professor DUMMY the Medical Ma... (/mob/living/carbon/human): Topic("src=\[0x3000232];item=r_hand", /list (/list))
 - **** (/client): Topic("src=\[0x3000232];item=r_hand", /list (/list), Professor DUMMY the Medical Ma... (/mob/living/carbon/human))
```

# Explain why it's good for the game
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Runtime in inventory.dm
/:cl:

* Automatic changelog for PR #5320 [ci skip]

* Fixes the failure message when trying to switch pyro fuels (#5321)

# About the pull request

Edits the pyro spec's fuel pack a bit to make it *slightly* more
bug-proof, and to fix it sometimes giving weird failure messages like
these:

![image](https://github.com/cmss13-devs/cmss13/assets/57483089/2fa746d0-acc6-402b-ad17-e8fff5f4e3cd)

![image](https://github.com/cmss13-devs/cmss13/assets/57483089/67cef060-55a4-4897-9e52-f6d01e43d3d1)

This was caused by me in #5121, presumably because I misread how the
check was handled.

# Explain why it's good for the game

I broked it (sorry)

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
fix: Fixed the pyro spec's fuel pack sometimes giving weird failure
messages when trying to switch fuel.
/:cl:

* Automatic changelog for PR #5321 [ci skip]

* Automatic changelog compile [ci skip]

* Fixes the Hive Status error when the Queen dies (#5316)

# About the pull request

Fixes the Hive Status window showing an error message when the Queen
dies.

For xeno players, the interface just closes.
For observing players, the interface will show 'The Hive has no Queen!'
where the queen's location was previously.
(The bug actually causing the error should be fixed too now)

(Note: I'm not quite sure what the `tgui-panel.bundle.css` diff is from,
but it kept modifying itself whenever I compiled so I figured it was
something related to this.)

# Explain why it's good for the game

Fixes #4330

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

**Testing queen spawn and death as the queen, as an observer, and as a
xeno:**


https://github.com/cmss13-devs/cmss13/assets/57483089/ba3b2960-d4ce-4be4-af6b-6daae2d10ac1

</details>


# Changelog
:cl:
fix: Fixed the Hive Status window showing an error message when the
Queen dies.
/:cl:

* Automatic changelog for PR #5316 [ci skip]

* gives trucker construction skills (#5231)

# About the pull request
Gives trucker engineering construction skills

# Explain why it's good for the game

It is strange to have engineering survivor who can not build cades and
walls and it sucks when you have 3 truckers but none able to build
openable cades. Giving more skills to survivors should make playing
survivor more fun. Trucker still has other diferent skill and gets
diferent loudout from engineer

# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
balance: gives trucker engineer level construction skill
/:cl:

* Automatic changelog for PR #5231 [ci skip]

* CL Headsets can utilize two more keys. (#5234)

# About the pull request

CLs have access to more keys now for CL purposes. This bump should allow
them to utilize the new keys without feeling awkwardly limited by the
key count.

# Explain why it's good for the game

You use utility by having limited key access, this should allow people
who use keys more frequently to take part in broader information spaces.


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
add: Max CL Headset radio keys from 3 to 5.  (+2 increase)
/:cl:

* Automatic changelog for PR #5234 [ci skip]

* Refactors some other xeno throws to throw_carbon() (#5237)

# About the pull request

Reduce boilerplate

# Explain why it's good for the game
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
code: Refactors some code to new throw_carbon proc
/:cl:

* Automatic changelog for PR #5237 [ci skip]

* Adds a verb to hide action buttons (#5304)

# About the pull request

Adds a verb on /client to show/hide action buttons
Makes it a new variable, as var/hidden also prevents the action from
being used


![image](https://github.com/cmss13-devs/cmss13/assets/56142455/1d78441c-5085-4165-a2b7-f7c3e9f7e2c3)

# Changelog

:cl:
qol: Adds the ability to hide your action buttons
/:cl:

* Automatic changelog for PR #5304 [ci skip]

* sentry laptop now uses camera manager (#5309)

# About the pull request

The sentry laptop had a bunch of custom code for handling gunsight
cameras. This PR refactors it to exclusively use the camera_manager
component.

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game

Reduction of duplicated code.
# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
refactor: sentry laptop now uses camera manager component
/:cl:

* Automatic changelog for PR #5309 [ci skip]

* Fixes a couple of runtimes with xenos dying (#5322)

# About the pull request

Trying to call `post_attack()` on something which has already been
qdeleted within gib()

```
[2023-12-27 22:10:14.636] runtime error: Cannot read null.comp_lookup
 - proc name: UnregisterSignal (/datum/proc/UnregisterSignal)
 -   source file: code/datums/components/_component.dm,219
 -   usr: null
 -   src: Hide (/datum/action/xeno_action/onclick/xenohide)
 -   call stack:
 - Hide (/datum/action/xeno_action/onclick/xenohide): UnregisterSignal(null, "mob_statchange")
 - Hide (/datum/action/xeno_action/onclick/xenohide): post attack()
 - Hide (/datum/action/xeno_action/onclick/xenohide): unhide on stat(Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger), 2, 0)
…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Fix Fix one bug, make ten more Refactor Make the code harder to read Testmerge Candidate we'll test this while you're asleep and the server has 10 players
Projects
None yet
Development

Successfully merging this pull request may close these issues.

The Security Tuner is not showing the direction to the room's APC
5 participants