diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index f4cbd75b758..e7f1fe3f9d2 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -15,18 +15,28 @@ max_integrity = 250 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10) circuit = /obj/item/circuitboard/machine/space_heater - /// We don't use area power, we always use the cell + //We don't use area power, we always use the cell use_power = NO_POWER_USE + ///The cell we spawn with var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell + ///Is the machine on? var/on = FALSE + ///What is the mode we are in now? var/mode = HEATER_MODE_STANDBY - var/setMode = HEATER_MODE_AUTO // Anything other than "heat" or "cool" is considered auto. - var/targetTemperature = T20C - var/heatingPower = 20000 + ///Anything other than "heat" or "cool" is considered auto. + var/set_mode = HEATER_MODE_AUTO + ///The temperature we trying to get to + var/target_temperature = T20C + ///How much heat/cold we can deliver + var/heating_power = 40000 + ///How efficiently we can deliver that heat/cold (higher indicates less cell consumption) var/efficiency = 20000 - var/temperatureTolerance = 1 - var/settableTemperatureMedian = 30 + T0C - var/settableTemperatureRange = 30 + ///The amount of degrees above and below the target temperature for us to change mode to heater or cooler + var/temperature_tolerance = 1 + ///What's the middle point of our settable temperature (30 °C) + var/settable_temperature_median = 30 + T0C + ///Range of temperatures above and below the median that we can set our target temperature (increase by upgrading the capacitors) + var/settable_temperature_range = 30 /obj/machinery/space_heater/get_cell() return cell @@ -37,13 +47,6 @@ cell = new cell(src) update_appearance() -/obj/machinery/space_heater/on_construction() - qdel(cell) - cell = null - panel_open = TRUE - update_appearance() - return ..() - /obj/machinery/space_heater/on_deconstruction() if(cell) LAZYADD(component_parts, cell) @@ -58,12 +61,11 @@ else . += "There is no power cell installed." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [siunit(heatingPower, "W", 1)].
Power consumption at [(efficiency*-0.0025)+150]%.
" //100%, 75%, 50%, 25% + . += "The status display reads: Temperature range at [settable_temperature_range]°C.
Heating power at [siunit(heating_power, "W", 1)].
Power consumption at [(efficiency*-0.0025)+150]%.
" //100%, 75%, 50%, 25% /obj/machinery/space_heater/update_icon_state() - icon_state = "[base_icon_state]-[on ? mode : "off"]" . = ..() - return + icon_state = "[base_icon_state]-[on ? mode : "off"]" /obj/machinery/space_heater/update_overlays() . = ..() @@ -76,48 +78,48 @@ on = FALSE return PROCESS_KILL - if(cell && cell.charge > 0) - var/turf/L = loc - if(!istype(L)) - if(mode != HEATER_MODE_STANDBY) - mode = HEATER_MODE_STANDBY - update_appearance() - return - - var/datum/gas_mixture/env = L.return_air() - - var/newMode = HEATER_MODE_STANDBY - if(setMode != HEATER_MODE_COOL && env.temperature < targetTemperature - temperatureTolerance) - newMode = HEATER_MODE_HEAT - else if(setMode != HEATER_MODE_HEAT && env.temperature > targetTemperature + temperatureTolerance) - newMode = HEATER_MODE_COOL - - if(mode != newMode) - mode = newMode - update_appearance() - - if(mode == HEATER_MODE_STANDBY) - return - - var/heat_capacity = env.heat_capacity() - var/requiredEnergy = abs(env.temperature - targetTemperature) * heat_capacity - requiredEnergy = min(requiredEnergy, heatingPower * delta_time) - - if(requiredEnergy < 1) - return - - var/deltaTemperature = requiredEnergy / heat_capacity - if(mode == HEATER_MODE_COOL) - deltaTemperature *= -1 - if(deltaTemperature) - env.temperature += deltaTemperature - air_update_turf(FALSE, FALSE) - cell.use(requiredEnergy / efficiency) - else + if(!cell || cell.charge <= 0) on = FALSE update_appearance() return PROCESS_KILL + var/turf/local_turf = loc + if(!istype(local_turf)) + if(mode != HEATER_MODE_STANDBY) + mode = HEATER_MODE_STANDBY + update_appearance() + return + + var/datum/gas_mixture/enviroment = local_turf.return_air() + + var/new_mode = HEATER_MODE_STANDBY + if(set_mode != HEATER_MODE_COOL && enviroment.temperature < target_temperature - temperature_tolerance) + new_mode = HEATER_MODE_HEAT + else if(set_mode != HEATER_MODE_HEAT && enviroment.temperature > target_temperature + temperature_tolerance) + new_mode = HEATER_MODE_COOL + + if(mode != new_mode) + mode = new_mode + update_appearance() + + if(mode == HEATER_MODE_STANDBY) + return + + var/heat_capacity = enviroment.heat_capacity() + var/required_energy = abs(enviroment.temperature - target_temperature) * heat_capacity + required_energy = min(required_energy, heating_power * delta_time) + + if(required_energy < 1) + return + + var/delta_temperature = required_energy / heat_capacity + if(mode == HEATER_MODE_COOL) + delta_temperature *= -1 + if(delta_temperature) + enviroment.temperature += delta_temperature + air_update_turf(FALSE, FALSE) + cell.use(required_energy / efficiency) + /obj/machinery/space_heater/RefreshParts() var/laser = 0 var/cap = 0 @@ -126,14 +128,14 @@ for(var/obj/item/stock_parts/capacitor/M in component_parts) cap += M.rating - heatingPower = laser * 20000 + heating_power = laser * 40000 - settableTemperatureRange = cap * 30 + settable_temperature_range = cap * 30 efficiency = (cap + 1) * 10000 - targetTemperature = clamp(targetTemperature, - max(settableTemperatureMedian - settableTemperatureRange, TCMB), - settableTemperatureMedian + settableTemperatureRange) + target_temperature = clamp(target_temperature, + max(settable_temperature_median - settable_temperature_range, TCMB), + settable_temperature_median + settable_temperature_range) /obj/machinery/space_heater/emp_act(severity) . = ..() @@ -143,32 +145,34 @@ cell.emp_act(severity) /obj/machinery/space_heater/attackby(obj/item/I, mob/user, params) + . = ..() add_fingerprint(user) - if(default_unfasten_wrench(user, I)) - return - else if(istype(I, /obj/item/stock_parts/cell)) - if(panel_open) - if(cell) - to_chat(user, "There is already a power cell inside!") - return - else if(!user.transferItemToLoc(I, src)) - return - cell = I - I.add_fingerprint(usr) - user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") - SStgui.update_uis(src) - else - to_chat(user, "The hatch must be open to insert a power cell!") - return - else if(I.tool_behaviour == TOOL_SCREWDRIVER) - panel_open = !panel_open + if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) user.visible_message("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src].", "You [panel_open ? "open" : "close"] the hatch on \the [src].") update_appearance() - else if(default_deconstruction_crowbar(I)) - return - else - return ..() + return TRUE + + if(default_unfasten_wrench(user, I)) + return TRUE + + if(default_deconstruction_crowbar(I)) + return TRUE + + if(istype(I, /obj/item/stock_parts/cell)) + if(!panel_open) + to_chat(user, "The hatch must be open to insert a power cell!") + return + if(cell) + to_chat(user, "There is already a power cell inside!") + return + if(!user.transferItemToLoc(I, src)) + return + cell = I + I.add_fingerprint(usr) + user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") + SStgui.update_uis(src) + return TRUE /obj/machinery/space_heater/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -180,26 +184,26 @@ var/list/data = list() data["open"] = panel_open data["on"] = on - data["mode"] = setMode + data["mode"] = set_mode data["hasPowercell"] = !!cell data["chemHacked"] = FALSE if(cell) data["powerLevel"] = round(cell.percent(), 1) - data["targetTemp"] = round(targetTemperature - T0C, 1) - data["minTemp"] = max(settableTemperatureMedian - settableTemperatureRange, TCMB) - T0C - data["maxTemp"] = settableTemperatureMedian + settableTemperatureRange - T0C + data["targetTemp"] = round(target_temperature - T0C, 1) + data["minTemp"] = max(settable_temperature_median - settable_temperature_range, TCMB) - T0C + data["maxTemp"] = settable_temperature_median + settable_temperature_range - T0C - var/turf/L = get_turf(loc) - var/curTemp - if(istype(L)) - var/datum/gas_mixture/env = L.return_air() - curTemp = env.temperature - else if(isturf(L)) - curTemp = L.temperature - if(isnull(curTemp)) + var/turf/local_turf = get_turf(loc) + var/current_temperature + if(istype(local_turf)) + var/datum/gas_mixture/enviroment = local_turf.return_air() + current_temperature = enviroment.temperature + else if(isturf(local_turf)) + current_temperature = local_turf.temperature + if(isnull(current_temperature)) data["currentTemp"] = "N/A" else - data["currentTemp"] = round(curTemp - T0C, 1) + data["currentTemp"] = round(current_temperature - T0C, 1) return data /obj/machinery/space_heater/ui_act(action, params) @@ -217,7 +221,7 @@ START_PROCESSING(SSmachines, src) . = TRUE if("mode") - setMode = params["mode"] + set_mode = params["mode"] . = TRUE if("target") if(!panel_open) @@ -227,15 +231,23 @@ target= text2num(target) + T0C . = TRUE if(.) - targetTemperature = clamp(round(target), - max(settableTemperatureMedian - settableTemperatureRange, TCMB), - settableTemperatureMedian + settableTemperatureRange) + target_temperature = clamp(round(target), + max(settable_temperature_median - settable_temperature_range, TCMB), + settable_temperature_median + settable_temperature_range) if("eject") if(panel_open && cell) cell.forceMove(drop_location()) cell = null . = TRUE +/obj/machinery/space_heater/constructed + cell = null + +/obj/machinery/space_heater/constructed/Initialize() + . = ..() + panel_open = TRUE + update_appearance() + ///For use with heating reagents in a ghetto way /obj/machinery/space_heater/improvised_chem_heater icon = 'icons/obj/chemical.dmi' @@ -270,21 +282,21 @@ if(beaker.reagents.total_volume) var/power_mod = 0.1 * chem_heating_power - switch(setMode) + switch(set_mode) if(HEATER_MODE_AUTO) power_mod *= 0.5 - beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) beaker.reagents.handle_reactions() if(HEATER_MODE_HEAT) - if(targetTemperature < beaker.reagents.chem_temp) + if(target_temperature < beaker.reagents.chem_temp) return - beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) if(HEATER_MODE_COOL) - if(targetTemperature > beaker.reagents.chem_temp) + if(target_temperature > beaker.reagents.chem_temp) return - beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) - var/requiredEnergy = heatingPower * delta_time * (power_mod * 4) - cell.use(requiredEnergy / efficiency) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) + var/required_energy = heating_power * delta_time * (power_mod * 4) + cell.use(required_energy / efficiency) beaker.reagents.handle_reactions() update_appearance() @@ -376,10 +388,10 @@ if(!on || !beaker || !cell) icon_state = "sheater-off" return - if(targetTemperature < beaker.reagents.chem_temp) + if(target_temperature < beaker.reagents.chem_temp) icon_state = "sheater-cool" return - if(targetTemperature > beaker.reagents.chem_temp) + if(target_temperature > beaker.reagents.chem_temp) icon_state = "sheater-heat" return icon_state = "sheater-off" @@ -392,14 +404,14 @@ for(var/obj/item/stock_parts/capacitor/capacitor in component_parts) capacitors_rating += capacitor.rating - heatingPower = lasers_rating * 20000 + heating_power = lasers_rating * 20000 - settableTemperatureRange = capacitors_rating * 50 //-20 - 80 at base + settable_temperature_range = capacitors_rating * 50 //-20 - 80 at base efficiency = (capacitors_rating + 1) * 10000 - targetTemperature = clamp(targetTemperature, - max(settableTemperatureMedian - settableTemperatureRange, TCMB), - settableTemperatureMedian + settableTemperatureRange) + target_temperature = clamp(target_temperature, + max(settable_temperature_median - settable_temperature_range, TCMB), + settable_temperature_median + settable_temperature_range) chem_heating_power = efficiency/20000 //1-2.5 diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 54f4a535e13..df5f8387947 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -474,7 +474,7 @@ /obj/item/circuitboard/machine/space_heater name = "Space Heater (Machine Board)" icon_state = "generic" - build_path = /obj/machinery/space_heater + build_path = /obj/machinery/space_heater/constructed req_components = list( /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/capacitor = 1,