From 85ea77d01e28b03b0abcf3a00ad41d077a6d8b06 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Mon, 15 Feb 2021 20:47:15 +0000 Subject: [PATCH] Disaster Counters --- _maps/map_files/Delta/delta.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 3 + _maps/map_files/cyberiad/cyberiad.dmm | 12 +-- .../objects/structures/disaster_counter.dm | 75 +++++++++++++++++++ paradise.dme | 1 + 5 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 code/game/objects/structures/disaster_counter.dm diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index ab1bcbb423d..eb58f6adf1f 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -81119,10 +81119,10 @@ /turf/simulated/wall/r_wall, /area/medical/chemistry) "cXf" = ( -/obj/machinery/status_display{ +/obj/structure/closet/secure_closet/reagents, +/obj/structure/disaster_counter/chemistry{ pixel_x = -32 }, -/obj/structure/closet/secure_closet/reagents, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitegreen"; diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a4730f26f86..7e5c5d5f11a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -67017,6 +67017,9 @@ /obj/structure/closet/wardrobe/chemistry_white, /obj/item/storage/backpack/satchel_chem, /obj/effect/decal/warning_stripes/south, +/obj/structure/disaster_counter/chemistry{ + pixel_y = 32 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 93e02389793..fcfaf52c53a 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -43596,6 +43596,9 @@ /area/hallway/secondary/entry) "bLD" = ( /obj/structure/closet/secure_closet/reagents, +/obj/structure/disaster_counter/chemistry{ + pixel_x = -32 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whiteyellow" @@ -44752,12 +44755,6 @@ /area/medical/reception) "bNA" = ( /obj/effect/decal/warning_stripes/northeast, -/obj/item/radio/intercom{ - frequency = 1459; - name = "station intercom (General)"; - pixel_x = -28; - pixel_y = 22 - }, /turf/simulated/floor/plasteel, /area/medical/chemistry) "bNB" = ( @@ -78694,6 +78691,9 @@ }, /obj/machinery/meter, /obj/machinery/light, +/obj/structure/disaster_counter/supermatter{ + pixel_y = -32 + }, /turf/simulated/floor/engine, /area/engine/engineering) "cVB" = ( diff --git a/code/game/objects/structures/disaster_counter.dm b/code/game/objects/structures/disaster_counter.dm new file mode 100644 index 00000000000..caf00aed187 --- /dev/null +++ b/code/game/objects/structures/disaster_counter.dm @@ -0,0 +1,75 @@ +/** + * # Disaster counter. + * + * Tracks how many shifts it has been since the counter with that ID was exploded. + */ +/obj/structure/disaster_counter + name = "disaster counter" + desc = "This magical device will count up how many shifts it has been since a major disaster in this area." + icon = 'icons/obj/status_display.dmi' + icon_state = "frame" + maptext_y = 10 // Offset by 10 so it renders properly + /// ID of the counter. Must be overriden + var/counter_id + /// Current count number + var/current_count = 0 + +/obj/structure/disaster_counter/examine(mob/user) + . = ..() + . += "The display reads 'Currently [current_count] shifts without an accident!'" + +/obj/structure/disaster_counter/Initialize(mapload) + . = ..() + if(!counter_id) + stack_trace("Disaster counter at [x],[y],[z] does not have a counter_id set. Deleting...") + return INITIALIZE_HINT_QDEL + + // If we still exist, put ourselves in + SSpersistent_data.register(src) + +/obj/structure/disaster_counter/ex_act(severity) + if(severity < 2) + current_count = -1 + persistent_save() + . = ..() + +/obj/structure/disaster_counter/Destroy() + if(counter_id) + SSpersistent_data.registered_atoms -= src // Take us out the list + return ..() + +/obj/structure/disaster_counter/persistent_load() + // Just incase some bad actor sets the counter ID to "../../../../Windows/System32" + // Yes I am that paranoid + if(counter_id != paranoid_sanitize(counter_id)) + stack_trace("Counter ID did not pass sanitization for disaster counter at [x],[y],[z]. Potential attempt at filesystem manipulation.") + qdel(src) + + var/savefile/S = new /savefile("data/disaster_counters/[counter_id].sav") + S["count"] >> current_count + + if(isnull(current_count)) + current_count = 0 + else + current_count++ // Increase by 1 since this is the next shift without a disaster (yet) + log_debug("Persistent data for [src] loaded (current_count: [current_count])") + maptext = "[current_count]" + +/obj/structure/disaster_counter/persistent_save() + if(counter_id != paranoid_sanitize(counter_id)) + stack_trace("Counter ID did not pass sanitization for disaster counter at [x],[y],[z]. Potential attempt at filesystem manipulation.") + qdel(src) + + var/savefile/S = new /savefile("data/disaster_counters/[counter_id].sav") + + S["count"] << current_count + log_debug("Persistent data for [src] saved (current_count: [current_count])") + +// Prefab definitions to make mapping easier +/obj/structure/disaster_counter/supermatter + name = "supermatter disaster counter" + counter_id = "supermatter" + +/obj/structure/disaster_counter/chemistry + name = "chemistry disaster counter" + counter_id = "chemistry" diff --git a/paradise.dme b/paradise.dme index 6ef21deda02..7456c526951 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1085,6 +1085,7 @@ #include "code\game\objects\structures\coathanger.dm" #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\depot.dm" +#include "code\game\objects\structures\disaster_counter.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\door_assembly_types.dm"