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>
This commit is contained in:
necromanceranne
2025-11-03 03:35:09 +11:00
committed by GitHub
parent d20709617d
commit 410cebd7d1
17 changed files with 236 additions and 56 deletions

View File

@@ -95,6 +95,8 @@
#define HEADINTERNALS (1<<16)
/// Prevents masks from getting adjusted from enabling internals
#define INTERNALS_ADJUST_EXEMPT (1<<17)
/// Indicates that the piece of clothing contributes towards Sleeping Carp's style factor, which determines evasion probabilities. See /datums/martial/sleeping_carp/carp_style_check().
#define CARP_STYLE_FACTOR (1<<18)
/// Integrity defines for clothing (not flags but close enough)
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing

View File

@@ -1,66 +1,101 @@
#define STRONG_PUNCH_COMBO "HH"
#define WRIST_WRENCH_COMBO "HG"
#define LAUNCH_KICK_COMBO "HD"
#define DROP_KICK_COMBO "DD"
#define KNEE_STOMACH_COMBO "GH"
/datum/martial_art/the_sleeping_carp
name = "The Sleeping Carp"
id = MARTIALART_SLEEPINGCARP
help_verb = /mob/living/proc/sleeping_carp_help
display_combos = TRUE
grab_state_modifier = 1
/// List of traits applied to users of this martial art.
var/list/scarp_traits = list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER, TRAIT_HEAVY_SLEEPER)
var/list/scarp_traits = list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER, TRAIT_HEAVY_SLEEPER, TRAIT_PERFECT_ATTACKER)
/// List of objects exempt from reducing dodge probabilities
var/list/exempt_objects = list(
/obj/item/melee/baton/nunchaku,
/obj/item/staff/bostaff,
/obj/item/bambostaff,
/obj/item/cane,
/obj/item/nullrod/bostaff,
/obj/item/knife,
/obj/item/restraints/legcuffs/bola,
/obj/item/storage/toolbox,
/obj/item/spear,
/obj/item/claymore/shortsword,
/obj/item/nullrod/nullblade,
/obj/item/extendohand,
/obj/item/mop,
/obj/item/pushbroom,
/obj/item/melee/baseball_bat,
/obj/item/crowbar/hammer,
/obj/item/toy/plush/carpplushie,
)
/datum/martial_art/the_sleeping_carp/activate_style(mob/living/new_holder)
. = ..()
new_holder.add_traits(scarp_traits, SLEEPING_CARP_TRAIT)
RegisterSignal(new_holder, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby))
RegisterSignal(new_holder, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile))
RegisterSignal(new_holder, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_dodge))
new_holder.faction |= FACTION_CARP //:D
new_holder.grant_language(/datum/language/carptongue, ALL, type)
/datum/martial_art/the_sleeping_carp/deactivate_style(mob/living/remove_from)
remove_from.remove_traits(scarp_traits, SLEEPING_CARP_TRAIT)
UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT))
UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_LIVING_CHECK_BLOCK))
remove_from.faction -= FACTION_CARP //:(
remove_from.remove_language(/datum/language/carptongue, ALL, type)
return ..()
/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/attacker, mob/living/defender)
if(findtext(streak,STRONG_PUNCH_COMBO))
if(findtext(streak,WRIST_WRENCH_COMBO))
reset_streak()
return strongPunch(attacker, defender)
return wrist_wrench(attacker, defender)
if(findtext(streak,LAUNCH_KICK_COMBO))
reset_streak()
return launchKick(attacker, defender)
return launch_kick(attacker, defender)
if(findtext(streak,DROP_KICK_COMBO))
reset_streak()
return dropKick(attacker, defender)
return drop_kick(attacker, defender)
if(findtext(streak,KNEE_STOMACH_COMBO))
reset_streak()
return knee_stomach(attacker, defender)
return FALSE
///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch
/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/attacker, mob/living/defender)
// this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating
var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected))
/// Gnashing Teeth: Harm Grab, twists and possibly breaks the target's arm, disarming them.
/datum/martial_art/the_sleeping_carp/proc/wrist_wrench(mob/living/attacker, mob/living/defender)
// Determine if our defender is a carbon. If not, we don't wrist wrench
if(!iscarbon(defender))
return FALSE
// Determine if our target has a functioning active arm. If not, return.
var/obj/item/bodypart/affecting = defender.get_active_hand()
if(!affecting)
return FALSE
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam")
defender.visible_message(
span_danger("[attacker] [atk_verb]s [defender]!"),
span_userdanger("[attacker] [atk_verb]s you!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
span_danger("[attacker] violently twists [defender]'s [affecting]!"),
span_userdanger("[attacker] violently twists your [affecting]!"),
span_hear("You hear a sickening sound of bone snapping!"),
null,
attacker,
)
to_chat(attacker, span_danger("You [atk_verb] [defender]!"))
to_chat(attacker, span_danger("You violently twist [defender]'s [affecting]!"))
playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(attacker, defender, "strong punched (Sleeping Carp)")
defender.apply_damage(20, attacker.get_attack_type(), affecting)
log_combat(attacker, defender, "wrist wrenched (Sleeping Carp)")
defender.apply_damage(20, BRUTE, affecting, wound_bonus = 30)
defender.drop_all_held_items()
return TRUE
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/attacker, mob/living/defender)
/// Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
/datum/martial_art/the_sleeping_carp/proc/launch_kick(mob/living/attacker, mob/living/defender)
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
defender.visible_message(
span_warning("[attacker] kicks [defender] square in the chest, sending them flying!"),
@@ -76,8 +111,8 @@
log_combat(attacker, defender, "launchkicked (Sleeping Carp)")
return TRUE
///Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground.
/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/attacker, mob/living/defender)
/// Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground.
/datum/martial_art/the_sleeping_carp/proc/drop_kick(mob/living/attacker, mob/living/defender)
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
if(defender.body_position == STANDING_UP)
@@ -94,6 +129,25 @@
log_combat(attacker, defender, "dropkicked (Sleeping Carp)")
return TRUE
/// Kraken Wrack: Grab Harm combo, causes them to be silenced and briefly stunned, as well as doing a moderate amount of stamina damage.
/datum/martial_art/the_sleeping_carp/proc/knee_stomach(mob/living/attacker, mob/living/defender)
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
defender.visible_message(
span_warning("[attacker] violently slams [attacker.p_their()] knee into [defender]!"),
span_userdanger("You slam your knee straight into [defender]!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
COMBAT_MESSAGE_RANGE,
attacker,
)
defender.apply_damage(20, STAMINA)
defender.Paralyze(1 SECONDS)
defender.adjust_silence_up_to(5 SECONDS, 5 SECONDS)
if(defender.losebreath <= 10)
defender.losebreath = clamp(defender.losebreath + 5, 0, 10)
log_combat(attacker, defender, "kneed in the stomach (Sleeping Carp)")
return TRUE
/datum/martial_art/the_sleeping_carp/grab_act(mob/living/attacker, mob/living/defender)
if(!can_deflect(attacker)) //allows for deniability
return MARTIAL_ATTACK_INVALID
@@ -142,29 +196,11 @@
defender.investigate_log("has had [defender.p_their()] neck snapped by [attacker].", INVESTIGATE_DEATHS)
return MARTIAL_ATTACK_SUCCESS
var/atk_verb = pick("kick", "chop", "hit", "slam")
var/final_damage = rand(10, 15)
if(defender.check_block(attacker, final_damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK))
return MARTIAL_ATTACK_FAIL
add_to_streak("H", defender)
if(check_streak(attacker, defender))
return MARTIAL_ATTACK_SUCCESS
var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected))
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
defender.visible_message(
span_danger("[attacker] [atk_verb]s [defender]!"),
span_userdanger("[attacker] [atk_verb]s you!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
null,
attacker,
)
to_chat(attacker, span_danger("You [atk_verb] [defender]!"))
defender.apply_damage(final_damage, attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND)
playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(attacker, defender, "punched (Sleeping Carp)")
return MARTIAL_ATTACK_SUCCESS
return MARTIAL_ATTACK_INVALID // normal punch
/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/attacker, mob/living/defender)
if(!can_deflect(attacker)) //allows for deniability
@@ -198,9 +234,25 @@
/datum/martial_art/the_sleeping_carp/proc/hit_by_projectile(mob/living/carp_user, obj/projectile/hitting_projectile, def_zone)
SIGNAL_HANDLER
var/determine_avoidance = 100
var/additional_adjustments = 0
if(istype(hitting_projectile, /obj/projectile/bullet/c38/match/true)) // 75% chance to ignore evasion
additional_adjustments -= 75
determine_avoidance = clamp(determine_avoidance + carp_style_check(carp_user) + additional_adjustments, 0, 100)
if(istype(hitting_projectile, /obj/projectile/bullet/harpoon)) // WHITE WHALE HOLY GRAIL
return NONE
if(!can_deflect(carp_user))
return NONE
if(!prob(determine_avoidance))
return NONE
carp_user.visible_message(
span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"),
span_userdanger("You deflect [hitting_projectile]!"),
@@ -210,7 +262,7 @@
hitting_projectile.set_angle(rand(0, 360))//SHING
return COMPONENT_BULLET_PIERCED
///Signal from getting attacked with an item, for a special interaction with touch spells
/// Signal from getting attacked with an item, for a special interaction with touch spells
/datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carp_user, obj/item/attack_weapon, mob/attacker, list/modifiers)
SIGNAL_HANDLER
@@ -225,6 +277,100 @@
)
return COMPONENT_NO_AFTERATTACK
/// If our user has committed to being as nautically radical as they can be, they may be able to avoid incoming attacks.
/datum/martial_art/the_sleeping_carp/proc/check_dodge(mob/living/carp_user, atom/movable/hitby, damage, attack_text, attack_type, ...)
SIGNAL_HANDLER
var/determine_avoidance = clamp(carp_style_check(carp_user), 0, 75)
if(!can_deflect(carp_user))
return
if(attack_type == PROJECTILE_ATTACK || attack_type == THROWN_PROJECTILE_ATTACK)
return NONE
if(!prob(determine_avoidance))
return NONE
carp_user.visible_message(
span_danger("[carp_user] cleanly avoids [attack_text] with incredible speed!"),
span_userdanger("You dodge [attack_text]"),
)
playsound(carp_user.loc, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1)
return SUCCESSFUL_BLOCK
/* Determines how 'carp-y' or how 'martial arts-y' we are, granting us the ability to avoid attacks.
* At a baseline, we will always avoid projectile attacks, but we may not necessarily avoid other attacks.
* If we wear carp based clothing, or martial arts based clothing, we improve our style factor.
* If we are a carp mutant, we improve our style factor.
* If we literally are a carp, we just assume we're very carpy and return our max value.
* If we wear a lot of armor, we reduce our style factor. Some martial arts or carp items may result in a net netural bonus.
* If there is anything in our hands, we're also less likely to avoid attacks.
*/
/datum/martial_art/the_sleeping_carp/proc/carp_style_check(mob/living/carp_user)
// An evaluation of how 'carp' we are.
var/style_factor_points = 0
if(istype(carp_user, /mob/living/basic/space_dragon) || istype(carp_user, /mob/living/basic/carp))
return 100
if(!ishuman(carp_user)) // We're not concerned about nonhumans here, we can assume we've covered any relevant mobs by checking for carp.
return 0
var/mob/living/carbon/human/human_carp_user = carp_user
var/obj/item/bodypart/potential_head = human_carp_user.get_bodypart(BODY_ZONE_HEAD)
var/obj/item/bodypart/potential_chest = human_carp_user.get_bodypart(BODY_ZONE_CHEST)
var/obj/item/clothing/is_it_the_shoes = human_carp_user.get_item_by_slot(ITEM_SLOT_FEET)
// The presence of armor is a style malus
var/oh_no_armor = 0
// Lets look to see if any relevant headwear is armored or on theme
for(var/obj/item/clothing/possible_headbands in human_carp_user.get_clothing_on_part(potential_head))
if(possible_headbands.clothing_flags & CARP_STYLE_FACTOR)
style_factor_points += 20 // Basically, you only need one chest level item to contribute
oh_no_armor += human_carp_user.run_armor_check(potential_head, MELEE)
// Then let's look for any chest clothing that is either armored or on theme
for(var/obj/item/clothing/possible_gi in human_carp_user.get_clothing_on_part(potential_chest))
if(possible_gi.clothing_flags & CARP_STYLE_FACTOR)
style_factor_points += 20 // Only need one head level item to contribute
oh_no_armor += human_carp_user.run_armor_check(potential_chest, MELEE)
// We also consider whether our footwear is appropriate
if(is_it_the_shoes.clothing_flags & CARP_STYLE_FACTOR)
style_factor_points += 20
// Achieved a carp state of mind.
if(human_carp_user.has_status_effect(/datum/status_effect/organ_set_bonus/carp))
style_factor_points += 20
var/list/our_held_items = list()
our_held_items += human_carp_user.get_active_held_item()
our_held_items += human_carp_user.get_inactive_held_item()
// We check for wielded objects. If they're not abstract items or exempt items, we
for(var/obj/item/possibly_a_held_object as anything in our_held_items)
if(possibly_a_held_object.item_flags & (ABSTRACT|HAND_ITEM) && !possibly_a_held_object.block_chance)
continue
if(possibly_a_held_object in exempt_objects)
continue
if(possibly_a_held_object.w_class <= WEIGHT_CLASS_SMALL && !possibly_a_held_object.block_chance)
continue
oh_no_armor += possibly_a_held_object.block_chance
oh_no_armor += possibly_a_held_object.w_class * 10 * (HAS_TRAIT(possibly_a_held_object, TRAIT_WIELDED) ? 2 : 1)
if(human_carp_user.body_position != STANDING_UP) // YARR, MAN OVERBOARD
style_factor_points -= 30
style_factor_points -= oh_no_armor
return style_factor_points
/// Verb added to humans who learn the art of the sleeping carp.
/mob/living/proc/sleeping_carp_help()
set name = "Recall Teachings"
@@ -232,16 +378,18 @@
set category = "Sleeping Carp"
to_chat(usr, span_info("<b><i>You retreat inward and recall the teachings of the Sleeping Carp...</i></b>\n\
[span_notice("Gnashing Teeth")]: Punch Punch. Deal additional damage every second (consecutive) punch! Very good chance to wound!\n\
[span_notice("Gnashing Teeth")]: Punch Grab. Violently twists your opponent's arm, dislocating or even shattering bone and forcing them to drop their held items.\n\
[span_notice("Crashing Wave Kick")]: Punch Shove. Launch your opponent away from you with incredible force!\n\
[span_notice("Keelhaul")]: Shove Shove. Nonlethally kick an opponent to the floor, knocking them down, discombobulating them and dealing substantial stamina damage. If they're already prone, disarm them as well.\n\
[span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damage. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\
[span_notice("Kraken Wrack")]: Grab Punch. Deliver a knee jab into the opponent, dealing high stamina damage, as well as briefly stunning them, winding them and making it difficult for them to speak.\n\
[span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damag, and your grabs harder to break. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\
<span class='notice'>While in combat mode (and not stunned, not a hulk, and not in a mech), you can reflect all projectiles that come your way, sending them back at the people who fired them! \n\
However, your ability to avoid projectiles is negatively affected when your are burdened by armor, or whenever you are carrying objects in your hands. \n\
But if you commmit fully to the nautical lifestyle by wearing martial arts or carp-related regalia, you will feel empowered enough to potentially avoid attacks even from melee weapons or other unarmed combatants. \n\
Also, you are more resilient against suffering wounds in combat, and your limbs cannot be dismembered. This grants you extra staying power during extended combat, especially against slashing and other bleeding weapons. \n\
You are not invincible, however- while you may not suffer debilitating wounds often, you must still watch your health and should have appropriate medical supplies for use during downtime. \n\
In addition, your training has imbued you with a loathing of guns, and you can no longer use them.</span>"))
/obj/item/staff/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
@@ -337,6 +485,7 @@
. = ..()
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/the_sleeping_carp)
#undef STRONG_PUNCH_COMBO
#undef WRIST_WRENCH_COMBO
#undef LAUNCH_KICK_COMBO
#undef DROP_KICK_COMBO
#undef KNEE_STOMACH_COMBO

