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]"