Commit Graph

4956 Commits

Author SHA1 Message Date
uaioy
b5fa92d691 Adds Medieval Pirates (and small assault_pod change) (#82392)
## About The Pull Request

(short, slightly outdated video compilation of the pirates)
https://youtu.be/j9BNFzcUSjc

Adds the **MEDIEVAL WARMONGERS** pirate gang, these pirates are focused
on causing chaos directly on the station with the use of melee weaponry
and swarming tactics.
they are not very smart when it comes to using technology, so they crash
in the station in an attempt to dock.

the pirates spawn with the NOGUN trait as they have never used guns
before but have access to dashing and the unbreakable component(small
heal burst upon reaching crit).
Warlord spawns with a better version of hulk(isnt removed upon crit and
can still do stuff while critted) and gigantism mutation by default
because ~~Chad Maximus~~ the other pirates require someone to run to
when stuff like flashbangs, batons or lasers are present. The warlord
spawns with a boarding axe which is a better axe that is good at
destroying things and a meat hook. **there's a total of 5 pirates.**

the pirate shuttle has:
- thermite barrel and 3 large beakers
- single weak claymore
- 3 extra military spears
- 3 kite shields
- 3 heavy bolas
- 4 regular bolas
- a stack of wood
- 2 stacks of mourning poultice (15 uses each)
- one burn medkit

**shuttle was made by striders18, big thanks to him**

![image](https://github.com/tgstation/tgstation/assets/114047053/766d0b96-4487-47d3-b524-70d811ce4d73)


things added:

- the new pirate gang
- a gamberson jumpsuit
- crude armor (good melee and wound protection but lacks on the rest)
- warlord armor (extreme protection at the cost of slowdown)
- a shortsword(bootleg claymore with 30 block chance and goes on belt
instead of back)
- military spear (better at throwing, better wounding, deals blunt
wounds instead of sharp)
- axe with better damage and demolition mod for the warlord
- a var to specify the name of the landing zone destination for the
assaultpod
- an assault pod targeting device item for the medieval shuttle
- a thermite barrel
- kite shields
- new hulk variant that doesnt go away when crit and has tenacity
## Why It's Good For The Game
I always liked the chaotic nature of the russian bounty hunters that
would come from their extra numbers and lack of tools. i thought
something of a similar idea on pirates would be good, a very direct and
scary militia rushing in with sword and faith would create some awesome
scenarios

## Changelog
🆑
add: New heavy weight pirates, medieval warmongers
add: Adds military spear, shortsword, boarding axe, kite shields
add: Adds warlord and crude armor
add: Adds medieval shuttle (made by striders18)
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-04-22 21:16:06 -07:00
Jeremiah
c1a775efe1 Implements data systems (#82816)
## About The Pull Request
Subsystems currently come in two different flavors:
1. Systems that process at intervals with the master controller
2. Global data containers that do not fire

And I think they should be split up...


This moves 4 non firing, non init subsytems -> datasystem

## Why It's Good For The Game
Clarity in code
2024-04-22 21:27:15 -06:00
necromanceranne
ca2ff33292 Rocky DLXIII: Fitness to Athletics, Athletics skill influences Boxing against Boxers, Boxing overhaul, Evil Boxing (#82611)
## About The Pull Request

### Changes Fitness skill to Athletics skill; Removes the sprite growth
as the only meaningful reward

Basically just a rebranding so that it is more broad in its concept. It
isn't just about peak physique. It's about how you can apply it too.

Reaching Legendary rewards you with the Golden Gloves.

### Boxing Overhaul

I started it in this pr here
https://github.com/tgstation/tgstation/pull/80635

But this is a more significant overhaul of boxing from the ground up.
Namely, it now is majorly influenced by the Athletics skill, and also
more thoroughly aligns with conventional punching in its current state.
However, a major component of this is that boxing's breadth of mechanics
is only relevant when used against another boxer. Non-boxer targets are
only ever going to get smacked by a stamina punch, as it is currently
(and more or less the same values too). Additionally, boxers cannot
punch someone who is either unconscious or in stamina crit, so it can't
be used to maintain stamcrit.

- Boxing now has a One-Two Punch mechanic. Swapping between the left and
right mouse buttons to punch and maintaining this causes every second
punch to do more damage (to boxers). Breaking this chain by punching
with the same button twice will cause you to lose damage (against
boxers).

- Boxing now can have crits occur below 50 stamina damage (against
boxers). However, to knock someone out clean, the target must be
staggered from a previous crit first. (Or I guess be staggered at all,
maybe their shoelaces were tied or something). Crit probabilities are
determined by adding your Athletics probability skill bonuses to your
unarmed effectiveness, and then reduced by the targets own Athletics
skill bonuses. It is hard for two athletes to knock each other out in
one blow. It is trivial for a legendary boxer to knock out a novice in a
single punch. Cybernetically enhanced boxers are dangerously effective
at boxing.

- Boxers can block other boxers by using throw mode, but the chances of
doing so is based on Athletics skill bonuses. A successful block causes
the attacker to take stamina damage (as does the blocker, but less so).

- Participating in boxing increases the Athletics skill. Your gains are
probably slower than normal training, but you at least get some reward
for doing so. Only relevant if your opponent is a boxer. Get a sparring
partner!

### Evil Boxing (Admin Only)

So this is all well and good, but what if you're a scoundrel with no
care for the other person in this equation? Well, that's where Evil
Boxing comes in. Evil Boxing has absolutely no restrictions at all, and
can freely use its boxing abilities against anyone. Even non-boxers. You
can even grab people! Wow, what a scumbag. I bet you even king hit
people. Thankfully, only an admin can make you into an Evil Boxer.

### Strength and Stimmed Mutations now benefit Exercising and Boxing
(against boxers)

Both mutations have a flimsy increase to instability of 5 because of how
incredibly particular the bonus is.

Strength now reduces the amount of stamina damage inflicted via
exercising by half. Strength also adds a +2 damage bonus on boxing
punches while boxing against boxers (this doesn't influence normal
unarmed attacks whatsoever, or boxing against nonboxers). Obviously,
evil boxers just get this benefit against everyone because they're
knaves.

Stimmed increases the duration of the exercised status effect by one
factor. (That is, if you have no other modifiers, it will double the
duration on its own)

## Why It's Good For The Game

@Jacquerel was racking their brain trying to come up with an alternative
to the skill rewards of Fitness. At the moment, sprite growth is not
only a really bad bonus (it does literally nothing but make you big, and
thus is actually a detriment due to how intrusive sprite size is with
interaction, and plays weird with other sprite changing effects), but
isn't really all that interesting for all the effort put in.

Problem is, how do you make Fitness meaningful without making it a
powergame mechanic? Simple! You make it applicable to a really niche,
self-contained but still utilized game mechanic that is engaging to
participate in and makes you meaningfully very good in it. AND scratches
that power scaling itch that many players have.

Boxing is reasonably self-contained as is, but pretty bland due to how
old it is. While maintaining that self-contained nature, I hoped to
expand the interactivity of boxing a little bit by giving it a small
mini-game in of itself. And also introduce ways to simulate the idea of
boxing a bit better.

The idea of being an Evil Boxer is funny. For every Rocky, there is a
[Insert Rocky Villain Here that isn't Creed]. But in this case, it's
probably some Syndicate douchebag looking to punch clowns into a coma
and inspire the mime to take up shadowboxing in revenge.

## Changelog
🆑
add: Replaces Fitness with Athletics; same skill, but now more
specifically applicable to boxing.
add: Athletics does not increase sprite size.
balance: Overhauls Boxing to add a lot more depth to the interactions.
Only applicable to other boxers, however. You can still punch the snot
out of non-boxers though. But only up to stamcrit or unconsciousness. No
hitting someone who can't fight back!
balance: Adds Evil Boxing, which is the evil and fucked up version of
boxing that you kill people with and are allowed to flout the sacred
rules of boxing as you please. Everyone is a victim!
/🆑
2024-04-22 16:43:58 +01:00
Iajret
d3662137f8 Arcmining QoL: GPS component to scanned vents and vent(pin)pointer (#82724)
## About The Pull Request
Scanning ore vents will now tag them on GPS so you can find them easily
when you are prepared (and remove them when they are tapped). Also adds
special pinpointer to help with finding unscanned vents in a first
place. And adds missing uranium overlays for scanned vents. Because why
not.
<details>


![image](https://github.com/tgstation/tgstation/assets/8430839/d13df20f-79c0-46a7-a602-81c630309a2d)


![image](https://github.com/tgstation/tgstation/assets/8430839/72690bec-dffd-41a8-8a5e-1ceb7ae182d0)
</details>

## Why It's Good For The Game
While looking at mineral density to find vents is somewhat fun and
entertaining, having some sort of upgrade to make finding them easier
adds a bit of a progression. Also re-finding already scanned vents can
be a bit annoying. You need to fill your backpacks with GPSs and tag
them manually. It is also inconsistent with geysers that are added to
positioning after you scan them. And with tendrils, which are always
visible.
## Changelog
🆑
add: added ventpointer that points toward nearby ore vents and can be
bought with mining points
balance: scanned ore vents can now be found with GPS
fix: fixed ore vents missing overlay icon for uranium
/🆑
2024-04-21 12:49:54 -04:00
MrMelbert
a21742ff60 Adds ALLOW_RESTING to a bunch of items (#82761)
## About The Pull Request

Allows you to alt-click a bunch of items while resting. 

Fixes #82788

## Why It's Good For The Game

Some of these, such as storage, are bugfixes. You shouldn't need to be
standing up to configure a spray can, or change the direction of your
bedsheet

Others are just sensible changes. 

## Changelog

🆑 Melbert
fix: You can open bags with alt click while resting again
qol: Many items which previously required you to stand to alt-click now
don't, such as bedsheets and spray cans
/🆑
2024-04-20 21:30:10 -07:00
Name
35114cb487 Adds a Wizard-themed map to the deathmatch (#81640)
## About The Pull Request
Deathmatch is severely lacking in HIGH IMPACT MAGIC LARPING. So I added
a big ass wizard arena. The arena itself is based off the wizard den.

Loadouts:
**Wizard:** Standard all-rounder. Got magic missile, jaunt, and
forcewall. Regular gear.
**Pyromancer:** Fire guy. Red robes, fireball, smoke.
**Electromancer:** Zappy guy. Lightning and tesla shock.
**Necromancer:** Is a skeleton. Has Scream for Me and blink.
**LARPer:** Straight from Station & Spessmen. Fake robes and can only
throw lightning and repulse.
**Chuunibyou:** Classic animage. Got chuuni buff and magic cards.
**Battlemage:** Melee fighter. Got some armor and a big hammer with
instant summons.
**Apprentice:** Underpowered until they find a mystery box. Got charge.
**Gunmancer:** Who needs magic when you have guns? Starts with an m1911,
lesser gun summons, and knock.
**Monkeymancer:** Is a monkey. Can summon monkeys and gorillas. Has a
banana.
**Chaosmancer:** Jumbled robes. Starts with a chaos rod. Can rod form
and summon traps for high chaos.
**Funnymancer:** It's just a clown with a banana staff.

The map itself is a pretty standard arena with a long sightline in the
middle. Each participant spawns in their own room complete with a magic
item box. The very southern portion of the ship has a standard mystery
gun box. Soon after the round starts, a hostile gelatinous cube in the
center of the map will break out and attack whoever it sees. Inside its
enclosure is a free death wand. Map has been tested to make sure
deathmatch participants can't escape the deathmatch.
## Why It's Good For The Game
Deathmatch provides a unique opportunity for people to play with
mechanics they will not often get to use. Allowing people to play wizard
for a few minutes shouldn't cause too much harm aside from admin logging
from explosions, which hopefully a fix is in the pipeline for.
## Changelog
:cl:Motho
add: Added wizard-themed deathmatch map.
add: Added mystery wand box.
/🆑
2024-04-19 17:58:45 -04:00
Jeremiah
3842e16a8b Removes virologist job (#82723)
## About The Pull Request
As the title says. Removes the job. Whole wing of medical is still
there.

![Screenshot 2024-04-17
041852](https://github.com/tgstation/tgstation/assets/42397676/b7b55cd6-b6c1-4a0b-97c8-c7d55d4939ed)

(MSO)

![image](https://github.com/tgstation/tgstation/assets/42397676/3be548f4-9558-4d4d-bc7b-d9cbbbac1d5d)

## Why It's Good For The Game
It's boring. It's so boring that when it decides to become unboring it
just attempts to ruin the fun for everyone else
## Changelog
🆑
del: Due to a need for company restructuring, virologists have been laid
off by CentCom and doctors can optionally take their place.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-04-18 12:52:59 -07:00
Jacquerel
6596d75edc Gulag Adjustments Two (#82561)
## About The Pull Request

I have received feedback that after the prior changes in #81971, the
gulag is still a little bit too subject to RNG.
The main culprit (as in my previous PR) is Iron being kind of cheap and
the fact that unlike the old Gulag you no longer have any way of
headhunting more valuable materials (everything appears as boulders on
your ore scanner).

My solution to this is wider than the last one of tweaking point values,
but also much simpler:
Just make every boulder you mine be worth the same amount of points
regardless of what is inside of it.

On the average test I made I could comfortably mine about 40-45 boulders
in ten minutes.
We'll make some adjustments to that rather than leaving 40 as the target
number;
Most players upon being teleported to the gulag are going to spend a few
minutes whining and bemoaning their fate instead of getting straight to
work. I had the benefit of being able to make sure my run started as
soon as a storm ended so I wouldn't need any kind of midpoint break. I
was also always the only person playing on my local instance, there
hadn't been any other pesky prisoners before me who had already mined
out all the nearest available deposits. And of course, let us not
forget, I am an MLG master league ss13 player who was surely performing
well above average.

So we'll round that down to: Each boulder is worth 33 points, meaning
you need to collect 31 boulders to complete a 1000 point (roughly ten
minute) sentence.

How do I ensure that every boulder is worth the same amount of points?
Well it's pretty easy.
One boulder = one material sheet. One material sheet = 33 points.
Simple.

"Now Jacquerel", I hear you not saying because you don't want me to know
about this thing you would prefer to do instead of hitting rocks
outside; "if I simply smash all of the tables and microwaves and botany
trays and bed in the gulag I can easily get like 65 sheets of Iron,
which is almost enough to buy the freedom for two entire people!"
Unfortunately I knew you were going to try and do that and the prisoner
point machine will only give you points for material sheets which have
been printed from the material smelter (well, any material smelter
actually but you should probably use the one in the gulag). You'll be
able to tell because if you examine a valid material sheet it will
mention a little maker's mark on it, which is absent in the beat-up iron
that you get from smashing furniture to bits.

Also glass is worth 0 points. Don't waste time digging up that shit. 

As glass has had all of its point value removed, I have added a "work
pit" to the gulag to compensate. You can pull boulders out of this
indefinitely via effort, however it also stamcrits you every time.
It's not very fun to do this, but that's because I would prefer you to
go find the rocks out in the field instead. This is a last resort.
You can do this if there's no boulders left to mine or if you really
really really hate mining and would rather very slowly click on one tile
repeatedly to get your boulders instead.
As a tiny bonus doing this gives workout experience.

This isn't a totally ideal solution but I think it'll do for now.

## Why It's Good For The Game

What we want out of the gulag is:
- Something where officers can vaguely approximate an expected sentence
duration.
- A task that requires players to actually be spending that time doing
something to get out of here.
- Produces at least some amount of useful materials.

In I think roughly that order.
I hope this change accomplishes all three of these in a way that is
somewhat predictable rather than throwing darts at a board.

## Changelog

🆑
balance: Gulag mining has been rebalanced so that every boulder is worth
the same amount of points to mine for a prisoner regardless of what it
contains, and should be more consistent.
add: A vent which boulders can be hauled out of by hand has been added
to the gulag which you can use if there's nothing left to mine. It is
very slow, but at least it gives you a workout...
/🆑
2024-04-18 17:05:06 +02:00
MrMelbert
d280c9ccce Makes it EVEN EASIER to work with atom item interactions ft. "Leaf and Branch" & "Death to Chains" (#82625) 2024-04-18 05:17:39 -07:00
Jeremiah
8e3f635b98 Alt click refactor (#82656)
## About The Pull Request
Rewrites how alt click works. 
Based heavily on #82625. What a cool concept, it flows nicely with
#82533.

Fixes #81242 
(tm bugs fixed)
Fixes #82668

<details><summary>More info for devs</summary>

Handy regex used for alt click s&r:
`AltClick\((.*).*\)(\n\t.*\.\.\(\))?`
`click_alt($1)` (yes I am aware this only copies the first arg. there
are no other args!)

### Obj reskins
No reason for obj reskin to check on every single alt click for every
object. It applies to only a few items.
- Moved to obj/item
- Made into signal
- Added screentips

### Ventcrawling
Every single atmospherics machine checked for ventcrawling capability on
alt click despite only 3 objects needing that functionality. This has
been moved down to those individual items.
</details>

## Why It's Good For The Game
For players: 
- Alt clicking should work more logically, not causing double actions
like eject disk and open item window
- Added context menus for reskinnable items
- Removed adjacency restriction on loot panel

For devs:
- Makes alt click interactions easier to work with, no more click chain
nonsense and redundant guard clauses.
- OOP hell reduced
- Pascal Case reduced
- Glorious snake case

## Changelog
🆑
add: The lootpanel now works at range.
add: Screentips for reskinnable items.
fix: Alt click interactions have been refactored, which may lead to
unintentional changes to gameplay. Report any issues, please.
/🆑
2024-04-16 17:48:03 -06:00
SyncIt21
334c29cef7 [NO GBP] Fixes deconstruction of closets & crates under a special case (#82612)
## About The Pull Request
So if a closet/crate has the `NO_DEBRIS_AFTER_DECONSTRUCTION` set on it
and if someone/something is still inside, then after deconstruction they
get deleted rather than getting dumped out first.

Could cause potential hard delete of mobs & stuff. We don't want to deal
with that

## Changelog
🆑
fix: closets & crates will dump all contents out first before deleting
itself regardless of `NO_DEBRIS_AFTER_DECONSTRUCTION` thus not for e.g.
hard deleting mobs inside it
/🆑
2024-04-16 18:20:29 +02:00
Jeremiah
1456aecdb4 [No GBP] Removes cogbar from some stealthy actions (#82593)
## About The Pull Request
Issue brought some missed hidden actions to my attention. 

I left cogbars in for _breaking_ handcuffs because resisting is sort of
a gray area. On one hand, you don't want someone to see you doing it; on
the other, there is a visible warning that you started doing it. So,
meet in the the middle, breaking handcuffs is still visible while
resisting isn't.
## Why It's Good For The Game
Closes #82583
Cogbars are not intended to ruin stealth
## Changelog
🆑
fix: Deviants buffed: Rogue shoelacing, pickpocketing and restraint
resisting no longer give cogbar icons.
/🆑
2024-04-12 13:47:52 -04:00
MrMelbert
995d8e2ee1 Fixes a variety of input stalling exploits (#82577)
## About The Pull Request

Fixes the following input stalling exploits (maybe missed some): 

- Changing GPS tag 
- Setting teleporter destination
- Request Console Reply
- Various AI law board interactions
- Note, I used `is_holding` but technically this means these fail with
telekinesis. I can swap them to `can_perform_action(...)`, which allows
TK, but I noticed some places explicitly deny TK interactions with Ai
law boards. Not sure which is preferred.
- Borg Rename Board
- Plumbing Machines and Ducts
- APCs and SMES terminal placements
- Stargazers Telepathy
- Go Go Gadget Hat

## Changelog

🆑 Melbert
fix: You can't change the GPS tag of something unless you can actually
use the GPS
fix: You can't set the teleporter to a location unless you can actually
use the teleporter
fix: You can't reply to request console requests unless you can actually
use the console
fix: You can't update AI lawboards unless you're actually holding them 
fix: You can't update a borg rename board unless you're actually holding
it
fix: You can't mess with plumbing machines unless you can actually use
them
fix: You can't recolor / relayer ducts unless you're actually holding
them
fix: You can't magically wire APCs and SMESs unless you're right by them
fix: You can't use Stargazer Telepathy on people who you can't see
fix: You can't configure the Inspector Hat unless you can actually use
it
/🆑
2024-04-12 03:03:27 +00:00
SyncIt21
227cdd2c7c [NO GBP] Patches & renaming for NO_DECONSTRUCTION flag (#82547)
## About The Pull Request

1. Renames `NO_DECONSTRUCTION` -> `NO_DEBRIS_AFTER_DECONSTRUCTION`. As
the name suggests when the object is deconstructed it won't drop any
items/debris. After my last refactor for this flag it now serves a new
purpose so its name has been changed to match that

2. Fixes objects that are now using `NO_DECONSTRUCTION` incorrectly.
Some of these changes include
- Removing the flag in objects where there are no means to deconstruct
them (e.g. jukebox, hydroponics soil, flora etc)
- Replacing the flags old purpose by overriding its tool procs so that
it regains its old behaviour(e.g. You once again cannot deconstruct ctf
reinforced tables, survival pods, indestructible windows etc)

## Changelog
🆑
code: renamed `NO_DECONSTRUCTION` to `NO_DEBRIS_AFTER_DECONSTRUCTION` so
its name matches its intended purpose
fix: fixes some items that incorrectly used `NO_DECONSTRUCTION` prior to
its refactor, meaning makes some objects non deconstructable again
/🆑
2024-04-10 18:58:11 -07:00
John Willard
430896b5cf Blueprints tgui (#82565)
## About The Pull Request

Blueprints now use a TGUI panel instead of the old HTML one.
Also did general code improvement and maintaining to blueprints in
general and also destroyed the ``areaeditor`` level, repathing it to
just 'blueprints'.
Also adds a sound when you look at structural data cause why not

Video demonstration:

https://github.com/tgstation/tgstation/assets/53777086/861773fd-3d57-472d-bc94-d67b0d4f1dbd

The 4 blueprint types:

![image](https://github.com/tgstation/tgstation/assets/53777086/bfd68eb5-c430-4608-a3f7-d6ac86727882)

## Why It's Good For The Game

Another HTML menu dead underground.
This is more responsive and doesn't require constant updating to see
which area you're in, feels less OOC (instead of saying "the blueprints
say", just say it, you ARE the blueprints).

Like, come on

![image](https://github.com/tgstation/tgstation/assets/53777086/fcf1b8b6-37c3-4c94-969f-3b121c983dc0)

Look at all this wasted space

![image](https://github.com/tgstation/tgstation/assets/53777086/1d3e61cd-bc56-4280-a3bb-0c66604e75b3)

## Changelog

🆑
refactor: Blueprints now use TGUI.
qol: Blueprints can now be used while lying down.
/🆑
2024-04-10 11:55:29 -07:00
_0Steven
ccaa9f8f45 Fix table top deconstruction (#82508)
## About The Pull Request

Edited: updated changelog, read comments for changes in implementation
details

So previously, tables would let you use a wrench to fully deconstruct
them, or a screwdriver to take off only their top.
This, however, broke in two different ways in #82280, when their
deconstruction logic got changed.

First off, deconstructed tables would only drop the materials for their
top and not their frame.
For this, the primary culprit seems to be on line 307:

c34d56a45b/code/game/objects/structures/tables_racks.dm (L300-L307)
Where `new framestack(target_turf, framestackamount)` accidentally got
an extra indent, and ended up in the less common half of the if-else
chain.
Just moving this outside of the if-else chain again fixes it.

Secondly, tables had their own special deconstruction logic, which got
'standardized'.
Issue. This was special to accommodate for having two different
deconstruction logics: full or top only.
With `deconstruct(...)` no longer being overridable, I feel it's awkward
to attempt to proxy that information to the new `atom_deconstruct(...)`
So we introduce a new method, `deconstruct_top`, for the screwdriver to
use, which handles deconstructing only the top.
```dm
/obj/structure/table/proc/deconstruct_top()
	var/obj/table_frame = new frame(loc)
	if(obj_flags & NO_DECONSTRUCTION)
		table_frame.obj_flags |= NO_DECONSTRUCTION
	else // Mimic deconstruction logic, only drop our materials without NO_DECONSTRUCTION
		var/turf/target_turf = get_turf(src)
		drop_top_mats(target_turf)
	qdel(src)
```
Mimicking the `NO_DECONSTRUCTION` logic of normal deconstruction, and
copying over the flag onto its frames if need be.
This fixes screwdriver deconstruction.
## Why It's Good For The Game

Fixes #82503.
We can now deconstruct the table top separately again, AND get the right
materials back too.

## Changelog
🆑 00-Steven, SyncIt21
fix: Wrench table deconstruction gives the right materials again.
fix: Screwdriver table deconstruction only deconstructs the top again.
/🆑
2024-04-08 22:17:48 -06:00
John Willard
fa31403353 LateInitialize is not allowed to call parent anymore (#82540)
## About The Pull Request

I've seen a few cases in the past where LateInitialize is done cause of
the init return value being set to do so for no real reason, I thought I
should try to avoid that by ensuring LateInitialize isn't ever called
without overriding.

This fixes a ton of machine's LateInitialize not calling parent
(mechpad, door buttons, message monitor, a lot of tram machines,
abductor console, holodeck computer & disposal bin), avoiding having to
set itself up to be connected to power. If they were intended to not
connect to power, they should be using ``NO_POWER_USE`` instead.

Also removes a ton of returns to LateInit when it's already getting it
from parent regardless (many cases of that in machine code).

## Why It's Good For The Game

I think this is better for coding standard reasons as well as just
making sure we're not calling this proc on things that does absolutely
nothing with them. A machine not using power can be seen evidently not
using power with ``NO_POWER_USE``, not so much if it's LateInitialize
not calling parent.

## Changelog

🆑
fix: Mech pads, door buttons, message monitors, tram machines, abductor
consoles & holodeck computers now use power.
/🆑
2024-04-08 22:15:07 -06:00
MrMelbert
0dc6b71a87 Change setting item weight class to a setter to patch some weight class related shenanigans (#82494)
## About The Pull Request

Fixes #81052 
Fixes #58008

Setting weight class of items is now done via `update_weight_class`.

I updated as many occurrences of manually setting `w_class` as I could
find but I may have missed some. Let me know if you know of any I
missed.

This is done to allow datums to react to an item having its weight class
changed.

Humans and atom storage are two such datums which now react to having an
item in its contents change weight class, to allow it to expel items
that grow to a weight class beyond what is normally allowed.

## Changelog

🆑 Melbert
fix: You can't fit items which are normally too large for a storage by
fitting it in the storage when it is small, then growing it to a larger
size.
/🆑
2024-04-08 19:01:30 -06:00
John Willard
5e9ce5ab99 New Battle Arcade (#81810)
## About The Pull Request

Remakes Battle Arcade from just about the ground up, with exceptions
taken for emagged stuff since I didn't really want to touch its
behavior.

The Battle Arcade now has stages that players can go through, unlocking
a stage by beating 2 enemies and the boss of the previous one, but this
must all be done in a row. You can choose to take a break between each
battle and there's a good chance you'll sleep just fine but there's also
a chance it can go wrong either through an ambush or robbery.

The Inn lets you restore everything for 15 gold and you can buy a sword
and armor, each level you unlock is a new sword and armor pair you can
buy that's better than the last, it's 30 gold each but scales up as you
progress through levels. They are really worth getting so it's best to
try to not lose your money early in.

The battle system is nearly the same as how it was before but I removed
the poor combo system that plagued the old arcade as one big knowledge
lock, now it's more just turn based. The game is built on permadeath so
dying means you restart from the beginning, but if you are going to lose
you can try to escape instead which costs you half of your gold.

Getting to higher levels increases the difficulty of enemies but also
increases the gaming exp rewards which could make this a better way to
get exp if you can get good at it.

Gaming EXP is used to increase chances of counterattacking but doesn't
give any extra health to the player.

I also removed the exploit of being able to screwdriver arcade cabinets
because people would do that if they thought they were on the verge of
losing to bypass the effects of loss. I instead replaced it with a new
interaction that the Curator's display case key can be used to reset
arcade cabinets (there's several keys on the chain so it made sense to
me), which I added solely because I thought Curators would be the type
of person to have run an actual arcade.

This is some gameplay

https://github.com/tgstation/tgstation/assets/53777086/499083f5-75cc-43b5-b457-017a012beede

As a misc sidenote, I also split up the arcade file just like how Orion
Trail was before, just for neat code organization.
The Inn keeper is straight up just a photo of my localhost dude, he's
not a player reference or anything it's not my actual character.
I also have no idea how well balanced this is cause I suck at it lol.

## Why It's Good For The Game

Battle Arcade is one of 3 last machines in my hackmd here to turn into
TGUI https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view
I've always thought the current version of battle arcade is quite lame
and lacks any progression, like Orion Trail I thought that since I was
moving this to TGUI, it would also be a perfect opportunity to revamp it
and try to improve on where it failed before, especially since the
alternative (NTOS Arcade) is also lame as hell and is even lamer than
HTML battle arcade (spam mana, then spam health, then just spam attack,
rinse and repeat).
This will hopefully be more entertaining and give players sense that
they are getting through a series of tasks rather than doing one same
one again and again.

## Changelog

🆑 JohnFulpWillard, Zeek the Rat
add: Battle Arcade has been completely overhauled in a new progression
system, this time using TGUI.
add: The Curator's keys can now reset arcade cabinets.
balance: You now need to be literate to play arcade games, except for
Mediborg's Amputation Adventure.
fix: You can no longer screwdriver emagged arcade consoles. Accept your
fate.
fix: Silicons can no longer play Mediborg's Amputation Adventure.
/🆑

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2024-04-08 23:24:27 +00:00
MrMelbert
6a1519471d Very small atom examine tweaks (#82501)
## About The Pull Request

- Gloves and Shoes are now referred to in "pairs" rather than as "some".
- Meaning you now see "That's a pair of gloves" rather than "That's some
gloves"
- Makes it a tad easier to edit portions of an atom's examine text. 
- Gives reinforced windows a more proper description. 
- (I was examining random things to test and noticed its current
description was INCREDIBLY out of place)
- Fixes an extra space in bloody hand examination.


![image](https://github.com/tgstation/tgstation/assets/51863163/e5f771ff-d553-4a68-a34e-732f66eb24f6)

## Why It's Good For The Game

It's the little things that you tend to notice. 

When referring to shoes, you _generally_ will say "a pair of shoes"
rather than "some shoes". It's just a tad more proper.

## Changelog

🆑 Melbert
spellcheck: Shoes and Gloves are now referred to as "a pair of" rather
than "some".
spellcheck: Reinforced Window's description is less out of place. 
spellcheck: Fixed an empty space in examining a human's bloody hands. 
code: It's a tad easier to exit an atom's examine text now. 
/🆑
2024-04-07 19:54:51 -06:00
Jeremiah
9723b4b317 Replaces even more deciseconds with SECONDS (#82438)
## About The Pull Request
Using these search regexes:

Ending in 0:
`addtimer\((.*),\s?(\d{1,3})0\b\)`
replacement:
`addtimer($1, $2 SECONDS)`

Two digit ending in odd:
`addtimer\((.*), (\d)([1-9])\)$`
replacement:
`addtimer($1, $2.$3 SECONDS)`

Single digit ending odd:
`addtimer\((.*), ([1-9])\)$`
replacement:
`addtimer($1, 0.$2 SECONDS)`

## Why It's Good For The Game
Code readability

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-04-06 15:18:49 -06:00
Jeremiah
c448745976 Creates a "busy" animation for players (#82416)
## About The Pull Request
Little indicator above a player when they're currently doing something.

<details>
<summary>vids</summary>

Perspective: You are the moth

![dreamseeker_b2LA4PpPAr](https://github.com/tgstation/tgstation/assets/42397676/3a38dd3c-23f2-430f-acf4-444ad5c478d3)

Hides under runechat

![dreamseeker_ZgkCWTGqDz](https://github.com/tgstation/tgstation/assets/42397676/ec1d9665-4ff0-47f7-85b6-65998c31b9be)

</details>

Todo:

- [x] Feedback?
- [x] Sneaky params so it doesn't spoil your stealth run
- [x] Possible refactor
- [x] Probably missed some "sneaky" actions
- [x] coggers
## Why It's Good For The Game

<details>
<summary>sound on:</summary>


https://github.com/tgstation/tgstation/assets/42397676/ad71c567-0202-4158-ba50-c2946375f988

</details>

## Changelog
🆑 jlsnow301, infraredbaron
add: Added a new UI element over players that are interacting, building,
etc.
/🆑

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: san7890 <the@san7890.com>
2024-04-05 02:02:14 +00:00
Jeremiah
1443ef79d3 Replaces a number of deciseconds into SECONDS (#82436)
## About The Pull Request
Using these search regexes:

Number ending in 0:
`do_after\((\w+), (\d+)0,`
Replace:
`do_after($1, $2 SECONDS,`

Single digit number:
`do_after\((\w+), [1-9],`
replace:
`do_after($1, 0.$2 SECONDS,`

Double:
`do_after\((\w+), (\d)([1-9]),`
Replace:
`do_after($1, $2.$3 SECONDS,`

## Why It's Good For The Game
Code readability
2024-04-04 18:56:08 -06:00
SyncIt21
6dc40ca522 Standardizes object deconstruction throughout the codebase. (#82280)
## About The Pull Request
When it comes to deconstructing an object we have `proc/deconstruct()` &
`NO_DECONSTRUCT`

Lets talk about the flag first. 

**Problems with `NO_DECONSTRUCTION`**
I know what the comment says on what it should do

b5593bc693/code/__DEFINES/obj_flags.dm (L18)

But everywhere people have decided to give their own meaning/definition
to this flag. Here are some examples on how this flag is used

**1. Make the object just disappear(not drop anything) when
deconstructed**
This is by far the largest use case everywhere. If an object is
deconstructed(either via tools or smashed apart) then if it has this
flag it should not drop any of its contents but just disappear. You have
seen this code pattern used everywhere

b5593bc693/code/game/machinery/constructable_frame.dm (L26-L31)

This behaviour is then leveraged by 2 important components.

When an object is frozen, if it is deconstructed it should just
disappear without leaving any traces behind

b5593bc693/code/datums/elements/frozen.dm (L66-L67)

By hologram objects. Obviously if you destroy an hologram nothing real
should drop out

b5593bc693/code/modules/holodeck/computer.dm (L301-L304)

And there are other use cases as well but we won't go into them as they
aren't as significant as these.

**2. To stop an object from being wrenched ??**
Yeah this one is weird. Like why? I understand in some instances (chair,
table, rack etc) a wrench can be used to deconstruct a object so using
the flag there to stop it from happening makes sense but why can't we
even anchor an object just because of this flag?

b5593bc693/code/game/objects/objs.dm (L368-L369)
This is one of those instances where somebody just decided this
behaviour for their own convenience just like the above example with no
explanation as to why

**3. To stop using tools to deconstruct the object** 
This was the original intent of the flag but it is enforced in few
places far & between. One example is when deconstructing the a machine
via crowbar.

b5593bc693/code/game/machinery/_machinery.dm (L811)

But machines are a special dual use case for this flag. Because if you
look at its deconstruct proc the flag also prevents the machine from
spawning a frame.

b5593bc693/code/game/machinery/_machinery.dm (L820-L822)

How can 1 flag serve 2 purposes within the same type?

**4. Simply forget to check for this flag altogether**
Yup if you find this flag not doing its job for some objects don't be
surprised. People & sometimes even maintainers just forget that it even
exists

b5593bc693/code/game/objects/items/piggy_bank.dm (L66-L67)

**Solution**
These are the main examples i found. As you can see the same flag can
perform 2 different functions within the same type and do something else
in a different object & in some instances don't even work cause people
just forget, etc.

In order to bring consistency to this flag we need to move it to the
atom level where it means the same thing everywhere. Where in the atom
you may ask? .Well, I'll just post what MrMelbert said in
https://github.com/tgstation/tgstation/pull/81656#discussion_r1503086862

> ...Ideally the .deconstruct call would handle NO_DECONSTRUCTION
handling as it wants,

Yup that's the ideal case now. This flag is checked directly in
`deconstruct()`. Now like i said we want to give a universal definition
to this flag and as you have seen from my examples it is used in 3 cases
1) Make an object disappear(doesn't dropping anything) when
deconstructed
2) Stop it from being wrenched
3) Stop it from being deconstructed via tools

We can't enforce points 2 & 3 inside `deconstruct()` which leaves us
with only case 1) i.e. make the object disappear. And that's what i have
done. Therefore after more than a decade or since this flag got
introduced `NO_DECONSTRUCT` now has a new definition as of 2024

_"Make an object disappear(don't dropping anything) when deconstructed
either via tools or forcefully smashed apart"_

Now i very well understand this will open up bugs in places where cases
2 & 3 are required but its worth it. In fact they could even be qol
changes for all we know so who knows it might even benefit us but for
now we need to give a universal definition to this flag to bring some
consistency & that's what this PR does.

**Problem with deconstruct()**
This proc actually sends out a signal which is currently used by the
material container but could be used by other objects later on.

3e84c3e6da/code/game/objects/obj_defense.dm (L160)

So objects that override this proc should call its parent. Sadly that
isn't the case in many instances like such

3e84c3e6da/code/game/machinery/deployable.dm (L20-L23)

Instead of `return ..()` which would delete the object & send the signal
it deletes the object directly thus the signal never gets sent.

**Solution**
Make this proc non overridable. For objects to add their own custom
deconstruction behaviour a new proc has been introduced
`atom_deconstruct()` Subtypes should now override this proc to handle
object deconstruction.

If objects have certain important stuff inside them (like mobs in
machines for example) they want to drop by handling `NO_DECONSTRUCT`
flag in a more carefully customized way they can do this by overriding
`handle_deconstruct()` which by default delegates to
`atom_deconstruct()` if the `NO_DECONSTRUCT` flag is absent. This proc
will allow you to handle the flag in a more customized way if you ever
need to.

## Why It's Good For The Game
1) I'm goanna post the full comment from MrMelbert
https://github.com/tgstation/tgstation/pull/81656#discussion_r1503086862

> ...Ideally the .deconstruct call would handle NO_DECONSTRUCTION
handling as it wants, but there's a shocking lack of consistency around
NO_DECONSTRUCTION, where some objects treat it as "allow deconstruction,
but make it drop no parts" and others simply "disallow deconstruction at
all"

This PR now makes `NO_DECONSTRUCTION` handled by `deconstruct()` & gives
this flag the consistency it deserves. Not to mention as shown in case 4
there are objects that simply forgot to check for this flag. Now it
applies for those missing instances as well.

2) No more copying pasting the most overused code pattern in this code
base history `if(obj_flags & NO_DECONSTRUCTION)`. Just makes code
cleaner everywhere

3) All objects now send the `COMSIG_OBJ_DECONSTRUCT` signal on object
deconstruction which is now available for use should you need it

## Changelog
🆑
refactor: refactors how objects are deconstructed in relation to the
`NO_DECONSTRUCTION` flag. Certain objects & machinery may display
different tool interactions & behaviours when destroyed/deconstructed.
Report these changes if you feel like they are bugs
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2024-04-04 18:55:51 -06:00
Iamgoofball
e42e8b7f78 Makes the Captain's Spare safe actually secure from being smashed open now that it's been removed from a wall. (#82076)
## About The Pull Request
Makes the Captain's Spare safe actually secure from being smashed open
now that it's been removed from a wall. Damage Deflection of 30 has been
added to it.

## Why It's Good For The Game

Because the Captain's Safe was moved off of the wall it's now vulnerable
to direct attack and projectiles way, way more than before and now
there's a lot of avenues to inflict AP damage, which is directly
subtracted from the armor value before application of damage. I've added
a damage deflection of 30 to make it

## Changelog

🆑
balance: Makes the Captain's Spare safe actually secure from being
smashed open now that it's been removed from a wall. Damage Deflection
of 30 has been added to it.
/🆑
2024-04-02 13:15:46 +13:00
_0Steven
bf58beeb41 [NO GBP] Fix letting you actually beat up racks with objects. (oops) (#82277)
## About The Pull Request

I misjudged `item_interaction` as being a non-combat mode only proc.

593f1eaee3/code/game/atom/atom_tool_acts.dm (L2-L12)
Which today I realized, well, it clearly isn't. With my changes, racks
don't let you beat them with an object even though you're in combat
mode.

Anyhow, this pr just makes it so it doesn't continue to the item placing
part when in combat mode.
## Why It's Good For The Game

Fixes an issue I caused, not letting you attack racks with objects.
## Changelog
🆑
fix: You can actually hit racks with objects when in combat mode again.
Importantly, painting them with spraycans like that works again.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-03-29 12:13:47 +00:00
John Willard
0417e090cc Removes camera assembly structures (#81656)
## About The Pull Request

Removes the camera assembly structure middleman between the camera
wallframe and camera machine. All its behavior has been instead moved to
the camera, and I've tried to keep as much of the behavior the same as
before.
This also fixes the issue that camera assemblies had where, upon the
construction being finished, it would move itself into the newly
finished camera machine, therefore taking itself off a wall, therefore
deconstructing itself. This resulted in 2 piece of iron being in each
camera machine (except roundstart ones), and because camera machines
rely on the assembly inside of them for upgrades and such, upgrading
didn't work at all.

I've also made camera nets use defines (not in map) so it's easier to
find a list of them all, and tried to add autodoc comments to nearly
every var in camera code.

## Why It's Good For The Game

Removes copy paste and spaghetti code between structure and machine
camera, thus making it easier to work around with.
Closes https://github.com/tgstation/tgstation/issues/79019

## Changelog

🆑
fix: Cameras built in-round can be upgraded again.
fix: Deconstructing cameras now more consistently return to you the
upgrades inside of the camera.
fix: RD's telescreen can now properly see Ordnance cameras again.
fix: [Deltastation] Library art gallery no longer has an invisible
camera.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2024-03-27 15:35:07 +01:00
_0Steven
43380e06bf Rack sounds pr turned rack code refactor (#81973)
## About The Pull Request

### Alternate title: "Label Hoarding PR"

You ever just want to add sounds to a thing and then end up just
refactoring half of the damn thing?
Yeah.
Anyhow.


So in rough chronological order!

### Putting items in racks actually plays the sounds
Picking things up from racks plays their pickup sound, but putting them
on them doesn't. Just dropping it or putting it on tables does make the
right sounds. This seems to be because of a `silent` parameter in
`transferItemToLoc` that's set by tables but not racks.
```dm
(/code/game/objects/structures/tables_racks.dm, line 273)
if(user.transferItemToLoc(I, drop_location(), silent = FALSE))

(/code/game/objects/structures/tables_racks.dm, line 867)
if(user.transferItemToLoc(W, drop_location()))
```
Adding this makes it work just fine.
```dm
(/code/game/objects/structures/tables_racks.dm, line 867)
if(user.transferItemToLoc(W, drop_location(), silent = FALSE))
```
### Attackby single letter parameters, 1 instead of TRUE

Then, I noticed `attackby` just returns `1` to mean true after calling
`transferItemToLoc`, when we just have the more readable `TRUE`.
Similarly it uses a single letter parameter `W`, which on its own is
already unreadable, but is also mismatched with the parent proc using
`attacking_item`.
```dm
(/code/game/objects/structures/tables_racks.dm, line 859-868)
/obj/structure/rack/attackby(obj/item/W, mob/living/user, params)
	var/list/modifiers = params2list(params)
	if (W.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION) && LAZYACCESS(modifiers, RIGHT_CLICK))
		W.play_tool_sound(src)
		deconstruct(TRUE)
		return
	if(user.combat_mode)
		return ..()
	if(user.transferItemToLoc(W, drop_location()))
		return 1

(/code/_onclick/item_attack.dm, line 133-136)
/atom/proc/attackby(obj/item/attacking_item, mob/user, params)
	if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, params) & COMPONENT_NO_AFTERATTACK)
		return TRUE
	return FALSE
```
So we change it `1` to `TRUE` and `W` to `attacking_item` to make it
more readable!

### Don't let them try to put Abstract items

While looking over the table code, though, I also noticed it has a check
for the `ABSTRACT` item flag when placing items. Having tested this, we
add this too for consistency and to avoid awkward situations down the
line.
```dm
(/code/game/objects/structures/tables_racks.dm, line 272-273)
if(!user.combat_mode && !(I.item_flags & ABSTRACT))
	if(user.transferItemToLoc(I, drop_location(), silent = FALSE))

(/code/game/objects/structures/tables_racks.dm, line 859-868)
/obj/structure/rack/attackby(obj/item/attacking_item mob/living/user, params)
	var/list/modifiers = params2list(params)
	if (attacking_item.tool_behaviour == TOOL_WRENCH && !(obj_flags & NO_DECONSTRUCTION) && LAZYACCESS(modifiers, RIGHT_CLICK))
		attacking_item.play_tool_sound(src)
		deconstruct(TRUE)
		return
	if(user.combat_mode || attacking_item.item_flags & ABSTRACT)
		return ..()
	if(user.transferItemToLoc(W, drop_location()))
		return TRUE
```

### Split off rack structure attackby wrenching into wrench_act procs

But that's still kind of bad! But wait, we have procs for wrenching
actions, so it should really be in there.
So we move this to its own proc.
```dm
(/code/game/objects/structures/tables_racks.dm, line 850-855)
/obj/structure/rack/wrench_act_secondary(mob/living/user, obj/item/tool)
	if(obj_flags & NO_DECONSTRUCTION)
		return FALSE
	tool.play_tool_sound(src)
	deconstruct(TRUE)
	return ITEM_INTERACT_SUCCESS

(/code/game/objects/structures/tables_racks.dm, line 857-861)
/obj/structure/rack/attackby(obj/item/attacking_item mob/living/user, params)
	if(user.combat_mode || attacking_item.item_flags & ABSTRACT)
		return ..()
	if(user.transferItemToLoc(W, drop_location()))
		return TRUE
```

### Split off rack item attackby wrenching into wrench_act procs,
include sounds

But the _item_ can also be deconstructed, and sure enough, it does the
same thing.
```dm
(/code/game/objects/structures/tables_racks.dm, line 920-925)
/obj/item/rack_parts/attackby(obj/item/W, mob/user, params)
	if (W.tool_behaviour == TOOL_WRENCH)
		new /obj/item/stack/sheet/iron(user.loc)
		qdel(src)
	else
		. = ..()
```
So we give this the same treatment, and include a `deconstruct` method
rather than just having it be separate. We also play the tool sound for
consistency with deconstructing the rack structure.
```dm
(/code/game/objects/structures/tables_racks.dm, line 948-953)
/obj/item/rack_parts/wrench_act(mob/living/user, obj/item/tool)
	if(obj_flags & NO_DECONSTRUCTION)
		return FALSE
	tool.play_tool_sound(src)
	deconstruct(TRUE)
	return ITEM_INTERACT_SUCCESS

(/code/game/objects/structures/tables_racks.dm, line 955-958)
/obj/item/rack_parts/deconstruct(disassembled = TRUE)
	if(!(obj_flags & NO_DECONSTRUCTION))
		new /obj/item/stack/sheet/iron(drop_location())
	return ..()
```
Note: this makes it so it only deconstructs rack items on left click. I
think that's perfectly fine.

### Ancient code removal

Now we get to the fun part! Ancient code.
When removing the single letter parameters from `attackby` previously, I
thought I might as well remove other such instances while we're at it.
This gets us to `MouseDrop_T`.

```dm
(/code/game/objects/structures/tables_racks.dm, line 850-857)
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
	. = ..()
	if ((!( isitem(O) ) || user.get_active_held_item() != O))
		return
	if(!user.dropItemToGround(O))
		return
	if(O.loc != src.loc)
		step(O, get_dir(O, src))
```
What the fuck?
Right so, this lets us click-drag-drop an item onto the rack, but only
for our active item. And it just drops it and steps it in the right
direction.
So we just, we just kill it. We just kill it.
You can just click on the rack to do functionally the exact same thing,
so we just kill it.
It's blocking us from dumping storage item contents, so just.
We Just Kill It.
We Just Fucking Kill It.

### Combat mode kicking

Anyhow! With that out of the way, we move to the finishing touches:
usage context and kicking!
While writing up context I was reminded that currently clicking on a
rack with an empty hand would just, kick it, regardless of combat mode.
```dm
(/code/game/objects/structures/tables_racks.dm, line 873-882)
/obj/structure/rack/attack_hand(mob/living/user, list/modifiers)
	. = ..()
	if(.)
		return
	if(user.body_position == LYING_DOWN || user.usable_legs < 2)
		return
	user.changeNext_move(CLICK_CD_MELEE)
	user.do_attack_animation(src, ATTACK_EFFECT_KICK)
	user.visible_message(span_danger("[user] kicks [src]."), null, null, COMBAT_MESSAGE_RANGE)
	take_damage(rand(4,8), BRUTE, MELEE, 1)
```
This is awkward, misclick a few times and you've kicked it back into
item form.
So we make it only kick it while in combat mode to avoid this.
```dm
(/code/game/objects/structures/tables_racks.dm, line 880-889)
/obj/structure/rack/attack_hand(mob/living/user, list/modifiers)
	(...)
	if(!user.combat_mode || user.body_position == LYING_DOWN || user.usable_legs < 2)
		return
	(...)
```

### Usage context

Then finally! Usage context!
This part's easy, just copying over the logic from tables and making it
show deconstruct context for the rack structure and item and
construction context for the item.

```dm
(/code/game/objects/structures/tables_racks.dm, line 840-851)
/obj/structure/rack/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
	. = ..()

	if(isnull(held_item))
		return NONE

	if(!(obj_flags & NO_DECONSTRUCTION))
		if(held_item.tool_behaviour == TOOL_WRENCH)
			context[SCREENTIP_CONTEXT_RMB] = "Deconstruct"
			. = CONTEXTUAL_SCREENTIP_SET

	return . || NONE

(/code/game/objects/structures/tables_racks.dm, line 931-946)
/obj/item/rack_parts/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
	. = ..()

	if(isnull(held_item))
		return NONE

	if(held_item == src)
		context[SCREENTIP_CONTEXT_LMB] = "Construct Rack"
		. = CONTEXTUAL_SCREENTIP_SET

	if(!(obj_flags & NO_DECONSTRUCTION))
		if(held_item.tool_behaviour == TOOL_WRENCH)
			context[SCREENTIP_CONTEXT_LMB] = "Deconstruct"
			. = CONTEXTUAL_SCREENTIP_SET

	return . || NONE
```
And then don't forget to register said context.
```dm
(/code/game/objects/structures/tables_racks.dm, line 834-838)
/obj/structure/rack/Initialize(mapload)
	. = ..()
	AddElement(/datum/element/climbable)
	AddElement(/datum/element/elevation, pixel_shift = 12)
	register_context()

(/code/game/objects/structures/tables_racks.dm, line 927-929)
/obj/item/rack_parts/Initialize(mapload)
	. = ..()
	register_context()
```

And that's all!

Now please remind me not to be _this_ comprehensive again.
Not for something that's less than thirty lines, at least.
Thanks.
## Why It's Good For The Game

Doing this in chronological order.
First off, it's wonky that putting say a toolbox on a table or the
ground makes sound but putting it in a rack is perfectly silent,
especially when taking it from the rack isn't. This makes it consistent
with tables.

Returning TRUE is more readable than returning 1. Single letter
parameters are awful for readability, _especially_ when inconsistent
with the parent parameters. This resolves those.

It shouldn't let you attempt to place items tagged with `ABSTRACT`, as
you shouldn't be able to place those. This makes it consistent with
tables.

We have procs for wrench actions, better to use those than implementing
your own wrench checks in `attackby`. This makes it do so.

It's just nice to have a deconstruction sound, so this makes
deconstructing the item also play the sound of the used tool.

The ancient rack code we're removing is entirely just a more awkward way
of doing what we can already do without it, it only let you drag your
active item onto them, _but you can just click_. It was awkwardly
implemented, and blocked anything from doing its own click-drag onto
surface thing like say storage dumping contents.

Usage context is just nice to have. This adds context for deconstructing
to the rack structure and for deconstructing and constructing to the
rack item.
## Changelog
🆑
refactor: Touched most of the code for racks. It should function almost
entirely the same save for what's noted here, please report any issues.
code: Wrenching moved to wrenching procs. Side-effect, rack items are
only deconstructed on left-click
sound: Items that have sounds make them when placed on racks, much like
when placed on tables.
sound: Rack items now make a sound upon deconstructing them.
fix: Racks no longer let you attempt to place abstract items like the
slap hand or water tank spray nozzles on them.
qol: Clicking on a rack no longer kicks the shit out of it if you don't
actually have combat mode on.
qol: Racks and rack items have hover tooltip usage context.
del: Killed ancient rack code for dragging your active item onto a rack.
Just click it does the same thing. This allows you to actually dump
items onto racks, though currently disorderly.
/🆑
2024-03-25 03:24:44 +01:00
FinancialGoose
4c402bc5ee Gold and Silver crate now reflects NT corporate greed (#82170)
## About The Pull Request
The gold and silver crates desc now accurately reflects NT corporate
greed

## Why It's Good For The Game
More lore correct crate

## Changelog

🆑
qol: Gold and silver crates now accurately reflects NT's greed
/🆑
2024-03-24 13:29:02 -06:00
Sable
b3ae8f82f1 Deconstruct Wooden/Cardboard Crates Without Welder (#82108)
## About The Pull Request

Wooden crates are now deconstructed with a crowbar. Cardboard crates are
now deconstructed with wirecutters. The context tips for deconstruction
are determined by the required tool now.
## Why It's Good For The Game

It doesn't make sense to deconstruct those crate types with a welder,
they would just burn. The logic for different cutting tool types was
already in there, and mentioned in a comment, but the variable was not
assigned to the sub types; I also changed the context tip to use that
instead of checking the held item for welder behavior.
## Changelog
🆑
add: Crowbars/wirecutters now deconstruct wooden/cardboard crates/boxes
/🆑
2024-03-23 17:26:02 +01:00
Bilbo367
466b3df048 Refactor removing unused defines. (#82115)
## About The Pull Request

Refactors a lot of the unused defines.

## Why It's Good For The Game

Refactors a lot of the unused defines.

## Changelog
Nothing player facing

---------

Co-authored-by: san7890 <the@san7890.com>
2024-03-22 21:29:35 -06:00
John Willard
4b52367bd4 Adds a shower drain fluff item (#82071)
## About The Pull Request

Turns the varedited fluff item into its own item so it no longer has a
varedited icon & icon state.

## Why It's Good For The Game

We're varediting this fluff item 17 times on current tg master and it's
pretty bad. Varediting icon/icon state in maps should be discouraged and
hopefully banned later, it's not hard to make a subtype of an item so we
should be able to expect mappers to do that rather than this.

## Changelog

Nothing player-facing.
2024-03-18 19:22:35 -06:00
RikuTheKiller
ad6c2237c6 Removes remove_any from the game (#82020)
## About The Pull Request

Okay, so, turns out smoke machines, cigarettes, vapes and all sorts of
things intentionally unmix your mixes.
Why? For chaotic effects. Well sadly it just deletes chems from mixes
and makes them completely useless.
It also tends to have very little effect on deathmixes and moreso just
gimps you ability to use them for healing.
This is pretty bad, especially for machines like the smoke machine that
are specifically intended for chemists.

This PR entirely removes all uses of remove_any as well as the proc
itself from the game. It's just bad.
## Why It's Good For The Game

As it turns out, the game intentionally gimping your chem mixes just to
fuck with you is bad.
Especially when it's both obscure and not really all that fun for
gameplay.
## Changelog
🆑
balance: Smoke Machines, Showers, Vapes, etc will no longer arbitrarily
delete a random amount of the chems they are processing
/🆑
2024-03-17 15:52:41 -04:00
John Willard
6ab6e1c275 Brings the captain's safe off the wall, safes now save their contents (#81762)
## About The Pull Request

I originally was gonna make the captain's spare ID safe float in the air
if the wall under it was taken down, but it looked poor and was going
against the vision for wall items (and go against the wallening) so my
alternative proposition is this, taking the safe off the wall.
It's now a golden safe (like the one in the vault) but is interacted the
exact same, it's now just a thing on the floor rather than being on a
wall.
I'm not a spriter so I didn't give it a custom icon but if anyone wants
to they can feel free to add one, just a golden version of the regular
safe felt kinda eh.

I also added a wallframe version of the secure safe for when it is taken
down. It will conserve its contents and be permanently locked until put
back up. This doesn't apply to the new captain safe since it isn't a
wall item.

## Why It's Good For The Game

Closes https://github.com/tgstation/tgstation/issues/80588
Prevents people from cheesing the spare and/or it being too easy to
destroy.

## Changelog

🆑
fix: The captain's safe is no longer on the wall, therefore cannot be
cheesed by breaking the wall it sits on.
fix: Tearing down a wall that a safe is on now drops the safe with its
contents, rather than dropping the contents onto the floor. The safe's
contents cannot be interacted with while it's not on a wall.
/🆑
2024-03-16 16:07:36 -06:00
Jacquerel
7c6b53e30f Training in heavy gravity gives you more experience points (#81990)
## About The Pull Request

If you use exercise equipment in an area with unusually high gravity,
you will get tired faster but will also earn a greater amount of fitness
experience points.
As far as I am aware the only particularly reliable way for regular crew
to gain access to high gravity is the bone-crushing strength (and
radiation?) of the gravity generator, but you could also use
gravitational anomalies or gravitational holoparasites for this if they
are available.

Conversely, if you lift weights when there's no gravity it won't cost
you any stamina at all!

## Why It's Good For The Game

I'll be honest this is a largely pointless and trivial change which
interacts with a similarly useless system, but I thought it would be a
cute interaction.
Training by wearing heavily weighted clothing or in an area where
gravity is increased are _somewhat_ common tropes in fiction (I have no
idea if people do this in real life) and I think our players would
appreciate the incredibly niche circumstances where they can benefit
from this.

I also think if even one round features someone building a gym in the
gravity generator room and encouraging people to get buff while it
crushes them into paste then this was a good addition.

## Changelog

🆑
balance: If you work out under heavier-than-earth gravity, you will get
gains faster.
/🆑
2024-03-16 21:23:13 +01:00
Ghom
ca537ce829 Ice cream now gives a chilling food effect (plus small food haste buff) (#81719)
## About The Pull Request
We have a `crafted_food_buff` in the code meant for specific food buffs
(and perhaps one day, debuffs) that has gone unused ever since it was
created during the 'Foodening' PR.

Anyway, yeah, this PR takes the fire step to implement it with ice cream
and other frozen treats.

Frozen treats (all food found in the `food/frozen.dm` file) have it by
default. Other ice cream holders such as waffles cones (and now regular
waffles too!) can aquire it when filled with ice cream. Using the ice
cream vat also adds the 'Chef Made' trait now, which is required for
food effects to happen.

Also very slight food effect refactor. There's no need to have five
different alert screen objects when only have to switch icon states.

This PR also adds an action speed modifier to the generic 'haste' food
effect. I'm confident the original creator would have done that too, but
action speed modifiers aren't as well-known.

## Why It's Good For The Game
People tend to make one feature, call it a day and then move on to the
next. Food effects are nice, however they're barely implemented, and I
don't like food being all the same-ish in the end.

## Changelog

🆑
add: Ice cream and frozen treats now have a chilling effect.
add: You can add a scoop of ice cream on waffles.
balance: added an action speed modifier to the generic food haste effect
(you do things, and not just run, an itsy bitsy faster)
/🆑
2024-03-16 12:02:06 +00:00
ArcaneMusic
9802508ab9 Adds logging to SSore_generation on subsystem initialize (#81488)
This PR adds a new logging category and a logging message specific to
SSore_generation's initialize, logging the number of vents of each size,
as well as the number of random and proximity based ore spawns due to
cave generation and map generation.

Currently drafted as I could use some feedback as to why I'm not seeing
the logger.log() messages not appearing on any of the current in-game
log files 👍

Useful for data logging to determine how many of each type of ore is
spawned on the map, for the purposes of determining how much ore is
being spawned manually over the automatic amounts based on the vents,
with the quantity of ores spawning being a product of the ore vent sizes
being logged as well.
2024-03-14 21:25:50 +00:00
Ghom
610cf3681a Adds a persistent piggy bank to the vault. (#81900)
## About The Pull Request
This PR adds a **persistent** piggy bank to the station vault that,
while it can hold up to 3300 credits carried between shifts. However,
you can only insert up to 1600 (on top of the 50 creds it
auto-generates) each shift, so it does take a small, itsy bitsy of
patience to fill it to the brim.

## Why It's Good For The Game
I put some effort coding persistent piggy banks when making the
cafeteria PR for the museum away mission a while ago (which apparently
isn't enabled yet because the key holders forgot to ig). It'd be a shame
of all the existing code were only used for a single persistent piggy
bank.
2024-03-14 12:47:30 -05:00
ArcaneMusic
b8667c320f Ore vent fixes to spawning multiple megafauna. (#81935)
## About The Pull Request

Ore vents can now no longer be scanned multiple times to spawn multiple
nodes, nor can they be used to duplicate lavaland bosses.

Vents now call for a `can_interact` check, as well as against the
cooldown timer, which has been moved a bit in the order of operations in
order to check things correctly when there's possibly multiple prompts
open for starting the defense waves.

Additionally, boss waves actually do what they're supposed to do, and
don't spawn in a node drone on boss summoning, but instead summon the
drone afterwards, which sets up the vent, then takes off visually. This
is reflected in the tgui alert before starting waves.

## Why It's Good For The Game

Fixes #81817. Improves visual clarity when doing boss vents so that
players don't get the wrong idea that they need to protect the drone as
well when fighting bosses.

## Changelog

🆑
fix: Ore vents have to be scanned while standing next to them.
fix: Menacing ore vents now correctly only spawn in a node drone after
the boss is defeated, instead of before.
/🆑
2024-03-13 11:16:32 +01:00
John Willard
9ac81e1a64 New station trait job: Human AI (#81681)
## About The Pull Request

This PR does many things, I'll try to explain the basic/background stuff
to the main thing first:

1. Adds a new remote that allows a human to function like an AI. It
controls a fly that will fly around the station slowly, and when it
reaches a machine then the person can interact with it as if they were
an AI. This required changing a lot of silicon/AI checks with one that
also checks for this remote, and some messing with shared ui state.
2. Moves req_access from the obj and bot to ``/atom/movable`` which lets
it be shared between the two, no more copy-paste and one side lacking
features/checks/signals the other has.
3. Adds a check for AI config for AI-related station traits, which was
lacking prior

Now for the good part...
Adds a new station trait that replaces the AI with a Human.
This person is equipped with an AI headset (including Binary), an
advanced camera console, an omni door wand, the machine controller, and
their laws.
They are immune to the SAT's turrets (even if set to target borgs) and
are slow outside of the SAT, mimicing the actions of the AI.

They interact with the world through their advanced camera console,
which allows them to do most AI stuff needed, and the holopad they can
connect to without having to ring first (like Command can).

They are given a paper with the laws they must follow, but since they
are human they are able to bend it. Cyborgs that run the default lawset
are "slaved" to them via an unremovable law 0, so the Human AI can bend
the laws if they really need to (for their own survival n such), and
make the cyborgs obey their commands above laws, but in general this
shouldn't be a frequent occurrence. This does take into account the
unique AI trait, so it's not guaranteed Asimov.

When this station trait rolls, all Intellicards, AI uploads, and AI core
boards are destroyed and are unresearchable. They can be spawned by
admins in-game if necessary. Maybe in the future we can also exclude
Oldstation from this but I haven't really decided.

Extra perks:

Human AI spawns with a Robotic voicebox (unless they are a body purist)
and teleport blocking implant, so they can't use teleporters to bypass
their on-station slowdown.
They also have an infinite laser pointer that can be used to blind
through their camera console. This is unfortunately nerfed from the
recent borg balance PR that removed its stun. This was meant to be the
alternative to no longer being able to permanently lock borgs down like
AIs can (or more than one, for that matter).
They aren't affected by Roburgers, Acid, and Fuel's toxicity.
Bots salute them like they do Beepsky (which is now a trait)
They spawn with SyndEye to replace the AI's tracking ability
They do not have a bank account

### The machine remote

The machine remote has a little fly in it that flies to the machines it
is pointed to, working as the arms and legs of the Human AI. It scans
the machine and punches in the action the AI does, and is how the AI
accesses basically anything. This fly slowly moves from one machine to
the next, and can be recalled with Alt Click.
It works on machines and bots.

### Video (Low quality to fit Github)


https://github.com/tgstation/tgstation/assets/53777086/e16509f8-8bed-42b5-9fbf-7e37165a11e8

## Why It's Good For The Game

I've seen a funny screenshot one day of a person replacing the AI by
using a bunch of door remotes, camera console, crew monitoring console,
and a few other things. I've been thinking about that for a few years
and really wanted to make it official if not easier to make possible,
because it is an incredibly funny interaction.
This makes it a reality, and while they aren't as powerful as regular
AIs, I think it makes for better and funnier in-game moments. With the
same weight as Cargorilla (1), I hope this wouldn't be rolling too often
and ruin rounds, but instead show off the different capabilities that
Humans and AIs can do, to do the job of an AI. You win some you lose
some.

## Changelog

🆑 JohnFulpWillard, Tattax
add: Adds a new station trait job: The Human AI.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-03-09 23:48:39 +01:00
Zergspower
64c6ff1aa3 Curtains behave like curtains should, by not being a wall (#81843)
## About The Pull Request
This has bothered more for far too long that curtains suddenly become
solid objects instead of, well, behaving like curtains in any form do
and just bend out of your way. They function the same from an opacity
POV but i just removed the density toggle so they'll always allow
passthrough.


![image](https://github.com/tgstation/tgstation/assets/22140677/9311242f-fb5d-4640-b7f3-82ad243133f2)

![image](https://github.com/tgstation/tgstation/assets/22140677/fd3d5a5d-8458-4595-9e2e-2b83426d8e61)


## Why It's Good For The Game

You can have your privacy and have realistic curtains

## Changelog
:cl:Zergspower
qol: Curtains and shower curtains are no longer solid objects that defy
common sense
/🆑
2024-03-09 04:36:21 +01:00
Ben10Omintrix
6b6bd5ce95 fix ore vents spawning the wrong wolves and remove simple wolves (#81864)
## About The Pull Request
wolves got refactored but the ore vents were still spawning the old
versions, this fixes it and removes the old wolves from the code

## Why It's Good For The Game
fixes ore vents spawning old wolves

## Changelog
🆑
fix: fixes ore vent spawned wolves being untammable
/🆑
2024-03-07 11:10:07 -07:00
Ghom
88bdabe53b Adds a small cafeteria behind the right wing shutters of the museum. (#81465)
## About The Pull Request
I was thinking to contribute something to the new away mission map to
make it better. Mapping and all takes too much time for me, so I could
do little. Though it comes with its own unique gimmicks.

To reach the cafeteria, one has to complete a couple puzzles.
The first set is opened by inputing the correct PIN on the password
panel beside it. There're several clues to help you guess this fairly
easy puzzle, in the form of several number graffitis, a scrapped piece
of paper full of numbers, and a board filled with colored dots also
found just beside the panel.
The second one is opened by a keycard, and is generally lazier. To find
it, you'll need to do a bit of (toilet) searching.

As for the unique things this PR adds:
- A fire extinguisher... that actually contains welding fuel
- A (dirt-cheap) hotdog vending machine*
- A completely ornamental maneki-neko (that's the name of the
luck-bringing, paw-waving cat figurine)
- A piggy bank that carries money between rounds. It has a cap of 10k
credits worth of holochips, cash and coins, which is pretty high, but
I'm confident people will just destroy it for its contents the moment
they find it. His name is Pigston Swinelord VI.
- More, totally legit and not actually fake bombable walls :^)

*By the by, you can also find it during the national hotdog day.

Screenshots of the new location:
![museum
cafe](https://github.com/tgstation/tgstation/assets/42542238/1c0d93b7-90d5-4459-a48d-81430f0d3613)
![museum
restrooms](https://github.com/tgstation/tgstation/assets/42542238/5a9e049d-6acc-464b-998d-901e43154bae)


## Why It's Good For The Game
You know how most away missions are not that special at all? Yeah,
@mc-oofert set an example of a pretty decent one actually, if not a tad
small. I thought it could use a touch of another mind actually
contributing to it too, because it deserves it.

Also, this sets the basis for other persistent piggy banks. I don't
think they should all have that 10k cap like this one, perhaps 1k is
enough. Beside, the code that mothblocks did for json database datum is
pretty good, so there is not a whole lot of shitcode here.

## Changelog

🆑
add: Added a cafeteria to the museum away mission, with a few special
things to it. To reach it, you'll have to complete a couple puzzles
however.
map: The museum away mission now has a couple restrooms.
add: Hotdog vending machines may spawn during the National Hot Dog Day.
/🆑
2024-03-05 18:19:39 -07:00
Lufferly
8f082eb3e9 Lockers and crates shake when someone is trying to break out of them (#81801)
## About The Pull Request

Makes lockers and crates do a little shake when someone is trying to
resist out of them.


https://github.com/tgstation/tgstation/assets/40921881/94703c79-a22c-43e6-ac31-8621173a0953


## Why It's Good For The Game

A little bit of visual flair, lets players know if someone is trying to
get out of a locker.

## Changelog

🆑 Seven
add: Lockers and crates now shake when someone is attempting to resist
out of them.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2024-03-05 16:39:24 -07:00
lessthanthree
9ec0cfc36a Tram icon cleanup (#81797)
## About The Pull Request

- Deletes an unused tram_wall.dmi
- Renames tram frame to tram girder
- Tram girder looks like girder, not lattice


![image](https://github.com/tgstation/tgstation/assets/83487515/328c2455-def0-41a1-be9a-87a3ec0dcee7)

## Why It's Good For The Game

More straightforward for players. Since it acts like a girder, it should
look like a girder not a lattice.

## Changelog

🆑 LT3
image: Tram frame is now tram girder, because it acts like one
/🆑
2024-03-03 19:04:50 -05:00
LemonInTheDark
1f249fbf0f Autotucking On Map Load (#81782)
## About The Pull Request

Doesn't really do much currently but without it wallening beds look
fuckin DUMB
Plus I think this better matches what is intended

## Why It's Good For The Game


![image](https://github.com/tgstation/tgstation/assets/58055496/d5e4c372-3e84-435a-88b9-b5be442049b2)

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: san7890 <the@san7890.com>
2024-03-03 19:55:23 +00:00
MrMelbert
977799a2e7 A red spy has entered the base: Adds Spies, a roundstart antagonist inspired by Goonstation's Spy-Thief (#81231)
# Disclaimer: No Goon code was referenced or used in the making of this
PR

## About The Pull Request

[Design Document (Read this for more
information)](https://hackmd.io/@L9JPMsZhRO2wI25rNI6GYg/rkYKM9Yc6)

This PR adds Spies as a new roundstart antagonist type, inspired by
Spy-Thiefs from Goonstation.

Spies are tasked with stealing various objects around the station, from
insulated gloves to the black box, from the clown's left leg to the
bridge's communications console.

For every item stolen, the Spy is rewarded with a random item from the
Syndicate Uplink, plus some items uniquely available to the Spy. Stolen
items are then shipped off and sold on the Black Market Uplink, allowing
the crew - or maybe some other evil-doers - to get their hands on them.


![image](https://github.com/tgstation/tgstation/assets/51863163/f057d480-4545-44da-b8fe-a8d09a5d2dcf)

More ideas for theft items and bounties are welcome. 

## Why It's Good For The Game

See the design document for more information. 

In short: Adds a solo antagonist which has less impact than your
Traitors and Heretics, but more impact than Paradox Clones and Thieves.
In other words: On the same tier as old traitors.

Seeks to embrace the sandbox aspect of antagonists more by having no
precise greentext objective, and instead some suggestions for chaos you
can embark in. Have fun with it!

## Changelog

🆑 Melbert
add: Spies may now roam the halls of Space Station 13. Watch your
belongings closely.
/🆑
2024-03-01 04:41:57 +00:00
Pickle-Coding
7222d86f3d Logs holosign swatting. (#81733)
Logs holosign swatting.
## About The Pull Request
Logs holosign swatting.
## Why It's Good For The Game
Closes #81729 
## Changelog
🆑
admin: Logs holosign swatting.
/🆑
2024-02-29 04:42:53 +01:00
13spacemen
8477939176 fixes inability to create material airlocks (#81711)
## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/81710

runtime due to parent proc not returning the airlock
also added an update_appearance()
## Changelog
🆑
fix: You can build material airlocks again
/🆑
2024-02-28 20:33:03 +01:00
jimmyl
2eca334bb2 Grilles dont break by just walking into them under any circumstances (#81594)
## About The Pull Request

you can no longer just walk into a grille to destroy it rather fast
also single letter variable cleanup from that proc

## Why It's Good For The Game

this is a bug and bugs are bad

## Changelog
🆑
fix: Grilles dont break by just walking into them under any
circumstances
/🆑
2024-02-28 07:38:03 +00:00