diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 57a31cdd1d3..04c0a5fbfea 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -21,7 +21,7 @@
if(H.head && (H.head.body_parts_covered & FACE))
user << "Remove their [H.head] first."
return
- user.visible_message("\The [user] begins taping over \the [H]'s eyes!")
+ user.visible_message("\The [user] begins taping over \the [H]'s eyes!")
if(!do_after(user, 30))
return
@@ -30,7 +30,7 @@
if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
return
- user.visible_message("\The [user] has taped up \the [H]'s eyes!")
+ user.visible_message("\The [user] has taped up \the [H]'s eyes!")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
else if(user.zone_sel.selecting == "mouth" || user.zone_sel.selecting == "head")
@@ -46,7 +46,7 @@
if(H.head && (H.head.body_parts_covered & FACE))
user << "Remove their [H.head] first."
return
- user.visible_message("\The [user] begins taping up \the [H]'s mouth!")
+ user.visible_message("\The [user] begins taping up \the [H]'s mouth!")
if(!do_after(user, 30))
return
@@ -55,7 +55,7 @@
if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
return
- user.visible_message("\The [user] has taped up \the [H]'s mouth!")
+ user.visible_message("\The [user] has taped up \the [H]'s mouth!")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2e3fc00722d..eef1b952458 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1413,3 +1413,13 @@
get_scooped(H)
return
return ..()
+
+/mob/living/carbon/human/verb/pull_punches()
+ set name = "Pull Punches"
+ set desc = "Try not to hurt them."
+ set category = "IC"
+
+ if(stat) return
+ pulling_punches = !pulling_punches
+ src << "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"]."
+ return
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 6b12d0ea9ba..a0af1f2fcff 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -1,6 +1,10 @@
/mob/living/carbon/human/proc/get_unarmed_attack(var/mob/living/carbon/human/target, var/hit_zone)
for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks)
if(u_attack.is_usable(src, target, hit_zone))
+ if(pulling_punches)
+ var/datum/unarmed_attack/soft_variant = u_attack.get_sparring_variant()
+ if(soft_variant)
+ return soft_variant
return u_attack
return null
@@ -221,7 +225,7 @@
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target
- apply_damage(real_damage, BRUTE, affecting, armour, sharp=attack.sharp, edge=attack.edge)
+ apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge)
if(I_DISARM)
M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index bde26ceb600..7ed171a1f1d 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -82,6 +82,7 @@
var/list/flavor_texts = list()
var/gunshot_residue
+ var/pulling_punches // Are you trying not to hurt your opponent?
mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index 289b4a22733..72bf93753ce 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -1,3 +1,5 @@
+var/global/list/sparring_attack_cache = list()
+
//Species unarmed attacks
/datum/unarmed_attack
var/attack_verb = list("attack") // Empty hand hurt intent verb.
@@ -8,10 +10,19 @@
var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
var/sharp = 0
var/edge = 0
-
+
+ var/deal_halloss
+ var/sparring_variant_type = /datum/unarmed_attack/light_strike
+
var/eye_attack_text
var/eye_attack_text_victim
+/datum/unarmed_attack/proc/get_sparring_variant()
+ if(sparring_variant_type)
+ if(!sparring_attack_cache[sparring_variant_type])
+ sparring_attack_cache[sparring_variant_type] = new sparring_variant_type()
+ return sparring_attack_cache[sparring_variant_type]
+
/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if(user.restrained())
return 0
@@ -84,7 +95,7 @@
/datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
eyes.take_damage(rand(3,4), 1)
-
+
user.visible_message("[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!")
target << "You experience[(target.species.flags & NO_PAIN)? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(target.species.flags & NO_PAIN)? "." : "!"]"
@@ -233,4 +244,14 @@
switch(attack_damage)
if(1 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!")
- if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
\ No newline at end of file
+ if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
+
+/datum/unarmed_attack/light_strike
+ deal_halloss = 1
+ attack_noun = list("tap","light strike")
+ attack_verb = list("tapped", "lightly struck")
+ damage = 2
+ shredding = 0
+ damage = 0
+ sharp = 0
+ edge = 0
\ No newline at end of file