View File

@@ -4,8 +4,9 @@
martial_name = "sleeping carp"
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
greet = span_sciradio("You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
directed toward you while in Combat Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \
However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.")
directed toward you while in Combat Mode. You are also able to sometimes dodge melee and unarmed attacks against you, but only as long as you dress in appropriate martial arts clothing. Or \
carp-themed clothing. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. However, you are also unable to \
use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.")
icon = 'icons/obj/scrolls.dmi'
icon_state = "sleepingcarp"
worn_icon_state = "scroll"

View File

@@ -892,6 +892,12 @@
new /obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse(src)
new /obj/item/food/grown/apple(src)
/obj/item/storage/box/syndicate/sleeping_carp/PopulateContents()
new /obj/item/book/granter/martial/carp(src)
new /obj/item/clothing/head/costume/snakeeater(src)
new /obj/item/clothing/under/costume/gi(src)
new /obj/item/clothing/shoes/sandal(src)
#undef KIT_RECON
#undef KIT_BLOODY_SPAI
#undef KIT_STEALTHY

View File

@@ -64,6 +64,7 @@
greyscale_config_inhand_right = /datum/greyscale_config/maid_headband_inhands_right
inhand_icon_state = "maid"
flags_1 = IS_PLAYER_COLORABLE_1
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/head/costume/chicken
name = "chicken suit head"
@@ -222,7 +223,7 @@
desc = "A delicate hairpin normally paired with traditional clothing"
icon_state = "hairpin_fancy"
inhand_icon_state = "hairpin_fancy"
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/head/costume/snakeeater
name = "strange bandana"
@@ -230,6 +231,7 @@
icon_state = "snake_eater"
inhand_icon_state = null
clothing_traits = list(TRAIT_FISH_EATER)
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/head/costume/knight
name = "fake medieval helmet"

View File

@@ -66,6 +66,7 @@
desc = "They got me for my foams!"
icon_state = "SwagShoes"
inhand_icon_state = null
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/shoes/glow
name = "glow shoes"

View File

@@ -3,6 +3,7 @@
desc = "The height of fashion, and they're pre-polished!"
icon_state = "laceups"
equip_delay_other = 5 SECONDS
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/shoes/laceup/Initialize(mapload)
. = ..()

View File

@@ -10,12 +10,12 @@
armor_type = /datum/armor/shoes_sandal
fastening_type = SHOES_SLIPON
species_exception = list(/datum/species/golem)
lace_time = 3 SECONDS
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/shoes/sandal/alt
desc = "A pair of shiny black wooden sandals."
name = "black sandals"
desc = "A pair of shiny black wooden sandals."
icon_state = "blacksandals"
inhand_icon_state = "blacksandals"

View File

@@ -269,6 +269,7 @@
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too
clothing_flags = CARP_STYLE_FACTOR
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/rifle/boltaction/harpoon)
hoodtype = /obj/item/clothing/head/hooded/carp_hood
@@ -286,6 +287,7 @@
cold_protection = HEAD
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
clothing_flags = CARP_STYLE_FACTOR
/obj/item/clothing/head/hooded/carp_hood/Initialize(mapload)
. = ..()
@@ -313,7 +315,7 @@
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | CARP_STYLE_FACTOR
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
hoodtype = /obj/item/clothing/head/hooded/carp_hood/spaceproof
resistance_flags = NONE
@@ -333,7 +335,7 @@
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|STACKABLE_HELMET_EXEMPT
clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|STACKABLE_HELMET_EXEMPT|CARP_STYLE_FACTOR
body_parts_covered = HEAD
resistance_flags = NONE
flash_protect = FLASH_PROTECTION_WELDER

