diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 226bfee6310..070837bee97 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -24,6 +24,7 @@
#define SPAN_PAPYRUS "papyrus"
#define SPAN_REALLYBIG "reallybig"
#define SPAN_COMMAND "command_headset"
+#define SPAN_CLOWN "clown"
//bitflag #defines for return value of the radio() proc.
#define ITALICS 1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8877f17bc51..507de736111 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -585,3 +585,8 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
. = "[user] lights [A] with [src]."
else
. = ""
+
+
+//when an item modify our speech spans when in our active hand. Override this to modify speech spans.
+/obj/item/proc/get_held_item_speechspans(mob/living/carbon/user)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 34861d8e5c3..afa79892484 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -6,54 +6,22 @@
w_class = 2
flags = FPRINT
siemens_coefficient = 1
-
var/spamcheck = 0
var/emagged = 0
- var/insults = 0
- var/voicespan = "command_headset" // sic
- var/list/insultmsg = list("FUCK EVERYONE!", "DEATH TO LIZARDS!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!", "VIVA!", "HONK!")
-
-/obj/item/device/megaphone/attack_self(mob/living/carbon/human/user)
- if(user.client)
- if(user.client.prefs.muted & MUTE_IC)
- src << "You cannot speak in IC (muted)."
- return
-
- if(!ishuman(user))
- user << "You don't know how to use this!"
- return
+ var/list/voicespan = list(SPAN_COMMAND)
+/obj/item/device/megaphone/get_held_item_speechspans(mob/living/carbon/user)
if(spamcheck > world.time)
user << "\The [src] needs to recharge!"
- return
-
- var/message = copytext(sanitize(input(user, "Shout a message?", "Megaphone", null) as text),1,MAX_MESSAGE_LEN)
- if(!message)
- return
-
- message = capitalize(message)
- if(!user.can_speak(message))
- user << "You find yourself unable to speak at all!"
- return
-
- if ((src.loc == user && user.stat == 0))
- if(emagged)
- if(insults)
- user.say(pick(insultmsg),"machine", list(voicespan))
- insults--
- else
- user << "*BZZZZzzzzzt*"
- else
- user.say(message,"machine", list(voicespan))
-
+ else
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
spamcheck = world.time + 50
- return
+ return voicespan
/obj/item/device/megaphone/emag_act(mob/user)
user << "You overload \the [src]'s voice synthesizer."
emagged = 1
- insults = rand(1, 3) //to prevent dickflooding
+ voicespan = list(SPAN_REALLYBIG, "userdanger")
/obj/item/device/megaphone/sec
name = "security megaphone"
@@ -71,4 +39,4 @@
name = "clown's megaphone"
desc = "Something that should not exist."
icon_state = "megaphone-clown"
- voicespan = "clown"
\ No newline at end of file
+ voicespan = list(SPAN_CLOWN)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index 0b6c2cae108..8b1e3b65298 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -24,3 +24,7 @@
var/obj/item/organ/tongue/T = getorganslot("tongue")
if(T)
. |= T.get_spans()
+
+ var/obj/item/I = get_active_held_item()
+ if(I)
+ . |= I.get_held_item_speechspans(src)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 06e5ad4ff7f..59ab34a98eb 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -92,11 +92,12 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(message_mode != MODE_WHISPER) //whisper() calls treat_message(); double process results in "hisspering"
message = treat_message(message)
- spans += get_spans()
if(!message)
return
+ spans += get_spans()
+
//Log of what we've said, plain message, no spans or junk
say_log += message