From dc2d54cea84b8b4a66b8679918e7d6bde9b50ab6 Mon Sep 17 00:00:00 2001 From: BlueHNT <79374236+BlueHNT@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:54:12 +0200 Subject: [PATCH] Ju Jitsu Update [REDO] (#2454) Co-authored-by: Bokkiewokkie <43698041+Bokkiewokkie@users.noreply.github.com> --- code/datums/martial/_martial.dm | 1 + .../code/modules/jobs/security/martial_art.dm | 100 +++++++++++++++--- nsv13/sound/weapons/chokehold.ogg | Bin 0 -> 9954 bytes 3 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 nsv13/sound/weapons/chokehold.ogg diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 475936d11cb..31c5cd1472c 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -9,6 +9,7 @@ var/reroute_deflection = FALSE //Delete the bullet, or actually deflect it in some direction? var/block_chance = 0 //Chance to block melee attacks using items while on throw mode. var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not + var/armlockstate = 0 //used in jujitsu grab after hand armlock move var/help_verb var/no_guns = FALSE var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts diff --git a/nsv13/code/modules/jobs/security/martial_art.dm b/nsv13/code/modules/jobs/security/martial_art.dm index af918d05cd2..76f88c0170d 100644 --- a/nsv13/code/modules/jobs/security/martial_art.dm +++ b/nsv13/code/modules/jobs/security/martial_art.dm @@ -1,7 +1,7 @@ #define MARTIALART_JUJITSU "ju jitsu" - -#define TAKEDOWN_COMBO "DD" -#define JUDO_THROW "DHHG" +#define TAKEDOWN_COMBO "DG" +#define JUDO_THROW "HHG" +#define ARMLOCKING "DHGG" /obj/item/book/granter/martial/jujitsu martial = /datum/martial_art/jujitsu @@ -37,8 +37,11 @@ set desc = "Remember your police academy martial arts training." set category = "Jujitsu" to_chat(usr, "Combos:") - to_chat(usr, "Disarm, disarm will perform a takedown on the target, if they have been slowed / weakened first") - to_chat(usr, "Disarm, harm, harm, grab will execute a judo throw on the target,landing you on top of them in a pinning position. Provided that you have a grab on them on the final step...") + to_chat(usr, "Disarm, Grab will perform a takedown on the target, if they have been slowed / weakened first") + to_chat(usr, "Harm, Harm, Grab will execute a judo throw on the target,landing you on top of them in a pinning position. Provided that you have a grab on them on the final step...") + to_chat(usr, "Disarm, Harm, Grab, Grab will execute an armlock on the target, throwing you both to the ground. You however have more maneuverability than the perp from this position.") + + to_chat(usr, "In addition, you also have a small window of opportunity to forcefully grab the perp during armlock.") /datum/martial_art/jujitsu/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,TAKEDOWN_COMBO)) @@ -49,6 +52,10 @@ streak = "" judo_throw(A,D) return TRUE + if(findtext(streak,ARMLOCKING)) + streak = "" + armlocking(A, D) + return TRUE return FALSE /datum/martial_art/jujitsu/proc/takedown(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -61,12 +68,15 @@ A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] trips [D] up and pins them to the ground!", "[A] is pinning you to the ground!") playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE) - D.Paralyze(7 SECONDS) //Equivalent to a clown PDA + D.Paralyze(2 SECONDS) + D.Knockdown(7 SECONDS) A.shake_animation(10) - D.shake_animation(10) + D.shake_animation(20) + D.adjustOxyLoss(10) // you smashed him into the ground A.forceMove(get_turf(D)) - A.start_pulling(D, supress_message = FALSE) - A.setGrabState(GRAB_AGGRESSIVE) + if(A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown + A.start_pulling(D, supress_message = FALSE) + A.setGrabState(GRAB_AGGRESSIVE) last_move = world.time /datum/martial_art/jujitsu/proc/judo_throw(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -81,25 +91,78 @@ target = get_turf(A) D.forceMove(target) A.setDir(newdir) - A.start_pulling(D, supress_message = FALSE) - A.setGrabState(GRAB_AGGRESSIVE) + D.dropItemToGround(D.get_active_held_item()) // yeet + if(A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown + A.start_pulling(D, supress_message = FALSE) + A.setGrabState(GRAB_AGGRESSIVE) + D.adjustOxyLoss(40) // YOU THREW HIM, THREW HIM!! D.Paralyze(7 SECONDS) //Equivalent to a clown PDA D.visible_message("[A] throws [D] over their shoulder and pins them down!", "[A] throws you over their shoulder and pins you to the ground!") playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE) last_move = world.time +// Armlock state removal after 5s +/datum/martial_art/jujitsu/proc/drop_armlocking() + armlockstate = FALSE + +// Armlock +/datum/martial_art/jujitsu/proc/armlocking(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(A)) + return FALSE + if(world.time < last_move+cooldown) + to_chat(A, "You're too fatigued to perform this move right now...") + return FALSE + if(!D.stat) + D.visible_message("[A] locks [D] into a armlock position!", \ + "[A] locks you into a armlock position!") + A.Knockdown(20) // knockdown officer with the perp + A.adjustStaminaLoss(15) + D.adjustStaminaLoss(30) + D.Paralyze(70) + D.shake_animation(50) + A.start_pulling(D, supress_message = FALSE) + armlockstate = TRUE + addtimer(CALLBACK(src, PROC_REF(drop_armlocking)), 50, TIMER_UNIQUE) // you get 3 seconds after standing up to grab the perp + A.do_attack_animation(D, ATTACK_EFFECT_DISARM) + playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE) + last_move = world.time + return TRUE + /datum/martial_art/jujitsu/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE if(A==D) return FALSE //prevents grabbing yourself - if(A.a_intent == INTENT_GRAB) + if(A.a_intent == INTENT_GRAB && A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown and missfire + if(armlockstate == TRUE) // neck grabs if armlocked + A.setGrabState(GRAB_NECK) + D.visible_message("[A] grabs [D] from the armlock position by the neck!", \ + "[A] grabs you from the armlock position by the neck!") + armlockstate = FALSE add_to_streak("G",D) if(check_streak(A,D)) //doing combos is prioritized over upgrading grabs return TRUE return FALSE /datum/martial_art/jujitsu/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/def_check = D.getarmor(BODY_ZONE_CHEST, "melee") + var/bonus_damage = 0 + if((armlockstate == TRUE)) // disable chosen arm temporarily when armlocked + if(A.zone_selected == BODY_ZONE_L_ARM) + D.apply_damage(100, STAMINA, BODY_ZONE_L_ARM, def_check) + D.visible_message("[A] has cracked [D]'s arm!", "[A] cracks your arm, causing a coursing pain!") + armlockstate = FALSE + if(A.zone_selected == BODY_ZONE_R_ARM) + D.apply_damage(100, STAMINA, BODY_ZONE_R_ARM, def_check) + D.visible_message("[A] has cracked [D]'s arm!", "[A] cracks your arm, causing a coursing pain!") + armlockstate = FALSE + return FALSE + if((A.grab_state >= GRAB_AGGRESSIVE)) + bonus_damage += 5 + D.apply_damage(rand(2,3) + bonus_damage, A.dna.species.attack_type, affecting, def_check) // bonus damage when grabbing at least aggressively if required to kill + if((D.mobility_flags & MOBILITY_STAND)) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) // makes punch be default if he's standing if(!can_use(A)) return FALSE add_to_streak("H",D) @@ -108,6 +171,19 @@ return FALSE /datum/martial_art/jujitsu/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/bonus_stam = 0 + if((A.grab_state >= GRAB_AGGRESSIVE)) // If you shove during agressive grab it deals bonus stam + bonus_stam = 20 + if(!(D.mobility_flags & MOBILITY_STAND)) // If you shove while perp is on ground and aggressive grabbing, it deals even more stam + bonus_stam += 10 + D.adjustStaminaLoss(10 + bonus_stam) // deals minor stam damage with scaling dependant on grab and perp standing + A.do_attack_animation(D, ATTACK_EFFECT_DISARM) + if(A.pulling == D && A.grab_state >= GRAB_NECK) // LV3 hold minimum + D.visible_message("[A] puts [D] into a chokehold!", \ + "[A] puts you into a chokehold!") + playsound(get_turf(D), 'nsv13/sound/weapons/chokehold.ogg', 50, 1, 1) + D.SetSleeping(200) + return FALSE if(!can_use(A)) return FALSE add_to_streak("D",D) diff --git a/nsv13/sound/weapons/chokehold.ogg b/nsv13/sound/weapons/chokehold.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43e0db0741f5c20d1f69ef94ef964a6a882becd8 GIT binary patch literal 9954 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