diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 0488f18555f..e7c5daccde8 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -186,15 +186,24 @@
var/cooldown_check = 0 // Used interally, you don't want to modify
- var/cooldown = 40 // Default wait time until can stun again.
- var/knockdown_time_carbon = (1.5 SECONDS) // Knockdown length for carbons.
- var/stun_time_silicon = (5 SECONDS) // If enabled, how long do we stun silicons.
- var/stamina_damage = 55 // Do we deal stamina damage.
- var/affect_silicon = FALSE // Does it stun silicons.
- var/on_sound // "On" sound, played when switching between able to stun or not.
- var/on_stun_sound = 'sound/effects/woodhit.ogg' // Default path to sound for when we stun.
- var/stun_animation = TRUE // Do we animate the "hit" when stunning.
- var/on = TRUE // Are we on or off.
+ /// Default wait time until can stun again.
+ var/cooldown = (4 SECONDS)
+ /// The length of the knockdown applied to a struck living, non-cyborg mob.
+ var/knockdown_time = (1.5 SECONDS)
+ /// If affect_cyborg is TRUE, this is how long we stun cyborgs for on a hit.
+ var/stun_time_cyborg = (5 SECONDS)
+ /// How much stamina damage we deal on a successful hit against a living, non-cyborg mob.
+ var/stamina_damage = 55
+ /// Can we stun cyborgs?
+ var/affect_cyborg = FALSE
+ /// "On" sound, played when switching between able to stun or not.
+ var/on_sound
+ /// The path of the default sound to play when we stun something.
+ var/on_stun_sound = 'sound/effects/woodhit.ogg'
+ /// Do we animate the "hit" when stunning something?
+ var/stun_animation = TRUE
+ /// Are we on or off?
+ var/on = TRUE
var/on_icon_state // What is our sprite when turned on
var/off_icon_state // What is our sprite when turned off
@@ -211,11 +220,11 @@
if(stamina_damage != 0)
offensive_notes = "\nVarious interviewed security forces report being able to beat criminals into exhaustion with only [span_warning("[round(100 / stamina_damage, 0.1)] hit\s!")]"
-// Description for trying to stun when still on cooldown.
+/// Description for trying to stun when still on cooldown.
/obj/item/melee/classic_baton/proc/get_wait_description()
return
-// Description for when turning their baton "on"
+/// Description for when turning the baton "on".
/obj/item/melee/classic_baton/proc/get_on_description()
. = list()
@@ -224,7 +233,7 @@
return .
-// Default message for stunning mob.
+/// Default message for stunning a living, non-cyborg mob.
/obj/item/melee/classic_baton/proc/get_stun_description(mob/living/target, mob/living/user)
. = list()
@@ -233,8 +242,8 @@
return .
-// Default message for stunning a silicon.
-/obj/item/melee/classic_baton/proc/get_silicon_stun_description(mob/living/target, mob/living/user)
+/// Default message for stunning a cyborg.
+/obj/item/melee/classic_baton/proc/get_cyborg_stun_description(mob/living/target, mob/living/user)
. = list()
.["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!")
@@ -242,12 +251,21 @@
return .
-// Are we applying any special effects when we stun to carbon
-/obj/item/melee/classic_baton/proc/additional_effects_carbon(mob/living/target, mob/living/user)
+/// Default message for trying to stun a cyborg with a baton that can't stun cyborgs.
+/obj/item/melee/classic_baton/proc/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user)
+ . = list()
+
+ .["visible"] = "[user] tries to knock down [target] with [src], and predictably fails!" //look at this duuuuuude
+ .["local"] = "[target] tries to... knock you down with [src]?" //look at the top of his head!
+
+ return .
+
+/// Contains any special effects that we apply to living, non-cyborg mobs we stun. Does not include applying a knockdown, dealing stamina damage, etc.
+/obj/item/melee/classic_baton/proc/additional_effects_non_cyborg(mob/living/target, mob/living/user)
return
-// Are we applying any special effects when we stun to silicon
-/obj/item/melee/classic_baton/proc/additional_effects_silicon(mob/living/target, mob/living/user)
+/// Contains any special effects that we apply to cyborgs we stun. Does not include flashing the cyborg's screen, hardstunning them, etc.
+/obj/item/melee/classic_baton/proc/additional_effects_cyborg(mob/living/target, mob/living/user)
return
/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user, params)
@@ -256,37 +274,27 @@
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
- to_chat(user, "You hit yourself over the head!")
+ user.visible_message("You accidentally hit yourself over the head with [src]!", "[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!")
- user.Paralyze(knockdown_time_carbon * force)
- user.apply_damage(stamina_damage, STAMINA, BODY_ZONE_HEAD)
-
- additional_effects_carbon(user) // user is the target here
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
- else
- user.take_bodypart_damage(2*force)
- return
- if(iscyborg(target))
- // We don't stun if we're on harm.
- if (!user.combat_mode)
- if (affect_silicon)
- var/list/desc = get_silicon_stun_description(target, user)
-
- target.flash_act(affect_silicon = TRUE)
- target.Paralyze(stun_time_silicon)
- additional_effects_silicon(target, user)
-
- user.visible_message(desc["visible"], desc["local"])
+ if(iscyborg(user))
+ if(affect_cyborg)
+ user.flash_act(affect_silicon = TRUE)
+ user.Paralyze(stun_time_cyborg * force)
+ additional_effects_cyborg(user, user) // user is the target here
playsound(get_turf(src), on_stun_sound, 100, TRUE, -1)
-
- if (stun_animation)
- user.do_attack_animation(target)
else
- ..()
+ playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE)
else
- ..()
+ user.Paralyze(knockdown_time * force)
+ user.apply_damage(stamina_damage, STAMINA, BODY_ZONE_HEAD)
+ additional_effects_non_cyborg(user, user) // user is the target here
+ playsound(get_turf(src), on_stun_sound, 75, TRUE, -1)
+
+ user.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
+
+ log_combat(user, target, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src)
+ if(stun_animation)
+ user.do_attack_animation(user)
return
if(!isliving(target))
return
@@ -309,18 +317,30 @@
var/list/desc = get_stun_description(target, user)
- if (stun_animation)
- user.do_attack_animation(target)
+ if(iscyborg(target))
+ if(affect_cyborg)
+ desc = get_cyborg_stun_description(target, user)
- playsound(get_turf(src), on_stun_sound, 75, TRUE, -1)
- target.Knockdown(knockdown_time_carbon)
- target.apply_damage(stamina_damage, STAMINA, BODY_ZONE_CHEST)
- additional_effects_carbon(target, user)
+ target.flash_act(affect_silicon = TRUE)
+ target.Paralyze(stun_time_cyborg)
+ additional_effects_cyborg(target, user)
- log_combat(user, target, "stunned", src)
- add_fingerprint(user)
+ playsound(get_turf(src), on_stun_sound, 75, TRUE, -1)
+ else
+ desc = get_unga_dunga_cyborg_stun_description(target, user)
+
+ playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) //bonk
+ else
+ target.Knockdown(knockdown_time)
+ target.apply_damage(stamina_damage, STAMINA, BODY_ZONE_CHEST)
+ additional_effects_non_cyborg(target, user)
+
+ playsound(get_turf(src), on_stun_sound, 75, TRUE, -1)
target.visible_message(desc["visible"], desc["local"])
+ log_combat(user, target, "stun attacked", src)
+ if(stun_animation)
+ user.do_attack_animation(target)
if(!iscarbon(user))
target.LAssailant = null
@@ -419,7 +439,7 @@
cooldown = 25
stamina_damage = 85
- affect_silicon = TRUE
+ affect_cyborg = TRUE
on_sound = 'sound/weapons/contractorbatonextend.ogg'
on_stun_sound = 'sound/effects/contractorbatonhit.ogg'
@@ -433,7 +453,7 @@
/obj/item/melee/classic_baton/telescopic/contractor_baton/get_wait_description()
return span_danger("The baton is still charging!")
-/obj/item/melee/classic_baton/telescopic/contractor_baton/additional_effects_carbon(mob/living/target, mob/living/user)
+/obj/item/melee/classic_baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/target, mob/living/user)
target.Jitter(20)
target.stuttering += 20