From 8a8f4ab913e606359e20e61837ae82faa1cbf0bc Mon Sep 17 00:00:00 2001 From: Geeves Date: Thu, 29 Apr 2021 11:54:08 +0200 Subject: [PATCH] Stasis Beds (#11755) --- aurorastation.dme | 1 + code/_helpers/unsorted.dm | 2 +- code/game/machinery/stasis_bed.dm | 125 ++++++++++++++++++ .../circuitboards/machinery/miscboards.dm | 13 ++ .../structures/stool_bed_chair_nest/bed.dm | 2 +- code/game/sound.dm | 4 +- .../designs/circuit/machine_circuits.dm | 5 + html/changelogs/geeves-stasis_bed.yml | 6 + icons/obj/stasis_bed.dmi | Bin 0 -> 4014 bytes 9 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 code/game/machinery/stasis_bed.dm create mode 100644 html/changelogs/geeves-stasis_bed.yml create mode 100644 icons/obj/stasis_bed.dmi diff --git a/aurorastation.dme b/aurorastation.dme index 87b09b2bbfc..4b0c9a4ad81 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -659,6 +659,7 @@ #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\stasis_bed.dm" #include "code\game\machinery\station_holomap.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 6bdd16357cc..2ff74f50b2e 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -828,7 +828,7 @@ var/global/list/common_tools = list( /proc/can_operate(mob/living/carbon/M) //If it's 2, commence surgery, if it's 1, fail surgery, if it's 0, attack var/surgery_attempt = SURGERY_IGNORE var/located = FALSE - if(locate(/obj/machinery/optable, M.loc)) + if(istype(M.buckled_to, /obj/machinery/stasis_bed) || locate(/obj/machinery/optable, M.loc)) located = TRUE surgery_attempt = SURGERY_SUCCESS else if(locate(/obj/structure/bed/roller, M.loc)) diff --git a/code/game/machinery/stasis_bed.dm b/code/game/machinery/stasis_bed.dm new file mode 100644 index 00000000000..04c125f1a79 --- /dev/null +++ b/code/game/machinery/stasis_bed.dm @@ -0,0 +1,125 @@ +/obj/machinery/stasis_bed + name = "lifeform stasis unit" + desc = "A not so comfortable looking bed with some nozzles at the top and bottom. It will keep someone in stasis." + desc_info = "You can alt-click this to toggle it on or off." + icon = 'icons/obj/stasis_bed.dmi' + icon_state = "stasis" + + buckle_lying = TRUE + can_buckle = list(/mob/living/carbon/human) + + idle_power_usage = 40 + active_power_usage = 340 + + var/mob/living/carbon/human/occupant + + var/stasis_enabled = FALSE + var/chilled_occupant = FALSE + var/last_stasis_sound = FALSE + var/stasis_can_toggle = 0 + + component_types = list( + /obj/item/circuitboard/stasis_bed, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/capacitor = 2, + /obj/item/stock_parts/scanning_module = 2, + /obj/item/stock_parts/console_screen + ) + +/obj/machinery/stasis_bed/Initialize(mapload, d, populate_components) + . = ..() + update_icon() + +/obj/machinery/stasis_bed/attackby(obj/item/I, mob/user) + if(default_part_replacement(user, I)) + return + else if(default_deconstruction_screwdriver(user, I)) + return + else if(default_deconstruction_crowbar(user, I)) + return + return ..() + +/obj/machinery/stasis_bed/proc/play_power_sound() + var/_running = stasis_running() + if(last_stasis_sound != _running) + var/sound_freq = rand(5120, 8800) + if(_running) + playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = sound_freq) + else + playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = sound_freq) + last_stasis_sound = _running + +/obj/machinery/stasis_bed/AltClick(mob/user) + if((world.time >= stasis_can_toggle) && !use_check_and_message(user) && !(stat & (NOPOWER|BROKEN))) + stasis_enabled = !stasis_enabled + stasis_can_toggle = world.time + 5 SECONDS + playsound(src, 'sound/machines/click.ogg', 60, TRUE) + user.visible_message(SPAN_NOTICE("\The [src] [stasis_enabled ? "powers on" : "shuts down"]."), \ + SPAN_NOTICE("You [stasis_enabled ? "power on" : "shut down"] \the [src]."), \ + SPAN_NOTICE("You hear a nearby machine [stasis_enabled ? "power on" : "shut down"].")) + play_power_sound() + update_icon() + +/obj/machinery/stasis_bed/Exited(atom/movable/AM, atom/newloc) + if(AM == occupant) + var/mob/living/L = AM + thaw_occupant(L) + . = ..() + +/obj/machinery/stasis_bed/proc/stasis_running() + return stasis_enabled && !(stat & (NOPOWER|BROKEN)) + +/obj/machinery/stasis_bed/update_icon() + cut_overlays() + if(stat & BROKEN) + icon_state = "[initial(icon_state)]_broken" + return ..() + icon_state = initial(icon_state) + if(panel_open || (stat & MAINT)) + add_overlay("stasis_maintenance") + if(stasis_running()) + add_overlay("stasis_on") + +/obj/machinery/stasis_bed/power_change() + . = ..() + play_power_sound() + +/obj/machinery/stasis_bed/proc/chill_occupant(mob/living/target) + if(target != occupant) + return + if(!stasis_running()) + return + + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = rand(24750, 26550)) + target.ExtinguishMobCompletely() + update_use_power(2) + chilled_occupant = TRUE + +/obj/machinery/stasis_bed/proc/thaw_occupant(mob/living/target) + if(target != occupant) + return + + update_use_power(1) + occupant = null + chilled_occupant = FALSE + +/obj/machinery/stasis_bed/post_buckle(mob/living/carbon/human/H) + if(H.buckled_to == src) + occupant = H + if(stasis_running()) + chill_occupant(H) + else + thaw_occupant(H) + update_icon() + +/obj/machinery/stasis_bed/machinery_process() + if(stat & (NOPOWER|BROKEN)) + return + if(!occupant) + update_use_power(1) + return + + if(!chilled_occupant) + chill_occupant(occupant) + + occupant.SetStasis(15) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm index ddc5e602504..1eba66dbe27 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm @@ -21,6 +21,19 @@ "/obj/item/stock_parts/console_screen" = 1, "/obj/item/reagent_containers/glass/beaker/large" = 1) +/obj/item/circuitboard/stasis_bed + name = T_BOARD("Lifeform Stasis Unit") + desc = "The circuitboard for a lifeform stasis unit." + build_path = /obj/machinery/stasis_bed + origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4, TECH_BIO = 4) + board_type = "machine" + req_components = list( + "/obj/item/stock_parts/micro_laser" = 1, + "/obj/item/stock_parts/capacitor" = 2, + "/obj/item/stock_parts/scanning_module" = 2, + "/obj/item/stock_parts/console_screen" = 1 + ) + /obj/item/circuitboard/cryotube name = T_BOARD("Cryo Cell") desc = "The circuitboard for a cryo tube." diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index cfabcfe2487..37cf71184b7 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -31,7 +31,7 @@ slowdown = 5 /obj/structure/bed/Initialize() - ..() + . = ..() LAZYADD(can_buckle, /mob/living) /obj/structure/bed/New(newloc, new_material = MATERIAL_STEEL, new_padding_material) diff --git a/code/game/sound.dm b/code/game/sound.dm index 154e4111a50..9ac6c0b8523 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -42,12 +42,12 @@ #define DROP_SOUND_VOLUME 20 #define THROW_SOUND_VOLUME 90 -/proc/playsound(atom/source, soundin, vol, vary, extrarange, falloff, is_global, usepressure = 1, environment = -1, required_preferences = 0, required_asfx_toggles = 0) +/proc/playsound(atom/source, soundin, vol, vary, extrarange, falloff, is_global, usepressure = 1, environment = -1, required_preferences = 0, required_asfx_toggles = 0, frequency = 0) if (isarea(source)) crash_with("[source] is an area and is trying to make the sound: [soundin]") return - var/sound/original_sound = playsound_get_sound(soundin, vol, falloff, 0, environment) + var/sound/original_sound = playsound_get_sound(soundin, vol, falloff, frequency, environment) if (!original_sound) crash_with("Could not construct original sound.") diff --git a/code/modules/research/designs/circuit/machine_circuits.dm b/code/modules/research/designs/circuit/machine_circuits.dm index 15d98c3fc36..f66392a60c4 100644 --- a/code/modules/research/designs/circuit/machine_circuits.dm +++ b/code/modules/research/designs/circuit/machine_circuits.dm @@ -76,6 +76,11 @@ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) build_path = /obj/item/circuitboard/sleeper +/datum/design/circuit/machine/stasis_bed + name = "Lifeform Stasis Unit" + req_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4, TECH_BIO = 4) + build_path = /obj/item/circuitboard/stasis_bed + /datum/design/circuit/machine/bodyscannerm name = "Body Scanner" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) diff --git a/html/changelogs/geeves-stasis_bed.yml b/html/changelogs/geeves-stasis_bed.yml new file mode 100644 index 00000000000..1d2a911763e --- /dev/null +++ b/html/changelogs/geeves-stasis_bed.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Ported stasis beds. RnD can print their circuitboards once they've reached level four research in magnets, engineering and bio." \ No newline at end of file diff --git a/icons/obj/stasis_bed.dmi b/icons/obj/stasis_bed.dmi new file mode 100644 index 0000000000000000000000000000000000000000..72180cdd4d5ebfa76d5b81bf0335189ad2d678ae GIT binary patch literal 4014 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 Zrf*>>gyL==`2!9-d|<3of8X)d{{fve%1r