Files
necromanceranne 410cebd7d1 Sleeping Carp: Unarmored Defense Edition (#93466)
## About The Pull Request

Reworks Sleeping Carp significantly.

### Returning Moves: Stomach Knee and Wrist Wrench

Stomach Knee, much like the previous incarnation, causes the victim to
be winded and stunned, though this version only briefly stuns the
victim. It also deals stamina damage and silences the victim for five
seconds. It is performed by a Grab Punch combo. Named Kraken Wrack.

Wrist Wrench, much like the previous incarnation, disarms the victim of
their held items. It also potentially dislocates or breaks their arm, as
it rolls with a very high wound chance. It is performed by a Harm Grab
combo. Stole Gnashing Teeth's name.

### Gnashing Teeth (as it was) is gone

This move didn't do very much at all other than being a harmful punch
with more damage. Throwing a bunch of normal punches won't result in
anything now.

### Harm Punches are no longer have special overrides, but Sleeping Carp
does grant perfect accuracy.

Rather than use a bespoke override, Sleeping Carp now merely uses your
normal unarmed punch for its standard normal punch. However, rather than
leave things to chance, Sleeping Carp grants you perfect accuracy with
those standard punches.

### Grabs are treated as one stage higher

Now that martial arts can directly interact with grab state, as well as
some prior changes to how effective compared to actual grab state is
determined, I've reintroduced Sleeping Carp's stickier grabbing by
making it so that they elevate the effective grab state by one stage.

This is not instant aggro-grabbing like they used to have. This just
makes it so that if they try to resist out of a passive grab, they may
fail as though it was an aggressive grab, but it won't stun them until
it is elevated to a proper aggressive grab.

### What you wear is important for determining the effectiveness of your
Attack Dodging (and attack dodging is broader)

Sleeping Carp's projectile dodging and now attack dodging is based on
whether or not you're 'on theme'. That is, if you are wearing nautical
themed clothing and other factors.

At a baseline, Sleeping Carp has perfect projectile dodging and no
melee/unarmed avoidance.

To improve your chances, you need to;

- Wear martial arts or carp themed clothing on your head. (20% if one is
present, but it only counts one)
- Wear martial arts or carp themed clothing on your chest (20% if one is
present, but only counts one)
- Wear appropriate footwear, like sandals. (20%)
- Be a literal carp. (75% flat)
- Mutate yourself into a carp person. (20%)

However, your chances of avoidance diminishes if:
- You wear armored clothing on your head and chest. (based on Melee
armor)
- While lying on the floor (30%)

Holding objects diminishes your chances as well, This is based on the
weight of the object, and whether or not the object is wielded. Normal
sized objects, for instance, are -30%, and would be -60% if wielded.

It will not diminish your chances if:
- The object is Small or smaller.
- The object is an abstract object or hand grafted object and it doesn't
have block chance.
- The object is in the exceptions list.
	- **The exception list is as follows:**
	-  Nunchaku (this is spies exclusive)
	- Bo Staff (the unobtainable one)
	- Monk's Staff (the chaplain's null rod)
	- Bamboo staff
	- Cane (like, walking cane)
	- Knives
	- Bolas
	- Toolboxes
	- Spears
	- Shortswords (the ones from the medieval pirates)
	- Nullblade (it's a shortsword)
	- Extendohands (because lol)
	- Mops
	- Push Brooms
	- Baseball Bats
	- Claw Hammers
	- Carp plushies.

<details>
  <summary>A list of appropriate clothing</summary>

Headwear

- Strange Bandana (which come in the kit)
- Maid headband
- Fancy Hairpin
- Carp Mask
- Carp-skinned Fedora
- Carp Costume Hood (this comes with the costume)
- Carp Costume Spacesuit Helmet (as above)

Chestwear

- Martial Gi (which come in the kit)
- Carpskin Suit
- Carp Costume
- Carp Spacesuit
- Maid Outfit
- Kimono
- Yakuta
- Trenchcoats
- Geisha Outfit
- [Swag Outfit](https://www.youtube.com/watch?v=l6DmoPlq3S4)
- Eastern Monk's Outfit (the chaplain outfit)
- Buttoned down line of clothes
- Blazer jacket
- Lawyer jackets


Footwear
- Sandals (which come in the kit)
- Swag Shoes
- Laceup Shoes
  
</details>

As an example of being OFF theme, being in a full security outfit would
reduce your avoidance chance by a whopping 80%.

You avoid attacks while in combat mode, much like projectile deflection
does on live. You can only get up to a 75% chance melee/unarmed
avoidance.

## Why It's Good For The Game

> Returning Moves

People quite liked some of the older moves, and there weren't as many
dials around at the time to make them particularly more interesting when
I first removed them. We were aiming for an out and out stun removal as
a whole codebase, but largely we're ended up still being comfortable
with minor stuns here and there. Stomach Knee can be one of them.

Wrist Wrench was something I realized I could reintroduce with literal
limb breaking thanks to wound changes. Arm dislocations/breakages are
surprisingly rare as a wound type, and since it is an attack on a
specific arm, not quite as good for bringing someone to death, but quite
good for leaving someone with a maiming wound they now need to fix to
keep pursuing you. Highly useful for those stubborn stun immune targets,
who Sleeping Carp struggles to fight. As in, they can't really fight
them.

> Grab Stage

A bit of my work and a bit of Melbert's has resulted in this being a lot
more reasonable to reintroduce as a benefit. The original instant
aggro-grabbing was definitely very oppressive, since it was a
pseudo-hardstun that lead into a hardstun. Now this is a bit softer by
comparison, and surprisingly quite important. I think the loss of good
grabbing ended up filtering a lot of folk somewhat hard.

> Removal of the override

I was really taken with Spider Bite using baseline punches as the
groundwork for the martial art and I wanted to work into that. Not only
does it mean becoming a carp person is actually a great idea beyond the
avoidance mechanic, but also for your actual basic punches improving. It
just in general feels like it opens up possibilities in the game world
to experiment and the design of martial arts in general. We should make
more martial arts work like this.

> Avoidance

My original rework had one glaring flaw that continues to haunt it to
this day. Defense stacking on Sleeping Carp is ridiculous. Layering
defense upon defense makes the one particular immunity it grants,
projectile immunity, all the more oppressive. Hiding behind high block
and high armor makes you a menace.

The end result is that more people utilize Sleeping Carp not for the
martial art part, but for the projectile immunity part, usually using
something else instead like a baton.

This rubs me the wrong way. You would think and hope that the reason
people take the martial art is to be a goofy martial artist in space.

So, I'm implementing an idea I knew I could never pull off in the
framework at the time.

I'm implementing Unarmored Defense, bitch.

(I was totally also not inspired by Payday 2 in any fashion, nope, not
at all)

I like the idea of forcing a choice between the goofy outfit that gives
you bonuses over just getting the biggest armor you can find and
turtling like a motherfucker. And I want people to focus on the martial
arts and benefit from the martial arts when you're specifically unarmed.

Maybe right now some of the restrictions are a little severe, so if
anyone has any opinions, lemme know.

## Changelog
🆑
balance: Completely reworks Sleeping Carp, again.
balance: The return of Stomach Knee (Kraken Wrack) and Wrist Wrench
(Gnashing Teeth). Time is a flat circle.
balance: Sleeping Carp has better grabs (no instant aggro grabs)
balance: Sleeping Carp integrates normal unarmed punch by not overriding
your normal punches.
balance: Sleeping Carp's deflection weakens if you wear armored headwear
and body armor, or while carrying objects. However, by wearing martial
arts (or carp) themed outfits, you can improve your defenses instead,
allowing you to not just dodge bullets, but also incoming melee attacks.
balance: Some objects are exempt, like staff weapons (such as mops or
the monk's staff), short blades (like knives and shortswords), club-like
(baseball bats and toolboxes), or thematic (like extendo hands and carp
plushies)
balance: You can also get these improvements by being a literal carp or
being a carp person.
/🆑

---------

Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
2025-11-02 16:35:09 +00:00

215 lines
7.3 KiB
Plaintext

/obj/item/clothing/suit/jacket
icon = 'icons/obj/clothing/suits/jacket.dmi'
worn_icon = 'icons/mob/clothing/suits/jacket.dmi'
abstract_type = /obj/item/clothing/suit/jacket
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman,
/obj/item/toy,
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter,
/obj/item/radio,
)
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/jacket/Initialize(mapload)
. = ..()
allowed += GLOB.personal_carry_allowed
/obj/item/clothing/suit/toggle/jacket
icon = 'icons/obj/clothing/suits/jacket.dmi'
worn_icon = 'icons/mob/clothing/suits/jacket.dmi'
abstract_type = /obj/item/clothing/suit/toggle/jacket
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman,
/obj/item/tank/jetpack/captain,
/obj/item/toy,
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter,
/obj/item/radio,
)
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/toggle/jacket/Initialize(mapload)
. = ..()
allowed += GLOB.personal_carry_allowed
/obj/item/clothing/suit/toggle/jacket/sweater
name = "sweater jacket"
desc = "A sweater jacket."
icon = 'icons/map_icons/clothing/suit/_suit.dmi'
icon_state = "/obj/item/clothing/suit/toggle/jacket/sweater"
post_init_icon_state = "sweater"
greyscale_config = /datum/greyscale_config/sweater
greyscale_config_worn = /datum/greyscale_config/sweater/worn
greyscale_colors = "#414344"
flags_1 = IS_PLAYER_COLORABLE_1
/obj/item/clothing/suit/toggle/jacket/trenchcoat
name = "trenchcoat"
desc = "A multi-purpose trenchcoat."
icon = 'icons/map_icons/clothing/suit/_suit.dmi'
icon_state = "/obj/item/clothing/suit/toggle/jacket/trenchcoat"
post_init_icon_state = "trenchcoat"
greyscale_config = /datum/greyscale_config/trenchcoat
greyscale_config_worn = /datum/greyscale_config/trenchcoat/worn
greyscale_colors = "#414344"
flags_1 = IS_PLAYER_COLORABLE_1
blood_overlay_type = "coat"
flags_inv = HIDEBELT
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR // I know kung-fu
/obj/item/clothing/suit/toggle/jacket/trenchcoat/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/blazer
name = "blazer jacket"
desc = "A blazer jacket."
icon = 'icons/map_icons/clothing/suit/_suit.dmi'
icon_state = "/obj/item/clothing/suit/jacket/blazer"
post_init_icon_state = "blazer"
greyscale_config = /datum/greyscale_config/blazer
greyscale_config_worn = /datum/greyscale_config/blazer/worn
greyscale_colors = "#414344"
flags_1 = IS_PLAYER_COLORABLE_1
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/suit/jacket/oversized
name = "oversized jacket"
desc = "An oversized jacket."
icon = 'icons/map_icons/clothing/suit/_suit.dmi'
icon_state = "/obj/item/clothing/suit/jacket/oversized"
post_init_icon_state = "jacket_oversized"
greyscale_config = /datum/greyscale_config/jacket_oversized
greyscale_config_worn = /datum/greyscale_config/jacket_oversized/worn
greyscale_colors = "#414344"
flags_1 = IS_PLAYER_COLORABLE_1
/obj/item/clothing/suit/jacket/fancy
name = "fancy fur coat"
desc = "Rated 10 out of 10 in Cosmo for best coat brand."
icon = 'icons/map_icons/clothing/suit/_suit.dmi'
icon_state = "/obj/item/clothing/suit/jacket/fancy"
post_init_icon_state = "fancy_coat"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
greyscale_config = /datum/greyscale_config/fancy_coat
greyscale_config_worn = /datum/greyscale_config/fancy_coat/worn
greyscale_colors = "#EDE3DC#414344"
flags_1 = IS_PLAYER_COLORABLE_1
/obj/item/clothing/suit/jacket/bomber
name = "bomber jacket"
desc = "Aviators not included."
icon_state = "bomberjacket"
inhand_icon_state = "brownjsuit"
/obj/item/clothing/suit/jacket/bomber/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "Pompadour not included."
icon_state = "leatherjacket"
inhand_icon_state = "hostrench"
resistance_flags = NONE
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
/obj/item/clothing/suit/jacket/leather/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/leather/biker
name = "biker jacket"
desc = "You think I'm not even worth a single dollar, but I feel like a millionare."
icon_state = "leatherjacket_biker"
/obj/item/clothing/suit/jacket/puffer
name = "puffer jacket"
desc = "A thick jacket with a rubbery, water-resistant shell."
icon_state = "pufferjacket"
inhand_icon_state = "hostrench"
armor_type = /datum/armor/jacket_puffer
/datum/armor/jacket_puffer
bio = 50
/obj/item/clothing/suit/jacket/puffer/vest
name = "puffer vest"
desc = "A thick vest with a rubbery, water-resistant shell."
icon_state = "puffervest"
inhand_icon_state = "armor"
body_parts_covered = CHEST|GROIN
cold_protection = CHEST|GROIN
armor_type = /datum/armor/puffer_vest
/datum/armor/puffer_vest
bio = 30
/obj/item/clothing/suit/jacket/miljacket
name = "military jacket"
desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable."
icon_state = "militaryjacket"
inhand_icon_state = null
/obj/item/clothing/suit/jacket/miljacket/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/letterman
name = "letterman jacket"
desc = "A classic brown letterman jacket. Looks pretty hot and heavy."
icon_state = "letterman"
inhand_icon_state = null
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/jacket/letterman/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/letterman_red
name = "red letterman jacket"
desc = "A letterman jacket in a sick red color. Radical."
icon_state = "letterman_red"
inhand_icon_state = null
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/jacket/letterman_red/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/letterman_syndie
name = "blood-red letterman jacket"
desc = "Oddly, this jacket seems to have a large S on the back..."
icon_state = "letterman_s"
inhand_icon_state = null
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/jacket/letterman_syndie/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed
/obj/item/clothing/suit/jacket/letterman_nanotrasen
name = "blue letterman jacket"
desc = "A blue letterman jacket with a proud Nanotrasen N on the back. The tag says that it was made in Space China."
icon_state = "letterman_n"
inhand_icon_state = null
species_exception = list(/datum/species/golem)
/obj/item/clothing/suit/jacket/letterman_nanotrasen/Initialize(mapload)
. = ..()
allowed += GLOB.improvised_firearm_allowed