From 562d8539afbd77b53295052efd414572863cc068 Mon Sep 17 00:00:00 2001 From: Cyantime Date: Fri, 15 Sep 2017 15:23:26 -0400 Subject: [PATCH 1/4] Adds thermal regulators. --- code/datums/supplypacks/engineering_vr.dm | 6 + code/game/machinery/airconditioner_vr.dm | 147 +++++++++ icons/obj/machines/thermoregulator_vr.dmi | Bin 0 -> 3798 bytes maps/tether/tether-01-surface.dmm | 361 ++++++++++++---------- maps/tether/tether-03-station.dmm | 3 +- vorestation.dme | 2 + 6 files changed, 362 insertions(+), 157 deletions(-) create mode 100644 code/datums/supplypacks/engineering_vr.dm create mode 100644 code/game/machinery/airconditioner_vr.dm create mode 100644 icons/obj/machines/thermoregulator_vr.dmi diff --git a/code/datums/supplypacks/engineering_vr.dm b/code/datums/supplypacks/engineering_vr.dm new file mode 100644 index 0000000000..d9a7a32edd --- /dev/null +++ b/code/datums/supplypacks/engineering_vr.dm @@ -0,0 +1,6 @@ +/datum/supply_packs/eng/thermoregulator + contains = list(/obj/machinery/power/thermoregulator) + name = "Thermal Regulator" + cost = 30 + containertype = /obj/structure/closet/crate/large + containername = "thermal regulator crate" \ No newline at end of file diff --git a/code/game/machinery/airconditioner_vr.dm b/code/game/machinery/airconditioner_vr.dm new file mode 100644 index 0000000000..d70904d280 --- /dev/null +++ b/code/game/machinery/airconditioner_vr.dm @@ -0,0 +1,147 @@ +#define MODE_IDLE 0 +#define MODE_HEATING 1 +#define MODE_COOLING 2 + +/obj/machinery/power/thermoregulator + name = "thermal regulator" + desc = "A massive machine that can either add or remove thermal energy from the surrounding environment. Must be secured onto a powered wire node to function." + icon = 'icons/obj/machines/thermoregulator_vr.dmi' + icon_state = "lasergen" + density = 1 + anchored = 0 + + use_power = 0 //is powered directly from cables + active_power_usage = 150 KILOWATTS //BIG POWER + idle_power_usage = 500 + + var/on = 0 + var/target_temp = T20C + var/mode = MODE_IDLE + +/obj/machinery/power/thermoregulator/examine(mob/user) + if(..(user,2)) + to_chat(user, "There is a small display that reads \"[convert_k2c(target_temp)]C\".") + +/obj/machinery/power/thermoregulator/attackby(obj/item/I, mob/user) + if(iswrench(I)) + anchored = !anchored + visible_message("\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") + playsound(src, I.usesound, 75, 1) + if(anchored) + connect_to_network() + else + disconnect_from_network() + turn_off() + return + if(ismultitool(I)) + var/new_temp = input("Input a new target temperature, in degrees C.","Target Temperature", 20) as num + if(!Adjacent(user) || user.incapacitated()) + return + new_temp = convert_c2k(new_temp) + target_temp = max(new_temp, TCMB) + return + ..() + +/obj/machinery/power/thermoregulator/attack_hand(mob/user) + add_fingerprint(user) + interact(user) + +/obj/machinery/power/thermoregulator/interact(mob/user) + if(!anchored) + return + on = !on + user.visible_message("[user] [on ? "activates" : "deactivates"] \the [src].","You [on ? "activate" : "deactivate"] \the [src].") + if(!on) + change_mode(MODE_IDLE) + update_icon() + +/obj/machinery/power/thermoregulator/process() + if(!on) + return + if(!powernet) + turn_off() + return + + if(draw_power(idle_power_usage) < idle_power_usage) + visible_message("\The [src] shuts down.") + turn_off() + return + + var/datum/gas_mixture/env = loc.return_air() + if(!env || abs(env.temperature - target_temp) < 1) + change_mode(MODE_IDLE) + return + + var/datum/gas_mixture/removed = env.remove_ratio(0.99) + if(!removed) + change_mode(MODE_IDLE) + return + + var/heat_transfer = removed.get_thermal_energy_change(target_temp) + var/power_avail + if(heat_transfer == 0) //just in case + change_mode(MODE_IDLE) + else if(heat_transfer > 0) + change_mode(MODE_HEATING) + power_avail = draw_power(min(heat_transfer, active_power_usage)) + removed.add_thermal_energy(min(power_avail*5,heat_transfer)) + else + change_mode(MODE_COOLING) + heat_transfer = abs(heat_transfer) + var/cop = removed.temperature/TN60C + var/actual_heat_transfer = heat_transfer + heat_transfer = min(heat_transfer, active_power_usage*cop) + power_avail = draw_power(heat_transfer/cop) + removed.add_thermal_energy(-min(power_avail*5*cop,actual_heat_transfer)) + env.merge(removed) + +/obj/machinery/power/thermoregulator/update_icon() + overlays.Cut() + if(on) + overlays += "lasergen-on" + switch(mode) + if(MODE_HEATING) + overlays += "lasergen-heat" + if(MODE_COOLING) + overlays += "lasergen-cool" + +/obj/machinery/power/thermoregulator/proc/turn_off() + on = 0 + change_mode(MODE_IDLE) + update_icon() + +/obj/machinery/power/thermoregulator/proc/change_mode(new_mode = MODE_IDLE) + if(mode == new_mode) + return + mode = new_mode + update_icon() + +/obj/machinery/power/thermoregulator/emp_act(severity) + if(!on) + on = 1 + target_temp += rand(0, 1000) + update_icon() + ..(severity) + +/obj/machinery/power/thermoregulator/overload(var/obj/machinery/power/source) + if(!anchored || !powernet) + return + var/power_avail = draw_power(active_power_usage*10) + var/datum/gas_mixture/env = loc.return_air() + if(env) + var/datum/gas_mixture/removed = env.remove_ratio(0.99) + if(removed) + removed.add_thermal_energy(power_avail*5) + env.merge(removed) + var/turf/T = get_turf(src) + new /obj/effect/decal/cleanable/liquid_fuel(T, 5) + T.assume_gas("volatile_fuel", 5, T20C) + T.hotspot_expose(700,400) + var/datum/effect/effect/system/spark_spread/s = new + s.set_up(5, 0, T) + s.start() + visible_message("\The [src] bursts into flame!") + +#undef MODE_IDLE +#undef MODE_HEATING +#undef MODE_COOLING \ No newline at end of file diff --git a/icons/obj/machines/thermoregulator_vr.dmi b/icons/obj/machines/thermoregulator_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ec1275510e327cc7a66df3b357ba9b5f9ad08e95 GIT binary patch literal 3798 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