-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathdrowsiness.dm
42 lines (33 loc) · 1.32 KB
/
drowsiness.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
/datum/status_effect/drowsiness
id = "drowsiness"
tick_interval = 2 SECONDS
alert_type = null
remove_on_fullheal = TRUE
/datum/status_effect/drowsiness/on_creation(mob/living/new_owner, duration = 10 SECONDS)
src.duration = duration
return ..()
/datum/status_effect/drowsiness/on_apply()
if(HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE) || !(owner.status_flags & CANUNCONSCIOUS))
return FALSE
// Do robots dream of electric sheep?
if(issilicon(owner))
return FALSE
RegisterSignal(owner, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(on_face_clean))
return TRUE
/datum/status_effect/drowsiness/on_remove()
UnregisterSignal(owner, COMSIG_COMPONENT_CLEAN_FACE_ACT)
/// Signal proc for [COMSIG_COMPONENT_CLEAN_FACE_ACT]. When we wash our face, reduce drowsiness by a bit.
/datum/status_effect/drowsiness/proc/on_face_clean(datum/source)
SIGNAL_HANDLER
remove_duration(rand(4 SECONDS, 6 SECONDS))
/datum/status_effect/drowsiness/tick(delta_time)
// You do not feel drowsy while unconscious or in stasis
if(owner.stat >= UNCONSCIOUS || IS_IN_STASIS(owner))
return
// Resting helps against drowsiness
// While resting, we lose 4 seconds of duration (2 additional ticks) per tick
if(owner.resting && remove_duration(2 * initial(tick_interval)))
return
owner.adjust_eye_blur(4 SECONDS)
if(prob(5))
owner.AdjustSleeping(10 SECONDS)