mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
Necromorph and zombies are now friends (#32798)
* necromorph * other files * fix for quick reviving * bugfix * Update necro.dm * Update necro.dm
This commit is contained in:
@@ -112,7 +112,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
/mob/living/simple_animal/hostile/lizard/can_ventcrawl()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/can_ventcrawl()
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/can_ventcrawl()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/shade/can_ventcrawl()
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
var/static/list/possible_types = list(
|
||||
/mob/living/simple_animal/construct/armoured,
|
||||
/mob/living/simple_animal/hostile/gremlin,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath,
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse/queen_spider,
|
||||
/mob/living/simple_animal/hostile/retaliate/cockatrice,
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
max_number = 6
|
||||
monsterstring = "a synthetic covering"
|
||||
if(MONSTER_ZOMBIE)
|
||||
spawn_monster_type = pick(/mob/living/simple_animal/hostile/necro/zombie, /mob/living/simple_animal/hostile/necromorph, /mob/living/simple_animal/hostile/necromorph/leaper, /mob/living/simple_animal/hostile/necromorph/puker)
|
||||
spawn_monster_type = pick(/mob/living/simple_animal/hostile/necro/zombie, /mob/living/simple_animal/hostile/necro/necromorph, /mob/living/simple_animal/hostile/necro/necromorph/leaper, /mob/living/simple_animal/hostile/necro/necromorph/puker)
|
||||
max_number = 3
|
||||
monsterstring = "extreme decay"
|
||||
if(MONSTER_SKRITE)
|
||||
|
||||
@@ -4,6 +4,16 @@
|
||||
faction = "necro"
|
||||
mob_property_flags = MOB_UNDEAD
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/New(loc, mob/living/Owner, var/mob/living/Victim, datum/mind/Controller)
|
||||
..()
|
||||
if(Victim && Victim.mind)
|
||||
@@ -16,20 +26,8 @@
|
||||
friends += makeweakref(Owner)
|
||||
creator = Owner
|
||||
if(client)
|
||||
to_chat(src, "<big><span class='warning'>You have been risen from the dead by your new master, [Owner]. Do his bidding so long as he lives, for when he falls so do you.</span></big>")
|
||||
/*
|
||||
var/ref = "\ref[Owner.mind]"
|
||||
var/list/necromancers
|
||||
if(!(Owner.mind in ticker.mode.necromancer))
|
||||
ticker.mode:necromancer[ref] = list()
|
||||
necromancers = ticker.mode:necromancer[ref]
|
||||
necromancers.Add(Victim.mind)
|
||||
ticker.mode:necromancer[ref] = necromancers
|
||||
ticker.mode.update_necro_icons_added(Owner.mind)
|
||||
ticker.mode.update_necro_icons_added(Victim.mind)
|
||||
ticker.mode.update_all_necro_icons()
|
||||
ticker.mode.risen.Add(Victim.mind)
|
||||
*/
|
||||
to_chat(src, "<big><span class='warning'>You have been risen from the dead by your new master, [Owner].</span></big>")
|
||||
|
||||
if(name == initial(name) && !unique_name)
|
||||
name += " ([rand(1,1000)])"
|
||||
|
||||
@@ -74,7 +72,6 @@
|
||||
to_chat(user, "<span class='notice'>You devour \the [src]!</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/meat_ghoul/death(var/gibbed = FALSE)
|
||||
..(gibbed)
|
||||
new /obj/effect/decal/cleanable/ash(loc)
|
||||
@@ -115,7 +112,6 @@
|
||||
name = "[aGhoul.name] ghoul"
|
||||
desc = "A ghoulish [aGhoul.name]."
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/animal_ghoul/death(var/gibbed = FALSE)
|
||||
..(gibbed)
|
||||
new /obj/effect/decal/cleanable/ash(loc)
|
||||
@@ -147,28 +143,12 @@
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
environment_smash_flags = SMASH_LIGHT_STRUCTURES | SMASH_CONTAINERS | OPEN_DOOR_WEAK | OPEN_DOOR_SMART
|
||||
meat_type = null
|
||||
/*
|
||||
#define EVOLVING 1
|
||||
#define MOVING_TO_TARGET 2
|
||||
#define EATING 3
|
||||
#define OPENING_DOOR 4
|
||||
#define SMASHING_LIGHT 5*/
|
||||
|
||||
#define MAX_EAT_MULTIPLIER 4 //Dead for humans is -maxHealth, uncloneable is -maxHealth * 2
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/zombie //Boring ol default zombie
|
||||
/mob/living/simple_animal/hostile/necro/zombie
|
||||
name = "zombie"
|
||||
desc = "A reanimated corpse that looks like it has seen better days."
|
||||
icon_state = "zombie"
|
||||
@@ -186,9 +166,8 @@
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
canRegenerate = 1
|
||||
minRegenTime = 300
|
||||
maxRegenTime = 1800
|
||||
|
||||
minRegenTime = 30 SECONDS
|
||||
maxRegenTime = 120 SECONDS
|
||||
|
||||
harm_intent_damage = 15
|
||||
melee_damage_lower = 10
|
||||
@@ -197,16 +176,6 @@
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
stat_attack = DEAD
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
var/times_revived //Tracks how many times the zombie has regenerated from death
|
||||
var/times_eaten //Tracks how many times the zombie has chewed on a human corpse
|
||||
var/can_evolve = FALSE //False if we don't want it to evolve
|
||||
@@ -370,7 +339,6 @@
|
||||
eat(A)
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/zombie/Destroy()
|
||||
|
||||
for(var/obj/item/I in clothing)
|
||||
I.forceMove(get_turf(src))
|
||||
clothing.Remove(I)
|
||||
@@ -601,7 +569,6 @@
|
||||
environment_smash_flags = SMASH_LIGHT_STRUCTURES | SMASH_CONTAINERS | OPEN_DOOR_WEAK
|
||||
|
||||
///////////////// GHOULS ////////////////////
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/zombie/ghoul
|
||||
name = "ghoul"
|
||||
icon_state = "ghoul"
|
||||
@@ -746,4 +713,179 @@
|
||||
return ..(reverse_text(message))
|
||||
|
||||
|
||||
/*Necromorphs
|
||||
4 types
|
||||
Slasher, melee based, simple mobs
|
||||
Leaper, melee based, high mobility, latch onto foes, hide in vents
|
||||
Puker, semi-ranged based, vomits a highly corrosive cone of acid forwards towards its victims
|
||||
Exploder, melee based, steady shuffle towards a target before exploding. Explodes on death
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/necro/necromorph
|
||||
name = "necromorph"
|
||||
desc = "A twisted husk of what was once human, repurposed to kill."
|
||||
speak_emote = list("roars")
|
||||
icon = 'icons/mob/monster_big.dmi'
|
||||
icon_state = "nmorph_standard"
|
||||
icon_living = "nmorph_standard"
|
||||
icon_dead = "nmorph_dead"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 50
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
faction = "marker"
|
||||
speed = 5
|
||||
size = SIZE_BIG
|
||||
move_to_delay = 4
|
||||
canRegenerate = 1
|
||||
minRegenTime = 30 SECONDS
|
||||
maxRegenTime = 60 SECONDS
|
||||
environment_smash_flags = SMASH_LIGHT_STRUCTURES | SMASH_CONTAINERS | OPEN_DOOR_STRONG | OPEN_DOOR_SMART
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper
|
||||
desc = "A twisted husk of what was once human. Sporting razor-sharp fangs, along with a long scythe-tipped tail."
|
||||
icon_state = "nmorph_leaper"
|
||||
icon_living = "nmorph_leaper"
|
||||
icon_dead = "nmorph_leaper_dead"
|
||||
speed = 1
|
||||
health = 45
|
||||
maxHealth = 45
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
ranged = 1
|
||||
ranged_cooldown_cap = 8
|
||||
ranged_message = "leaps"
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/Shoot(var/atom/target, var/atom/start, var/mob/user, var/bullet = 0)
|
||||
if(locked_to)
|
||||
return 0
|
||||
|
||||
src.throw_at(get_turf(target),7,1)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/to_bump(atom/A)
|
||||
if(throwing && isliving(A) && CanAttack(A))
|
||||
attach(A)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/Life()
|
||||
update_climb()
|
||||
if(!isUnconscious())
|
||||
if(stance == HOSTILE_STANCE_IDLE && !client)
|
||||
var/list/can_see = view(get_turf(src), vision_range/2) //Nothing too close for comfort
|
||||
var/all_clear = 1
|
||||
for(var/mob/living/L in can_see)
|
||||
if(!istype(L, /mob/living/simple_animal/hostile/necro/necromorph) && !(L.isDead()))
|
||||
all_clear = 0
|
||||
if(!istype(loc, /obj/machinery/atmospherics/unary/vent_pump) && istype(loc, /turf) && all_clear)
|
||||
stop_automated_movement = 0
|
||||
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in can_see)
|
||||
if(Adjacent(vent))
|
||||
//Climb in
|
||||
visible_message("<span class = 'warning'>\The [src] starts climbing into \the [vent]!</span>")
|
||||
forceMove(vent)
|
||||
stop_automated_movement = 1
|
||||
break
|
||||
else
|
||||
if(prob(30))
|
||||
step_towards(src, vent)//Step towards it
|
||||
if(environment_smash_flags & SMASH_LIGHT_STRUCTURES)
|
||||
EscapeConfinement()
|
||||
break
|
||||
|
||||
else if(istype(loc, /obj/machinery/atmospherics/unary/vent_pump) && !all_clear)
|
||||
loc.visible_message("<span class = 'warning'>\The [src] clambers out of \the [loc]!</span>")
|
||||
forceMove(get_turf(loc))
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/verb/ventcrawl()
|
||||
set name = "Crawl through Vent"
|
||||
set desc = "Enter an air vent and crawl through the pipe system."
|
||||
set category = "Object"
|
||||
var/pipe = start_ventcrawl()
|
||||
if(pipe)
|
||||
handle_ventcrawl(pipe)
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/proc/update_climb()
|
||||
var/mob/living/L = locked_to
|
||||
|
||||
if(!istype(L))
|
||||
return
|
||||
|
||||
if(incapacitated())
|
||||
return detach()
|
||||
|
||||
if(!CanAttack(L))
|
||||
return detach()
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/proc/detach()
|
||||
unlock_from()
|
||||
|
||||
pixel_x = initial(pixel_x)
|
||||
pixel_y = initial(pixel_y)
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/proc/attach(mob/living/victim)
|
||||
victim.lock_atom(src, /datum/locking_category/)
|
||||
victim.visible_message("<span class = 'warning'>\The [src] latches onto \the [victim]!</span>","<span class = 'userdanger'>\The [src] latches onto you!</span>")
|
||||
|
||||
pixel_x = rand(-8,8) * PIXEL_MULTIPLIER
|
||||
pixel_y = rand(0,16) * PIXEL_MULTIPLIER
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/AttackingTarget()
|
||||
.=..()
|
||||
|
||||
if(locked_to == target && isliving(target))
|
||||
var/mob/living/L = target
|
||||
|
||||
if(prob(10))
|
||||
to_chat(L, "<span class='userdanger'>\The [src] throws you to the ground!</span>")
|
||||
var/incapacitation_duration = rand(2, 5)
|
||||
L.Knockdown(incapacitation_duration)
|
||||
L.Stun(incapacitation_duration)
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper/adjustBruteLoss(amount)
|
||||
.=..()
|
||||
|
||||
if(locked_to && prob(amount * 5))
|
||||
detach()
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/exploder
|
||||
desc = "A twisted husk of what was once human. A large glowing pustule attached to their left arm."
|
||||
icon_state = "nmorph_exploder"
|
||||
icon_living = "nmorph_exploder"
|
||||
icon_dead = ""
|
||||
health = 30
|
||||
maxHealth = 30
|
||||
speed = 2
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/exploder/AttackingTarget()
|
||||
visible_message("<span class='warning'>\The [src] hits \the [target] with their left arm!</span>")
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/exploder/death(var/gibbed = FALSE)
|
||||
..(TRUE)
|
||||
visible_message("<span class='warning'>\The [src] explodes!</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/effect/gibspawner/generic(T)
|
||||
qdel(src)
|
||||
explosion(T, -1, 1, 4, whodunnit = src)
|
||||
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/puker
|
||||
desc = "A twisted, engorged husk of what was once human. It reeks of stomach acid."
|
||||
icon_state = "nmorph_puker"
|
||||
icon_living = "nmorph_puker"
|
||||
icon_dead = "nmorph_puker_dead"
|
||||
|
||||
ranged = 1
|
||||
ranged_cooldown_cap = 20
|
||||
projectiletype = /obj/item/projectile/puke
|
||||
ranged_message = "pukes"
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
@@ -1,240 +0,0 @@
|
||||
/*Necromorphs
|
||||
4 types
|
||||
Slasher, melee based, simple mobs
|
||||
Leaper, melee based, high mobility, latch onto foes, hide in vents
|
||||
Puker, semi-ranged based, vomits a highly corrosive cone of acid forwards towards its victims
|
||||
Exploder, melee based, steady shuffle towards a target before exploding. Explodes on death
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/necromorph
|
||||
name = "necromorph"
|
||||
desc = "A twisted husk of what was once human, repurposed to kill."
|
||||
speak_emote = list("roars")
|
||||
icon = 'icons/mob/monster_big.dmi'
|
||||
icon_state = "nmorph_standard"
|
||||
icon_living = "nmorph_standard"
|
||||
icon_dead = "nmorph_dead"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 50
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
faction = "marker"
|
||||
speed = 5
|
||||
size = SIZE_BIG
|
||||
move_to_delay = 4
|
||||
canRegenerate = 1
|
||||
minRegenTime = 300
|
||||
maxRegenTime = 1200
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper
|
||||
desc = "A twisted husk of what was once human. Sporting razor-sharp fangs, along with a long scythe-tipped tail."
|
||||
icon_state = "nmorph_leaper"
|
||||
icon_living = "nmorph_leaper"
|
||||
icon_dead = "nmorph_leaper_dead"
|
||||
speed = 1
|
||||
health = 45
|
||||
maxHealth = 45
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
minRegenTime = 240
|
||||
maxRegenTime = 600
|
||||
|
||||
ranged = 1
|
||||
ranged_cooldown_cap = 8
|
||||
ranged_message = "leaps"
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/Shoot(var/atom/target, var/atom/start, var/mob/user, var/bullet = 0)
|
||||
if(locked_to)
|
||||
return 0
|
||||
|
||||
src.throw_at(get_turf(target),7,1)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/to_bump(atom/A)
|
||||
if(throwing && isliving(A) && CanAttack(A))
|
||||
attach(A)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/Life()
|
||||
|
||||
update_climb()
|
||||
if(!isUnconscious())
|
||||
if(stance == HOSTILE_STANCE_IDLE && !client)
|
||||
var/list/can_see = view(get_turf(src), vision_range/2) //Nothing too close for comfort
|
||||
var/all_clear = 1
|
||||
for(var/mob/living/L in can_see)
|
||||
if(!istype(L, /mob/living/simple_animal/hostile/necromorph) && !(L.isDead()))
|
||||
all_clear = 0
|
||||
if(!istype(loc, /obj/machinery/atmospherics/unary/vent_pump) && istype(loc, /turf) && all_clear)
|
||||
stop_automated_movement = 0
|
||||
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in can_see)
|
||||
if(Adjacent(vent))
|
||||
//Climb in
|
||||
visible_message("<span class = 'warning'>\The [src] starts climbing into \the [vent]!</span>")
|
||||
forceMove(vent)
|
||||
stop_automated_movement = 1
|
||||
break
|
||||
else
|
||||
if(prob(30))
|
||||
step_towards(src, vent)//Step towards it
|
||||
if(environment_smash_flags & SMASH_LIGHT_STRUCTURES)
|
||||
EscapeConfinement()
|
||||
break
|
||||
|
||||
else if(istype(loc, /obj/machinery/atmospherics/unary/vent_pump) && !all_clear)
|
||||
loc.visible_message("<span class = 'warning'>\The [src] clambers out of \the [loc]!</span>")
|
||||
forceMove(get_turf(loc))
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/verb/ventcrawl()
|
||||
set name = "Crawl through Vent"
|
||||
set desc = "Enter an air vent and crawl through the pipe system."
|
||||
set category = "Object"
|
||||
var/pipe = start_ventcrawl()
|
||||
if(pipe)
|
||||
handle_ventcrawl(pipe)
|
||||
|
||||
/*
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/CanAttack(var/atom/the_target)
|
||||
to_chat(world, "[src] checking [the_target]")
|
||||
if(istype(loc, /obj/machinery/atmospherics/unary/vent_pump/))
|
||||
to_chat(world, "[src] looking at [the_target] in [loc]")
|
||||
var/dist = get_dist(get_turf(src), the_target)
|
||||
if(dist > 3)
|
||||
to_chat(world, "Too far away")
|
||||
return 0
|
||||
return ..(the_target)
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/proc/update_climb()
|
||||
var/mob/living/L = locked_to
|
||||
|
||||
if(!istype(L))
|
||||
return
|
||||
|
||||
if(incapacitated())
|
||||
return detach()
|
||||
|
||||
if(!CanAttack(L))
|
||||
return detach()
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/proc/detach()
|
||||
unlock_from()
|
||||
|
||||
pixel_x = initial(pixel_x)
|
||||
pixel_y = initial(pixel_y)
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/proc/attach(mob/living/victim)
|
||||
victim.lock_atom(src, /datum/locking_category/)
|
||||
|
||||
victim.visible_message("<span class = 'warning'>\The [src] latches onto \the [victim]!</span>","<span class = 'userdanger'>\The [src] latches onto you!</span>")
|
||||
|
||||
|
||||
pixel_x = rand(-8,8) * PIXEL_MULTIPLIER
|
||||
pixel_y = rand(0,16) * PIXEL_MULTIPLIER
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/AttackingTarget()
|
||||
.=..()
|
||||
|
||||
if(locked_to == target && isliving(target))
|
||||
var/mob/living/L = target
|
||||
|
||||
if(prob(10))
|
||||
to_chat(L, "<span class='userdanger'>\The [src] throws you to the ground!</span>")
|
||||
var/incapacitation_duration = rand(2, 5)
|
||||
L.Knockdown(incapacitation_duration)
|
||||
L.Stun(incapacitation_duration)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper/adjustBruteLoss(amount)
|
||||
.=..()
|
||||
|
||||
if(locked_to && prob(amount * 5))
|
||||
detach()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/exploder
|
||||
desc = "A twisted husk of what was once human. A large glowing pustule attached to their left arm."
|
||||
icon_state = "nmorph_exploder"
|
||||
icon_living = "nmorph_exploder"
|
||||
icon_dead = ""
|
||||
health = 30
|
||||
maxHealth = 30
|
||||
|
||||
speed = 2
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/exploder/AttackingTarget()
|
||||
visible_message("<span class='warning'>\The [src] hits \the [target] with their left arm!</span>")
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/exploder/death(var/gibbed = FALSE)
|
||||
..(TRUE)
|
||||
visible_message("<span class='warning'>\The [src] explodes!</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/effect/gibspawner/generic(T)
|
||||
qdel(src)
|
||||
explosion(T, -1, 1, 4, whodunnit = src)
|
||||
|
||||
/mob/living/simple_animal/hostile/necromorph/puker
|
||||
desc = "A twisted, engorged husk of what was once human. It reeks of stomach acid."
|
||||
icon_state = "nmorph_puker"
|
||||
icon_living = "nmorph_puker"
|
||||
icon_dead = "nmorph_puker_dead"
|
||||
|
||||
ranged = 1
|
||||
ranged_cooldown_cap = 20
|
||||
projectiletype = /obj/item/projectile/puke
|
||||
ranged_message = "pukes"
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
|
||||
/obj/item/projectile/puke
|
||||
icon_state = "projectile_puke"
|
||||
|
||||
/obj/item/projectile/puke/New()
|
||||
..()
|
||||
create_reagents(500)
|
||||
make_reagents()
|
||||
|
||||
/obj/item/projectile/puke/proc/make_reagents()
|
||||
var/room_remaining = 500
|
||||
var/poly_to_add = rand(100,200)
|
||||
reagents.add_reagent(PACID, poly_to_add)
|
||||
room_remaining -= poly_to_add
|
||||
var/sulph_to_add = rand(100,200)
|
||||
reagents.add_reagent(SACID, sulph_to_add)
|
||||
room_remaining -= sulph_to_add
|
||||
reagents.add_reagent(VOMIT, room_remaining)
|
||||
|
||||
/obj/item/projectile/puke/clear/make_reagents()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/projectile/puke/on_hit(var/atom/atarget, var/blocked = 0)
|
||||
..()
|
||||
splash_sub(reagents, atarget, -1)
|
||||
|
||||
/obj/item/projectile/puke/process_step()
|
||||
..()
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(T) //The first time it runs, it won't work, it'll runtime
|
||||
playsound(T, 'sound/effects/splat.ogg', 50, 1)
|
||||
T.add_vomit_floor(src, 1, 1, 1)
|
||||
sleep(1) //Slow the fuck down, hyperspeed vomit
|
||||
@@ -241,8 +241,6 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
|
||||
if(purge)
|
||||
purge -= 1
|
||||
|
||||
isRegenerating = 0
|
||||
|
||||
//Movement
|
||||
if((!client||deny_client_move) && !stop_automated_movement && wander && !anchored && (ckey == null) && !(flags & INVULNERABLE))
|
||||
if(isturf(src.loc) && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
@@ -804,8 +802,9 @@ var/global/list/animal_count = list() //Stores types, and amount of animals of t
|
||||
set waitfor = 0
|
||||
isRegenerating = 1
|
||||
sleep(rand(minRegenTime, maxRegenTime)) //Don't want it being predictable
|
||||
src.resurrect()
|
||||
src.revive()
|
||||
if(src)
|
||||
resurrect()
|
||||
revive()
|
||||
visible_message("<span class='warning'>[src] appears to wake from the dead, having healed all wounds.</span>")
|
||||
isRegenerating = 0
|
||||
|
||||
|
||||
@@ -494,3 +494,36 @@
|
||||
H.drop_item()
|
||||
H.vomit(0,1)
|
||||
return 0
|
||||
|
||||
/obj/item/projectile/puke
|
||||
icon_state = "projectile_puke"
|
||||
|
||||
/obj/item/projectile/puke/New()
|
||||
..()
|
||||
create_reagents(500)
|
||||
make_reagents()
|
||||
|
||||
/obj/item/projectile/puke/proc/make_reagents()
|
||||
var/room_remaining = 500
|
||||
var/poly_to_add = rand(100,200)
|
||||
reagents.add_reagent(PACID, poly_to_add)
|
||||
room_remaining -= poly_to_add
|
||||
var/sulph_to_add = rand(100,200)
|
||||
reagents.add_reagent(SACID, sulph_to_add)
|
||||
room_remaining -= sulph_to_add
|
||||
reagents.add_reagent(VOMIT, room_remaining)
|
||||
|
||||
/obj/item/projectile/puke/clear/make_reagents()
|
||||
return
|
||||
|
||||
/obj/item/projectile/puke/on_hit(var/atom/atarget, var/blocked = 0)
|
||||
..()
|
||||
splash_sub(reagents, atarget, -1)
|
||||
|
||||
/obj/item/projectile/puke/process_step()
|
||||
..()
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(T) //The first time it runs, it won't work, it'll runtime
|
||||
playsound(T, 'sound/effects/splat.ogg', 50, 1)
|
||||
T.add_vomit_floor(src, 1, 1, 1)
|
||||
sleep(1) //Slow the fuck down, hyperspeed vomit
|
||||
@@ -34,7 +34,7 @@
|
||||
/mob/living/simple_animal/hostile/bear,
|
||||
/mob/living/simple_animal/hostile/creature,
|
||||
/mob/living/simple_animal/hostile/monster/skrite,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
)
|
||||
else
|
||||
spawn_type = pick(
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
/mob/living/simple_animal/hostile/necro/zombie/putrid = 100,
|
||||
/mob/living/simple_animal/hostile/necro/zombie/crimson = 250,)
|
||||
if(2) //Necromorphs
|
||||
mob_spawn = list(/mob/living/simple_animal/hostile/necromorph = 150,
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper = 90,
|
||||
/mob/living/simple_animal/hostile/necromorph/puker = 120,
|
||||
/mob/living/simple_animal/hostile/necromorph/exploder = 75,) //More necromorph mobs NOW
|
||||
mob_spawn = list(/mob/living/simple_animal/hostile/necro/necromorph = 150,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper = 90,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/puker = 120,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/exploder = 75,) //More necromorph mobs NOW
|
||||
if(3) //Randomized mobs
|
||||
var/max_mobs = rand(3,7)
|
||||
for(var/i=0 to max_mobs)
|
||||
|
||||
@@ -46676,7 +46676,7 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/gibspawner/xeno,
|
||||
/obj/effect/decal/cleanable/greenglow,
|
||||
/mob/living/simple_animal/hostile/necromorph/puker{
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/puker{
|
||||
desc = "A twisted, engorged husk of what was once Clown. It reeks of stomach acid.";
|
||||
icon = 'icons/mob/clown_mobs.dmi';
|
||||
icon_dead = "blob";
|
||||
@@ -65182,7 +65182,7 @@
|
||||
/area/lamprey/hellmaintenanceblob)
|
||||
"cPK" = (
|
||||
/obj/effect/decal/cleanable/spiderling_remains,
|
||||
/mob/living/simple_animal/hostile/necromorph{
|
||||
/mob/living/simple_animal/hostile/necro/necromorph{
|
||||
desc = "A seriously ripped Clown with only one thing on its mind- Slashing you apart.";
|
||||
faction = "hostile";
|
||||
icon = 'icons/mob/clown_mobs.dmi';
|
||||
@@ -96092,7 +96092,7 @@
|
||||
/area/lamprey/thebelt)
|
||||
"dZx" = (
|
||||
/obj/structure/cage/autoclose,
|
||||
/mob/living/simple_animal/hostile/necromorph/leaper,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/leaper,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/lamprey/xenobiology)
|
||||
"dZy" = (
|
||||
@@ -103994,7 +103994,7 @@
|
||||
},
|
||||
/area/lamprey/engineeringmaintenanceblob)
|
||||
"erk" = (
|
||||
/mob/living/simple_animal/hostile/necromorph{
|
||||
/mob/living/simple_animal/hostile/necro/necromorph{
|
||||
desc = "A seriously ripped Clown with only one thing on its mind- Slashing you apart.";
|
||||
icon = 'icons/mob/clown_mobs.dmi';
|
||||
icon_dead = "blob";
|
||||
@@ -187051,7 +187051,7 @@
|
||||
},
|
||||
/area/lamprey/excavationtunnels)
|
||||
"hEk" = (
|
||||
/mob/living/simple_animal/hostile/necromorph/puker,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/puker,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -187331,7 +187331,7 @@
|
||||
},
|
||||
/area/lamprey/excavationtunnels)
|
||||
"hFb" = (
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -188814,7 +188814,7 @@
|
||||
/area/lamprey/excavationtunnels)
|
||||
"hIF" = (
|
||||
/obj/item/stack/sheet/metal,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191501,14 +191501,14 @@
|
||||
"hNZ" = (
|
||||
/obj/effect/decal/cleanable/crayon/fuckyou,
|
||||
/obj/item/weapon/gun/bulletstorm,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
/area/lamprey/excavationtunnels)
|
||||
"hOa" = (
|
||||
/obj/effect/decal/cleanable/crayon/fuckyou,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191530,7 +191530,7 @@
|
||||
"hOd" = (
|
||||
/obj/effect/decal/cleanable/crayon/fuckyou,
|
||||
/obj/structure/hanging_lantern/dim,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191538,7 +191538,7 @@
|
||||
"hOe" = (
|
||||
/obj/effect/decal/cleanable/crayon/fuckyou,
|
||||
/obj/item/weapon/gun/banannon,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191785,7 +191785,7 @@
|
||||
/obj/structure/bed/chair{
|
||||
dir = 8
|
||||
},
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191794,7 +191794,7 @@
|
||||
/obj/structure/bed/chair{
|
||||
dir = 4
|
||||
},
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -191813,7 +191813,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/hanging_lantern/hook,
|
||||
/mob/living/simple_animal/hostile/necromorph,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
@@ -196837,7 +196837,7 @@
|
||||
/obj/structure/bed/chair{
|
||||
dir = 1
|
||||
},
|
||||
/mob/living/simple_animal/hostile/necromorph/puker,
|
||||
/mob/living/simple_animal/hostile/necro/necromorph/puker,
|
||||
/turf/simulated/floor/plating{
|
||||
icon_state = "asteroidfloor"
|
||||
},
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
"at" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/mob/living/simple_animal/hostile/necromorph{
|
||||
/mob/living/simple_animal/hostile/necro/necromorph{
|
||||
health = 500;
|
||||
melee_damage_lower = 50;
|
||||
name = "Necromorph Specimen Alpha"
|
||||
|
||||
@@ -2095,7 +2095,6 @@
|
||||
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\necro.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\necro_powers.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\necromorph.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\pitbull.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\rattlemebones.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\scp_173.dm"
|
||||
|
||||
Reference in New Issue
Block a user