Makes shiny versions of lavaland monsters slightly more distinct (#30502)
* Makes shiny versions of lavaland monsters slightly more distinct * classic * lower drop * tweak drops * this is kind of absurd
@@ -4,6 +4,7 @@
|
|||||||
status_type = STATUS_EFFECT_UNIQUE
|
status_type = STATUS_EFFECT_UNIQUE
|
||||||
alert_type = /obj/screen/alert/status_effect/freon
|
alert_type = /obj/screen/alert/status_effect/freon
|
||||||
var/icon/cube
|
var/icon/cube
|
||||||
|
var/can_melt = TRUE
|
||||||
|
|
||||||
/obj/screen/alert/status_effect/freon
|
/obj/screen/alert/status_effect/freon
|
||||||
name = "Frozen Solid"
|
name = "Frozen Solid"
|
||||||
@@ -20,7 +21,7 @@
|
|||||||
|
|
||||||
/datum/status_effect/freon/tick()
|
/datum/status_effect/freon/tick()
|
||||||
owner.update_canmove()
|
owner.update_canmove()
|
||||||
if(owner && owner.bodytemperature >= 310.055)
|
if(can_melt && owner.bodytemperature >= 310.055)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
/datum/status_effect/freon/on_remove()
|
/datum/status_effect/freon/on_remove()
|
||||||
@@ -29,3 +30,7 @@
|
|||||||
owner.cut_overlay(cube)
|
owner.cut_overlay(cube)
|
||||||
owner.bodytemperature += 100
|
owner.bodytemperature += 100
|
||||||
owner.update_canmove()
|
owner.update_canmove()
|
||||||
|
|
||||||
|
/datum/status_effect/freon/watcher
|
||||||
|
duration = 8
|
||||||
|
can_melt = FALSE
|
||||||
|
|||||||
@@ -131,9 +131,9 @@
|
|||||||
has_data = TRUE
|
has_data = TRUE
|
||||||
|
|
||||||
/turf/open/floor/plating/asteroid/airless/cave/volcanic
|
/turf/open/floor/plating/asteroid/airless/cave/volcanic
|
||||||
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
|
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
|
||||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
|
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
|
||||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
|
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
|
||||||
SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
|
SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
|
||||||
|
|
||||||
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data
|
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data
|
||||||
|
|||||||
@@ -231,6 +231,31 @@
|
|||||||
else
|
else
|
||||||
H.ranged_cooldown_time = bonus_value + world.time
|
H.ranged_cooldown_time = bonus_value + world.time
|
||||||
|
|
||||||
|
//magmawing watcher
|
||||||
|
/obj/item/crusher_trophy/blaster_tubes/magma_wing
|
||||||
|
name = "magmawing watcher wing"
|
||||||
|
desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher."
|
||||||
|
icon_state = "magma_wing"
|
||||||
|
gender = NEUTER
|
||||||
|
bonus_value = 5
|
||||||
|
|
||||||
|
/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
|
||||||
|
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage"
|
||||||
|
|
||||||
|
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
|
||||||
|
if(deadly_shot)
|
||||||
|
marker.name = "heated [marker.name]"
|
||||||
|
marker.icon_state = "lava"
|
||||||
|
marker.damage = bonus_value
|
||||||
|
marker.nodamage = FALSE
|
||||||
|
deadly_shot = FALSE
|
||||||
|
|
||||||
|
//icewing watcher
|
||||||
|
/obj/item/crusher_trophy/watcher_wing/ice_wing
|
||||||
|
name = "icewing watcher wing"
|
||||||
|
desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher."
|
||||||
|
icon_state = "ice_wing"
|
||||||
|
|
||||||
//legion
|
//legion
|
||||||
/obj/item/crusher_trophy/legion_skull
|
/obj/item/crusher_trophy/legion_skull
|
||||||
name = "legion skull"
|
name = "legion skull"
|
||||||
@@ -281,7 +306,7 @@
|
|||||||
playsound(L, 'sound/magic/fireball.ogg', 20, 1)
|
playsound(L, 'sound/magic/fireball.ogg', 20, 1)
|
||||||
new /obj/effect/temp_visual/fire(L.loc)
|
new /obj/effect/temp_visual/fire(L.loc)
|
||||||
addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
|
addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
|
||||||
L.adjustBruteLoss(bonus_value)
|
L.adjustFireLoss(bonus_value, forced = TRUE)
|
||||||
|
|
||||||
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
|
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
|
||||||
if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
|
if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
|
||||||
|
|||||||
@@ -571,10 +571,10 @@
|
|||||||
var/obj/C = loc
|
var/obj/C = loc
|
||||||
C.container_resist(src)
|
C.container_resist(src)
|
||||||
|
|
||||||
else if(has_status_effect(/datum/status_effect/freon))
|
else if(IsFrozen())
|
||||||
to_chat(src, "You start breaking out of the ice cube!")
|
to_chat(src, "You start breaking out of the ice cube!")
|
||||||
if(do_mob(src, src, 40))
|
if(do_mob(src, src, 40))
|
||||||
if(has_status_effect(/datum/status_effect/freon))
|
if(IsFrozen())
|
||||||
to_chat(src, "You break out of the ice cube!")
|
to_chat(src, "You break out of the ice cube!")
|
||||||
remove_status_effect(/datum/status_effect/freon)
|
remove_status_effect(/datum/status_effect/freon)
|
||||||
update_canmove()
|
update_canmove()
|
||||||
@@ -974,7 +974,7 @@
|
|||||||
fall()
|
fall()
|
||||||
else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
|
else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
|
||||||
fall(forced = 1)
|
fall(forced = 1)
|
||||||
canmove = !(ko || resting || has_status_effect(STATUS_EFFECT_STUN) || has_status_effect(/datum/status_effect/freon) || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
|
canmove = !(ko || resting || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
|
||||||
density = !lying
|
density = !lying
|
||||||
if(lying)
|
if(lying)
|
||||||
if(layer == initial(layer)) //to avoid special cases like hiding larvas.
|
if(layer == initial(layer)) //to avoid special cases like hiding larvas.
|
||||||
|
|||||||
@@ -85,35 +85,70 @@
|
|||||||
loot = list()
|
loot = list()
|
||||||
butcher_results = list(/obj/item/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
butcher_results = list(/obj/item/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/make_shiny()
|
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize()
|
||||||
|
. = ..()
|
||||||
|
if(prob(1))
|
||||||
if(prob(75))
|
if(prob(75))
|
||||||
|
new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing(loc)
|
||||||
|
else
|
||||||
|
new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing(loc)
|
||||||
|
return INITIALIZE_HINT_QDEL
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing
|
||||||
name = "magmawing watcher"
|
name = "magmawing watcher"
|
||||||
real_name = name
|
desc = "When raised very close to lava, some watchers adapt to the extreme heat and use lava as both a weapon and wings."
|
||||||
desc = "When raised very close to lava, some watchers adapt to the extreme heat and change coloration. Such watchers are known as magmawings and use intense heat as their tool for hunting and defense."
|
|
||||||
icon_state = "watcher_magmawing"
|
icon_state = "watcher_magmawing"
|
||||||
icon_living = "watcher_magmawing"
|
icon_living = "watcher_magmawing"
|
||||||
icon_aggro = "watcher_magmawing"
|
icon_aggro = "watcher_magmawing"
|
||||||
icon_dead = "watcher_magmawing_dead"
|
icon_dead = "watcher_magmawing_dead"
|
||||||
maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health
|
maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health
|
||||||
health = 215
|
health = 215
|
||||||
|
light_range = 3
|
||||||
|
light_power = 2.5
|
||||||
|
light_color = LIGHT_COLOR_LAVA
|
||||||
projectiletype = /obj/item/projectile/temp/basilisk/magmawing
|
projectiletype = /obj/item/projectile/temp/basilisk/magmawing
|
||||||
else
|
crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
|
||||||
|
crusher_drop_mod = 60
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing
|
||||||
name = "icewing watcher"
|
name = "icewing watcher"
|
||||||
real_name = name
|
desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, they become icy and fragile but fire much stronger freezing blasts."
|
||||||
desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, their wings will become papery and turn to an icy blue; these watchers are fragile but much quicker to fire their trademark freezing blasts."
|
|
||||||
icon_state = "watcher_icewing"
|
icon_state = "watcher_icewing"
|
||||||
icon_living = "watcher_icewing"
|
icon_living = "watcher_icewing"
|
||||||
icon_aggro = "watcher_icewing"
|
icon_aggro = "watcher_icewing"
|
||||||
icon_dead = "watcher_icewing_dead"
|
icon_dead = "watcher_icewing_dead"
|
||||||
maxHealth = 150
|
maxHealth = 170
|
||||||
health = 150
|
health = 170
|
||||||
ranged_cooldown_time = 20
|
projectiletype = /obj/item/projectile/temp/basilisk/icewing
|
||||||
butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
|
butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
|
||||||
|
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
|
||||||
|
crusher_drop_mod = 30
|
||||||
|
|
||||||
/obj/item/projectile/temp/basilisk/magmawing
|
/obj/item/projectile/temp/basilisk/magmawing
|
||||||
name = "scorching blast"
|
name = "scorching blast"
|
||||||
icon_state = "gaussstrong"
|
icon_state = "lava"
|
||||||
|
damage = 5
|
||||||
|
damage_type = BURN
|
||||||
|
nodamage = FALSE
|
||||||
temperature = 500 //Heats you up!
|
temperature = 500 //Heats you up!
|
||||||
|
|
||||||
|
/obj/item/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
var/mob/living/L = target
|
||||||
|
L.adjust_fire_stacks(0.1)
|
||||||
|
L.IgniteMob()
|
||||||
|
|
||||||
|
/obj/item/projectile/temp/basilisk/icewing
|
||||||
|
damage = 5
|
||||||
|
damage_type = BURN
|
||||||
|
nodamage = FALSE
|
||||||
|
|
||||||
|
/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
var/mob/living/L = target
|
||||||
|
L.apply_status_effect(/datum/status_effect/freon/watcher)
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
||||||
fromtendril = TRUE
|
fromtendril = TRUE
|
||||||
|
|||||||
@@ -31,10 +31,9 @@
|
|||||||
var/pre_attack = 0
|
var/pre_attack = 0
|
||||||
var/pre_attack_icon = "Goliath_preattack"
|
var/pre_attack_icon = "Goliath_preattack"
|
||||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
|
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
|
||||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
|
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
|
||||||
..()
|
. = ..()
|
||||||
handle_preattack()
|
handle_preattack()
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
|
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
|
||||||
@@ -58,8 +57,8 @@
|
|||||||
if(!isturf(tturf))
|
if(!isturf(tturf))
|
||||||
return
|
return
|
||||||
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
|
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
|
||||||
visible_message("<span class='warning'>The [src.name] digs its tentacles under [target.name]!</span>")
|
visible_message("<span class='warning'>[src] digs its tentacles under [target]!</span>")
|
||||||
new /obj/effect/goliath_tentacle/original(tturf)
|
new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src)
|
||||||
ranged_cooldown = world.time + ranged_cooldown_time
|
ranged_cooldown = world.time + ranged_cooldown_time
|
||||||
icon_state = icon_aggro
|
icon_state = icon_aggro
|
||||||
pre_attack = 0
|
pre_attack = 0
|
||||||
@@ -87,62 +86,106 @@
|
|||||||
throw_message = "does nothing to the tough hide of the"
|
throw_message = "does nothing to the tough hide of the"
|
||||||
pre_attack_icon = "goliath2"
|
pre_attack_icon = "goliath2"
|
||||||
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
|
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
|
||||||
|
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||||
loot = list()
|
loot = list()
|
||||||
stat_attack = UNCONSCIOUS
|
stat_attack = UNCONSCIOUS
|
||||||
robust_searching = 1
|
robust_searching = 1
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/goliath/make_shiny()
|
/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize()
|
||||||
name = "precursor goliath"
|
. = ..()
|
||||||
real_name = name
|
if(prob(1))
|
||||||
desc = "Due to their stone hide, goliaths are biologically immortal, although future generations evolved to look much different. This goliath is likely a very early ancestor to many others here, and at least several centuries old."
|
new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc)
|
||||||
|
return INITIALIZE_HINT_QDEL
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient
|
||||||
|
name = "ancient goliath"
|
||||||
|
desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it."
|
||||||
icon_state = "Goliath"
|
icon_state = "Goliath"
|
||||||
icon_living = "Goliath"
|
icon_living = "Goliath"
|
||||||
icon_aggro = "Goliath_alert"
|
icon_aggro = "Goliath_alert"
|
||||||
icon_dead = "Goliath_dead"
|
icon_dead = "Goliath_dead"
|
||||||
|
maxHealth = 400
|
||||||
|
health = 400
|
||||||
|
speed = 4
|
||||||
pre_attack_icon = "Goliath_preattack"
|
pre_attack_icon = "Goliath_preattack"
|
||||||
throw_message = "does nothing to the rocky hide of the"
|
throw_message = "does nothing to the rocky hide of the"
|
||||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
|
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
|
||||||
|
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2)
|
||||||
|
crusher_drop_mod = 30
|
||||||
|
wander = FALSE
|
||||||
|
var/list/cached_tentacle_turfs
|
||||||
|
var/turf/last_location
|
||||||
|
var/tentacle_recheck_cooldown = 100
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life()
|
||||||
|
. = ..()
|
||||||
|
if(isturf(loc))
|
||||||
|
if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
|
||||||
|
LAZYCLEARLIST(cached_tentacle_turfs)
|
||||||
|
last_location = loc
|
||||||
|
tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown)
|
||||||
|
for(var/turf/open/T in orange(4, loc))
|
||||||
|
LAZYADD(cached_tentacle_turfs, T)
|
||||||
|
for(var/t in cached_tentacle_turfs)
|
||||||
|
if(isopenturf(t))
|
||||||
|
if(prob(10))
|
||||||
|
new /obj/effect/temp_visual/goliath_tentacle(t, src)
|
||||||
|
else
|
||||||
|
cached_tentacle_turfs -= t
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
|
/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
|
||||||
fromtendril = TRUE
|
fromtendril = TRUE
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril/make_shiny()
|
|
||||||
return //Precursor goliaths don't come from tendrils!
|
|
||||||
|
|
||||||
//tentacles
|
//tentacles
|
||||||
/obj/effect/goliath_tentacle
|
/obj/effect/temp_visual/goliath_tentacle
|
||||||
name = "Goliath tentacle"
|
name = "goliath tentacle"
|
||||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||||
icon_state = "Goliath_tentacle"
|
icon_state = "Goliath_tentacle_spawn"
|
||||||
var/latched = FALSE
|
layer = BELOW_MOB_LAYER
|
||||||
anchored = TRUE
|
var/mob/living/spawner
|
||||||
|
|
||||||
/obj/effect/goliath_tentacle/Initialize()
|
/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
if(locate(/obj/effect/temp_visual/goliath_tentacle) in loc)
|
||||||
|
return INITIALIZE_HINT_QDEL
|
||||||
|
if(!QDELETED(new_spawner))
|
||||||
|
spawner = new_spawner
|
||||||
if(ismineralturf(loc))
|
if(ismineralturf(loc))
|
||||||
var/turf/closed/mineral/M = loc
|
var/turf/closed/mineral/M = loc
|
||||||
M.gets_drilled()
|
M.gets_drilled()
|
||||||
addtimer(CALLBACK(src, .proc/Trip), 10)
|
deltimer(timerid)
|
||||||
|
timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE)
|
||||||
|
|
||||||
/obj/effect/goliath_tentacle/original/Initialize()
|
/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner)
|
||||||
. = ..()
|
. = ..()
|
||||||
for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you
|
|
||||||
if(O != src)
|
|
||||||
qdel(src)
|
|
||||||
var/list/directions = GLOB.cardinals.Copy()
|
var/list/directions = GLOB.cardinals.Copy()
|
||||||
for(var/i in 1 to 3)
|
for(var/i in 1 to 3)
|
||||||
var/spawndir = pick_n_take(directions)
|
var/spawndir = pick_n_take(directions)
|
||||||
var/turf/T = get_step(src,spawndir)
|
var/turf/T = get_step(src, spawndir)
|
||||||
if(T)
|
if(T)
|
||||||
new /obj/effect/goliath_tentacle(T)
|
new /obj/effect/temp_visual/goliath_tentacle(T, spawner)
|
||||||
|
|
||||||
/obj/effect/goliath_tentacle/proc/Trip()
|
/obj/effect/temp_visual/goliath_tentacle/proc/tripanim()
|
||||||
for(var/mob/living/M in src.loc)
|
icon_state = "Goliath_tentacle_wiggle"
|
||||||
visible_message("<span class='danger'>The [src.name] grabs hold of [M.name]!</span>")
|
deltimer(timerid)
|
||||||
M.Stun(100)
|
timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE)
|
||||||
M.adjustBruteLoss(rand(10,15))
|
|
||||||
|
/obj/effect/temp_visual/goliath_tentacle/proc/trip()
|
||||||
|
var/latched = FALSE
|
||||||
|
for(var/mob/living/L in loc)
|
||||||
|
if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD)
|
||||||
|
continue
|
||||||
|
visible_message("<span class='danger'>[src] grabs hold of [L]!</span>")
|
||||||
|
L.Stun(100)
|
||||||
|
L.adjustBruteLoss(rand(10,15))
|
||||||
latched = TRUE
|
latched = TRUE
|
||||||
if(!latched)
|
if(!latched)
|
||||||
qdel(src)
|
retract()
|
||||||
else
|
else
|
||||||
QDEL_IN(src, 50)
|
deltimer(timerid)
|
||||||
|
timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
|
||||||
|
|
||||||
|
/obj/effect/temp_visual/goliath_tentacle/proc/retract()
|
||||||
|
icon_state = "Goliath_tentacle_retract"
|
||||||
|
deltimer(timerid)
|
||||||
|
timerid = QDEL_IN(src, 7)
|
||||||
|
|||||||
@@ -110,13 +110,18 @@
|
|||||||
del_on_death = 1
|
del_on_death = 1
|
||||||
stat_attack = UNCONSCIOUS
|
stat_attack = UNCONSCIOUS
|
||||||
robust_searching = 1
|
robust_searching = 1
|
||||||
shiny_chance = 5
|
var/dwarf_mob = FALSE
|
||||||
var/mob/living/carbon/human/stored_mob
|
var/mob/living/carbon/human/stored_mob
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/make_shiny()
|
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize()
|
||||||
|
. = ..()
|
||||||
|
if(prob(5))
|
||||||
|
new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc)
|
||||||
|
return INITIALIZE_HINT_QDEL
|
||||||
|
|
||||||
|
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf
|
||||||
name = "dwarf legion"
|
name = "dwarf legion"
|
||||||
real_name = name
|
desc = "You can still see what was once a rather small human under the shifting mass of corruption."
|
||||||
desc = "On the rare occasion that a human with dwarfism falls to a legion, they can become infested like any other."
|
|
||||||
icon_state = "dwarf_legion"
|
icon_state = "dwarf_legion"
|
||||||
icon_living = "dwarf_legion"
|
icon_living = "dwarf_legion"
|
||||||
icon_aggro = "dwarf_legion"
|
icon_aggro = "dwarf_legion"
|
||||||
@@ -124,6 +129,8 @@
|
|||||||
maxHealth = 60
|
maxHealth = 60
|
||||||
health = 60
|
health = 60
|
||||||
speed = 2 //faster!
|
speed = 2 //faster!
|
||||||
|
crusher_drop_mod = 20
|
||||||
|
dwarf_mob = TRUE
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
|
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
|
||||||
visible_message("<span class='warning'>The skulls on [src] wail in anger as they flee from their dying host!</span>")
|
visible_message("<span class='warning'>The skulls on [src] wail in anger as they flee from their dying host!</span>")
|
||||||
@@ -134,6 +141,8 @@
|
|||||||
stored_mob = null
|
stored_mob = null
|
||||||
else if(fromtendril)
|
else if(fromtendril)
|
||||||
new /obj/effect/mob_spawn/human/corpse/charredskeleton(T)
|
new /obj/effect/mob_spawn/human/corpse/charredskeleton(T)
|
||||||
|
else if(dwarf_mob)
|
||||||
|
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf(T)
|
||||||
else
|
else
|
||||||
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T)
|
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T)
|
||||||
..(gibbed)
|
..(gibbed)
|
||||||
@@ -177,14 +186,16 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
|
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
|
||||||
visible_message("<span class='warning'>[name] burrows into the flesh of [H]!</span>")
|
visible_message("<span class='warning'>[name] burrows into the flesh of [H]!</span>")
|
||||||
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new(H.loc)
|
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
|
||||||
|
if(H.dna.check_mutation(DWARFISM)) //dwarf legions aren't just fluff!
|
||||||
|
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
|
||||||
|
else
|
||||||
|
L = new(H.loc)
|
||||||
visible_message("<span class='warning'>[L] staggers to their feet!</span>")
|
visible_message("<span class='warning'>[L] staggers to their feet!</span>")
|
||||||
H.death()
|
H.death()
|
||||||
H.adjustBruteLoss(1000)
|
H.adjustBruteLoss(1000)
|
||||||
L.stored_mob = H
|
L.stored_mob = H
|
||||||
H.forceMove(L)
|
H.forceMove(L)
|
||||||
if(H.dna.check_mutation(DWARFISM))
|
|
||||||
L.make_shiny() //dwarf legions aren't just fluff!
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
|
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
|
||||||
@@ -251,6 +262,10 @@
|
|||||||
|
|
||||||
//Legion infested mobs
|
//Legion infested mobs
|
||||||
|
|
||||||
|
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf/equip(mob/living/carbon/human/H)
|
||||||
|
. = ..()
|
||||||
|
H.dna.add_mutation(DWARFISM)
|
||||||
|
|
||||||
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize()
|
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize()
|
||||||
var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4))
|
var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4))
|
||||||
switch(type)
|
switch(type)
|
||||||
|
|||||||
@@ -20,17 +20,11 @@
|
|||||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||||
mob_size = MOB_SIZE_LARGE
|
mob_size = MOB_SIZE_LARGE
|
||||||
var/icon_aggro = null
|
var/icon_aggro = null
|
||||||
var/shiny = FALSE //If this mob is a much rarer version of its normal self
|
var/crusher_drop_mod = 5
|
||||||
var/shiny_chance = 1 //If this chance passes, the mob will somehow be different from normal ones
|
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
|
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
|
||||||
. = ..()
|
. = ..()
|
||||||
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||||
if(prob(shiny_chance))
|
|
||||||
shiny = TRUE
|
|
||||||
make_shiny()
|
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/proc/make_shiny() //Override this on a per-mob basis
|
|
||||||
|
|
||||||
/mob/living/simple_animal/hostile/asteroid/Aggro()
|
/mob/living/simple_animal/hostile/asteroid/Aggro()
|
||||||
..()
|
..()
|
||||||
@@ -64,7 +58,7 @@
|
|||||||
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
||||||
SSblackbox.add_details("mobs_killed_mining","[src.type]")
|
SSblackbox.add_details("mobs_killed_mining","[src.type]")
|
||||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||||
if(C && crusher_loot && prob(((C.total_damage/maxHealth)) * 5) + shiny) //on average, you'll need to kill 20 creatures before getting the item
|
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item
|
||||||
spawn_crusher_loot()
|
spawn_crusher_loot()
|
||||||
..(gibbed)
|
..(gibbed)
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,11 @@
|
|||||||
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
|
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
|
||||||
return K
|
return K
|
||||||
|
|
||||||
|
///////////////////////////////// FROZEN /////////////////////////////////////
|
||||||
|
|
||||||
|
/mob/living/proc/IsFrozen()
|
||||||
|
return has_status_effect(/datum/status_effect/freon)
|
||||||
|
|
||||||
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
|
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
|
||||||
|
|
||||||
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
|
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |