mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 01:34:01 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user