-
-
Notifications
You must be signed in to change notification settings - Fork 452
/
organs.dm
150 lines (125 loc) · 4.88 KB
/
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
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
/obj/item/organ/zombie_infection
name = "festering ooze"
desc = "A black web of pus and viscera."
zone = BODY_ZONE_HEAD
slot = ORGAN_SLOT_ZOMBIE
icon_state = "blacktumor"
visual = FALSE
var/causes_damage = TRUE
var/datum/species/old_species = /datum/species/human
var/living_transformation_time = 30
var/converts_living = FALSE
var/revive_time_min = 450
var/revive_time_max = 700
var/timer_id
///damage dealt per second
var/damage_caused = 0.5
/obj/item/organ/zombie_infection/Initialize(mapload)
. = ..()
if(iscarbon(loc))
Insert(loc)
GLOB.zombie_infection_list += src
/obj/item/organ/zombie_infection/Destroy()
GLOB.zombie_infection_list -= src
. = ..()
/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0)
. = ..()
STOP_PROCESSING(SSobj, src)
if(iszombie(M) && old_species)
M.set_species(old_species)
if(timer_id)
deltimer(timer_id)
/obj/item/organ/zombie_infection/on_find(mob/living/finder)
to_chat(finder, "<span class='warning'>Inside the head is a disgusting black \
web of pus and viscera, bound tightly around the brain like some \
biological harness.</span>")
/obj/item/organ/zombie_infection/process(delta_time)
if(!owner)
return
if(!(src in owner.internal_organs))
Remove(owner)
if (causes_damage && !iszombie(owner) && owner.stat != DEAD)
if(owner.dna.species.id == "pod")
owner.adjustToxLoss((damage_caused + 0.25) * delta_time) //So they cant passively out-heal it
else
owner.adjustToxLoss(damage_caused * delta_time)
if(DT_PROB(5, delta_time))
to_chat(owner, span_danger("You feel sick..."))
if(timer_id)
return
if(owner.suiciding)
return
if(owner.stat != DEAD && !converts_living)
return
if(!owner.getorgan(/obj/item/organ/brain))
return
if(isipc(owner))
return
if(!iszombie(owner))
to_chat(owner, "<span class='cultlarge'>You can feel your heart stopping, but something isn't right... \
life has not abandoned your broken form. You can only feel a deep and immutable hunger that \
not even death can stop, you will rise again!</span>")
var/revive_time = rand(revive_time_min, revive_time_max)
var/flags = TIMER_STOPPABLE
timer_id = addtimer(CALLBACK(src, PROC_REF(zombify)), revive_time, flags)
/obj/item/organ/zombie_infection/proc/zombify()
timer_id = null
owner.grab_ghost()
if(!converts_living && owner.stat != DEAD)
return
if(!iszombie(owner))
old_species = owner.dna.species.type
owner.set_species(/datum/species/zombie/infectious)
to_chat(owner, span_alertalien("You are now a zombie!"))
else
to_chat(owner, span_alertalien("You rise again!"))
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
//Fully heal the zombie's damage the first time they rise
owner.setToxLoss(0, 0)
owner.setOxyLoss(0, 0)
owner.setCloneLoss(0, 0)
owner.heal_overall_damage(INFINITY, INFINITY, INFINITY, null, TRUE)
owner.revive()
owner.visible_message(span_danger("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!"), span_alien("You HUNGER!"))
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
/obj/item/organ/zombie_infection/nodamage
causes_damage = FALSE
/obj/item/organ/zombie_infection/gamemode
damage_caused = 3
/obj/item/organ/zombie_infection/gamemode/zombify()
timer_id = null
owner.grab_ghost()
if(!converts_living && owner.stat != DEAD)
return
if(!iszombie(owner))
old_species = owner.dna.species.type
owner.set_species(/datum/species/zombie/infectious/gamemode)
to_chat(owner, span_alertalien("You are now a zombie! Help your fellow allies take over the station!"))
else
to_chat(owner, span_alertalien("You rise again!"))
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
//Fully heal the zombie's damage the first time they rise
owner.setToxLoss(0, 0)
owner.setOxyLoss(0, 0)
owner.heal_overall_damage(INFINITY, INFINITY, INFINITY, null, TRUE)
owner.revive()
owner.visible_message(span_danger("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!"), span_alien("You HUNGER!"))
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
if(!isinfected(owner)) //Makes them the *actual* antag, instead of just a zombie.
var/datum/game_mode/zombie/GM = SSticker.mode
if(!istype(GM))
return
GM.add_zombie(owner.mind)
// var/datum/antagonist/zombie/Z = locate() in owner.mind.antag_datums
// if(!Z.evolution.owner)
// Z.evolution.Grant(owner)
if(owner.handcuffed)
var/obj/O = owner.get_item_by_slot(ITEM_SLOT_HANDCUFFED)
qdel(O)