Files
Aurora.3/code/game/objects/structures/therapy.dm
LordFowl 1086e1fdb2 [Ready for Review] Unapologetic Psych Buffs - Now with 80% less Mike Pence! (#4377)
This PR removes brain surgery's ability to instantly cure all traumas. Now traumas have been roughly divided into four categories of treatment:
1: Chakra therapy cures traumas that directly affect physical behavior, such as tourettes or paralysis. It is accomplished via the crystal therapy pod available to the psychiatrist.

2: Hypnotic therapy cures traumas that directly affect mental behavior, such as phobias or confusions. It is accomplished via the mesmetron pocketwatch available to the psychiatrist.

3: Isolation therapy cures traumas that cause hallucinations. It is accomplished via the metronome and facilitated by the isolation room available to the psychiatrist.

4: Surgical therapy cures traumas that do not fit into the above categories. It is accomplished via brain surgery.

Using the crystal therapy pod's neural scan function will provide the psychiatrist the brain damage the patient suffers from in numerical form. It falls upon the psychiatrist to determine how much of this brain damage is being caused by mental traumas the crystal therapy pod is equipped to deal with. Excessive cycles will cause increasing amounts of radiation damage.

The mesmetron pocketwatch requires the patient to believe in hypnosis. It then puts the patient into a slumber, where the psychiatrist can hypnotically suggest new behavior, provided the patient continues to believe in hypnosis. Each suggestion cures a single hypnotic trauma.
The isolation room is equipped with a metronome. When active, the metronome will have a chance every ticktock of the metronome to cure an isolation trauma, provided the patient is totally alone.

The psychiatry office has been expanded into a complete mental health ward. The only thing it is lacking is beds, as I believe recovering mental health patients still belong in the recovery ward.

The chaplain can also cure isolation and chakra traumas by dispelling the demons within with his null rod. Staring at the supermatter unprotected has been known to hypnotize. Electricity applied by any source directly to the head is also known to sometimes cure electroshock trauma.
2018-04-08 16:29:33 +03:00

608 lines
20 KiB
Plaintext

/obj/structure/bed/chair/e_chair
name = "electric chair"
desc = "Looks absolutely SHOCKING!"
icon_state = "echair0"
var/on = 0
var/obj/item/assembly/shock_kit/part = null
var/last_time = 0
/obj/structure/bed/chair/e_chair/update_icon()
return
/obj/structure/bed/chair/e_chair/Initialize()
. = ..()
add_overlay(image('icons/obj/furniture.dmi', src, "echair_over", MOB_LAYER + 1))
if(!part)
part = new /obj/item/assembly/shock_kit(src)
part.master = src
part.part1 = new /obj/item/clothing/head/helmet(part)
part.part2 = new /obj/item/device/radio/electropack(part)
part.part1.master = part
part.part2.master = part
/obj/structure/bed/chair/e_chair/Destroy()
if (part)
part.master = null
part = null
. = ..()
/obj/structure/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
var/obj/structure/bed/chair/C = new /obj/structure/bed/chair(loc)
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
C.set_dir(dir)
part.forceMove(get_turf(src))
part.master = null
part = null
qdel(src)
/obj/structure/bed/chair/e_chair/verb/toggle()
set name = "Toggle Electric Chair"
set category = "Object"
set src in oview(1)
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened || usr.lying || usr.restrained() || usr.buckled)
return
if(on)
on = 0
icon_state = "echair0"
else
on = 1
shock()
icon_state = "echair1"
user << "<span class='notice'>You switch [on ? "on" : "off"] [src].</span>"
/obj/structure/bed/chair/e_chair/proc/shock()
if(!on)
return
var/obj/structure/cable/C = locate(/obj/structure/cable, get_turf(src))
var/datum/powernet/PN = C.powernet
flick("echair1", src)
spark(src, 12, alldirs)
if(buckled_mob && istype(C))
if(electrocute_mob(buckled_mob, C, src, 1.25, "head"))
buckled_mob << "<span class='danger'>You feel a deep shock course through your body!</span>"
sleep(1)
if(electrocute_mob(buckled_mob, C, src, 1.25, "head"))
buckled_mob.Stun(PN.get_electrocute_damage()*10)
visible_message("<span class='danger'>The electric chair goes off!</span>", "<span class='danger'>You hear an electrical discharge!</span>")
return
/obj/item/weapon/mesmetron
name = "mesmetron pocketwatch"
desc = "An elaborate pocketwatch, with captivating gold etching and an enchanting face. . ."
icon = 'icons/obj/items.dmi'
icon_state = "pocketwatch"
matter = list("glass" = 150, "gold" = 50)
w_class = 1
var/datum/weakref/thrall = null
var/time_counter = 0
/obj/item/weapon/mesmetron/Destroy()
STOP_PROCESSING(SSfast_process, src)
thrall = null
. = ..()
/obj/item/weapon/mesmetron/process()
if (!thrall)
STOP_PROCESSING(SSfast_process, src)
return
var/mob/living/carbon/human/H = thrall.resolve()
if(!H)
thrall = null
STOP_PROCESSING(SSfast_process, src)
return
if (time_counter > 20)
time_counter += 0.5
var/thrall_response = alert(H, "Do you believe in hypnosis?", "Willpower", "Yes", "No")
if(thrall_response == "No")
H.sleeping = max(H.sleeping - 40, 0)
H.drowsyness = max(H.drowsyness - 60, 0)
thrall = null
STOP_PROCESSING(SSfast_process, src)
else
H.sleeping = max(H.sleeping, 40)
H.drowsyness = max(H.drowsyness, 60)
else
STOP_PROCESSING(SSfast_process, src)
/obj/item/weapon/mesmetron/attack_self(mob/user as mob)
if(!thrall || !thrall.resolve())
thrall = null
user << "You decipher the watch's mesmerizing face, discerning the time to be: '[worldtime2text()]'. Today's date is '[time2text(world.time, "Month DD")]. [game_year]'."
return
var/mob/living/carbon/human/H = thrall.resolve()
var/response = alert(user, "Would you like to make a suggestion to [thrall], or release them?", "Mesmetron", "Suggestion", "Release")
if (response == "Release")
thrall = null
STOP_PROCESSING(SSfast_process, src)
else
if(get_dist(user, H) > 1)
user << "You must stand in whisper range of [H]."
return
text = input("What would you like to suggest?", "Hypnotic suggestion", null, null)
text = sanitize(text)
if(!text)
return
var/thrall_response = alert(H, "Do you believe in hypnosis?", "Willpower", "Yes", "No")
if(thrall_response == "Yes")
H << "<span class='notice'><i>... [text] ...</i></span>"
H.cure_all_traumas(cure_type = CURE_HYPNOSIS)
else
thrall = null
/obj/item/weapon/mesmetron/afterattack(mob/living/carbon/human/H, mob/user, proximity)
if(!proximity)
return
if(!istype(H))
return
user.visible_message("<span class='warning'>[user] begins to mesmerizingly wave [src] like a pendulum before [H]'s very eyes!</span>")
if(!do_mob(user, H, 10 SECONDS))
return
if((!user in view(1,target)))
return
var/response = alert(H, "Do you believe in hypnosis?", "Willpower", "Yes", "No")
if(response == "Yes")
H.visible_message("<span class='warning'>[H] falls into a deep slumber!</span>", "<span class ='danger'>You fall into a deep slumber!</span>")
H.sleeping = max(H.sleeping, 40)
H.drowsyness = max(H.drowsyness, 60)
thrall = WEAKREF(H)
START_PROCESSING(SSfast_process, src)
/obj/structure/metronome
name = "metronome"
desc = "Tick. Tock. Tick. Tock. Tick. Tock."
icon = 'icons/obj/structures.dmi'
icon_state = "metronome1"
anchored = 1
density = 0
var/time_last_ran = 0
var/ticktock = "Tick"
/obj/structure/metronome/Destroy()
STOP_PROCESSING(SSfast_process, src)
. = ..()
/obj/structure/metronome/Initialize()
. = ..()
START_PROCESSING(SSfast_process, src)
/obj/structure/metronome/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswrench(W))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
user << "<span class='notice'>You unanchor \the [src] and it destabilizes.</span>"
STOP_PROCESSING(SSfast_process, src)
icon_state = "metronome0"
anchored = 0
else
user << "<span class='notice'>You anchor \the [src] and it restabilizes.</span>"
START_PROCESSING(SSfast_process, src)
icon_state = "metronome1"
anchored = 1
else
..()
/obj/structure/metronome/process()
if (world.time - time_last_ran < 60)
return
time_last_ran = world.time
var/counter = 0
var/mob/living/carbon/human/H
for(var/mob/living/L in view(3,src.loc))
counter++
if(ishuman(L))
H = L
if(counter == 1 && H)
if(ticktock == "Tick")
ticktock = "Tock"
else
ticktock = "Tick"
H << "<span class='notice'><i>[ticktock]. . .</i></span>"
H << 'sound/effects/singlebeat.ogg'
if(prob(1))
H.cure_all_traumas(cure_type = CURE_SOLITUDE)
/obj/machinery/chakrapod
name = "Crystal Therapy Pod"
desc = "A state-of-the-art crystal therapy pod. Designed to utilize phoron enhanced quartz crystals to remove mental trauma from the body. Proven to be 100% effective 30% of the time!"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "syndipod_0"
density = 1
anchored = 1
use_power = 1
idle_power_usage = 60
active_power_usage = 10000
var/datum/weakref/occupant = null
var/locked
var/obj/machinery/chakraconsole/connected
/obj/machinery/chakrapod/Destroy()
if (connected)
connected.connected = null
connected = null
occupant = null
return ..()
/obj/machinery/chakrapod/relaymove(mob/user as mob)
if (user.stat)
return
src.go_out()
return
/obj/machinery/chakrapod/verb/eject()
set src in oview(1)
set category = "Object"
set name = "Eject Crystal Therapy Pod"
if (usr.stat != 0)
return
src.go_out()
add_fingerprint(usr)
return
/obj/machinery/chakrapod/verb/move_inside()
set src in oview(1)
set category = "Object"
set name = "Enter Crystal Therapy Pod"
if (usr.stat != 0 || locked)
return
if (occupant.resolve())
usr << "<span class='warning'>The pod is already occupied!</span>"
return
if (usr.abiotic())
usr << "<span class='warning'>The subject cannot have abiotic items on.</span>"
return
if(locked)
user << "<span class='warning'>The pod is currently locked!</span>"
return
if(!ishuman(usr))
user << "<span class='warning'>The subject does not fit!</span>"
return
usr.pulling = null
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
usr.forceMove(src)
src.occupant = WEAKREF(usr)
update_use_power(2)
src.icon_state = "syndipod_1"
for(var/obj/O in src)
O.forceMove(get_turf(src))
src.add_fingerprint(usr)
return
/obj/machinery/chakrapod/proc/go_out()
if (!src.occupant || !occupant.resolve())
occupant = null
return
var/mob/living/carbon/human/H = occupant.resolve()
if(locked)
H << "<span class='notice'>You push against the pod door and attempt to escape. This process will take roughly two minutes.</span>"
if(!do_after(H, 1200))
return
for(var/obj/O in src)
O.forceMove(get_turf(src))
if (H.client)
H.client.eye = H.client.mob
H.client.perspective = MOB_PERSPECTIVE
H.forceMove(get_turf(src))
occupant = null
update_use_power(1)
src.icon_state = "syndipod_0"
return
/obj/machinery/chakrapod/attackby(obj/item/weapon/grab/G, mob/user)
if (!istype(G) || !ishuman(G.affecting))
return
if (occupant)
user << "<span class='warning'>The pod is already occupied!</span>"
return
if (G.affecting.abiotic())
user << "<span class='warning'>Subject cannot have abiotic items on.</span>"
return
if(locked)
user << "<span class='warning'>The pod is locked.</span>"
return
var/mob/living/L = G.affecting
visible_message("[user] starts putting [L] into the pod bed.", 3)
if (do_mob(user, L, 30, needhand = 0))
var/bucklestatus = L.bucklecheck(user)
if (!bucklestatus)//incase the patient got buckled during the delay
return
if (bucklestatus == 2)
var/obj/structure/LB = L.buckled
LB.user_unbuckle_mob(user)
if (L.client)
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
L.forceMove(src)
occupant = WEAKREF(L)
update_use_power(2)
icon_state = "syndipod_1"
for(var/obj/O in src)
O.forceMove(get_turf(src))
src.add_fingerprint(user)
qdel(G)
return
/obj/machinery/chakrapod/MouseDrop_T(mob/living/carbon/human/H, mob/living/user)
if(!istype(user) || !istype(H))
return
if (occupant)
user << "<span class='notice'><B>The pod is already occupied!</B></span>"
return
if (H.abiotic())
user << "<span class='notice'><B>Subject cannot have abiotic items on.</B></span>"
return
if(locked)
user << "<span class='warning'>The pod is locked.</span>"
return
var/bucklestatus = H.bucklecheck(user)
if (!bucklestatus)//We must make sure the person is unbuckled before they go in
return
if(H == user)
visible_message("[user] starts climbing into the pod bed.", 3)
else
visible_message("[user] starts putting [H.name] into the pod bed.", 3)
if (do_mob(user, H, 30, needhand = 0))
if (bucklestatus == 2)
var/obj/structure/LB = H.buckled
LB.user_unbuckle_mob(user)
if (H.client)
H.client.perspective = EYE_PERSPECTIVE
H.client.eye = src
H.forceMove(src)
occupant = WEAKREF(H)
update_use_power(2)
src.icon_state = "syndipod_1"
for(var/obj/Obj in src)
Obj.forceMove(get_turf(src))
src.add_fingerprint(user)
return
/obj/machinery/chakraconsole
name = "Therapy Pod Console"
desc = "A control panel for some kind of medical device."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "syndipod_scannerconsole"
density = 0
anchored = 1
var/obj/machinery/chakrapod/connected
var/crystal = 0
var/working = 0
/obj/machinery/chakraconsole/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
return
if(2.0)
if (prob(50))
qdel(src)
return
else
return
/obj/machinery/chakraconsole/Destroy()
if (connected)
connected.connected = null
connected = null
return ..()
/obj/machinery/chakraconsole/power_change()
..()
if((stat & BROKEN) || (stat & NOPOWER))
icon_state = "syndipod_scannerconsole-p"
else
icon_state = initial(icon_state)
/obj/machinery/chakraconsole/Initialize()
. = ..()
for(var/obj/machinery/chakrapod/C in orange(1,src))
connected = C
break
if(connected)
connected.connected = src
/obj/machinery/chakraconsole/Destroy()
if (connected)
connected.connected = null
connected = null
. = ..()
/obj/machinery/chakraconsole/attack_ai(user as mob)
return src.attack_hand(user)
/obj/machinery/chakraconsole/attack_hand(user as mob)
if(..())
return
button_prompt(user)
/obj/machinery/chakraconsole/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
user << "<span class='warning'>You short out [src]'s safety measurements.</span>"
visible_message("[src] hums oddly...")
emagged = 1
return 1
/obj/machinery/chakraconsole/proc/button_prompt(user as mob)
var/mob/living/carbon/human/H = connected && connected.occupant ? connected.occupant.resolve() : null
if(!H)
user << "<span class='notice'>The pod is currently unoccupied.</span>"
else
var/list/choices1 = list("Therapy Pod", "Toggle Locking Mechanism", "Initiate Neural Scan", "Initiate Crystal Therapy", "Recycle Crystal", "Cancel")
if(emagged)
choices1.Add("%eRr:# C:\\NT>quaid.exe")
var/response1 = input(user,"Input Operation","Therapy Pod OS") as null|anything in choices1
switch(response1)
if("Toggle Locking Mechanism")
connected.locked = !connected.locked
visible_message("<span class='warning'>[connected]'s locking mechanism clicks.</span>", "<span class='warning'>You hear a click.</span>")
return
if("Initiate Neural Scan")
visible_message("<span class='warning'>[connected] begins humming with an electrical tone.</span>", "<span class='warning'>You hear an electrical humming.</span>")
if(H && connected.occupant.resolve() == H)
var/obj/item/organ/brain/sponge = H.internal_organs_by_name["brain"]
var/retardation = H.getBrainLoss()
if(sponge && istype(sponge))
if(!sponge.lobotomized)
user << "<span class='notice'>Scans indicate [retardation] distinct abnormalities present in subject.</span>"
return
else
user << "<span class='notice'>Scans indicate [retardation+rand(-20,20)] distinct abnormalities present in subject.</span>"
return
user << "<span class='warning'>Scans indicate total brain failure in subject.</span>"
return
if("Initiate Crystal Therapy")
if(!crystal)
neural_check(user, H)
return
user << "<span class='danger'>Error: Crystal depleted. Terminating operation..</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
if("%eRr:# C:\\NT>quaid.exe")
if(!crystal)
total_recall(user, H)
return
user << "<span class='danger'>Error: Crystal depleted. Terminating operation..</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
if("Recycle Crystal")
if(crystal)
user << "<span class='warning'>Eliminating depleted crystal.</span>"
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
sleep(100)
crystal = 0
visible_message("<span class='notice'>[connected] pings cheerfully.</span>", "<span class='notice'>You hear a ping.</span>")
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
return
user << "<span class='danger'>Error: Crystal depletion not detected. Terminating operation..</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
/obj/machinery/chakraconsole/proc/neural_check(var/mob/user, var/mob/living/carbon/human/H)
var/response = input(user,"Input number of rotations","Therapy Pod","0")
var/alert = text2num(sanitize(response))
if(!alert)
user << "<span class='warning'>Error. Invalid input.</span>"
return
for(var/i=0;i<alert;i++)
sleep(100)
var/electroshock_trauma = 0
if(!H || H != connected.occupant.resolve())
if(get_dist(user,src) <= 1)
user << "<span class='danger'>Error: Subject not recognized. Terminating operation.</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
break
var/obj/item/organ/brain/sponge = H.internal_organs_by_name["brain"]
if (!istype(sponge) || !sponge.traumas.len)
if(get_dist(user,src) <= 1)
user << "<span class='danger'>Error: Subject not recognized. Terminating operation.</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
break
for(var/X in sponge.traumas)
var/datum/brain_trauma/trauma = X
if(trauma.cure_type == CURE_CRYSTAL)
if(!trauma.permanent)
qdel(trauma)
electroshock_trauma = 1
break
if(electroshock_trauma)
visible_message("<span class='notice'>[connected] pings cheerfully.</span>", "<span class='notice'>You hear a ping.</span>")
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
else
if(get_dist(user,src) <= 1)
user << "<span class='danger'>Error: Brain abnormality not recognized. Subject contamination detected.</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")
H.apply_radiation(max(1,i))
/obj/machinery/chakraconsole/proc/total_recall(var/mob/user, var/mob/living/carbon/human/H)
if(H && H == connected.occupant.resolve())
var/list/choices1 = list("Wipe Memory", "Implant Memory", "Cancel")
var/response1 = input(user,"Input operation.","quaid.exe") as null|anything in choices1
if(response1 == "Cancel")
return
if(response1 == "Wipe Memory")
var/list/choices2 = list("5 minutes", "15 minutes", "30 minutes", "2 hours", "6 months", "Cancel")
var/response2 = input(user,"Input timeframe.","Memory Wipe") as null|anything in choices2
if(response2 != "Cancel")
user << "<span class='notice'>Initiating memory wipe. Process will take approximately two minutes.</span>"
H << "<span class='danger'>You feel a sharp pain in your brain as the therapy pod begins to hum menacingly!!</span>"
sleep(1200-rand(0,150))
if(H && H == connected.occupant.resolve())
var/timespan = response2
H << "<span class='danger'>You feel a part of your past self, a portion of your memories, a piece of your very being slip away...</span>"
H << "<b>Your memory of the past [timespan] has been wiped. Your ability to recall these past [timespan] has been removed from your brain, and you remember nothing that ever ocurred within those [timespan].</b>"
crystal = 1
return
else
return
if(response1 == "Implant Memory")
var/new_memory = input(user,"Input New Memory","quaid.exe")
var/memory_implant = sanitize(new_memory)
if(memory_implant)
user << "<span class='notice'>Initiating memory implantation. Process will take approximately two minutes. Subject's memory of this process will also be wiped.</span>"
H << "<span class='danger'>You feel a sharp pain in your brain as the therapy pod begins to hum menacingly!</span>"
sleep(1200-rand(0,150))
if(H && H == connected.occupant.resolve())
H << "<span class='danger'>You blink, and somehow between the timespan of your eyes closing and your eyes opening your perception of the world has changed in some imperceptible way...</span>"
H << "<b>A new memory has been implanted in your mind as follows: [memory_implant] - you have no reason to suspect the memory to be fabricated, as your memory of the past two minutes has also been altered.</b>"
crystal = 1
return
if(get_dist(user,src) <= 1)
user << "<span class='danger'>Error: Operation failed. Terminating operation.</span>"
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
visible_message("<span class='warning'>[connected] buzzes harshly.</span>", "<span class='warning'>You hear a sharp buzz.</span>")