From f2a9865f722e821c78d2f3f7b0585e4c35e46c74 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:15:54 -0500 Subject: [PATCH 01/19] Update cqc.dm --- code/datums/martial/cqc.dm | 433 +++++++++++++++++++++---------------- 1 file changed, 241 insertions(+), 192 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index a8a59ab66f90..26e20639ad42 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -12,15 +12,15 @@ */ ///slam combo string -#define SLAM_COMBO "GH" +#define SLAM_COMBO "HD" ///kick combo string -#define KICK_COMBO "DH" -///restrain combo string -#define RESTRAIN_COMBO "GG" +#define KICK_COMBO "DD" ///pressure combo string -#define PRESSURE_COMBO "DG" +#define PRESSURE_COMBO "DH" ///consecutive combo string -#define CONSECUTIVE_COMBO "HHHHH" +#define CONSECUTIVE_COMBO "HH" +///restrain combo string +#define RESTRAIN_COMBO "GG" /datum/martial_art/cqc name = "CQC" @@ -28,22 +28,12 @@ help_verb = /mob/living/carbon/human/proc/CQC_help block_chance = 90 //Don't get into melee with someone specifically trained for melee and prepared for your attacks nonlethal = TRUE //all attacks deal solely stamina damage or knock out before dealing lethal amounts of damage - ///whether the art checks for being inside the kitchen for use - var/just_a_cook = FALSE ///used to stop a chokehold attack from stacking var/chokehold_active = FALSE -/datum/martial_art/cqc/under_siege - name = "Close Quarters Cooking" - id = MARTIALART_CQC_COOK - just_a_cook = TRUE - -/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen - var/area/A = get_area(H) - if(just_a_cook && !(istype(A, /area/crew_quarters/kitchen))) - return FALSE - return ..() - +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Check Streak----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// /** * check_streak proc * @@ -52,19 +42,19 @@ * otherwise returns false */ /datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!(can_use(A) || can_use(D))) + if(!can_use(A)) return FALSE - if(findtext(streak,SLAM_COMBO)) - streak = "" - Slam(A,D) - return TRUE if(findtext(streak,KICK_COMBO)) streak = "" Kick(A,D) return TRUE - if(findtext(streak,RESTRAIN_COMBO)) + + if(!D.mobility_flags & MOBILITY_STAND) //the rest need a standing target + return FALSE + + if(findtext(streak,SLAM_COMBO)) streak = "" - Restrain(A,D) + Slam(A,D) return TRUE if(findtext(streak,PRESSURE_COMBO)) streak = "" @@ -74,27 +64,123 @@ streak = "" Consecutive(A,D) return TRUE + if(findtext(streak,RESTRAIN_COMBO)) + streak = "" + Restrain(A,D) + return TRUE return FALSE + +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Helper Proc-----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +//proc the moves will use for damage dealing for armour checking purposes +/datum/martial_art/cqc/proc/stamina_harm(mob/living/carbon/human/user, mob/living/carbon/human/victim, damage) + var/obj/item/bodypart/limb_to_hit = target.get_bodypart(user.zone_selected) + var/armor = target.run_armor_check(limb_to_hit, MELEE) + target.apply_damage(damage, STAMINA, blocked = armor) + +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Harm intent-----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +///CQC harm intent, deals 15 stamina damage and immobilizes for 1 seconds, if the attacker is prone, they knock the defender down and stand up +/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(A)) + return FALSE + add_to_streak("H",D) + if(check_streak(A,D)) + return TRUE + + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + var/attack_verb = pick("CQC'd", "Big Bossed") + + + if(!(A.mobility_flags & MOBILITY_STAND) && (D.mobility_flags & MOBILITY_STAND)) + attack_verb = "leg sweeps" + playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) + + D.Knockdown(3 SECONDS) + A.set_resting(FALSE) + A.SetKnockdown(0) + else + var/bonus_damage = A.get_punchdamagehigh() * 1.5 //15 damage + stamina_harm(A, D, bonus_damage) + + D.Immobilize(1 SECONDS) + + playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + D.visible_message(span_danger("[A] [picked_hit_type] [D]!"), span_userdanger("[A] [picked_hit_type] you!")) + A.changeNext_move(CLICK_CD_RANGE) //faster cooldown from basic hits + + log_combat(A, D, "[attack_verb] (CQC)") + return TRUE + +//////////////////////////////////////////////////////////////////////////////////// +//--------------------------------Disarm intent-----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +///CQC disarm, guaranteed knocks the enemy's item out of their hand +/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(A)) + return FALSE + add_to_streak("D",D) + if(check_streak(A,D)) + return TRUE + + A.do_attack_animation(D, ATTACK_EFFECT_DISARM) + playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + + var/obj/item/I = D.get_active_held_item() + if(I) + D.dropItemToGround(I) + D.visible_message(span_warning("[A] quickly grabs [D]'s arm and and chops it, disarming them!"), span_userdanger("[A] grabs your arm and chops it, disarming you!")) + else + D.visible_message(span_warning("[A] quickly chops [D]'s arm!"), span_userdanger("[A] quickly chops your arm!")) + D.adjust_jitter(2 SECONDS) + stamina_harm(A, D, A.get_punchdamagehigh()) + A.changeNext_move(CLICK_CD_RANGE) //faster cooldown from basic hits + + log_combat(A, D, "disarmed (CQC)") + return TRUE + +//////////////////////////////////////////////////////////////////////////////////// +//-------------------------------------Grab---------------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +///CQC grab, stuns for 1.5 seconds on use +/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(A)) + return FALSE + if(A == D) // prevents grabbing yourself + return FALSE + + if(D.grabbedby(A)) + A.changeNext_move(CLICK_CD_RAPID) //faster cooldown from grabs + + add_to_streak("G",D) + if(check_streak(A,D)) //if a combo is made no grab upgrade is done + return TRUE + return TRUE + +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Harm Disarm-----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// /** * CQC slam combo attack * - * Basic counter that causes 15 stamina damage with a 3 second paralyze and 8 second knockdown + * Basic counter that causes 20 stamina damage with an 8 second knockdown */ /datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE if(D.mobility_flags & MOBILITY_STAND) - D.visible_message(span_warning("[A] slams [D] into the ground!"), \ - span_userdanger("[A] slams you into the ground!")) + log_combat(A, D, "slammed (CQC)") + D.visible_message(span_warning("[A] slams [D] into the ground!"), span_userdanger("[A] slams you into the ground!")) playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) //using hit_kick because for some stupid reason slam.ogg is delayed A.do_attack_animation(D, ATTACK_EFFECT_SMASH) - D.apply_damage(A.get_punchdamagehigh() + 5, STAMINA) //15 damage - D.Paralyze(30) + stamina_harm(A, D, A.get_punchdamagehigh() * 2) //20 damage D.Knockdown(80) - log_combat(A, D, "slammed (CQC)") return TRUE +//////////////////////////////////////////////////////////////////////////////////// +//---------------------------------Disarm Disarm----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// /** * CQC kick combo attack * @@ -102,190 +188,113 @@ * or 40 stamina damage with a ~8 second mute if they aren't */ /datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE A.do_attack_animation(D, ATTACK_EFFECT_KICK) - if(!D.stat && (D.mobility_flags & MOBILITY_STAND)) - D.visible_message(span_warning("[A] kicks [D] back!"), \ - span_userdanger("[A] kicks you back!")) + if(D.mobility_flags & MOBILITY_STAND) + log_combat(A, D, "kicked (CQC)") + D.visible_message(span_warning("[A] kicks [D] back!"), span_userdanger("[A] kicks you back!")) playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) step(D, A.dir) - D.apply_damage(A.get_punchdamagehigh() + 5, STAMINA) //15 damage - log_combat(A, D, "kicked (CQC)") + stamina_harm(A, D, A.get_punchdamagehigh() * 1.5) //15 damage D.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH) addtimer(CALLBACK(D, TYPE_PROC_REF(/mob/living/carbon/human, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH) - if(!(D.mobility_flags & MOBILITY_STAND) && !D.stat) + else log_combat(A, D, "prone-kicked(CQC)") - D.visible_message(span_warning("[A] firmly kicks [D] in the abdomen!"), \ - span_userdanger("[A] kicks you in the abdomen!")) + D.visible_message(span_warning("[A] firmly kicks [D] in the abdomen!"), span_userdanger("[A] kicks you in the abdomen!")) playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) - var/kickdamage = A.get_punchdamagehigh() * 2 + 20 //40 damage + var/kickdamage = A.get_punchdamagehigh() * 4 //40 damage + stamina_harm(A, D, kickdamage) + D.clear_stamina_regen() //used for keeping people down, so reset that regen timer D.Paralyze(5) - D.apply_damage(kickdamage, STAMINA) D.silent += 2 return TRUE +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Disarm Harm-----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// /** * CQC pressure attack * * Attack that disables a limb if an arm/leg is selected, randomly selects a limb if one is not selected - * also forces them to drop anything they are holding */ /datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(A)) - return FALSE A.do_attack_animation(D, ATTACK_EFFECT_DISARM) - log_combat(A, D, "pressured (CQC)") + var/list/viable_zones = list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + var/selected_zone = A.zone_selected - if(!viable_zones.Find(selected_zone)) + if(!viable_zones.Find(selected_zone)) //if the selected bodypart isn't valid, pick a random one and hope it's there selected_zone = pick(viable_zones) - var/hit_limb = D.get_bodypart(selected_zone) - if(!hit_limb) - return FALSE - D.visible_message(span_warning("[A] dislocates [D]'s [hit_limb]!"), \ - "[A] dislocates your [hit_limb]!") - D.drop_all_held_items() - D.apply_damage(50, STAMINA, selected_zone) //not based on species damage since this should just disable the limb outright anyways, which caps at 50 damage - playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - return TRUE + var/obj/item/bodypart/hit_limb = D.get_bodypart(selected_zone) -/** - * CQC restrain attack - * - * attack that puts the target into a restraining position, stunning and muting them for a short period - * used to set up a chokehold attack - */ -/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(restraining) - return - if(!can_use(A)) + if(!hit_limb) //the body part is missing for one reason or another + D.visible_message(span_warning("[A] harmlessly swings for [D]'s missing [hit_limb]!"), span_userdanger("[A] swings for your missing [hit_limb]!")) + playsound(D, 'sound/weapons/punchmiss.ogg', 35, 1, -1) return FALSE - if(!D.stat) - log_combat(A, D, "restrained (CQC)") - D.visible_message(span_warning("[A] locks [D] into a restraining position!"), \ - span_userdanger("[A] locks you into a restraining position!")) - D.Stun(20) - if(!(A.pulling == D)) - D.grabbedby(A, 1) - if(A.grab_state < GRAB_AGGRESSIVE) - A.grab_state = GRAB_AGGRESSIVE - restraining = TRUE + + hit_limb.force_wound_upwards(/datum/wound/blunt/moderate) //handles all those that can have limbs disabled with wounds (also proper dislocation) + D.apply_damage(50, STAMINA, selected_zone) //handles most of those that can't (curse you boneless organic species!) + + D.visible_message(span_warning("[A] dislocates [D]'s [hit_limb]!"), span_userdanger("[A] dislocates your [hit_limb]!")) + playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + log_combat(A, D, "pressured (CQC)") return TRUE +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Harm Harm-------------------------------------// +//////////////////////////////////////////////////////////////////////////////////// /** * CQC consecutive attack * - * Attack that causes 5 seconds paralyze and 10 seconds knockdown as well as 25 stamina damage + * Attack that causes 50 stamina damage and confuses */ /datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - if(D.mobility_flags & MOBILITY_STAND) - var/consecutivedamage = A.get_punchdamagehigh() * 1.5 + 10 //25 damage - log_combat(A, D, "consecutive CQC'd (CQC)") - D.visible_message(span_warning("[A] delivers a firm blow to [D]'s head, knocking them down!"), \ - span_userdanger("[A] delivers a firm blow to your head, causing you to fall over!")) - playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) - D.Paralyze(50) - D.Knockdown(100) - D.apply_damage(consecutivedamage, STAMINA) + log_combat(A, D, "consecutive CQC'd (CQC)") + D.visible_message(span_warning("[A] delivers a firm blow to [D]'s head!"), span_userdanger("[A] delivers a firm blow to your head!")) + playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) + var/consecutivedamage = A.get_punchdamagehigh() * 5 //50 damage + D.apply_damage(consecutivedamage, STAMINA) + D.adjust_confusion_up_to(4 SECONDS, 8 SECONDS) return TRUE -///CQC grab, stuns for 1.5 seconds on use -/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A!=D && (can_use(A) && can_use(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 - if(D.grabbedby(A)) - D.Stun(1.5 SECONDS) - if(A.grab_state < 1) - restraining = FALSE - return TRUE - else - return FALSE - -///CQC harm intent, deals 15 stamina damage and immobilizes for 1.5 seconds, if the attacker is prone, they knock the defender down and stand up -/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!(can_use(A) || can_use(D))) - return FALSE - add_to_streak("H",D) - if(check_streak(A,D)) - return TRUE - log_combat(A, D, "attacked (CQC)") - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - var/picked_hit_type = pick("CQC'd", "Big Bossed") - var/bonus_damage = A.get_punchdamagehigh() + 5 //15 damage - D.apply_damage(bonus_damage, STAMINA) - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - D.visible_message(span_danger("[A] [picked_hit_type] [D]!"), \ - span_userdanger("[A] [picked_hit_type] you!")) - D.Immobilize(15) - log_combat(A, D, "[picked_hit_type] (CQC)") - if(!(A.mobility_flags & MOBILITY_STAND) && (D.mobility_flags & MOBILITY_STAND)) - D.visible_message("[A] leg sweeps [D]!", \ - span_userdanger("[A] leg sweeps you!")) - playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.Paralyze(10) - D.Knockdown(30) - A.set_resting(FALSE) - A.SetKnockdown(0) - log_combat(A, D, "sweeped (CQC)") - return TRUE +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Grab Grab-------------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +/** + * CQC restrain attack + * + * attack that puts the target into a restraining position, stunning and muting them for a short period + * used to set up a chokehold attack + */ +/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(chokehold_active) + return -///CQC disarm, 65% chance to instantly pick up the opponent's weapon and deal 5 stamina damage, also used for choke attack -/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!(can_use(A) || can_use(D))) - return FALSE - add_to_streak("D",D) - var/obj/item/I = null - if(check_streak(A,D)) - return TRUE - A.do_attack_animation(D, ATTACK_EFFECT_DISARM) - if(!D.stat && !D.IsParalyzed() && !restraining) - if(prob(65)) - I = D.get_active_held_item() - D.visible_message(span_warning("[A] quickly grabs [D]'s arm and and chops it, disarming them!"), \ - span_userdanger("[A] grabs your arm and chops it, disarming you!")) - playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) - D.adjust_jitter(2 SECONDS) - D.apply_damage(A.get_punchdamagehigh()/2, STAMINA) //5 damage - else - D.visible_message(span_danger("[A] grabs at [D]'s arm, but misses!"), \ - span_userdanger("[A] grabs at your arm, but misses!")) - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") - if(restraining && A.pulling == D) - if(chokehold_active) - return TRUE - log_combat(A, D, "began to chokehold(CQC)") - D.visible_message( - span_danger("[isipc(D) ? "[A] attempts to deactivate [D]!" : "[A] puts [D] into a chokehold!"]"), - span_userdanger("[isipc(D) ? "[A] attempts to deactivate you!" : "[A] puts you into a chokehold!"]") - ) - if(handle_chokehold(A, D)) - D.Unconscious(40 SECONDS) - if(A.grab_state < GRAB_NECK) - A.grab_state = GRAB_NECK - A.visible_message(span_danger("[A] relaxes their grip on [D]."), \ - span_danger("You relax your grip on [D].")) //visible message comes from attacker since defender is unconscious and therefore can't see - else - if(A.grab_state) //honestly with the way current grabs work this doesn't really do all that much - A.grab_state = min(1, A.grab_state - 1) //immediately lose grab power... - if(!A.grab_state || prob(BASE_GRAB_RESIST_CHANCE/A.grab_state)) //...and have a chance to lose the entire grab - A.visible_message(span_danger("[A] is put off balance, losing their grip on [D]!"), \ - span_danger("You are put off balance, and you lose your grip on [D]!")) - A.stop_pulling() - else - A.visible_message(span_danger("[A] is put off balance, and struggles to maintain their grip on [D]!"), \ - "You try to remember some of the basics of CQC.") + + var/list/combined_msg = list() + combined_msg += "You try to remember some of the basics of CQC." + + combined_msg += span_notice("All of your unarmed attacks deal stamina damage instead of your normal physical damage type") + + combined_msg += span_notice("Punching (Combat Mode) Will deal more stamina damage, \ + and hitting a standing opponent while you are prone will both knock them down and stand you up. Has a reduced attack cooldown.") + combined_msg += span_notice("Shoving (Right Click) Immediately disarms the opponent's main hand. Has a reduced attack cooldown.") + combined_msg += span_notice("Grabbing (Ctrl Click) Has a significantly reduced attack cooldown, allowing you to quickly increase the strength of your grabs.") + + combined_msg += "[span_notice("Dislocate")]: Disarm Harm. Disables the targeted limb or a random limb if the head or chest are targeted." + combined_msg += "[span_notice("CQC Kick")]: Disarm Disarm. Knocks a standing opponent away and slows them. Deals heavy stamina damage and briefly muting prone opponents." + combined_msg += "[span_notice("Slam")]: Harm Disarm. Slam opponent into the ground, knocking them down and dealing decent stamina damage." + combined_msg += "[span_notice("Discombobulate")]: Harm Harm. Offensive move, deals bonus stamina damage and confuses the target." - to_chat(usr, span_notice("All of your unarmed attacks deal stamina damage instead of your normal physical damage type")) + combined_msg += "[span_notice("Chokehold")]: Grab Grab. Locks opponents into a restraining position, and proceeds to attempt to choke them unconcious." - to_chat(usr, span_notice("Shoving (Right Click) Has a chance to disarm the opponent's main hand, and immediately pick up the item if successful")) - to_chat(usr, span_notice("Grabbing (Ctrl Click) Will stun opponents briefly, allowing you to quickly increase the strength of your grabs")) - to_chat(usr, span_notice("Punching (Combat Mode) Will deal more stamina damage, and hitting a standing opponent while you are prone will both knock them down and stand you up")) + combined_msg += "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!" - to_chat(usr, "[span_notice("Slam")]: Grab Harm. Slam opponent into the ground, knocking them down and dealing decent stamina damage.") - to_chat(usr, "[span_notice("CQC Kick")]: Disarm Harm. Knocks opponent away and slows them. Deals heavy stamina damage to prone opponents, as well as muting them for a short time.") - to_chat(usr, "[span_notice("Restrain")]: Grab Grab. Locks opponents into a restraining position, making your grab harder to break out of. Disarm to begin a chokehold which deal gradual oxygen damage until the opponent is unconscious, with the damage increasing based on their stamina damage. Failing to complete the chokehold will weaken and possibly break your grab.") - to_chat(usr, "[span_notice("Pressure")]: Disarm Grab. Disables the targeted limb or a random limb if the head or chest are targeted, as well as forcing the target to drop anything they are holding.") - to_chat(usr, "[span_notice("Consecutive CQC")]: Harm Harm Harm Harm Harm. Offensive move, deals bonus stamina damage and knocking down on the last hit.") + to_chat(usr, examine_block(combined_msg.Join("\n"))) - to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!") +//////////////////////////////////////////////////////////////////////////////////// +//----------------------------------Chef version----------------------------------// +//////////////////////////////////////////////////////////////////////////////////// +/datum/martial_art/cqc/under_siege + name = "Close Quarters Cooking" + id = MARTIALART_CQC_COOK + just_a_cook = TRUE + +/datum/martial_art/cqc/under_siege/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen + var/area/A = get_area(H) + if(!(istype(A, /area/crew_quarters/kitchen))) + return FALSE + return ..() + +/datum/martial_art/cqc/under_siege/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(D)) //if you somehow check the streak on a target outside of kitchen, still stop + return FALSE + return ..() + +/datum/martial_art/cqc/under_siege/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(D)) //no disarming people outside of the kitchen + return FALSE + return ..() + +/datum/martial_art/cqc/under_siege/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(D)) //no harming people outside of the kitchen + return FALSE + return ..() + +/datum/martial_art/cqc/under_siege/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(!can_use(D)) //no grabbing people outside of the kitchen + return FALSE + return ..() From f2222b2ebdb9cca1324b16a318bcec0a66ff8837 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:32:48 -0500 Subject: [PATCH 02/19] Update cqc.dm --- code/datums/martial/cqc.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 26e20639ad42..ab8763e08f22 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -19,8 +19,6 @@ #define PRESSURE_COMBO "DH" ///consecutive combo string #define CONSECUTIVE_COMBO "HH" -///restrain combo string -#define RESTRAIN_COMBO "GG" /datum/martial_art/cqc name = "CQC" @@ -64,10 +62,6 @@ streak = "" Consecutive(A,D) return TRUE - if(findtext(streak,RESTRAIN_COMBO)) - streak = "" - Restrain(A,D) - return TRUE return FALSE From a4e46fe54df1566c030ae00b82ab1779a3459f81 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:32:54 -0500 Subject: [PATCH 03/19] Update cqc.dm --- code/datums/martial/cqc.dm | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index ab8763e08f22..c8581ebe753a 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -148,10 +148,8 @@ if(D.grabbedby(A)) A.changeNext_move(CLICK_CD_RAPID) //faster cooldown from grabs - - add_to_streak("G",D) - if(check_streak(A,D)) //if a combo is made no grab upgrade is done - return TRUE + if(A.grab_state == GRAB_AGGRESSIVE) + Restrain(A, D) return TRUE //////////////////////////////////////////////////////////////////////////////////// @@ -267,13 +265,11 @@ return D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) - D.Stun(10) - if(!(A.pulling == D)) - D.grabbedby(A, 1) - if(A.grab_state < GRAB_AGGRESSIVE) - A.grab_state = GRAB_AGGRESSIVE log_combat(A, D, "restrained (CQC)") + D.Stun(10) + do_after(A, 1 SECONDS, D) + log_combat(A, D, "began to chokehold(CQC)") D.visible_message( span_danger("[isipc(D) ? "[A] attempts to deactivate [D]!" : "[A] puts [D] into a chokehold!"]"), From 947321412e6113ff3fb35438198f646380481caa Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:34:17 -0500 Subject: [PATCH 04/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c8581ebe753a..c1e684078307 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -351,7 +351,7 @@ combined_msg += "[span_notice("Slam")]: Harm Disarm. Slam opponent into the ground, knocking them down and dealing decent stamina damage." combined_msg += "[span_notice("Discombobulate")]: Harm Harm. Offensive move, deals bonus stamina damage and confuses the target." - combined_msg += "[span_notice("Chokehold")]: Grab Grab. Locks opponents into a restraining position, and proceeds to attempt to choke them unconcious." + combined_msg += "[span_notice("Chokehold")]: Getting a target into an aggressive grab lock them into a restraining position, and proceeds to attempt to choke them unconscious." combined_msg += "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!" From 05e9fbf9884c425b72335860971a37f0c9ada2c1 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:34:29 -0500 Subject: [PATCH 05/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c1e684078307..beb746c53dff 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -351,7 +351,7 @@ combined_msg += "[span_notice("Slam")]: Harm Disarm. Slam opponent into the ground, knocking them down and dealing decent stamina damage." combined_msg += "[span_notice("Discombobulate")]: Harm Harm. Offensive move, deals bonus stamina damage and confuses the target." - combined_msg += "[span_notice("Chokehold")]: Getting a target into an aggressive grab lock them into a restraining position, and proceeds to attempt to choke them unconscious." + combined_msg += "[span_notice("Chokehold")]: Getting a target into an aggressive grab locks them into a restraining position, and proceeds to attempt to choke them unconscious." combined_msg += "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!" From 053e40c55ffccc1dcd440ef4c1f07bd379535b18 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:36:48 -0500 Subject: [PATCH 06/19] Update cqc.dm --- code/datums/martial/cqc.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index beb746c53dff..bb44fcbd224f 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -70,9 +70,9 @@ //////////////////////////////////////////////////////////////////////////////////// //proc the moves will use for damage dealing for armour checking purposes /datum/martial_art/cqc/proc/stamina_harm(mob/living/carbon/human/user, mob/living/carbon/human/victim, damage) - var/obj/item/bodypart/limb_to_hit = target.get_bodypart(user.zone_selected) - var/armor = target.run_armor_check(limb_to_hit, MELEE) - target.apply_damage(damage, STAMINA, blocked = armor) + var/obj/item/bodypart/limb_to_hit = victim.get_bodypart(user.zone_selected) + var/armor = victim.run_armor_check(limb_to_hit, MELEE) + victim.apply_damage(damage, STAMINA, blocked = armor) //////////////////////////////////////////////////////////////////////////////////// //----------------------------------Harm intent-----------------------------------// @@ -103,7 +103,7 @@ D.Immobilize(1 SECONDS) playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - D.visible_message(span_danger("[A] [picked_hit_type] [D]!"), span_userdanger("[A] [picked_hit_type] you!")) + D.visible_message(span_danger("[A] [attack_verb] [D]!"), span_userdanger("[A] [attack_verb] you!")) A.changeNext_move(CLICK_CD_RANGE) //faster cooldown from basic hits log_combat(A, D, "[attack_verb] (CQC)") @@ -363,7 +363,6 @@ /datum/martial_art/cqc/under_siege name = "Close Quarters Cooking" id = MARTIALART_CQC_COOK - just_a_cook = TRUE /datum/martial_art/cqc/under_siege/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen var/area/A = get_area(H) From 74ac5f4ea5ff63db36cc3710c525cb7c4c7bb96c Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:41:32 -0500 Subject: [PATCH 07/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index bb44fcbd224f..be525eb415d3 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -47,7 +47,7 @@ Kick(A,D) return TRUE - if(!D.mobility_flags & MOBILITY_STAND) //the rest need a standing target + if(!(D.mobility_flags & MOBILITY_STAND)) //the rest need a standing target return FALSE if(findtext(streak,SLAM_COMBO)) From 1c28dfd0d8a7351340c33f4d428d93d6f658737d Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 12:51:17 -0500 Subject: [PATCH 08/19] Update cqc.dm --- code/datums/martial/cqc.dm | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index be525eb415d3..48fafec49696 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -116,10 +116,16 @@ /datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE + + if(A.pulling == D && A.grab_state >= GRAB_AGGRESSIVE) + chokehold(A, D) + return TRUE + add_to_streak("D",D) if(check_streak(A,D)) return TRUE + A.do_attack_animation(D, ATTACK_EFFECT_DISARM) playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) @@ -146,10 +152,13 @@ if(A == D) // prevents grabbing yourself return FALSE + var/old_grab_state = A.grab_state if(D.grabbedby(A)) A.changeNext_move(CLICK_CD_RAPID) //faster cooldown from grabs - if(A.grab_state == GRAB_AGGRESSIVE) - Restrain(A, D) + if(A.grab_state == GRAB_AGGRESSIVE && A.grab_state != old_grab_state) + D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) + log_combat(A, D, "restrained (CQC)") + D.Stun(1 SECONDS) return TRUE //////////////////////////////////////////////////////////////////////////////////// @@ -260,16 +269,10 @@ * attack that puts the target into a restraining position, stunning and muting them for a short period * used to set up a chokehold attack */ -/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D) +/datum/martial_art/cqc/proc/chokehold(mob/living/carbon/human/A, mob/living/carbon/human/D) if(chokehold_active) return - D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) - log_combat(A, D, "restrained (CQC)") - D.Stun(10) - - do_after(A, 1 SECONDS, D) - log_combat(A, D, "began to chokehold(CQC)") D.visible_message( span_danger("[isipc(D) ? "[A] attempts to deactivate [D]!" : "[A] puts [D] into a chokehold!"]"), @@ -351,7 +354,8 @@ combined_msg += "[span_notice("Slam")]: Harm Disarm. Slam opponent into the ground, knocking them down and dealing decent stamina damage." combined_msg += "[span_notice("Discombobulate")]: Harm Harm. Offensive move, deals bonus stamina damage and confuses the target." - combined_msg += "[span_notice("Chokehold")]: Getting a target into an aggressive grab locks them into a restraining position, and proceeds to attempt to choke them unconscious." + combined_msg += "[span_notice("Restrain")]: Getting a target into an aggressive grab locks them into a restraining position, briefly stunning them." + combined_msg += "[span_notice("Chokehold")]: Disarming a target you have aggressively grabbed will attempt to choke them unconscious." combined_msg += "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to counter attacks done to you. Beware, counter-attacks are tiring and you won't be able to defend yourself forever!" From 7e92bbdac59f995add9ef3946585d8eeb949c7f3 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 13:10:26 -0500 Subject: [PATCH 09/19] Update cqc.dm --- code/datums/martial/cqc.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 48fafec49696..e6c509b23b30 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -153,8 +153,8 @@ return FALSE var/old_grab_state = A.grab_state - if(D.grabbedby(A)) - A.changeNext_move(CLICK_CD_RAPID) //faster cooldown from grabs + D.grabbedby(A) + addtimer(CALLBACK(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)) //gotta do it this way because grabs are weird if(A.grab_state == GRAB_AGGRESSIVE && A.grab_state != old_grab_state) D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) log_combat(A, D, "restrained (CQC)") From adfe5ec5b142444b7f6acbd0e7c5ef5b770c5a81 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 13:16:36 -0500 Subject: [PATCH 10/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index e6c509b23b30..4ae4550b5eed 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -154,7 +154,7 @@ var/old_grab_state = A.grab_state D.grabbedby(A) - addtimer(CALLBACK(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)) //gotta do it this way because grabs are weird + INVOKE_ASYNC(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)//gotta do it this way because grabs are weird if(A.grab_state == GRAB_AGGRESSIVE && A.grab_state != old_grab_state) D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) log_combat(A, D, "restrained (CQC)") From 6ecf4c55acf271d91a3db3fd609837a0e3146a8d Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 13:21:50 -0500 Subject: [PATCH 11/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 4ae4550b5eed..e6c509b23b30 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -154,7 +154,7 @@ var/old_grab_state = A.grab_state D.grabbedby(A) - INVOKE_ASYNC(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)//gotta do it this way because grabs are weird + addtimer(CALLBACK(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)) //gotta do it this way because grabs are weird if(A.grab_state == GRAB_AGGRESSIVE && A.grab_state != old_grab_state) D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) log_combat(A, D, "restrained (CQC)") From 022ca5a5f84c415d9cf55ec5ba3e5b25abe7d84e Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 13:22:38 -0500 Subject: [PATCH 12/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index e6c509b23b30..ed070e7b6c23 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -155,6 +155,8 @@ var/old_grab_state = A.grab_state D.grabbedby(A) addtimer(CALLBACK(A, TYPE_PROC_REF(/mob/living, changeNext_move), CLICK_CD_RAPID)) //gotta do it this way because grabs are weird + //no, invoke async doesn't work. Yes, this works despite the lack of time included in the parameters + if(A.grab_state == GRAB_AGGRESSIVE && A.grab_state != old_grab_state) D.visible_message(span_warning("[A] locks [D] into a restraining position!"), span_userdanger("[A] locks you into a restraining position!")) log_combat(A, D, "restrained (CQC)") From 07410b7daac3c6342dc216f06a1054e067a9f7d1 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 1 Jul 2024 13:49:18 -0500 Subject: [PATCH 13/19] Update cqc.dm --- code/datums/martial/cqc.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index ed070e7b6c23..2909d2f31cb5 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -29,6 +29,11 @@ ///used to stop a chokehold attack from stacking var/chokehold_active = FALSE +/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) + if(!H.combat_mode) + return FALSE + return ..() + //////////////////////////////////////////////////////////////////////////////////// //----------------------------------Check Streak----------------------------------// //////////////////////////////////////////////////////////////////////////////////// From 365913fcb8deefa1178db08582130359e76ca6f3 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 2 Jul 2024 13:54:22 -0500 Subject: [PATCH 14/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 2909d2f31cb5..082991725016 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -203,7 +203,7 @@ playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) step(D, A.dir) stamina_harm(A, D, A.get_punchdamagehigh() * 1.5) //15 damage - D.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH) + D.add_movespeed_modifier(MOVESPEED_ID_SHOVE, override = TRUE, multiplicative_slowdown = (SHOVE_SLOWDOWN_STRENGTH * 1.5)) addtimer(CALLBACK(D, TYPE_PROC_REF(/mob/living/carbon/human, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH) else log_combat(A, D, "prone-kicked(CQC)") From 9c3fabb682405dcc3f8db1698ebcf3fefba9fb7e Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 2 Jul 2024 14:21:14 -0500 Subject: [PATCH 15/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 082991725016..58a724ba5e7b 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -212,7 +212,7 @@ var/kickdamage = A.get_punchdamagehigh() * 4 //40 damage stamina_harm(A, D, kickdamage) D.clear_stamina_regen() //used for keeping people down, so reset that regen timer - D.Paralyze(5) + D.Stun(1 SECONDS) D.silent += 2 return TRUE From 52af454f5ce1ed3b1d50a8d566085645712d6651 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 2 Jul 2024 14:24:26 -0500 Subject: [PATCH 16/19] Update cqc.dm --- code/datums/martial/cqc.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 58a724ba5e7b..e80875ec68d1 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -134,9 +134,7 @@ A.do_attack_animation(D, ATTACK_EFFECT_DISARM) playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - var/obj/item/I = D.get_active_held_item() - if(I) - D.dropItemToGround(I) + if(D.drop_all_held_items()) D.visible_message(span_warning("[A] quickly grabs [D]'s arm and and chops it, disarming them!"), span_userdanger("[A] grabs your arm and chops it, disarming you!")) else D.visible_message(span_warning("[A] quickly chops [D]'s arm!"), span_userdanger("[A] quickly chops your arm!")) From 337be0a1c9baf3fd9a15aee2f3d7d112c04daa74 Mon Sep 17 00:00:00 2001 From: Molti Date: Fri, 5 Jul 2024 19:19:00 -0500 Subject: [PATCH 17/19] Update cqc.dm --- code/datums/martial/cqc.dm | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index e80875ec68d1..f54694ce896a 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -32,7 +32,7 @@ /datum/martial_art/cqc/can_use(mob/living/carbon/human/H) if(!H.combat_mode) return FALSE - return ..() + return TRUE //////////////////////////////////////////////////////////////////////////////////// //----------------------------------Check Streak----------------------------------// @@ -373,28 +373,33 @@ name = "Close Quarters Cooking" id = MARTIALART_CQC_COOK -/datum/martial_art/cqc/under_siege/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen +/datum/martial_art/cqc/under_siege/proc/in_kitchen(mob/living/carbon/human/H) var/area/A = get_area(H) - if(!(istype(A, /area/crew_quarters/kitchen))) + if(istype(A, /area/crew_quarters/kitchen)) + return TRUE + return FALSE + +/datum/martial_art/cqc/under_siege/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen + if(!in_kitchen(H)) return FALSE return ..() /datum/martial_art/cqc/under_siege/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(D)) //if you somehow check the streak on a target outside of kitchen, still stop + if(!in_kitchen(D)) //if you somehow check the streak on a target outside of kitchen, still stop return FALSE return ..() /datum/martial_art/cqc/under_siege/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(D)) //no disarming people outside of the kitchen + if(!in_kitchen(D)) //no disarming people outside of the kitchen return FALSE return ..() /datum/martial_art/cqc/under_siege/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(D)) //no harming people outside of the kitchen + if(!in_kitchen(D)) //no harming people outside of the kitchen return FALSE return ..() /datum/martial_art/cqc/under_siege/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!can_use(D)) //no grabbing people outside of the kitchen + if(!in_kitchen(D)) //no grabbing people outside of the kitchen return FALSE return ..() From 0f1090f94dbac14832e23a6aa2d504c529fc2d38 Mon Sep 17 00:00:00 2001 From: Molti Date: Fri, 5 Jul 2024 19:19:13 -0500 Subject: [PATCH 18/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index f54694ce896a..6e3b23499455 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -32,7 +32,7 @@ /datum/martial_art/cqc/can_use(mob/living/carbon/human/H) if(!H.combat_mode) return FALSE - return TRUE + return ..() //////////////////////////////////////////////////////////////////////////////////// //----------------------------------Check Streak----------------------------------// From d9504243e1c6c63b887d9f0124bd355b87bb8ac5 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 11 Jul 2024 16:35:54 -0500 Subject: [PATCH 19/19] Update cqc.dm --- code/datums/martial/cqc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 6e3b23499455..b2885936a757 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -105,7 +105,7 @@ var/bonus_damage = A.get_punchdamagehigh() * 1.5 //15 damage stamina_harm(A, D, bonus_damage) - D.Immobilize(1 SECONDS) + D.Immobilize(0.5 SECONDS) playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) D.visible_message(span_danger("[A] [attack_verb] [D]!"), span_userdanger("[A] [attack_verb] you!"))