diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index f8b9af86ea4..b7147a80ab8 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -519,7 +519,7 @@
/atom/proc/unemag()
return
-/atom/proc/cmag_act()
+/atom/proc/cmag_act(mob/user)
return
/atom/proc/uncmag()
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index e6eed89274e..d4b7fe1f700 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -7,12 +7,30 @@
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
- var/spamcheck = FALSE
- var/insults = 0
- var/span = ""
+ /// How long to wait when using it as normal
+ var/normal_cooldown = 2 SECONDS
+ /// How long to wait between insults
+ var/modified_cooldown = 20 SECONDS
+ /// If it's on cooldown.
+ var/on_cooldown = FALSE
+ /// Span to use by default for the message.
+ var/span = "reallybig"
+ /// List of insults to be sent when the megaphone is cmagged.
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
-/obj/item/megaphone/attack_self(mob/living/user as mob)
+/obj/item/megaphone/suicide_act(mob/user)
+ user.visible_message("[user] is uttering [user.p_their()] last words into [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ on_cooldown = FALSE
+ user.emote("scream")
+ say_msg(user, "AAAAAAAAAAAARGHHHHH")
+ return OXYLOSS
+
+/obj/item/megaphone/examine(mob/user)
+ . = ..()
+ if(HAS_TRAIT(src, TRAIT_CMAGGED))
+ . += "Yellow ooze seems to be seeping from the speaker..."
+
+/obj/item/megaphone/attack_self(mob/living/user)
if(check_mute(user.ckey, MUTE_IC))
to_chat(src, "You cannot speak in IC (muted).")
return
@@ -34,8 +52,8 @@
return
if(HAS_TRAIT(H, TRAIT_COMIC_SANS))
span = "sans"
- if(spamcheck)
- to_chat(user, "\The [src] needs to recharge!")
+ if(on_cooldown)
+ to_chat(user, "[src] needs to recharge!")
return
var/message = input(user, "Shout a message:", "Megaphone") as text|null
@@ -49,33 +67,43 @@
user.handle_speech_problems(message_pieces)
message = multilingual_to_message(message_pieces)
if((loc == user && !user.incapacitated()))
- if(emagged)
- if(insults)
- saymsg(user, pick(insultmsg))
- insults--
- else
- to_chat(user, "*BZZZZzzzzzt*")
- else
- if(span)
- message = "[message]"
- saymsg(user, message)
+ if(HAS_TRAIT(src, TRAIT_CMAGGED))
+ message = pick(insultmsg)
+ say_msg(user, message)
- spamcheck = TRUE
- spawn(20)
- spamcheck = FALSE
+ on_cooldown = TRUE
+ addtimer(VARSET_CALLBACK(src, on_cooldown, FALSE), (HAS_TRAIT(src, TRAIT_CMAGGED) || emagged) ? modified_cooldown : normal_cooldown)
-/obj/item/megaphone/proc/saymsg(mob/living/user as mob, message)
- audible_message("[user.GetVoice()] [user.GetAltName()] broadcasts, \"[message]\"", hearing_distance = 14)
+/obj/item/megaphone/proc/say_msg(mob/living/user, message)
+ if(HAS_TRAIT(src, TRAIT_CMAGGED))
+ playsound(src, "sound/items/bikehorn.ogg", 50, TRUE)
+ else
+ playsound(src, "sound/items/megaphone.ogg", 100, FALSE, 5)
+
+ audible_message("[user.GetVoice()] [user.GetAltName()] broadcasts, \"[message]\"", hearing_distance = 14)
log_say(message, user)
for(var/obj/O in oview(14, get_turf(src)))
- O.hear_talk(user, message_to_multilingual("[message]"))
+ O.hear_talk(user, message_to_multilingual("[message]"))
for(var/mob/M in get_mobs_in_view(7, src))
if((M.client?.prefs.toggles2 & PREFTOGGLE_2_RUNECHAT) && M.can_hear())
M.create_chat_message(user, message, FALSE, "big")
-/obj/item/megaphone/emag_act(user as mob)
- if(!emagged)
- to_chat(user, "You overload \the [src]'s voice synthesizer.")
- emagged = TRUE
- insults = rand(1, 3)//to prevent dickflooding
+/obj/item/megaphone/cmag_act(mob/user)
+ if(HAS_TRAIT(src, TRAIT_CMAGGED))
+ return
+ if(user)
+ to_chat(user, "You drip some yellow ooze into [src]'s voice synthesizer, gunking it up.")
+ playsound(src, "sparks", 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ ADD_TRAIT(src, TRAIT_CMAGGED, CLOWN_EMAG)
+
+/obj/item/megaphone/emag_act(mob/user)
+ if(emagged)
+ return
+ if(HAS_TRAIT(src, TRAIT_CMAGGED)) // one at a time
+ to_chat(user, "You go to short out [src], but it's covered in yellow ooze! You don't want to gunk up your emag!")
+ return
+ to_chat(user, "You short out [src]'s dampener circuits.")
+ emagged = TRUE
+ span = "reallybig userdanger" // really obvious, but also really loud
+
diff --git a/sound/items/megaphone.ogg b/sound/items/megaphone.ogg
new file mode 100644
index 00000000000..31d7a8d1ad9
Binary files /dev/null and b/sound/items/megaphone.ogg differ