-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathbloodsucker_mobs.dm
303 lines (279 loc) · 9.85 KB
/
bloodsucker_mobs.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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
/mob/living/simple_animal/hostile/bloodsucker
icon = 'icons/mob/bloodsucker_mobs.dmi'
melee_damage_lower = 20
melee_damage_upper = 20
see_in_dark = 10
speak_chance = 0
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = FALSE
movement_type = GROUND
attack_sound = 'sound/weapons/slash.ogg'
faction = list("hostile", "bloodhungry")
response_help = "touches"
response_disarm = "flails at"
response_harm = "punches"
var/mob/living/bloodsucker
/mob/living/simple_animal/hostile/bloodsucker/werewolf
name = "werewolf"
desc = "Who could imagine this things 'were' actually real?"
icon_state = "wolfform"
icon_living = "wolfform"
icon_dead = "wolf_dead"
icon_gib = "wolf_dead"
speed = -1.5
maxHealth = 450
health = 450
melee_damage_lower = 20
melee_damage_upper = 25
attacktext = "violently mauls"
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
obj_damage = 50
environment_smash = ENVIRONMENT_SMASH_WALLS
speak_emote = list("gnashes")
del_on_death = TRUE
var/satiation = 0
/mob/living/simple_animal/hostile/bloodsucker/giantbat
name = "giant bat"
desc = "That's a fat ass bat."
icon_state = "batform"
icon_living = "batform"
icon_dead = "bat_dead"
icon_gib = "bat_dead"
maxHealth = 350
health = 350
attacktext = "bites"
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
attack_sound = 'sound/weapons/bite.ogg'
obj_damage = 35
pass_flags = PASSTABLE | PASSCOMPUTER
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
movement_type = FLYING
speak_emote = list("loudly squeaks")
/mob/living/simple_animal/hostile/bloodsucker/possessedarmor
name = "possessed armor"
desc = "Whatever possessed this suit of armor to suddenly walk about and start killing everyone?"
icon_state = "posarmor"
icon_living = "posarmor"
response_help = "pokes"
response_disarm = "pushes"
response_harm = "punches"
faction = list("hostile", "bloodhungry")
maxHealth = 250
health = 250
attacktext = "rends"
obj_damage = 50
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
speak_emote = list("manifests")
var/upgraded = FALSE
/mob/living/simple_animal/hostile/bloodsucker/possessedarmor/upgraded
name = "armed possessed armor"
icon_state = "posarmor_sword"
icon_living = "posarmor_sword"
upgraded = TRUE
obj_damage = 55
melee_damage_lower = 25
melee_damage_upper = 25
/////////////////////////////////////////////////////
/// TZIMISCE BLOODSUCKER MOBS ///
/////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/bloodsucker/tzimisce
/mob/living/simple_animal/hostile/bloodsucker/tzimisce/triplechest
name = "gigantic monstrosity"
desc = "You wouldn't think a being so messed up like this would be able to even breathe."
icon_state = "triplechest"
icon_living = "triplechest"
icon_dead = "triplechest_dead"
speed = 1
maxHealth = 175
health = 175
environment_smash = ENVIRONMENT_SMASH_WALLS
melee_damage_lower = 25
melee_damage_upper = 25
obj_damage = 50
/mob/living/simple_animal/hostile/bloodsucker/tzimisce/calcium
name = "boney monstrosity"
desc = "Heretical being beyond comprehesion, now with bones free of charge!"
icon_state = "calcium"
icon_living = "calcium"
icon_dead = "calcium_dead"
speed = -1
maxHealth = 110
health = 110
mob_size = MOB_SIZE_SMALL
ventcrawler = VENTCRAWLER_ALWAYS
melee_damage_lower = 7
melee_damage_upper = 7
obj_damage = 20
/mob/living/simple_animal/hostile/bloodsucker/tzimisce/armmy
name = "tiny monstrosity"
desc = "Is that a head?!"
icon_state = "armmy"
icon_living = "armmy"
icon_dead = "armmy_dead"
speed = -2
maxHealth = 75
health = 75
mob_size = MOB_SIZE_TINY
ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE
melee_damage_lower = 5
melee_damage_upper = 5
attack_sound = 'sound/weapons/bite.ogg'
obj_damage = 10
///////////////////////////////
/// Inheritances ///
///////////////////////////////
/mob/living/simple_animal/hostile/bloodsucker/Destroy() //makes us alive again
if(bloodsucker && mind)
visible_message(span_warning("[src] rapidly transforms into a humanoid figure!"), span_warning("You forcefully return to your normal form."))
playsound(src, 'sound/weapons/slash.ogg', 50, TRUE)
mind.transfer_to(bloodsucker)
if(bloodsucker.status_flags & GODMODE)
bloodsucker.status_flags -= GODMODE
bloodsucker.forceMove(get_turf(src))
if(istype(src, /mob/living/simple_animal/hostile/bloodsucker/possessedarmor))
STOP_PROCESSING(SSprocessing, src)
return ..()
/mob/living/simple_animal/hostile/bloodsucker/death()
. = ..()
if(bloodsucker && mind)
mind.transfer_to(bloodsucker)
if(bloodsucker.status_flags & GODMODE)
bloodsucker.status_flags -= GODMODE
bloodsucker.adjustBruteLoss(200)
/mob/living/simple_animal/hostile/bloodsucker/proc/devour(mob/living/target)
if(maxHealth > target.maxHealth / 4 + health)
health += target.maxHealth / 4
else
health += maxHealth - health
var/mob/living/carbon/human/H = target
var/foundorgans = 0
for(var/obj/item/organ/O in H.internal_organs)
if(O.zone == "chest")
foundorgans++
qdel(O)
if(foundorgans)
if(istype(src, /mob/living/simple_animal/hostile/bloodsucker/werewolf))
var/mob/living/simple_animal/hostile/bloodsucker/werewolf/ww = src
ww.satiation++
src.visible_message(span_danger("[src] devours [target]'s organs!"), \
span_userdanger("As you devour [target]'s organs you feel as if the beast inside you has calmed itself down, you'll need to feast [3 - ww.satiation] more times to become human again."))
for(var/obj/item/bodypart/B in H.bodyparts)
if(B.body_zone == "chest")
B.dismember()
else
to_chat(src, span_warning("There are no organs left in this corpse."))
///////////////////////////
/// Tzimisce ///
///////////////////////////
////////////////////////////
/// Werewolf ///
///////////////////////////
/mob/living/simple_animal/hostile/bloodsucker/werewolf/Life(delta_time = (SSmobs.wait/10), times_fired)
. = ..()
if(bloodsucker)
if(ishuman(bloodsucker))
var/mob/living/carbon/human/user = bloodsucker
var/datum/antagonist/bloodsucker/bloodsuckerdatum = src.mind.has_antag_datum(/datum/antagonist/bloodsucker)
if(user.blood_volume < FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10)
user.blood_volume += 10
adjustFireLoss(2.5)
updatehealth() //3 minutes to die
if(satiation >= 3)
to_chat(src, span_notice("It has been fed. You turn back to normal."))
qdel(src)
return
/mob/living/simple_animal/hostile/bloodsucker/werewolf/Destroy()
. = ..()
if(ishuman(bloodsucker))
var/mob/living/carbon/human/user = bloodsucker
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker)
var/datum/species/user_species = user.dna.species
var/mutation = ""
var/slot = ""
var/additionalmessage = ""
bloodsuckerdatum.clanprogress++
switch(bloodsuckerdatum.clanprogress)
if(1)
additionalmessage = "You have mutated a collar made out of fur!"
user_species.armor += 10
mutation = /obj/item/clothing/neck/wolfcollar
slot = ITEM_SLOT_NECK
if(2)
additionalmessage = "You have mutated werewolf ears!"
mutation = /obj/item/radio/headset/wolfears
slot = ITEM_SLOT_EARS
if(3)
additionalmessage = "You have mutated werewolf claws!"
user.physiology.punchdamagehigh_bonus += 2.5
user.physiology.punchdamagelow_bonus += 2.5
mutation = /obj/item/clothing/gloves/wolfclaws
slot = ITEM_SLOT_GLOVES
if(4)
additionalmessage = "You have mutated werewolf legs!"
mutation = /obj/item/clothing/shoes/wolflegs
slot = ITEM_SLOT_FEET
if(HAS_TRAIT(user, TRAIT_DIGITIGRADE))
mutation = /obj/item/clothing/shoes/xeno_wraps/wolfdigilegs
if(5 to INFINITY)
to_chat(user, span_danger("The beast inside of you seems satisfied with your current form."))
return
to_chat(user, span_danger("After returning to normal, you feel strange. [additionalmessage]"))
var/obj/item/pastdrip = user.get_item_by_slot(slot)
user.dropItemToGround(pastdrip)
user.equip_to_slot_or_del(new mutation(user), slot)
////////////////////////
/// Armor ///
////////////////////////
/mob/living/simple_animal/hostile/bloodsucker/possessedarmor/ListTargets()
. = ..()
for(var/mob/living/carbon/letsnotmeet in .)
if(!istype(letsnotmeet))
continue
if(IS_BLOODSUCKER(letsnotmeet) || IS_VASSAL(letsnotmeet)) //don't attack our owners!
. -= letsnotmeet
if(letsnotmeet.restrained()) //or any guests!
. -= letsnotmeet
/mob/living/simple_animal/hostile/bloodsucker/possessedarmor/death()
. = ..()
if(upgraded)
new /obj/structure/bloodsucker/possessedarmor/upgraded(src.loc)
else
new /obj/structure/bloodsucker/possessedarmor(src.loc)
qdel(src)
//Wraith - Hecata mob
/mob/living/simple_animal/hostile/bloodsucker/wraith
name = "wraith"
real_name = "Wraith"
desc = "An angry, tormented spirit, which looks to let out its wrath on whoever is nearby."
gender = PLURAL
icon_state = "wraith"
icon_living = "wraith"
mob_biotypes = list(MOB_SPIRIT)
maxHealth = 30
health = 30
spacewalk = TRUE
healable = 0
speak_emote = list("hisses")
emote_hear = list("wails.","screeches.")
response_help = "puts their hand through"
response_disarm = "flails at"
response_harm = "punches"
speak_chance = 1
melee_damage_lower = 6
melee_damage_upper = 6
attacktext = "torments"
minbodytemp = 0
maxbodytemp = INFINITY
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
status_flags = 0
status_flags = CANPUSH
movement_type = FLYING
loot = list(/obj/item/ectoplasm)
deathmessage = "withers away into nothing."
/mob/living/simple_animal/hostile/bloodsucker/wraith/Initialize(mapload)
. = ..()
AddElement(/datum/element/life_draining)
/mob/living/simple_animal/hostile/bloodsucker/wraith/death()
qdel(src) //Del on death for some reason doesn't work, might be due to previous code preventing it for /bloodsucker mobs.
..()