From ec382248c7426cbba34be7f17d474be190a5e136 Mon Sep 17 00:00:00 2001
From: S34N <12197162+S34NW@users.noreply.github.com>
Date: Sun, 14 Aug 2022 15:55:21 +0100
Subject: [PATCH] Somewhat tidies necropolis code (#18722)
* tidies necropolis code
* Update code/modules/ruins/objects_and_mobs/necropolis_gate.dm
Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com>
Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com>
---
code/game/turfs/simulated/floor.dm | 3 -
.../ruins/objects_and_mobs/necropolis_gate.dm | 178 +++++-------------
2 files changed, 49 insertions(+), 132 deletions(-)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index b71c5542802..de18fc311ba 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -98,9 +98,6 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
/turf/simulated/floor/proc/find_safeties()
var/static/list/safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
var/list/found_safeties = typecache_filter_list(contents, safeties_typecache)
- for(var/obj/structure/stone_tile/S in found_safeties)
- if(S.fallen)
- LAZYREMOVE(found_safeties, S)
return LAZYLEN(found_safeties)
/turf/simulated/floor/blob_act(obj/structure/blob/B)
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index 2277e096a30..73399bcb3e8 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -25,7 +25,6 @@
/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)
@@ -36,35 +35,35 @@
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/Destroy()
+ qdel(sight_blocker, TRUE)
+ return ..()
/obj/structure/necropolis_gate/singularity_pull()
- return 0
+ return
/obj/structure/necropolis_gate/CanPass(atom/movable/mover, turf/target)
if(get_dir(loc, target) == dir)
return !density
- return 1
+ return TRUE
/obj/structure/necropolis_gate/CheckExit(atom/movable/O, target)
if(get_dir(O.loc, target) == dir)
return !density
- return 1
+ return TRUE
/obj/structure/opacity_blocker
icon = 'icons/effects/96x96.dmi'
@@ -77,35 +76,33 @@
anchored = TRUE
/obj/structure/opacity_blocker/singularity_pull()
- return 0
-
-/obj/structure/opacity_blocker/Destroy(force)
- if(force)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
+ return
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/necropolis_gate/attack_hand(mob/user)
+ . = ..()
if(locked)
to_chat(user, "It's [open ? "stuck open":"locked"].")
return
- toggle_the_gate(user)
- return ..()
-/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged)
+ if(GLOB.necropolis_gate == src) //funny override for knock knock gate
+ addtimer(CALLBACK(src, .proc/toggle_the_gate, user), 5 SECONDS, TIMER_UNIQUE)
+ return
+
+ toggle_the_gate(user)
+
+/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user)
if(changing_openness)
return
+
changing_openness = TRUE
var/turf/T = get_turf(src)
+
if(open)
new /obj/effect/temp_visual/necropolis(T)
visible_message("The door slams closed!")
- 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)
@@ -115,25 +112,28 @@
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("The door starts to grind open...")
- 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
+ addtimer(CALLBACK(src, .proc/toggle_open_delayed_step, T), 0.5 SECONDS, TIMER_UNIQUE)
+ return TRUE
+
+ cut_overlay(door_overlay)
+ new /obj/effect/temp_visual/necropolis/open(T)
+ visible_message("The door starts to grind open...")
+ playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000)
+ addtimer(CALLBACK(src, .proc/toggle_closed_delayed_step), 2.2 SECONDS, TIMER_UNIQUE)
return TRUE
+/obj/structure/necropolis_gate/proc/toggle_open_delayed_step(turf/T)
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000)
+ add_overlay(door_overlay)
+ open = FALSE
+ changing_openness = FALSE
+
+/obj/structure/necropolis_gate/proc/toggle_closed_delayed_step()
+ sight_blocker.forceMove(src)
+ density = FALSE
+ open = TRUE
+ changing_openness = FALSE
+
/obj/structure/necropolis_gate/locked
locked = TRUE
@@ -146,13 +146,10 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
. = ..()
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/Destroy()
+ if(GLOB.necropolis_gate == src)
+ GLOB.necropolis_gate = null
+ return ..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user)
@@ -162,23 +159,17 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
return
user.visible_message("[user] knocks on [src]...", "You tentatively knock on [src]...")
playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, 1)
- sleep(50)
return ..()
-/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged)
+/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user)
if(open)
return
- . = ..()
- if(.)
+ if(..())
locked = TRUE
var/turf/T = get_turf(src)
visible_message("Something horrible emerges from the Necropolis!")
- 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 ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!")
- log_game("[user ? key_name(user) : "Unknown"] released Legion.")
+ message_admins("[user ? ADMIN_LOOKUPFLW(user) : "Unknown"] has released Legion!")
+ log_game("[user ? key_name(user) : "Unknown"] released Legion.")
var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg')
for(var/mob/M in GLOB.player_list)
@@ -224,18 +215,8 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
add_overlay(top_overlay)
/obj/structure/necropolis_arch/singularity_pull()
- return 0
+ return
-/obj/structure/necropolis_arch/Destroy(force)
- if(force)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
-#define STABLE 0 //The tile is stable and won't collapse/sink when crossed.
-#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed.
-#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed.
-#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed.
//stone tiles for boss arenas
/obj/structure/stone_tile
name = "stone tile"
@@ -246,70 +227,14 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/tile_key = "pristine_tile"
var/tile_random_sprite_max = 24
- var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed
- var/fallen = FALSE //If the tile is unusable
- var/falling = FALSE //If the tile is falling
/obj/structure/stone_tile/Initialize(mapload)
. = ..()
icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
-/obj/structure/stone_tile/Destroy(force)
- if(force || fallen)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
/obj/structure/stone_tile/singularity_pull()
return
-/obj/structure/stone_tile/Crossed(atom/movable/AM, oldloc)
- if(falling || fallen)
- return
- var/turf/T = get_turf(src)
- if(!islava(T) && !ischasm(T)) //nothing to sink or fall into
- return
- var/obj/item/I
- if(istype(AM, /obj/item))
- I = AM
- var/mob/living/L
- if(isliving(AM))
- L = AM
- switch(fall_on_cross)
- if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS)
- if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.flying) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah!
- collapse()
- if(UNIQUE_EFFECT)
- crossed_effect(AM)
-
-/obj/structure/stone_tile/proc/collapse()
- falling = TRUE
- var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS
- playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE)
- Shake(-1, -1, 25)
- sleep(5)
- if(break_that_sucker)
- playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
- else
- playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE)
- animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5)
- fallen = TRUE
- if(break_that_sucker)
- QDEL_IN(src, 10)
- else
- addtimer(CALLBACK(src, .proc/rebuild), 55)
-
-/obj/structure/stone_tile/proc/rebuild()
- pixel_x = initial(pixel_x)
- pixel_y = initial(pixel_y) - 5
- animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30)
- sleep(30)
- falling = FALSE
- fallen = FALSE
-
-/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM, oldloc)
- return
-
/obj/structure/stone_tile/block
name = "stone block"
icon_state = "pristine_block1"
@@ -403,8 +328,3 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
name = "burnt stone surrounding tile"
icon_state = "burnt_surrounding_tile1"
tile_key = "burnt_surrounding_tile"
-
-#undef STABLE
-#undef COLLAPSE_ON_CROSS
-#undef DESTROY_ON_CROSS
-#undef UNIQUE_EFFECT