diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm
index ac38fd9164f..a8a6ce8aefd 100644
--- a/code/datums/diseases/advance/symptoms/hallucigen.dm
+++ b/code/datums/diseases/advance/symptoms/hallucigen.dm
@@ -59,4 +59,4 @@ Bonus
else
if(prob(base_message_chance))
to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]")
- M.hallucination += (15 * power)
+ M.hallucination += (45 * power)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 624d853808a..e65900fa73f 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -233,7 +233,7 @@
return
else /*if(src.justzap)*/
return
- else if(user.hallucination > 50 && ishuman(user) && prob(10) && src.operating == FALSE)
+ else if(user.hallucination > 50 && ishuman(user) && prob(4) && src.operating == FALSE)
hallucinate_shock(user)
return
if (cyclelinkedairlock)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index c9b524836f6..005d9c7595b 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -127,7 +127,7 @@
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
spawn(0)
- new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0)
+ new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0)
var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
chainsaw.flags |= NODROP
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 30e7c843b07..84155f291aa 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -16,46 +16,65 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/image/halbody
var/obj/halitem
var/hal_screwyhud = SCREWYHUD_NONE
- var/handling_hal = 0
+ var/next_hallucination = 0
/mob/living/carbon/proc/handle_hallucinations()
- if(handling_hal)
+ if(world.time < next_hallucination)
return
-
//Least obvious
- var/list/minor = list("sounds"=25,"bolts_minor"=5,"whispers"=15,"message"=10,"hudscrew"=15)
+ var/list/minor = list(\
+ /datum/hallucination/sound,\
+ /datum/hallucination/bolts,\
+ /datum/hallucination/whispers,\
+ /datum/hallucination/message,\
+ /datum/hallucination/hudscrew)
//Something's wrong here
- var/list/medium = list("fake_alert"=15,"items"=10,"items_other"=10,"dangerflash"=10,"bolts"=5,"flood"=5,"husks"=10,"battle"=15,"self_delusion"=10)
+ var/list/medium = list(\
+ /datum/hallucination/fake_alert,\
+ /datum/hallucination/items,\
+ /datum/hallucination/items_other,\
+ /datum/hallucination/dangerflash,\
+ /datum/hallucination/bolts,\
+ /datum/hallucination/fake_flood,\
+ /datum/hallucination/husks,\
+ /datum/hallucination/battle,\
+ /datum/hallucination/self_delusion)
//AAAAH
- var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"delusion"=20,"koolaid"=10)
+ var/list/major = list(\
+ /datum/hallucination/fakeattacker,\
+ /datum/hallucination/death,\
+ /datum/hallucination/xeno_attack,\
+ /datum/hallucination/singularity_scare,\
+ /datum/hallucination/delusion,\
+ /datum/hallucination/oh_yeah)
- handling_hal = 1
- while(hallucination > 20)
- sleep(rand(200,500)/(hallucination/25))
- if(prob(20))
- continue
- var/list/current = list()
- switch(rand(100))
- if(1 to 50)
- current = minor
- if(51 to 85)
- current = medium
- if(86 to 100)
- current = major
+ if(hallucination)
+ var/list/current = minor
+ if(prob(25) && hallucination > 100)
+ current = medium
+ else if(prob(10) && hallucination > 200)
+ current = major
+ var/halpick = pick(current)
+ new halpick(src, FALSE)
- var/halpick = pickweight(current)
+/datum/hallucination
+ var/mob/living/carbon/target = null
+ var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination
- hallucinate(halpick)
- handling_hal = 0
+/datum/hallucination/New(mob/living/carbon/T, forced = TRUE)
+ target = T
+ if(!forced)
+ target.hallucination = max(0, target.hallucination - cost)
+ target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10)
+
+/datum/hallucination/proc/wake_and_restore()
+ target.hal_screwyhud = SCREWYHUD_NONE
+ target.SetSleeping(0)
/obj/effect/hallucination
invisibility = INVISIBILITY_OBSERVER
var/mob/living/carbon/target = null
-/obj/effect/hallucination/proc/wake_and_restore()
- target.hal_screwyhud = SCREWYHUD_NONE
- target.SetSleeping(0)
-
/obj/effect/hallucination/simple
var/image_icon = 'icons/mob/alien.dmi'
var/image_state = "alienh_pounce"
@@ -64,7 +83,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/col_mod = null
var/image/current_image = null
var/image_layer = MOB_LAYER
- var/active = 1 //qdelery
+ var/active = TRUE //qdelery
/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T)
..()
@@ -108,29 +127,30 @@ Gunshots/explosions/opening doors/less rare audio (done)
#define FAKE_FLOOD_EXPAND_TIME 20
#define FAKE_FLOOD_MAX_RADIUS 10
-/obj/effect/hallucination/fake_flood
+/datum/hallucination/fake_flood
//Plasma starts flooding from the nearby vent
+ var/turf/center
var/list/flood_images = list()
var/list/turf/flood_turfs = list()
var/image_icon = 'icons/effects/tile_effects.dmi'
var/image_state = "plasma"
var/radius = 0
var/next_expand = 0
+ cost = 25
-/obj/effect/hallucination/fake_flood/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
if(!U.welded)
- src.loc = U.loc
+ center = get_turf(U)
break
flood_images += image(image_icon,src,image_state,MOB_LAYER)
- flood_turfs += get_turf(src.loc)
+ flood_turfs += center
if(target.client) target.client.images |= flood_images
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
START_PROCESSING(SSobj, src)
-/obj/effect/hallucination/fake_flood/process()
+/datum/hallucination/fake_flood/process()
if(next_expand <= world.time)
radius++
if(radius > FAKE_FLOOD_MAX_RADIUS)
@@ -138,10 +158,10 @@ Gunshots/explosions/opening doors/less rare audio (done)
return
Expand()
if((get_turf(target) in flood_turfs) && !target.internal)
- target.hallucinate("fake_alert", "tox_in_air")
+ new /datum/hallucination/fake_alert(target, TRUE, "tox_in_air")
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
-/obj/effect/hallucination/fake_flood/proc/Expand()
+/datum/hallucination/fake_flood/proc/Expand()
for(var/turf/FT in flood_turfs)
for(var/dir in GLOB.cardinals)
var/turf/T = get_step(FT, dir)
@@ -152,7 +172,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(target.client)
target.client.images |= flood_images
-/obj/effect/hallucination/fake_flood/Destroy()
+/datum/hallucination/fake_flood/Destroy()
STOP_PROCESSING(SSobj, src)
qdel(flood_turfs)
flood_turfs = list()
@@ -167,7 +187,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
image_icon = 'icons/mob/alien.dmi'
image_state = "alienh_pounce"
-/obj/effect/hallucination/simple/xeno/Initialize(mapload, var/mob/living/carbon/T)
+/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T)
..()
name = "alien hunter ([rand(1, 1000)])"
@@ -177,14 +197,14 @@ Gunshots/explosions/opening doors/less rare audio (done)
target.Knockdown(100)
target.visible_message("[target] flails around wildly.","[name] pounces on you!")
-/obj/effect/hallucination/xeno_attack
+/datum/hallucination/xeno_attack
//Xeno crawls from nearby vent,jumps at you, and goes back in
var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null
var/obj/effect/hallucination/simple/xeno/xeno = null
+ cost = 25
-/obj/effect/hallucination/xeno_attack/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
if(!U.welded)
pump = U
@@ -209,7 +229,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
image_icon = 'icons/mob/animal.dmi'
image_state = "clown"
-/obj/effect/hallucination/simple/clown/Initialize(mapload, var/mob/living/carbon/T,duration)
+/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration)
..(loc, T)
name = pick(GLOB.clown_names)
QDEL_IN(src,duration)
@@ -223,14 +243,14 @@ Gunshots/explosions/opening doors/less rare audio (done)
image_state = "bubblegum"
px = -32
-/obj/effect/hallucination/oh_yeah
+/datum/hallucination/oh_yeah
var/obj/effect/hallucination/simple/bubblegum/bubblegum
var/image/fakebroken
var/image/fakerune
+ cost = 75
-/obj/effect/hallucination/oh_yeah/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE)
. = ..()
- target = T
var/turf/closed/wall/wall
for(var/turf/closed/wall/W in range(7,target))
wall = W
@@ -250,7 +270,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
bubblegum = new(wall, target)
addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10)
-/obj/effect/hallucination/oh_yeah/proc/bubble_attack(turf/landing)
+/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing)
var/charged = FALSE //only get hit once
while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
bubblegum.forceMove(get_step_towards(bubblegum, landing))
@@ -268,7 +288,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
sleep(30)
qdel(src)
-/obj/effect/hallucination/oh_yeah/Destroy()
+/datum/hallucination/oh_yeah/Destroy()
if(target.client)
target.client.images.Remove(fakebroken)
target.client.images.Remove(fakerune)
@@ -277,23 +297,23 @@ Gunshots/explosions/opening doors/less rare audio (done)
QDEL_NULL(bubblegum)
return ..()
-/obj/effect/hallucination/singularity_scare
+/datum/hallucination/singularity_scare
//Singularity moving towards you.
//todo Hide where it moved with fake space images
var/obj/effect/hallucination/simple/singularity/s = null
+ cost = 75
-/obj/effect/hallucination/singularity_scare/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
var/turf/start = get_turf(T)
var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
- for(var/i = 0,i<11,i++)
+ for(var/i = 0,i<13,i++)
start = get_step(start,screen_border)
s = new(start,target)
s.parent = src
- for(var/i = 0,i<11,i++)
- sleep(5)
- s.loc = get_step(get_turf(s),get_dir(s,target))
+ for(var/i = 0,i<13,i++)
+ sleep(10)
+ s.forceMove(get_step(get_turf(s),get_dir(s,target)))
s.Show()
s.Eat()
qdel(s)
@@ -304,26 +324,26 @@ Gunshots/explosions/opening doors/less rare audio (done)
image_layer = MASSIVE_OBJ_LAYER
px = -96
py = -96
- var/obj/effect/hallucination/singularity_scare/parent
+ var/datum/hallucination/singularity_scare/parent
/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
var/target_dist = get_dist(src,target)
if(target_dist<=3) //"Eaten"
- target.hal_screwyhud = SCREWYHUD_CRIT
+ target.hal_screwyhud = SCREWYHUD_DEAD
target.SetUnconscious(160)
- addtimer(CALLBACK(parent, .proc/wake_and_restore), rand(30, 50))
+ addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50))
-/obj/effect/hallucination/battle
+/datum/hallucination/battle
+ cost = 15
-/obj/effect/hallucination/battle/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
var/hits = rand(3,6)
switch(rand(1,5))
if(1) //Laser fight
for(var/i=0,i[my_target] stumbles around.")
-/obj/effect/fake_attacker/Initialize(mapload, var/mob/living/carbon/T)
+/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T)
..()
my_target = T
QDEL_IN(src, 300)
@@ -641,12 +660,12 @@ Gunshots/explosions/opening doors/less rare audio (done)
QDEL_IN(O, 300)
-/obj/effect/hallucination/bolts
+/datum/hallucination/bolts
var/list/doors = list()
+ cost = 25
-/obj/effect/hallucination/bolts/Initialize(mapload, var/mob/living/carbon/T,var/door_number=-1) //-1 for severe, 1-2 for subtle
+/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle
..()
- target = T
var/image/I = null
var/count = 0
for(var/obj/machinery/door/airlock/A in range(7, target))
@@ -667,13 +686,30 @@ Gunshots/explosions/opening doors/less rare audio (done)
sleep(rand(6,12))
qdel(src)
-/obj/effect/hallucination/whispers
+/datum/hallucination/whispers
+ cost = 15
-/obj/effect/hallucination/whispers/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
- var/speak_messages = list("I'm watching you...","[target.first_name()]!","Get out!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","HELP!!","EI NATH!!", "RUN!!", "Kill me!","O bidai nabora se'sma!", "[text2ratvar("Divinity, grant...")]")
- var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]","Where's [target.first_name()]?","Call the shuttle!","AI rogue!!")
+ var/speak_messages = list("[pick("I'm watching you...","I know what you're doing","What are you hiding?","I saw that")]",\ //they KNOW
+ "[pick("","Hey, ","Hi ","Hello ","Wait, ","It's ")][target.first_name()]!",\ //yes, you
+ "[pick("Get out","Go away","Fuck off","OUT!")]",\ //Shoo
+ "[pick("Kchck-Chkck? Kchchck!","EEEeeeeEEEE","#@§*&£","H-hhhhh...)]",\ //wat
+ "[pick("Did you hear that?","Did you see that?","What was that?")]",\ //that
+ "[pick("Hail Ratvar","Hail Nar'Sie","Viva!","[generate_code_phrase()]","Are you mr. [pick(GLOB.possible_changeling_IDs)]?")]",\ //Hi i'm mr. antag
+ "[pick("Why?","What?","Wait, what?","Wait","Hold on","Uh...")]",\ //Odd during a conversation
+ "Give me that!",\
+ "HELP[pick(""," ME"," HIM"," HER"," THEM")]!!",\ //chelp
+ "RUN!!",\
+ "I'm infected, [pick("stay away","don't get close","be careful","help me","kill me")]")
+
+ var/radio_messages = list("Set [target.first_name()] to arrest!",\
+ "[pick("Captain","Hos","Cmo","Rd","Ce","Hop","Janitor","AI","Viro","Qm","[target.first_name()]")] is [pick("rogue","cult","clockcult","a revhead","a gang leader","a traitor","a ling","dead")]!",\
+ "Help!",\
+ "[pick("Cult", "Wizard", "Blob", "Ling", "Ops", "Swarmers", "Revenant", "Traitor", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]",\
+ "Where's [target.first_name()]?"\
+ ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\
+ ,"AI [pick("rogue", "is dead")]!!")
var/list/mob/living/carbon/people = list()
var/list/mob/living/carbon/person = null
@@ -702,307 +738,303 @@ Gunshots/explosions/opening doors/less rare audio (done)
to_chat(target, target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans()))
qdel(src)
-/obj/effect/hallucination/message
+/datum/hallucination/message
+ cost = 15
-/obj/effect/hallucination/message/Initialize(mapload, var/mob/living/carbon/T)
+/datum/hallucination/message/New(mob/living/carbon/T, forced = TRUE)
..()
- target = T
var/chosen = pick("The light burns you!", \
"You don't feel like yourself.", \
- "Unknown has punched [target]!", \
"You hear something squeezing through the ducts...", \
"You hear a distant scream.", \
"You feel invincible, nothing can hurt you!", \
"You feel a tiny prick!", \
"[target] sneezes.", \
- "You feel faint.", \
- "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \
- "You can see...everything!")
+ //The truth, revealed
+ "You're hallucinating.", \
+ //Direct speech
+ "[pick("Hmm...","Yes.","No.","Ignore that last message.","You should stop doing that.","Good luck.")]")
to_chat(target, chosen)
qdel(src)
-/mob/living/carbon/proc/hallucinate(hal_type, specific) // specific is used to specify a particular hallucination
- set waitfor = 0
- switch(hal_type)
- if("xeno")
- new /obj/effect/hallucination/xeno_attack(src.loc,src)
- if("singulo")
- new /obj/effect/hallucination/singularity_scare(src.loc,src)
- if("koolaid")
- new /obj/effect/hallucination/oh_yeah(src.loc,src)
- if("battle")
- new /obj/effect/hallucination/battle(src.loc,src)
- if("flood")
- new /obj/effect/hallucination/fake_flood(src.loc,src)
- if("delusion")
- new /obj/effect/hallucination/delusion(src.loc,src)
- if("self_delusion")
- new /obj/effect/hallucination/self_delusion(src.loc,src)
- if("fake")
- new /obj/effect/hallucination/fakeattacker(src.loc,src)
- if("bolts")
- new /obj/effect/hallucination/bolts(src.loc,src)
- if("bolts_minor")
- new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
- if("whispers")
- new /obj/effect/hallucination/whispers(src.loc,src)
- if("message")
- new /obj/effect/hallucination/message(src.loc,src)
- if("items_other")
- new /obj/effect/hallucination/items_other(src.loc,src)
- if("sounds")
- //Strange audio
- switch(rand(1,20))
- if(1) playsound_local(null,'sound/machines/airlock.ogg', 15, 1)
- if(2)
- if(prob(50)) playsound_local(null,'sound/effects/explosion1.ogg', 50, 1)
- else playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1)
- if(3) playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
- if(4) playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
- if(5)
- playsound_local(null, 'sound/weapons/ring.ogg', 35)
- sleep(15)
- playsound_local(null, 'sound/weapons/ring.ogg', 35)
- sleep(15)
- playsound_local(null, 'sound/weapons/ring.ogg', 35)
- if(6) playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1)
- if(7) playsound_local(null, 'sound/machines/alarm.ogg', 100, 0)
- if(8) playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
- if(9)
- //To make it more realistic, I added two gunshots (enough to kill)
- playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1)
- spawn(rand(10,30))
- playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1)
- sleep(rand(5,10))
- playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1)
- if(10) playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
- if(11)
- //Same as above, but with tasers.
- playsound_local(null, 'sound/weapons/taser.ogg', 25, 1)
- spawn(rand(10,30))
- playsound_local(null, 'sound/weapons/taser.ogg', 25, 1)
- sleep(rand(5,10))
- playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1)
- //Rare audio
- if(12)
- //These sounds are (mostly) taken from Hidden: Source
- var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
- 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
- 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
- playsound_local(null, pick(creepyasssounds), 50, 1)
- if(13)
- playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100)
- sleep(150)
- playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100)
- if(14)
- to_chat(src, "Priority Announcement
")
- to_chat(src, "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
")
- playsound_local(null, 'sound/ai/shuttledock.ogg', 100)
- //Deconstructing a wall
- if(15)
- playsound_local(null, 'sound/items/welder.ogg', 15, 1)
- sleep(105)
- playsound_local(null, 'sound/items/welder2.ogg', 15, 1)
- sleep(15)
- playsound_local(null, 'sound/items/ratchet.ogg', 15, 1)
- //Hacking a door
- if(16)
- playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1)
- sleep(rand(10,30))
- for(var/i = rand(1,3), i>0, i--)
- playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
- sleep(rand(10,30))
- playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
- if(17)
- playsound_local(null, 'sound/weapons/saberon.ogg',35,1)
- if(18)
- to_chat(src, "Biohazard Alert
")
- to_chat(src, "
Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.
")
- playsound_local(null, 'sound/ai/outbreak5.ogg')
- if(19) //Tesla loose!
- playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
- sleep(20)
- playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
- sleep(20)
- playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
- if(20) //AI is doomsdaying!
- to_chat(src, "Anomaly Alert
")
- to_chat(src, "
Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.
")
- playsound_local(null, 'sound/ai/aimalf.ogg', 100)
- if("hudscrew")
- //Screwy HUD
- //to_chat(src, "Screwy HUD")
- hal_screwyhud = pick(SCREWYHUD_NONE,SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)
- sleep(rand(100,250))
- hal_screwyhud = 0
+/datum/hallucination/sound
+ cost = 15
- if("fake_alert")
- var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
- if(specific)
- alert_type = specific
- switch(alert_type)
- if("oxy")
- throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE)
- if("not_enough_tox")
- throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE)
- if("not_enough_co2")
- throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE)
- if("too_much_oxy")
- throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE)
- if("too_much_co2")
- throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE)
- if("tox_in_air")
- throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE)
- if("nutrition")
- if(prob(50))
- throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE)
- else
- throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE)
- if("weightless")
- throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE)
- if("fire")
- throw_alert("fire", /obj/screen/alert/fire, override = TRUE)
- if("temp")
- if(prob(50))
- throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
- else
- throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE)
- if("pressure")
- if(prob(50))
- throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE)
- else
- throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE)
- //BEEP BOOP I AM A ROBOT
- if("newlaw")
- throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE)
- if("locked")
- throw_alert("locked", /obj/screen/alert/locked, override = TRUE)
- if("hacked")
- throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE)
- if("charge")
- throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE)
- sleep(rand(100,200))
- clear_alert(alert_type, clear_override = TRUE)
-
- if("items")
- //Strange items
- //to_chat(src, "Traitor Items")
- if(!halitem)
- halitem = new
- var/obj/item/l_hand = get_item_for_held_index(1)
- var/obj/item/r_hand = get_item_for_held_index(2)
- var/l = ui_hand_position(get_held_index_of_item(l_hand))
- var/r = ui_hand_position(get_held_index_of_item(r_hand))
- var/list/slots_free = list(l,r)
- if(l_hand) slots_free -= l
- if(r_hand) slots_free -= r
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- if(!H.belt) slots_free += ui_belt
- if(!H.l_store) slots_free += ui_storage1
- if(!H.r_store) slots_free += ui_storage2
- if(slots_free.len)
- halitem.screen_loc = pick(slots_free)
- halitem.layer = ABOVE_HUD_LAYER
- halitem.plane = ABOVE_HUD_PLANE
- switch(rand(1,6))
- if(1) //revolver
- halitem.icon = 'icons/obj/guns/projectile.dmi'
- halitem.icon_state = "revolver"
- halitem.name = "Revolver"
- if(2) //c4
- halitem.icon = 'icons/obj/grenade.dmi'
- halitem.icon_state = "plastic-explosive0"
- halitem.name = "Mysterious Package"
- if(prob(25))
- halitem.icon_state = "c4small_1"
- if(3) //sword
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "sword1"
- halitem.name = "Sword"
- if(4) //stun baton
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "stunbaton"
- halitem.name = "Stun Baton"
- if(5) //emag
- halitem.icon = 'icons/obj/card.dmi'
- halitem.icon_state = "emag"
- halitem.name = "Cryptographic Sequencer"
- if(6) //flashbang
- halitem.icon = 'icons/obj/grenade.dmi'
- halitem.icon_state = "flashbang1"
- halitem.name = "Flashbang"
- if(client) client.screen += halitem
- QDEL_IN(halitem, rand(100, 250))
- if("dangerflash")
- //Flashes of danger
- //to_chat(src, "Danger Flash")
- if(!halimage)
- var/list/possible_points = list()
- for(var/turf/open/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/open/floor/target = pick(possible_points)
-
- switch(rand(1,4))
- if(1)
- //to_chat(src, "Space")
- halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
- if(2)
- //to_chat(src, "Lava")
- halimage = image('icons/turf/floors/lava.dmi',target,"smooth",TURF_LAYER)
- if(3)
- //to_chat(src, "Chasm")
- halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER)
- if(4)
- //to_chat(src, "C4")
- halimage = image('icons/obj/grenade.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
-
-
- if(client) client.images += halimage
- sleep(rand(40,60)) //Only seen for a brief moment.
- if(client) client.images -= halimage
- halimage = null
- if("death")
- //Fake death
- hal_screwyhud = SCREWYHUD_DEAD
- SetUnconscious(400)
- var/area/area = get_area(src)
- to_chat(src, "[mind.name] has died at [area.name].")
+/datum/hallucination/sound/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ //Strange audio
+ switch(rand(1,20))
+ if(1) target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1)
+ if(2)
if(prob(50))
- var/list/dead_people = list()
- for(var/mob/dead/observer/G in GLOB.player_list)
- dead_people += G
- var/mob/dead/observer/fakemob = pick(dead_people)
- if(fakemob)
- sleep(rand(30, 60))
- to_chat(src, "DEAD: [fakemob.name] says, \"[pick("rip","welcome [first_name()]","you too?","is the AI malf?",\
- "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"")
- sleep(rand(50,70))
- hal_screwyhud = SCREWYHUD_NONE
- SetSleeping(0)
- if("husks")
- if(!halbody)
- var/list/possible_points = list()
- for(var/turf/open/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/open/floor/target = pick(possible_points)
- switch(rand(1,4))
- if(1)
- var/image/body = image('icons/mob/human.dmi',target,"husk",TURF_LAYER)
- var/matrix/M = matrix()
- M.Turn(90)
- body.transform = M
- halbody = body
- if(2,3)
- halbody = image('icons/mob/human.dmi',target,"husk",TURF_LAYER)
- if(4)
- halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
+ target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1)
+ else
+ target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1)
+ if(3) target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
+ if(4) target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
+ if(5)
+ target.playsound_local(null, 'sound/weapons/ring.ogg', 35)
+ sleep(15)
+ target.playsound_local(null, 'sound/weapons/ring.ogg', 35)
+ sleep(15)
+ target.playsound_local(null, 'sound/weapons/ring.ogg', 35)
+ if(6) target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1)
+ if(7) target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0)
+ if(8) target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
+ if(9) target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
+ //Rare audio
+ if(10)
+ //These sounds are (mostly) taken from Hidden: Source
+ var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
+ 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
+ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
+ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
+ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
+ target.playsound_local(null, pick(creepyasssounds), 50, 1)
+ if(11)
+ target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100)
+ sleep(150)
+ target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100)
+ if(12)
+ to_chat(target, "Priority Announcement
")
+ to_chat(target, "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
")
+ target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100)
+ //Deconstructing a wall
+ if(13)
+ target.playsound_local(null, 'sound/items/welder.ogg', 15, 1)
+ sleep(105)
+ target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1)
+ sleep(15)
+ target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1)
+ //Hacking a door
+ if(14)
+ target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1)
+ sleep(rand(10,30))
+ for(var/i = rand(1,3), i>0, i--)
+ target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
+ sleep(rand(10,30))
+ target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
+ if(15)
+ target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1)
+ if(16)
+ to_chat(target, "Biohazard Alert
")
+ to_chat(target, "
Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.
")
+ target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0)
+ if(17) //Tesla loose!
+ target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
+ sleep(20)
+ target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
+ sleep(20)
+ target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
+ if(18) //AI is doomsdaying!
+ to_chat(target, "Anomaly Alert
")
+ to_chat(target, "
Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.
")
+ target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0)
+ qdel(src)
- if(client) client.images += halbody
- spawn(rand(30,50)) //Only seen for a brief moment.
- if(client) client.images -= halbody
- halbody = null
+/datum/hallucination/hudscrew
+ cost = 10
+
+/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ //Screwy HUD
+ target.hal_screwyhud = pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)
+ sleep(rand(100,250))
+ target.hal_screwyhud = SCREWYHUD_NONE
+ qdel(src)
+
+/datum/hallucination/fake_alert
+ cost = 15
+
+/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific)
+ ..()
+ var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
+ if(specific)
+ alert_type = specific
+ switch(alert_type)
+ if("oxy")
+ target.throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE)
+ if("not_enough_tox")
+ target.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE)
+ if("not_enough_co2")
+ target.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE)
+ if("too_much_oxy")
+ target.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE)
+ if("too_much_co2")
+ target.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE)
+ if("tox_in_air")
+ target.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE)
+ if("nutrition")
+ if(prob(50))
+ target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE)
+ else
+ target.throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE)
+ if("weightless")
+ target.throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE)
+ if("fire")
+ target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE)
+ if("temp")
+ if(prob(50))
+ target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
+ else
+ target.throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE)
+ if("pressure")
+ if(prob(50))
+ target.throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE)
+ else
+ target.throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE)
+ //BEEP BOOP I AM A ROBOT
+ if("newlaw")
+ target.throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE)
+ if("locked")
+ target.throw_alert("locked", /obj/screen/alert/locked, override = TRUE)
+ if("hacked")
+ target.throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE)
+ if("charge")
+ target.throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE)
+ sleep(rand(100,200))
+ target.clear_alert(alert_type, clear_override = TRUE)
+ qdel(src)
+
+/datum/hallucination/items
+ cost = 15
+
+/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ //Strange items
+ if(!target.halitem)
+ target.halitem = new
+ var/obj/item/l_hand = target.get_item_for_held_index(1)
+ var/obj/item/r_hand = target.get_item_for_held_index(2)
+ var/l = ui_hand_position(target.get_held_index_of_item(l_hand))
+ var/r = ui_hand_position(target.get_held_index_of_item(r_hand))
+ var/list/slots_free = list(l,r)
+ if(l_hand) slots_free -= l
+ if(r_hand) slots_free -= r
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(!H.belt) slots_free += ui_belt
+ if(!H.l_store) slots_free += ui_storage1
+ if(!H.r_store) slots_free += ui_storage2
+ if(slots_free.len)
+ target.halitem.screen_loc = pick(slots_free)
+ target.halitem.layer = ABOVE_HUD_LAYER
+ target.halitem.plane = ABOVE_HUD_PLANE
+ switch(rand(1,6))
+ if(1) //revolver
+ target.halitem.icon = 'icons/obj/guns/projectile.dmi'
+ target.halitem.icon_state = "revolver"
+ target.halitem.name = "Revolver"
+ if(2) //c4
+ target.halitem.icon = 'icons/obj/grenade.dmi'
+ target.halitem.icon_state = "plastic-explosive0"
+ target.halitem.name = "C4"
+ if(prob(25))
+ target.halitem.icon_state = "plasticx40"
+ if(3) //sword
+ target.halitem.icon = 'icons/obj/weapons.dmi'
+ target.halitem.icon_state = "sword0"
+ target.halitem.name = "Energy Sword"
+ if(4) //stun baton
+ target.halitem.icon = 'icons/obj/weapons.dmi'
+ target.halitem.icon_state = "stunbaton"
+ target.halitem.name = "Stun Baton"
+ if(5) //emag
+ target.halitem.icon = 'icons/obj/card.dmi'
+ target.halitem.icon_state = "emag"
+ target.halitem.name = "Cryptographic Sequencer"
+ if(6) //flashbang
+ target.halitem.icon = 'icons/obj/grenade.dmi'
+ target.halitem.icon_state = "flashbang1"
+ target.halitem.name = "Flashbang"
+ if(target.client) target.client.screen += target.halitem
+ QDEL_IN(target.halitem, rand(150, 350))
+ qdel(src)
+
+/datum/hallucination/dangerflash
+ cost = 15
+
+/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ //Flashes of danger
+ if(!target.halimage)
+ var/list/possible_points = list()
+ for(var/turf/open/floor/F in view(target,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/open/floor/danger_point = pick(possible_points)
+
+ switch(rand(1,5))
+ if(1)
+ target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER)
+ if(2)
+ target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER)
+ if(3)
+ target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER)
+ if(4)
+ target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01)
+ if(5)
+ target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01)
+
+
+ if(target.client)
+ target.client.images += target.halimage
+ sleep(rand(200,450))
+ if(target.client)
+ target.client.images -= target.halimage
+ QDEL_NULL(target.halimage)
+ qdel(src)
+
+/datum/hallucination/death
+ cost = 40
+
+/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ target.hal_screwyhud = SCREWYHUD_DEAD
+ target.SetUnconscious(400)
+ var/area/area = get_area(src)
+ to_chat(target, "[target.mind.name] has died at [area.name].")
+ if(prob(50))
+ var/list/dead_people = list()
+ for(var/mob/dead/observer/G in GLOB.player_list)
+ dead_people += G
+ var/mob/dead/observer/fakemob = pick(dead_people)
+ if(fakemob)
+ sleep(rand(30, 60))
+ to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","welcome [target.first_name()]","you too?","is the AI malf?",\
+ "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"")
+ sleep(rand(50,70))
+ target.hal_screwyhud = SCREWYHUD_NONE
+ target.SetSleeping(0)
+ qdel(src)
+
+/datum/hallucination/husks
+ cost = 20
+
+/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ if(!target.halbody)
+ var/list/possible_points = list()
+ for(var/turf/open/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/open/floor/husk_point = pick(possible_points)
+ switch(rand(1,4))
+ if(1)
+ var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER)
+ var/matrix/M = matrix()
+ M.Turn(90)
+ body.transform = M
+ target.halbody = body
+ if(2,3)
+ target.halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER)
+ if(4)
+ target.halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER)
+
+ if(target.client)
+ target.client.images += target.halbody
+ sleep(rand(30,50)) //Only seen for a brief moment.
+ if(target.client)
+ target.client.images -= target.halbody
+ QDEL_NULL(target.halbody)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 9b04a5467de..8bacfe53df7 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -369,8 +369,7 @@
adjust_drugginess(-1)
if(hallucination)
- spawn handle_hallucinations()
- hallucination = max(hallucination-2,0)
+ handle_hallucinations()
//used in human and monkey handle_environment()
/mob/living/carbon/proc/natural_bodytemperature_stabilization()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
index c42dbb0783a..78554e29bad 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
@@ -21,7 +21,7 @@
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
. = ..()
if(. && ishuman(target) && target != summoner)
- new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon)
+ new /datum/hallucination/delusion(target,TRUE,"custom",200,0, icon_state,icon)
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index ff44804e759..0f5f1de91d6 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -290,9 +290,8 @@
//HALLUCINATE
else if((findtext(message, hallucinate_words)))
cooldown = COOLDOWN_MEME
- for(var/V in listeners)
- var/mob/living/L = V
- new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0)
+ for(var/mob/living/carbon/C in listeners)
+ new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0)
//WAKE UP
else if((findtext(message, wakeup_words)))