diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 5bf3ff38129d..fab52f9408d2 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1148,14 +1148,29 @@ var/list/discounted_items_of_the_round = list() /datum/uplink_item/jobspecific/clown_mime/invisible_spray name = "Can of Invisible Spray" desc = "Spray something to render it invisible for five minutes! Can only be used once. Permanence not guaranteed when exposed to water, may not render all parts invisible, especially for humans." - item = /obj/item/weapon/invisible_spray + item = /obj/item/weapon/syndie_spray/invisible_spray + cost = 6 + jobs_excluded = list("Clown", "Mime") + +/datum/uplink_item/jobspecific/clown_mime/silent_spray + name = "Can of Silencing Spray" + desc = "Spray something to render it silent for five minutes! Can only be used once. Permanence not guaranteed when exposed to water." + item = /obj/item/weapon/syndie_spray/silent_spray cost = 6 jobs_excluded = list("Clown", "Mime") /datum/uplink_item/jobspecific/clown_mime/invisible_spray/permanent name = "Can of Permanent Invisible Spray" desc = "Spray something to render it permanently invisible! Can only be used once. Permanence not guaranteed when exposed to water, may not render all parts invisible, especially for humans." - item = /obj/item/weapon/invisible_spray/permanent + item = /obj/item/weapon/syndie_spray/invisible_spray/permanent + cost = 4 + jobs_excluded = list() + jobs_exclusive = list("Clown", "Mime") + +/datum/uplink_item/jobspecific/clown_mime/silent_spray/permanent + name = "Can of Permanent Silencing Spray" + desc = "Spray something to render it permanently silent! Can only be used once. Permanence not guaranteed when exposed to water." + item = /obj/item/weapon/syndie_spray/silent_spray/permanent cost = 4 jobs_excluded = list() jobs_exclusive = list("Clown", "Mime") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index be61d4d353f2..8d6e4695019a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -58,6 +58,7 @@ var/global/list/ghdel_profiling = list() var/arcanetampered = 0 //A looot of things can be + var/image/moody_light var/list/moody_lights diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a0ed0d8210f1..def3709762f7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -59,6 +59,8 @@ var/atom/movable/border_dummy/border_dummy //Used for border objects. The old Uncross() method fails miserably with pixel movement or large hitboxes. + var/silence_sprayed = FALSE //sprayed by silencing spray + /atom/movable/New() . = ..() if((flags & HEAR) && !ismob(src)) @@ -1350,3 +1352,12 @@ change_dir(new_dir) sleep(1) change_dir(prev_dir) + +/atom/movable/proc/make_silent(var/duration) + silence_sprayed = TRUE + if(duration > 0) + spawn(duration) + silence_sprayed = FALSE + +/atom/movable/proc/remove_silence() + silence_sprayed = FALSE diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 29308dbfe1fc..62217073bf0e 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -418,20 +418,21 @@ ..() H.reagents.add_reagent(TOXIN,1) -/obj/item/weapon/invisible_spray - name = "can of invisible spray" - desc = "A can of... invisibility? The label reads: \"Wears off after five minutes.\"" +/obj/item/weapon/syndie_spray + name = "syndicate spray" + desc = "A can of... nothing?" icon = 'icons/obj/items.dmi' icon_state = "invisible_spray" flags = FPRINT w_class = W_CLASS_SMALL var/permanent = 0 - var/invisible_time = 5 MINUTES + var/effect_time = 5 MINUTES var/sprays_left = 1 + var/effect_adjective = "" var/static/list/prohibited_objects = list( //For fun removal ) -/obj/item/weapon/invisible_spray/examine(var/mob/user) +/obj/item/weapon/syndie_spray/examine(var/mob/user) ..() if(loc != user) return @@ -440,8 +441,7 @@ else to_chat(user, "The can feels empty.") - -/obj/item/weapon/invisible_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters) +/obj/item/weapon/syndie_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters) if (!proximity_flag) return 0 if(!istype(target)) @@ -449,8 +449,8 @@ if(!sprays_left) to_chat(user, "\The [src] is empty.") return - if(target.invisibility || target.alpha <= 1) - to_chat(user, "\The [target] is already invisible!") + if(effect_active(target)) + to_chat(user, "\The [target] is already [effect_adjective]!") return if(is_type_in_list(target,prohibited_objects)) to_chat(user, "For some reason, you don't think that would work.") @@ -461,35 +461,91 @@ to_chat(user, "\The [src] is empty.") return if(permanent) - invisible_time = 0 + effect_time = 0 var/mob/M = target if(M == user) to_chat(user, "You spray yourself with \the [src].") - user.make_invisible(INVISIBLESPRAY, invisible_time, FALSE, 1) + apply_spray_effect(user, effect_time) else if (ismob(M)) to_chat(user, "You spray [M] with \the [src].") - M.make_invisible(INVISIBLESPRAY, invisible_time, FALSE, 1) + apply_spray_effect(M, effect_time) var/obj/O = target if(isobj(O)) if(locate(O) in get_contents_in_object(user)) - O.make_invisible(INVISIBLESPRAY, invisible_time, 1) + apply_spray_effect(O, effect_time) else - O.make_invisible(INVISIBLESPRAY, invisible_time, 1) + apply_spray_effect(O, effect_time) to_chat(user, "You spray \the [O] with \the [src].") - playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) sprays_left-- + return 1 + +/obj/item/weapon/syndie_spray/proc/effect_active(atom/movable/target) + return 0 + +/obj/item/weapon/syndie_spray/proc/apply_spray_effect(atom/movable/target,var/duration) + return 1 + +/obj/item/weapon/syndie_spray/invisible_spray + name = "can of invisible spray" + desc = "A can of... invisibility? The label reads: \"Wears off after five minutes.\"" + icon_state = "invisible_spray" + effect_adjective = "invisible" + +/obj/item/weapon/syndie_spray/invisible_spray/effect_active(atom/movable/target) + if(target.invisibility || target.alpha <= 1) + return 1 + +/obj/item/weapon/syndie_spray/invisible_spray/apply_spray_effect(atom/movable/target, duration) + if(ismob(target)) + var/mob/M = target + M.make_invisible(INVISIBLESPRAY, duration, FALSE, 1) + return 1 + else if(isobj(target)) + var/obj/O = target + O.make_invisible(INVISIBLESPRAY, duration, FALSE, 1) + return 1 + +/obj/item/weapon/syndie_spray/invisible_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + if(!..()) + return if(istype(target, /obj/machinery/power/supermatter)) return 0 if(istype(target, /obj/machinery/singularity)) animate(target, color = grayscale, time = 6 SECONDS) return 0 - return 1 -/obj/item/weapon/invisible_spray/permanent +/obj/item/weapon/syndie_spray/invisible_spray/permanent desc = "A can of... invisibility?" permanent = 1 +/obj/item/weapon/syndie_spray/silent_spray + name = "can of silencing spray" + desc = "A can of... silence? The label reads: \"Wears off after five minutes.\"" + icon_state = "silent_spray" + effect_adjective = "silent" + +/obj/item/weapon/syndie_spray/silent_spray/effect_active(atom/movable/target) + if(target.silence_sprayed) + return 1 + +/obj/item/weapon/syndie_spray/silent_spray/apply_spray_effect(atom/movable/target, duration) + target.make_silent(duration) + return 1 + +/obj/item/weapon/syndie_spray/silent_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + if(!..()) + return + if(istype(target, /obj/machinery/power/supermatter)) + return 0 + if(istype(target, /obj/machinery/singularity)) + animate(target, color = grayscale, time = 6 SECONDS) + return 0 + +/obj/item/weapon/syndie_spray/silent_spray/permanent + desc = "A can of... silence?" + permanent = 1 + /obj/item/weapon/razor name = "electric razor" desc = "The latest and greatest power razor born from the science of shaving." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 906291095ac7..08b8e3a6bcac 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -21,6 +21,7 @@ new /obj/item/weapon/pen/paralysis(src) new /obj/item/device/chameleon(src) new /obj/item/weapon/soap/syndie(src) + new /obj/item/weapon/syndie_spray/silent_spray(src) if("Screwed")//6?+6?+10+4=26 new /obj/effect/spawner/newbomb/timer(src) @@ -175,7 +176,7 @@ new /obj/item/weapon/spellbook/oneuse/mutate/highlander(src) if("Clown") //4 + 4 + 6 + 14 + 6 + ? = 34? - new /obj/item/weapon/invisible_spray/permanent(src) + new /obj/item/weapon/syndie_spray/invisible_spray/permanent(src) new /obj/item/weapon/glue(src) new /obj/item/weapon/glue(src) new /obj/item/weapon/gun/hookshot/whip/windup_box/clownbox(src) diff --git a/code/game/say.dm b/code/game/say.dm index c28439b12b07..ab23b518cb2d 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -39,6 +39,8 @@ var/global/lastDecTalkUse = 0 return /atom/movable/proc/can_speak() + if(silence_sprayed) + return return 1 /atom/movable/proc/send_speech(var/datum/speech/speech, var/range=7, var/bubble_type) @@ -378,4 +380,4 @@ var/global/resethearers = 0 if(turf) for(var/mob/virtualhearer/VH in hearers(radio.canhear_range, turf)) - . |= VH.attached \ No newline at end of file + . |= VH.attached diff --git a/code/game/sound.dm b/code/game/sound.dm index 094036b4e025..3771df8fa312 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -63,6 +63,10 @@ var/list/trayhit_sound = list('sound/items/trayhit1.ogg', 'sound/items/trayhit2. extrarange = 0 if(!vol) //don't do that return + if(istype(source,/atom/movable)) + var/atom/movable/AM = source + if(AM.silence_sprayed) //shhhh + return if(turf_source) vol *= turf_source.volume_mult diff --git a/code/modules/reagents/reagents/reagents_basic.dm b/code/modules/reagents/reagents/reagents_basic.dm index 458dfb29aee1..bd6c50e9679e 100644 --- a/code/modules/reagents/reagents/reagents_basic.dm +++ b/code/modules/reagents/reagents/reagents_basic.dm @@ -263,11 +263,13 @@ var/mob/living/carbon/C = M var/datum/disease2/effect/E = C.has_active_symptom(/datum/disease2/effect/thick_skin) C.make_visible(INVISIBLESPRAY,FALSE) + M.remove_silence() if(E) E.multiplier = max(E.multiplier - rand(1,3), 1) to_chat(C, "The water quenches your dry skin.") else M.make_visible(INVISIBLESPRAY) + M.remove_silence() if(isliving(M)) var/mob/living/L = M L.ExtinguishMob() @@ -325,6 +327,8 @@ if(O.invisibility) O.make_visible(INVISIBLESPRAY) + O.remove_silence() + O.clean_act(CLEANLINESS_WATER)//removes glue and extinguishes fire if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index df49ac48177e..618059aba3f6 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/maps/RandomZLevels/hive.dm b/maps/RandomZLevels/hive.dm index 46cb19b2faf6..51454c49125c 100644 --- a/maps/RandomZLevels/hive.dm +++ b/maps/RandomZLevels/hive.dm @@ -58,7 +58,7 @@ /obj/item/weapon/gun/stickybomb, /obj/item/weapon/gun/projectile/rocketlauncher/nikita, /obj/item/weapon/cloakingcloak/hive, - /obj/item/weapon/invisible_spray, + /obj/item/weapon/syndie_spray/invisible_spray, /obj/item/clothing/gloves/powerfist, /obj/item/clothing/glasses/hud/thermal/eyepatch ) diff --git a/maps/RandomZLevels/hive.dmm b/maps/RandomZLevels/hive.dmm index 690299cbfdb7..63938db94792 100644 --- a/maps/RandomZLevels/hive.dmm +++ b/maps/RandomZLevels/hive.dmm @@ -1077,7 +1077,7 @@ /turf/unsimulated/floor/evil, /area/awaymission/hive) "ep" = ( -/obj/item/weapon/invisible_spray, +/obj/item/weapon/syndie_spray/invisible_spray, /turf/unsimulated/floor/evil/breathing, /area/awaymission/hive) "eq" = (