diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index c8f158285f7..00c6131b37b 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -1,151 +1,94 @@ -#define WRIST_WRENCH_COMBO "DD" -#define BACK_KICK_COMBO "HG" -#define STOMACH_KNEE_COMBO "GH" -#define HEAD_KICK_COMBO "DHH" -#define ELBOW_DROP_COMBO "HDHDH" +#define STRONG_PUNCH_COMBO "HH" +#define LAUNCH_KICK_COMBO "HD" +#define DROP_KICK_COMBO "HG" /datum/martial_art/the_sleeping_carp name = "The Sleeping Carp" id = MARTIALART_SLEEPINGCARP allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/sleeping_carp_help - smashes_tables = TRUE - var/old_grab_state = null /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(findtext(streak,WRIST_WRENCH_COMBO)) + if(findtext(streak,STRONG_PUNCH_COMBO)) streak = "" - wristWrench(A,D) + strongPunch(A,D) return TRUE - if(findtext(streak,BACK_KICK_COMBO)) + if(findtext(streak,LAUNCH_KICK_COMBO)) streak = "" - backKick(A,D) + launchKick(A,D) return TRUE - if(findtext(streak,STOMACH_KNEE_COMBO)) + if(findtext(streak,DROP_KICK_COMBO)) streak = "" - kneeStomach(A,D) - return TRUE - if(findtext(streak,HEAD_KICK_COMBO)) - streak = "" - headKick(A,D) - return TRUE - if(findtext(streak,ELBOW_DROP_COMBO)) - streak = "" - elbowDrop(A,D) + dropKick(A,D) return TRUE return FALSE -/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsStun() && !D.IsParalyzed()) - log_combat(A, D, "wrist wrenched (Sleeping Carp)") - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ - "Your wrist is grabbed and simultaneously wrenched to the side by [A]!", "You hear aggressive shuffling!", null, A) - to_chat(A, "You grab [D]'s wrist and wrench it sideways!") - playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - D.emote("scream") - D.dropItemToGround(D.get_active_held_item()) - D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - D.Stun(60) - return TRUE +/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + var/atk_verb = pick("kick", "chop", "hit", "slam") + var/crit_damage = 0 + D.visible_message("[A] [atk_verb]s [D]!", \ + "[A] [atk_verb]s you!", null, null, A) + to_chat(A, "You [atk_verb] [D]!") + if(prob(10)) + crit_damage += 20 + playsound(get_turf(D), 'sound/weapons/bite.ogg', 50, TRUE, -1) + D.visible_message("[D] sputters blood as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!") + else + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) + D.apply_damage(20 + crit_damage, A.dna.species.attack_type, affecting) + log_combat(A, D, "strong punched (Sleeping Carp)") + return - return FALSE +/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + D.visible_message("[A] kicks [D] square in the chest, sending them flying!", \ + "You are kicked square in the chest by [A], sending you flying!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + var/atom/throw_target = get_edge_target_turf(D, A.dir) + D.throw_at(throw_target, 7, 14, A) + D.apply_damage(15, A.dna.species.attack_type, BODY_ZONE_CHEST) + log_combat(A, D, "launch kicked (Sleeping Carp)") + return -/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsParalyzed()) - if(A.dir != D.dir) - log_combat(A, D, "missed a back-kick (Sleeping Carp) on") - D.visible_message("[A] tries to kick [D] in the back, but misses!", \ - "You avoid a kick in the back by [A]!", "You hear a swoosh!", null, A) - to_chat(A, "Your kick to [D]'s back misses!") - return TRUE - log_combat(A, D, "back-kicked (Sleeping Carp)") - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] kicks [D] in the back!", \ - "You're kicked in the back by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A) - to_chat(A, "You kick [D] in the back!") - step_to(D,get_step(D,D.dir),1) - D.Paralyze(80) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1) - return TRUE - return FALSE - -/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsParalyzed()) - log_combat(A, D, "stomach kneed (Sleeping Carp)") - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - D.visible_message("[A] knees [D] in the stomach!", \ - "Your stomach is kneed by [A], making you gag!", "You hear a sickening sound of flesh hitting flesh!", null, A) - to_chat(A, "You knee [D] in the stomach, making [D.p_them()] gag!") - D.losebreath += 3 - D.Stun(40) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1) - return TRUE - return FALSE - -/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsParalyzed()) - log_combat(A, D, "head kicked (Sleeping Carp)") - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - D.visible_message("[A] kicks [D] in the head!", \ - "Your jaw is kicked by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A) - to_chat(A, "You kick [D] in the jaw!") - D.apply_damage(20, A.dna.species.attack_type, BODY_ZONE_HEAD) - D.drop_all_held_items() - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1) - D.Stun(80) - return TRUE - return FALSE - -/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D) +/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + if((D.mobility_flags & MOBILITY_STAND)) + D.apply_damage(10, A.dna.species.attack_type, BODY_ZONE_HEAD) + D.Knockdown(40) + D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \ + "You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) if(!(D.mobility_flags & MOBILITY_STAND)) - log_combat(A, D, "elbow dropped (Sleeping Carp)") - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] elbow drops [D]!", \ - "You're piledrived by [A] with [A.p_their()] elbow!", "You hear a sickening sound of flesh hitting flesh!", null, A) - to_chat(A, "You piledrive [D] with your elbow!") - if(D.stat) - D.death() //FINISH HIM! - D.apply_damage(50, A.dna.species.attack_type, BODY_ZONE_CHEST) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, TRUE, -1) - return TRUE - return FALSE + D.apply_damage(5, A.dna.species.attack_type, BODY_ZONE_HEAD) + D.adjustStaminaLoss(40) + D.drop_all_held_items() + D.visible_message("[A] kicks [D] in the head!", \ + "You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + return /datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A.a_intent == INTENT_GRAB && A!=D) // A!=D prevents grabbing yourself - add_to_streak("G",D) - if(check_streak(A,D)) //if a combo is made no grab upgrade is done - return TRUE - old_grab_state = A.grab_state - D.grabbedby(A, 1) - if(old_grab_state == GRAB_PASSIVE) - D.drop_all_held_items() - A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent - log_combat(A, D, "grabbed", addition="aggressively") - D.visible_message("[A] violently grabs [D]!", \ - "You're violently grabbed by [A]!", "You hear aggressive shuffling!", null, A) - to_chat(A, "You violently grab [D]!") + add_to_streak("G",D) + if(check_streak(A,D)) return TRUE - return FALSE + return ..() /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) if(check_streak(A,D)) return TRUE + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) var/atk_verb = pick("kick", "chop", "hit", "slam") D.visible_message("[A] [atk_verb]s [D]!", \ "[A] [atk_verb]s you!", null, null, A) to_chat(A, "You [atk_verb] [D]!") - D.apply_damage(rand(10,15), BRUTE) + D.apply_damage(rand(10,15), BRUTE, affecting) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) - if(prob(D.getBruteLoss()) && (D.mobility_flags & MOBILITY_STAND)) - D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") - D.Paralyze(80) log_combat(A, D, "[atk_verb] (Sleeping Carp)") return TRUE - /datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("D",D) if(check_streak(A,D)) @@ -162,22 +105,45 @@ return BULLET_ACT_HIT if(!isturf(A.loc)) //NO MOTHERFLIPPIN MECHS! return BULLET_ACT_HIT - A.visible_message("[A] deflects the projectile; [A.p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) - P.firer = A - P.setAngle(rand(0, 360))//SHING - return BULLET_ACT_FORCE_PIERCE + if(A.in_throw_mode) + A.visible_message("[A] effortlessly swats the projectile aside! They can block bullets with their bare hands!", "You deflect the projectile!") + playsound(get_turf(A), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + P.firer = A + P.setAngle(rand(0, 360))//SHING + return BULLET_ACT_FORCE_PIERCE + return BULLET_ACT_HIT /datum/martial_art/the_sleeping_carp/teach(mob/living/carbon/human/H, make_temporary = FALSE) . = ..() if(!.) return ADD_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT) + ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) + ADD_TRAIT(H, TRAIT_STUNRESISTANCE, SLEEPING_CARP_TRAIT) + ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) + H.physiology.brute_mod *= 0.3 + H.physiology.burn_mod *= 0.3 + H.physiology.stamina_mod *= 0.3 + H.physiology.stun_mod *= 0.3 + H.physiology.pressure_mod *= 0.3 //go hang out with carp + H.physiology.cold_mod *= 0.3 //seriously go say hi + + H.faction |= "carp" //:D /datum/martial_art/the_sleeping_carp/on_remove(mob/living/carbon/human/H) . = ..() REMOVE_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT) + REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) + REMOVE_TRAIT(H, TRAIT_STUNRESISTANCE, SLEEPING_CARP_TRAIT) + REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) + H.physiology.brute_mod = initial(H.physiology.brute_mod) + H.physiology.burn_mod = initial(H.physiology.burn_mod) + H.physiology.stamina_mod = initial(H.physiology.stamina_mod) + H.physiology.stun_mod = initial(H.physiology.stun_mod) + H.physiology.pressure_mod = initial(H.physiology.pressure_mod) //no more carpies + H.physiology.cold_mod = initial(H.physiology.cold_mod) + H.faction -= "carp" //:( /mob/living/carbon/human/proc/sleeping_carp_help() set name = "Recall Teachings" @@ -186,11 +152,10 @@ to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...") - to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.") - to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.") - to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.") - to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") - to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") + to_chat(usr, "Gnashing Teeth: Harm Harm. Deal additional damage every second punch, with a chance for even more damage!") + to_chat(usr, "Crashing Wave Kick: Harm Disarm. Launch people brutally across rooms, and away from you.") + to_chat(usr, "Keelhaul: Harm Grab. Kick opponents to the floor. Against prone targets, deal additional stamina damage and disarm them.") + to_chat(usr, "In addition, your body has become incredibly resilient to most forms of attack. Weapons cannot readily pierce your hardened skin, and you are highly resistant to stuns and knockdowns, and can block all projectiles in Throw Mode. However, you are not invincible, and sustained damage will take it's toll.") /obj/item/twohanded/bostaff name = "bo staff" diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 92f9b70a089..07a222e403f 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -365,10 +365,11 @@ martialname = "sleeping carp" desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." greet = "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. 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 Throw Mode. Your body is also honed to protect you from damage and punctures, and even briefly survive space. \ + However, you are also unable to use any ranged weaponry, and some medical supplies will prove useless to you. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." icon = 'icons/obj/wizard.dmi' icon_state = "scroll2" - remarks = list("I must prove myself worthy to the masters of the sleeping carp...", "Stance means everything...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Grab them first so they don't retaliate...", "I must prove myself worthy of this power...") + remarks = list("Wait, a high protein diet is really all it takes to become bulletproof...?", "Overwhelming force, immovable object...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Become one with the carp...", "Glub...") /obj/item/book/granter/martial/carp/onlearned(mob/living/carbon/user) ..() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index c44c2402afd..d39a9d6e681 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -240,7 +240,7 @@ to_chat(user, "You hit yourself over the head!") user.Paralyze(knockdown_time_carbon * force) - user.adjustStaminaLoss(stamina_damage) + user.apply_damage(stamina_damage, STAMINA, BODY_ZONE_HEAD) additional_effects_carbon(user) // user is the target here if(ishuman(user)) @@ -292,7 +292,7 @@ playsound(get_turf(src), on_stun_sound, 75, TRUE, -1) target.Knockdown(knockdown_time_carbon) - target.adjustStaminaLoss(stamina_damage) + target.apply_damage(stamina_damage, STAMINA) additional_effects_carbon(target, user) log_combat(user, target, "stunned", src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 9cc2bac1b19..7c74edcc127 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -223,7 +223,7 @@ L.Jitter(20) L.confused = max(confusion_amt, L.confused) L.stuttering = max(8, L.stuttering) - L.adjustStaminaLoss(stamina_loss_amt) + L.apply_damage(stamina_loss_amt, STAMINA) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) addtimer(CALLBACK(src, .proc/apply_stun_effect_end, L), apply_stun_delay) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 791089924e1..b372e58b0ad 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -569,9 +569,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/martialarts name = "Martial Arts Scroll" desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \ - deflecting all ranged weapon fire, but you also refuse to use dishonorable ranged weaponry." + gain skin as hard as steel and swat bullets from the air, but you also refuse to use dishonorable ranged weaponry." item = /obj/item/book/granter/martial/carp - cost = 17 + cost = 15 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)