View File

@@ -66,6 +66,7 @@
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)
. = ..()
@@ -81,6 +82,7 @@
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"

View File

@@ -214,6 +214,7 @@
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
species_exception = list(/datum/species/golem)
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/suit/toggle/lawyer/purple
name = "purple formal suit jacket"

View File

@@ -130,6 +130,7 @@
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
alternate_worn_layer = UNDER_SUIT_LAYER
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR //weebs are gonna love this
/obj/item/clothing/under/costume/geisha
name = "geisha suit"
@@ -137,6 +138,7 @@
icon_state = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/costume/yukata
name = "black yukata"
@@ -145,6 +147,7 @@
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
/obj/item/clothing/under/costume/yukata/green
@@ -165,6 +168,7 @@
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
/obj/item/clothing/under/costume/kimono/red
@@ -318,6 +322,7 @@
species_exception = list(/datum/species/golem)
can_adjust = TRUE
alt_covers_chest = TRUE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/costume/buttondown/slacks
name = "button-down shirt with slacks"
@@ -393,6 +398,7 @@
icon_state = "SwagOutfit"
inhand_icon_state = null
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/costume/referee
name = "referee uniform"
@@ -450,6 +456,7 @@
inhand_icon_state = null
female_sprite_flags = NO_FEMALE_UNIFORM
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/costume/gi/Initialize(mapload)
. = ..()

