diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index 821770e9c5..a8adbfbce8 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -160,7 +160,7 @@
to_chat(owner, "You feel really lonely...")
else
to_chat(owner, "You're going mad with loneliness!")
- owner.hallucination += 20
+ owner.hallucination += 30
if(5)
if(!high_stress)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 7be86b2595..ffb25ce987 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -231,6 +231,7 @@
if(prob(2)) //we'll all be mad soon enough
madness()
+<<<<<<< HEAD
/datum/trait/insanity/proc/madness(mad_fools)
set waitfor = FALSE
if(!mad_fools)
@@ -240,6 +241,10 @@
new hallucination_type (trait_holder, FALSE)
else
trait_holder.hallucination += rand(10, 50)
+=======
+/datum/quirk/insanity/proc/madness()
+ quirk_holder.hallucination += rand(10, 25)
+>>>>>>> aa782ff... [s] Hallucinations 4.0 (#37423)
/datum/trait/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have
if(!trait_holder.mind || trait_holder.mind.special_role)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 880f0fe8c8..76a0c39021 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -323,12 +323,12 @@
return
else
return
- else if(user.hallucinating() && ishuman(user) && prob(4) && !operating)
+ else if(user.hallucinating() && ishuman(user) && prob(1) && !operating)
var/mob/living/carbon/human/H = user
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient)//not insulated
- hallucinate_shock(H)
+ new /datum/hallucination/shock(H)
return
if (cyclelinkedairlock)
if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user))
@@ -338,34 +338,6 @@
addtimer(CALLBACK(cyclelinkedairlock, .proc/close), 2)
..()
-/obj/machinery/door/airlock/proc/hallucinate_shock(mob/living/user)
- var/image/shock_image = image(user, user, dir = user.dir)
- var/image/electrocution_skeleton_anim = image('icons/mob/human.dmi', user, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER)
- shock_image.color = rgb(0,0,0)
- shock_image.override = TRUE
- electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
-
- to_chat(user, "You feel a powerful shock course through your body!")
- if(user.client)
- user.client.images |= shock_image
- user.client.images |= electrocution_skeleton_anim
- addtimer(CALLBACK(src, .proc/reset_hallucinate_shock_animation, user, shock_image, electrocution_skeleton_anim), 40)
- user.playsound_local(get_turf(src), "sparks", 100, 1)
- user.staminaloss += 50
- user.Stun(40)
- user.jitteriness += 1000
- user.do_jitter_animation(user.jitteriness)
- addtimer(CALLBACK(src, .proc/hallucinate_shock_drop, user), 20)
-
-/obj/machinery/door/airlock/proc/reset_hallucinate_shock_animation(mob/living/user, shock_image, electrocution_skeleton_anim)
- if(user.client)
- user.client.images.Remove(shock_image)
- user.client.images.Remove(electrocution_skeleton_anim)
-
-/obj/machinery/door/airlock/proc/hallucinate_shock_drop(mob/living/user)
- user.jitteriness = max(user.jitteriness - 990, 10) //Still jittery, but vastly less
- user.Knockdown(60)
-
/obj/machinery/door/airlock/proc/isElectrified()
if(src.secondsElectrified != NOT_ELECTRIFIED)
return TRUE
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index c551509cc7..960abd64df 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -153,7 +153,7 @@
H.confused += 15
H.adjustBrainLoss(10, 160)
if(3)
- H.hallucination += 80
+ H.hallucination += 60
/obj/item/organ/heart/gland/pop
cooldown_low = 900
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index 10b86ac1ad..6e15334305 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -214,19 +214,19 @@
/obj/effect/proc_holder/changeling/sting/LSD
name = "Hallucination Sting"
desc = "Causes terror in the target."
- helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds."
+ helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect begins after a few seconds."
sting_icon = "sting_lsd"
chemical_cost = 10
dna_cost = 1
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target)
add_logs(user, target, "stung", "LSD sting")
- addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(300,600))
+ addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(100,200))
return TRUE
/obj/effect/proc_holder/changeling/sting/LSD/proc/hallucination_time(mob/living/carbon/target)
if(target)
- target.hallucination = max(400, target.hallucination)
+ target.hallucination = max(90, target.hallucination)
/obj/effect/proc_holder/changeling/sting/cryo
name = "Cryogenic Sting"
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index bb2ce1db2a..b98ae31e80 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -260,7 +260,7 @@
if(!ishuman(target) || iscultist(target))
return
var/mob/living/carbon/human/H = target
- H.hallucination = max(H.hallucination, 240)
+ H.hallucination = max(H.hallucination, 120)
SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50))
var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER)
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE)
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 33b9462e40..2b0c16ebfc 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -11,22 +11,27 @@
/datum/round_event/mass_hallucination/start()
switch(rand(1,4))
if(1) //same sound for everyone
- var/sound = pick("explosion","far_explosion","phone","alarm","hallelujah","creepy","ratvar","shuttle_dock",
- "wall_decon","door_hack","blob_alert","tesla","malf_ai","meteors")
+ var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla")
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
new /datum/hallucination/sounds(C, TRUE, sound)
- if(2 to 4)
+ if(2)
+ var/weirdsound = pick("phone","hallelujah","highlander","hyperspace","game_over","creepy","tesla")
+ for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ new /datum/hallucination/weird_sounds(C, TRUE, weirdsound)
+ if(3)
+ var/stationmessage = pick("ratvar","shuttle_dock","blob_alert","malf_ai","meteors","supermatter")
+ for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ new /datum/hallucination/stationmessage(C, TRUE, stationmessage)
+ if(4 to 6)
var/picked_hallucination = pick( /datum/hallucination/bolts,
- /datum/hallucination/whispers,
+ /datum/hallucination/chat,
/datum/hallucination/message,
/datum/hallucination/bolts,
/datum/hallucination/fake_flood,
/datum/hallucination/battle,
/datum/hallucination/fire,
/datum/hallucination/self_delusion,
- /datum/hallucination/fakeattacker,
/datum/hallucination/death,
- /datum/hallucination/xeno_attack,
/datum/hallucination/delusion,
/datum/hallucination/oh_yeah)
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 4006bb50b7..1ade5070a7 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -1,84 +1,83 @@
-/*
-Ideas for the subtle effects of hallucination:
-
-Light up oxygen/plasma indicators (done)
-Cause health to look critical/dead, even when standing (done)
-Characters silently watching you
-Brief flashes of fire/space/bombs/c4/dangerous shit (done)
-Items that are rare/traitorous/don't exist appearing in your inventory slots (done)
-Strange audio (should be rare) (done)
-Gunshots/explosions/opening doors/less rare audio (done)
-
-*/
-
#define HAL_LINES_FILE "hallucination.json"
-GLOBAL_LIST_INIT(hallucinations_minor, list(
- /datum/hallucination/sounds,
- /datum/hallucination/bolts,
- /datum/hallucination/whispers,
- /datum/hallucination/message,
- /datum/hallucination/hudscrew))
+GLOBAL_LIST_INIT(hallucination_list, list(
+ /datum/hallucination/chat = 100,
+ /datum/hallucination/message = 60,
+ /datum/hallucination/sounds = 50,
+ /datum/hallucination/battle = 20,
+ /datum/hallucination/dangerflash = 15,
+ /datum/hallucination/hudscrew = 12,
+ /datum/hallucination/fake_alert = 12,
+ /datum/hallucination/weird_sounds = 8,
+ /datum/hallucination/stationmessage = 7,
+ /datum/hallucination/fake_flood = 7,
+ /datum/hallucination/stray_bullet = 7,
+ /datum/hallucination/bolts = 7,
+ /datum/hallucination/items_other = 7,
+ /datum/hallucination/husks = 7,
+ /datum/hallucination/items = 4,
+ /datum/hallucination/fire = 3,
+ /datum/hallucination/self_delusion = 2,
+ /datum/hallucination/delusion = 2,
+ /datum/hallucination/shock = 1,
+ /datum/hallucination/death = 1,
+ /datum/hallucination/oh_yeah = 1
+ ))
-GLOBAL_LIST_INIT(hallucinations_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,
- /datum/hallucination/stray_bullet))
-
-GLOBAL_LIST_INIT(hallucinations_major, list(
- /datum/hallucination/fakeattacker,
- /datum/hallucination/death,
- /datum/hallucination/xeno_attack,
- /datum/hallucination/singularity_scare,
- /datum/hallucination/delusion,
- /datum/hallucination/oh_yeah))
/mob/living/carbon/proc/handle_hallucinations()
+ if(!hallucination)
+ return
+
+ hallucination--
+
if(world.time < next_hallucination)
return
- if(hallucination)
- var/list/current = GLOB.hallucinations_minor
- if(prob(25) && hallucination > 100)
- current = GLOB.hallucinations_medium
- else if(prob(10) && hallucination > 200)
- current = GLOB.hallucinations_major
- var/halpick = pick(current)
- new halpick(src, FALSE)
+ var/halpick = pickweight(GLOB.hallucination_list)
+ new halpick(src, FALSE)
+
+ next_hallucination = world.time + rand(100, 600)
/mob/living/carbon/proc/set_screwyhud(hud_type)
hal_screwyhud = hud_type
update_health_hud()
/datum/hallucination
+ var/natural = TRUE
var/mob/living/carbon/target
- var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination
var/feedback_details //extra info for investigate
-/datum/hallucination/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
- target = T
- if(!forced)
- target.hallucination = max(0, target.hallucination - cost)
- target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10)
+ target = C
+ natural = !forced
/datum/hallucination/proc/wake_and_restore()
target.set_screwyhud(SCREWYHUD_NONE)
target.SetSleeping(0)
/datum/hallucination/Destroy()
- target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS)
+ target.investigate_log("was afflicted with a hallucination of type [type] by [natural?"hallucination status":"an external source"]. [feedback_details]", INVESTIGATE_HALLUCINATIONS)
target = null
return ..()
+//Returns a random turf in a ring around the target mob, useful for sound hallucinations
+/datum/hallucination/proc/random_far_turf()
+ var/x_based = prob(50)
+ var/first_offset = pick(-8,-7,-6,-5,5,6,7,8)
+ var/second_offset = rand(-8,8)
+ var/x_off
+ var/y_off
+ if(x_based)
+ x_off = first_offset
+ y_off = second_offset
+ else
+ y_off = first_offset
+ x_off = second_offset
+ var/turf/T = locate(target.x + x_off, target.y + y_off, target.z)
+ return T
+
/obj/effect/hallucination
invisibility = INVISIBILITY_OBSERVER
anchored = TRUE
@@ -155,9 +154,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/image_state = "plasma"
var/radius = 0
var/next_expand = 0
- cost = 25
-/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/fake_flood/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
@@ -225,9 +223,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
//Xeno crawls from nearby vent,jumps at you, and goes back in
var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null
var/obj/effect/hallucination/simple/xeno/xeno = null
- cost = 25
-/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/xeno_attack/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target))
@@ -273,9 +270,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/obj/effect/hallucination/simple/bubblegum/bubblegum
var/image/fakebroken
var/image/fakerune
- cost = 75
-/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/oh_yeah/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
. = ..()
var/turf/closed/wall/wall
@@ -325,151 +321,192 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
QDEL_NULL(bubblegum)
return ..()
-/datum/hallucination/singularity_scare
- //Singularity moving towards you.
- //todo Hide where it moved with fake space images
- var/obj/effect/hallucination/simple/singularity/s = null
- cost = 75
-
-/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE)
- set waitfor = FALSE
- ..()
- var/turf/start = get_turf(T)
- var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
- for(var/i in 1 to 13)
- start = get_step(start,screen_border)
- feedback_details += "Source: [start.x],[start.y],[start.z]"
- s = new(start,target)
- s.parent = src
- for(var/i in 1 to 13)
- sleep(10)
- s.forceMove(get_step(get_turf(s),get_dir(s,target)))
- s.Show()
- s.Eat()
- qdel(s)
-
-/obj/effect/hallucination/simple/singularity
- image_icon = 'icons/effects/224x224.dmi'
- image_state = "singularity_s7"
- image_layer = MASSIVE_OBJ_LAYER
- px = -96
- py = -96
- var/datum/hallucination/singularity_scare/parent
-
-/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
- var/target_dist = get_dist(src,target)
- if(target_dist<=3) //"Eaten"
- target.set_screwyhud(SCREWYHUD_DEAD)
- target.SetUnconscious(160)
- addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50))
-
/datum/hallucination/battle
- cost = 15
-/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type)
+/datum/hallucination/battle/New(mob/living/carbon/C, forced = TRUE, battle_type)
set waitfor = FALSE
..()
- var/hits = rand(3,6)
+ var/turf/source = random_far_turf()
if(!battle_type)
- battle_type = pick("laser","esword","gun","stunprod","bomb")
+ battle_type = pick("laser","disabler","esword","gun","stunprod","harmbaton","bomb")
feedback_details += "Type: [battle_type]"
switch(battle_type)
- if("laser") //Laser fight
- for(var/i in 1 to hits)
- target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1)
+ if("laser")
+ var/hits = 0
+ for(var/i in 1 to rand(5, 10))
+ target.playsound_local(source, 'sound/weapons/laser.ogg', 25, 1)
if(prob(50))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/sear.ogg', 25, 1), rand(5,10))
+ hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
- sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
- if("esword") //Esword fight
- target.playsound_local(null, 'sound/weapons/saberon.ogg',15, 1)
- for(var/i=0,i= 4 && prob(70))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
+ if("disabler")
+ var/hits = 0
+ for(var/i in 1 to rand(5, 10))
+ target.playsound_local(source, 'sound/weapons/taser2.ogg', 25, 1)
+ if(prob(50))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/tap.ogg', 25, 1), rand(5,10))
+ hits++
+ else
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
+ sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
+ if(hits >= 3 && prob(70))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
+ if("esword")
+ target.playsound_local(source, 'sound/weapons/saberon.ogg',15, 1)
+ for(var/i in 1 to rand(4, 8))
+ target.playsound_local(source, 'sound/weapons/blade1.ogg', 50, 1)
+ if(i == 4)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ sleep(rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 6))
+ target.playsound_local(source, 'sound/weapons/saberoff.ogg', 15, 1)
+ if("gun")
+ var/hits = 0
+ for(var/i in 1 to rand(3, 6))
+ target.playsound_local(source, get_sfx("gunshot"), 25)
if(prob(60))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/pierce.ogg', 25, 1), rand(5,10))
+ hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
- sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
+ addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, "ricochet", 25, 1), rand(5,10))
+ sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
+ if(hits >= 2 && prob(80))
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ break
if("stunprod") //Stunprod + cablecuff
- target.playsound_local(null, 'sound/weapons/egloves.ogg', 40, 1)
- target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
+ target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
sleep(20)
- target.playsound_local(null, 'sound/weapons/cablecuff.ogg', 15, 1)
+ target.playsound_local(source, 'sound/weapons/cablecuff.ogg', 15, 1)
+ if("harmbaton") //zap n slap
+ target.playsound_local(source, 'sound/weapons/egloves.ogg', 40, 1)
+ target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
+ sleep(20)
+ for(var/i in 1 to rand(5, 12))
+ target.playsound_local(source, "swing_hit", 50, 1)
+ sleep(rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 4))
if("bomb") // Tick Tock
- for(var/i in 1 to hits)
- target.playsound_local(null, 'sound/items/timer.ogg', 25, 0)
+ for(var/i in 1 to rand(3, 11))
+ target.playsound_local(source, 'sound/items/timer.ogg', 25, 0)
sleep(15)
qdel(src)
/datum/hallucination/items_other
- cost = 10
-/datum/hallucination/items_other/New(mob/living/carbon/T, forced = TRUE, item_type)
+/datum/hallucination/items_other/New(mob/living/carbon/C, forced = TRUE, item_type)
set waitfor = FALSE
..()
var/item
if(!item_type)
- item = pick(list("esword","dual_esword","stunpaper","clockspear","ttv","flash","armblade"))
+ item = pick(list("esword","taser","ebow","baton","dual_esword","clockspear","ttv","flash","armblade"))
else
item = item_type
feedback_details += "Item: [item]"
+ var/side
var/image_file
var/image/A = null
- for(var/mob/living/carbon/human/H in view(7,target))
- if(H != target)
- var/free_hand = H.get_empty_held_index_for_side(side = "left")
- if(free_hand)
- image_file = 'icons/mob/inhands/items_lefthand.dmi'
- else
- free_hand = H.get_empty_held_index_for_side(side = "right")
- if(free_hand)
- image_file = 'icons/mob/inhands/items_righthand.dmi'
- if(image_file)
- switch(item)
- if("esword")
- target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
- A = image(image_file,H,"swordred", layer=ABOVE_MOB_LAYER)
- if("dual_esword")
- target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
- A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER)
- if("stunpaper")
- A = image(image_file,H,"paper", layer=ABOVE_MOB_LAYER)
- A.color = rgb(255,0,0)
- if("clockspear")
- A = image(image_file,H,"ratvarian_spear", layer=ABOVE_MOB_LAYER)
- if("ttv")
- A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER)
- if("flash")
- A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER)
- if("armblade")
- A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER)
- if(target.client)
- target.client.images |= A
- sleep(rand(150,250))
- if(item == "esword" || item == "dual_esword")
- target.playsound_local(H, 'sound/weapons/saberoff.ogg',35,1)
- target.client.images.Remove(A)
- break
+ var/list/mob_pool = list()
+
+ for(var/mob/living/carbon/human/M in view(7,target))
+ if(M != target)
+ mob_pool += M
+ if(!mob_pool.len)
+ return
+
+ var/mob/living/carbon/human/H = pick(mob_pool)
+ feedback_details += " Mob: [H.real_name]"
+
+ var/free_hand = H.get_empty_held_index_for_side(side = "left")
+ if(free_hand)
+ side = "left"
+ else
+ free_hand = H.get_empty_held_index_for_side(side = "right")
+ if(free_hand)
+ side = "right"
+
+ if(side)
+ switch(item)
+ if("esword")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
+ A = image(image_file,H,"swordred", layer=ABOVE_MOB_LAYER)
+ if("dual_esword")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1)
+ A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER)
+ if("taser")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER)
+ if("ebow")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER)
+ if("baton")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ target.playsound_local(H, "sparks",75,1,-1)
+ A = image(image_file,H,"baton", layer=ABOVE_MOB_LAYER)
+ if("clockspear")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
+ A = image(image_file,H,"ratvarian_spear", layer=ABOVE_MOB_LAYER)
+ if("ttv")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+ A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER)
+ if("flash")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER)
+ if("armblade")
+ if(side == "right")
+ image_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
+ else
+ image_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
+ target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1)
+ A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER)
+ if(target.client)
+ target.client.images |= A
+ sleep(rand(150,250))
+ if(item == "esword" || item == "dual_esword")
+ target.playsound_local(H, 'sound/weapons/saberoff.ogg',35,1)
+ if(item == "armblade")
+ target.playsound_local(H, 'sound/effects/blobattack.ogg',30,1)
+ target.client.images.Remove(A)
qdel(src)
/datum/hallucination/delusion
var/list/image/delusions = list()
- cost = 50
-/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null, custom_name = null)
+/datum/hallucination/delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300,skip_nearby = TRUE, custom_icon = null, custom_icon_file = null, custom_name = null)
set waitfor = FALSE
. = ..()
var/image/A = null
- var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie")
+ var/kind = force_kind ? force_kind : pick("nothing","monkey","corgi","carp","skeleton","demon","zombie")
feedback_details += "Type: [kind]"
var/list/nearby
if(skip_nearby)
@@ -480,6 +517,9 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(skip_nearby && (H in nearby))
continue
switch(kind)
+ if("nothing")
+ A = image('icons/effects/effects.dmi',H,"nothing")
+ A.name = "..."
if("monkey")//Monkey
A = image('icons/mob/monkey.dmi',H,"monkey1")
A.name = "Monkey ([rand(1,999)])"
@@ -516,9 +556,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
/datum/hallucination/self_delusion
var/image/delusion
- cost = 40
-/datum/hallucination/self_delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
+/datum/hallucination/self_delusion/New(mob/living/carbon/C, forced, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null, wabbajack = TRUE) //set wabbajack to false if you want to use another fake source
set waitfor = FALSE
..()
var/image/A = null
@@ -556,176 +595,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
target.client.images.Remove(delusion)
return ..()
-/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE)
- set waitfor = FALSE
- ..()
- var/mob/living/carbon/human/clone = null
- var/clone_weapon = null
-
- for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
- if(H.stat || H.lying)
- continue
- clone = H
- feedback_details += "Clone of: [H.real_name]"
- break
-
- if(!clone)
- return
-
- var/static/list/non_fakeattack_weapons = list(/obj/item/gun/ballistic, /obj/item/ammo_box/a357,\
- /obj/item/gun/energy/kinetic_accelerator/crossbow, /obj/item/melee/transforming/energy/sword/saber,\
- /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\
- /obj/item/cartridge/virus/syndicate, /obj/item/clothing/under/chameleon,\
- /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\
- /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\
- /obj/item/chameleon, /obj/item/card/emag, /obj/item/grenade/plastic/x4,\
- /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\
- /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\
- /obj/item/powersink, /obj/item/storage/box/syndie_kit,\
- /obj/item/toy/syndicateballoon, /obj/item/gun/energy/laser/captain,\
- /obj/item/hand_tele, /obj/item/construction/rcd, /obj/item/tank/jetpack,\
- /obj/item/clothing/under/rank/captain, /obj/item/aicard,\
- /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/disk/nuclear,\
- /obj/item/clothing/suit/space/nasavoid, /obj/item/tank)
-
- var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target)
-
- for(var/obj/item/I in clone.held_items)
- if(!(locate(I) in non_fakeattack_weapons))
- clone_weapon = I.name
- F.weap = I
-
- F.name = clone.name
- F.my_target = target
- F.weapon_name = clone_weapon
-
- F.left = image(clone,dir = WEST)
- F.right = image(clone,dir = EAST)
- F.up = image(clone,dir = NORTH)
- F.down = image(clone,dir = SOUTH)
-
- F.updateimage()
- qdel(src)
-
-/obj/effect/fake_attacker
- icon = null
- icon_state = null
- name = ""
- desc = ""
- density = FALSE
- anchored = TRUE
- opacity = 0
- var/mob/living/carbon/human/my_target = null
- var/weapon_name = null
- var/obj/item/weap = null
- var/image/stand_icon = null
- var/image/currentimage = null
- var/icon/base = null
- var/skin_tone
- var/mob/living/clone = null
- var/image/left
- var/image/right
- var/image/up
- var/collapse
- var/image/down
-
- max_integrity = 100
-
-/obj/effect/fake_attacker/attackby(obj/item/P, mob/living/user, params)
- step_away(src,my_target,2)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- my_target.playsound_local(src, P.hitsound, 1)
- my_target.visible_message("[my_target] flails around wildly.", \
- "[my_target] has attacked [src]!")
-
- obj_integrity -= P.force
-
-/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
- 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/fake_attacker/Initialize(mapload, mob/living/carbon/T)
- ..()
- my_target = T
- QDEL_IN(src, 300)
- step_away(src,my_target,2)
- INVOKE_ASYNC(src, .proc/attack_loop)
-
-
-/obj/effect/fake_attacker/proc/updateimage()
-// del src.currentimage
- if(src.dir == NORTH)
- del src.currentimage
- src.currentimage = new /image(up,src)
- else if(src.dir == SOUTH)
- del src.currentimage
- src.currentimage = new /image(down,src)
- else if(src.dir == EAST)
- del src.currentimage
- src.currentimage = new /image(right,src)
- else if(src.dir == WEST)
- del src.currentimage
- src.currentimage = new /image(left,src)
- SEND_IMAGE(my_target, currentimage)
-
-
-/obj/effect/fake_attacker/proc/attack_loop()
- while(1)
- sleep(rand(5,10))
- if(obj_integrity < 0 || my_target.stat)
- collapse()
- continue
- if(get_dist(src,my_target) > 1)
- src.setDir(get_dir(src,my_target))
- step_towards(src,my_target)
- updateimage()
- else
- if(prob(15))
- if(weapon_name)
- my_target.playsound_local(my_target, weap.hitsound, weap.get_clamped_volume(), 1)
- my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1)
- my_target.staminaloss += 30
- if(prob(20))
- my_target.blur_eyes(3)
- if(prob(33))
- 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)
- my_target.show_message("[src.name] has punched [my_target]!", 1)
- my_target.staminaloss += 30
- if(prob(33))
- if(!locate(/obj/effect/overlay) in my_target.loc)
- fake_blood(my_target)
-
- if(prob(15))
- step_away(src,my_target,2)
-
-/obj/effect/fake_attacker/proc/collapse()
- collapse = 1
- updateimage()
- qdel(src)
-
-/obj/effect/fake_attacker/proc/fake_blood(mob/target)
- var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
- O.name = "blood"
- var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
- SEND_IMAGE(target, I)
- QDEL_IN(O, 300)
-
-
/datum/hallucination/bolts
- var/list/doors = list()
- cost = 25
+ var/list/locks = list()
-/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle
+/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number)
set waitfor = FALSE
..()
- var/image/I = null
+ if(!door_number)
+ door_number = rand(0,4) //if 0 bolts all visible doors
var/count = 0
feedback_details += "Door amount: [door_number]"
for(var/obj/machinery/door/airlock/A in range(7, target))
@@ -734,46 +611,65 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(!A.density)
continue
count++
- I = image(A.overlays_file, get_turf(A), "lights_bolts",layer=A.layer+0.1)
- doors += I
- if(target.client)
- target.client.images |= I
- target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3)
- sleep(rand(6,12))
+ var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(A))
+ lock.target = target
+ lock.airlock = A
+ locks += lock
+ lock.lock()
+ sleep(rand(4,12))
sleep(100)
- for(var/image/B in doors)
- if(target.client)
- target.client.images.Remove(B)
- target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3)
- sleep(rand(6,12))
+ for(var/obj/effect/hallucination/fake_door_lock/lock in locks)
+ locks -= lock
+ lock.unlock()
+ sleep(rand(4,12))
qdel(src)
-/datum/hallucination/whispers
- cost = 15
+/obj/effect/hallucination/fake_door_lock
+ layer = CLOSED_DOOR_LAYER + 1 //for Collide priority
+ var/image/bolt_light
+ var/obj/machinery/door/airlock/airlock
-/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE)
+/obj/effect/hallucination/fake_door_lock/proc/lock()
+ bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1)
+ if(target.client)
+ target.client.images |= bolt_light
+ target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3)
+
+/obj/effect/hallucination/fake_door_lock/proc/unlock()
+ if(target.client)
+ target.client.images.Remove(bolt_light)
+ target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3)
+ qdel(src)
+
+/obj/effect/hallucination/fake_door_lock/CanPass(atom/movable/mover, turf/_target)
+ if(mover == target && airlock.density)
+ return FALSE
+ return TRUE
+
+/datum/hallucination/chat
+
+/datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message)
set waitfor = FALSE
..()
var/target_name = target.first_name()
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")]!")
+ "[pick_list_replacements(HAL_LINES_FILE, "conversation")]",\
+ "[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, "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_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\
- "Help!",\
- "[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")]!!")
+ var/radio_messages = list("[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\
+ "Help!",\
+ "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\
+ "[pick("Where's [target.first_name()]?", "Set [target.first_name()] to arrest!")]",\
+ "[pick("C","Ai, c","Someone c","Rec")]all the shuttle!",\
+ "AI [pick("rogue", "is dead")]!!")
var/list/mob/living/carbon/people = list()
var/list/mob/living/carbon/person = null
@@ -787,8 +683,10 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if(get_dist(target,H)The light burns you!", \
- "You don't feel like yourself.", \
- "You hear something squeezing through the ducts...", \
- "You hear a distant scream.", \
- "You feel invincible, nothing can hurt you!", \
- "You feel a tiny prick!", \
- "[target] sneezes.", \
- //The truth, revealed
- "You're hallucinating.", \
- //Direct advice
- "[pick_list_replacements(HAL_LINES_FILE, "advice")]")
+ var/list/mobpool = list()
+ var/mob/living/carbon/human/other
+ var/close_other = FALSE
+ for(var/mob/living/carbon/human/H in oview(target, 7))
+ if(get_dist(H, target) <= 1)
+ other = H
+ close_other = TRUE
+ break
+ mobpool += H
+ if(!other && mobpool.len)
+ other = pick(mobpool)
+
+ var/list/message_pool = list()
+ if(other)
+ if(close_other) //increase the odds
+ for(var/i in 1 to 5)
+ message_pool.Add("You feel a tiny prick!")
+ var/obj/item/storage/equipped_backpack = other.get_item_by_slot(SLOT_BACK)
+ if(istype(equipped_backpack))
+ for(var/i in 1 to 5) //increase the odds
+ message_pool.Add("[other] puts the [pick(\
+ "revolver","energy sword","cryptographic sequencer","power sink","energy bow",\
+ "hybrid taser","stun baton","flash","syringe gun","circular saw","tank transfer valve",\
+ "ritual dagger","clockwork slab","spellbook",\
+ "pulse rifle","captain's spare ID","hand teleporter","hypospray","antique laser gun","X-01 MultiPhase Energy Gun","station's blueprints"\
+ )] into [equipped_backpack].")
+
+ message_pool.Add("[other] [pick("sneezes","coughs")].")
+
+ message_pool.Add("You hear something squeezing through the ducts...", \
+ "Your [pick("arm", "leg", "back", "head")] itches.",\
+ "You feel [pick("hot","cold","dry","wet","woozy","faint")].",
+ "Your stomach rumbles.",
+ "Your head hurts.",
+ "You hear a faint buzz in your head.",
+ "[target] sneezes.")
+ if(prob(10))
+ message_pool.Add("Behind you.",\
+ "You hear a faint laughter.",
+ "You see something move.",
+ "You hear skittering on the ceiling.",
+ "You see an inhumanly tall silhouette moving in the distance.")
+ if(prob(10))
+ message_pool.Add("[pick_list_replacements(HAL_LINES_FILE, "advice")]")
+ var/chosen = pick(message_pool)
feedback_details += "Message: [chosen]"
to_chat(target, chosen)
qdel(src)
/datum/hallucination/sounds
- cost = 15
-/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type)
+/datum/hallucination/sounds/New(mob/living/carbon/C, forced = TRUE, sound_type)
set waitfor = FALSE
..()
+ var/turf/source = random_far_turf()
if(!sound_type)
- sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock",
- "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai","meteors")
+ sound_type = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla")
feedback_details += "Type: [sound_type]"
//Strange audio
switch(sound_type)
if("airlock")
- target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1)
+ target.playsound_local(source,'sound/machines/airlock.ogg', 30, 1)
+ if("airlock_pry")
+ target.playsound_local(source,'sound/machines/airlock_alien_prying.ogg', 100, 1)
+ sleep(50)
+ target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1)
+ if("console")
+ target.playsound_local(source,'sound/machines/terminal_prompt.ogg', 25, 1)
if("explosion")
if(prob(50))
- target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1)
+ target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1)
else
- target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1)
+ target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1)
if("far_explosion")
- target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
+ target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1)
if("glass")
- target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
- if("phone")
- target.playsound_local(null, 'sound/weapons/ring.ogg', 15)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 25)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 35)
- sleep(25)
- target.playsound_local(null, 'sound/weapons/ring.ogg', 45)
- if("summon_guns")
- target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1)
+ target.playsound_local(source, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
if("alarm")
- target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0)
+ target.playsound_local(source, 'sound/machines/alarm.ogg', 100, 0)
if("beepsky")
- target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
- if("hallelujah")
- target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
- //Rare audio
- if("creepy")
- //These sounds are (mostly) taken from Hidden: Source
- target.playsound_local(null, pick(CREEPY_SOUNDS), 50, 1)
- if("ratvar")
- target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100)
- sleep(150)
- target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100)
- if("shuttle_dock")
- to_chat(target, "Priority Announcement
")
- to_chat(target, "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
")
- target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100)
+ target.playsound_local(source, 'sound/voice/bfreeze.ogg', 35, 0)
+ if("mech")
+ var/mech_dir = pick(GLOB.cardinals)
+ for(var/i in 1 to rand(4,9))
+ if(prob(75))
+ target.playsound_local(source, 'sound/mecha/mechstep.ogg', 40, 1)
+ source = get_step(source, mech_dir)
+ else
+ target.playsound_local(source, 'sound/mecha/mechturn.ogg', 40, 1)
+ mech_dir = pick(GLOB.cardinals)
+ sleep(10)
//Deconstructing a wall
if("wall_decon")
- target.playsound_local(null, 'sound/items/welder.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/welder.ogg', 50, 1)
sleep(105)
- target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/welder2.ogg', 50, 1)
sleep(15)
- target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1)
+ target.playsound_local(source, 'sound/items/ratchet.ogg', 50, 1)
//Hacking a door
if("door_hack")
- target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1)
- sleep(rand(10,30))
- for(var/i = rand(1,3), i>0, i--)
- target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
- sleep(rand(10,30))
- target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
- if("esword")
- target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1)
+ target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1)
+ sleep(rand(40,80))
+ target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1)
+ qdel(src)
+
+/datum/hallucination/weird_sounds
+
+/datum/hallucination/weird_sounds/New(mob/living/carbon/C, forced = TRUE, sound_type)
+ set waitfor = FALSE
+ ..()
+ var/turf/source = random_far_turf()
+ if(!sound_type)
+ sound_type = pick("phone","hallelujah","highlander","hyperspace","game_over","creepy","tesla")
+ feedback_details += "Type: [sound_type]"
+ //Strange audio
+ switch(sound_type)
+ if("phone")
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ sleep(25)
+ target.playsound_local(source, 'sound/weapons/ring.ogg', 15)
+ if("hyperspace")
+ target.playsound_local(null, 'sound/effects/hyperspace_begin.ogg', 50)
+ if("hallelujah")
+ target.playsound_local(source, 'sound/effects/pray_chaplain.ogg', 50)
+ if("highlander")
+ target.playsound_local(null, 'sound/misc/highlander.ogg', 50)
+ if("game_over")
+ target.playsound_local(source, 'sound/misc/compiler-failure.ogg', 50)
+ if("laughter")
+ if(prob(50))
+ target.playsound_local(source, 'sound/voice/human/womanlaugh.ogg', 50, 1)
+ else
+ target.playsound_local(source, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1)
+ if("creepy")
+ //These sounds are (mostly) taken from Hidden: Source
+ target.playsound_local(source, pick(CREEPY_SOUNDS), 50, 1)
+ if("tesla") //Tesla loose!
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 35, 1)
+ sleep(30)
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 65, 1)
+ sleep(30)
+ target.playsound_local(source, 'sound/magic/lightningbolt.ogg', 100, 1)
+
+ qdel(src)
+
+/datum/hallucination/stationmessage
+
+/datum/hallucination/stationmessage/New(mob/living/carbon/C, forced = TRUE, message)
+ set waitfor = FALSE
+ ..()
+ if(!message)
+ message = pick("ratvar","shuttle_dock","blob_alert","malf_ai","meteors","supermatter")
+ feedback_details += "Type: [message]"
+ switch(message)
if("blob_alert")
to_chat(target, "Biohazard Alert
")
to_chat(target, "
Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.
")
- target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0)
- if("tesla") //Tesla loose!
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
- sleep(30)
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
- sleep(30)
- target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
+ SEND_SOUND(target, 'sound/ai/outbreak5.ogg')
+ if("ratvar")
+ target.playsound_local(target, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
+ target.playsound_local(target, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
+ sleep(27)
+ target.playsound_local(target, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE)
+ if("shuttle_dock")
+ to_chat(target, "Priority Announcement
")
+ to_chat(target, "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
")
+ SEND_SOUND(target, 'sound/ai/shuttledock.ogg')
if("malf_ai") //AI is doomsdaying!
to_chat(target, "Anomaly Alert
")
to_chat(target, "
Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.
")
- target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0)
+ SEND_SOUND(target, 'sound/ai/aimalf.ogg')
if("meteors") //Meteors inbound!
to_chat(target, "Meteor Alert
")
to_chat(target, "
Meteors have been detected on collision course with the station.
")
- target.playsound_local(null, 'sound/ai/meteors.ogg', 100, 0)
- qdel(src)
+ SEND_SOUND(target, 'sound/ai/meteors.ogg')
+ if("supermatter")
+ SEND_SOUND(target, 'sound/magic/charge.ogg')
+ to_chat(target, "You feel reality distort for a moment...")
/datum/hallucination/hudscrew
- cost = 10
-/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/hudscrew/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
//Screwy HUD
@@ -933,9 +911,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/fake_alert
- cost = 15
-/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150)
+/datum/hallucination/fake_alert/New(mob/living/carbon/C, forced = TRUE, specific, duration = 150)
set waitfor = FALSE
..()
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")
@@ -983,15 +960,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
if("hacked")
target.throw_alert(alert_type, /obj/screen/alert/hacked, override = TRUE)
if("charge")
- target.throw_alert(alert_type,/obj/screen/alert/emptycell, override = TRUE)
+ target.throw_alert(alert_type, /obj/screen/alert/emptycell, override = TRUE)
sleep(duration)
target.clear_alert(alert_type, clear_override = TRUE)
qdel(src)
/datum/hallucination/items
- cost = 15
-/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/items/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
//Strange items
@@ -1052,9 +1028,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/dangerflash
- cost = 15
-/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/dangerflash/New(mob/living/carbon/C, forced = TRUE, danger_type)
set waitfor = FALSE
..()
//Flashes of danger
@@ -1064,32 +1039,92 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
possible_points += F
if(possible_points.len)
var/turf/open/floor/danger_point = pick(possible_points)
-
- switch(rand(1,5))
- if(1)
- target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER)
- if(2)
- target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER)
- if(3)
- target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER)
- if(4)
- target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01)
- if(5)
- target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01)
-
-
- if(target.client)
- target.client.images += target.halimage
- sleep(rand(200,450))
- if(target.client)
- target.client.images -= target.halimage
- QDEL_NULL(target.halimage)
+ if(!danger_type)
+ danger_type = pick("lava","chasm","anomaly")
+ switch(danger_type)
+ if("lava")
+ new /obj/effect/hallucination/danger/lava(danger_point, target)
+ if("chasm")
+ new /obj/effect/hallucination/danger/chasm(danger_point, target)
+ if("anomaly")
+ new /obj/effect/hallucination/danger/anomaly(danger_point, target)
qdel(src)
-/datum/hallucination/death
- cost = 40
+/obj/effect/hallucination/danger
+ var/image/image
-/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE)
+/obj/effect/hallucination/danger/proc/show_icon()
+ return
+
+/obj/effect/hallucination/danger/proc/clear_icon()
+ if(image && target.client)
+ target.client.images -= image
+
+/obj/effect/hallucination/danger/Initialize(mapload, _target)
+ . = ..()
+ target = _target
+ show_icon()
+ QDEL_IN(src, rand(200, 450))
+
+/obj/effect/hallucination/danger/Destroy()
+ clear_icon()
+ . = ..()
+
+/obj/effect/hallucination/danger/lava
+ name = "lava"
+
+/obj/effect/hallucination/danger/lava/show_icon()
+ image = image('icons/turf/floors/lava.dmi',src,"smooth",TURF_LAYER)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/lava/Crossed(atom/movable/AM)
+ if(AM == target)
+ target.adjustStaminaLoss(20)
+ new /datum/hallucination/fire(target)
+
+/obj/effect/hallucination/danger/chasm
+ name = "chasm"
+
+/obj/effect/hallucination/danger/chasm/show_icon()
+ image = image('icons/turf/floors/Chasms.dmi',src,"smooth",TURF_LAYER)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/chasm/Crossed(atom/movable/AM)
+ if(AM == target)
+ to_chat(target, "You fall into the chasm!")
+ target.Knockdown(40)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "It's surprisingly shallow."), 15)
+ QDEL_IN(src, 30)
+
+/obj/effect/hallucination/danger/anomaly
+ name = "flux wave anomaly"
+
+/obj/effect/hallucination/danger/anomaly/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/effect/hallucination/danger/anomaly/process()
+ if(prob(70))
+ step(src,pick(GLOB.alldirs))
+
+/obj/effect/hallucination/danger/anomaly/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/effect/hallucination/danger/anomaly/show_icon()
+ image = image('icons/effects/effects.dmi',src,"electricity2",OBJ_LAYER+0.01)
+ if(target.client)
+ target.client.images += image
+
+/obj/effect/hallucination/danger/anomaly/Crossed(atom/movable/AM)
+ if(AM == target)
+ new /datum/hallucination/shock(target)
+
+/datum/hallucination/death
+
+/datum/hallucination/death/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
target.set_screwyhud(SCREWYHUD_DEAD)
@@ -1107,8 +1142,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
fakemob = target //ever been so lonely you had to haunt yourself?
if(fakemob)
sleep(rand(20, 50))
- to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\
- "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"")
+ to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","why did i just drop dead?","hey [target.first_name()]","git gud","you too?","is the AI rogue?",\
+ "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "this round","this","myself","admins","you")]")]\"")
sleep(rand(70,90))
target.set_screwyhud(SCREWYHUD_NONE)
target.SetKnockdown(0)
@@ -1116,38 +1151,93 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
qdel(src)
/datum/hallucination/fire
- cost = 25
+ var/active = TRUE
+ var/stage = 0
+ var/image/fire_overlay
-/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/fire/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
- var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER)
+ target.fire_stacks = max(target.fire_stacks, 0.1) //Placebo flammability
+ 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 3)
+ if(target.fire_stacks <= 0)
+ clear_fire()
+ return
+ stage++
+ update_temp()
+ sleep(30)
for(var/i in 1 to rand(5, 10))
+ if(target.fire_stacks <= 0)
+ clear_fire()
+ return
target.adjustStaminaLoss(15)
- sleep(25)
+ sleep(20)
+ clear_fire()
+
+/datum/hallucination/fire/proc/update_temp()
+ if(stage <= 0)
+ target.clear_alert("temp", clear_override = TRUE)
+ else
+ target.clear_alert("temp", clear_override = TRUE)
+ target.throw_alert("temp", /obj/screen/alert/hot, stage, override = TRUE)
+
+/datum/hallucination/fire/proc/clear_fire()
+ if(!active)
+ return
+ active = FALSE
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)
+ while(stage > 0)
+ stage--
+ update_temp()
+ sleep(30)
qdel(src)
-/datum/hallucination/husks
- cost = 20
+/datum/hallucination/shock
+ var/image/shock_image
+ var/image/electrocution_skeleton_anim
-/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE)
+/datum/hallucination/shock/New(mob/living/carbon/C, forced = TRUE)
+ set waitfor = FALSE
+ ..()
+ shock_image = image(target, target, dir = target.dir)
+ shock_image.appearance_flags |= KEEP_APART
+ shock_image.color = rgb(0,0,0)
+ shock_image.override = TRUE
+ electrocution_skeleton_anim = image('icons/mob/human.dmi', target, icon_state = "electrocuted_base", layer=ABOVE_MOB_LAYER)
+ electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
+ to_chat(target, "You feel a powerful shock course through your body!")
+ if(target.client)
+ target.client.images |= shock_image
+ target.client.images |= electrocution_skeleton_anim
+ addtimer(CALLBACK(src, .proc/reset_shock_animation), 40)
+ target.playsound_local(get_turf(src), "sparks", 100, 1)
+ target.staminaloss += 50
+ target.Stun(40)
+ target.jitteriness += 1000
+ target.do_jitter_animation(target.jitteriness)
+ addtimer(CALLBACK(src, .proc/shock_drop), 20)
+
+/datum/hallucination/shock/proc/reset_shock_animation()
+ if(target.client)
+ target.client.images.Remove(shock_image)
+ target.client.images.Remove(electrocution_skeleton_anim)
+
+/datum/hallucination/shock/proc/shock_drop()
+ target.jitteriness = max(target.jitteriness - 990, 10) //Still jittery, but vastly less
+ target.Knockdown(60)
+
+/datum/hallucination/husks
+
+/datum/hallucination/husks/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
if(!target.halbody)
@@ -1178,7 +1268,6 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
//hallucination projectile code in code/modules/projectiles/projectile/special.dm
/datum/hallucination/stray_bullet
- cost = 15
/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
@@ -1194,29 +1283,4 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
H.hal_target = target
H.preparePixelProjectile(target, start)
H.fire()
- qdel(src)
-
-//Reality Dissociation Syndrome hallucinations only trigger in special cases and have no cost
-/datum/hallucination/rds
- cost = 0
-
-/datum/hallucination/rds/fourth_wall/New(mob/living/carbon/C, forced = TRUE)
- ..()
- to_chat(C, "[pick("Leave the server" , "Close the game window")] [pick("immediately", "right now")].")
-
-/datum/hallucination/rds/supermatter/New(mob/living/carbon/C, forced = TRUE)
- ..()
- SEND_SOUND(C, 'sound/magic/charge.ogg')
- to_chat(C, "You feel reality distort for a moment...")
-
-/datum/hallucination/rds/narsie/New(mob/living/carbon/C, forced = TRUE)
- C.playsound_local(C, 'sound/creatures/narsie_rises.ogg', 50, FALSE, pressure_affected = FALSE)
- to_chat(C, "NAR-SIE HAS RISEN")
-
-/datum/hallucination/rds/ark/New(mob/living/carbon/C, forced = TRUE)
- set waitfor = FALSE
- ..()
- C.playsound_local(C, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE)
- C.playsound_local(C, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE)
- sleep(27)
- C.playsound_local(C, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8194296099..6b72506c02 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -207,9 +207,9 @@
if(breath_gases[/datum/gas/bz])
var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.total_moles())*breath_pressure
if(bz_partialpressure > 1)
- hallucination += 20
+ hallucination += 10
else if(bz_partialpressure > 0.01)
- hallucination += 5//Removed at 2 per tick so this will slowly build up
+ hallucination += 5
//TRITIUM
if(breath_gases[/datum/gas/tritium])
var/tritium_partialpressure = (breath_gases[/datum/gas/tritium][MOLES]/breath.total_moles())*breath_pressure
diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm
index eaa998f7e0..d717bed39e 100644
--- a/code/modules/projectiles/projectile/special/mindflayer.dm
+++ b/code/modules/projectiles/projectile/special/mindflayer.dm
@@ -6,4 +6,4 @@
if(ishuman(target))
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
- M.hallucination += 20
+ M.hallucination += 30
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 32b96d2780..3720d717b1 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -287,7 +287,7 @@
to_chat(M, "[high_message]")
M.adjustStaminaLoss(-5, 0)
M.adjustBrainLoss(4)
- M.hallucination += 10
+ M.hallucination += 5
if(M.canmove && !ismovableatom(M.loc))
step(M, pick(GLOB.cardinals))
step(M, pick(GLOB.cardinals))
@@ -295,7 +295,7 @@
. = 1
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
- M.hallucination += 10
+ M.hallucination += 5
if(M.canmove && !ismovableatom(M.loc))
for(var/i in 1 to 8)
step(M, pick(GLOB.cardinals))
@@ -341,7 +341,7 @@
..()
/datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M)
- M.hallucination += 40
+ M.hallucination += 30
if(M.canmove && !ismovableatom(M.loc))
for(var/i = 0, i < 16, i++)
step(M, pick(GLOB.cardinals))
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index b4abc2e4b1..ddc9878546 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1093,7 +1093,7 @@
. = 1
/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
- M.hallucination = min(max(0, M.hallucination + 10), 50)
+ M.hallucination = min(max(0, M.hallucination + 5), 60)
M.adjustToxLoss(5 * REM, 0)
..()
. = 1
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 30117d4ce3..07f19a8462 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -103,7 +103,7 @@
/datum/reagent/blackpowder/on_mob_life(mob/living/M)
..()
if(isplasmaman(M))
- M.hallucination += 10
+ M.hallucination += 5
/datum/reagent/blackpowder/on_ex_act()
var/location = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 0972f32ad7..2baddfbf32 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -188,7 +188,7 @@
taste_description = "sourness"
/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/M)
- M.hallucination += 10
+ M.hallucination += 5
return ..()
/datum/reagent/toxin/plantbgone
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index ce5fafcd9f..a3fe2202b6 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -236,13 +236,13 @@
var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES])
if(bz_pp > BZ_trip_balls_min)
- H.hallucination += 20
+ H.hallucination += 10
H.reagents.add_reagent("bz_metabolites",5)
if(prob(33))
H.adjustBrainLoss(3, 150)
else if(bz_pp > 0.01)
- H.hallucination += 5//Removed at 2 per tick so this will slowly build up
+ H.hallucination += 5
H.reagents.add_reagent("bz_metabolites",1)
diff --git a/strings/hallucination.json b/strings/hallucination.json
index 449f974901..238342f30c 100644
--- a/strings/hallucination.json
+++ b/strings/hallucination.json
@@ -5,6 +5,22 @@
"@pick(add_name)what are you hiding?",
"I saw that"
],
+
+ "conversation": [
+ "Yes",
+ "Yeah",
+ "Yup",
+ "No",
+ "Nah",
+ "I doubt it",
+ "Uh...",
+ "Why?",
+ "But...",
+ "Hold on",
+ "Hmm",
+ "Yeah, i know",
+ "Weird"
+ ],
"greetings": [
"",
@@ -29,7 +45,7 @@
"Kchckchk...",
"EEEeeeeEEEE",
"khhhhh",
- "#@§*&£",
+ "#@�*&�",
"H**p m*",
"H-hhhhh..."
],
@@ -40,47 +56,9 @@
"What was that?"
],
- "imatraitor": [
- "Hail Ratvar",
- "Hail Nar'Sie",
- "Hey, @pick(add_name)i've got some TC left, want something?",
- "Viva!",
- "I'll spare you if you don't tell anybody about me",
- "Hey, @pick(add_name)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"
- ],
-
"add_name": [
"%TARGETNAME%, ",
+ "%TARGETNAME% ",
""
],
@@ -95,11 +73,16 @@
"aggressive": [
"@pick(add_name)give me that!",
+ "@pick(add_name)stop it!",
"@pick(add_name)i'm going to kill you!",
"@pick(add_name)fuck you!"
],
"help": [
+ "HELP",
+ "HELP",
+ "HELP",
+ "HELP",
"HELP",
"HELP ME",
"HELP HIM",
@@ -140,6 +123,7 @@
],
"accusations": [
+ "dead",
"rogue",
"cult",
"a cultist",
@@ -162,32 +146,64 @@
"Ling",
"Ops",
"Swarmers",
+ "Spiders",
+ "Xenos",
"Revenant",
"Traitor",
"Harm",
+ "Blue APC",
"I hear flashing",
"Help",
"%TARGETNAME%"
],
"location": [
- "bridge",
- "armory",
+ "space near @pick(sublocation)",
+ "the bridge",
+ "the armory",
"sec",
"security",
"science",
+ "xenobio",
"engineering",
"cargo",
"medbay",
"atmos",
"maint",
+ "@pick(sublocation) maint",
+ "virology",
+ "morgue",
"hops office",
"captains office",
- "chapel",
- "library",
+ "the chapel",
+ "the library",
"tool storage",
"botany",
- "kitchen",
+ "the kitchen",
+ "the ai sat"
+ ],
+
+ "sublocation": [
+ "the bridge",
+ "the armory",
+ "sec",
+ "security",
+ "science",
+ "xenobio",
+ "engineering",
+ "cargo",
+ "medbay",
+ "atmos",
+ "maint",
+ "virology",
+ "morgue",
+ "hops office",
+ "captains office",
+ "the chapel",
+ "the library",
+ "tool storage",
+ "botany",
+ "the kitchen",
"the ai sat"
],
@@ -201,10 +217,12 @@
"Kill that person. You know who.",
"You should go somewhere else. Quickly.",
"Good luck. You'll need it.",
- "You have my permission. Do it."
+ "You have my permission. Do it.",
+ "Just do it."
],
"chemicals": [
+ "Something",
"Ooze",
"Fire",
"Earth",