diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index 381c821d498..d384a88bd27 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -30,7 +30,7 @@ /turf/closed/wall, /area/ruin/space/has_grav/onehalf/hallway) "al" = ( -/obj/machinery/sleeper/syndie{ +/obj/machinery/sleeper/self_control{ dir = 4 }, /turf/open/floor/iron/white, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index a8c30b7eeea..5936e4ecee9 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -9290,7 +9290,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "EN" = ( -/obj/machinery/sleeper/syndie{ +/obj/machinery/sleeper/self_control{ dir = 1 }, /obj/effect/turf_decal/bot_white, @@ -9302,7 +9302,7 @@ /area/awaymission/snowdin/cave) "EP" = ( /obj/effect/turf_decal/bot_white, -/obj/machinery/sleeper/syndie{ +/obj/machinery/sleeper/self_control{ dir = 1 }, /turf/open/floor/iron/dark, diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index a900927a985..56c0203632b 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -370,7 +370,7 @@ /obj/machinery/proc/can_be_occupant(atom/movable/occupant_atom) return occupant_typecache ? is_type_in_typecache(occupant_atom, occupant_typecache) : isliving(occupant_atom) -/obj/machinery/proc/close_machine(atom/movable/target = null) +/obj/machinery/proc/close_machine(atom/movable/target) state_open = FALSE set_density(TRUE) if(!target) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/sleepers.dm similarity index 70% rename from code/game/machinery/Sleeper.dm rename to code/game/machinery/sleepers.dm index 7f28327131a..7e668d49c70 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/sleepers.dm @@ -1,9 +1,3 @@ -/obj/machinery/sleep_console - name = "sleeper console" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "console" - density = FALSE - /obj/machinery/sleeper name = "sleeper" desc = "An enclosed machine used to stabilize and heal patients." @@ -15,25 +9,52 @@ state_open = TRUE circuit = /obj/item/circuitboard/machine/sleeper - var/efficiency = 1 - var/min_health = -25 - var/list/available_chems - var/controls_inside = FALSE - var/list/possible_chems = list( - list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/morphine, /datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/c2/libital, /datum/reagent/medicine/c2/aiuri), - list(/datum/reagent/medicine/oculine,/datum/reagent/medicine/inacusiate), - list(/datum/reagent/medicine/c2/multiver, /datum/reagent/medicine/mutadone, /datum/reagent/medicine/mannitol, /datum/reagent/medicine/salbutamol, /datum/reagent/medicine/pen_acid), - list(/datum/reagent/medicine/omnizine) - ) - var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: mutadone -> morphine - var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning - var/enter_message = "You feel cool air surround you. You go numb as your senses turn inward." payment_department = ACCOUNT_MED fair_market_price = 5 + ///How much chems is allowed to be in a patient at once, before we force them to wait for the reagent to process. + var/efficiency = 1 + ///The minimum damage required to use any chem other than Epinephrine. + var/min_health = -25 + ///Whether the machine can be operated by the person inside of it. + var/controls_inside = FALSE + ///Whether this sleeper can be deconstructed and drop the board, if its on mapload. + var/deconstructable = FALSE + ///Message sent when a user enters the machine. + var/enter_message = span_boldnotice("You feel cool air surround you. You go numb as your senses turn inward.") + + ///List of currently available chems. + var/list/available_chems = list() + ///Used when emagged to scramble which chem is used, eg: mutadone -> morphine + var/list/chem_buttons + ///All chems this sleeper will get, depending on the parts inside. + var/list/possible_chems = list( + list( + /datum/reagent/medicine/epinephrine, + /datum/reagent/medicine/morphine, + /datum/reagent/medicine/c2/convermol, + /datum/reagent/medicine/c2/libital, + /datum/reagent/medicine/c2/aiuri, + ), + list( + /datum/reagent/medicine/oculine, + /datum/reagent/medicine/inacusiate, + ), + list( + /datum/reagent/medicine/c2/multiver, + /datum/reagent/medicine/mutadone, + /datum/reagent/medicine/mannitol, + /datum/reagent/medicine/salbutamol, + /datum/reagent/medicine/pen_acid, + ), + list( + /datum/reagent/medicine/omnizine, + ), + ) + /obj/machinery/sleeper/Initialize(mapload) . = ..() - if(mapload) + if(mapload && !deconstructable) LAZYREMOVE(component_parts, circuit) QDEL_NULL(circuit) occupant_typecache = GLOB.typecache_living @@ -42,18 +63,17 @@ /obj/machinery/sleeper/RefreshParts() . = ..() - var/E - for(var/obj/item/stock_parts/matter_bin/B in component_parts) - E += B.rating - var/I - for(var/obj/item/stock_parts/manipulator/M in component_parts) - I += M.rating + var/matterbin_rating + for(var/obj/item/stock_parts/matter_bin/matterbins in component_parts) + matterbin_rating += matterbins.rating + efficiency = initial(efficiency) * matterbin_rating + min_health = initial(min_health) * matterbin_rating + + available_chems.Cut() + for(var/obj/item/stock_parts/manipulator/manipulators in component_parts) + for(var/i in 1 to manipulators.rating) + available_chems |= possible_chems[i] - efficiency = initial(efficiency)* E - min_health = initial(min_health) * E - available_chems = list() - for(var/i in 1 to I) - available_chems |= possible_chems[i] reset_chem_buttons() /obj/machinery/sleeper/update_icon_state() @@ -77,12 +97,12 @@ /obj/machinery/sleeper/open_machine() if(!state_open && !panel_open) flick("[initial(icon_state)]-anim", src) - ..() + return ..() /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) flick("[initial(icon_state)]-anim", src) - ..(user) + ..() var/mob/living/mob_occupant = occupant if(mob_occupant && mob_occupant.stat != DEAD) to_chat(mob_occupant, "[enter_message]") @@ -98,28 +118,25 @@ /obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) if(HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) return - close_machine(target) - /obj/machinery/sleeper/screwdriver_act(mob/living/user, obj/item/I) - . = TRUE - if(..()) - return + . = ..() if(occupant) to_chat(user, span_warning("[src] is currently occupied!")) - return + return TRUE if(state_open) to_chat(user, span_warning("[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!")) - return + return TRUE if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) - return + return TRUE return FALSE /obj/machinery/sleeper/wrench_act(mob/living/user, obj/item/I) . = ..() if(default_change_direction_wrench(user, I)) return TRUE + return FALSE /obj/machinery/sleeper/crowbar_act(mob/living/user, obj/item/I) . = ..() @@ -127,6 +144,7 @@ return TRUE if(default_deconstruction_crowbar(I)) return TRUE + return FALSE /obj/machinery/sleeper/default_pry_open(obj/item/I) //wew . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR @@ -161,21 +179,27 @@ /obj/machinery/sleeper/process() ..() - check_nap_violations() - use_power(active_power_usage) + use_power(idle_power_usage) /obj/machinery/sleeper/nap_violation(mob/violator) + . = ..() open_machine() /obj/machinery/sleeper/ui_data() var/list/data = list() - data["occupied"] = occupant ? 1 : 0 + data["occupied"] = !!occupant data["open"] = state_open data["chems"] = list() for(var/chem in available_chems) var/datum/reagent/R = GLOB.chemical_reagents_list[chem] - data["chems"] += list(list("name" = R.name, "id" = R.type, "allowed" = chem_allowed(chem))) + data["chems"] += list( + list( + "name" = R.name, + "id" = R.type, + "allowed" = chem_allowed(chem), + ), + ) data["occupant"] = list() var/mob/living/mob_occupant = occupant @@ -208,7 +232,13 @@ for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) if(R.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems continue - data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) + data["occupant"]["reagents"] += list( + list( + "name" = R.name, + "volume" = R.volume, + ), + ) + return data /obj/machinery/sleeper/ui_act(action, params) @@ -229,16 +259,23 @@ var/chem = text2path(params["chem"]) if(!is_operational || !mob_occupant || isnull(chem)) return - if(mob_occupant.health < min_health && chem != /datum/reagent/medicine/epinephrine) + if(mob_occupant.health < min_health && !ispath(chem, /datum/reagent/medicine/epinephrine)) return if(inject_chem(chem, usr)) . = TRUE - if(scrambled_chems && prob(5)) + if((obj_flags & EMAGGED) && prob(5)) to_chat(usr, span_warning("Chemical system re-route detected, results may not be as expected!")) /obj/machinery/sleeper/emag_act(mob/user) - scramble_chem_buttons() + if(obj_flags & EMAGGED) + return + to_chat(user, span_warning("You scramble the sleeper's user interface!")) + obj_flags |= EMAGGED + + var/list/av_chem = available_chems.Copy() + for(var/chem in av_chem) + chem_buttons[chem] = pick_n_take(av_chem) //no dupes, allow for random buttons to still be correct /obj/machinery/sleeper/proc/inject_chem(chem, mob/user) if((chem in available_chems) && chem_allowed(chem)) @@ -256,26 +293,28 @@ return amount && occ_health /obj/machinery/sleeper/proc/reset_chem_buttons() - scrambled_chems = FALSE + obj_flags &= ~EMAGGED LAZYINITLIST(chem_buttons) for(var/chem in available_chems) chem_buttons[chem] = chem -/obj/machinery/sleeper/proc/scramble_chem_buttons() - scrambled_chems = TRUE - var/list/av_chem = available_chems.Copy() - for(var/chem in av_chem) - chem_buttons[chem] = pick_n_take(av_chem) //no dupes, allow for random buttons to still be correct - - +/** + * Syndicate version + * Can be controlled from the inside and can be deconstructed. + */ /obj/machinery/sleeper/syndie icon_state = "sleeper_s" base_icon_state = "sleeper_s" controls_inside = TRUE + deconstructable = TRUE +///Fully upgraded variant, the circuit using tier 4 parts. /obj/machinery/sleeper/syndie/fullupgrade circuit = /obj/item/circuitboard/machine/sleeper/fullupgrade +/obj/machinery/sleeper/self_control + controls_inside = TRUE + /obj/machinery/sleeper/old icon_state = "oldpod" base_icon_state = "oldpod" @@ -286,24 +325,41 @@ icon_state = "partypod" base_icon_state = "partypod" circuit = /obj/item/circuitboard/machine/sleeper/party - var/leddit = FALSE //Get it like reddit and lead alright fine - controls_inside = TRUE + deconstructable = TRUE + enter_message = span_boldnotice("You're surrounded by some funky music inside the chamber. You zone out as you feel waves of krunk vibe within you.") + + //Exclusively uses non-lethal, "fun" chems. At an obvious downside. possible_chems = list( - list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/laughter), - list(/datum/reagent/spraytan,/datum/reagent/barbers_aid), - list(/datum/reagent/colorful_reagent,/datum/reagent/hair_dye), - list(/datum/reagent/drug/space_drugs,/datum/reagent/baldium) - )//Exclusively uses non-lethal, "fun" chems. At an obvious downside. + list( + /datum/reagent/consumable/ethanol/beer, + /datum/reagent/consumable/laughter, + ), + list( + /datum/reagent/spraytan, + /datum/reagent/barbers_aid, + ), + list( + /datum/reagent/colorful_reagent, + /datum/reagent/hair_dye, + ), + list( + /datum/reagent/drug/space_drugs, + /datum/reagent/baldium, + ), + ) + ///Chemicals that need to have a touch or vapor reaction to be applied, not the standard chamber reaction. var/spray_chems = list( - /datum/reagent/spraytan, /datum/reagent/hair_dye, /datum/reagent/baldium, /datum/reagent/barbers_aid - )//Chemicals that need to have a touch or vapor reaction to be applied, not the standard chamber reaction. - enter_message = "You're surrounded by some funky music inside the chamber. You zone out as you feel waves of krunk vibe within you." + /datum/reagent/spraytan, + /datum/reagent/hair_dye, + /datum/reagent/baldium, + /datum/reagent/barbers_aid, + ) /obj/machinery/sleeper/party/inject_chem(chem, mob/user) - if(leddit) - occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, 4) //You're injecting chemicals into yourself from a recalled, decrepit medical machine. What did you expect? - else if (prob(20)) + if(obj_flags & EMAGGED) + occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, 4) + else if (prob(20)) //You're injecting chemicals into yourself from a recalled, decrepit medical machine. What did you expect? occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, rand(1,3)) if(chem in spray_chems) var/datum/reagents/holder = new() @@ -313,8 +369,4 @@ if(user) log_combat(user, occupant, "sprayed [chem] into", addition = "via [src]") return TRUE - ..() - -/obj/machinery/sleeper/party/emag_act(mob/user) - ..() - leddit = TRUE + return ..() diff --git a/tgstation.dme b/tgstation.dme index 8a50776faaa..1513c093d4a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1354,7 +1354,7 @@ #include "code\game\machinery\scan_gate.dm" #include "code\game\machinery\sheetifier.dm" #include "code\game\machinery\shieldgen.dm" -#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\sleepers.dm" #include "code\game\machinery\slotmachine.dm" #include "code\game\machinery\spaceheater.dm" #include "code\game\machinery\stasis.dm"