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