mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
Rags as ghetto muzzles & muzzle tweaks (#32628)
* Biting and kicking while handcuffed. * Rags as ghetto muzzles and vampires not being able to bloodsuck while muzzled. * Update click.dm revert from another PR * Update other_mobs.dm * Update footprints_and_rag.dm * Update human_defense.dm * Update stripping.dm * Update items.dm * Update examine.dm * Update examine.dm * Update items.dm * Rag in the mouth sprite. * Change ingestion rate. * . * Muffled speaking with a rag in the mouth. * Fix capitalization bug. * Rags can't be equipped by mouthless creatures. * Fix radio bug. * Non-oral languages not being muzzled. * Lollipops. * No eating while muzzled. * Update snacks.dm * Check for slot for message when putting a goes_in_mouth item on someone.
This commit is contained in:
@@ -162,6 +162,8 @@
|
|||||||
|
|
||||||
#define isfood(A) istype(A, /obj/item/weapon/reagent_containers/food)
|
#define isfood(A) istype(A, /obj/item/weapon/reagent_containers/food)
|
||||||
|
|
||||||
|
#define ismuzzle(A) A.is_muzzle
|
||||||
|
|
||||||
#define iswirecutter(A) istype(A, /obj/item/tool/wirecutters)
|
#define iswirecutter(A) istype(A, /obj/item/tool/wirecutters)
|
||||||
|
|
||||||
#define iswiretool(A) (iswirecutter(A) || ismultitool(A) || issignaler(A))
|
#define iswiretool(A) (iswirecutter(A) || ismultitool(A) || issignaler(A))
|
||||||
|
|||||||
@@ -1065,9 +1065,10 @@ var/default_colour_matrix = list(1,0,0,0,\
|
|||||||
|
|
||||||
|
|
||||||
//Language flags.
|
//Language flags.
|
||||||
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
|
#define WHITELISTED (1<<0) // Language is available if the speaker is whitelisted.
|
||||||
#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
|
#define RESTRICTED (1<<1) // Language can only be accquired by spawning or an admin.
|
||||||
#define CAN_BE_SECONDARY_LANGUAGE 4 // Language is available on character setup as secondary language.
|
#define CAN_BE_SECONDARY_LANGUAGE (1<<2) // Language is available on character setup as secondary language.
|
||||||
|
#define NONORAL (1<<3) //Language is spoken without using the mouth, so can be spoken while muzzled.
|
||||||
|
|
||||||
// Hairstyle flags
|
// Hairstyle flags
|
||||||
#define HAIRSTYLE_CANTRIP 1 // 5% chance of tripping your stupid ass if you're running.
|
#define HAIRSTYLE_CANTRIP 1 // 5% chance of tripping your stupid ass if you're running.
|
||||||
@@ -1824,3 +1825,7 @@ var/list/weekend_days = list("Friday", "Saturday", "Sunday")
|
|||||||
#define COIN_HEADS "heads-up."
|
#define COIN_HEADS "heads-up."
|
||||||
#define COIN_TAILS "tails-up."
|
#define COIN_TAILS "tails-up."
|
||||||
#define COIN_SIDE "on the side!"
|
#define COIN_SIDE "on the side!"
|
||||||
|
|
||||||
|
//Muzzles
|
||||||
|
#define MUZZLE_SOFT 1 //Muzzle causes muffled speech.
|
||||||
|
#define MUZZLE_HARD 2 //Muzzle prevents speech.
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ var/list/rune_appearances_cache = list()
|
|||||||
return
|
return
|
||||||
|
|
||||||
if(!user.checkTattoo(TATTOO_SILENT))
|
if(!user.checkTattoo(TATTOO_SILENT))
|
||||||
if(user.is_wearing_item(/obj/item/clothing/mask/muzzle, slot_wear_mask))
|
if(ismuzzle(user.wear_mask))
|
||||||
to_chat(user, "<span class='danger'>You are unable to speak the words of the rune because of \the [user.wear_mask].</span>")
|
to_chat(user, "<span class='danger'>You are unable to speak the words of the rune because of \the [user.wear_mask].</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ var/runedec = 0 // Rune cap ?
|
|||||||
if(!islegacycultist(user))
|
if(!islegacycultist(user))
|
||||||
to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.")
|
to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.")
|
||||||
return
|
return
|
||||||
if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
|
if(ismuzzle(user.wear_mask))
|
||||||
to_chat(user, "You are unable to speak the words of the rune.")
|
to_chat(user, "You are unable to speak the words of the rune.")
|
||||||
return
|
return
|
||||||
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
|
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
|
||||||
|
|||||||
@@ -1078,7 +1078,7 @@
|
|||||||
possible_targets += cultistarget
|
possible_targets += cultistarget
|
||||||
else if (cultistarget.legcuffed)
|
else if (cultistarget.legcuffed)
|
||||||
possible_targets += cultistarget
|
possible_targets += cultistarget
|
||||||
else if (istype(cultistarget.wear_mask, /obj/item/clothing/mask/muzzle))
|
else if (ismuzzle(cultistarget.wear_mask))
|
||||||
possible_targets += cultistarget
|
possible_targets += cultistarget
|
||||||
else if (istype(cultistarget.loc, /obj/structure/closet))
|
else if (istype(cultistarget.loc, /obj/structure/closet))
|
||||||
var/obj/structure/closet/closet = cultistarget.loc
|
var/obj/structure/closet/closet = cultistarget.loc
|
||||||
@@ -1105,7 +1105,7 @@
|
|||||||
return
|
return
|
||||||
if(!(cultist.locked_to || \
|
if(!(cultist.locked_to || \
|
||||||
cultist.handcuffed || \
|
cultist.handcuffed || \
|
||||||
istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
|
ismuzzle(cultist.wear_mask) || \
|
||||||
(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
|
(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
|
||||||
(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
|
(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
|
||||||
(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
|
(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
|
||||||
@@ -1117,7 +1117,7 @@
|
|||||||
cultist.drop_from_inventory(cultist.handcuffed)
|
cultist.drop_from_inventory(cultist.handcuffed)
|
||||||
if (cultist.legcuffed)
|
if (cultist.legcuffed)
|
||||||
cultist.drop_from_inventory(cultist.legcuffed)
|
cultist.drop_from_inventory(cultist.legcuffed)
|
||||||
if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
|
if (ismuzzle(cultist.wear_mask))
|
||||||
cultist.u_equip(cultist.wear_mask, 1)
|
cultist.u_equip(cultist.wear_mask, 1)
|
||||||
if(istype(cultist.loc, /obj/structure/closet))
|
if(istype(cultist.loc, /obj/structure/closet))
|
||||||
var/obj/structure/closet/closet = cultist.loc
|
var/obj/structure/closet/closet = cultist.loc
|
||||||
|
|||||||
@@ -164,8 +164,14 @@
|
|||||||
|
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/vamp_H = M
|
var/mob/living/carbon/human/vamp_H = M
|
||||||
|
|
||||||
|
if(vamp_H.is_muzzled())
|
||||||
|
to_chat(M, "<span class='warning'> The [vamp_H.wear_mask] prevents you from biting!</span>")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
if(vamp_H.check_body_part_coverage(MOUTH))
|
if(vamp_H.check_body_part_coverage(MOUTH))
|
||||||
to_chat(M, "<span class='notice'>With practiced ease, you shift aside your mask for each gulp of blood.</span>")
|
to_chat(M, "<span class='notice'>With practiced ease, you shift aside your mask for each gulp of blood.</span>")
|
||||||
|
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,8 @@
|
|||||||
var/restraint_resist_time = 0 //When set, allows the item to be applied as restraints, which take this amount of time to resist out of
|
var/restraint_resist_time = 0 //When set, allows the item to be applied as restraints, which take this amount of time to resist out of
|
||||||
var/restraint_apply_time = 3 SECONDS
|
var/restraint_apply_time = 3 SECONDS
|
||||||
var/icon/wear_override = null //Worn state override used when wearing this object on your head/uniform/glasses/etc slot, for making a more procedurally generated icon
|
var/icon/wear_override = null //Worn state override used when wearing this object on your head/uniform/glasses/etc slot, for making a more procedurally generated icon
|
||||||
|
var/goes_in_mouth //Whether or not the item is described as "on his/her face" or "in his/her mouth" when worn on the face slot.
|
||||||
|
var/is_muzzle //Whether or not the item is a muzzle, and how strong the muzzling effect is. See setup.dm.
|
||||||
var/hides_identity = HIDES_IDENTITY_DEFAULT
|
var/hides_identity = HIDES_IDENTITY_DEFAULT
|
||||||
var/datum/daemon/daemon
|
var/datum/daemon/daemon
|
||||||
|
|
||||||
@@ -493,6 +495,11 @@
|
|||||||
return CAN_EQUIP_BUT_SLOT_TAKEN
|
return CAN_EQUIP_BUT_SLOT_TAKEN
|
||||||
else
|
else
|
||||||
return CANNOT_EQUIP
|
return CANNOT_EQUIP
|
||||||
|
|
||||||
|
if(goes_in_mouth && !H.hasmouth()) //Item is equipped to the mouth but the species has no mouth.
|
||||||
|
to_chat(H, "<span class='warning'>You have no mouth.</span>")
|
||||||
|
return CANNOT_EQUIP
|
||||||
|
|
||||||
return CAN_EQUIP
|
return CAN_EQUIP
|
||||||
if(slot_back)
|
if(slot_back)
|
||||||
if( !(slot_flags & SLOT_BACK) )
|
if( !(slot_flags & SLOT_BACK) )
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ MATCHBOXES ARE ALSO IN FANCY.DM
|
|||||||
source_temperature = TEMPERATURE_FLAME
|
source_temperature = TEMPERATURE_FLAME
|
||||||
light_color = LIGHT_COLOR_FIRE
|
light_color = LIGHT_COLOR_FIRE
|
||||||
slot_flags = SLOT_MASK|SLOT_EARS
|
slot_flags = SLOT_MASK|SLOT_EARS
|
||||||
|
goes_in_mouth = TRUE
|
||||||
var/lit = 0
|
var/lit = 0
|
||||||
var/overlay_on = "ciglit" //Apparently not used
|
var/overlay_on = "ciglit" //Apparently not used
|
||||||
var/type_butt = /obj/item/trash/cigbutt
|
var/type_butt = /obj/item/trash/cigbutt
|
||||||
@@ -558,13 +559,6 @@ MATCHBOXES ARE ALSO IN FANCY.DM
|
|||||||
// CIGARS //
|
// CIGARS //
|
||||||
////////////
|
////////////
|
||||||
|
|
||||||
/obj/item/clothing/mask/cigarette/mob_can_equip(mob/M, slot, disable_warning = 0, automatic = 0)
|
|
||||||
var/mob/living/carbon/C = M
|
|
||||||
if(!istype(C) || !C.hasmouth())
|
|
||||||
to_chat(C, "<span class='warning'>You have no mouth.</span>")
|
|
||||||
return CANNOT_EQUIP
|
|
||||||
. = ..()
|
|
||||||
|
|
||||||
/obj/item/clothing/mask/cigarette/cigar
|
/obj/item/clothing/mask/cigarette/cigar
|
||||||
name = "Premium Cigar"
|
name = "Premium Cigar"
|
||||||
desc = "A large roll of tobacco and... well, you're not quite sure. This thing's huge!"
|
desc = "A large roll of tobacco and... well, you're not quite sure. This thing's huge!"
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ LINEN BINS
|
|||||||
if(I.is_sharp())
|
if(I.is_sharp())
|
||||||
cut_time = 60 / I.sharpness
|
cut_time = 60 / I.sharpness
|
||||||
if(cut_time)
|
if(cut_time)
|
||||||
to_chat(user, "<span class='notice'>You begin cutting the [src].</span>")
|
to_chat(user, "<span class='notice'>You begin cutting up [src].</span>")
|
||||||
if(do_after(user, src, cut_time))
|
if(do_after(user, src, cut_time))
|
||||||
if(!src)
|
if(!src)
|
||||||
return
|
return
|
||||||
to_chat(user, "<span class='notice'>You have cut the [src] into rags.</span>")
|
to_chat(user, "<span class='notice'>You finish cutting [src] into rags.</span>")
|
||||||
var/turf/location = get_turf(src)
|
var/turf/location = get_turf(src)
|
||||||
for(var/x=0; x<=8; x++)
|
for(var/x=0; x<=8; x++)
|
||||||
var/obj/item/weapon/reagent_containers/glass/rag/S = new/obj/item/weapon/reagent_containers/glass/rag/(location)
|
var/obj/item/weapon/reagent_containers/glass/rag/S = new/obj/item/weapon/reagent_containers/glass/rag/(location)
|
||||||
@@ -45,7 +45,6 @@ LINEN BINS
|
|||||||
//todo: more cutting tools?
|
//todo: more cutting tools?
|
||||||
//todo: sharp thing code/game/objects/objs.dm
|
//todo: sharp thing code/game/objects/objs.dm
|
||||||
|
|
||||||
|
|
||||||
/obj/item/weapon/bedsheet/blue
|
/obj/item/weapon/bedsheet/blue
|
||||||
icon_state = "sheetblue"
|
icon_state = "sheetblue"
|
||||||
_color = "blue"
|
_color = "blue"
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
species_fit = list(VOX_SHAPED, INSECT_SHAPED, GREY_SHAPED)
|
species_fit = list(VOX_SHAPED, INSECT_SHAPED, GREY_SHAPED)
|
||||||
origin_tech = Tc_BIOTECH + "=2"
|
origin_tech = Tc_BIOTECH + "=2"
|
||||||
body_parts_covered = MOUTH
|
body_parts_covered = MOUTH
|
||||||
|
is_muzzle = MUZZLE_HARD
|
||||||
|
|
||||||
//Monkeys can not take the muzzle off of themself! Call PETA!
|
//Monkeys can not take the muzzle off of themself! Call PETA!
|
||||||
/obj/item/clothing/mask/muzzle/attack_paw(mob/user as mob)
|
/obj/item/clothing/mask/muzzle/attack_paw(mob/user as mob)
|
||||||
|
|||||||
@@ -15,10 +15,15 @@
|
|||||||
w_class = W_CLASS_TINY
|
w_class = W_CLASS_TINY
|
||||||
icon = 'icons/obj/toy.dmi'
|
icon = 'icons/obj/toy.dmi'
|
||||||
icon_state = "rag"
|
icon_state = "rag"
|
||||||
|
item_state = new/icon("icon" = 'icons/mob/mask.dmi', "icon_state" = "rag")
|
||||||
amount_per_transfer_from_this = 5
|
amount_per_transfer_from_this = 5
|
||||||
possible_transfer_amounts = list(5)
|
possible_transfer_amounts = list(5)
|
||||||
volume = 5
|
volume = 5
|
||||||
can_be_placed_into = null
|
can_be_placed_into = null
|
||||||
|
slot_flags = SLOT_MASK
|
||||||
|
body_parts_covered = MOUTH
|
||||||
|
goes_in_mouth = TRUE
|
||||||
|
is_muzzle = MUZZLE_SOFT
|
||||||
var/mob/current_target = null
|
var/mob/current_target = null
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
||||||
@@ -99,3 +104,25 @@
|
|||||||
qdel(O)
|
qdel(O)
|
||||||
reagents.remove_any(1)
|
reagents.remove_any(1)
|
||||||
user.visible_message("<span class='notice'>[user] finishes wiping down \the [target].</span>", "<span class='notice'>You have finished wiping down \the [target]!</span>")
|
user.visible_message("<span class='notice'>[user] finishes wiping down \the [target].</span>", "<span class='notice'>You have finished wiping down \the [target]!</span>")
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/process()
|
||||||
|
//Reagents in the rag gradually get transferred into the wearer. Copied from cigs_lighters.dm.
|
||||||
|
var/mob/living/M = get_holder_of_type(src, /mob/living)
|
||||||
|
if(reagents && reagents.total_volume) //Check if it has any reagents at all
|
||||||
|
if(iscarbon(M) && ((src == M.wear_mask) || (loc == M.wear_mask))) //If it's in the human/monkey mouth, transfer reagents to the mob
|
||||||
|
if(M.reagents.has_any_reagents(LEXORINS) || istype(M.loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||||
|
reagents.remove_any(REAGENTS_METABOLISM)
|
||||||
|
else
|
||||||
|
reagents.reaction(M, INGEST)
|
||||||
|
reagents.trans_to(M, 0.5)
|
||||||
|
else
|
||||||
|
processing_objects.Remove(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/equipped(mob/living/carbon/human/H, equipped_slot)
|
||||||
|
..()
|
||||||
|
if(istype(H) && H.get_item_by_slot(slot_wear_mask) == src && equipped_slot != null && equipped_slot == slot_wear_mask)
|
||||||
|
processing_objects.Add(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/unequipped(mob/living/carbon/human/user, from_slot = null)
|
||||||
|
..()
|
||||||
|
processing_objects.Remove(src)
|
||||||
|
|||||||
@@ -138,6 +138,7 @@
|
|||||||
exclaim_verb = "rustles"
|
exclaim_verb = "rustles"
|
||||||
colour = "soghun"
|
colour = "soghun"
|
||||||
key = "q"
|
key = "q"
|
||||||
|
flags = NONORAL
|
||||||
syllables = list("hs","zt","kr","st","sh")
|
syllables = list("hs","zt","kr","st","sh")
|
||||||
|
|
||||||
/datum/language/common
|
/datum/language/common
|
||||||
@@ -221,6 +222,7 @@
|
|||||||
colour = "sinister"
|
colour = "sinister"
|
||||||
native=1
|
native=1
|
||||||
space_chance = 95
|
space_chance = 95
|
||||||
|
flags = NONORAL
|
||||||
syllables = list("CLICK", "CLACK")
|
syllables = list("CLICK", "CLACK")
|
||||||
|
|
||||||
/datum/language/golem
|
/datum/language/golem
|
||||||
@@ -233,6 +235,7 @@
|
|||||||
colour = "golem"
|
colour = "golem"
|
||||||
native = 1
|
native = 1
|
||||||
key = "8"
|
key = "8"
|
||||||
|
flags = NONORAL
|
||||||
syllables = list("oa","ur","ae","um","tu","gor","an","lo","ag","oon","po")
|
syllables = list("oa","ur","ae","um","tu","gor","an","lo","ag","oon","po")
|
||||||
|
|
||||||
/datum/language/slime
|
/datum/language/slime
|
||||||
@@ -245,6 +248,7 @@
|
|||||||
colour = "slime"
|
colour = "slime"
|
||||||
native = 1
|
native = 1
|
||||||
key = "f"
|
key = "f"
|
||||||
|
flags = NONORAL
|
||||||
syllables = list("ba","ab","be","eb","bi","ib","bo","ob","bu","ub")
|
syllables = list("ba","ab","be","eb","bi","ib","bo","ob","bu","ub")
|
||||||
|
|
||||||
/datum/language/skellington/say_misunderstood(mob/M, message)
|
/datum/language/skellington/say_misunderstood(mob/M, message)
|
||||||
|
|||||||
@@ -462,8 +462,8 @@
|
|||||||
return borers_in_mob
|
return borers_in_mob
|
||||||
|
|
||||||
/mob/living/carbon/is_muzzled()
|
/mob/living/carbon/is_muzzled()
|
||||||
return(istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/muzzle))
|
var/obj/item/M = get_item_by_slot(slot_wear_mask)
|
||||||
|
return M?.is_muzzle
|
||||||
|
|
||||||
/mob/living/carbon/proc/isInCrit()
|
/mob/living/carbon/proc/isInCrit()
|
||||||
// Health is in deep shit and we're not already dead
|
// Health is in deep shit and we're not already dead
|
||||||
|
|||||||
@@ -131,9 +131,9 @@
|
|||||||
//mask
|
//mask
|
||||||
if(wear_mask && !(slot_wear_mask in obscured) && wear_mask.is_visible())
|
if(wear_mask && !(slot_wear_mask in obscured) && wear_mask.is_visible())
|
||||||
if(wear_mask.blood_DNA && wear_mask.blood_DNA.len)
|
if(wear_mask.blood_DNA && wear_mask.blood_DNA.len)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face! [format_examine(wear_mask, "Examine")][wear_mask.description_accessories()]</span>\n"
|
msg += "<span class='warning'>[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] [wear_mask.goes_in_mouth ? "in" : "on"] [t_his] [wear_mask.goes_in_mouth ? "mouth" : "face"]! [format_examine(wear_mask, "Examine")][wear_mask.description_accessories()]</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face. [format_examine(wear_mask, "Examine")][wear_mask.description_accessories()]\n"
|
msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] [wear_mask.goes_in_mouth ? "in" : "on"] [t_his] [wear_mask.goes_in_mouth ? "mouth" : "face"]. [format_examine(wear_mask, "Examine")][wear_mask.description_accessories()]\n"
|
||||||
|
|
||||||
//eyes
|
//eyes
|
||||||
if(glasses && !(slot_glasses in obscured) && glasses.is_visible())
|
if(glasses && !(slot_glasses in obscured) && glasses.is_visible())
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ emp_act
|
|||||||
var/siemens_coefficient = 1.0
|
var/siemens_coefficient = 1.0
|
||||||
var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
|
var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
|
||||||
|
|
||||||
for(var/obj/item/clothing/C in clothing_items)
|
for(var/obj/item/C in clothing_items)
|
||||||
if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered?
|
if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered?
|
||||||
siemens_coefficient *= C.siemens_coefficient
|
siemens_coefficient *= C.siemens_coefficient
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ emp_act
|
|||||||
if(!body_part_flags)
|
if(!body_part_flags)
|
||||||
return 0
|
return 0
|
||||||
var/parts_to_check = body_part_flags
|
var/parts_to_check = body_part_flags
|
||||||
for(var/obj/item/clothing/C in get_clothing_items())
|
for(var/obj/item/C in get_clothing_items())
|
||||||
if(!C)
|
if(!C)
|
||||||
continue
|
continue
|
||||||
if(ignored && C == ignored)
|
if(ignored && C == ignored)
|
||||||
@@ -151,7 +151,7 @@ emp_act
|
|||||||
/mob/living/carbon/human/proc/get_body_part_coverage(var/body_part_flags=0)
|
/mob/living/carbon/human/proc/get_body_part_coverage(var/body_part_flags=0)
|
||||||
if(!body_part_flags)
|
if(!body_part_flags)
|
||||||
return null
|
return null
|
||||||
for(var/obj/item/clothing/C in get_clothing_items())
|
for(var/obj/item/C in get_clothing_items())
|
||||||
if(!C)
|
if(!C)
|
||||||
continue
|
continue
|
||||||
//Check if this piece of clothing contains ALL of the flags we want to check.
|
//Check if this piece of clothing contains ALL of the flags we want to check.
|
||||||
@@ -163,7 +163,7 @@ emp_act
|
|||||||
//Because get_body_part_coverage(FULL_BODY) would only return true if the human has one piece of clothing that covers their whole body by itself.
|
//Because get_body_part_coverage(FULL_BODY) would only return true if the human has one piece of clothing that covers their whole body by itself.
|
||||||
var/body_coverage = FULL_BODY | FULL_HEAD
|
var/body_coverage = FULL_BODY | FULL_HEAD
|
||||||
|
|
||||||
for(var/obj/item/clothing/C in get_clothing_items())
|
for(var/obj/item/C in get_clothing_items())
|
||||||
if(!C)
|
if(!C)
|
||||||
continue
|
continue
|
||||||
body_coverage &= ~(C.body_parts_covered)
|
body_coverage &= ~(C.body_parts_covered)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
return 2
|
return 2
|
||||||
|
|
||||||
/mob/living/carbon/monkey/unarmed_attack_mob(mob/living/)
|
/mob/living/carbon/monkey/unarmed_attack_mob(mob/living/)
|
||||||
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
if(ismuzzle(wear_mask))
|
||||||
to_chat(src, "<span class='notice'>You can't do this with \the [wear_mask] on!</span>")
|
to_chat(src, "<span class='notice'>You can't do this with \the [wear_mask] on!</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
if (src.hat && hat.is_visible())
|
if (src.hat && hat.is_visible())
|
||||||
msg += "It is wearing [bicon(src.hat)] \a [src.hat] on its head.[hat.description_accessories()][hat.description_hats()]\n"
|
msg += "It is wearing [bicon(src.hat)] \a [src.hat] on its head.[hat.description_accessories()][hat.description_hats()]\n"
|
||||||
if (src.wear_mask && !(wear_mask.invisibility || wear_mask.alpha <= 1))
|
if (src.wear_mask && !(wear_mask.invisibility || wear_mask.alpha <= 1))
|
||||||
msg += "It has [bicon(src.wear_mask)] \a [src.wear_mask] over its face.\n"
|
msg += "It has [bicon(src.wear_mask)] \a [src.wear_mask] [wear_mask.goes_in_mouth ? "in" : "over"] its [wear_mask.goes_in_mouth ? "mouth" : "face"].\n"
|
||||||
|
|
||||||
if (src.glasses && glasses.is_visible())
|
if (src.glasses && glasses.is_visible())
|
||||||
msg += "It is wearing [bicon(src.glasses)] \a [src.glasses] over its eyes.\n"
|
msg += "It is wearing [bicon(src.glasses)] \a [src.glasses] over its eyes.\n"
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,9 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
if(!pickpocket)
|
if(!pickpocket)
|
||||||
|
if(held.goes_in_mouth && slot == SLOT_MASK)
|
||||||
|
visible_message("<span class='danger'>\The [user] is trying to put \a [held] in \the [src]'s mouth!</span>")
|
||||||
|
else
|
||||||
visible_message("<span class='danger'>\The [user] is trying to put \a [held] on \the [src]!</span>")
|
visible_message("<span class='danger'>\The [user] is trying to put \a [held] on \the [src]!</span>")
|
||||||
|
|
||||||
if(reversestrip_into_slot(user, slot, pickpocket))
|
if(reversestrip_into_slot(user, slot, pickpocket))
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ var/list/headset_modes = list(
|
|||||||
speech.language = parse_language(speech.message)
|
speech.language = parse_language(speech.message)
|
||||||
say_testing(src, "Getting speaking language, got [istype(speech.language) ? speech.language.name : "null"]")
|
say_testing(src, "Getting speaking language, got [istype(speech.language) ? speech.language.name : "null"]")
|
||||||
if(istype(speech.language))
|
if(istype(speech.language))
|
||||||
|
|
||||||
#ifdef SAY_DEBUG
|
#ifdef SAY_DEBUG
|
||||||
var/oldmsg = message
|
var/oldmsg = message
|
||||||
#endif
|
#endif
|
||||||
@@ -180,6 +181,17 @@ var/list/headset_modes = list(
|
|||||||
speech.language = get_default_language()
|
speech.language = get_default_language()
|
||||||
say_testing(src, "Didnt have a language, get_default_language() gave us [speech.language ? speech.language.name : "null"]")
|
say_testing(src, "Didnt have a language, get_default_language() gave us [speech.language ? speech.language.name : "null"]")
|
||||||
speech.message = trim_left(speech.message)
|
speech.message = trim_left(speech.message)
|
||||||
|
|
||||||
|
//Handle speech muffling by muzzles.
|
||||||
|
if(!(speech?.language?.flags & NONORAL))
|
||||||
|
var/mob/living/carbon/C = src
|
||||||
|
switch(C.is_muzzled())
|
||||||
|
if(MUZZLE_SOFT)
|
||||||
|
speech.message = muffle(speech.message)
|
||||||
|
if(MUZZLE_HARD)
|
||||||
|
qdel(speech)
|
||||||
|
return
|
||||||
|
|
||||||
if(handle_inherent_channels(speech, message_mode))
|
if(handle_inherent_channels(speech, message_mode))
|
||||||
say_testing(src, "Handled by inherent channel")
|
say_testing(src, "Handled by inherent channel")
|
||||||
qdel(speech)
|
qdel(speech)
|
||||||
@@ -377,9 +389,6 @@ var/list/headset_modes = list(
|
|||||||
if(is_mute())
|
if(is_mute())
|
||||||
return
|
return
|
||||||
|
|
||||||
if(is_muzzled())
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!IsVocal())
|
if(!IsVocal())
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -727,3 +736,30 @@ var/list/headset_modes = list(
|
|||||||
|
|
||||||
/obj/effect/speech_bubble
|
/obj/effect/speech_bubble
|
||||||
var/mob/parent
|
var/mob/parent
|
||||||
|
|
||||||
|
//Muffles a message for when muzzled.
|
||||||
|
/proc/muffle(var/message)
|
||||||
|
var/muffle_syllables = list("mh","mph","mm","mgh","mg")
|
||||||
|
var/unmuffled = list(" ", "-", ",", ".", "!", "?")
|
||||||
|
var/output = ""
|
||||||
|
var/i = 1
|
||||||
|
var/current_char
|
||||||
|
while(i <= length(message))
|
||||||
|
current_char = message[i]
|
||||||
|
if(current_char in unmuffled)
|
||||||
|
output += current_char
|
||||||
|
i += 1
|
||||||
|
else
|
||||||
|
var/length_to_add = 1
|
||||||
|
var/allcaps = uppertext(message[i]) == message[i]
|
||||||
|
while((i + length_to_add <= length(message)) && (length_to_add < 3))
|
||||||
|
if(message[i + length_to_add] in unmuffled)
|
||||||
|
break
|
||||||
|
allcaps &= uppertext(message[i + length_to_add]) == message[i + length_to_add]
|
||||||
|
length_to_add += 1
|
||||||
|
i += length_to_add
|
||||||
|
if(allcaps)
|
||||||
|
output += uppertext(pick(muffle_syllables))
|
||||||
|
else
|
||||||
|
output += pick(muffle_syllables)
|
||||||
|
return output
|
||||||
@@ -5243,6 +5243,7 @@
|
|||||||
icon = 'icons/obj/candymachine.dmi'
|
icon = 'icons/obj/candymachine.dmi'
|
||||||
bitesize = 5
|
bitesize = 5
|
||||||
slot_flags = SLOT_MASK //No, really, suck on this.
|
slot_flags = SLOT_MASK //No, really, suck on this.
|
||||||
|
goes_in_mouth = TRUE
|
||||||
attack_verb = list("taps", "pokes")
|
attack_verb = list("taps", "pokes")
|
||||||
eatverb = "crunch"
|
eatverb = "crunch"
|
||||||
valid_utensils = 0
|
valid_utensils = 0
|
||||||
|
|||||||
@@ -401,7 +401,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
if((ishuman(user) || ismonkey(user)) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)))
|
if((ishuman(user) || ismonkey(user)) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)))
|
||||||
if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
|
if(ismuzzle(user.wear_mask))
|
||||||
to_chat(user, "Mmmf mrrfff!")
|
to_chat(user, "Mmmf mrrfff!")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Reference in New Issue
Block a user