diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index a718e8be41..a7c4384f4f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -9,7 +9,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
/mob/observer/dead
name = "ghost"
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
- icon = 'icons/mob/mob.dmi'
+ icon = 'icons/mob/ghost.dmi'
icon_state = "ghost"
layer = 4
stat = DEAD
@@ -35,6 +35,39 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
var/seedarkness = 1
incorporeal_move = 1
+ var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil.
+ var/ghost_sprite = null
+ var/global/list/possible_ghost_sprites = list(
+ "Clear" = "blank",
+ "Green Blob" = "otherthing",
+ "Bland" = "ghost",
+ "Robed-B" = "ghost1",
+ "Robed-BAlt" = "ghost2",
+ "Corgi" = "ghostian",
+ "King" = "ghostking",
+ "Shade" = "shade",
+ "Hecate" = "ghost-narsie",
+ "Glowing Statue" = "armour",
+ "Artificer" = "artificer",
+ "Behemoth" = "behemoth",
+ "Harvester" = "harvester",
+ "Wraith" = "wraith",
+ "Viscerator" = "viscerator",
+ "Bats" = "bat",
+ "Red Robes" = "robe_red",
+ "Faithless" = "faithless",
+ "Shadowform" = "forgotten",
+ "Black Cat" = "blackcat",
+ "Dark Ethereal" = "bloodguardian",
+ "Holy Ethereal" = "lightguardian",
+ "Red Elemental" = "magicRed",
+ "Blue Elemental" = "magicBlue",
+ "Pink Elemental" = "magicPink",
+ "Orange Elemental" = "magicOrange",
+ "Green Elemental" = "magicGreen",
+ "Daemon" = "daemon"
+ )
+
/mob/observer/dead/New(mob/body)
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
see_invisible = SEE_INVISIBLE_OBSERVER
@@ -617,11 +650,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 1
/mob/observer/dead/proc/manifest(mob/user)
- var/is_manifest = 0
+ is_manifest = 0
if(!is_manifest)
is_manifest = 1
verbs += /mob/observer/dead/proc/toggle_visibility
-
+ verbs += /mob/observer/dead/proc/ghost_whisper
+ src << "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab."
if(src.invisibility != 0)
user.visible_message( \
"\The [user] drags ghost, [src], to our plane of reality!", \
@@ -753,3 +787,44 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
if((!target) || (!ghost)) return
. = "follow"
. += target.extra_ghost_link(ghost)
+
+//Culted Ghosts
+
+/mob/observer/dead/proc/ghost_whisper()
+ set name = "Spectral Whisper"
+ set category = "IC"
+
+ if(is_manifest) //Only able to whisper if it's hit with a tome.
+ var/list/options = list()
+ for(var/mob/living/Ms in view(src))
+ options += Ms
+ var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options
+ if(!M)
+ return 0
+ var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null)
+ if(msg)
+ log_say("SpectralWhisper: [key_name(usr)]->[M.key] : [msg]")
+ M << " You hear a strange, unidentifiable voice in your head... [msg]"
+ src << " You said: '[msg]' to [M]."
+ else
+ return
+ return 1
+ else
+ src << "You have not been pulled past the veil!"
+
+/mob/observer/dead/verb/choose_ghost_sprite()
+ set category = "Ghost"
+ set name = "Choose Sprite"
+
+ icon = 'icons/mob/ghost.dmi'
+ var/choice
+ var/finalized = "No"
+ while(finalized == "No" && src.client)
+
+ choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites
+ if(!choice) return
+
+ icon_state = possible_ghost_sprites[choice]
+ finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
+
+ ghost_sprite = possible_ghost_sprites[choice]
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 8ab162dbc4..7fb8052909 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -84,4 +84,7 @@
if(input)
log_emote("Ghost/[src.key] : [input]")
- say_dead_direct(input, src)
+ if(!invisibility) //If the ghost is made visible by admins or cult. And to see if the ghost has toggled its own visibility, as well. -Mech
+ visible_message("[src] [input]")
+ else
+ say_dead_direct(input, src)
diff --git a/icons/mob/ghost.dmi b/icons/mob/ghost.dmi
new file mode 100644
index 0000000000..5f61e7a1e7
Binary files /dev/null and b/icons/mob/ghost.dmi differ