diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 6c995d75e0..24892c6d43 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -1,3 +1,9 @@
+/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))
+ return u_attack
+ return null
+
/mob/living/carbon/human/attack_hand(mob/living/carbon/M as mob)
var/mob/living/carbon/human/H = M
@@ -178,13 +184,7 @@
miss_type = 2
// See what attack they use
- var/datum/unarmed_attack/attack = null
- for(var/datum/unarmed_attack/u_attack in H.species.unarmed_attacks)
- if(!u_attack.is_usable(H, src, hit_zone))
- continue
- else
- attack = u_attack
- break
+ var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone)
if(!attack)
return 0
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index c3312b9a7a..466b1bd2ab 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -9,11 +9,15 @@
/datum/unarmed_attack/diona
attack_verb = list("lashed", "bludgeoned")
attack_noun = list("tendril")
+ eye_attack_text = "a tendril"
+ eye_attack_text_victim = "a tendril"
damage = 5
/datum/unarmed_attack/claws
attack_verb = list("scratched", "clawed", "slashed")
attack_noun = list("claws")
+ eye_attack_text = "claws"
+ eye_attack_text_victim = "sharp claws"
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
damage = 5
diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm
index 155a1f23b7..289b4a2273 100644
--- a/code/modules/mob/living/carbon/human/unarmed_attack.dm
+++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm
@@ -8,8 +8,11 @@
var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
var/sharp = 0
var/edge = 0
+
+ var/eye_attack_text
+ var/eye_attack_text_victim
-/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user)
+/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
@@ -78,6 +81,13 @@
user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.name]!")
playsound(user.loc, attack_sound, 25, 1, -1)
+/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)? "." : "!"]"
+
/datum/unarmed_attack/bite
attack_verb = list("bit")
attack_sound = 'sound/weapons/bite.ogg'
@@ -97,6 +107,8 @@
/datum/unarmed_attack/punch
attack_verb = list("punched")
attack_noun = list("fist")
+ eye_attack_text = "fingers"
+ eye_attack_text_victim = "digits"
damage = 0
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 60d2bf419b..acc95fbe40 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -351,6 +351,11 @@
if(I_HURT)
if(hit_zone == "eyes")
+ var/mob/living/carbon/human/H = affecting
+ var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone)
+ if(!attack)
+ return
+
if(state < GRAB_NECK)
assailant << "You require a better grab to do this."
return
@@ -362,16 +367,11 @@
if(!affecting.has_eyes())
assailant << "You cannot locate any eyes on [affecting]!"
return
- assailant.visible_message("[assailant] pressed \his fingers into [affecting]'s eyes!")
- affecting << "You experience immense pain as you feel digits being pressed into your eyes!"
- assailant.attack_log += text("\[[time_stamp()]\] Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])")
- affecting.attack_log += text("\[[time_stamp()]\] Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])")
- msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.")
- var/obj/item/organ/eyes/eyes = affecting:internal_organs_by_name["eyes"]
- eyes.damage += rand(3,4)
- if (eyes.damage >= eyes.min_broken_damage)
- if(affecting.stat != 2)
- affecting << "\red You go blind!"
+ assailant.attack_log += text("\[[time_stamp()]\] Attacked [affecting.name]'s eyes using grab ([affecting.ckey])")
+ affecting.attack_log += text("\[[time_stamp()]\] Had eyes attacked by [assailant.name]'s grab ([assailant.ckey])")
+ msg_admin_attack("[key_name(assailant)] attacked [key_name(affecting)]'s eyes using a grab action.")
+
+ attack.handle_eye_attack(assailant, affecting)
else if(hit_zone != "head")
if(state < GRAB_NECK)
assailant << "You require a better grab to do this."
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index 3b094f1fdd..05a73c703c 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -79,6 +79,12 @@
owner.b_eyes ? owner.b_eyes : 0
)
+/obj/item/organ/eyes/take_damage()
+ var/oldbroken = is_broken()
+ ..()
+ if(is_broken() && !oldbroken && owner && !owner.stat)
+ owner << "You go blind!"
+
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
..()
if(!owner)