diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1e99ea2bc77..8e69face174 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -419,7 +419,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "RPGD"
item = /obj/item/clothing/gloves/fingerless/rapid
cost = 8
- excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/sniper
name = "Sniper Rifle"
@@ -767,12 +766,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/stealthy_weapons/cqc
name = "CQC Manual"
- desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing."
+ desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing. Does not restrict weapon usage, but cannot be used alongside Gloves of the North Star."
reference = "CQC"
item = /obj/item/CQC_manual
- gamemodes = list(/datum/game_mode/nuclear)
- cost = 8
- surplus = 0
+ cost = 9
/datum/uplink_item/stealthy_weapons/throwingweapons
name = "Box of Throwing Weapons"
diff --git a/code/modules/martial_arts/cqc.dm b/code/modules/martial_arts/cqc.dm
index ab7ce5dd250..58082baa359 100644
--- a/code/modules/martial_arts/cqc.dm
+++ b/code/modules/martial_arts/cqc.dm
@@ -9,29 +9,34 @@
help_verb = /mob/living/carbon/human/proc/CQC_help
block_chance = 75
+/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
+ if (istype(H.gloves, /obj/item/clothing/gloves/fingerless/rapid))
+ return FALSE
+ return ..()
+
/datum/martial_art/cqc/proc/drop_restraining()
restraining = FALSE
/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
- if(findtext(streak,SLAM_COMBO))
+ if(findtext(streak, SLAM_COMBO))
streak = ""
Slam(A, D)
return TRUE
- if(findtext(streak,KICK_COMBO))
+ if(findtext(streak, KICK_COMBO))
streak = ""
Kick(A, D)
return TRUE
- if(findtext(streak,RESTRAIN_COMBO))
+ if(findtext(streak, RESTRAIN_COMBO))
streak = ""
Restrain(A, D)
return TRUE
- if(findtext(streak,PRESSURE_COMBO))
+ if(findtext(streak, PRESSURE_COMBO))
streak = ""
Pressure(A, D)
return TRUE
- if(findtext(streak,CONSECUTIVE_COMBO))
+ if(findtext(streak, CONSECUTIVE_COMBO))
streak = ""
Consecutive(A, D)
return FALSE
@@ -45,6 +50,11 @@
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
D.apply_damage(10, BRUTE)
D.Weaken(6)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Slam", ATKLOG_ALL)
+ else //if target can't be slammed, do a regular grab attack then clear the streak
+ streak = ""
+ grab_act(A, D)
+ streak = ""
return TRUE
/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -57,12 +67,18 @@
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 1, 14, A)
D.apply_damage(10, BRUTE)
- if(D.weakened && !D.stat)
- D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \
- "[A] kicks your head, knocking you out!")
- playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
- D.SetSleeping(15)
- D.adjustBrainLoss(15, 150)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL)
+ if(D.weakened && !D.stat)
+ D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \
+ "[A] kicks your head, knocking you out!")
+ playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
+ D.SetSleeping(15)
+ D.adjustBrainLoss(15, 150)
+ add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL)
+ else //if target can't be kicked, do a regular harm attack then clear the streak
+ streak = ""
+ harm_act(A, D)
+ streak = ""
return TRUE
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -71,6 +87,7 @@
D.visible_message("[A] forces their arm on [D]'s neck!")
D.adjustStaminaLoss(60)
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Pressure", ATKLOG_ALL)
return TRUE
/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -85,6 +102,7 @@
D.Stun(5)
restraining = TRUE
addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Restrain", ATKLOG_ALL)
return TRUE
/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -99,6 +117,11 @@
A.put_in_hands(I)
D.adjustStaminaLoss(50)
D.apply_damage(25, BRUTE)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Consecutive", ATKLOG_ALL)
+ else //if target can't be hit, do a regular harm attack then clear the streak
+ streak = ""
+ harm_act(A, D)
+ streak = ""
return TRUE
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -119,7 +142,7 @@
if(check_streak(A, D))
return TRUE
A.do_attack_animation(D)
- var/picked_hit_type = pick("CQC'd", "Big Bossed")
+ var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched")
var/bonus_damage = 13
if(D.weakened || D.resting || D.lying)
bonus_damage += 5
@@ -131,40 +154,36 @@
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
D.visible_message("[A] [picked_hit_type] [D]!", \
"[A] [picked_hit_type] you!")
+ add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL)
if(A.resting && !D.stat && !D.weakened)
D.visible_message("[A] leg sweeps [D]!", \
"[A] leg sweeps you!")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
D.apply_damage(10, BRUTE)
D.Weaken(3)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Leg sweep", ATKLOG_ALL)
return TRUE
/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)
- var/obj/item/I = null
if(check_streak(A, D))
return TRUE
- if(prob(65))
- if(!D.stat || !D.weakened || !restraining)
- I = D.get_active_hand()
- D.visible_message("[A] strikes [D]'s jaw with their hand!", \
- "[A] strikes your jaw, disorienting you!")
- playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- if(I && D.drop_item())
- A.put_in_hands(I)
- D.Jitter(2)
- D.apply_damage(5, BRUTE)
- else
- D.visible_message("[A] attempted to disarm [D]!", \
- "[A] attempted to disarm [D]!")
- playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ if(!restraining)
+ I = D.get_active_hand()
+ D.visible_message("[A] strikes [D]'s jaw with their hand!", \
+ "[A] strikes your jaw, disorienting you!")
+ playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ D.Jitter(2)
+ D.apply_damage(5, BRUTE)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarm", ATKLOG_ALL)
if(restraining)
D.visible_message("[A] puts [D] into a chokehold!", \
"[A] puts you into a chokehold!")
D.SetSleeping(20)
restraining = FALSE
+ add_attack_logs(A, D, "Knocked out with martial-art [src] : Choke hold", ATKLOG_ALL)
else
restraining = FALSE
return FALSE