Commit Graph

8987 Commits

Author SHA1 Message Date
_0Steven
f20211f8a3 Remove unneeded 'a' from swabbing message. (#81118)
## About The Pull Request

When using the biopsy tool on something that doesn't have a swabbing
result it would say:
> "You do not manage to find a anything on [target]!".

The "find a anything on [target]" is incorrect and reads off, so this pr
just changes the respective statement in
`code/datums/components/swabbing.dm` to remove that a, becoming:
> "You do not manage to find anything on [target]!".
## Why It's Good For The Game

Minor grammar fix.
## Changelog
🆑
spellcheck: You no longer fail to find "a anything" when swabbing
something for cytology that doesn't have swabbing results.
/🆑
2024-01-27 16:28:11 -07:00
Ghom
184b8a0bfa Adds an icon to the "My Watchlist Status is Not Important" achievement. (#81112)
## About The Pull Request
Title. The icon state is called "live_sec_reaction". Four to go.

## Why It's Good For The Game

![cheevos](https://github.com/tgstation/tgstation/assets/42542238/f1f91107-49c0-4ae3-8dd6-328a059d8ffe)

Mainly inspired by The Rock's eyebrow meme.

## Changelog

🆑
image: Added an icon to the "My Watchlist Status is Not Important"
achievement.
/🆑
2024-01-27 17:39:32 +00:00
Whoneedspacee
124781b6d9 Legion Mob Abilities (#81082)
## About The Pull Request

Converts legions hardcoded abilities to the cooldown action / mob
abilities system.

I also took the liberty of converting the hacky 360 second cooldowns in
a lot of the mob actions into simply disabling other abilities while the
ability is active, this will make it easier to have bosses without
everything on a shared cooldown and also not allow abilities to be used
simultaneously.

## Why It's Good For The Game

Paving the way for basic megafauna.

## Changelog

🆑
refactor: Legions abilities have been changed into actions that can be
added to any mob.
/🆑

---------

Co-authored-by: Changelogs <action@github.com>
2024-01-26 23:46:26 +00:00
Bloop
c190f9d44f Fixes a decal hard del (#81093)
## About The Pull Request

Attempting to fix this hard del here: 


![firefox_1QHRZHx9GY](https://github.com/tgstation/tgstation/assets/13398309/871d50e4-1bfc-4b16-82af-972162e8d2e4)

I think the cause is from the turf changing, which
`/datum/elements/connect_loc` does not seem to take into consideration.
Now it should.

Also cleans up the signals in `/datum/component/infective/` which may be
another potential cause of issues.

## Why It's Good For The Game

Code that cleans up after itself is nice.

## Changelog

🆑
fix: fixes a hard del with decals
/🆑
2024-01-26 02:23:24 +01:00
LemonInTheDark
0705183abb Removes infinite sources of plasma from icebox (#81091)
## About The Pull Request

The gibotonite that arcane had setup to spawn on icebox was uh, the
wrong kind, it was the cursed SNOWDIN gibonite, which is made to live in
a plasma environment. Rookie error really should have remembered that
ice/icemoon exists this is a GREAT codebase

Speaking of, I've noticed that gibonite is the only ore that spawns in
an actual mineral wall here (IE the blue rock walls) so you can really
trivially avoid it. that feels wrong

## Changelog
🆑
fix: Icebox will no longer spawn a fuck ton of plasma after gibonite
blows. YW besties
/🆑
2024-01-25 09:12:28 -05:00
MrMelbert
b7a3e0c245 Fix neck snap not checking for the right mob to snap (#81086)
## About The Pull Request

Fixes #81084 

Nowhere did this procs checked that defender = the guy who is neck
grabbed.

I cleaned these up a bit as well since I was here. 

## Changelog

🆑 Melbert
fix: You can no longer neck snap anyone with martial arts assuming
you've got someone in a tight grip.
/🆑
2024-01-25 09:12:14 -05:00
SyncIt21
9141bfb95b General maintainence for Ore Silo (#81016)
## About The Pull Request
1. **Qol**(Hopefully not an issue for feature freeze)
- Adds Screen tips & examines for screwdriver, crowbar & multitool acts
   - Examining ore silo will now display its stored materials
- Location name is attached to the machine name and it greys out when
pausing the machine to make it more noticable that it is paused
   - Made window wider

2. **Code Improvements**
   - Auto docs procs & vars for ore silo log entry
- Fixed return values of all tool acts i.e. no more returning
`TRUE/FALSE` but the actual item interaction flags
- UI no longer computes `REF` for each machine which is expensive but
instead uses the index value in the list
   - Moved global variables to their corresponding files
- Ore silo no longer starts processing round start. That proc just ended
itself anyway so why even bother registering

3. **Fixes**
- If a machine was disconnected via the ore silo UI, attempting to
reconnect that machine would cause a runtime at `RegisterSignal` in
`multitool_act` because it was already registered in `Initialize`. It
now unregisters the signal when disconnecting so that's fixed
- Each machine element in the UI does not have a unique key because it
used `key={machine.name}`. This meant after disconnecting a machine the
UI buttons would get grouped together and the pause & disconnect buttons
would not function properly. Now it uses `index` which is unique thus
fixing that problem

## Changelog
🆑
qol: added more screen tips & examines for ore silo, made UI wider,
attach location name to each machine & grey out paused machines to make
it more noticeable.
code: auto docs proc & vars for silo log entry. Fixed return values of
all tool acts
fix: ore silo UI now functions correctly after removing an entry from
the UI
fix: no runtimes when connecting a machine to silo that was previously
disconnected via the ore silo UI
/🆑
2024-01-25 09:08:27 -05:00
MrMelbert
ddf9fffdd4 Fixes a hard delete with AI laws, adds a stack trace for law datums associating with mobs when already associated (#81065)
## About The Pull Request

- Adds a stack trace for law datums associating with mobs when already
associated.
- From what I can tell, any situation in which a law datum is attempting
to associate with another mob when it already has an owner assigned is
an error. So this might help track down similar bugs in the future.
- Fixes a hard delete involving AI laws. 
- When a malf AI occupies an APC, it creates an APC copy of the AI. This
is an entirely separate mob.
- In creating this copy, it uses the malf AI's current laws for the new
copy's laws. Exactly. The same datum.
- So the copy attempts to associate with the datum, and nothing happens,
but it still assigns it to the copy's laws var.
- When the AI attempts to return to their core from the APC, it deletes
the copy. Which deletes the law datum, which our main Ai still has a
reference too, so hard delete. Womp womp.
- I fixed this by implementing a new proc, `copy_lawset`. The APC copy
now gets a copy of the laws when the shunt happens.
- This is imperfect, as they are two separate law datums now, it means
any law changes to the first will not directly affect the second... I
think. The whole "parent" AI system should cover this in theory? But I
don't know if it actually does? It's quite confusing.
- We should really codify methods of linking lawsets together rather
than the hackiness that cyborgs do currently.

## Changelog

🆑 Melbert
fix: Fixed AIs who shunt to APCs causing their laws to be deleted. 
/🆑
2024-01-25 00:38:50 -08:00
ArcaneMusic
87cf3da1fd Stock market event refactor and code improvements (#80985)
## About The Pull Request

Stock market events are a system coded into the stock market system in
an attempt to keep the stocks unpredictable, at least on paper. They...
need work, I'm in full agreement on that, but I haven't been able to get
the energy to really fix stocks as of recently. I plan on going and
kicking events up and making them a lot cooler, but in the meantime,
I've refactored stock market events into their own datum type,
`/datum/stock_market_event`. This works like most similar event datum
style objects, where an event has a proc called when an event starts, a
proc called when an event ends, and a proc called between on subsequent
stock market subsystem firings.

This does some minor tweaks to the newscaster stories automatically
generated after an event fires, namely so that they can be produced
quickly while emphasizing the important part of the event, what material
is being effected, and a summary of what kind of behavior has happened
to the material stock.

Additionally, this made for a good excuse to do some code cleanup here
while I had the opportunity, swapping to `::` as opposed to `initial()`
calls where it seemed cleaner and more appropriate. This should make
adding new stock market events as well as more unique events that can
effect cargo and the round at large simple to do.

This PR shouldn't have any mechanical changes to how stock market
behaves in a live round.

## Why It's Good For The Game

Improves code quality of stock market, increases readability of stock
market events that have happened on the newscaster, and performs some
minor cleanup to the TGUI for the stock market while I'm at it, all
while keeping balance the same while we're still in the feature freeze.

Full disclosure, once the freeze is over I have some pretty easy numbers
tweaks planned to help significantly improve the stock market system
that I had layered on this branch, but we've shuttled them off this PR
for now to get this part ready to ship.

## Changelog

🆑
refactor: Stock market events are now their own objects, and are handled
by the stock market individually.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-24 22:11:20 +01:00
Bloop
bbed38dd46 Fixes a spurious CI runtime in do_charge() (#81048)
## About The Pull Request

Fixes this runtime here


![firefox_ukNfWhCyF1](https://github.com/tgstation/tgstation/assets/13398309/460157ed-2c18-44c0-9339-49da6fc605d0)

These signals can evidently be overridden and some of these were missing
the override = TRUE parameter.

## Why It's Good For The Game

Less CI fails

## Changelog

🆑
fix: fixes a spurious CI failure from do_charge() signal overrides
/🆑
2024-01-23 20:03:43 +01:00
MrMelbert
f0f31f8132 Fix sepsis burns disabling the limb forever until brain surgery (#81055)
## About The Pull Request

- Having a fully sepsis burn wound no longer disables that slot until
brain surgery. Replacing the limb restores use to the slot.
- I thought this was intentional by use of a brain trauma rather than
using `disabling` but I asked ryll and they said it was not intentional.
So.
- Also fixes losing control of a limb saying "human right arm" rather
than "right arm".


## Changelog

🆑 Melbert
fix: Replacing a limb fully claimed by an infested burn wound now
properly grants you control of the limb back
fix: Losing control of a limb now sounds less weird in chat
/🆑
2024-01-23 19:57:23 +01:00
Ghom
51ae7ce05a check that the not-teleported atom is a mob before sending balloon alerts (#81040)
## About The Pull Request
Quick and easy runtime error to fix.

## Why It's Good For The Game
Runtime viewer clutter.

## Changelog
N/A
2024-01-22 13:11:11 -08:00
scriptis
004c4f0b2b spellcheck: iron sheets's what? (#81045)
## About The Pull Request


![image](https://github.com/tgstation/tgstation/assets/12202230/237ce3f1-4c00-4e00-aabc-0b477b0be293)

literally unplayable

replaced with


![image](https://github.com/tgstation/tgstation/assets/12202230/521ddcf2-e512-4141-a4b1-92b833c76d88)


and with an active tone
## Why It's Good For The Game

spelling
## Changelog
🆑
spellcheck: iron sheets's what?
/🆑
2024-01-22 13:10:53 -08:00
ArcaneMusic
002051a3d5 ArcMining Pr Beta: Version 1.2 (#78524)
This one's not like the last one, so much so that I'm not even going to
outsource the PR description to a robot this time!
Basically, **You should read the PR body before assuming that everything
is the same as last time. It's not.**

## Video Summary
Click the link below to see a video summary of the main features of this
pull request.
https://youtu.be/Aho2omR0mjY?feature=shared

## About The Pull Request
This pull request serves as a large rework of minerals produced by
mining, and by extension mining itself. I'll try and list each change
and it's associated nuance here.

### Ore Vents
The biggest addition to the game with ArcMining is **Ore Vents**. Ore
vents spawn as a ruin on the map, placing a randomized ore vent onto map
generation. Ore vents spawn in 3 different sizes, **Small, Medium, and
Large**. These vents will pick from a pool of materials they can
generate, and will hang out across the map. A player can use a mining
scanner to discover an ore vent, granting a small quantity of **mining
points** to begin with. Once scanned, ore vents will show what minerals
that ore vent will generate after they're fully tapped.

Scanning the vent again will trigger the extraction process. A small
drone will fly down, called the NODE drone, and buckle onto the vent.
Your job during wave defense is to protect the drone and to defeat waves
of randomly spawning mobs (dependent on if you're on lavaland or on
icebox). The quantity, duration, and time between waves is scaled to the
size of the vent you're protecting. Starting by scanning and protecting
lower tier vents earlier in the shift is a safer bet than doing a large
vent in the first few minutes. The drone has 500 health, and can take a
good few hits, but leaving it alone will cause it to meet an unfortunate
end quite quickly.

Cooperation can be your best asset, as mining with allies can greatly
help with wave defense, and mineral points are granted to anyone who
helps with defending the ore vent equally (So 500 * size tier,
regardless of how much help you receive). Once complete, the ore vent
will have a mining machine constructed on top of it, and will start to
dredge up **Boulders** from the earth automatically. More on boulders
later.

Ore vents can be located based on your mining scanner, and will provide
an appropriate audio cue based on if the ore vent has been discovered or
not, and once processed will no longer alert you to it's presence.

**Each station comes with a free vent that produces exclusively iron and
glass, free of charge.** This is to help with shifts where the station
may not have shaft miners to produce minerals, and to provide the
station with a baseline amount of minerals where none may exist
otherwise.

### Mineral Generation
Mineral generation has been completely reworked. Previously, Mineral
Generation had a flat 13% spawn rate in-game. Once minerals spawned,
they would also have a chance to propagate their minerals to nearby
tiles, resulting in a rather massive pool of minerals that could spawn
throughout lavaland on the whole.

This tweaks that, by making minerals in walls spawn based on their
proximity to ore vents on maps that use cave generation. Both the
probability, and quantity of ores spawning in walls is scaled based on
distance, with ore vents looking like large caches of ores found in
walls. This makes following ores found in walls and checking their
quantity of minerals spawned a good indicator of how close you are to a
nearby vent in-round.

This means you can collect some points form both discovering ore vents
first, as well as collecting their surrounding ores, turn those in for
mining points, and then trading them in for gear upgrades to more
effectively take on ore vents. As a result of tweaking the balance of
this, the total amount of ores spawned in walls overall has been
decreased. However, by making more of the process time based, we still
result in a mostly balanced finished product.

### Boulder Processing
On station, there are now three new machines. These are the BRM, the
Refinery, and the Smelter.

- The BRM acts as a teleporter. Instead of needing to carry boulders
back to the station, you can activate the BRM, and it will automatically
pick boulders to teleport back to itself. You can use this to teleport
boulders dredged up from lavaland onto the station for processing. **The
BRM will only lock on to boulders that are resting on an ore vent.**
Moving boulders back by hand will mean you'll have to haul it back by
hand.
- The refinery processes the non-metallic materials out of boulders.
This process sends the materials straight to the ORM, and collects
mining points from the ores smelted in the machine. Swiping with an ID
card lets you withdraw those points for your own personal account, but
remember that these points are for your whole team to share from. The
**Mining points obtained from this process is only 75% of the amount an
equivalent amount of ores would provide.**
- The smelter works nearly identically, however the smelter produces
metallic materials out of boulders instead.
- Once a boulder has had all of it's materials extracted, it's broken
down and deleted from the line. Otherwise, the boulder is spat out for
the next machine to process it (either the refinery or smelter).
- Once there's no minerals left in a boulder of any type, the refinery
or smelter will break the boulder down.
- Boulders **do not stack onto tiles with each other**, so they'll block
each other when pulled or when moving on a conveyor belt.

Boulders can also be processed by hand. Using a mining tool on a boulder
with right click will allow you to break down a boulder into it's
composite ores, but limits you to a maximum of 10 ore per boulder, where
the full amount can be extracted using the proper processing machines.
Also, processing by hand does deal small amounts of stamina damage over
time, do breaking a full large boulder can be particularly taxing.

Additional Boulder Processing Machines can be built, with the BRM board
being obtained from the Protolathe, while the Smelter and Refinery
boards being obtainable from the Autolathe instead. A _boulder
processing beacon_ can also be obtained from the mining points vendor as
a reward to assist with boulder processing. Boulder processing beacons
can be used to spawn in a new BRM, refinery, and smelter on the tile the
user is standing on, however **you'll still need to link them to the
ORM**!

All three machines can be upgraded with Stock Parts, allowing for **more
boulders to be processed at a time**. It does not, however, increase the
amount of minerals received from boulders, or points earned.

### Mining Borg Tweaks
Mining borgs have been given some minor adjustments to compensate for
the changes to mining. Their mineral scanner, which now has an active
component to gameplay, is now a module as opposed to built into the mob.
This module allows for the same ability to discover and start waves of
monsters to fight.

Mining modules will find that their PKA now has a total of 90% mod
capacity as compared to the 80% they had before, to allow for more
robust defense of ore vents.

In addition, all borgs and AIs can interact with the BRM for boulder
collection.

### Mining Mech Tweaks
Mining Mechs have had their utility tweaked as a result of these changes
as well. Mineral scanners to be used on mining mechs now have a larger
radius by comparison to their handheld cousins. Similarly, it now has an
active scanning button, which will actively discovery nearby ore vents.
To begin wave defense, you will need to hop out and scan a second time
however, so that you can properly accept the risks of drawing a horde of
bloodthirsty wildlife towards you and your companions.

Mechs can also manually process boulders, similar to mining tools using
their drill.

### Golem Tweaks
Golems, being more gentle and less aggressive than humans, while being
made out of LITERAL ROCKS, have a greater need to secure access to ores
and minerals to eat. As such, they have adapted to be able to do two new
things:

- Golems may now right click ore vents to be able to manually haul a
boulder out of the vent. This costs a hefty amount of stamina, but it
allows for golems to avoid combat during regular gameplay.
- Golems may now left click a boulder with an open hand in order to
manually process a boulder like a pickaxe. While not faster, it is
consistent and prevents golems from starving if they have access to a
vent, but no ores, somehow.

### Gulag Tweaks
The labor camp, being a camp for rehabilitation and ~~excessive manual
labor~~ has been tweaked. Boulders now replace the random minerals
located on their island, and to acquire their prizes inside, much be
excavated and then broken out of the rock. Now YOU TOO can excavate
minerals and become a true mineral hero by working your way to freedom.

### Mining Point Changes
As a result of fewer mining points being available across the map due to
the new ore spawning mechanics, and the shift in how and when ores will
be coming in, almost every progress based mining point cost has been
reduced by around 10-20%. Many numbers are still subject to change at
present, but the idea is that core progress unlocks should be made a bit
more available earlier in the round before players can start to solo or
duo larger or more difficult ore vents, after which they'll be rolling
in ores.

### Rarities
Every once in awhile, an unusual boulder will get hauled up from the
mineral rich depths of lavaland. These **Artifact boulders** can
occasionally produce rare items, but for now they've mostly just been
pulling up **Strange objects** for science. Nanotrasen Natural Sciences
department will reward you extra points to be collected by boulder
processing machines for successfully extracting one. In the future, this
opens up a passive reward space that mining can reward to the station,
like providing cytology DNA samples, ancient seeds, or other artifacts.

### Misc notes

- Boulders can be stored in all varieties of ore boxes (ground, mech)
should you choose, however as mentioned it's best to leave them where
they spawn and teleport them to the station for convenience.
- Maps that are not subject to cave generation will find that they are
largely untouched in terms of mineral balance.
- Future or existing ruins can now be tweaked to have a mineral balance
cost, as the ore vent ruin does. This will allow us to spawn in more
interesting ruins for pre-made combat challenges.
- There are unique ore vents that spawn across the map, that will summon
a boss mob relevant to that map. If the boss mob is defeated, that vent
will spawn large boulders pulling from every possible ore type that can
spawn. Not for the faint of heart!
- Similarly, the number of ore vents and mineral budget is now
adjustable in the cave generation procs, so maps may spawn with more or
less ore vents as desired for balance.
- Artifact boulders opens up a LOT of room for possible future content
like archaeology, xenoarch, artisci, and other design spaces!
- Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in
addition to boss ore vents.
- **I'll add more to this as I get asked questions and remember things,
this is a huge PR and I'm confident I've missed at least something**

## Why It's Good For The Game

I outlined a lot of this in #78040, so I'll try and keep this relatively
snappy this time, while noting that I've made some concessions to make
the whole system a lot more playable while not trying to break out
design decisions that are at the end of the day, better for the game and
the overall resource balance in round.

Minerals are a very poorly balanced system, and have been since their
inception many years ago. We heavily rely on mineral balance in round,
and yet we've really only balanced it by introducing so much supply that
there's no equivalent exchange for materials that doesn't just heavily
flood the exchanged material. For example, items printed from materials
that are otherwise considered "rare" on master exist in such quantities
and they'll never practically run out in our allotted 90 minute time
slot design. This PR adjusts how ores spawn to a point where we can
minimize the amount of ores that need to exist on the map for mining to
be able to progress, while still providing enough resources for the
station that it covers the needs of the station adequately.

Miners will need to be more strategic about what resources they've
collected, and be able to make decisions about which vents are worth the
risk of attempting to fight, how to prepare for a wave defense, and when
to head back up for upgrades, while finally giving them at least some
kind of incentive to work together and use different equipment.
Resonators make cleaning up the caves around vent easy, sandbags set up
easy defenses for your vent, mechs can serve as a wider range radar
while mining, all while still providing a new gameplay loop to mining.

By limiting the amount of ores that can enter the round from the
massive, massive amounts that were coming into the round beforehand (see
#78346 ), we can make ore processing more meaningful by adding more
gameplay to the processing of minerals. I have some plans for that,
however this PR already got bloated really REALLY badly due to scope
creep and the number of intersecting systems that rammed into each other
to make this PR possible. So that'll be next. Plus, as I've mentioned,
we open up places for ore processing to find fossils, relics, and other
things that can implemented down the line.

Overall, I don't expect this PR to save or kill ore balance, but we gain
a LOT more control over it through the use of our mining defines
attached to this PR, and at the end of the day, that's a great place to
start off of.

## Changelog

🆑
add: Added ore vents. Scanning them with mining scanners shows what
minerals they contain. Scan again to fight off a horde of beasts as your
drone assistant excavates the vent, so the ore vent will produce mineral
boulders!
bal: Ores that spawn in walls now spawn based on their proximity to ore
vents, with their chance to spawn and their minerals contained scaling
from low to high.
add: Added the BRM, Refinery, and Smelter. These pieces of equipment are
used to process ore boulders into minerals for the station. Stock Part
upgrades allow more boulders to be processed at one time. They collect
mining points as well, to be redeemed with an ID card swipe.
add: Boulders are teleported to the station via the BRM if left
untouched. Boulders can also be cracked open for a reduced amount of ore
using pickaxes or golems hands.
add: All stations come equipt with a pre-excavated ore vent, which
produces a basic supply of iron and glass only. Scan other vents for
your critical resources!
add: Look there's a shit ton of changes on mining, for more detail check
out the Pull Request: https://github.com/tgstation/tgstation/pull/78524.
sound: New sounds and noises for your high octane factorio-like
gameplay!
image: All new boulder sprites for the new minerals and rocks added to
the mining gameplay loop, as well as mining machines!
image: Overlays appear over vents when scanned to let you know their
contents at a glance when actively scanned with any mining scanners.
/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-21 11:32:05 -05:00
Ghom
f9957b0373 Integrated circuits for modular computers (#80530)
## About The Pull Request
This PR integrates circuits for modular computers and a good bits of
their programs.
The peculiarity here is that modular computers have no fixed amount of
unremovable components (except the base one with just a couple ports for
now), instead, they're added and removed along with programs. With a few
exceptions (such as the messenger and signaler), for these program
circuits to work, their associated program has to be either open or in
the background.

For a reason or another, not all programs have a circuit associated to
them, still, however the programs with a circuit are still a handful.
They are:
- Nanotrasen Pay System
- Notepad
- SiliConnect
- WireCarp
- MODsuit Control
- Spectre Meter
- Direct Messenger*
- LifeConnect
- Custodial Locator
- Fission360
- Camera
- Status Display
- SignalCommander

*By the by, sending messages has a cooldown, so it shouldn't be as
spammy. If it turns out to not be enough, I can make it so messages from
circuit will be ignored by other messenger circuits.

The PR is no longer WIP.

## Why It's Good For The Game
I believe modular computers could make for some interesting setups with
circuits, since they're fairly flexible and stocked with features unlike
many other appliances, therefore also a speck more abusable, though
limits, cooldowns, logging and sanitization have been implemented to
keep it in check.

## Changelog

🆑
add: Modular Computers now support integrated circuits. What can be done
with them depends on the programs installed and whether they're running
(open or background).
add: Modular Consoles (the machinery) now have a small backup cell they
draw power from if the power goes out.
/🆑
2024-01-20 21:21:42 +01:00
Rhials
32df0d3390 Adds in missing emergency shuttle prerequisite messages, adjusts wording in some existing ones (#81005)
## About The Pull Request

This adds some missing shuttle prerequisite messages, and slightly
modifies some existing ones.

I just wanted to add the missing ones in, but the vague or unclear
language in the other ones was also kind of bothering me. Specifically,
the uncertain "might"s and "may"s used in certain messages felt off to
me, and have been changed to more direct "must"s and "will"s. Certain
prereqs have also been made slightly more clear on what needs doing.
## Why It's Good For The Game

Makes things more clear to players! 

I really hope grammar PRs aren't a violation of the freeze. Adding in
the missing prereqs constitutes a "fix" in my eyes.
## Changelog
🆑 Rhials
spellcheck: Modifies some existing Emergency Shuttle prerequisite
messages, and adds some missing ones.
/🆑
2024-01-20 15:05:27 +01:00
MrMelbert
6937931731 dismember calls drop_limb with dismembered = TRUE (#81010)
## About The Pull Request

Pass `dismembered = TRUE` when calling `drop_limb` from `dismember`. 

At a glance I don't think anything actually checked `dismembered`,
making this do (practically) nothing,
however I was writing some code that actually relied on checking this
only to find it was always passed as `null`.

I also audited some signal usages of dismember / drop limb to make sure
they're correct.

## Changelog

I don't think this will affect anything at current.
2024-01-20 00:23:27 -07:00
Diamond_
7b7b70e57f Monkeys avoid obstacles (#81001)
## About The Pull Request

Changes the monkey's ai_movement from dumb movement to basic_avoidance,
allowing them to walk around tables and corners that they always
otherwise got stuck in.


https://github.com/tgstation/tgstation/assets/26240645/e1b46790-b950-4030-a9ae-4cf10913166c
Original monkey behavior


https://github.com/tgstation/tgstation/assets/26240645/e08a4094-8c81-41f6-8960-61338d38fff9
New monkey behavior

## Why It's Good For The Game

Monkeys can properly fight you without nearly constantly getting stuck
behind anything with collision.
## Changelog
🆑
fix: Monkeys don't get stuck on obstacles as often.
/🆑
2024-01-19 19:46:00 +01:00
Ghom
12ba9d1dea Icon for the cleanbot cheevo. (#80986) 2024-01-18 22:17:56 -05:00
Kyle Spier-Swenson
8703eac50d split area.contained_turfs up by zlevel, make init 10 seconds faster (#80941)
## About The Pull Request

Situation: areas have a list of all turfs in their area.

Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune

Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.

replaces `area.get_contained_turfs()` with a few new procs:

* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.

The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.
2024-01-18 12:16:12 -05:00
DATAxPUNGED
61affc283c Fixes eye pulling message from cranial fissure. (#80935)
## About The Pull Request

Fixes #80928 by swapping two strings. This also gives a new string for
bystanders when someone STARTS pulling someone's eyes, which felt like
an oversight while testing, but i can revert that last part if it is
deemed too much of a "feature"

- [x] I tested this on a localhost
## Why It's Good For The Game



Bystanders won't think that they're the culprit of terrible eye-pulling
crimes anymore
## Changelog
🆑
fix: Bystanders will no longer think they've pulled out a victim's eyes
after seeing someone else do it.
qol: They will also be able to tell when someone starts pulling out a
victim's eyes.
/🆑
2024-01-17 10:54:14 +01:00
_0Steven
3b368888c3 Fix bugs regarding immobile shells. (#80976)
## About The Pull Request

In `shell.dm`:
When immobile shells were unsecured it would just directly set
`attached_circuit.on` to whatever the shell anchor state was, which
bypassed sending the signal `set_on()` sends. By instead using
`attached_circuit.set_on()` this state change should actually propagate
to the inner modules, rather than say letting an inner module with a
clock run regardless of the shell's anchor state.
Similarly, adding a circuit to an unsecured immobile shell would try to
set `attached_circuit.on` to the shell anchor state, but in addition to
not propagating to inner modules this simply did not work because the
`attached_circuit.set_shell(parent_atom)` called later would set it to
be on anyway. We resolve this by just, moving the state change until
*after* set_shell.
Finally removes the `attached_circuit.on = TRUE` from the
`remove_circuit()` proc, because
`attached_circuit.remove_current_shell()` immediately sets this to false
again anyway.

More related but separate bits probably tomorrow.
## Why It's Good For The Game

Makes immobile shells actually work only when anchored, and resolved
some related jank.
## Changelog
🆑
fix: Immobile shells no longer work regardless of anchor state if you
put the circuit in while it's unanchored.
fix: Immobile shells properly propagate their on/off state after
wrenching to inner modules.
/🆑
2024-01-17 04:46:20 -05:00
Interception&?
9c2df71dc2 New Ore Silo UI (#80975)
![UI](https://github.com/tgstation/tgstation/assets/137328283/8a6f3645-32db-4700-8884-985cf7b3dd40)

## About The Pull Request

Made a new UI for Ore Silo, tweaked `MaterialAccessBar` component a bit
to properly display pop-ups over “wrapped” elements and actually wrap.

## Why It's Good For The Game

Ore Silo is one of the last machines that use browser on TG, we're
almost there!

Also, it helps @JohnFulpWillard to bring
https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA HackMD document to a closure.

## Changelog
🆑
refactor: Refactored Ore Silo Ui.
/🆑
2024-01-17 04:42:24 -05:00
Ghom
0e3c83ff3a Revert "Makes immerse use weakrefs", prioritizing some ref removal lines instead. (#80707)
## About The Pull Request
For a moment, I had forgot about saying I'd take a look into it, but it
seems the new fix to hard dels is causing some runtimes with empty
weakrefs. Beside, WEAKREF() doesn't work well with qdeleting atoms (so
you'd have to access the weak_reference var directly).
How immersion works is quite confusing even for me who coded it, trying
to work around some of the hefty limitations of the engine truly blows.
I could even ask MrMelbert to make a proc-chain chart for it.

But yeah, long story short, I only have a bare idea where the uncleared
refs would be. I suspect it could be `immersed_movables`. It's totally
possible since the proc can early return in a few cases, thus skipping
the ref removal, hence the title.

## Why It's Good For The Game
I didn't like the PR that implemented weakref usage into the element,
but I let it pass because "hard dels = bad". However, the runtimes
aren't that much more pleasant either.

## Changelog
N/A
2024-01-17 04:38:13 -05:00
Ghom
aa9caef0ed Fishing hook and reel line tweaks (also qol for the fish bounties) (#80599)
## About The Pull Request
This PR includes a series of small changes and additions to hooks and
reel lines, as well as the aforementioned bounties. My objective here is
to make the (base) hook and reel line feel more useful. Ditto with a few
other things.

Here's the list of changes:
- Almost all fishing rods come with a hook and reel line pre-installed.
The rod from the fishing toolbox comes with separate hook and reel line.
- Without a hook, you cannot fish. Without a reel line, the cast range
is reduced (from 5 to 3).
- Fishing with a reel line installed provides a mild boon to completion
speed by default.
- The sinewy reel line (craftable from lavaland mobs) can now be used to
fish on lava / liquid plasma, but it's a bit stiff and gives a mild
malus to completion speed.
- Unlike other hooks, the rescue and jawed hooks now allow you to cast a
line and reel in living mobs too, not only items. They even get a status
alert they can click to un-snag themselves, or move away far enough to
achieve the same effect.
- Master fishing rod buffed. It now comes with a flexible reel line and
weighted hook pre-installed, and can be cast further than other rods.
- On top of that, the jawed hook will slow down living mobs snagged by
it and is a bit harder to remove.
- when casting a line, it will now show the icon of the current hook as
projectile, not a generic one.
- Reeling now correctly checks movement resistance and anchorage.
- Reeling an object (or a mob) now plays a sound. Ditto for
installing/removing slotted items.
- A few balloon alert feedbacks.
- Minor code improvements.
- The jawed hook should look a smidge sharper.
- reel lines are now small items.

## Why It's Good For The Game
The base hook and reel line didn't do anything begin with, and you would
do just fine without them. In the end it's just a bit unintuitive for
them not to be a requirement.

Beside that, it makes sense for the rescue hook to be able to snag mobs,
so they may as well be used to drag people out of lava or liquid plasma.
As for the jawed hook, it always felt to me a bit underwhelming and a
bit of a filler I had cooked up on the moment. It really could have some
'tactical' utility in virtue of being one of those niche black market
items.

## Changelog

🆑
add: Most fishing rods come with a hook and line preinstalled. Fishing
toolboxes come with separate reel and lines as usual.
balance: Fishing hooks are now required to fish.
balance: Without a reel line, the range of fishing rods is reduced by
two tiles. Conversely, having one installed gives a mild buff to the
minigame completion speed.
balance: The craftable sinewy reel line can now be used to fish on lava
or liquid plasma, but it's a bit harder to use.
balance: The rare-to-find-in-maintenance master fishing rod now comes
with a flexible line and weighted hook preinstalled, and has better
range than other rods.
balance: Fishing reel lines are now small enough to fit pockets.
add: The rescue and jawed hook can now snag and reel in mobs, not only
items. The jawed hook also slows down when applied, a la beartrap.
qol: Fish bounties now accept filled (stasis) fish cases.
qol: Several balloon alerts for fishing rod interactions.
fix: Reeling in items (and mobs) now respects movement resistance and
anchorage.
fix: Fixed the fishing rod equipment UI being too small to fit its
components.
sound: Reeling in something now plays a sound.
/🆑
2024-01-17 04:37:52 -05:00
John Willard
27f85f1c76 Ice cream vat uses a radial menu (#80965)
## About The Pull Request

Removes the ice cream vat's html window for ice cream, reagents, and
cones and replaces it with a radial menu and the ability to simply
examine the machine to see its contents.
Soup and Salads currently allow you to see whats inside without the need
for science/bar goggles, so following that theme I thought it would make
more sense for it to also be the case here (and for feature parity with
previous behavior).

#### Controls

Left-click chooses ice cream flavor or ice cream cone
Right-click swaps between which one you will be choosing from

Left click with a beaker will put it inside to use for custom
ingredients
Right click with a beaker will transfer its reagents to the machine (any
that is used for making ice cream)

Dispensing custom ice cream takes from the beaker inside of the beaker

Video demonstration

https://github.com/tgstation/tgstation/assets/53777086/9ebdcb13-b29f-4b3c-9d5f-54be1f6da888

Custom Ice cream

https://github.com/tgstation/tgstation/assets/53777086/687af270-14e4-4851-bf1f-3c4da4aeb21f

## Why It's Good For The Game

The ice cream machine is genuinely confusing because of it's UI and
personally it was unironically the last kitchen tool I learned because I
just didn't think it was worth it. This makes it feel way better to use.
It also helps me with https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA which
I've been trying to chisel away at.

## Changelog

🆑
refactor: Ice cream vats now use a radial menu instead of an HTML one.
/🆑
2024-01-17 03:30:10 +01:00
Ghom
68677dc721 Disarm refactor, plus shoving people with shields (#80123)
## About The Pull Request
I wanted to add the ability to shove people with shields by
right-clicking your target, just like how it works barehanded.

This also required a solid refactor of disarm code, effectively bringing
down the core of it to `mob/living` from `mob/living/carbon` or
`mob/living/carbon/human`. This also means you can shove simple mobs
inside closets, bins and on tables.

Xenos and borgs are pretty much immune to regular disarms, but using a
shield will work (borgs and royal xenos are immune to the knockdown).

The riot shield armor has been balanced. It now tanks melee attacks
pretty well, but will break against bullets in just about 2 to 4 hits
depending on the bullet damage. I've always found the lack of sturdiness
of the riot shields for what they're supposed to be good for a bit
detrimental.

Because I've refactored an item flag into a trait, I've had to add a new
MOD module that grants protection from shove knockdown and staggering;
found pre-installed in the administrative MODsuit, but I've also added
it to the black market to make it cooler.

You can bash people with the strobe shield on combat mode.

## Why It's Good For The Game
Currently, shields are simply items that take a held slot in return of
some block chance without being anything special, save for the strobe
shield's integrated flash I guess, but are also a botherance as most
crumple under the duress of less than half a dozen attacks. Meanwhile
swords and other weapons with blok chance just don't care.
TL;DR, I want them a bit more remarkable, and flexible as a tool.

Of course, this ended up in a larger refactor because the right-click /
disarm code was inconsistent.

## Changelog

🆑
add: Shields (and pillows) can be used to shove people around the same
way barehanded right-clicking does. Xenos and borgs can actually be
moved this way.
add: Added a new MODsuit module, the bulwark module, which prevents
knockdown and staggering from shoving, and getting pushed away by thrown
objects. Inbuilt for the safeguard MODsuit, but one might also it in the
black market.
refactor: Disarming has been refactored. You can now shove simple
critters onto tables and into bins and closets
balance: Shields now take their own armor values and the armor
penetration of the attack they blocked when damaged. This means shields
are a bit sturdier now.
balance: Riot shields can tank a lot more damage against melee weapons,
but less against bullets.
qol: strobe shields can now be used to bash people while combat mode is
on.
/🆑
2024-01-16 19:35:56 -06:00
Bloop
fc0a1f4068 Removes timeout_mod arg from add_mood_effect (#80964)
## About The Pull Request

Partial Revert of https://github.com/tgstation/tgstation/pull/80800

Assuming every num passed in the parameters of `add_mood_effect` is a
`timeout_mod` is incorrect, because there can be mood events that take a
numeric arg which is not meant to be multiplied against the timeout.

This leads to the same issue as multiplying it with strings essentially
(in one case, shown below, this results in a negative duration of a
timer).


![image](https://github.com/tgstation/tgstation/assets/13398309/f8af858f-04ef-4144-9a0b-2fae60b71272)


![Code_ZN176cpMqA](https://github.com/tgstation/tgstation/assets/13398309/a6ec7689-0171-4909-91cb-a17b56454eb6)

Plus having a keyword arg that may or may not actually be what the
keyword arg claims to be is really confusing and bad.

Instead here's what I propose: passing in an instantiated mood datum
itself, which has been modified, and copying the timeout from it before
discarding it.

It is not as clean as I'd prefer either, but at least it's logically
sound and the intent is clear, and it's the best I can think of short of
a major refactor of the entire system for this one small thing which is
only being used by food quality.


![image](https://github.com/tgstation/tgstation/assets/13398309/8560c066-bb0b-4066-af94-372d5ea62679)

## Why It's Good For The Game

Clearer, less smelly code.

## Changelog

🆑
code: removed the timeout_mod arg from add_mood_event, which was only
used for one thing and causes more issues than it's worth
/🆑
2024-01-16 20:57:42 +01:00
LemonInTheDark
a3bb400816 Optimizes Reftracking (Bigly) (Plus harddel fixes) (#80443)
## About The Pull Request

### Reftracking BS

Alllright so reftracking is slow, really really slow.
That's a problem for me, both because I want it to be fast so I can more
efficiently torture players by running it on live, but also because it
impedes both local and CI runs.

So I've set out to micro optimize the DoSearchVar proc, one of the
hottest in the game.
I've done this in a few different ways.

#### The simple shit

Removing redundant proc args
Yeeting assoc arg setting (extra cost)
Moving if statements around to prioritize the more common case
Ignoring empty lists.

#### The not simple shit

Throwing our snowflake list checking into the sun
(Background, byond has some special lists that cannot be accessed like
an assoc list, trying to will lead to runtimes)
The way we handle this involves inspecting their ref string, and it eats
a LOT of time.

Faster then to mark all the lists we know are special by var name, and
then use try/catch to detect and silence anything that sneaks through
(this is on the order of like 1/3 per run, kinda curious what they are
tbh)
Thanks to MSO for the idea for this btw.

Removes the vars and logic that tied ref searching to clients. 
It's not how this code is used, and it slows everything else down for
really no reason

Added support for handing in a known "hanging reference" count, and then
searching for that.
This lets us early exit the ref search if we find everything we were
looking for, which is REALLY powerful, and why I asked for refcount() in
the first place.

### Harddel Fixes

[Fixes some harddels w gulag stuff born of the 515 one way ref
issues](046d7daa03)

[Ensures proximity cameras clean their ref to their proximity datum if
it's
deleted](ff607e9ccb)

[Deleting a pipe connected via the gas_machine_connector datum to a
machine should also delete that machine (harddel
fix)](9eecca22e7)
## Why It's Good For The Game

All this combined speeds up refsearching massively, on the order of
hundreds of seconds, and makes it far less time consuming for both CI
and running on live.
I'll be bullying some servers semi soon, want to see what I can cut out.
2024-01-16 02:17:03 +01:00
Time-Green
95b14d05d6 [NO-GBP] Fixes radshelter not radprotecting against nebula storm (#80957)
🆑
fix: Radiation shelters (wherever they are) will protect against nebula
storms
/🆑

Oversight when I originally added the nebula. Didn't realize these were
a thing
2024-01-15 22:05:06 +01:00
Zephyr
13d2dceb31 Minor Autolathe Refactor | Material Dupe-B-Gone (#80839)
## About The Pull Request

Refactors underlying autolathe code, mostly about how it prints items
Items are now printed sequentially
Items now have their custom materials set to the the materials actually
used to create them
Items are now printed based on their design construction time instead of
a default 3.2 seconds per item always
Closes https://github.com/tgstation/tgstation/issues/80755

## Changelog
🆑
fix: Autolathes no longer allow you to duplicate materials at higher
levels of stock parts
qol: Autolathes now show name instead of typepath when selecting a
custom material
qol: Autolathe now print out items one by one instead of waiting for all
of them to print at once
/🆑
2024-01-15 13:35:02 -05:00
Hatterhat
27386bffe8 fixes a bunch of moodlets potentially lasting forever (less band-aidy) (#80800)
## About The Pull Request
In a previous PR (https://github.com/tgstation/tgstation/pull/79661), I
noted that a lot of moodlets tended to have their timeouts break because
it was passing their names and whatnot as a parameter, that gets fed
into the timeout modifier parameter, causing the timeout multiplier to
break, because BYOND type-agnosticism means that it can multiply a
number (timeout_mod) by text (a name or some other object), resulting in
0 - which makes a moodlet permanent. This is probably not intended.

This fixes that in two ways:
- Adding a `1` to potentially applicable moodlets (searched for with a
regex of `.add_mood_event(.*, .*,)`) just to make sure the timeout
doesn't get multiplied out weirdly.
- Making the add_mood_event thing CRASH() if the timeout_mod is bad.

If someone else wants to come up with a solution better than this,
please do.

## Why It's Good For The Game
Maybe having your arm permanently fall asleep after getting it
reattached sucks, moodlet-wise. (Being stuck with permanent
positive/negative moodlets is probably not intended.)

## Changelog

🆑
fix: Moodlets with parameters/effects e.g. limb reattachment moodlets
should probably disappear more appropriately.
/🆑

---------

Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
2024-01-15 07:08:01 +01:00
san7890
0d91d0365e Better errors for adding element to qdeling datum (#80927)
## About The Pull Request

Got this from reading #80915

The actual name of the element is not reported anywhere in the stack
trace, and while you might be able to figure it out from context clues
based on the procs invoked in the stack trace... this isn't guaranteed
and just makes it harder to diagnose these weird sporadic runtimes.
## Why It's Good For The Game

easier to figure out a problem when you have as much useful information
as possible
## Changelog
irrelevant
2024-01-15 05:07:26 +01:00
Rhials
5970b6722b Makes lizard wine (and some other crafting menu drink recipe drinks) produce their intended reagents (#80874)
## About The Pull Request

Crafting recipes now have an arg that decides if crafting results will
retain their starting reagents, or have ingredient reagents transferred
into them.

So, previously, crafting a specialty drink (lizard wine, candycorn
liquor) from the crafting menu would immediately empty the new bottle's
reagents and replace it with the ethanol used in the recipe.

Now, recipes can be prevented from modifying their result's reagents by
setting unique_reagents to TRUE (False by default. I don't know what
recipes really use this functionality but I wanted to preserve it for
everything but the drink recipes it interferes with.)

Bonus: This changelog entry I found from 3 years ago, apparently fixing
this same issue.


![image](https://github.com/tgstation/tgstation/assets/28870487/55d8f9d7-e3d7-41db-ace3-78156ffa3778)
## Why It's Good For The Game

Closes #80870. 

Makes some more reagents accessible again.
## Changelog
🆑 Rhials
fix: Specialty drinks crafted in the crafting menu will now create the
intended reagents, instead of containing the reagents used to craft it.
/🆑
2024-01-12 04:40:48 +01:00
Paxilmaniac
c287e627a8 Fixes the deployable component rotating things it isnt supposed to (#80877)
## About The Pull Request

Actually moves the rotation part of the code under the check for if the
component is supposed to rotate things
## Why It's Good For The Game

Despite setting the variable for rotating stuff to no, the component
would still rotate stuff, this is bad
## Changelog
🆑
fix: The deployable component will now actually stop rotating things
when the variable to not do that is set
/🆑
2024-01-12 02:58:31 +01:00
MrMelbert
8734b5def8 Fixed runtime from unowned cooldown actions (carp rift) (#80895)
## About The Pull Request

This might not be the most correct fix but it *makes sense*. 

Some actions can not have an owner if it is unowned, so this check would
runtime.


![image](https://github.com/tgstation/tgstation/assets/51863163/b4787b7f-f481-4601-bdb1-ad001e0fea2a)

I assume carp rift is unowned in some places?
2024-01-11 16:22:32 -05:00
MrMelbert
2d74ac7e3e Fix supermatter component runtime on non-supermatters (#80894)
## About The Pull Request

Used the wrong var for this istype check.
2024-01-11 16:20:01 -05:00
MrMelbert
f86fcfde0e Fixes improper use of audible_message (#80897)
## About The Pull Request

`audible_message` kinda expects a message to show to other people, if
you don't give it that it runtimes. Just use show message instead.
2024-01-11 16:18:55 -05:00
Bloop
568c5119b3 Runechat color now goes by voice rather than name (#80812)
## About The Pull Request

What it says on the tin. The color you get from runechat is currently
tied to your `name`, which doesn't accurately reflect how your character
is speaking in all cases.

What this change means: now things like voice changer masks, changeling
mimicry, and voice change disease will now actually change the color of
your voice to match the mob you are speaking in the voice of.

As a result it should now be impossible to figure out whether someone is
voice changing from looking at their runechat color and knowing what the
real mob's color was.

## Why It's Good For The Game

Just feels like an oversight that it didn't do this in the first place.

## Changelog
🆑
fix: if your voice changes (e.g. through a voice changer or changeling
mimicry) your runechat will now appear as the mob you are speaking in
the voice of
fix: when doing emotes with your face obscured, your runechat color will
now appear as either that of Unknown or the mob you are wearing the id
of (if you are wearing a mask with someone else's id)
/🆑
2024-01-10 10:29:16 -08:00
MrMelbert
7b8a95cf00 Fixes some AI related runtimes (#80828)
## About The Pull Request

Namely this. 


![image](https://github.com/tgstation/tgstation/assets/51863163/c6171a4e-afd3-4c07-8a96-1952ef76a3df)

## Changelog

🆑 Melbert
fix: Carps now migrate slightly better, probably. 
fix: And Poly now talks better, probably. 
/🆑
2024-01-09 14:06:16 -05:00
DrTuxedo
9f05a79b70 Sec Biosuit craft, more bio-emergency supplies (#80622)
## About The Pull Request

Makes Security bio suit and bio hood craftable using a normal bio
suit/hood and helmet/armour vest.

Adds a box of sterile masks and latex gloves to the bio-emergency crate
from Cargo.

## Why It's Good For The Game

Security bio suit is the only one with different armour values, yet
there is only one for the entire Security department.
By giving them the ability to craft them we give more Security Officers
protection from disease without losing their red colour and armour
(which is worse in bio suits than on their armour vests). This makes
Security more likely to care about roleplaying during outbreaks, like
enforcing quarantines.
This isn't creating any new bio-suits, as to craft a Security bio-suit
you need to acquire a normal bio-suit and some spare armour.

Adding a box of sterile masks and latex gloves to the emergency
bio-emergency crate makes it more useful. There is only 1 box of sterile
gloves and 1 box of latex gloves on all of the stations at medbay at the
moment. This way they can get more sterile masks and latex gloves to
protect themselves from diseases, which is cool to see players caring
about not getting infected and being in fear.
2024-01-07 01:04:17 -06:00
Mothblocks
a140505346 Replace natural beheading with cranial fissures (splitting your skull) (#80703)
## About The Pull Request

Replaces natural beheading (doing a lot of damage to the head) with
cranial fissures, which split your skull in half.


![dreamseeker_2023-12-31T19-38-16](https://github.com/tgstation/tgstation/assets/35135081/f84dc479-6156-45b7-bb23-4e4ec7378f6b)

While you have this wound, your eyes can be pulled out of your head with
bare hands, and slipping will spill your brain out of your head.

Removes beheading objective from traitor.

Zombies can be beheaded all the same.

Any other way of beheading, such as surgery or amputation shears, is
still possible.

Closes #80439 

## Why It's Good For The Game

I've enjoyed seeing the results of the test merge to remove natural
beheading. At 947 beheadings in a week, 1 in every 7 deaths resulted in
a beheading. This makes it significantly easier to remove people from
rounds as the brain is generally critical to actually reviving someone.
While round removal is fine, it should be something that is
intentionally performed with enough effort. Mass round removals ought to
require a significant amount of effort. There are plenty of ways to
round remove someone, but it ought not be an incidental choice.

The effects of beheading removal have shown some interesting anecdotal
highlights (nothing here is backed up with stats, so take it with a
grain of salt):
1. As a whole, people did not really replace it with anything. The
biggest alternative has been lighting people on fire, but this has not
been done at a significant enough scale at all to be a noteworthy
problem, and is still fixable with enough effort.
2. Cult and rev rounds have played out far more interestingly. In one
round I was adminning a head of staff who intended to behead every
revolutionary they saw, but because they didn't, the back and forth
continues. I've also had opportunities to revive head revs that I am
skeptical would've been available to me otherwise.

Complete removal of beheading was not chosen as it does not feel right
for a repeated fire axe to the head to do basically nothing. The current
implementation is intended to be something that is just not useful
enough to do on everyone you see, but is still appreciably an effect.

## Changelog
🆑
balance: Instead of too much damage to the head beheading someone, it
will now split their skull in half. While their skull is open, you can
rip out their eyes with your hands. and they will spill their brain out
of their head if they slip.
balance: The Path of Blades ascension will accept either a beheaded
person, or someone with their skull split open.
del: Removed the beheading objectives from traitor.
/🆑
2024-01-06 13:09:53 +01:00
Bloop
00a42f75e3 Fixes another image harddel in station blueprints (and more) (#80780)
## About The Pull Request


![image](https://github.com/tgstation/tgstation/assets/13398309/063c58ef-6233-4c91-aaf0-7e9589c0e912)

Tin. Just more uncovering of some of these image harddels.
`blueprint_data` is a list of images.

I also went through the code and looked for any more instances of images
being qdeleted that I could find.

## Why It's Good For The Game

Hard dels begone

## Changelog

🆑
fix: fixes an /image harddel in station blueprints
code: cleaned up some more /image qdels
/🆑
2024-01-05 18:00:23 +00:00
necromanceranne
8e75c930c1 Fixes every instance of 'kenetic' in the codebase (#80782)
## About The Pull Request

There were several instances of this being misspelled as 'kenetic'
rather than kinetic. This fixes that.

## Why It's Good For The Game

oughe

## Changelog
🆑
spellcheck: Corrects every misspelled 'kenetic' in the codebase.
/🆑
2024-01-05 17:55:09 +00:00
Bloop
4007cf7a65 Fixes some image hard dels, and adds context to qdeleting images. (#80736)
## About The Pull Request

(see https://github.com/NovaSector/NovaSector/pull/250 , credit to
capsaicinz for tracking these!).

Upstreaming the fixes for some bot hard dels likely brought up by a
recent PR.

There are a lot of them because it is qdeleting a whole list of them at
a time.

Example log:


![image](https://github.com/tgstation/tgstation/assets/13398309/defe698c-7526-4b95-b49a-5cfee32a97c2)

[link to
log](https://tgstation13.org/parsed-logs/sybil/data/logs/2024/01/01/round-221465/qdel.txt)

---

I have also included some context that I have been using to help track
image qdels locally, it might be something you want here. If not I can
just revert that part.

## Why It's Good For The Game

Should help a ton with lag spikes.

## Changelog

🆑
fix: fixes an image hard del
code: adds context to image hard dels to make them easier to track
/🆑
2024-01-05 01:53:37 +01:00
Ghom
a59cebea56 Increased odds of station traits a little. Introduced a "budget", so smaller traits only take half as much space. (#80211)
## About The Pull Request
Recently, I chatted with others about how few station traits are rolled
on a round by round basis - about 59% of the shifts go without either
positive or negative traits for example - and how the mild most of these
traits are (not a bad thing per se), which results in an underwhelming
feature, despite the more interesting bits of it. So, after sharing
opinions, I've decided to make this PR to increase the rolls and odds a
bit.

EDIT: After reading comments and taking some time to think this
thoroughfully, I've decided to push the probabilities back a little in
favor of a simple budget system for station traits, to allow for smaller
things to only count as half a station trait. This mean smaller traits
won't necessarily stop "better" ones from rolling, or at least allow for
plentier permutations of traits that do not affect the round TOO much.
I've also reduced the weight of the glitched pda beeps trait from 15 to
10, the same of scarves, wallets and colored assistant jumpsuits.

## Why It's Good For The Game

I believe the current odds of station traits to be a smidge low, and
that the lack of any sort of cost-budget for station traits to hurt the
rarer, more interesting traits (and the feature in general) if the more
common, milder ones take just as much space. It's totally within the
spirit of the feature to have small, niche traits, though they can get
quite boring pretty fast on their own, so what I'm saying is that their
cost should stay low so that other traits can roll.

## Changelog

🆑
refactor: Introduced a simple budget system to station traits, so that
smaller things only count as half a trait, for example.
balance: Increased the odds and maximum number of station traits that
can be rolled each shift.
/🆑
2024-01-04 16:53:09 +01:00
Bloop
94f76f9152 Stops qdeleting progressbar /images (#80734)
## About The Pull Request

What it says on the tin. These are getting qdeleted A LOT...
LemonInTheDark we don't need to be doing this I don't think?

## Why It's Good For The Game

Saves a bit on overhead of a very commonly qdeleted item that doesn't
need to be.

## Changelog

🆑
code: progressbars no longer qdel their /image
/🆑
2024-01-04 01:52:59 +01:00
Ghom
f3108f99be Dead code removal, redundant text macros, drying rack now applies TRAIT_FOOD_CHEF_MADE. (#80677)
I've been coding a PR these couple days, and I've noticed a few
oversights, all related to food, while working on it.

This PR removes an unused, 12 years old datum, and some redundant text
macros in a text string, for processable items, that already uses the
bold spans. It also makes it so food made with a drying rack gets the
chef made trait, similarly to other methods (though not as foolproof).
2024-01-04 00:10:36 +00:00
Ghom
81a668a727 Changes the scope component to be appliable to other items and not just guns. Binocs and the Curator's mothic cap use it. (#80445)
I've done some changes to the scope component so that it can be applied
to items other than guns.

Binoculars now use it instead of changing the player view size, and lets
them move around while the zoom is on at the cost of a moderate
slowdown. This is both more comfortable, cooler and less laggier than
the previous method. Take in mind it still takes both hands to use
binoculars, so there's no much room for exploitation anyway.

This PR also makes the mothic softcap from the curator kit special: it
too has the scope component, albeit of a much shorter range, because
it's probably the least interesting kit of them all right now and has
nothing that the curator cannot get by walking in the aux base
construction room, except for a pair of pockets in the mothic coat,
though that's superseeded by the Trailwarden kit's saddlepack. It's
pretty fitting if you ask since the softcap has some goofy-looking
googles drawn on it.

Oh, items that aren't guns also have a different mouse tracker icon of
two circles joined together, instead of a reticle.
2024-01-02 17:36:49 +00:00
_0Steven
99fcc070ee Fixes crashing through tables from a table giving you a negative offset (#80701)
## About The Pull Request

While failing to reproduce #80675, given no amount of slamming this poor
little moth creature through glass tables in any order and then
rebuilding it under them seemed to be doing anything, I found that it
_does_ cause a negative offset if the moth-to-be-slammed in question was
already on a table before being slammed into a glass table. (Don't worry
they have health insurance.)

After some debugging, this seemed to be because `Detach()` is called for
the new turf with the smashed table _before_ `on_exited()` is called for
the previous turf, causing it to first reduce one's offset by 12, and
then reduce it by 12 _again_ upon calling `on_exited()`. This seemed to
be true for whichever method was used, whether walking, dragging, or
being smashed.

![image](https://github.com/tgstation/tgstation/assets/42909981/3782776f-7153-4235-b377-8f8bd8904110)
So I introduced the same check for `TRAIT_ON_ELEVATED_SURFACE` that
`Detach()` has to `on_exited()`, making it only attempt to shift down
the movable if it still has the trait, and this seems to fix it fine!
It doesn't seem to cause issues with moving from beds onto tables or
tables onto beds, or smashing through glass tables from tables or beds.
So this should fix #80675, or at least I can't find what they would've
meant if not this.

And yes I did test this on Tramstation just in case.

![image](https://github.com/tgstation/tgstation/assets/42909981/e3d8e755-c288-4ed7-93cb-8948c6012c56)
## Why It's Good For The Game

Fixes #80675.
## Changelog
🆑
fix: slamming through a glass table while previously on a table no
longer gives you a negative offset.
/🆑
2024-01-01 21:38:20 +01:00