## Main Additions and Modifications
This PR adds in a quite a few new things.
### Overview
**WT-550 "Enhancements"** - made available via research. These
modifications retain the full-auto capability of the WT-550 to varying
degrees. Additionally a compressed WT550 magazine is available via
research. It contains 40 weaker bullets compared to the normal
magazine's 20. It is only allowed to contain compressed bullets to avoid
cheesing, and requires bluespace to fabricate. It is designed as a
sustained dps ammunition as opposed to a high dps ammunition
**WT-550-B** - Shoots in bursts with decent recoil and slightly higher
dps.
**WT-550-C** - Shoots slower but has a higher damage and projectile
velocity along with a scope.
**Sawn-off WT-550** - Is smaller but has egregious recoil and spread.
**.38 BR** - A simple but slightly less powerful alternative to the
NT-38 battle rifle. Craftable via a kit obtained from research.
**Stunstaff** - A weapon that is available via crafting and functions as
an alternative to a baton and riot shield. A heroic variant exists
within the code but the recipe can only be learned from a book that
sometimes spawns in the armory contraband closet.
**Advanced Energy SMG** - A hybrid of a disabler SMG, laser carbine, and
advanced energy gun. Does exactly what you think it does. Obtainable via
crafting.
**Stingballer** - A rifle that rapidly shoots stingballs. Direct damage
is lesser than a stingbang. Purchasable from cargo.
**Security Juggernaut Suit** - A heavily armoured suit that severely
cripples your mobility in exchange for very high protection. Crafting
kit is printable from a technode.
**Horizon Beam Rifle** - Damage is now 110 with 35 armor piercing, and a
demo mod of 2. Upon contact with walls, it destroys them like how a
pulse laser does.
### Crafting
WT-550 weapons can all be made with just the gun and the kit.
The sawn-off WT550 can be made by taking a saw to the WT550.
The .38 BR requires an NT-38 battle rifle along with a multitool and a
screwdriver.
The Advanced Energy SMG requires a disabler smg, laser carbine, and an
advanced energy gun.
The Stunstaff requires two security batons, some plasteel and some
cable, along with a welder and wrench.
The Heroic Stunstaff requires some other ingredients.
The Security Juggernaut suit requires a full toolbox of tools as well as
the armor plates, a full coil of cable, a pair of magboots, a swat
helmet, a swat suit, and two seclites.
Stingbangs can be prepared into stingball canisters with a screwdriver
and some wirecutters. Each contains 25 rounds are are used to fill the
stingballer.
### Cargo
**Stingballer** - Armory crate - Contains one stingballer. - 4500
credits.
**Grenade Launcher** - Armory crate - Contains one grenade launcher and
a box of flashbangs. - 15000 credits.
**Kiboko Grenade Launcher** - Armory crate - Contains one Kiboko grenade
launcher. - 7500 credits.
### R&D
The **"Ballisitic Research"** technode has been removed and dragon's
breath shells have been moved to the illegal technology node. The node
remains within the code though if more exotic ammunition is developed
and requires an additional research node for it.
New **"Advanced Ballistics"** technode contains the part kits for the
WT-550 modifications and NT-BR simplification kit and requires Exotic
Ammunition to research.
New **"Advanced Armor"** technode contains the Security Juggernaut
Plates and requires Riot Suppression and Gas Compression to research.
### Code
Adds to the buckling system where if something has TRAIT_NO_BUCKLE, it
cannot be buckled at all.
Adds to the vehicle system where if something has TRAIT_NO_VEHICLE, it
will be flung off the vehicle it attempts to move the vehicle
themselves.
Adds to the chair system where if something has TRAIT_NO_VEHICLE, it
will destroy the chair.
Adds to the movement system where if something has TRAIT_LARGE_CLOTHES,
TRAIT_BULKY_CLOTHES, or TRAIT_HUGE_CLOTHES, it will incur a 3, 4, and 5
move speed multiplier when pulling that thing. If anyone can help me do
this more modular, please reach out, I have no clue how.
Edits the equipment slowdown system to properly apply a special slowdown
that cannot be negated by anything. Requires the TRUE_IMMUTABLE_SLOW
bubber_obj_flag to be present. IMMUTABLE_SLOW is still required for red
potion immunity.
### Other Misc. Changes
The WT-551 has been effectively rendered impossible to get. This
decision stems from the fact that the WT-550 and the WT-551 were
functionally identical when used in-game. Instances of the 551 have been
replaced with the 550.
Skyrat's renaming of /tg/ bullets has been completely removed. Some
descriptions have been kept and altered because they were kinda neat.
.460 Ceres -> .45
.416 Stabilis -> .50 BMG
8mm Usurpator -> 4.6x30mm
.454 Trucidator -> .50 Action Express
.277 Aestus -> .223
## Statistics For New Additions
**Stunstaff**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/0e1c2a1a-20ba-47a9-91f1-e63ca11b5e43"
/>
- Two-handed, bulky. Fits on the back and an armor vest.
- 65 stamina damage
- 20 stun armour penetration
- 14 force
- 8 throw force
- 50 block chance
- 20 effective block vs tackles
- 10 effective block vs projectiles
**Heroic Stunstaff**
- 24 stamina damage
- 0.5 second stun
- 4 times the cell charge consumption
- No cooldown between stuns
- 35 stun armor penetration
- 15 force
- 10 throw force
- 75% throw stun chance
- Can be thrown like a boomerang
- 75 block chance
- 30 effective block vs tackles
- 50 effective block vs projectiles
**WT-550-B**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/56fea4dd-9b0c-4e06-93a7-b0389f3d32c9"
/>
- Bulky sized, small weapon weight, dual wielding.
- 2 round burst every 0.5 seconds
- 0.25 recoil
- 3 spread
- Can be suppressed
**WT-550-C**
<img width="48" height="32" alt="image"
src="https://github.com/user-attachments/assets/bd80570d-3e70-463d-8b6b-7cefcb1d54e6"
/>
- Bulky sized, heavy weapon weight, no dual wielding.
- Half fire rate of normal WT (0.6 compared to 0.3)
- 1.5x damage multiplier
- 1.5x projectile speed multiplier
- +5 projectile wound bonus
- Can be Suppressed
- Mediocre Scope
**Sawn-off WT-550**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/6d786022-2d93-42da-9dcc-fe6dfadbbce1"
/>
- Normal sized, light weapon weight, dual wielding
- 10 spread
- 20 dual wielded spread
- Sawn-off recoil (high)
**Compressed WT-550 magazine**
- 40 capacity
- 12 damage (20 for normal rounds)
**Stingballer**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/de30bda5-9e0b-44da-8097-ca9827d3d8c8"
/>
- Bulky sized, normal weapon weight, no dual wielding.
- 8 rounds per second
- 7.5 spread
- 50 round capacity
- 1.5 damage
- 4 stamina damage
- Embed chance at close range
- Bouncy projectile
- Low effective range
**.38 Battle Rifle**
<img width="48" height="32" alt="image"
src="https://github.com/user-attachments/assets/24a9a257-97fe-4313-ba39-93d17230f1b4"
/>
- Overall same statistics as the NT-38 Battle Rifle except for
- 1.0x damage multiplier (compared to 1.2x)
- 1.0x projectile speed multiplier (compared to 1.2x)
- 25.0% faster rate of fire (1.5 compared to 2)
- No degradation mechanics
- No scope
**Advanced Energy SMG**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/2671009a-a994-4054-92ff-4db2959501e8"
/>
- Bulky Size, no dual wielding.
- 0.8x damage multiplier (12 on kill, 12 on disable)
- 1.2x projectile speed multiplier
- 40 shots on kill, 40 shots on disable
- Charges about half as fast as the regular advanced energy gun.
- Same fire rate as the disabler SMG
- 2 spread
**Security Juggernaut Suit**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/5de0a084-4a07-4d8f-88a3-d9996de41010"
/>
- Built in helmet
- Helmet protects head from flashes, loud noises, impacts and
pepperspray
- Full temperature and pressure protection
- Helmet has powerful flashlight mounted
- Takes 12 seconds to put on, 15 to put on someone else
- Slows you down everywhere
- Slows you down when in-hand
- Slows down someone who's dragging you
- Prevents aggressive grabs against you when worn
- Prevents combat-mode pushing against you when worn
- Prevents shove knockdowns when worn
- Prevents gravity effects when worn
- Prevents buckling when worn
- Cannot be red potion'd.
- Does NOT protect against batons or knockdown.
Current Armor values:
- melee = 80
- bullet = 80
- laser = 70
- energy = 60
- bomb = 100
- bio = 100
- fire = 100
- acid = 100
- wound = 30
## Why It's Good For The Game
This PR adds in quite a few items that fill certain role archetypes
within security while allowing them to still use equipment that security
would already have.
## Proof Of Testing
Testing overall has been completed.
Testing left to do:
- [x] Cargo Orders
## Changelog
🆑
add: Added a bunch of alternative additional weapon and equipment
upgrade options to security, allowing a little bit of difference in the
late-game arsenal or general armament.
add: Adds the WT-550-B and WT-550-C, upgrades to the classic autorifle.
add: The WT550 can now also be sawn-off.
add: Adds the Stingballer, a close range weapon that rapidly shoots
stingballs.
add: Adds the Stunstaff, an aura-farming alternative to the classic
baton and shield.
add: Adds the Advanced Energy SMG, an a modified AEG that gains
rapid-fire capabilites.
add: Adds the Security Juggernaut suit, an impossibly slow suit that
hinders your movement but has some of the best armour you'll ever see.
add: Adds the .38 battle rifle, a simplified NT-38 Battle Rifle. Lacks
the combat improvements, but does not degrade.
balance: The Horizon Beam Rifle's performance has been tweaked. Damage
is now 110, with 35 armor penetration and a demolition mod of 2, as well
as the ability to destroy walls like pulse rifles.
add: The Kiboko and pneumatic grenade launcher can be bought from cargo
now.
del: The WT-551 has be completely removed and replaced with the WT-550
del: Any instances of Skyrat's ammunition naming system have been wiped.
Please report any inconsistencies you may find.
/🆑
---------
Co-authored-by: Cabbage <supredoode@gmail.com>
Co-authored-by: Mathilde <146444134+ibexgoetia@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
50 files, plus additonal file that was necessary because I slightly
refactored windoor construction. This ended up like three and a half
times larger than most of the other ones, I really wasn't meaning for
that to happen. Maybe its because I more vigorously enforced the empty
line after every return thing. The only way to find out is to read 1700
lines of changes, and I don't feel like doing that again. I pinky
promise it all works, and I've tested every item changed individually.
Changes beyond conversion:
You can't welder down reinforced falsewalls anymore, pretty sure it was
an oversight because they're supposed to be taken down by wirecutters
You can right click to close gun lockers with an empty hand, because
otherwise you can't close the lockers at all if there's a gun in them
Meatspikes no longer runtime on construction due to the old trick of
balloon alert + qdel
Windoor assembly no longer SUCKS DICK!!, it's no longer storing
essentially a boolean in an undocumented number in a string, it no
longer requires a VERB to flip its direction.
on a related note, the creator of the windoor assembly construction
steps has been sent to live on a farm far out in the country
Also, a quick note about how these prs are gonna fuck everything up
until they're all together. There's a lot more places where `attackby()`
is directly called than I would have assumed, and given as those are
being changed to call `item_interaction()` potentially(usually) in a
different pr than the pr in which that atom's `attackby()` is actually
converted, that function's not going to work at all until both are
merged. The good news is that almost every instance this is happening,
it's pure convenience, where the user would have access to both items
anyway and could just manually call the attack chain by clicking them
together. Instances where this is not the case are being skipped over
until they can be packaged together to avoid the issue, but I'm not
bothering to do this on ones where the desync won't make an interaction
actually unusable, because that would require me to turn a 1700 line pr
into a 3500 line pr and I really was aiming for like 500
## Why It's Good For The Game
Ignore the paragraph about how I expect this to create a hostage
situation where the only fix to the bugs I make is to merge my other
prs, and instead think about how cool swing combat would be and how much
you want it
## Changelog
🆑
fix: you now can only use a wirecutter to take down a reinforced
falsewall
fix: meatspikes no longer runtime on construction
fix: you no longer have to use a verb that you can't use to flip windoor
assemblies
qol: you can right click a gun locker to close it
code: 50 files have been moved from attackby() to item_interaction()
/🆑
## About The Pull Request
This PR moves most of the code for using an item to commit suicide from
`human` to `living`, so that anything with hands can use what it is
holding to commit suicide.
This was surprisingly painless, as most `suicide_act` procs were already
written without the assumption that the person killing themselves was a
human even though they couldn't be anything else.
This might occasionally mean that in some cases (like drones) it may
reference anatomy that they don't have (like necks) but I think that's
not a big deal and don't worry about it.
## Why It's Good For The Game
It's funny.
## Changelog
🆑
balance: Anything with hands can now use the things it is holding to
commit suicide
/🆑
## About The Pull Request
In similar fashion to what was done with crafting recipes last year,
this year it's time for techweb designs and printed items to be audited.
This is mostly just about consistency, we've a lot of items that can be
printed by protolathes, autolathes, circuit printers and techfab etc.
However they almost all (except most stacks, mainly) have custom
materials that do not match in one way or another with the materials
used by the design, which is what this PR is for.
"But items printed from lathes etc. already get the mats used to make
them." Yes, they do, however that isn't the case for items of the same
type that were spawned in some other way (cargo shuttle, space/maints
loot, mapped, admins), this create a subtle discrepancy. It isn't a huge
deal (in spite of the size of this PR, ton of designs), but given that I
have done something similar with crafting recipes before, I may as well
give it a second arc of some sort and bring things to completion. And
fix a few possible oversights.
TL;DR consistency and stuff
## Why It's Good For The Game
Consistency, unit test checks to make it harder not to be consistent in
the future. Still has a few TODOs like:
- [x] Fixed newly printed, fully charged RCDs costing less than the RCD
cartridges required to fully charge one. EDIT: I had to tweak the newly
added RDD as well because it suffered from the same fundamental issue.
- [x] Fixed plates being made of iron and yet shattering like ceramic
ones. A new subtype for metallic ones has been made.
## Changelog
🆑
refactor: Refactored a few things with techweb designs (the ones for
autolathes, protolathes, circuit printers, mechfabs etc.) to make sure
that the materials of items that can be made from these designs more
closely match the materials used to make them.
fix: Lizard fries no longer need a plate to be made, like all other
treats that used to require plates in a distant past.
balance: Tweaked the materials cost of RCD, RDD and RCD cartridges.
image: Oven trays now have a more metallic hue.
balance: Plates printed printed from lathes won't shatter like ceramic
ones, in virtue of them being made out of iron instead.
/🆑
## About The Pull Request
`adjust_fishing_difficulty` is a good one to make into a bespoke element
since a number of the same clothing item are created in the wardrobe
system.
climb_walkable is also good due to how prevalent it is, and it is a bit
of a two for one since it also removes the need for the
`/component/connect_loc_behalf`
Also stops adding the on_climbable trait to literally everything in the
turf, it now only applies it to atoms with density. So no more pipes and
stuff getting trait lists created for no reason.
<details><summary> Tested + things still work as before </summary>
<img width="422" height="122" alt="image"
src="https://github.com/user-attachments/assets/b23696f5-cd16-4150-aeb3-14ea6bd256fc"
/>
</details>
## Why It's Good For The Game
Lessens overhead, fixes a bug as well.
## Changelog
🆑
fix: fixes a pushed crate not removing on_climbable trait properly off
the mob standing atop it
/🆑
## About The Pull Request
<img width="579" height="67" alt="image"
src="https://github.com/user-attachments/assets/d7a4427e-2a6e-44d3-94ba-c90a2d474984"
/>
Simple rotation components number in the 8-9k range per round, and each
contains a needless callback datum as well.
These do not need to hold any state and can be bespoke elements, and the
proc to do things post_rotation can just be a normal atom proc.
<details><summary>Still works as you'd expect, including items that have
flag requirements like the wrench</summary>


