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."
+ ]
+
+}