View File

@@ -108,6 +108,7 @@
body_parts_covered = CHEST|GROIN
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR //weebs are going to lvoe this
/obj/item/clothing/under/rank/civilian/lawyer
name = "Lawyer suit"

View File

@@ -19,6 +19,7 @@
greyscale_config_worn = /datum/greyscale_config/slacks/worn
greyscale_colors = "#575757#3E3E3E#75634F"
flags_1 = IS_PLAYER_COLORABLE_1
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/pants/jeans
name = "jeans"

View File

@@ -116,6 +116,7 @@
desc = "A luxurious suit made with only the finest scales, perfect for conducting dodgy business deals."
icon_state = "carpskin_suit"
inhand_icon_state = null
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/under/suit/carpskin/Initialize(mapload)
. = ..()

View File

@@ -107,6 +107,7 @@
inhand_icon_state = null
body_parts_covered = GROIN|LEGS
flags_inv = HIDEJUMPSUIT|HIDEBELT
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
/obj/item/clothing/suit/chaplainsuit/whiterobe
name = "white robe"

View File

@@ -80,10 +80,12 @@
/datum/uplink_item/stealthy_weapons/martialarts
name = "Martial Arts Scroll"
name = "Martial Arts Scroll and Martial Arts Outfit"
desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat \
and gain the ability to swat bullets from the air, but you will also refuse to use dishonorable ranged weaponry."
item = /obj/item/book/granter/martial/carp
and gain the ability to swat bullets from the air, and if in the correct attire, avoid attacks. But you will \
also refuse to use dishonorable ranged weaponry, and armored clothing will make it harder to avoid attacks. \
Comes prepackaged with a set of martial arts clothing!"
item = /obj/item/storage/box/syndicate/sleeping_carp
progression_minimum = 30 MINUTES
population_minimum = TRAITOR_POPULATION_LOWPOP
cost = 17