</details>
## Why It's Good For The Game
Makes a heavily used element much more lightweight, saves a few mb of
memory.
## Changelog
🆑
refactor: simple rotation component has been refactored into an element
Please report any bugs to github.
/🆑
## About The Pull Request
The "old ratty sofa" can now be crafted! Crafted version is called the
"retro sofa." Also grouped all craftable sofas under one dropdown menu
to reduce UI clutter.
<img width="702" height="439" alt="retro sofa coded"
src="https://github.com/user-attachments/assets/18a6f462-ffaf-4c8e-a64a-8247e9222578"
/>
## Why It's Good For The Game
The brown sofa looks right at home in cozy places like maints, library,
bar, even the command quarters. We had the model as a map spawn, so I
thought it'd be nice to give players the option to craft them too. Goes
well with wood! Also, reduced UI clutter by putting all sofas into one
drop-down menu.
Corrects not being able to sit on all stools
Since it's a chair
Also fixes a mob's offset when sitting on a stool - if the chair is
facing north, the mob should be behind the chair sprite.
## Why It's Good For The Game
Stools are chairs
People sit on chairs
RP level 100
## Changelog
🆑 ArchBTW
fix: Fix sitting on stools (it's a chair)
fix: Fix offset when sitting on a stool
/🆑
---------
Co-authored-by: glue0000 <230859540+glue0000@users.noreply.github.com>
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## About The Pull Request
Now: AI will break chairs they're buckled in
After PR: Ai will prefer to resist out of chairs if possible
Fixes#94222 , partially
Really I think this shouldn't be a subtree, orrrrr if it is it should be
enabled by combat.
It's weird that buckling a pet into a pet bed encourages them to get up
ASAP.
If a mob is completely docile or otherwise not trying to act, they
shouldn't freak out and break whatever they're sat in.
Alternatively pets need a behavior for seeking out a bed (but that's
more effort)
## Changelog
🆑 Melbert
fix: AI mobs will prefer to resist out of simple buckles (like being sat
in a chair or bed) rather than try to break the chair.
/🆑
## About The Pull Request
Technically, this PR introduces the cuffable_item element and the
cuffed_item status effect and their relative code.
In more player-friendly terms, this allows the ability to use handcuffs
to bind certain items to your hands by right-clicking it with a pair of
handcuffs in your active hand. This makes the item unable to be dropped,
for better or worse, until you or someone else remove said cuffs. And
no, this doesn't conflict with the ability to be handcuffed if you're
silly enough to think that.
There are more than one way to remove the cuffs. For the player with the
item cuffed to their hand, to remove the cuffs they can either click the
status alert, or examine the item and click the relative hyperlink. The
second option is good to have if for some reason the status alert
doesn't show up (too many alerts etc.).
For other people, they can remove the cuffs by opening the strip
inventory menu (the one you open by click-dragging the sprite of person
with the item onto yours). It's an alternative action specific to this
status effect (therefore only held items). Until the cuffs are removed,
trying to remove the item **directly** will bring you nowhere **because
the item is stuck to their hands**, duh. Alternatively you can just chop
their arm off. You do what you do.
For a list of items that can be bound with cuffs (suggestions welcome):
- briefcases
- toolboxes
- lockboxes
- first aid kits
- shields (they generally have handles and all. gameplay-wise they
already take away one hand slot to use. Using cuffs seals the deal: no
swapping items on the go, so no two-handed weapons, but you won't drop
the shield until it's broken)
- jerrycans (Kryson's suggestion)
- soup pots (ditto, kinda weird)
- coffee mugs, and the mauna mug (ditto)
- buckets
- plushes (silly stuff, if you ever want to arrest a plush or test the
feature)
- pet carriers
- mining drills
- swords with closed guards (ERT chainsaw-sword, cap's sabre, parsnip
sabre, cutlass, e-cutlass...)
- crutches and the white cane
- baskets
- flashlights and lamps (not subtypes like flares, glowsticks and
torches)
- TTVs
- chairs
## Why It's Good For The Game
This opens up for some emergent use for handcuffs beside people (or
prisoner shoes). Inspired by a scene of some 1998 action movie, where
one of the bad guys had the mc guffin briefcase latched to his wrist
with a pair of handcuffs.
Codewise, it was also a reason to refactor bits of code like handcuffs
and screen alerts slightly. On a sidenote, actual sprites for
cult/heretic shackles.
## Changelog
🆑
add: You can now bind certain items like briefcases, toolboxes, medkits,
shields, jerrycans etc. to your hand with a pair of handcuffs,
preventing them from being dropped. You can remove said binds at any
time unless incapacitated, and so can others through the strip inventory
menu.
qol: The appearance of a screen alert now updates if the object it
represents (like, an item offered by another player) changes appearance.
imageadd: The shadow shackles item (from cult magic and heretic
sacrifices) now has its own icon.
/🆑
## About The Pull Request
1. Adds Handrails, currently mapper only. [Sprite ported from
Baystation](https://github.com/Baystation12/Baystation12/blob/dev/icons/obj/structures/handrail.dmi).
This is just a small fluff object designed to be put onto shuttles.
Players can click on it (or mouse drop) to buckle to it (grab it),
keeping them from being thrown around on shuttle launch.

2. Adds Shuttle chair restraints. [Sprite ported from
Aurora](https://github.com/Aurorastation/Aurora.3/blob/master/icons/obj/structure/chairs.dmi),
though altered a decent amount. They flip up with no one seated and flip
down when someone buckles, but they have no gameplay effects (ie, they
don't require a do-after, they don't block hands, etc etc)


3. Some objects now have unique feedback messages for buckling - you sit
on chairs, or lay down on beds. This message will change depending on if
the mob is restrained, so it's a bit more obvious when someone is tied
to a chair vs just sitting down.

4. If you're buckled on a shuttle which has "knockdown" force, you won't
be paralyzed - instead, just knocked down and immobilized for a short
period (so you can still use your hands / act).
## Why It's Good For The Game
1. Gives mappers some additional fluff for shuttles, especially if their
shuttle has knockdown force.
2. Adds muh immersion to shuttle rides. Just a flavor thing.
3. Adds muh immersion to sitting down at the bar. Again just a flavor
thing.
4. I did this to make handrails work, but I can find an alternate
workaround if so desired.
## Changelog
🆑 Melbert, sprites from Baystation / Aurorastation
add: Adds grabbable handrails (mapper only for now)
image: Adds a visual effect to buckling to shuttle seats
qol: Different objects have different chat messages for buckling.
qol: If you're buckled in on a violent shuttle ride, you will be knocked
down and immobilized, but not fully stunned (ie: can still use hands).
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
1. Adds Handrails, currently mapper only. [Sprite ported from
Baystation](https://github.com/Baystation12/Baystation12/blob/dev/icons/obj/structures/handrail.dmi).
This is just a small fluff object designed to be put onto shuttles.
Players can click on it (or mouse drop) to buckle to it (grab it),
keeping them from being thrown around on shuttle launch.

2. Adds Shuttle chair restraints. [Sprite ported from
Aurora](https://github.com/Aurorastation/Aurora.3/blob/master/icons/obj/structure/chairs.dmi),
though altered a decent amount. They flip up with no one seated and flip
down when someone buckles, but they have no gameplay effects (ie, they
don't require a do-after, they don't block hands, etc etc)


3. Some objects now have unique feedback messages for buckling - you sit
on chairs, or lay down on beds. This message will change depending on if
the mob is restrained, so it's a bit more obvious when someone is tied
to a chair vs just sitting down.

4. If you're buckled on a shuttle which has "knockdown" force, you won't
be paralyzed - instead, just knocked down and immobilized for a short
period (so you can still use your hands / act).
## Why It's Good For The Game
1. Gives mappers some additional fluff for shuttles, especially if their
shuttle has knockdown force.
2. Adds muh immersion to shuttle rides. Just a flavor thing.
3. Adds muh immersion to sitting down at the bar. Again just a flavor
thing.
4. I did this to make handrails work, but I can find an alternate
workaround if so desired.
## Changelog
🆑 Melbert, sprites from Baystation / Aurorastation
add: Adds grabbable handrails (mapper only for now)
image: Adds a visual effect to buckling to shuttle seats
qol: Different objects have different chat messages for buckling.
qol: If you're buckled in on a violent shuttle ride, you will be knocked
down and immobilized, but not fully stunned (ie: can still use hands).
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
Revival of https://github.com/tgstation/tgstation/pull/86482, which is
even more doable now that we have rustg iconforge generation.
What this PR does:
- Sets up every single GAGS icon in the game to have their own preview
icon autogenerated during compile. This is configurable to not run
during live. The icons are created in `icons/map_icons/..`
- This also has the side effect of providing accurate GAGS icons for
things like the loadout menu. No more having to create your own
previews.

<details><summary>Mappers rejoice!</summary>


</details>
<details><summary>Uses iconforge so it does not take up much time during
init</summary>

</details>
---
this still applies:
Note for Spriters:
After you've assigned the correct values to vars, you must run the game
through init on your local machine and commit the changes to the map
icon dmi files. Unit tests should catch all cases of forgetting to
assign the correct vars, or not running through init.
Note for Server Operators:
In order to not generate these icons on live I've added a new config
entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in
the config.txt
No more error icons in SDMM and loadout.
🆑
refactor: preview icons for greyscale items are now automatically
generated, meaning you can see GAGS as they actually appear ingame while
mapping or viewing the loadout menu.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Revival of https://github.com/tgstation/tgstation/pull/86482, which is
even more doable now that we have rustg iconforge generation.
What this PR does:
- Sets up every single GAGS icon in the game to have their own preview
icon autogenerated during compile. This is configurable to not run
during live. The icons are created in `icons/map_icons/..`
- This also has the side effect of providing accurate GAGS icons for
things like the loadout menu. No more having to create your own
previews.

<details><summary>Mappers rejoice!</summary>


</details>
<details><summary>Uses iconforge so it does not take up much time during
init</summary>

</details>
---
### Copied from https://github.com/tgstation/tgstation/pull/86482 as
this still applies:
Note for Spriters:
After you've assigned the correct values to vars, you must run the game
through init on your local machine and commit the changes to the map
icon dmi files. Unit tests should catch all cases of forgetting to
assign the correct vars, or not running through init.
Note for Server Operators:
In order to not generate these icons on live I've added a new config
entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in
the config.txt
## Why It's Good For The Game
No more error icons in SDMM and loadout.
## Changelog
🆑
refactor: preview icons for greyscale items are now automatically
generated, meaning you can see GAGS as they actually appear ingame while
mapping or viewing the loadout menu.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Melee attack chain now has a list passed along with it,
`attack_modifiers`, which you can stick force modifiers to change the
resulting attack
This is basically a soft implementation of damage packets until a more
definitive pr, but one that only applies to item attack chain, and not
unarmed attacks.
This change was done to facilitate a baton refactor - batons no longer
hack together their own attack chain, and are now integrated straight
into the real attack chain. This refactor itself was done because batons
don't send any attack signals, which has been annoying in the past (for
swing combat).
🆑 Melbert
refactor: Batons have been refactored again. Baton stuns now properly
count as an attack, when before it was a nothing. Report any oddities,
particularly in regards to harmbatonning vs normal batonning.
refactor: The method of adjusting item damage mid-attack has been
refactored - some affected items include the Nullblade and knives.
Report any strange happenings with damage numbers.
refactor: A few objects have been moved to the new interaction chain -
records consoles, mawed crucible, alien weeds and space vines, hedges,
restaurant portals, and some mobs - to name a few.
fix: Spears only deal bonus damage against secure lockers, not all
closet types (including crates)
/🆑
## About The Pull Request
Melee attack chain now has a list passed along with it,
`attack_modifiers`, which you can stick force modifiers to change the
resulting attack
This is basically a soft implementation of damage packets until a more
definitive pr, but one that only applies to item attack chain, and not
unarmed attacks.
This change was done to facilitate a baton refactor - batons no longer
hack together their own attack chain, and are now integrated straight
into the real attack chain. This refactor itself was done because batons
don't send any attack signals, which has been annoying in the past (for
swing combat).
## Changelog
🆑 Melbert
refactor: Batons have been refactored again. Baton stuns now properly
count as an attack, when before it was a nothing. Report any oddities,
particularly in regards to harmbatonning vs normal batonning.
refactor: The method of adjusting item damage mid-attack has been
refactored - some affected items include the Nullblade and knives.
Report any strange happenings with damage numbers.
refactor: A few objects have been moved to the new interaction chain -
records consoles, mawed crucible, alien weeds and space vines, hedges,
restaurant portals, and some mobs - to name a few.
fix: Spears only deal bonus damage against secure lockers, not all
closet types (including crates)
/🆑
People can now pet held mothroaches and pugs if they want to, or use
items on them, hopefully without causing many issues. After all, it only
took about a couple dozen lines of code to make...
...Oh, did the 527 files changed or the 850~ lines added/removed perhaps
catch your eye? Made you wonder if I accidentally pushed the wrong
branch? or skewed something up big time? Well, nuh uh. I just happen to
be fed up with the melee attack chain still using stringized params
instead of an array/list. It was frankly revolting to see how I'd have
had to otherwise call `list2params` for what I'm trying to accomplish
here, and make this PR another tessera to the immense stupidity of our
attack chain procs calling `params2list` over and over and over instead
of just using that one call instance from `ClickOn` as an argument. It's
2025, honey, wake up!
I also tried to replace some of those single letter vars/args but there
are just way too many of them.
Improving old code. And I want to be able to pet mobroaches while
holding them too.
🆑
qol: You can now interact with held mobs in more ways beside wearing
them.
/🆑
## About The Pull Request
People can now pet held mothroaches and pugs if they want to, or use
items on them, hopefully without causing many issues. After all, it only
took about a couple dozen lines of code to make...
...Oh, did the 527 files changed or the 850~ lines added/removed perhaps
catch your eye? Made you wonder if I accidentally pushed the wrong
branch? or skewed something up big time? Well, nuh uh. I just happen to
be fed up with the melee attack chain still using stringized params
instead of an array/list. It was frankly revolting to see how I'd have
had to otherwise call `list2params` for what I'm trying to accomplish
here, and make this PR another tessera to the immense stupidity of our
attack chain procs calling `params2list` over and over and over instead
of just using that one call instance from `ClickOn` as an argument. It's
2025, honey, wake up!
I also tried to replace some of those single letter vars/args but there
are just way too many of them.
## Why It's Good For The Game
Improving old code. And I want to be able to pet mobroaches while
holding them too.
## Changelog
🆑
qol: You can now interact with held mobs in more ways beside wearing
them.
/🆑
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
[Removes all remaining users of SMOOTH_CORNER + dirt
automation](https://github.com/tgstation/tgstation/commit/71d120511a372501ac546b2571ef570eb4426a56)
Removes all remaining instances of overlay smoothing (the deprecated
system that stitches corners together IN ENGINE) from the game.
This amounts to:
The test smoothing wall, which I converted to just bitmask + diagonals
Stationary canisters, which I've done the same to (alongside adding all
the states to gags, which around doubled their gags count). These
autocut now.
I've also given dirt icons autocutting, for spriter convieneince (I
would have done this before but I didn't know they smoothed)
[Removes corner smoothing from the
codebase](https://github.com/tgstation/tgstation/commit/98ebe5815223a3078c2e591fd277b9418ed03278)
This code is OLD, and has been functionally deprecated for as long as
I've been here. It basically does what bitmask smoothing does, but
instead of prebaking connections they're formed in engine with overlays.
This is... fine, and does TECHNICALLY allow for unique effects, but
none's gonna use it because the details are so niche, so it just becomes
a risk factor for someone fucking up and using overlays for some reason.
What it does do then is clutter up our smoothing code with 2 different
async systems, one of which functions SLIGHTLY differently from its
brother. IMO it just works to confuse people trying to read smoothing
code (already quite confusing).
I've removed it, alongside its bespoke code/variables, excluding
area_limited_icon_smoothing, a var on areas that prevents smoothing out
of network, which I have instead integrated into bitmask smoothing.
I've updated snowflake's documentation to be more up to date with modern
systems, and earmarked where explanations/automation for the more...
underdeveloped bits of smoothing should go in the future.
## Why It's Good For The Game
I relapsed and needed something to put that energy towards.
We don't really want people to use this, and none knows enough about it
to take advantage of its theoretical uses.
Really its only purpose right now is making understanding diagonal
smoothing easier, and that's not all that hard of a task.
Better to remove and integrate then to let rot and confuse.
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
add: Smoothed objects on shuttles now will only smooth with other
shuttles (added support for extensions of this system)
refactor: I've funked around with our smoothing system, cutting out some
older code. Lemme know if anything is weird PLEASE
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
Fixes#85980
- Pixel adjustments are now sourced
When tweaking a mob's pixel w, x, y, z, is is now done via `add_offsets`
and must have a source string associated
- Refactors riding
Refactors how riding component selects the offsets to use. It's now all
done via the getter rather than a weird mix of a var, a cache, and a
getter.
- Moves a bunch of animations to use `pixel_w` / `pixel_z`
Largely to prevent conflicts with adjustments to a mob's pixel position,
but also as many animations are not actual movements, but visual
movements. Floating is one such example.
It just works
🆑 Melbert
fix: Fixed grab offsets not showing for anything but passive grab
fix: Fix jank with mob offsets when riding things
refactor: Refactored riding component, particularly how it selects layer
and offsets. Report any oddities
refactor: Refactored pixel offsets of mobs. Report any oddities
/🆑
## About The Pull Request
Fixes#85980
- Pixel adjustments are now sourced
When tweaking a mob's pixel w, x, y, z, is is now done via `add_offsets`
and must have a source string associated
- Refactors riding
Refactors how riding component selects the offsets to use. It's now all
done via the getter rather than a weird mix of a var, a cache, and a
getter.
- Moves a bunch of animations to use `pixel_w` / `pixel_z`
Largely to prevent conflicts with adjustments to a mob's pixel position,
but also as many animations are not actual movements, but visual
movements. Floating is one such example.
## Why It's Good For The Game
It just works
## Changelog
🆑 Melbert
fix: Fixed grab offsets not showing for anything but passive grab
fix: Fix jank with mob offsets when riding things
refactor: Refactored riding component, particularly how it selects layer
and offsets. Report any oddities
refactor: Refactored pixel offsets of mobs. Report any oddities
/🆑
## About The Pull Request
Adds slips to the list of existing shove stun methods originally set in
https://github.com/tgstation/tgstation/pull/84640 (wall shoves,
telebaton, mansus grasp), and also reifies this concept as the "dazed"
status effect.
This makes it so that being knocked down from a slip from any source
(e.g. wet floor, clown stuff, lube, foam, oil, butterdog) gives the
dazed visual effect and makes you eligible for being shove stunned. The
status always lasts for 3 seconds even if e.g. slipping on lube knocks
you down for 15, but this can be customized per slip.
## Why It's Good For The Game
Further rewards environmental play and provides another feasible means
of fighting back against better equipped opponents, both in line with
the original PR. Also the visual cue fits well as an immediate signal
that you're dazed and can't get up.
## Changelog
🆑
balance: slips now make you eligible for being shove stunned
/🆑
---------
Co-authored-by: Roryl-c <5150427+Roryl-c@users.noreply.github.com>
## About The Pull Request
Commit messages should be descriptive of all changes.
The "incorrect `\The` macro capitalization" was intentional when it was
added, but as far as I know TG says "the supermatter" rather than "The
Supermatter," so it's incorrect now.
This is completely untested. I don't even know how you'd go about
testing this, it's just a fuckton of strings.
Someday I want to extract them and run NLP on it to catch grammar
problems...
## Why It's Good For The Game
Basic grammar pass for name strings. Should make `\the` work better and
avoid cases like `the John Smith`.
## About The Pull Request
This is the first PR in a series attempting to modernize our damage and
armor, both from a code and a gameplay perspective. This part implements
unique attack animations, adds alternate attack modes for items and
fixes some minor oversights.
Items now have unique attack animation based on their sharpness - sharp
items are now swung in an arc, while pointy items are thrust forward.
This change is ***purely visual***, this is not swing combat. (However,
this does assign icon rotation data to many items, which should help
swing combat later down the line).
Certain items like knives and swords now have secondary attacks - right
clicks will perform stabbing attacks instead of slashing for a chance to
leave piercing wounds, albeit with slightly lower damage - trying to
stick a katana through someone won't get you very far!
https://github.com/user-attachments/assets/1f92bbcd-9aa1-482f-bc26-5e84fe2a07e1
Turns out that spears acted as oversized knives this entire time, being
SHARP_EDGED instead of SHARP_POINTY - in order for their animations to
make sense, they're now once again pointy (according to comment,
originally they were made sharp because piercing wounds weren't very
threatening, which is no longer the case)
Another major change is that structure damage is now influenced by armor
penetration - I am not sure if this is intentional or not, but attacking
item's AP never applied to non-mob damage.
Additionally, also fixes an issue where attack verbs for you and
everyone else may differ.
## About The Pull Request
Closes#87221 by changing overlay layers when a mob is buckled to the
chair.
## Changelog
🆑
fix: Fixed electrified chair overlay layering
/🆑
## About The Pull Request
Closes#87222
armrest code doesnt have to be copied thrice if it can be on chairs with
a var to control if its actually used
## Changelog
🆑
fix: Bronze chairs will automatically spin once more
/🆑
# Conflicts:
# code/game/objects/structures/beds_chairs/chair.dm
# code/game/objects/structures/beds_chairs/sofa.dm
## About The Pull Request
This stops people from using chairs to create free metal. It was
possible to pick up a chair or place it down and it would lose it's
hologram status since a new object is created.
Now anyone that attempts to place down or pick up a chair will have it
vanish.
## Why It's Good For The Game
No more free metal.
## Changelog
🆑
fix: Fix using chairs in holodeck to create infinite metal
/🆑
## About The Pull Request
This PR kills the abstract internal and external typepaths for organs,
now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds.
This PR also fixes fox ears (from #87162, no tail is added) and
mushpeople's caps (they should be red, the screenshot is a tad
outdated).
And yes, you can now use a hair dye spray to recolor body parts like
most tails, podpeople hair, mushpeople caps and cat ears. The process
can be reversed by using the spray again.
## Why It's Good For The Game
Time-Green put some effort during the last few months to untie functions
and mechanics from external/internal organ pathing. Now, all that this
pathing is good for are a few typechecks, easily replaceable with
bitflags.
Also podpeople and mushpeople need a way to recolor their "hair". This
kind of applies to fish tails from the fish infusion, which colors can't
be selected right now. The rest is just there if you ever want to
recolor your lizard tail for some reason.
Proof of testing btw (screenshot taken before mushpeople cap fix, right
side has dyed body parts, moth can't be dyed, they're already fabolous):

## Changelog
🆑
code: Removed internal/external pathing from organs in favor of a bit
flag. Hopefully this shouldn't break anything about organs.
fix: Fixed invisible fox ears.
fix: Fixed mushpeople caps not being colored red by default.
add: You can now dye most tails, podpeople hair, mushpeople caps etc.
with a hair dye spray.
/🆑
## About The Pull Request
Adds a name to the office chair obj and its light variants describing
them as "office chair". Additionally removes the custom name "blue" from
the blue variant of light office chair in birdshot.
## Why It's Good For The Game
Chairs are not lights and therefore need names that include "chair"
Fixes#87501
## Changelog
🆑
fix: certain office chairs are now properly labelled
/🆑