/* Hallucinations should not be oOoOoOo whacky, that's dumb. Room for expanding on, but let's not imagine the crew wailing on you for taking some drugs. */ /mob/living/carbon var/image/halimage var/halmob_action /mob/living/carbon/proc/handle_hallucinations() if(client && hallucination > 20) var/list/halpick = list() halpick |= list("messages", "sounds") if(hallucination > 40) halpick |= list("goodvoice", "badvoice") if(hallucination > 65) halpick |= list("ignoring", "badsounds") if(hallucination > 80) halpick |= list("dangerimage") var/chosenhal = pick(halpick) if(prob(25)) switch(chosenhal) if("messages") var/list/msg_list = list("Everything around you feels like it's breathing...", "There are such strange patterns everywhere... you can't take your eyes off them.", "You feel in tune with your surroundings. You're part of them...", "What was that noise?", "You feel like something is crawling on you...!") to_chat(src, "[pick(msg_list)]") if("sounds") /// Relatively harmless sounds to hear. var/list/soundlist = list('sound/items/bikehorn.ogg', 'sound/items/drink.ogg', 'sound/items/polaroid1.ogg', 'sound/items/lighter_on.ogg', 'sound/machines/vending/vending_cans.ogg', 'sound/weapons/flash.ogg') src << pick(soundlist) if("goodvoice") if(prob(10)) halmob_action = "goodvoice" mob_hallucinate(src) if("badvoice") if(prob(10)) halmob_action = "badvoice" mob_hallucinate(src) if("ignoring") /// Paranoid isolation if(prob(10)) halmob_action = "ignoring" mob_hallucinate(src) if("badsounds") var/list/soundlist = list('sound/hallucinations/serithi/creepy1.ogg', 'sound/hallucinations/serithi/creepy2.ogg','sound/hallucinations/serithi/creepy3.ogg') src << pick(soundlist) if("dangerimage") /// Dangers like fire on random tiles. var/list/possible_points = list() for(var/turf/simulated/floor/F in range(7, src)) if(can_see(src, F, 7)) possible_points += F if(possible_points.len) var/turf/simulated/floor/target = pick(possible_points) switch(rand(1,2)) if(1) halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(2) halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) if(client) client.images += halimage spawn(rand(10,50)) //Only seen for a brief moment. if(client) client.images -= halimage halimage = null /obj/effect/mob_hallucination icon = null icon_state = null name = "" desc = "" density = 0 anchored = 1 opacity = 0 var/mob/living/carbon/human/my_target = null var/image/stand_icon = null var/image/currentimage = null var/icon/base = null var/s_tone var/mob/living/clone = null var/image/left var/image/right var/image/up var/image/down var/halaction /obj/effect/mob_hallucination/attackby(var/obj/item/P as obj, mob/user as mob) step_away(src,my_target,2) for(var/mob/M in oviewers(world.view,my_target)) to_chat(M, "[my_target] flails around wildly.") my_target.show_message("[src] has been attacked by [my_target] ", 1) return /obj/effect/mob_hallucination/Crossed(var/mob/M, oldloc) if(M == my_target) step_away(src,my_target,2) if(prob(30)) for(var/mob/O in oviewers(world.view , my_target)) to_chat(O, "[my_target] stumbles around.") /obj/effect/mob_hallucination/Initialize() . = ..() QDEL_IN(src, 30 SECONDS) START_PROCESSING(SSobj, src) /obj/effect/mob_hallucination/Destroy() if(my_target) my_target.hallucinations -= src STOP_PROCESSING(SSobj, src) return ..() /obj/effect/mob_hallucination/proc/updateimage() if(src.dir == NORTH) qdel(src.currentimage) src.currentimage = new /image(up,src) else if(src.dir == SOUTH) qdel(src.currentimage) src.currentimage = new /image(down,src) else if(src.dir == EAST) qdel(src.currentimage) src.currentimage = new /image(right,src) else if(src.dir == WEST) qdel(src.currentimage) src.currentimage = new /image(left,src) my_target << currentimage /obj/effect/mob_hallucination/process() var/mob/living/carbon/human/H = my_target sleep(rand(5,20)) if(get_dist(src, H) == 0) step_away(src, H, 2) if(prob(50) && get_dist(src, H) > 1 && halaction != "ignoring") src.set_dir(get_dir(src, H)) step_towards(src, H) updateimage() else if(prob(5)) if(halaction == "goodvoice") var/list/msg_list = list("We are all one with the cosmos.", "Wow!", "I'm glad you're here.", "We're safe here.", "You look amazing!", "I forgive you.", "Everything is taken care of.", "You don't need to worry.", "Follow your bliss.", "It's all going to turn out just fine.", "The universe understands you.", "The future is all assured.", "You are healing.", "In a gentle way, you can shake the world...", "Endless opportunities flow from you.", "Keep going!") if(name != "") to_chat(H, "[name] says, \"[pick(msg_list)]\"") else to_chat(H, "A hazy figure says, \"[pick(msg_list)]\"") if(halaction == "badvoice") var/list/msg_list = list("Your friends are lying.", "You shouldn't have done that.", "Haven't you forgotten something?", "Mind your own business.", "They were right, you know.", "You aren't supposed to be here.", "We're watching you.", "Don't look at me.", "You should be ashamed of yourself.", "Get out of here!", "You disgust me.", "The world is closing in.", "It's all your fault.", "They're coming for you.", "It's only a matter of time.", "You ruined it.", "Nothing you do matters.", "You're wasting their time.", "It wasn't an accident.") if(name != "") to_chat(H, "[name] says, \"[pick(msg_list)]\"") else to_chat(H, "A hazy figure says, \"[pick(msg_list)]\"") if(halaction == "ignoring") step_away(src, H, 3) if(prob(5)) to_chat(H, "No one seems to know you're there...") /proc/mob_hallucinate(var/mob/living/carbon/target) var/list/possible_clones = new/list() var/mob/living/carbon/human/clone = null for(var/mob/living/carbon/human/H in living_mob_list) if(H.stat || H.lying) continue possible_clones += H if(!possible_clones.len) return clone = pick(possible_clones) if(!clone) return var/obj/effect/mob_hallucination/MH = new/obj/effect/mob_hallucination(target.loc) MH.name = clone.name MH.my_target = target target.hallucinations += MH if(target.halmob_action) MH.halaction = target.halmob_action MH.left = image(clone,dir = WEST) MH.right = image(clone,dir = EAST) MH.up = image(clone,dir = NORTH) MH.down = image(clone,dir = SOUTH) MH.updateimage()