-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
nightmare_organs.dm
106 lines (90 loc) · 3.87 KB
/
nightmare_organs.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
/// How many life ticks are required for the nightmare's heart to revive the nightmare.
#define HEART_RESPAWN_THRESHHOLD (80 SECONDS)
/// A special flag value used to make a nightmare heart not grant a light eater. Appears to be unused.
#define HEART_SPECIAL_SHADOWIFY 2
/obj/item/organ/brain/nightmare
name = "tumorous mass"
desc = "A fleshy growth that was dug out of the skull of a Nightmare."
icon_state = "brain-x-d"
var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk
/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = FALSE)
. = ..()
if(M.dna.species.id != SPECIES_NIGHTMARE)
M.set_species(/datum/species/shadow/nightmare)
visible_message(span_warning("[M] thrashes as [src] takes root in [M.p_their()] body!"))
var/obj/effect/proc_holder/spell/targeted/shadowwalk/SW = new
M.AddSpell(SW)
shadowwalk = SW
/obj/item/organ/brain/nightmare/Remove(mob/living/carbon/M, special = FALSE)
if(shadowwalk)
M.RemoveSpell(shadowwalk)
return ..()
/obj/item/organ/heart/nightmare
name = "heart of darkness"
desc = "An alien organ that twists and writhes when exposed to light."
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart-on"
color = "#1C1C1C"
decay_factor = 0
/// How many life ticks in the dark the owner has been dead for. Used for nightmare respawns.
var/respawn_progress = 0
/// The armblade granted to the host of this heart.
var/obj/item/light_eater/blade
/obj/item/organ/heart/nightmare/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_blocker)
/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target)
if(M != user)
return ..()
user.visible_message(
span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"),
span_danger("[src] feels unnaturally cold in your hands. You raise [src] your mouth and devour it!")
)
playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE)
user.visible_message(
span_warning("Blood erupts from [user]'s arm as it reforms into a weapon!"),
span_userdanger("Icy blood pumps through your veins as your arm reforms itself!")
)
user.temporarilyRemoveItemFromInventory(src, TRUE)
Insert(user)
/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = FALSE)
. = ..()
if(special != HEART_SPECIAL_SHADOWIFY)
blade = new/obj/item/light_eater
M.put_in_hands(blade)
/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = FALSE)
respawn_progress = 0
if(blade && special != HEART_SPECIAL_SHADOWIFY)
M.visible_message(span_warning("\The [blade] disintegrates!"))
QDEL_NULL(blade)
return ..()
/obj/item/organ/heart/nightmare/Stop()
return 0
/obj/item/organ/heart/nightmare/on_death(delta_time, times_fired)
if(!owner)
return
var/turf/T = get_turf(owner)
if(istype(T))
var/light_amount = T.get_lumcount()
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
respawn_progress += delta_time SECONDS
playsound(owner, 'sound/effects/singlebeat.ogg', 40, TRUE)
if(respawn_progress < HEART_RESPAWN_THRESHHOLD)
return
owner.revive(full_heal = TRUE, admin_revive = FALSE)
if(!(owner.dna.species.id == SPECIES_SHADOW || owner.dna.species.id == SPECIES_NIGHTMARE))
var/mob/living/carbon/old_owner = owner
Remove(owner, HEART_SPECIAL_SHADOWIFY)
old_owner.set_species(/datum/species/shadow)
Insert(old_owner, HEART_SPECIAL_SHADOWIFY)
to_chat(owner, span_userdanger("You feel the shadows invade your skin, leaping into the center of your chest! You're alive!"))
SEND_SOUND(owner, sound('sound/effects/ghost.ogg'))
owner.visible_message(span_warning("[owner] staggers to [owner.p_their()] feet!"))
playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, TRUE)
respawn_progress = 0
/obj/item/organ/heart/nightmare/get_availability(datum/species/S)
if(istype(S,/datum/species/shadow/nightmare))
return TRUE
return ..()
#undef HEART_SPECIAL_SHADOWIFY
#undef HEART_RESPAWN_THRESHHOLD