diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 700c76e56ad..7b399879c57 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -933,13 +933,15 @@ if(!check_rights(0)) return - var/mob/living/carbon/C = locate(href_list["hallucinate"]) + var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list 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(!usr) + return if(!C) to_chat(usr, "Mob doesn't exist anymore") return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e65900fa73f..007f8e42bdc 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(4) && src.operating == FALSE) + else if(user.hallucination > 50 && ishuman(user) && prob(4) && !operating) hallucinate_shock(user) return if (cyclelinkedairlock) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 1fd83090283..01693d0bc77 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -11,6 +11,8 @@ Gunshots/explosions/opening doors/less rare audio (done) */ +#define HAL_LINES_FILE "hallucination.json" + /mob/living/carbon var/image/halimage var/image/halbody @@ -19,7 +21,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/next_hallucination = 0 var/static/list/hallucinations_minor = list( - /datum/hallucination/sound, + /datum/hallucination/sounds, /datum/hallucination/bolts, /datum/hallucination/whispers, /datum/hallucination/message, @@ -59,7 +61,7 @@ var/static/list/hallucinations_major = list( new halpick(src, FALSE) /datum/hallucination - var/mob/living/carbon/target = null + var/mob/living/carbon/target var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination /datum/hallucination/New(mob/living/carbon/T, forced = TRUE) @@ -90,7 +92,8 @@ var/static/list/hallucinations_major = list( ..() target = T current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/proc/GetImage() var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) @@ -102,10 +105,12 @@ var/static/list/hallucinations_major = list( /obj/effect/hallucination/simple/proc/Show(update=1) if(active) - if(target.client) target.client.images.Remove(current_image) + if(target.client) + target.client.images.Remove(current_image) if(update) current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/update_icon(new_state,new_icon,new_px=0,new_py=0) image_state = new_state @@ -121,8 +126,9 @@ var/static/list/hallucinations_major = list( Show() /obj/effect/hallucination/simple/Destroy() - if(target.client) target.client.images.Remove(current_image) - active = 0 + if(target.client) + target.client.images.Remove(current_image) + active = FALSE return ..() #define FAKE_FLOOD_EXPAND_TIME 20 @@ -692,22 +698,22 @@ var/static/list/hallucinations_major = list( /datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) ..() - var/speak_messages = list("[pick("I'm watching you...","I know what you're doing","What are you hiding?","I saw that")]",\ - "[pick("","Hey, ","Hi ","Hello ","Wait, ","It's ")][target.first_name()]!",\ - "[pick("Get out","Go away","Fuck off","OUT!")]",\ - "[pick("Kchck-Chkck? Kchchck!","EEEeeeeEEEE","#@�*&�","H-hhhhh...")]",\ - "[pick("Did you hear that?","Did you see that?","What was that?")]",\ - "[pick("Hail Ratvar","Hail Nar'Sie","Viva!","[generate_code_phrase()]","Are you mr. [pick(GLOB.possible_changeling_IDs)]?")]",\ - "[pick("Why?","What?","Wait, what?","Wait","Hold on","Uh...")]",\ - "Give me that!",\ - "HELP[pick(""," ME"," HIM"," HER"," THEM")]!!",\ - "RUN!!",\ - "I'm infected, [pick("stay away","don't get close","be careful","help me","kill me")]") + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") 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")]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ "Help!",\ - "[pick("Cult", "Wizard", "Blob", "Ling", "Ops", "Swarmers", "Revenant", "Traitor", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ "Where's [target.first_name()]?"\ ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ ,"AI [pick("rogue", "is dead")]!!") @@ -753,15 +759,15 @@ var/static/list/hallucinations_major = list( "[target] sneezes.", \ //The truth, revealed "You're hallucinating.", \ - //Direct speech - "[pick("Hmm...","Yes.","No.","Ignore that last message.","You should stop doing that.","Good luck.")]") + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") to_chat(target, chosen) qdel(src) -/datum/hallucination/sound +/datum/hallucination/sounds cost = 15 -/datum/hallucination/sound/New(mob/living/carbon/T, forced = TRUE) +/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE) ..() //Strange audio switch(rand(1,20)) @@ -793,12 +799,12 @@ var/static/list/hallucinations_major = list( //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',\ + var/static/list/hallucinations_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) + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) if(11) target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) sleep(150) @@ -856,12 +862,12 @@ var/static/list/hallucinations_major = list( /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","temphot","tempcold","pressure") + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") if(specific) alert_type = specific switch(alert_type) if("oxy") - target.throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE) + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_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") @@ -871,7 +877,7 @@ var/static/list/hallucinations_major = list( 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) + target.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) if("nutrition") if(prob(50)) target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) @@ -1094,4 +1100,5 @@ var/static/list/hallucinations_major = list( H.xo = target.x - start.x H.original = target H.fire() - qdel(src) \ No newline at end of file + qdel(src) + diff --git a/strings/hallucination.json b/strings/hallucination.json new file mode 100644 index 00000000000..03c2a21b854 --- /dev/null +++ b/strings/hallucination.json @@ -0,0 +1,201 @@ +{ + "suspicion": [ + "I'm watching you...", + "I know what you're doing", + "What are you hiding?", + "I saw that" + ], + + "greetings": [ + "", + "Hey, ", + "Hi ", + "Hello ", + "Wait, ", + "It's " + ], + + "getout": [ + "Get out", + "Get out!", + "Go away", + "Fuck off", + "OUT!", + "Out!" + ], + + "weird": [ + "Kchck-Chkck? Kchchck!", + "Kchckchk...", + "EEEeeeeEEEE", + "khhhhh", + "#@§*&£", + "H**p m*", + "H-hhhhh..." + ], + + "didyouhearthat": [ + "Did you hear that?", + "Did you see that?", + "What was that?" + ], + + "imatraitor": [ + "Hail Ratvar", + "Hail Nar'Sie", + "Hey, i've got some TC left, want something?", + "Viva!", + "I'll spare you if you don't tell anybody about me", + "Hey, are you a traitor too?", + "You're my target, but @pick(excuses)", + "Are you mr. @pick(ling_names)?" + ], + + "excuses": [ + "i like you, so i'll spare you", + "i don't really feel like following objectives today", + "i'm not robust enough to fight you", + "who cares", + "i'll kill you later" + ] + + "ling_names": [ + "Alpha", + "Beta", + "Gamma", + "Delta", + "Epsilon", + "Eta", + "Theta", + "Lambda", + "Mu", + "Xi", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "Phi", + "Psi", + "Omega" + ] + + "doubt": [ + "Why?", + "What?", + "Wait, what?", + "Wait", + "Hold on", + "Uh..." + ], + + "aggressive": [ + "Give me that!", + "I'm going to kill you!", + "Fuck you!" + ], + + "help": [ + "HELP", + "HELP ME", + "HELP HIM", + "HELP HER", + "HELP THEM", + "HELP US", + "HELP YOURSELF" + ], + + "escape": [ + "RUN!!", + "They're behind me!", + "It's here!", + "Follow me!", + "Follow me" + ] + + "infection_advice": [ + "stay away", + "don't get close", + "be careful", + "help me", + "kill me" + ] + + "people": [ + "Captain", + "Hos", + "Cmo", + "Rd", + "Ce", + "Hop", + "Janitor", + "AI", + "Viro", + "Qm", + "[target.first_name()]" + ] + + "accusations": [ + "rogue", + "cult", + "a cultist", + "clockcult", + "a clock cultist", + "a revhead", + "a rev", + "a gang leader", + "a gangster", + "a traitor", + "a tator", + "a ling", + "a changeling" + ] + + "threat": [ + "Cult", + "Wizard", + "Blob", + "Ling", + "Ops", + "Swarmers", + "Revenant", + "Traitor", + "Harm", + "I hear flashing", + "Help" + ] + + "location": [ + "bridge", + "armory", + "sec", + "security", + "science", + "engineering", + "cargo", + "medbay", + "atmos", + "maint", + "hops office", + "captains office", + "chapel", + "library", + "tool storage", + "botany", + "kitchen", + "the ai sat" + ] + + "advice": [ + "Hmm...not sure about that.", + "Yes. You're doing the right thing.", + "No. Stop what you're doing.", + "You should be wary of that person.", + "Trust that person.", + "That person wants to kill you.", + "Kill that person. You know who.", + "You should go somewhere else. Quickly.", + "Good luck. You'll need it.", + "You have my permission. Do it." + ] + +}