@@ -1,49 +1,39 @@
|
||||
#define ASH_WALKER_SPAWN_THRESHOLD 2
|
||||
//The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker
|
||||
name = "ash walker nest"
|
||||
desc = "A nest built around a necropolis tendril. The eggs seem to grow unnaturally fast..."
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker
|
||||
name = "necropolis tendril nest"
|
||||
desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..."
|
||||
icon_state = "ash_walker_nest"
|
||||
icon_living = "ash_walker_nest"
|
||||
icon_dead = "ash_walker_nest"
|
||||
faction = list("ashwalker")
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
loot = list(/obj/effect/gibspawner, /obj/item/device/assembly/signaler/anomaly)
|
||||
del_on_death = 1
|
||||
var/meat_counter
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker/Initialize()
|
||||
. = ..()
|
||||
emitted_light = new(loc)
|
||||
loot = list(/obj/effect/collapse)
|
||||
var/meat_counter = 6
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker/Destroy()
|
||||
QDEL_NULL(emitted_light)
|
||||
. = ..()
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/death()
|
||||
new /obj/item/device/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs)))
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker/Life()
|
||||
..()
|
||||
if(!stat)
|
||||
consume()
|
||||
spawn_mob()
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/handle_automated_action()
|
||||
consume()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker/proc/consume()
|
||||
for(var/mob/living/H in view(src,1)) //Only for corpse right next to/on same tile
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/proc/consume()
|
||||
for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile
|
||||
if(H.stat)
|
||||
visible_message("<span class='warning'>Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.</span>")
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1)
|
||||
if(ismegafauna(H))
|
||||
meat_counter += 20
|
||||
else
|
||||
meat_counter ++
|
||||
for(var/obj/item/W in H)
|
||||
H.dropItemToGround(W)
|
||||
meat_counter++
|
||||
H.gib()
|
||||
adjustHealth(-maxHealth * 0.05)//restores 5% hp of tendril
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/ash_walker/spawn_mob()
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/spawn_mob()
|
||||
if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD)
|
||||
new /obj/effect/mob_spawn/human/ash_walker(get_step(src.loc, SOUTH))
|
||||
new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs)))
|
||||
visible_message("<span class='danger'>One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!</span>")
|
||||
meat_counter -= ASH_WALKER_SPAWN_THRESHOLD
|
||||
|
||||
@@ -1,61 +1,226 @@
|
||||
//The necropolis gate is used to call forth Legion from the Necropolis.
|
||||
/obj/structure/necropolis_gate
|
||||
name = "necropolis gate"
|
||||
desc = "A tremendous and impossibly large gateway, bored into dense bedrock."
|
||||
desc = "A massive stone gateway."
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "door"
|
||||
anchored = 1
|
||||
density = 1
|
||||
opacity = 1
|
||||
bound_width = 96
|
||||
bound_height = 96
|
||||
icon_state = "gate_full"
|
||||
flags = ON_BORDER
|
||||
appearance_flags = 0
|
||||
layer = TABLE_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
light_range = 1
|
||||
var/boss = FALSE
|
||||
var/is_anyone_home = FALSE
|
||||
light_range = 8
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
var/open = FALSE
|
||||
var/changing_openness = FALSE
|
||||
var/locked = FALSE
|
||||
var/static/mutable_appearance/top_overlay
|
||||
var/static/mutable_appearance/door_overlay
|
||||
var/static/mutable_appearance/dais_overlay
|
||||
var/obj/structure/opacity_blocker/sight_blocker
|
||||
var/sight_blocker_distance = 1
|
||||
|
||||
/obj/structure/necropolis_gate/attack_hand(mob/user)
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/legion/L in GLOB.mob_list)
|
||||
return
|
||||
if(is_anyone_home)
|
||||
return
|
||||
var/safety = alert(user, "You think this might be a bad idea...", "Knock on the door?", "Proceed", "Abort")
|
||||
if(safety == "Abort" || !in_range(src, user) || !src || is_anyone_home || user.incapacitated())
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] knocks on [src]...</span>", "<span class='boldannounce'>You tentatively knock on [src]...</span>")
|
||||
playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, 1)
|
||||
is_anyone_home = TRUE
|
||||
sleep(50)
|
||||
if(boss)
|
||||
to_chat(user, "<span class='notice'>There's no response.</span>")
|
||||
is_anyone_home = FALSE
|
||||
return 0
|
||||
boss = TRUE
|
||||
visible_message("<span class='warning'>Locks along the door begin clicking open from within...</span>")
|
||||
var/volume = 60
|
||||
for(var/i in 1 to 3)
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', volume, 0)
|
||||
volume += 20
|
||||
sleep(10)
|
||||
sleep(10)
|
||||
visible_message("<span class='userdanger'>Something horrible emerges from the Necropolis!</span>")
|
||||
message_admins("[key_name_admin(user)] has summoned Legion!")
|
||||
log_game("[key_name(user)] summoned Legion.")
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.z == z)
|
||||
to_chat(M, "<span class='userdanger'>Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has come.</span>")
|
||||
M << 'sound/creatures/legion_spawn.ogg'
|
||||
flash_color(M, flash_color = "#FF0000", flash_time = 50)
|
||||
var/mutable_appearance/door_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor")
|
||||
notify_ghosts("Legion has been summoned in the [get_area(src)]!", source = src, alert_overlay = door_overlay, action = NOTIFY_JUMP)
|
||||
is_anyone_home = FALSE
|
||||
new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
|
||||
/obj/structure/necropolis_gate/Initialize()
|
||||
. = ..()
|
||||
setDir(SOUTH)
|
||||
var/turf/sight_blocker_turf = get_turf(src)
|
||||
if(sight_blocker_distance)
|
||||
for(var/i in 1 to sight_blocker_distance)
|
||||
if(!sight_blocker_turf)
|
||||
break
|
||||
sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
|
||||
if(sight_blocker_turf)
|
||||
sight_blocker = new (sight_blocker_turf) //we need to block sight in a different spot than most things do
|
||||
sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
|
||||
icon_state = "gate_bottom"
|
||||
top_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_top")
|
||||
top_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(top_overlay)
|
||||
door_overlay = mutable_appearance('icons/effects/96x96.dmi', "door")
|
||||
door_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(door_overlay)
|
||||
dais_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_dais")
|
||||
dais_overlay.layer = CLOSED_TURF_LAYER
|
||||
add_overlay(dais_overlay)
|
||||
|
||||
/obj/structure/necropolis_gate/Destroy(force)
|
||||
if(force)
|
||||
qdel(sight_blocker, TRUE)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/necropolis_gate/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/necropolis_gate/Destroy(force)
|
||||
/obj/structure/necropolis_gate/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(get_dir(loc, target) == dir)
|
||||
return !density
|
||||
return 1
|
||||
|
||||
/obj/structure/necropolis_gate/CheckExit(atom/movable/O, target)
|
||||
if(get_dir(O.loc, target) == dir)
|
||||
return !density
|
||||
return 1
|
||||
|
||||
/obj/structure/opacity_blocker
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "gate_blocker"
|
||||
layer = EDGED_TURF_LAYER
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
mouse_opacity = 0
|
||||
opacity = TRUE
|
||||
|
||||
/obj/structure/opacity_blocker/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/opacity_blocker/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/necropolis_gate/attack_hand(mob/user)
|
||||
if(locked)
|
||||
to_chat(user, "<span class='boldannounce'>It's [open ? "stuck open":"locked"].</span>")
|
||||
return
|
||||
toggle_the_gate(user)
|
||||
|
||||
/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged)
|
||||
if(changing_openness)
|
||||
return
|
||||
changing_openness = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
if(open)
|
||||
new /obj/effect/temp_visual/necropolis(T)
|
||||
visible_message("<span class='boldwarning'>The door slams closed!</span>")
|
||||
sleep(1)
|
||||
playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 80000)
|
||||
sleep(1)
|
||||
density = TRUE
|
||||
sleep(1)
|
||||
var/turf/sight_blocker_turf = get_turf(src)
|
||||
if(sight_blocker_distance)
|
||||
for(var/i in 1 to sight_blocker_distance)
|
||||
if(!sight_blocker_turf)
|
||||
break
|
||||
sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
|
||||
if(sight_blocker_turf)
|
||||
sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
|
||||
sight_blocker.forceMove(sight_blocker_turf)
|
||||
sleep(2.5)
|
||||
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000)
|
||||
add_overlay(door_overlay)
|
||||
open = FALSE
|
||||
else
|
||||
cut_overlay(door_overlay)
|
||||
new /obj/effect/temp_visual/necropolis/open(T)
|
||||
sleep(2)
|
||||
visible_message("<span class='warning'>The door starts to grind open...</span>")
|
||||
playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000)
|
||||
sleep(22)
|
||||
sight_blocker.forceMove(src)
|
||||
sleep(5)
|
||||
density = FALSE
|
||||
sleep(5)
|
||||
open = TRUE
|
||||
changing_openness = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/necropolis_gate/locked
|
||||
locked = TRUE
|
||||
|
||||
GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
|
||||
/obj/structure/necropolis_gate/legion_gate
|
||||
desc = "A tremendous, impossibly large gateway, set into a massive tower of stone."
|
||||
sight_blocker_distance = 2
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/Initialize()
|
||||
. = ..()
|
||||
GLOB.necropolis_gate = src
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/Destroy(force)
|
||||
if(force)
|
||||
if(GLOB.necropolis_gate == src)
|
||||
GLOB.necropolis_gate = null
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user)
|
||||
if(!open && !changing_openness)
|
||||
var/safety = alert(user, "You think this might be a bad idea...", "Knock on the door?", "Proceed", "Abort")
|
||||
if(safety == "Abort" || !in_range(src, user) || !src || open || changing_openness || user.incapacitated())
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] knocks on [src]...</span>", "<span class='boldannounce'>You tentatively knock on [src]...</span>")
|
||||
playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, 1)
|
||||
sleep(50)
|
||||
..()
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged)
|
||||
if(open)
|
||||
return
|
||||
. = ..()
|
||||
if(.)
|
||||
locked = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='userdanger'>Something horrible emerges from the Necropolis!</span>")
|
||||
if(legion_damaged)
|
||||
message_admins("Legion took damage while the necropolis gate was closed, and has released itself!")
|
||||
log_game("Legion took damage while the necropolis gate was closed and released itself.")
|
||||
else
|
||||
message_admins("[user ? "key_name_admin(user)":"Unknown"] has released Legion!")
|
||||
log_game("[user ? "key_name(user)":"Unknown"] released Legion.")
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.z == z)
|
||||
to_chat(M, "<span class='userdanger'>Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.</span>")
|
||||
M.playsound_local(T, 'sound/creatures/legion_spawn.ogg', 100, FALSE, 0, FALSE, pressure_affected = FALSE)
|
||||
flash_color(M, flash_color = "#FF0000", flash_time = 50)
|
||||
var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor")
|
||||
notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP)
|
||||
|
||||
/obj/effect/temp_visual/necropolis
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "door_closing"
|
||||
appearance_flags = 0
|
||||
duration = 6
|
||||
layer = EDGED_TURF_LAYER
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temp_visual/necropolis/open
|
||||
icon_state = "door_opening"
|
||||
duration = 38
|
||||
|
||||
/obj/structure/necropolis_arch
|
||||
name = "necropolis arch"
|
||||
desc = "A massive arch over the necropolis gate, set into a massive tower of stone."
|
||||
icon = 'icons/effects/160x160.dmi'
|
||||
icon_state = "arch_full"
|
||||
appearance_flags = 0
|
||||
layer = TABLE_LAYER
|
||||
anchored = TRUE
|
||||
pixel_x = -64
|
||||
pixel_y = -40
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/open = FALSE
|
||||
var/static/mutable_appearance/top_overlay
|
||||
|
||||
/obj/structure/necropolis_arch/Initialize()
|
||||
. = ..()
|
||||
icon_state = "arch_bottom"
|
||||
top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top")
|
||||
top_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(top_overlay)
|
||||
|
||||
/obj/structure/necropolis_arch/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/necropolis_arch/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
@@ -66,7 +231,8 @@
|
||||
name = "stone tile"
|
||||
icon = 'icons/turf/boss_floors.dmi'
|
||||
icon_state = "pristine_tile1"
|
||||
layer = OVER_LATTICE_LAYER
|
||||
layer = ABOVE_OPEN_TURF_LAYER
|
||||
anchored = TRUE
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/tile_key = "pristine_tile"
|
||||
var/tile_random_sprite_max = 24
|
||||
@@ -75,6 +241,12 @@
|
||||
. = ..()
|
||||
icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
|
||||
|
||||
/obj/structure/stone_tile/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/stone_tile/block
|
||||
name = "stone block"
|
||||
icon_state = "pristine_block1"
|
||||
|
||||
Reference in New Issue
Block a user