diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index a78daf7096a..646a06d1d97 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -50,6 +50,9 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
+ if(H.is_mouth_covered())
+ user << "Remove [ H == user ? "your" : "their" ] mask!"
+ return
if(H.lip_style) //if they already have lipstick on
user << "You need to wipe off the old lipstick first!"
return
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index d1e142cd09f..886ce709f86 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -3,7 +3,7 @@
var/force_on = 30 //force when active
var/throwforce_on = 20
var/icon_state_on = "axe1"
- var/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
w_class = 2
var/w_class_on = 4
@@ -31,7 +31,7 @@
flags = CONDUCT | NOSHIELD
origin_tech = "combat=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
- attack_verb_on = null
+ attack_verb_on = list()
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
user.visible_message("[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.")
@@ -47,7 +47,6 @@
throw_speed = 3
throw_range = 5
flags = NOSHIELD
- attack_verb = null
origin_tech = "magnets=3;syndicate=4"
var/hacked = 0
@@ -69,7 +68,7 @@
force = force_on
throwforce = throwforce_on
hitsound = 'sound/weapons/blade1.ogg'
- if(attack_verb_on)
+ if(attack_verb_on.len)
attack_verb = attack_verb_on
if(!item_color)
icon_state = icon_state_on
@@ -82,7 +81,8 @@
force = initial(force)
throwforce = initial(throwforce)
hitsound = initial(hitsound)
- attack_verb = initial(attack_verb)
+ if(attack_verb_on.len)
+ attack_verb = list()
icon_state = initial(icon_state)
w_class = initial(w_class)
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 4878387b59e..ac18e4dc922 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -92,7 +92,6 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/masks.dmi'
body_parts_covered = HEAD
slot_flags = SLOT_MASK
- var/alloweat = 0
strip_delay = 40
put_on_delay = 40
var/mask_adjusted = 0
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 6828d17dad4..f70bffdf3d7 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -222,7 +222,7 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "clown"
item_state = "clown_hat"
@@ -245,28 +245,28 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "sexyclown"
item_state = "sexyclown"
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "mime"
item_state = "mime"
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "monkeymask"
item_state = "monkeymask"
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "sexymime"
item_state = "sexymime"
@@ -283,5 +283,5 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
/obj/item/clothing/mask/gas/owl_mask
name = "owl mask"
desc = "Twoooo!"
- alloweat = 1
+ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "owl"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 86cd8abf179..da7111f55f9 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -138,9 +138,6 @@
/mob/living/carbon/alien/IsAdvancedToolUser()
return has_fine_manipulation
-/mob/living/carbon/alien/SpeciesCanConsume()
- return 1 // Aliens can eat, and they can be fed food/drink
-
/mob/living/carbon/alien/Stat()
..()
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index a4c27b35cf4..f24f47f8f65 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -123,7 +123,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.head && H.head.flags & HEADCOVERSMOUTH)
+ if(H.is_mouth_covered(head_only = 1))
H.visible_message("[src] smashes against [H]'s [H.head]!", \
"[src] smashes against [H]'s [H.head]!")
Die()
@@ -239,7 +239,7 @@ var/const/MAX_ACTIVE_TIME = 400
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.head && H.head.flags & HEADCOVERSMOUTH)
+ if(H.is_mouth_covered(head_only = 1))
return 0
return 1
return 0
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index dca6c42554c..bea7a98615b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -490,3 +490,7 @@ var/const/GALOSHES_DONT_HELP = 8
update_inv_legcuffed(0)
else
src << "You fail to break [I]!"
+
+/mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0)
+ if( (!mask_only && head && (head.flags & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)) )
+ return 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a8683a1f49c..7751934828d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -671,7 +671,6 @@
..()
-
/mob/living/carbon/human/help_shake_act(mob/living/carbon/M)
if(!istype(M))
return
@@ -730,6 +729,34 @@
..()
+/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C)
+ if(C.stat == DEAD)
+ src << "[C.name] is dead!"
+ return
+ if(is_mouth_covered())
+ src << "Remove your mask!"
+ return 0
+ if(C.is_mouth_covered())
+ src << "Remove their mask!"
+ return 0
+
+ if(C.cpr_time < world.time + 30)
+ add_logs(src, C, "CPRed")
+ visible_message("[src] is trying to perform CPR on [C.name]!", \
+ "You try to perform CPR on [C.name]. Hold still!")
+ if(!do_mob(src, C))
+ src << "You fail to perform CPR on [C]!"
+ return 0
+
+ if(C.health <= config.health_threshold_crit)
+ C.cpr_time = world.time
+ var/suff = min(C.getOxyLoss(), 7)
+ C.adjustOxyLoss(-suff)
+ C.updatehealth()
+ visible_message("[src] performs CPR on [C.name]!")
+ C << "You feel a breath of fresh air enter your lungs. It feels good."
+
+
/mob/living/carbon/human/generateStaticOverlay()
var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src)
staticOverlay.override = 1
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 902cce6896a..03ce28905fe 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -125,9 +125,6 @@
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
-/mob/living/carbon/human/SpeciesCanConsume()
- return 1 // Humans can eat, drink, and be forced to do so
-
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 67545dc5681..05be868bad7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -703,6 +703,8 @@
//////////////////
/datum/species/proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H)
+ if(!istype(M)) //sanity check for drones.
+ return
if((M != H) && H.check_shields(0, M.name))
add_logs(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]!")
@@ -715,29 +717,8 @@
if(H != M)
add_logs(M, H, "shaked")
return 1
-
- //CPR
- if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
- M << "Remove your mask!"
- return 0
- if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
- M << "Remove their mask!"
- return 0
-
- if(H.cpr_time < world.time + 30)
- add_logs(M, H, "CPRed")
- M.visible_message("[M] is trying to perform CPR on [H]!", \
- "You try to perform CPR on [H]. Hold still!")
- if(!do_mob(M, H))
- M << "You fail to perform CPR on [H]!"
- return 0
- if((H.health >= -99 && H.health <= 0))
- H.cpr_time = world.time
- var/suff = min(H.getOxyLoss(), 7)
- H.adjustOxyLoss(-suff)
- H.updatehealth()
- M.visible_message("[M] performs CPR on [H]!")
- H << "You feel a breath of fresh air enter your lungs. It feels good."
+ else
+ M.do_cpr(H)
if("grab")
H.grabbedby(M)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index d275d0744ba..41e2982d9b4 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -241,10 +241,6 @@
return threatcount
-/mob/living/carbon/monkey/SpeciesCanConsume()
- return 1 // Monkeys can eat, drink, and be forced to do so
-
-
/mob/living/carbon/monkey/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
if(wear_mask)
if(!wear_mask.unacidable)
@@ -255,3 +251,10 @@
return
take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
+
+/mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M)
+ if(health < 0 && ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.do_cpr(src)
+ else
+ ..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3a4af5d847c..1d3ff94e458 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -838,9 +838,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/activate_hand(var/selhand)
return
-/mob/proc/SpeciesCanConsume()
- return 0
-
/mob/proc/Jitter(amount)
jitteriness = max(jitteriness,amount,0)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index ab4fd76f5ac..a938b092061 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -54,28 +54,18 @@
else return "No reagents"
/obj/item/weapon/reagent_containers/proc/canconsume(mob/eater, mob/user)
- if(!eater.SpeciesCanConsume())
+ if(!iscarbon(eater))
+ return 0
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(user) || eater == user) ? "your" : "their"
+ user << "You have to remove [who] [covered] first!"
return 0
- //Check for covering mask
- var/obj/item/clothing/cover = eater.get_item_by_slot(slot_wear_mask)
-
- if(isnull(cover)) // No mask, do we have any helmet?
- cover = eater.get_item_by_slot(slot_head)
- else
- var/obj/item/clothing/mask/covermask = cover
- if(covermask.alloweat) // Specific cases, clownmask for example.
- return 1
-
- if(!isnull(cover))
- if((cover.flags & HEADCOVERSMOUTH) || (cover.flags & MASKCOVERSMOUTH))
- var/who = (isnull(user) || eater == user) ? "your" : "their"
-
- if(istype(cover, /obj/item/clothing/mask/))
- user << "You have to remove [who] mask first!"
- else
- user << "You have to remove [who] helmet first!"
-
- return 0
return 1
/obj/item/weapon/reagent_containers/ex_act()
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index e524f00a9b3..f87d3682a7c 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -17,7 +17,7 @@
return // thanks inheritance again
/obj/item/weapon/reagent_containers/pill/patch/canconsume(mob/eater, mob/user)
- if(!eater.SpeciesCanConsume())
+ if(!iscarbon(eater))
return 0
return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance.
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 8d23d98378d..9b42d32cb5d 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -70,13 +70,13 @@ proc/get_location_modifier(mob/M)
var/eyesmouth_covered = 0 //based on flags
if(iscarbon(M))
var/mob/living/carbon/C = M
- for(var/obj/item/clothing/I in list(C.back, C.wear_mask))
+ for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags
if(ishuman(C))
var/mob/living/carbon/human/H = C
- for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.ears))
+ for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags
@@ -89,7 +89,7 @@ proc/get_location_modifier(mob/M)
if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES)
return 0
if("mouth")
- if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH)
+ if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH)
return 0
if("chest")
if(covered_locations & CHEST)