This repository has been archived by the owner on Sep 12, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 66
/
hypnochair.dm
203 lines (179 loc) · 6.52 KB
/
hypnochair.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/obj/machinery/hypnochair
name = "enhanced interrogation chamber"
desc = "A device used to perform \"enhanced interrogation\" through invasive mental conditioning."
icon = 'icons/obj/machines/implantchair.dmi'
icon_state = "hypnochair"
circuit = /obj/item/circuitboard/machine/hypnochair
density = TRUE
opacity = FALSE
var/mob/living/carbon/victim = null ///Keeps track of the victim to apply effects if it teleports away
var/interrogating = FALSE ///Is the device currently interrogating someone?
var/start_time = 0 ///Time when the interrogation was started, to calculate effect in case of interruption
var/trigger_phrase = "" ///Trigger phrase to implant
var/timerid = 0 ///Timer ID for interrogations
var/message_cooldown = 0 ///Cooldown for breakout message
/obj/machinery/hypnochair/Initialize()
. = ..()
open_machine()
update_icon()
/obj/machinery/hypnochair/attackby(obj/item/I, mob/user, params)
if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))
update_icon()
return
if(default_pry_open(I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/hypnochair/ui_state(mob/user)
return GLOB.notcontained_state
/obj/machinery/hypnochair/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "HypnoChair", name)
ui.open()
/obj/machinery/hypnochair/ui_data()
var/list/data = list()
data["occupied"] = occupant ? 1 : 0
data["open"] = state_open
data["interrogating"] = interrogating
data["occupant"] = list()
if(occupant)
var/mob/living/mob_occupant = occupant
data["occupant"]["name"] = mob_occupant.name
data["occupant"]["stat"] = mob_occupant.stat
data["trigger"] = trigger_phrase
return data
/obj/machinery/hypnochair/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("door")
if(state_open)
close_machine()
else
if(!interrogating)
open_machine()
. = TRUE
if("set_phrase")
set_phrase(params["phrase"])
. = TRUE
if("interrogate")
if(!interrogating)
interrogate()
else
interrupt_interrogation()
. = TRUE
/obj/machinery/hypnochair/proc/set_phrase(phrase)
trigger_phrase = phrase
/obj/machinery/hypnochair/proc/interrogate()
if(!trigger_phrase)
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE)
return
var/mob/living/carbon/C = occupant
if(!istype(C))
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE)
return
victim = C
if(!(C.get_eye_protection() > 0))
to_chat(C, "<span class='warning'>Strobing coloured lights assault you relentlessly! You're losing your ability to think straight!</span>")
C.become_blind("hypnochair")
ADD_TRAIT(C, TRAIT_DEAF, "hypnochair")
interrogating = TRUE
START_PROCESSING(SSobj, src)
start_time = world.time
update_icon()
timerid = addtimer(CALLBACK(src, .proc/finish_interrogation), 450, TIMER_STOPPABLE)
/obj/machinery/hypnochair/process()
var/mob/living/carbon/C = occupant
if(!istype(C) || C != victim)
interrupt_interrogation()
return
if(prob(10) && !(C.get_eye_protection() > 0))
to_chat(C, "<span class='hypnophrase'>[pick(\
"...blue... red... green... blue, red, green, blueredgreen<span class='small'>blueredgreen</span>",\
"...pretty colors...",\
"...you keep hearing words, but you can't seem to understand them...",\
"...so peaceful...",\
"...an annoying buzz in your ears..."\
)]</span>")
/obj/machinery/hypnochair/proc/finish_interrogation()
interrogating = FALSE
STOP_PROCESSING(SSobj, src)
update_icon()
var/temp_trigger = trigger_phrase
trigger_phrase = "" //Erase evidence, in case the subject is able to look at the panel afterwards
audible_message("<span class='notice'>[src] pings!</span>")
playsound(src, 'sound/machines/ping.ogg', 30, TRUE)
if(QDELETED(victim) || victim != occupant)
victim = null
return
victim.cure_blind("hypnochair")
REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair")
if(!(victim.get_eye_protection() > 0))
victim.cure_trauma_type(/datum/brain_trauma/severe/hypnotic_trigger, TRAUMA_RESILIENCE_SURGERY)
if(prob(90))
victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_trigger(temp_trigger), TRAUMA_RESILIENCE_SURGERY)
else
victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_stupor(), TRAUMA_RESILIENCE_SURGERY)
victim = null
/obj/machinery/hypnochair/proc/interrupt_interrogation()
deltimer(timerid)
interrogating = FALSE
STOP_PROCESSING(SSobj, src)
update_icon()
if(QDELETED(victim))
victim = null
return
victim.cure_blind("hypnochair")
REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair")
if(!(victim.get_eye_protection() > 0))
var/time_diff = world.time - start_time
switch(time_diff)
if(0 to 100)
victim.confused += 10
victim.Dizzy(100)
victim.blur_eyes(5)
if(101 to 200)
victim.confused += 15
victim.Dizzy(200)
victim.blur_eyes(10)
if(prob(25))
victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE)
if(201 to INFINITY)
victim.confused += 20
victim.Dizzy(300)
victim.blur_eyes(15)
if(prob(65))
victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE)
victim = null
/obj/machinery/hypnochair/update_icon_state()
icon_state = initial(icon_state)
if(state_open)
icon_state += "_open"
if(occupant)
if(interrogating)
icon_state += "_active"
else
icon_state += "_occupied"
/obj/machinery/hypnochair/container_resist_act(mob/living/user)
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("<span class='notice'>You see [user] kicking against the door of [src]!</span>", \
"<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)</span>", \
"<span class='hear'>You hear a metallic creaking from [src].</span>")
if(do_after(user,(600), target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
return
user.visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>", \
"<span class='notice'>You successfully break out of [src]!</span>")
open_machine()
/obj/machinery/hypnochair/relaymove(mob/living/user, direction)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
to_chat(user, "<span class='warning'>[src]'s door won't budge!</span>")
/obj/machinery/hypnochair/MouseDrop_T(mob/target, mob/user)
if(HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser())
return
close_machine(target)