diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index b9c90ce4f50..9a79c477c89 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -929,6 +929,24 @@
manipulate_organs(C)
href_list["datumrefresh"] = href_list["editorgans"]
+ else if(href_list["hallucinate"])
+ if(!check_rights(0))
+ return
+
+ var/mob/living/carbon/C = locate(href_list["hallucinate"])
+ if(!istype(C))
+ to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
+ return
+
+ var/list/hallucinations = subtypesof(/datum/hallucination)
+ var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations
+ if(!C)
+ to_chat(usr, "Mob doesn't exist anymore")
+ return
+
+ if(result)
+ new result(C, TRUE)
+
else if(href_list["makehuman"])
if(!check_rights(R_SPAWN))
return
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 5816864e0b4..e6f19586225 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -22,30 +22,31 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(world.time < next_hallucination)
return
//Least obvious
- var/list/minor = list(\
- /datum/hallucination/sound,\
- /datum/hallucination/bolts,\
- /datum/hallucination/whispers,\
- /datum/hallucination/message,\
+ 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(\
- /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,\
+ 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/fire,
/datum/hallucination/self_delusion)
//AAAAH
- var/list/major = list(\
- /datum/hallucination/fakeattacker,\
- /datum/hallucination/death,\
- /datum/hallucination/xeno_attack,\
- /datum/hallucination/singularity_scare,\
- /datum/hallucination/delusion,\
+ 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)
if(hallucination)
@@ -144,7 +145,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!U.welded)
center = get_turf(U)
break
- flood_images += image(image_icon,src,image_state,MOB_LAYER)
+ flood_images += image(image_icon,center,image_state,MOB_LAYER)
flood_turfs += center
if(target.client) target.client.images |= flood_images
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
@@ -220,7 +221,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
sleep(10)
var/xeno_name = xeno.name
to_chat(target, "[xeno_name] begins climbing into the ventilation system...")
- sleep(10)
+ sleep(30)
qdel(xeno)
to_chat(target, "[xeno_name] scrambles into the ventilation ducts!")
qdel(src)
@@ -637,7 +638,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
else
- my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1, -1)
+ my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1)
my_target.show_message("[src.name] has punched [my_target]!", 1)
my_target.staminaloss += 30
if(prob(33))
@@ -846,9 +847,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
/datum/hallucination/fake_alert
cost = 15
-/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific)
+/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150)
..()
- 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")
+ 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","temphot","tempcold","pressure")
if(specific)
alert_type = specific
switch(alert_type)
@@ -873,11 +874,10 @@ Gunshots/explosions/opening doors/less rare audio (done)
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("temphot")
+ target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
+ if("tempcold")
+ 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)
@@ -892,7 +892,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
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))
+ sleep(duration)
target.clear_alert(alert_type, clear_override = TRUE)
qdel(src)
@@ -992,7 +992,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
..()
target.hal_screwyhud = SCREWYHUD_DEAD
target.SetUnconscious(400)
- var/area/area = get_area(src)
+ var/area/area = get_area(target)
to_chat(target, "[target.mind.name] has died at [area.name].")
if(prob(50))
var/list/dead_people = list()
@@ -1008,6 +1008,34 @@ Gunshots/explosions/opening doors/less rare audio (done)
target.SetSleeping(0)
qdel(src)
+/datum/hallucination/fire
+ cost = 25
+
+/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE)
+ ..()
+ var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER)
+ if(target.client)
+ target.client.images += fire_overlay
+ to_chat(target, "You're set on fire!")
+ target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE)
+ sleep(20)
+ target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE)
+ sleep(30)
+ target.clear_alert("temp", clear_override = TRUE)
+ target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE)
+ sleep(30)
+ target.clear_alert("temp", clear_override = TRUE)
+ target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
+ for(var/i in 1 to rand(5, 10))
+ target.adjustStaminaLoss(15)
+ sleep(25)
+ target.clear_alert("fire", clear_override = TRUE)
+ target.clear_alert("temp", clear_override = TRUE)
+ if(target.client)
+ target.client.images -= fire_overlay
+ QDEL_NULL(fire_overlay)
+ qdel(src)
+
/datum/hallucination/husks
cost = 20
@@ -1015,7 +1043,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
..()
if(!target.halbody)
var/list/possible_points = list()
- for(var/turf/open/floor/F in view(src,world.view))
+ for(var/turf/open/floor/F in view(target,world.view))
possible_points += F
if(possible_points.len)
var/turf/open/floor/husk_point = pick(possible_points)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f70c4cfa2cc..f0d8f1d4ca8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -805,3 +805,4 @@
.["Make AI"] = "?_src_=vars;makeai=\ref[src]"
.["Modify bodypart"] = "?_src_=vars;editbodypart=\ref[src]"
.["Modify organs"] = "?_src_=vars;editorgans=\ref[src]"
+ .["Hallucinate"] = "?_src_=vars;hallucinate=\ref[src]"