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

Bunch of TG mirrors #38

Closed
wants to merge 132 commits into from
Closed

Conversation

carpotoxin
Copy link
Collaborator

About The Pull Request

Why It's Good For The Game

Changelog

🆑
add: Added new mechanics or gameplay changes
add: Added more things
del: Removed old things
qol: made something easier to use
balance: rebalanced something
fix: fixed a few things
sound: added/modified/removed audio or sound effects
image: added/modified/removed some icons or images
spellcheck: fixed a few typos
code: changed some code
refactor: refactored some code
config: changed some config setting
admin: messed with admin stuff
server: something server ops should know
/:cl:

SmArtKar and others added 30 commits September 9, 2024 13:51
…gstation#85795)

## About The Pull Request
Closes tgstation#84603 
It overrode one of its parent args, resulting in parent code not
assigning a var and runtiming when trying to spawn a blade

## Changelog
:cl:
fix: Blade heretic ascension now gives you floating blades once again
/:cl:
## About The Pull Request

Before, trying to fix an undamaged limb would have you whack the person
with the wires, or burn them with a welder. This is quite counter
productive when trying to repair someone. Now it cancels any further
attacks when you click on an uninjured limb, and tells you about it.


![image](https://github.com/user-attachments/assets/1fc94d15-5508-4fa2-bdfa-bde856eaba20)

## Why It's Good For The Game

I won't accidentally smack someone with a burning welder without combat
mode on just because their chest happens to have no damage.

## Changelog

:cl:
fix: Trying to repair someone's undamaged limb with a welder or wires no
longer has you smacking them
/:cl:

Co-authored-by: Ghom <[email protected]>
<!-- 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

Fixes tgstation#85571

## Why It's Good For The Game

Just a push in the direction of a de-jank'd wallening

## Changelog

:cl:
fix: bedsheets are laid on beds properly now
/: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. -->
…gstation#85832)

<!-- 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. -->

Acts on another of my claims in tgstation#85583 .
Back on the main repo; time to get serious. This fixes the bitrunner
domains and safehouses (all vetted in-game) to be 100% there for
wallening. Buttons moved and fixed; wallmounts fixed (there were some
types in there we delibrately linted against using; how did those slip
by?? Are we just not checking the folders for these with linters?); the
whole nine yards.

Maps not touched by this PR were already 100% above board.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

Bitrunner maps were still mostly playable but this irons out the rough
edges (mapping-side; there's a few sprite issues in the "i played every
map help me" section) to make them proper presentable again.

I had to play through each bitrunner map in private just to test this
PR. Send help.

<details><summary>Screenshots Of Each Domain / Safehouse As Proof Of
This Insanity</summary>
<p>

Peaceful Domains:

<details><summary>Beach Bar</summary>
<p>

![image](https://github.com/user-attachments/assets/b50e617a-9938-49ab-9d42-a82becc668c6)

![image](https://github.com/user-attachments/assets/442d3bd3-7ca2-450f-acb9-d8fa0278a40b)

</p>
</details>

<details><summary>Breeze Bay</summary>
<p>

![image](https://github.com/user-attachments/assets/56705aef-9824-451f-b141-4945b928a01f)

![image](https://github.com/user-attachments/assets/774f80b9-89bb-448a-8cc5-24f5d03f15c4)

</p>
</details>

<details><summary>Gondola Asteroid</summary>
<p>

![image](https://github.com/user-attachments/assets/886a055e-e112-46da-800e-c94d0edcf8f2)

![image](https://github.com/user-attachments/assets/4accac92-d710-4f50-88ed-b7b1cd0908d0)

</p>
</details>

<details><summary>Vaporwave</summary>
<p>

![image](https://github.com/user-attachments/assets/adf25801-8251-4ba2-835c-f270080bcf0b)

![image](https://github.com/user-attachments/assets/1bc8780c-e3dd-4592-ab5b-be2225f1b0c7)

</p>
</details>

Easy Domains:

<details><summary>Clown Planet</summary>
<p>

![image](https://github.com/user-attachments/assets/2ef17360-2330-4fe1-9703-60efca5b6901)

![image](https://github.com/user-attachments/assets/e37f34d3-ca74-46e2-a517-66c6f290b023)

</p>
</details>

<details><summary>Disposal Pipe Factory</summary>
<p>

![image](https://github.com/user-attachments/assets/a98ad4aa-7c42-4c69-b62b-e8f2e1b17c53)

![image](https://github.com/user-attachments/assets/b203cb20-c8ea-4457-a597-7a93b908e748)

</p>
</details>

<details><summary>Snakes And Ladders</summary>
<p>

![image](https://github.com/user-attachments/assets/46cbf2de-a630-47fa-968c-203fafb3f15b)

![image](https://github.com/user-attachments/assets/6e023a4b-aec6-482b-bb74-08d96a9cae77)

</p>
</details>

<details><summary>Xeno</summary>
<p>

![image](https://github.com/user-attachments/assets/be9d4be7-8db6-4a7c-b0dd-bc0c2c2d8430)

![image](https://github.com/user-attachments/assets/05047446-d9ee-49a8-8ee9-cfb1d575c898)

</p>
</details>

Medium:

<details><summary>Crate Chaos (!!!)</summary>
<p>

![image](https://github.com/user-attachments/assets/665850fb-b880-43db-9709-dc63d7068e62)

</p>
</details>

<details><summary>Abductor Ship</summary>
<p>

![image](https://github.com/user-attachments/assets/53c13719-c41d-44e3-8890-5167f22e94b3)

![image](https://github.com/user-attachments/assets/2faf40cc-1b6e-4c7c-b61c-6d7834af2633)

</p>
</details>

(I skipped the megafauna arenas because they're vetted already)

<details><summary>5/9ths Already</summary>
<p>

![image](https://github.com/user-attachments/assets/7595f005-8c54-40c2-be66-4a9bda8994f7)

![image](https://github.com/user-attachments/assets/df25e6b8-3f9e-4a0e-b920-ca1e092eb001)

</p>
</details>

<details><summary>Corsair Cove</summary>
<p>

![image](https://github.com/user-attachments/assets/698f5c1e-acd1-42b5-807a-b49708e61ad8)

![image](https://github.com/user-attachments/assets/d6bb6554-c69d-44cd-9628-86df7bcf4800)

</p>
</details>

(Infected Domain had the same issue Crate Chaos had.)

<details><summary>Syndicate Assault</summary>
<p>

![image](https://github.com/user-attachments/assets/fed1104c-1f40-4d14-ace3-a8fa671bfa82)

![image](https://github.com/user-attachments/assets/24c39d41-7d04-4608-82d0-4a186b3e11a1)

</p>
</details>

Hard:

<details><summary>Island Brawl</summary>
<p>

![image](https://github.com/user-attachments/assets/21b88e54-21fc-44e1-951d-d7fd607001b1)

</p>
</details>

You thought I was fuckin' joking. Smh

</p>
</details>
<!-- 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. -->

<!-- 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 its 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:
fix: Every bitrunner domain's been patched up for the new perspective
shift.
/: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. -->
## About The Pull Request
Why are we restricting atmos techs from doing this?
## Why It's Good For The Game
atmos meters are very useful and there is no reason to restrict them
from layer 1 and 5
## Changelog
:cl:
qol: atmos meters can now be attached to layer 1 and 5
/:cl:
<!-- 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

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! --> with the new wallening offsets it isnt necessary to
shift buckled mobs up anymore since tables now have a shift down

## Why It's Good For The Game

<!-- 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. --> closes tgstation#85804

## 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 its 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:
fix: fixes surgery table buckle offsets
/: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. -->
…gstation#85883)

## About The Pull Request
Closes tgstation#85826

## Changelog
:cl:
fix: Alien beds no longer pretend they can be deconstructed with a
wrench
/:cl:
…ion#85824)

<!-- 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. -->

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! --> rcds now build based off of player's dirs right
before the object gets built

<!-- 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. --> closes tgstation#85810

<!-- 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 its 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:
fix: fixes rcds accounting for player dir only before construction
/: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. -->

Co-authored-by: Ghom <[email protected]>
tgstation#85794)

## About The Pull Request
Copypasted code prevented improvised shields from being crafting due to
moonflower shields having the same path. Found by ncarlarc on discord

## Changelog
:cl:
fix: Fixed improvised shield crafting recipe being overriden by
moonflowers
/:cl:
…tional armor (tgstation#85726)

## About The Pull Request

Closes tgstation#81260
Closes tgstation#74022
Currently mechs are the only atoms utilizing attack_dir but I added it
in multiple other places that were missing it to ensure that if
something else uses it it won't break in those scenarios

## Changelog
:cl:
fix: Mechs' directional armor now actually works
/:cl:
…ation#85852)

I had unregistered signals from the wrong source in the original PR for
items with the tactical component changing your identity. Now they get
properly unregistered.

Fixes tgstation#85827
🆑 Bisar
fix: Potted plants no longer permanently mark you as one of their own.
/🆑

Co-authored-by: Ghom <[email protected]>
…KNOWN, replaces your name with the name of the tactical item (tgstation#85567)

I added TRAIT_UNKNOWN to the code for picking up and dropping potted
plants. Picking them up will make you totally anonymous (and
suspicious). This is the same thing that infiltrator suit and heretic
shadow cloak does.

I also added in some code that changes your displayed name to the name
of the item, and then I had to jiggle ID code a bit so it wouldn't
display your worn ID; it'll now display the forced name of the tactical
object.

Becoming an absolute master of disguise by hiding with a potted plant is
hilarious. Causing people to become immensely paranoid of anyone holding
a potted plant is very on-brand. Dropping the potted plant to reveal
you're in full infiltrator gear or heretic aura is also a funny double
bluff. The total anonymity afforded by this is balanced out by the fact
that you have to use both hands to hold the plant so you can't defend
yourself at all if you're making use of it.
:cl: Bisar
add: The interns remembered to water the plants around the station;
their foilage is so thick that it totally hides the identity of anyone
holding them!
/:cl:

---------

Co-authored-by: Ubuntu <[email protected]>
## About The Pull Request

In tgstation#77887 I have introduced a food buff system with placeholder buffs to
not bloat that PR with balance-related things to allow people to add
their own effects and discuss the particular effects in separate PRs.

The goal is to have:

- Some default buffs for all food. Currently there's only Haste that
scales with food complexity.
- Some interesting buffs tied to food categories or specific dishes

This PR is a first part of this change.

- Adding an indicator to Cooking UI that food does something special
- Added **Spaghetti Carbonara** dish that gives Italian speech.

![image](https://github.com/user-attachments/assets/2035a97a-6048-4636-bd49-d1ea3390a50e)

- Added **Jupiter Cup Cake** that gives shock immunity instead of it
being randomly given by high-complexity dishes.

![image](https://github.com/user-attachments/assets/3260339d-0167-4840-9b76-10371959e16c)

- Made **Omelette Du Fromage** give French speech.
- Made **Mime Tart** give Mute trait
- Made **Clown Cake** give Waddle Walk trait
- Made **Stuffed Legion** give Ashstorm Immune trait

## Why It's Good For The Game

Foodening PR was incomplete, this PR is a step towards the completion.

## TODO

- [X] Pick a certain dish to give the French speech
- [X] Pick a certain pasta to give the Italian speech
- [X] Pick a certain dish for the shock immunity buff
- [x] Add an indicator to the cooking UI that a dish has a special
effect
- [x] Add more food effects per suggestions

## Changelog

:cl:
qol: Dishes with a special food effect are marked in the Cooking UI
add: New Spaghetti Carbonara dish that makes people Italian temporarily
add: Omelette Du Fromage makes people French temporarily
add: Shock Immunity is no longer a random level 4-5 food buff, but a
buff given by a new Jupiter-Cup-Cake
add: Mime Tart gives Mute trait
add: Clown Cake gives Waddle Walk trait
add: Stuffed Legion gives Ashstorm Immune trait
/:cl:
…station#85777)

## About The Pull Request

Closes tgstation#84651
Also made sure that if there somehow are multiple kitchen areas chefs
don't yell steamed hams line multiple times

## Changelog
:cl:
fix: Fake aurora caelus event no longer permanently paints space green
/:cl:
…rectional glass (tgstation#85760)

## About The Pull Request

forceMove made it possible for someone to get shoved into a
closet/crate/disposals bin through a piece of directional glass that was
located on said objects tile, resulting in a very cheesy way to GBJ
people.

## Changelog
:cl:
fix: You can no longer shove people into closets through directional
glass
/:cl:
…on#85236)

## About The Pull Request

Sooooooo this one's a mess.
First off, layering issues. Pipes, cables, and disposals currently
render over catwalks!

![image](https://github.com/user-attachments/assets/bfb6fc15-878c-4686-aace-57f0b9c6923a)
That's not great.

Looking into it, it seems we've moved the `CATWALK_LAYER` below the
`ABOVE_OPEN_TURF_LAYER`, where the catwalk layer is used for closed
catwalks.

https://github.com/tgstation/tgstation/blob/33e983ced1ac27143c4b87d8761277eea35a6d2a/code/__DEFINES/layers.dm#L148-L150
Which, well, we've *also* made it so all `undertile` stuff gets rendered
at `ABOVE_OPEN_TURF_LAYER` when below a tile.
So! Naively! We swap those around! Easy peasy lemon squeezy.
```dm
 #define ABOVE_OPEN_TURF_LAYER (12 + TOPDOWN_LAYER) 
 #define CATWALK_LAYER (13 + TOPDOWN_LAYER) 
```
And hey! Well!

![image](https://github.com/user-attachments/assets/42d7a8f3-5c17-4039-a76b-dbd789432156)
It's progress!
But as we can see in the bottom right catwalk tile, something's not
rendering right when they're below the tile...

Well, time to take a closer look at our `undertile` element... aaaaaand
would you look at that:

https://github.com/tgstation/tgstation/blob/74f9a4314138afcb04af3cfb452ff167105f022c/code/datums/elements/undertile.dm#L45-L48
We're setting EVERYTHING to the `FLOOR_PLANE` at
`ABOVE_OPEN_TURF_LAYER`, even the stuff that was already on
`FLOOR_PLANE` with its own layer like disposals or cables.
Meaning, layering fuckery ensues, we can't see shit.

So? We just make it only do that when we're not already on the floor
plane.
```dm
	if(PLANE_TO_TRUE(source.plane) != FLOOR_PLANE)
		SET_PLANE_IMPLICIT(source, FLOOR_PLANE)
		source.layer = ABOVE_OPEN_TURF_LAYER
```
This solves it!

![image](https://github.com/user-attachments/assets/f930bd66-87eb-433e-8bf5-09706316ace4)
Progress!

![image](https://github.com/user-attachments/assets/f2f246a2-8524-4186-9ac3-07ac7dcf4288)
...Kind of.
The _layering_ is solved, but unscrewing and rescrewing them seems to
cause pipe caps to manifest out of nowhere!
This _sucks_ for debugging, y'know?
Anyhow, this is based on two different things: an order of operations
issue and catwalks just not being accounted for.

First off! Order of operations.
On `Initialize(...)`, the base `/obj/machinery/atmospherics` registers a
proc that updates pipe caps on `COMSIG_OBJ_HIDE`:

https://github.com/tgstation/tgstation/blob/33e983ced1ac27143c4b87d8761277eea35a6d2a/code/modules/atmospherics/machinery/atmosmachinery.dm#L114-L115
Meanwhile, `/obj/machinery/atmospherics/pipe`, adds the `undertile`
element on its `Initialize(...)`... AFTER calling the parent.

https://github.com/tgstation/tgstation/blob/33e983ced1ac27143c4b87d8761277eea35a6d2a/code/modules/atmospherics/machinery/pipes/pipes.dm#L31-L35
...Which then registers its own proc on `COMSIG_OBJ_HIDE`...

https://github.com/tgstation/tgstation/blob/74f9a4314138afcb04af3cfb452ff167105f022c/code/datums/elements/undertile.dm#L26
This meant that, well, the proc that generates the caps was being called
*before* undertile had a chance to chance to remove the
`TRAIT_UNDERFLOOR` trait... which pipe caps use to work out when to
generate.

https://github.com/tgstation/tgstation/blob/33e983ced1ac27143c4b87d8761277eea35a6d2a/code/modules/atmospherics/machinery/atmosmachinery.dm#L650-L652
So, we swap this around by moving both to a `setup_hiding()` proc which
allows the pipe to register its behaviours before calling the parent and
it register its, without needing to register it before calling the
parent `Initialize(...)`. Cause that's ugly.
Now we're generating pipe caps on catwalks!

But! That brings us perfectly to the next bit. Cause those pipe caps,
even if shown when the tile is open, look *ugly*.
Why, when we open a catwalk, are we having our pipes suddenly extend
onto the neighbouring tiles and catwalks and going down into them from
the top? Arguably, these should behave like they're below tiles, because
they logically are even if not technically so.
Well, actually, we already have a similar situation with bare plating.
It's not applying `TRAIT_UNDERFLOOR`, but also the pipe caps shouldn't
be behaving like they're above a tile, because that'd be ugly- and
that's what it does!

https://github.com/tgstation/tgstation/blob/33e983ced1ac27143c4b87d8761277eea35a6d2a/code/modules/atmospherics/machinery/atmosmachinery.dm#L654-L655
So, we just apply a second check there, `iscatwalkturf(...)`
```dm
	var/turf/node_turf = get_turf(node)
	if(isplatingturf(node_turf) || iscatwalkturf(node_turf))
		continue
```

And? Well!

![image](https://github.com/user-attachments/assets/f297136e-f62e-452b-b711-2f3b69462859)

![image](https://github.com/user-attachments/assets/a3f2df8b-3e22-4474-af32-7e858382f63f)

![image](https://github.com/user-attachments/assets/347a2c3b-8302-47b8-a376-41228fbe537a)
There we go! There's no weird layering, there's no pipe caps where there
shouldn't be, pipes behave like those on catwalks are actually under a
tile.
It looks _clean_.
...

Well, for however clean we can get it to be without making sprites for
the opened catwalks but without the integrated plating so we can make an
overlay and have the pipes/cables/disposals not spontaneously go over
the edges of the catwalk when opened. Or making the under sprites only
have the attachment points in the corners, so it looks like the
pipes/cables/disposals are going over plating instead of what looks like
a raised edge.
## Why It's Good For The Game

Fixes tgstation#84789.
Fixes tgstation#82622.
Screwing open a catwalk suddenly generating pipecaps on neighbouring
closed catwalks and tiles with pipes under them looks weird.
## Changelog
:cl:
fix: Fixed pipes/cables/disposals rendering above closed catwalks.
fix: Fixed catwalks covering pipes generating illogical pipe caps when
screwed.
fix: Opened catwalks are no longer assumed to be above-floor for the
sake of generating pipe caps.
/:cl:
## About The Pull Request

This one's a bit complex, stay with me here.

So, the ERT system has support for enforcing all ERT members to be
human, or if they will be spawned as their selected species.


![image](https://github.com/user-attachments/assets/14aeaabc-ac47-44dd-811d-a25525d926ea)

This addresses plasmamen by including plasmamen outfits that are
equipped prior to the actual outfit they're given, added in tgstation#56987.


![image](https://github.com/user-attachments/assets/2b3192f9-2aa7-48eb-8ce3-ff58fa0883e8)

Despite this support, plasmamen never spawn as plasmamen, as they are
missing the `ERT_SPAWN` changeflag. This is because as the body is
created, the ERT spawning system human-ifies them to prevent them from
exploding. This system existed in place prior to tgstation#56987, but it didn't
work.


![image](https://github.com/user-attachments/assets/6b803c80-ded6-48d6-94a6-781efda89642)

Fortunately(?) tgstation#58870 fixed it, but in doing so nullified the work done
in tgstation#56987 as plasmamen could no longer be plasmamen when the
`plasmaman_outfit` check was reached. They had already become human.

If this reads a bit weirdly its because this was originally just going
to be an issue report. I finished writing it and decided "well why not
just fix it instead dorkus".


![image](https://github.com/user-attachments/assets/dd4b74af-b89e-4ecf-8bb4-0d3199a52649)
## Why It's Good For The Game

Fixes a problem caused by, ironically, a logic fix.
## Changelog
:cl: Rhials
fix: Centcom ERT hiring standards have been expanded to include
plasmamen, again.
/:cl:
## About The Pull Request

1. Silicons now able to invalidate crimes, because... they have armory
access too.
2. After citation being paid off there will be no more broken 0 in sec
records
3. After citation being paid off it will be invalidated automticaly
4. Crime authors can invalidate crimes, issued by them.
5. In case of invalidation, crime now shows who voided it
6. Also fixing bug with editing crime description
<details>
<summary>Screenshots</summary>

![image](https://github.com/user-attachments/assets/d6635dd2-87a8-47d6-a7eb-269c08fbdcf5)

![image](https://github.com/user-attachments/assets/8d739e57-24a5-4d58-8a87-47344a04b46c)

![image](https://github.com/user-attachments/assets/c000caff-76c7-484d-bf8f-57a2946e93c4)

</details>

## Why It's Good For The Game

Thats few fixes and QoLs features.
If someone want to argue about:
1. Synths: man they was able to issue crimes which is more impactfull +
now voiding is recorded
2. Authors: they had ability to edit name and description, why can't
delete?
3. Voiders: how offen do you use invalidate button? How many of those
uses you wanna hide from sec?
## Changelog
:cl:
fix: Strange zeros in paid off citations on sec records
fix: Now invalidating citations works
fix: You can change crimes description
fix: Synths have 'armory access' for sec records logic
qol: Paying off citation now automaticaly voiding it
qol: Crime issuer can void the crime without armory access
qol: In case of invalidation crime shows who voided it
/:cl:
Hello. I'm making a board where a detective can attach various papers
and photos that relate to the case he's solving. I made it possible to
create cases, attach evidences, remove evidences. But I couldn't make it
possible to connect the evidences correctly. My experience in this ended
with the fact that the game simply stopped working. That's why I'm
asking for help from more experienced developers.

Full Preview:

https://github.com/user-attachments/assets/f27219bb-4143-46f0-8dd6-1d28cf8876a6

Board on stations:

Meta Station:

![meta](https://github.com/user-attachments/assets/ec7fdccd-17a1-40d3-b93b-17425979a6da)

Delta Station:
Not placed

Tram Station:

![Tram](https://github.com/user-attachments/assets/685f342e-fbcf-4e8b-9d7a-8cc8f82db01a)

Ice Box Station:

![IceBox](https://github.com/user-attachments/assets/7732a258-ca62-4cc9-8575-3998db545a1d)

Wawastation:

![Wawa](https://github.com/user-attachments/assets/c546017d-8f16-4761-b441-cfcf5b8550ad)

NorthStar:

![North](https://github.com/user-attachments/assets/4948bcbe-e7d6-4be1-a214-f24f3ff3f334)

Birdshot:

![Bird](https://github.com/user-attachments/assets/3b3b0eb4-854b-4998-ad4c-ff53c57194fa)

This is good for MRP servers, where detectives can investigate cases
just like in the movies
:cl: FeudeyTF
add: Added board for detective's evidences
/:cl:

---------

Co-authored-by: Kylerace <[email protected]>
…ation#85338)

Creates a new vending machine in the science area, called the CytoPro
and filled with cytology gear (and a few things that might be useful in
xenobiology). This vending machine is added to the cytology labs of all
maps.
Here's how it looks in-game (with the panel screwed open, I was hacking
it to test at the time)
![CytoPro -
Metastation](https://github.com/user-attachments/assets/695c12e6-ee63-47ff-b885-a3c0ca029afc)
The current product list is shown below.
![CytoPro -
Products](https://github.com/user-attachments/assets/95f3cf47-4f2e-4988-958c-1064584d41f6)
![CytoPro -
Contraband](https://github.com/user-attachments/assets/e7918f44-588d-4acd-9025-b12d3da08602)
I've put them in the locations shown below.
Birdshot:
![CytoPro -
Birdshot](https://github.com/user-attachments/assets/8f0eba2e-d118-481d-8122-04ab5815fbb8)
Delta:
![CytoPro -
Deltastation](https://github.com/user-attachments/assets/176a4207-e3cf-4a17-8b19-c20bbce86ff0)
Icebox:
![CytoPro -
Icebox](https://github.com/user-attachments/assets/8eda8bd2-cb88-4adf-bb9e-b54b76281f8c)
Northstar:
![CytoPro -
Northstar](https://github.com/user-attachments/assets/0abec84d-9343-4d28-81b9-7f6cf9efa4f7)
Tram:
![CytoPro -
Tramstation](https://github.com/user-attachments/assets/7a27aa08-655c-468b-a690-bd031b02dfb4)
Wawa:
![CytoPro -
Wawa](https://github.com/user-attachments/assets/6a1dc37a-9834-4613-8cfe-0634184c3caa)

**Feedback on more products welcome!**

Currently, there aren't a lot of backup sources for cytology gear. Most
maps spawn with a single cytology closet containing the necessary gear,
and good luck to you if someone makes off with the supplies before you
get there. In addition to adding a source of backup cytology equipment,
I'm hoping that this new vendor makes cytology quicker and more
accessible.
Plus, science really needed a new vending machine, and I think the
purple-white colour and stylized microscope are neat.
Since the cytology lab is usually located very close to the slime pens,
the addition of monkey cube boxes, xeno bags, and bio suits also helps
support xenobiology projects. If the 14 cubes supplied at round start
are insufficient (which they really shouldn't be) then they can
supplement their supply with the boxes in the CytoPro.
:cl:
add: A new vendor of cytology equipment, the CytoPro, is now available
in your local science department!
/:cl:
…#85917)

## About The Pull Request

Found by Melbert on discord, caused by paint mode not applying when
painting random decals.

## Changelog
:cl:
fix: Random spraypaint setting now properly paints large decals
/:cl:
## About The Pull Request

Raptors specifically check arbitrary factions in their code instead of
checking their own factions. This fixes it and has them perform the
standard faction checking behavior.
## Why It's Good For The Game

Brings raptor behavior in line with most of our AI and faction checks
## Changelog
:cl:
fix: Raptors properly respect their own factions now.
/:cl:
## About The Pull Request
Hooked the switch sound on `ui_act`:
- RCD
- RPD
- Plumbing constructor
Added pickup and drop sounds for:
- RCD
- RPD
RPD also does the click sound when placing things.


https://github.com/user-attachments/assets/e6c2cb76-6a0a-4db9-9c25-961d41b84516

## Why It's Good For The Game
Immersion.
## Changelog
:cl: grungussuss
sound: added new sounds for RCD, RPD and Plumbing Constructor.
/:cl:
## About The Pull Request
This PR adds a treasure chest that can be fished from the ocean if
you're lucky enough (or have enough explosives or lobstrosities to do it
for you). The treasure chest is basically a mystery box (like the ones
from the deathmatch) with a couple catches; the treasure chest can be
opened up to 18 times in total before breaking down, however, it can
only be opened up to 3 times per spaceman, encouraging the player to
share it with others.

Here the possible loot by the by:
- A toolbox containing a master fishing rod, all the hooks and reels,
fish feed, an experi-scanner, an aquarium kit and a can of super baits
- A box containing a lazarus injector, a cup and a bottle of strange
reagent which you can use to revive fish now
- A circuit board for a pre-emagged fishing portal generator
- A master fishing rod
- A can of super fishing baits
- A fish case containing Tiziran fish
- A fish case containing Syndicate fish
- An old, yet fairly strong cutlass
- An old laser gun which fires only 5 shots before running out
- A crank laser musket
- A smoothbore disabler
- A surplus bolt action rifle
- A ration pack
- A can of squid ink
- A bottle of aged rum that forces you to switch to the piratespeak
language
- A money bag with some doubloons inside
- A piratespeak manual
- Pirate armored coat
- Pirate armored hat
- A pre-loaded cannon
- Four trash cannon balls
- Four cannon balls

## Why It's Good For The Game
Mystery boxes are fun, from the little fanfare they play to the
potential loot they can give, and I had an old treasure chest I had
sprited for fun years ago around so I've come up with an entertaining
idea. If you think the loot list is a bit too hot, I can cool it down a
bit.
Also yeah, I wanted to make fish revivable with strange reagent, since
you can already do it with lazarus injectors even though using a lazarus
injector for this would be a severe waste of mining points.

## Changelog

:cl:
add: Added a treasure chest you can rarely fish from the ocean/beach,
with loot being a mix of fishing and piratey stuff.
add: You can revive fish with strange reagent now.
/:cl:
## About The Pull Request
The idea came up during the last blackmarket-related PR (tgstation#85066), when
the original creator @TheChosenEvilOne came and said the LTSRBT was
originally supposed to allow players to sell stuff on the blackmarket. I
replied saying the idea has some potential, and then other github users
followed, also saying it's a good idea.

So, here we are, adding another feature to the LTSRBT, to let you
provide other players with potentially knock-offs and fraudulent (or
genuinely honest) items on the blackmarket.

How you do it is fairly simple: left click the machine to open it, place
the item inside, then right-click to open the UI. From there you can
adjust the name, description and price of the market item. Finally,
click on the "Place on Market" button twice, pay a 30 credits fee, and
it's done. You have an item on the market, and once it's sold, 85% or
the earnings (the price) will be deposited on your account.

By the by, the icon of the item you're trying to sell will also show up
on the market. You should get a picture of what you're getting before
falling for an obvious scam.


![screenie](https://github.com/user-attachments/assets/fae70c25-ab46-4ceb-af9e-f4818d8a1c68)

By the by, it's a cardboard cutout.

## Why It's Good For The Game
This fits the design of the LTSRBT and blackmarket in general. 

## Changelog

:cl:
add: You can sell items on the blackmarket with the LTSRBT now.
fix: Added some checks to prevent the swapper device and bluespace
anomalies from theorically being able to send things and people to
nullspace.
/:cl:

---------

Co-authored-by: ArcaneMusic <[email protected]>
)

## About The Pull Request

Currently, if you remove someone's BB status, and there's no more
members on the team - the empty BB team will still exist, and appear on
the roundend report.

## Why It's Good For The Game

No reason for empty teams to exist, and they clog up the roundend
report.

## Changelog
:cl:
fix: Empty blood brother teams will now be cleaned up, instead of
clogging up the roundend report.
/:cl:
## About The Pull Request

Checks if you're deaf before playing either the radio send sound, or the
receive sounds.
Fixes tgstation#85452

Additionally removes a repeated suicide_act for suiciding with a radio.
Other existing act is @ R558-R560

## Why It's Good For The Game

Can't hear a radio bloop if you can't hear.

## Changelog



:cl:
fix: You can no longer hear radio sounds if you're deaf.
/:cl:

---------

Co-authored-by: Ghom <[email protected]>
…ion#85904)

ai controllers would have the wrong status when moving z levels

fixes ai controllers incorrectly idling when changing z level

:cl:
fix: fixes ai controllers incorrectly idling when changing z level
/:cl:
## About The Pull Request

This PR does a couple of minor things:
Makes the job debug logging a bit easier to follow.
Minorly brings some SSjob code up to code standards, converting proc
names to snake_case and doing some otherm is cleanup.
Refactored some stuff into different procs, updated some comments.

And some major things:
Changes the job assignment logic.
Old behaviour
> Assign dynamic priority roles
> Force one Head of Staff (if possible)
> Assign all AIs
> Assign overflow roles (bugged in 2 ways)
> Shuffle the available jobs list once, at the start of the random job
assignment loop
> Pick and assign random jobs for random players from High prefs down,
with a priority on Head of Staff roles
> Handle everyone that couldn't be assigned a random job

New behaviour
> Assign dynamic priority roles
> Assign all Head of Staff roles to players with High prefs
> If no Head of Staff was made in the above way, force one Head of Staff
(if possible)
> Assign all AIs
> Assign overflow roles (fixed)
> Prioritise and fill unfilled head roles at each job priority pref
level, from High prefs down.
> Build a list of all jobs that each unassigned player could be eligible
for at the above pref level.
> Pick a job from that list at random and assign it to the player.
> Handle everyone that couldn't be assigned a random job.

In reality there should be little impact on overall job assignment, the
code changes read more as semantics. For example, the priority check for
filling Head slots will have the same candidate pool in both old and new
versions, but in the new version we're more clearly saying that Heads
are important and we want to prioritise filling them for the sake of
round progression even though the outcome in new and old is the same.

A key change will lead to an increase in assistants - Overflow fixes.

Currently the code block to do early assignments to the Overflow role
doesn't work - or works but not as you'd expect. The idea was is that
because enabling the Overflow role in the prefs menu is an On/Off toggle
that sets the job to High priority when enabled and prevents any other
High priority pref, players that have the Overflow role enabled will
**always** get it. It's their highest priority job with infinite slots.
So we do a pass right at the start to give everyone with the Overflow
role enabled that role and save us wasting time later on in random job
code giving them that same role but with more work.

The problem is the code for this only assigns the Overflow role to
people with it set to Low priority in their prefs, resulting in log
readouts like:
```
[2024-07-27 09:49:43.469] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:43.469] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Radioprague, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caluan, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caractaser, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Apsua, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: AC1, Candidates: 0
```
Where nobody gets pre-assigned the overflow role because their prefs are
all set to the High priority from being toggled... Except wait a second,
some people have it at Medium priority when it should just be a No
Role/High Priority Role toggle?

And herein we meet a problem. My hypothesis is that traits and stuff
that change the overflow have allowed players to set the "ordinary"
overflow role of Assistant to Medium and/or Low priority.

This still shows as enabled in the prefs menu, but leads to an outcome
where a player with assistant enabled is assigned Cook instead.
```
[2024-07-27 09:49:47.775] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:47.775] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
...
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
...
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
```

So players with the Overflow job pref set to Low (an unexpected state,
should be disabled or High) would be guaranteed to get that role if none
of the higher priority Head of Staff/AI/Dynamic roles took over via the
bugged "force overflow for people with the pref enabled" proc.

Players with the Overflow job pref set to High would be guaranteed to
get that role if none of the higher priority Head of Staff/AI/Dynamic
roles took over via the random job assignment code giving them their
Highest priority role thanks to the infinite job slots of the Overflow.

And players with the Overflow job pref set to Medium (an unexpected
state, should be disabled or High) would get Assistant if the shuffle
step of the available jobs list put Assisstant before any of the other
jobs they had prefs enabled for at Medium that weren't already filled,
otherwise they'd get another random job.

This code is now changed to ignore the priority the player has set when
looking for people to fill the overflow role. As long as it **is**
enabled, the player will get it unless they're forced into a dynamic
ruleset role (AI when malf rolls) or a Head of Staff role due to their
other prefs (they have RD set to med or low, and no other player has a
Head of Staff at high so they get randomly picked and miss the overflow
role).

This will increase the number of assistants in shifts where their pref
state has Assisstant in the bugged Medium priority, but doesn't change
it for bugged Low and not-bugged High/On priority.

On the other side of the coin, we have how the random jobs are picked.
They're kinda not random, and I noticed this reading the logs then
reading the code.

The list of available jobs to pick from is randomly shuffled - but only
**once**. All players pull from a list of jobs in the same order. So you
end up with a log block like this:
```
[2024-07-27 09:49:47.985] DEBUG-JOB: DO pass, Player: Pierow, Level:3, Job:Botanist
[2024-07-27 09:49:47.985] DEBUG-JOB: Running AR, Player: Pierow, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.985] DEBUG-JOB: Player: Pierow is now Rank: Botanist, JCP:0, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: DO pass, Player: Daddos, Level:3, Job:Botanist
[2024-07-27 09:49:47.986] DEBUG-JOB: Running AR, Player: Daddos, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.986] DEBUG-JOB: Player: Daddos is now Rank: Botanist, JCP:1, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: FOC job filled and not overflow, Player: Bebrus2, Job: /datum/job/botanist, Current: 2, Limit: 2
[2024-07-27 09:49:47.987] DEBUG-JOB: FOC player job not enabled, Player: Bebrus2
[2024-07-27 09:49:47.987] DEBUG-JOB: DO pass, Player: Bebrus2, Level:3, Job:Cook
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
[2024-07-27 09:49:47.988] DEBUG-JOB: Player: Bebrus2 is now Rank: Cook, JCP:0, JPL:1
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC player job not enabled, Player: Redwizz
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC job filled and not overflow, Player: Redwizz, Job: /datum/job/cook, Current: 1, Limit: 1
```

The list is shuffled into an order of something like `list("Scientist",
"Botanist", "Cook", "Sec Officer", ...)` then iterated over for each
player. So every random job selection goes:
> "Does Player1 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player2 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player3 have Scientist enabled and at the right priority? No?
Okay, Botanist has no slots left so we'll remove it from the list. Okay,
Cook? Yes? You get cook."
> "Does Player4 have Scientist enabled and at the right priority? No?
Okay, Cook has no slots left so we'll remove it from the list. Okay, Sec
Officer? ..."

This can lead to stacked individual departments if it gets randomly
rolled to the start of the list in the shuffle, and completely empty
departments if they end up at the end.

On high pop shifts this is probably less of an issue. Player prefs add
noise to this and as departments at the front fill up, those at the back
pick up some of the lower pref players.

But have you ever had a shift where there's just like... No fucking sec
even though there's tons of players? The logging (before I made changes
in this PR) was a bit ass, but my hypothesis there is that sec officer
was shuffled right at the end of the random job list, so every other
department was filled up before sec officers were picked.

To mitigate this, I made the list shuffle every single time the game
picks a random available job for the player. This should lead to a more
balanced selection of available jobs by avoiding situations where the
code is biased towards packing some departments by accident.
## Why It's Good For The Game

Overflow fixes mean people who go to their prefs and see the Overflow
Role is On will all have the same experience - They will be the Overflow
role.

More random random job selection should prevent individual departments
having a jobs be stacked when it would have otherwise been possible for
a more balanced selection but the code unintentially biased random
departments to be overstaffed and understaffed each shift.
## Changelog
:cl:
fix: Having the Overflow Role set to On will properly ensure you get
that role at a High priority as intended by the game code.
fix: Job selection is now a little bit more random. Fixes an
unintentional bias in random job assignment that could lead to
feast-or-famine for roles where everyone is assigned one job and nobody
is assigned another job.
/:cl:

---------

Co-authored-by: san7890 <[email protected]>
carpotoxin and others added 28 commits September 9, 2024 14:51
Over half of the line changes are merely from splitting the
fish_types.dm into several files since it was over 1k lines already.

One of the small issues with fishing right now is RNG. You want to get
some specific fish, and you go through all the micromanaging with hooks,
reels and baits only for the random number god to say "nope", and that's
only going to get worse the more fish are in the game.

However, I've a solution: (unconsumable/reusable) fishing lures, each of
which attracts different fish based on different conditions. The only
caveat is that they require to be spun at set intervals (usually 1 to 3
seconds, depending on the lure, with a second-long window). Worry not,
there're visual cues in the form of a green/red light hovering the
fishing float, so you won't get screwed up by the server slowing down or
whatever.
The whole box of lures (12 so far) can be from cargo for the fair price
of 450 credits.

I've also added 5 new fish: monkfish, plaice, pike, another punnier
variant of the pike, perch and squid. The latter is quite special
because of the ink production trait, which lets players use it to blind
others at a close range and when butchered, it yields an ink sac, which
can be processed into a can of squid ink (one less item exclusive to the
produce console), or thrown at people in a sort-of-similar fashion of
banana cream pies (except it's ink).

<details>
  <summary>Images</summary>

Fishing lures (forgot to take my cursor off the veggie one before the
screenshot):

![immagine](https://github.com/user-attachments/assets/8ba7a0f2-2a9f-4177-9c0d-ebeabd8a0ef7)

The five new fish:

![immagine](https://github.com/user-attachments/assets/1c251079-3b39-48bb-af6c-0a35623953a7)

</details>

<details>
<summary>A table of fish catchable wth each lure (excluding
holodeck)</summary>

![table](https://github.com/user-attachments/assets/dee95855-405b-4945-bfc2-70e816e46109)

</details>

A few more things in the CL, baitfish are a thing now.

There should be ways to contrast some of the RNG fishing has. After all,
it's only going to get more random the more fish are in the game.
Furthermore, I find it disappointing that a lot of food stuff is
exclusive to the ingredients console and there're no other ways to get
it.

:cl:
add: Added fishing lures to the game. They don't get used up like baits
and let you catch specific kinds of fish, though they need to be spun
every few seconds. The whole set can be ordered from cargo for 450
credits.
balance: The magnet hook now removes dud chances.
add: Added five new fish types: perch, two types of pike, monkfish,
plaice and squid. Squids have a fairly special ink production trait,
which lets you use them (unless dead) to ink people face at close range,
and can be butchered for an ink sac, which can either be processed into
canned squid ink, or thrown at someone.
fix: Refactored throwing a little. Some items (specifically
components/elements) won't be triggered when caught. no more plates
shattering despite being caught for example.
add: Goldfish, lavaloops, needlefish and armorfish can now be used as
baits.
/:cl:
can_see wasnt working after the new inbuilt byond procs were introduced
to it.

closes tgstation#86515

🆑
fix: basic mobs will now act hostile again
/🆑

---------

Co-authored-by: Ghom <[email protected]>
## About The Pull Request

Closes tgstation#86503, somehow went unnoticed for half a year.

## Changelog
:cl:
fix: EMPing turrets temporarily disables them once again
/:cl:
## About The Pull Request
fixes tgstation#86501 

![Screenshot_3683](https://github.com/user-attachments/assets/fba4fa58-4689-41e5-ad86-f89ae4bf1b78)
basic mobs just werent using the plane cube
## Why It's Good For The Game
the entire reason tgstation#86498 was possible was because bot paths were broken
(again)
## Changelog
:cl:
fix: some bot paths will show up to users with diagnostic huds again
/:cl:

---------

Co-authored-by: Ghom <[email protected]>
## About The Pull Request

For 2 Months, I've had to manually eject the clamp and then later
re-attach it or somehow find a second weapon to add on Ripleys in order
to select the cargo hold.

<details>

<summary>Technical Stuff</summary>

This fixes an oversight in the justice mech's update to mech UI to
account for if a category had no capacity.

### Pre-Justice
```DM
	for(var/i = 1 to max_per_category)
			var/equipment = equip_by_category[category]
			var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment)
			if(is_slot_free)
				data += list(list(
					"slot" = category
				))
				if(ui_selected_module_index == module_index)
					ui_selected_module_index = null
			else
				var/obj/item/mecha_parts/mecha_equipment/module = islist(equipment) ? equipment[i] : equipment
				...
				))
				if(isnull(ui_selected_module_index))
					ui_selected_module_index = module_index
			module_index++
	return data
```
### Post-Justice
```DM
		if(max_per_category)
			for(var/i = 1 to max_per_category)
				var/equipment = equip_by_category[category]
				var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment)
				if(is_slot_free)
					data += list(list(
						"slot" = category
					))
					if(ui_selected_module_index == module_index)
						ui_selected_module_index = null
					continue
				var/obj/item/mecha_parts/mecha_equipment/module = islist(equipment) ? equipment[i] : equipment
				...
				if(isnull(ui_selected_module_index))
					ui_selected_module_index = module_index
				module_index++
	return data
```

In the first code, module_index++ is called on every iteration, however
it is only called if is_slot_free is false in the second version,
leading to a lot of mess and null equipment indexes when there shouldn't
be. This PR reverts this so that mech UI functions as intended while
also retaining the check for if a category HAS any equipment capacity.

</details>

### Testing
<details>

<details>
  <summary>  Before</summary> 



https://github.com/user-attachments/assets/f94dde9c-8dd6-4b8f-8fd7-fe901814c70b




</details>
<details>
  <summary>  After</summary> 
 



https://github.com/user-attachments/assets/812d7d1a-2404-400b-9b21-1594ed08eda3




</details>
</details>

## Why It's Good For The Game

Clicking on a module should select it.
Fixes  tgstation#86493

## Changelog
:cl: TwistedSilicon
fix: Mech equipment is no longer broken in the UI for specific
conditions.
/:cl:

Co-authored-by: Ghom <[email protected]>
…gstation#86533)

## About The Pull Request
Closes tgstation#86524
Insert does not return a value, ran a regex and nothing else seems to
have had this mistake

## Changelog
:cl:
fix: Fixed prosthetic quirk dropping organs underneath you when spawning
/:cl:
Sprites Update by ArcaneMusic:
![Снимок экрана 2024-07-24
081415](https://github.com/user-attachments/assets/db557ba1-c87e-4751-9cbe-55f543f7bdd3)
Video:
https://youtu.be/JoFvwwFzVvA
Text:
Big manipulator is a new machine crafting from circuit board which can
be created on engi/rnd/cargo/service techfabs.
Big manipulator performs a simple function of take and drop item. You
can unsecre it with wrench left click and rotate manipulator hand with
rigth wrench click.
Big manipulator speed depends on the tier of servo part inside it:
2/1.4/0.8/0.2 Seconds from 1/2/3/4 servo tier.

Provides more logistics mechanics for conveyor belt designs and other
cargo transportation.

:cl: by Xackii, sprites by ArcaneMusic
add: Added big manipulators.
/:cl:

---------

Co-authored-by: Time-Green <[email protected]>
…tion#85959)

## About The Pull Request

The carp organ set gives your head 10-15 unarmed damage, alongside
making you attack with your head... Which is, well, you're biting them
with your carp jaws. So, let's make it actually use the bite effect.

## Why It's Good For The Game

Makes more sense - if you're biting using carp jaws, then the effect
should be a bite.

## Changelog
:cl:
qol: Unarmed attacks with carp jaws now uses a bite effect rather than a
punch effect.
/:cl:
…5960)

## About The Pull Request

When encountering a commissioned bot, Beepsky will salute it instead of
itself. What a narcissist.

Also removes single char var because why not.
## Why It's Good For The Game

Closes tgstation#85186.
## Changelog
:cl: Rhials
fix: Beepsky will now salute commissioned bots, instead of himself, when
encountering one.
/:cl:
This repurposes the redundant `mobtype` var on the ERT datum. Originally
used to store the typepath for what mob the ERT would spawn (which was
unchanged on any of the other datums), it is now null by default and can
be modified in the summon_ert verb menu. If left blank, it will default
to humans, but it can be set to any humanoid species.

![image](https://github.com/user-attachments/assets/8caa01e3-dabf-4971-ba38-68138fb66eae)

As stated previously, mobtype was redundant, as it would either always
spawn humans (human authority would immediately humanize the spawned
mob) or be overridden by the preferences of the player being spawned.
Rather than making it a hardcoded value and deleting the var, I've
elected to repurpose it for further ERT customization.

Moth ERT, Moth ERT, Moth ERT.
:cl: Rhials
admin: You can now choose the humanoid species spawned by an ERT summon
in the summon menu.
/:cl:
## About The Pull Request
it was checking if both are true instead of checking for the bits

## Why It's Good For The Game
fixes broken signal bitflag check

## Changelog
n/a
…gstation#85505)

This adds an sound effect for windows reforming after being destroyed by
the `temporary_glass_shatterer` component.

https://github.com/user-attachments/assets/bcaeeaf9-9884-45c5-9e9b-b8ad419cb834

Please let me know if the sound is too sharp. We're literally dealing
with 2 different "glass shattering" sounds played in reverse, so the
chances that this is grating for anyone with a better headset than mine
is high.

Cool sound effects for cool visual effects. This process being silent
felt off.
:cl: Rhials
sound: Windows blown out by a Voidwalker blade now have a cool sound
that plays as they reform.
/:cl:
Right now, there are two ways to set the aquarium visual for fish. The
first is to make a small little blob of pixels representing the fish
inside the aquarium, and then set the fish' sprite_width/sprite_height
vars for that little blob of pixels. The second is to set the fish'
source_width/source_height representing the boundaries of the fish
original icon state and then sprite_width/sprite_height to get how much
the icon state will be resized when used as an aquarium visual.

So far so good, except we're only humans, and this sort of stuff can and
will confuse us and overall make the process of adding new fish more
complex. There are quite a few fish that don't have these vars set up in
the right way, so I've decided to butcher out the second method in favor
of the first one. Given the size of the aquarium icon states, this is a
pretty trivial task. Furthermore it works better for fish whose sprites
are coiled or snakey-looking (jumpercables and emulsijack) or on a
diagonal axis.

I've also added an unit test to ensure future contributions don't ever
forget to set the right vars and make an aquarium icon state.

Less confusion, and two less fish variables (they've over 40!).

:cl:
fix: fixed a few minor nits with aquarium fish visuals.
/:cl:
https://github.com/user-attachments/assets/98aa2177-ee0f-48d0-bbd4-83d01e688b54

it makes gravity in a radius
you may order it from cargo
may take power from wire instead

good for like space bases and stuff

:cl:
add: portable gravity unit, bought at cargo
/:cl:
This PR adds a new persistent feature: message inside bottles. These are
basically glass bottles with inside a piece of paper, a photo or space
cash (no holocredits, and most bills rarely go over 1000 credits anyway)
from a previous round, which can be fished at the beach, or from the
relative fishing portals.

Each piece of written paper or photo that isn't map-loaded has a roughly
a 0.2% chance to be added to the message bottles database at the end of
the round. However, you can also manually toss a glass bottle with
inside a paper/photo/bill into the ocean (or a fishing portal generator
with the ocean/beach module loaded) for guaranteed results.

The bottles are removed from the database once fished up by the by,
unless tossed back into the ocean.

I've also offset a couple bottle sprites that weren't properly aligned
(for the message overlays).

TODO:
- [x] add a couple (20 prob or less) message bottle spawners to the
beach away mission or something.
- [x] add a few sounds for adding and removing the message from the
bottle. (pickup/drop sounds already handle that)
- [x] test it properly.

I think it'd be neat to have a way to send photos, snarky "seek grass"
messages, as well as the occasional financial aid to future players, and
furthermore, another thing to tie fishing to.

:cl:
add: You can place papers, photos and cash bills (no holochips) inside
bottles and then toss them into the ocean (or fishing portal gen with
relative settings) with right-click, for others to fish them up on
future rounds.
/:cl:
this is a revival of tgstation#82635 . i got permission from potato to reopen
this, he did almost all the work. i only just solved the conflicts and
fixed all the bugs that were preventing the original from being merged
(but it should be TMed first)

slightly improves the performance of basic mob AI

:cl:
LemonInTheDark
refactor: able_to_run and incapacitated have been refactored to be event
based
/:cl:

---------

Co-authored-by: LemonInTheDark <[email protected]>
Co-authored-by: ZephyrTFA <[email protected]>
…_to` instead (tgstation#86020)

BYOND 515 added a new proc called `get_steps_to` - which is basically
`get_step_towards`, but instead it returns a list of directions! Ain't
that nifty and useful? So we can just calculate the path once.

Several helper procs - `can_see`, `CheckToolReach`, and
`get_hearers_in_LOS`, use `get_step_towards` in a loop, so I've
refactored them to just calculate the path once using `get_steps_to`,
and then loop through the returned path of directions.

In theory, should micro-optimize performance, by only calculating the
pathfinding once.

:cl:
refactor: Refactored some functions related to line-of-sight and reach
to improve performance.
/:cl:
## About The Pull Request
It was checking if the size was over 1000 instead of the weight. Also
I'm changing the code to use the initial values of the average size and
weight of goldfish, since I'm shrinking the lil' fella a bit in an
upcoming PR.

## Why It's Good For The Game
Fixing an oopsie.

## Changelog

:cl:
fix: Fixes the chainsaw evolution for goldfishes.
/:cl:
…on#86439)

This PR reintroduces tgstation#85759, tgstation#85892 and tgstation#85894.
fit the top-down or 3/4 style we've for a lot of things.

Reintroducing lost features and improvements. Remember to remove the
'Lost in the wallening revert' label from those PRs when this is merged.

N/A
…ight is broken (tgstation#86111)

## About The Pull Request
This was an oversight. If someone breaks line of sight (which you need
to maintain for 8 seconds) it immediately goes back on cooldown, which
is kinda ass

## Why It's Good For The Game

I saw the voidwalker I was playing against was Livrah so I checked the
stream afterwards. Not that I can understand a word but the Unsettle
going on cooldown seemed frustrating, and is not something I intended

Also this is me we're so cute toghether ❤️

![image](https://github.com/user-attachments/assets/5f079bbb-a693-4a0e-ab97-9979bc19c150)

## Changelog
:cl:
qol: Unsettle (Voidwalker) doesn't go on cooldown if line of sight is
broken
/:cl:
## About The Pull Request
gives the aquarium a new ui:

![image](https://github.com/user-attachments/assets/e00b16dd-e457-4742-95c3-c68dfeac9bc5)
u can now also pet and nickname ur fish through this interface. petting
them will have them do a small dance and increase their happiness

![image](https://github.com/user-attachments/assets/150528f0-befc-47ea-8dbc-01052bfb702d)

the hearts indicate how happy the fish is with the tank's living
conditions and if theyve been petted recently.

## Why It's Good For The Game
gives aquariums a better UI making it easier to use

## Changelog
:cl:
qol: gives aquariums a new easier to use UI
/:cl:
## About The Pull Request

- Changes sticker container from a generic box to a specialised 'sticker
pack' with label
- Adds a Chief Engineer seal of approval sticker


![image](https://github.com/user-attachments/assets/7b1d8789-6a06-46ec-a2a3-be4272eb5268)

## Why It's Good For The Game

The CE can now quell crew concerns about machinery they find in the
hallway

Before:


![ce_sticker_1](https://github.com/user-attachments/assets/0e7c1752-743f-4b6a-8e5c-8627a3f11d82)

After:


![ce_sticker_2](https://github.com/user-attachments/assets/82f74a09-f007-45ad-8dcd-f70840681ba6)

## Changelog

:cl: LT3
add: Added Chief Engineer SEAL OF APPROVAL sticker
code: Stickers now come in sticker packs, not boxes
code: Stickers can now add examine text to whatever they're stuck on
/:cl:
…ts. (tgstation#86116)

Adds a quiver to the traitor "Syndicate Rebar" kit, can be used to store
rods and reload the Rebar more efficiently.

![image](https://github.com/user-attachments/assets/bedc98d5-4b2d-4a68-b598-0853c17d73cb)

Fixes Rebar bows having more ammo than intended.

Rebar bows will now draw their string with left click instead of just
the use button.

Quivers are now a neck storage item.

Hydrogen bolts have lost their ability to embed and pierce an infinite
number of targets in exchange for a small damage buff , increased
accuracy on bodyparts and the ability to pierce walls.

This PR is the fruit of a discussion spanned over the course of several
months between me and KingKumaArt (the creator of the rebar bows.), He's
now busy abroad, so I'm pushing these changes in his stead.

**Changes to the syndie rebar and quivers**

The syndicate rebar bow is a fun albeit slightly underwhelming weapon,
at least compared to its direct competitor, the revolver.

The numbers prove this, as according to the charts it's very rarely
bought on LRP and doesn't even show on the MRP charts.

https://superset.moth.fans/superset/dashboard/4/?native_filters_key=cBYTbRt2At8pt1VkwV8O7NEZZZeDiIQ5fZgSMfjoICB0yow1BWJXDG5SyV9MJKTf

I think most of the issues with the weapon can be attributed to the
horrible jank that surrounds it.

Reloading and storing ammunition for this weapon is a management
nightmare, as the rods cannot be stacked and have to be manually loaded
by hand, making it horrendous to use in combat.

While that's fine for the makeshift crew version, Traitor weapons should
be more realiable in a combat scenario.

**So i'm squashing both problems by introducing a traitor version of the
quiver.**

It comes packed with the box you get the crossbow from, can be worn on
the neck, stacks up to 20 rods, and features an action button that
allows you to slowly chamber your rods into the rebar.

Video demonstration: https://www.youtube.com/watch?v=nG9efFOyauw

The crew version has also been moved to a neck storage item, but has
half the capacity and lacks the ability to quick reload.

I've also made the firing process slightly less annoying by having left
click draw and undraw the string; as it stands, you have to alternate
left click and use on hand after each shot, which is just jarring.

Created 2 new variables to replace the ALWAYS_HIT_TRAIT, so we don't
have to slap a new trait every time we want to dictate how accurate a
gun or projectile should be at range.

Lastly, I fixed an issue that allowed the bow to fit 1 extra bolt than
its intended capacity. if you were to chamber your last rod, it does end
up nerfing the burst of the syndie variant, as it drops down from 4 to
3, but the smoother reload should make up for it.

**Hydrogen bolts**

As it stands, all the atmosian bolt variants occupy different niches and
they are more or less balanced.

Except for the hydrogen bolts.

With zauker bolts doing 60 toxin damage, guaranteed embed, and Syndie
bolts doing 55 brute + the high delimb chance, Hydrogen bolts just don't
have any real purpose to exist with their lower damage and lack of the
ability to delimb.

Metallic hydrogen in general doesn't have any good applications, the
armor is weaker than your run of the mill sec vest, the axe is a
downgrade over the roundstarting one....; I could go on, point being
that something that requires in depth atmos knowledge and 30-40 minutes
of hard work shouldn't be outclassed by what's readily available at the
start of the shift.

So what if we made the hydrogen bolts go through walls?

Long range weaponry is a niche that remains mostly unfilled in the
traitor arsenal.

The syndicate rebar technically does have a scope, but requiring direct
line of sight makes it unreliable and far too risky to use, since you
could be jumped at any times while you are zoomed in.

So i've made the hydrogen bolts a weaker version of the nukie penetrator
rounds, with slightly lower damage, no infinite pierce and inability to
damage the AI core.

I've also improved their long range accuracy, as these bolts are meant
to be accurate at longer ranges, (they drop off massively past the 15
tiles)

Now yes, the bolts will be accessible to the crew as well, so why am I
discussing this as if it were a traitor change?

Well for starters, the actual applications of a crew atmos tech using
these are fairly limited.

Regular rebar bows can only fire 1 shot at a time, don't have a scope,
and you won't get much mileage out of the wall piercing component unless
you get thermals or x-rays, which are very much a stretch to acquire as
an atmos tech.

In the hands of a traitor, however, I can see it as a potential use for
a long-range sniping tool, if you are willing to commit half of your
round to make the bolts that is.

:cl:
add: A Syndicate Rebar Quiver has been added to the uplink
qol: Left clicking with a rebar crossbow will now draw/undraw the
string.
balance: Rebar quivers are now a neck slot item.
balance: Hydrogen bolts damage has been upped to 55 brute and can now
pierce through walls, they no longer have infinite piercing and can no
longer embed however.
code: removed the TRAIT_ALWAYS_HIT_ZONE, replaced with 2 new variables.
fix: fixes rebar crossbows having a higher capacity than intended if a
bolt had already been chambered.
/:cl:

---------

Co-authored-by: Xander3359 <[email protected]>
## About The Pull Request
i wrongfully capitalized some stuff in my last commit 

## Why It's Good For The Game
fixes aquarium ui

## Changelog
:cl:
fix: aquarium ui now displays props and fishes correctly
/:cl:
…86122)

## About The Pull Request
Makes the Cytology Vendor sell science bio suits instead of
normal/medical bio suits and the correct type of lab coats.
## Why It's Good For The Game
A science vending machine should sell science bio suits instead of blue,
medical bio suits.
## Changelog
:cl:
fix: Makes the Cytology Vendor sell science bio suits instead of medical
bio suits.
fix: Makes the Cytology Vendor sell science lab coats instead of normal
lab coats.
/:cl:

---------

Co-authored-by: Ghom <[email protected]>
The Cytopro makes a grand return post-revert! Also renames the starting
petri dishes to "basic sample petri dish"

This noticeably does NOT fix the fact that the machine sells the wrong
sort of labcoat, so I strongly recommend merging tgstation#86122 immediately
following this PR.

Puts tgstation#85338 and tgstation#85996 back

:cl:
add: The vendor of cytology equipment, the CytoPro, is once again
available in your local science department!
/:cl:
@carpotoxin
Copy link
Collaborator Author

I'll try this again some other time and atomize it.

@carpotoxin carpotoxin closed this Sep 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.