From bd0fc928ddcfd9fab0e726ea95cc55f6f347e760 Mon Sep 17 00:00:00 2001 From: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> Date: Mon, 1 Apr 2024 19:54:58 +0200 Subject: [PATCH 01/11] TEG suddenly starts working, the public is shocked! (#1521) * Fixes and updates the TEG (#81044) Fixes thermoelectric generators so they work again Pipes can be connected to it, the machine can be rotated Adds the ventcrawl movement flags as a defined bitfield I also gave it a TGUI menu, it was small so it is pretty insignificant. I added a little bit more text to error messages to make it clearer why the thermoelectric generator isn't functional. I also repathed generator to thermoelectric_generator because 'generator' is a keyword and is highlighted in green which makes people using vscode a little confused what it's meant to be. Old ![image](https://github.com/tgstation/tgstation/assets/53777086/0fe0651b-4d48-474b-869f-2f665757a0bc) New https://github.com/tgstation/tgstation/assets/53777086/064a5dda-5407-4817-b090-d22eb6c4aab8 This is one of the things I had to move to TGUI in https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA I was originally gonna remove it, but in the spirit of feature freeze I thought I should at least give it a try. This fixes many issues with it and gives it a new better UI that won't stop updating easily so you can actually watch the changes as it happens. The TEG may not be obtainable in-game but it can still be mapped in or give by admins, letting it function as intended is still a massive benefit. Closes https://github.com/tgstation/tgstation/issues/75738 :cl: JohnFulpWillard, Unit2E teaching me the TEG fix: The TEG now works again (still unobtainable by regular means though). fix: the TEG and its circulators can now be rotated counterclockwise again. refactor: The TEG now uses a TGUI interface rather than the old HTML one. /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> * monkestation specific fixes --------- Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- _maps/RandomRuins/SpaceRuins/shuttlerelic.dmm | 2 +- _maps/templates/medium_shuttle4.dmm | 2 +- code/__DEFINES/atmospherics/atmos_piping.dm | 10 +- .../machines/machine_circuitboards.dm | 4 +- .../components/binary_devices/circulator.dm | 75 ++---- .../machinery/pipes/layermanifold.dm | 2 +- code/modules/power/generator.dm | 232 ------------------ .../modules/power/thermoelectric_generator.dm | 222 +++++++++++++++++ .../research/ordnance/tank_compressor.dm | 3 - tgstation.dme | 2 +- .../interfaces/ThermoElectricGenerator.tsx | 80 ++++++ 11 files changed, 341 insertions(+), 293 deletions(-) delete mode 100644 code/modules/power/generator.dm create mode 100644 code/modules/power/thermoelectric_generator.dm create mode 100644 tgui/packages/tgui/interfaces/ThermoElectricGenerator.tsx diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index 86ea8c855cc8..71074aa4451f 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -74,7 +74,7 @@ /turf/open/floor/oldshuttle, /area/ruin/space/has_grav/powered) "t" = ( -/obj/machinery/power/generator, +/obj/machinery/power/thermoelectric_generator, /turf/open/floor/oldshuttle, /area/ruin/space/has_grav/powered) "u" = ( diff --git a/_maps/templates/medium_shuttle4.dmm b/_maps/templates/medium_shuttle4.dmm index 0071a71a1e99..67a5617da6b5 100644 --- a/_maps/templates/medium_shuttle4.dmm +++ b/_maps/templates/medium_shuttle4.dmm @@ -54,7 +54,7 @@ /turf/open/floor/oldshuttle, /area/ruin/powered/shuttle/medium_4) "r" = ( -/obj/machinery/power/generator, +/obj/machinery/power/thermoelectric_generator, /turf/open/floor/oldshuttle, /area/ruin/powered/shuttle/medium_4) "s" = ( diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 3d864e6485f7..bdbf845a02f0 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -84,8 +84,14 @@ // Ventcrawling bitflags, handled in var/vent_movement ///Allows for ventcrawling to occur. All atmospheric machines have this flag on by default. Cryo is the exception -#define VENTCRAWL_ALLOWED (1<<0) +#define VENTCRAWL_ALLOWED (1<<0) ///Allows mobs to enter or leave from atmospheric machines. On for passive, unary, and scrubber vents. #define VENTCRAWL_ENTRANCE_ALLOWED (1<<1) ///Used to check if a machinery is visible. Called by update_pipe_vision(). On by default for all except cryo. -#define VENTCRAWL_CAN_SEE (1<<2) +#define VENTCRAWL_CAN_SEE (1<<2) + +DEFINE_BITFIELD(vent_movement, list( + "Ventcrawl Allowed" = VENTCRAWL_ALLOWED, + "Ventcrawl Entrance Allowed" = VENTCRAWL_ENTRANCE_ALLOWED, + "Ventcrawl Can See" = VENTCRAWL_CAN_SEE, +)) diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 454441552506..89f3edfb4c8a 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -222,10 +222,10 @@ /datum/stock_part/manipulator = 1) needs_anchored = FALSE -/obj/item/circuitboard/machine/generator +/obj/item/circuitboard/machine/thermoelectric_generator name = "Thermo-Electric Generator" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/generator + build_path = /obj/machinery/power/thermoelectric_generator req_components = list() /obj/item/circuitboard/machine/ntnet_relay diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 9a4623ef49a1..819f9d0f5659 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -5,27 +5,23 @@ name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." icon_state = "circ-off-0" - - var/active = FALSE - - var/last_pressure_delta = 0 pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - + vent_movement = VENTCRAWL_CAN_SEE density = TRUE - circuit = /obj/item/circuitboard/machine/circulator + var/active = FALSE + var/last_pressure_delta = 0 var/flipped = 0 + ///Which circulator mode we are on, the generator requires one of each to work. var/mode = CIRCULATOR_HOT - var/obj/machinery/power/generator/generator + ///The generator we are connected to. + var/obj/machinery/power/thermoelectric_generator/generator /obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/machinery/atmospherics/components/binary/circulator/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - //default cold circ for mappers /obj/machinery/atmospherics/components/binary/circulator/cold mode = CIRCULATOR_COLD @@ -49,25 +45,18 @@ return null //Calculate necessary moles to transfer using PV = nRT - if(air2.temperature>0) - var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 - - var/transfer_moles = (pressure_delta*air1.volume)/(air2.temperature * R_IDEAL_GAS_EQUATION) - - last_pressure_delta = pressure_delta - - //Actually transfer the gas - var/datum/gas_mixture/removed = air2.remove(transfer_moles) - - update_parents() - - return removed - - else + if(air2.temperature <= 0) last_pressure_delta = 0 + return + var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 + var/transfer_moles = (pressure_delta*air1.volume)/(air2.temperature * R_IDEAL_GAS_EQUATION) + last_pressure_delta = pressure_delta + //Actually transfer the gas + var/datum/gas_mixture/removed = air2.remove(transfer_moles) + update_parents() + return removed /obj/machinery/atmospherics/components/binary/circulator/process_atmos() - ..() update_appearance() /obj/machinery/atmospherics/components/binary/circulator/update_icon_state() @@ -86,13 +75,13 @@ /obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) if(!panel_open) + balloon_alert(user, "open the panel!") return set_anchored(!anchored) I.play_tool_sound(src) if(generator) disconnectFromGenerator() - to_chat(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) - + balloon_alert(user, "[anchored ? "secure" : "unsecure"]") var/obj/machinery/atmospherics/node1 = nodes[1] var/obj/machinery/atmospherics/node2 = nodes[2] @@ -145,20 +134,22 @@ if(generator) disconnectFromGenerator() mode = !mode - to_chat(user, span_notice("You set [src] to [mode ? "cold" : "hot"] mode.")) + balloon_alert(user, "set to [mode ? "cold" : "hot"]") return TRUE /obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I) - if(..()) - return TRUE + if(!anchored) + balloon_alert(user, "anchor it down!") + return toggle_panel_open() I.play_tool_sound(src) - to_chat(user, span_notice("You [panel_open ? "open" : "close"] the panel on [src].")) + balloon_alert(user, "panel [panel_open ? "open" : "closed"]") return TRUE /obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I) - default_deconstruction_crowbar(I) - return TRUE + if(default_deconstruction_crowbar(I)) + return TRUE + return ..() /obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() if(generator) @@ -176,19 +167,3 @@ ..() pixel_x = 0 pixel_y = 0 - -/obj/machinery/atmospherics/components/binary/circulator/verb/circulator_flip() - set name = "Flip" - set category = "Object" - set src in oview(1) - - if(!ishuman(usr)) - return - - if(anchored) - to_chat(usr, span_danger("[src] is anchored!")) - return - - flipped = !flipped - to_chat(usr, span_notice("You flip [src].")) - update_appearance() diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 9a3abdb16c5d..0e5678ae3f33 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -98,7 +98,7 @@ normalize_cardinal_directions() find_all_connections() -/obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer() +/obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer(new_layer) piping_layer = PIPING_LAYER_DEFAULT /obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm deleted file mode 100644 index 5442131817b8..000000000000 --- a/code/modules/power/generator.dm +++ /dev/null @@ -1,232 +0,0 @@ -/obj/machinery/power/generator - name = "thermoelectric generator" - desc = "It's a high efficiency thermoelectric generator." - icon_state = "teg" - density = TRUE - use_power = NO_POWER_USE - - circuit = /obj/item/circuitboard/machine/generator - - var/obj/machinery/atmospherics/components/binary/circulator/cold_circ - var/obj/machinery/atmospherics/components/binary/circulator/hot_circ - - var/lastgen = 0 - var/lastgenlev = -1 - var/lastcirc = "00" - - -/obj/machinery/power/generator/Initialize(mapload) - . = ..() - AddComponent(/datum/component/simple_rotation) - find_circs() - connect_to_network() - SSair.start_processing_machine(src) - update_appearance() - -/obj/machinery/power/generator/Destroy() - kill_circs() - SSair.stop_processing_machine(src) - return ..() - -/obj/machinery/power/generator/update_overlays() - . = ..() - if(machine_stat & (NOPOWER|BROKEN)) - return - - var/L = min(round(lastgenlev / 100000), 11) - if(L != 0) - . += mutable_appearance('icons/obj/power.dmi', "teg-op[L]") - if(hot_circ && cold_circ) - . += "teg-oc[lastcirc]" - - -#define GENRATE 800 // generator output coefficient from Q - -/obj/machinery/power/generator/process_atmos() - - if(!cold_circ || !hot_circ) - return - - if(powernet) - var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() - var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() - - if(cold_air && hot_air) - - var/cold_air_heat_capacity = cold_air.heat_capacity() - var/hot_air_heat_capacity = hot_air.heat_capacity() - - var/delta_temperature = hot_air.temperature - cold_air.temperature - - - if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) - var/efficiency = 0.65 - - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - - var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency - - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - - //add_avail(lastgen) This is done in process now - // update icon overlays only if displayed level has changed - - if(hot_air) - var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] - hot_circ_air1.merge(hot_air) - - if(cold_air) - var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] - cold_circ_air1.merge(cold_air) - - update_appearance() - - var/circ = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]" - if(circ != lastcirc) - lastcirc = circ - update_appearance() - - src.updateDialog() - -/obj/machinery/power/generator/process() - //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** - var/power_output = round(lastgen / 10) - add_avail(power_output) - lastgenlev = power_output - lastgen -= power_output - ..() - -/obj/machinery/power/generator/proc/get_menu(include_link = TRUE) - var/t = "" - if(!powernet) - t += "Unable to connect to the power network!" - else if(cold_circ && hot_circ) - var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] - var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2] - var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] - var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2] - - t += "
" - - t += "Output: [display_power(lastgenlev)]" - - t += "
" - - t += "Cold loop
" - t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
" - - t += "Hot loop
" - t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" - - t += "
" - else if(!hot_circ && cold_circ) - t += "Unable to locate hot circulator!" - else if(hot_circ && !cold_circ) - t += "Unable to locate cold circulator!" - else - t += "Unable to locate any parts!" - if(include_link) - t += "
Close" - - return t - -/obj/machinery/power/generator/ui_interact(mob/user) - . = ..() - var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300) - popup.set_content(get_menu()) - popup.open() - -/obj/machinery/power/generator/Topic(href, href_list) - if(..()) - return - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.unset_machine() - return FALSE - return TRUE - - - -/obj/machinery/power/generator/proc/find_circs() - kill_circs() - var/list/circs = list() - var/obj/machinery/atmospherics/components/binary/circulator/C - var/circpath = /obj/machinery/atmospherics/components/binary/circulator - if(dir == NORTH || dir == SOUTH) - C = locate(circpath) in get_step(src, EAST) - if(C && C.dir == WEST) - circs += C - - C = locate(circpath) in get_step(src, WEST) - if(C && C.dir == EAST) - circs += C - - else - C = locate(circpath) in get_step(src, NORTH) - if(C && C.dir == SOUTH) - circs += C - - C = locate(circpath) in get_step(src, SOUTH) - if(C && C.dir == NORTH) - circs += C - - if(circs.len) - for(C in circs) - if(C.mode == CIRCULATOR_COLD && !cold_circ) - cold_circ = C - C.generator = src - else if(C.mode == CIRCULATOR_HOT && !hot_circ) - hot_circ = C - C.generator = src - -/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - set_anchored(!anchored) - I.play_tool_sound(src) - if(!anchored) - kill_circs() - connect_to_network() - to_chat(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) - return TRUE - -/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I) - . = ..() - if(!anchored) - return - find_circs() - to_chat(user, span_notice("You update [src]'s circulator links.")) - return TRUE - -/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I) - if(..()) - return TRUE - toggle_panel_open() - I.play_tool_sound(src) - to_chat(user, span_notice("You [panel_open?"open":"close"] the panel on [src].")) - return TRUE - -/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I) - default_deconstruction_crowbar(I) - return TRUE - -/obj/machinery/power/generator/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/machinery/power/generator/on_deconstruction() - kill_circs() - -/obj/machinery/power/generator/proc/kill_circs() - if(hot_circ) - hot_circ.generator = null - hot_circ = null - if(cold_circ) - cold_circ.generator = null - cold_circ = null - -#undef GENRATE diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm new file mode 100644 index 000000000000..6b0fed607c23 --- /dev/null +++ b/code/modules/power/thermoelectric_generator.dm @@ -0,0 +1,222 @@ +#define TEG_EFFICIENCY 0.65 + +/obj/machinery/power/thermoelectric_generator + name = "thermoelectric generator" + desc = "It's a high efficiency thermoelectric generator." + icon_state = "teg" + base_icon_state = "teg" + density = TRUE + use_power = NO_POWER_USE + circuit = /obj/item/circuitboard/machine/thermoelectric_generator + + ///The cold circulator machine, containing cold gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/cold_circ + ///The hot circulator machine, containing very hot gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/hot_circ + ///The amount of power the generator is currently producing. + var/lastgen = 0 + ///The amount of power the generator has last produced. + var/lastgenlev = -1 + /** + * Used in overlays for the TEG, basically; + * one number is for the cold mix, one is for the hot mix + * If the cold mix has pressure in it, then the first number is 1, else 0 + * If the hot mix has pressure in it, then the second number is 1, else 0 + * Neither has pressure: 00 + * Only cold has pressure: 10 + * Only hot has pressure: 01 + * Both has pressure: 11 + */ + var/last_pressure_overlay = "00" + +/obj/machinery/power/thermoelectric_generator/Initialize(mapload) + . = ..() + AddComponent(/datum/component/simple_rotation) + find_circulators() + connect_to_network() + SSair.start_processing_machine(src) + update_appearance() + +/obj/machinery/power/thermoelectric_generator/Destroy() + null_circulators() + SSair.stop_processing_machine(src) + return ..() + +/obj/machinery/power/thermoelectric_generator/on_deconstruction() + null_circulators() + +/obj/machinery/power/thermoelectric_generator/update_overlays() + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return + + var/level = min(round(lastgenlev / 100000), 11) + if(level) + . += mutable_appearance('icons/obj/power.dmi', "[base_icon_state]-op[level]") + if(hot_circ && cold_circ) + . += "[base_icon_state]-oc[last_pressure_overlay]" + +/obj/machinery/power/thermoelectric_generator/wrench_act(mob/living/user, obj/item/tool) + if(!panel_open) + balloon_alert(user, "open the panel!") + return + set_anchored(!anchored) + tool.play_tool_sound(src) + if(anchored) + connect_to_network() + else + null_circulators() + balloon_alert(user, "[anchored ? "secure" : "unsecure"]") + return TRUE + +/obj/machinery/power/thermoelectric_generator/multitool_act(mob/living/user, obj/item/tool) + . = ..() + if(!anchored) + return + find_circulators() + balloon_alert(user, "circulators updated") + return TRUE + +/obj/machinery/power/thermoelectric_generator/screwdriver_act(mob/user, obj/item/tool) + if(!anchored) + balloon_alert(user, "anchor it down!") + return + toggle_panel_open() + tool.play_tool_sound(src) + balloon_alert(user, "panel [panel_open ? "open" : "closed"]") + return TRUE + +/obj/machinery/power/thermoelectric_generator/crowbar_act(mob/living/user, obj/item/tool) + default_deconstruction_crowbar(tool) + return TRUE + +/obj/machinery/power/thermoelectric_generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + +/obj/machinery/power/thermoelectric_generator/process_atmos() + if(!cold_circ || !hot_circ) + return + if(!powernet) + return + + var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() + var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() + if(cold_air && hot_air) + var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() + var/delta_temperature = hot_air.temperature - cold_air.temperature + if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) + var/efficiency = TEG_EFFICIENCY + var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) + var/heat = energy_transfer*(1-efficiency) + lastgen += energy_transfer*efficiency + hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity + + if(hot_air) + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + hot_circ_air1.merge(hot_air) + + if(cold_air) + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + cold_circ_air1.merge(cold_air) + + var/current_pressure = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]" + if(current_pressure != last_pressure_overlay) + //this requires an update to overlays. + last_pressure_overlay = current_pressure + + update_appearance(UPDATE_ICON) + +/obj/machinery/power/thermoelectric_generator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ThermoElectricGenerator", name) + ui.open() + +/obj/machinery/power/thermoelectric_generator/ui_data(mob/user) + var/list/data = list() + data["error_message"] = null + if(!powernet) + data["error_message"] = "Unable to connect to the power network!" + return data + if(!cold_circ && !hot_circ) + data["error_message"] = "Unable to locate any parts! Multitool the machine to sync to nearby parts." + return data + if(!cold_circ) + data["error_message"] = "Unable to locate cold circulator!" + return data + if(!hot_circ) + data["error_message"] = "Unable to locate hot circulator!" + return data + + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2] + + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2] + + data["last_power_output"] = display_power(lastgenlev) + + var/list/cold_data = list() + cold_data["temperature_inlet"] = round(cold_circ_air2.temperature, 0.1) + cold_data["temperature_outlet"] = round(cold_circ_air1.temperature, 0.1) + cold_data["pressure_inlet"] = round(cold_circ_air2.return_pressure(), 0.1) + cold_data["pressure_outlet"] = round(cold_circ_air1.return_pressure(), 0.1) + data["cold_data"] = list(cold_data) + + var/list/hot_data = list() + hot_data["temperature_inlet"] = round(hot_circ_air2.temperature, 0.1) + hot_data["temperature_outlet"] = round(hot_circ_air1.temperature, 0.1) + hot_data["pressure_inlet"] = round(hot_circ_air2.return_pressure(), 0.1) + hot_data["pressure_outlet"] = round(hot_circ_air1.return_pressure(), 0.1) + data["hot_data"] = list(hot_data) + + return data + +///Finds and connects nearby valid circulators to the machine, nulling out previous ones. +/obj/machinery/power/thermoelectric_generator/proc/find_circulators() + null_circulators() + var/list/valid_circulators = list() + + if(dir & (NORTH|SOUTH)) + var/obj/machinery/atmospherics/components/binary/circulator/east_circulator = locate() in get_step(src, EAST) + if(east_circulator && east_circulator.dir == WEST) + valid_circulators += east_circulator + var/obj/machinery/atmospherics/components/binary/circulator/west_circulator = locate() in get_step(src, WEST) + if(west_circulator && west_circulator.dir == EAST) + valid_circulators += west_circulator + else + var/obj/machinery/atmospherics/components/binary/circulator/north_circulator = locate() in get_step(src, NORTH) + if(north_circulator && north_circulator.dir == SOUTH) + valid_circulators += north_circulator + var/obj/machinery/atmospherics/components/binary/circulator/south_circulator = locate() in get_step(src, SOUTH) + if(south_circulator && south_circulator.dir == NORTH) + valid_circulators += south_circulator + + if(!valid_circulators.len) + return + + for(var/obj/machinery/atmospherics/components/binary/circulator/circulators as anything in valid_circulators) + if(circulators.mode == CIRCULATOR_COLD && !cold_circ) + cold_circ = circulators + circulators.generator = src + continue + if(circulators.mode == CIRCULATOR_HOT && !hot_circ) + hot_circ = circulators + circulators.generator = src + +///Removes hot and cold circulators from the generator, nulling them. +/obj/machinery/power/thermoelectric_generator/proc/null_circulators() + if(hot_circ) + hot_circ.generator = null + hot_circ = null + if(cold_circ) + cold_circ.generator = null + cold_circ = null + +#undef TEG_EFFICIENCY diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 44d1505b0865..52cadfa08e20 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -85,9 +85,6 @@ update_appearance() return TRUE -/obj/machinery/atmospherics/components/binary/circulator/get_node_connects() - return list(turn(dir, 180), dir) // airs[2] is input which is facing dir, airs[1] is output which is facing the other side of dir - /obj/machinery/atmospherics/components/binary/tank_compressor/screwdriver_act(mob/living/user, obj/item/tool) if(active || inserted_tank) return FALSE diff --git a/tgstation.dme b/tgstation.dme index c81bd82abf6d..6eca3c3f05b4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4817,7 +4817,6 @@ #include "code\modules\power\cell.dm" #include "code\modules\power\energy_accumulator.dm" #include "code\modules\power\floodlight.dm" -#include "code\modules\power\generator.dm" #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\monitor.dm" #include "code\modules\power\multiz.dm" @@ -4829,6 +4828,7 @@ #include "code\modules\power\smes.dm" #include "code\modules\power\solar.dm" #include "code\modules\power\terminal.dm" +#include "code\modules\power\thermoelectric_generator.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\apc\apc_appearance.dm" #include "code\modules\power\apc\apc_attack.dm" diff --git a/tgui/packages/tgui/interfaces/ThermoElectricGenerator.tsx b/tgui/packages/tgui/interfaces/ThermoElectricGenerator.tsx new file mode 100644 index 000000000000..ae55eb81fd84 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ThermoElectricGenerator.tsx @@ -0,0 +1,80 @@ +import { useBackend } from '../backend'; +import { Box, Divider, Section } from '../components'; +import { Window } from '../layouts'; + +type Data = { + error_message: string | null; + last_power_output: string | null; + cold_data: CirculatorData[]; + hot_data: CirculatorData[]; +}; + +type CirculatorData = { + temperature_inlet: number | null; + temperature_outlet: number | null; + pressure_inlet: number | null; + pressure_outlet: number | null; +}; + +export const ThermoElectricGenerator = (props, context) => { + const { act, data } = useBackend(context); + const { + error_message, + last_power_output, + cold_data = [], + hot_data = [], + } = data; + if (error_message) { + return ( + + +
ERROR: {error_message}
+
+
+ ); + } + return ( + + +
+ + Last Output: {last_power_output} + + + Cold Loop + + {cold_data.map((data, index) => ( + + + Temperature Inlet: {data.temperature_inlet} K / Outlet:{' '} + {data.temperature_outlet} K + + + Pressure Inlet: {data.pressure_inlet} kPa / Outlet:{' '} + {data.pressure_outlet} kPa + + + ))} + + + + Hot loop{' '} + + {hot_data.map((data, index) => ( + + + Temperature Inlet: {data.temperature_inlet} K / Outlet:{' '} + {data.temperature_outlet} K + + + Pressure Inlet: {data.pressure_inlet} kPa / Outlet:{' '} + {data.pressure_outlet} kPa + + + ))} + +
+
+
+ ); +}; From bba8f21d43af8238ad89e25e941fb3389411b248 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:55:17 +0000 Subject: [PATCH 02/11] Automatic changelog for PR #1521 [ci skip] --- html/changelogs/AutoChangeLog-pr-1521.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1521.yml diff --git a/html/changelogs/AutoChangeLog-pr-1521.yml b/html/changelogs/AutoChangeLog-pr-1521.yml new file mode 100644 index 000000000000..ed1414093f08 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1521.yml @@ -0,0 +1,6 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - bugfix: "The TEG now works again (still unobtainable by regular means though)." + - bugfix: "the TEG and its circulators can now be rotated counterclockwise again." + - refactor: "The TEG now uses a TGUI interface rather than the old HTML one." \ No newline at end of file From 4bb2beef683aa7d454eaa12963e4165039b42e05 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 2 Apr 2024 01:15:07 +0000 Subject: [PATCH 03/11] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1521.yml | 6 ------ html/changelogs/AutoChangeLog-pr-1551.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-1552.yml | 4 ---- html/changelogs/archive/2024-04.yml | 18 ++++++++++++++++++ 4 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1521.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1551.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1552.yml diff --git a/html/changelogs/AutoChangeLog-pr-1521.yml b/html/changelogs/AutoChangeLog-pr-1521.yml deleted file mode 100644 index ed1414093f08..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1521.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - bugfix: "The TEG now works again (still unobtainable by regular means though)." - - bugfix: "the TEG and its circulators can now be rotated counterclockwise again." - - refactor: "The TEG now uses a TGUI interface rather than the old HTML one." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1551.yml b/html/changelogs/AutoChangeLog-pr-1551.yml deleted file mode 100644 index 8f0937919b33..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1551.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - bugfix: "(JohnFulpWillard) Time on servers hosted outside of the UK should now properly have their timezone offset." - - bugfix: "(FlufflesTheDog) Certain areas are now properly protected against grid check. Namely the supermatter should consistently be protected." - - bugfix: "(Ghommie) Fixes the sparring contract. You can now spar with no stakes and just for fun." - - bugfix: "(ChungusGamer666) Exotic blood types no longer persist through species change if the new species does not have an exotic blood type." - - bugfix: "(mc-oofert) You are now made a ghost faster if you get gibbed." - - bugfix: "(AnturK) Fixes bioscramble picking the (unimplemented) base wing type." - - bugfix: "(AnturK) Fixes setting prebuilt shutter ids with the multitool." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1552.yml b/html/changelogs/AutoChangeLog-pr-1552.yml deleted file mode 100644 index 94f301a76524..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1552.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - bugfix: "Fixed revolutionaries winning resulting in ATTENTION [x ∞]" \ No newline at end of file diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml index c7b2cc8d9f46..7e7e64a7c947 100644 --- a/html/changelogs/archive/2024-04.yml +++ b/html/changelogs/archive/2024-04.yml @@ -30,3 +30,21 @@ - bugfix: added combat mode/harm intent support for the previous pr - balance: Blind people don't get alerted when someone in a cardboard box pops out nearby +2024-04-02: + Absolucy: + - bugfix: (JohnFulpWillard) Time on servers hosted outside of the UK should now + properly have their timezone offset. + - bugfix: (FlufflesTheDog) Certain areas are now properly protected against grid + check. Namely the supermatter should consistently be protected. + - bugfix: (Ghommie) Fixes the sparring contract. You can now spar with no stakes + and just for fun. + - bugfix: (ChungusGamer666) Exotic blood types no longer persist through species + change if the new species does not have an exotic blood type. + - bugfix: (mc-oofert) You are now made a ghost faster if you get gibbed. + - bugfix: (AnturK) Fixes bioscramble picking the (unimplemented) base wing type. + - bugfix: (AnturK) Fixes setting prebuilt shutter ids with the multitool. + - bugfix: "Fixed revolutionaries winning resulting in ATTENTION [x \u221E]" + JohnFulpWillard: + - bugfix: The TEG now works again (still unobtainable by regular means though). + - bugfix: the TEG and its circulators can now be rotated counterclockwise again. + - refactor: The TEG now uses a TGUI interface rather than the old HTML one. From d96cd1c0fde549d2c3051cac96fddec2bef47918 Mon Sep 17 00:00:00 2001 From: Tractor Mann <69653259+Noot-Toot@users.noreply.github.com> Date: Tue, 2 Apr 2024 03:12:14 +0000 Subject: [PATCH 04/11] Refactor Jukebox Beacons (#1548) * Refactor Jukebox Beacons Yeah so my last implementation... it was bad. This version entirely foregoes frankensteining code from everywhere and is just a slight modification of Roulette Beacon code. which is MUCH nicer. I also gave it its own custom icon! * Further Destinkification 2/3 of the requested changes were also originated from roulette beacon code, so that should probably get a quick refactor too someday. * return --- .../crates_lockers/closets/secure/bar.dm | 2 +- .../code/game/objects/items/choice_beacon.dm | 10 -------- .../code/game/objects/items/jukebox_beacon.dm | 23 ++++++++++++++++++ .../code/modules/cargo/crates/service.dm | 2 +- monkestation/icons/obj/items_and_weapons.dmi | Bin 5669 -> 6026 bytes tgstation.dme | 1 + 6 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 monkestation/code/game/objects/items/jukebox_beacon.dm diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 8aa23966eb08..f2b700ec622d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -18,4 +18,4 @@ new /obj/item/roulette_wheel_beacon(src) new /obj/item/storage/fancy/candle_box(src) new /obj/item/storage/fancy/candle_box(src) - new /obj/item/choice_beacon/jukebox(src) //this line is a monkestation edit! + new /obj/item/jukebox_beacon(src) //monkestation edit diff --git a/monkestation/code/game/objects/items/choice_beacon.dm b/monkestation/code/game/objects/items/choice_beacon.dm index fe00d08e0b2c..b6ce1e948893 100644 --- a/monkestation/code/game/objects/items/choice_beacon.dm +++ b/monkestation/code/game/objects/items/choice_beacon.dm @@ -92,13 +92,3 @@ return to_chat(user, span_notice("[uses] use[uses > 1 ? "s" : ""] remain[uses > 1 ? "" : "s"] on [src].")) - -/obj/item/choice_beacon/jukebox //this is probably a terrible way to do this, but its the first that worked. - name = "jukebox beacon" - desc = "Deploys a jukebox! Also comes wrenched down to the floor for you on delivery! How convenient!" -/obj/item/choice_beacon/jukebox/interact(mob/user) - to_chat(user, span_hear("You hear a crackle before a message plays through [src]: \"Thank you for picking Dave's Instant Jukebox Shipping! This beacon will now self destruct.\"")) - new /obj/machinery/media/jukebox(get_turf(user)) - playsound(src, 'sound/weapons/emitter2.ogg', 50, extrarange = SILENCED_SOUND_EXTRARANGE) - do_sparks(3, source = src) - qdel(src) diff --git a/monkestation/code/game/objects/items/jukebox_beacon.dm b/monkestation/code/game/objects/items/jukebox_beacon.dm new file mode 100644 index 000000000000..de9650818f58 --- /dev/null +++ b/monkestation/code/game/objects/items/jukebox_beacon.dm @@ -0,0 +1,23 @@ +/obj/item/jukebox_beacon + name = "jukebox beacon" + desc = "N.T. jukebox beacon, toss it down and you will have a complementary jukebox delivered to you. It comes with a free wrench to move it after deployment." + icon = 'monkestation/icons/obj/items_and_weapons.dmi' + icon_state = "music_beacon" + var/used = FALSE + +/obj/item/jukebox_beacon/attack_self() + if(used) + return + loc.visible_message(span_warning("\The [src] begins to beep loudly!")) + used = TRUE + addtimer(CALLBACK(src, PROC_REF(launch_payload)), 4 SECONDS) + +/obj/item/jukebox_beacon/proc/launch_payload() + if(QDELETED(src)) + return + podspawn(list( + "target" = get_turf(src), + "spawn" = list(/obj/item/wrench, /obj/machinery/media/jukebox), + "style" = STYLE_CENTCOM + )) + qdel(src) diff --git a/monkestation/code/modules/cargo/crates/service.dm b/monkestation/code/modules/cargo/crates/service.dm index 0dc8a9492410..66077f9c5147 100644 --- a/monkestation/code/modules/cargo/crates/service.dm +++ b/monkestation/code/modules/cargo/crates/service.dm @@ -33,7 +33,7 @@ name = "Jukebox Beacon Crate" desc = "Last one stolen? Broken? Burnt down in an insurance scam? then this crate is for you. Contains one Jukebox Beacon." cost = CARGO_CRATE_VALUE * 20 //the crew shouldnt be able to just buy 15 jukeboxes all playing among us at the same time - contains = list(/obj/item/choice_beacon/jukebox) + contains = list(/obj/item/jukebox_beacon) crate_name = "jukebox beacon crate" /datum/supply_pack/service/cassettes diff --git a/monkestation/icons/obj/items_and_weapons.dmi b/monkestation/icons/obj/items_and_weapons.dmi index 919998aba182e0c904f550e87067373f1c963de9..549e16e92b1594bb95a36b10a14cfd739fb1d5b8 100644 GIT binary patch literal 6026 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 z%0D~v;;Ax&*E&?&)82fgP8j9BIoyA0T-=}{ir0HSNlf*MKo3KGO;eFJmlxCf5{I3y zrUGDUX77gbe#&io#S z_F990?cDKRhBxFW_Pu;!Q2^L>H2VKTMuh3+^VDgWhv<>t*n!R+1C1&*hp7JpDW-;f literal 5669 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 O0$S?&YE>%sQU3=w@AF>( diff --git a/tgstation.dme b/tgstation.dme index 6eca3c3f05b4..7eb25b22df2c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5741,6 +5741,7 @@ #include "monkestation\code\game\objects\items\choice_beacon.dm" #include "monkestation\code\game\objects\items\cirno_plush.dm" #include "monkestation\code\game\objects\items\gravity_gun.dm" +#include "monkestation\code\game\objects\items\jukebox_beacon.dm" #include "monkestation\code\game\objects\items\miningweapons.dm" #include "monkestation\code\game\objects\items\mothlet_grenade.dm" #include "monkestation\code\game\objects\items\plushies.dm" From 031fa63470f26c9811a3e4788edf5d6d4e838213 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 03:12:34 +0000 Subject: [PATCH 05/11] Automatic changelog for PR #1548 [ci skip] --- html/changelogs/AutoChangeLog-pr-1548.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1548.yml diff --git a/html/changelogs/AutoChangeLog-pr-1548.yml b/html/changelogs/AutoChangeLog-pr-1548.yml new file mode 100644 index 000000000000..1593e2c819d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1548.yml @@ -0,0 +1,4 @@ +author: "Tractor Mann" +delete-after: True +changes: + - refactor: "Jukebox Beacon Code has been refactored, changes to note is that jukeboxes no longer deploy instantly and now come with a wrench." \ No newline at end of file From 73f06c203c8873bd7885b99e6f8691506fe947d7 Mon Sep 17 00:00:00 2001 From: MilkForever Date: Tue, 2 Apr 2024 19:29:18 -0400 Subject: [PATCH 06/11] Waffles's Personal Modsuit (#1520) * Waffles' modsuit Adds an admin only modsuit to the game. * I hate byond Hopefully this fixes linters --- monkestation/code/modules/mod/mod_control.dm | 63 ++++++++++++++++++ monkestation/code/modules/mod/mod_types.dm | 17 +++++ .../icons/mob/clothing/worn_modsuit.dmi | Bin 1829 -> 3506 bytes .../icons/obj/clothing/modsuits/modsuit.dmi | Bin 1230 -> 2144 bytes tgstation.dme | 2 + 5 files changed, 82 insertions(+) create mode 100644 monkestation/code/modules/mod/mod_types.dm diff --git a/monkestation/code/modules/mod/mod_control.dm b/monkestation/code/modules/mod/mod_control.dm index e69de29bb2d1..4f686fcb552a 100644 --- a/monkestation/code/modules/mod/mod_control.dm +++ b/monkestation/code/modules/mod/mod_control.dm @@ -0,0 +1,63 @@ +/datum/mod_theme/waffles + name = "Waffles' corporate" + desc = "A heavily modified suit created by Waffles to distinguish himself from other CentCom Officers. If you are not Waffles you shouldn't be wearing this!" + default_skin = "waffles" + resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + complexity_max = 50 + armor_type= /datum/armor/mod_theme_waffles + charge_drain = DEFAULT_CHARGE_DRAIN * 0 + siemens_coefficient = 0 + slowdown_inactive = 0 + slowdown_active = 0 + ui_theme = "wizard" + inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) + allowed_suit_storage = list( + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/restraints/handcuffs, + /obj/item/assembly/flash, + /obj/item/melee/baton, + /obj/item/gun, + ) + skins = list( + "waffles" = list( + MOD_ICON_OVERRIDE = 'monkestation/icons/obj/clothing/modsuits/modsuit.dmi', + MOD_WORN_ICON_OVERRIDE = 'monkestation/icons/mob/clothing/worn_modsuit.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = NECK_LAYER, + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/datum/armor/mod_theme_waffles + melee = 50 + bullet = 60 + laser = 50 + energy = 50 + bomb = 100 + bio = 100 + fire = 100 + acid = 100 + wound = 30 diff --git a/monkestation/code/modules/mod/mod_types.dm b/monkestation/code/modules/mod/mod_types.dm new file mode 100644 index 000000000000..fbe768321cab --- /dev/null +++ b/monkestation/code/modules/mod/mod_types.dm @@ -0,0 +1,17 @@ +/obj/item/mod/control/pre_equipped/waffles + theme = /datum/mod_theme/waffles + applied_core = /obj/item/mod/core/infinite + applied_modules = list( + /obj/item/mod/module/storage/bluespace, + /obj/item/mod/module/emp_shield/advanced, + /obj/item/mod/module/welding, + /obj/item/mod/module/stealth/ninja, + /obj/item/mod/module/magnetic_harness, + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/noslip, + /obj/item/mod/module/dna_lock/reinforced, + ) + default_pins = list( + /obj/item/mod/module/stealth/ninja, + /obj/item/mod/module/jetpack/advanced, + ) diff --git a/monkestation/icons/mob/clothing/worn_modsuit.dmi b/monkestation/icons/mob/clothing/worn_modsuit.dmi index 5bb12b10c05eed0fb2704ef1da23401bed1c9829..900e2c30e61e52e73a469c366c3824a7b8b1847e 100644 GIT binary patch literal 3506 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 literal 1829 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 so&Vt9Zx(RFO Date: Tue, 2 Apr 2024 23:29:37 +0000 Subject: [PATCH 07/11] Automatic changelog for PR #1520 [ci skip] --- html/changelogs/AutoChangeLog-pr-1520.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1520.yml diff --git a/html/changelogs/AutoChangeLog-pr-1520.yml b/html/changelogs/AutoChangeLog-pr-1520.yml new file mode 100644 index 000000000000..fd021f08c7e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1520.yml @@ -0,0 +1,4 @@ +author: "MilkForever" +delete-after: True +changes: + - rscadd: "Added the admin-only Waffles corporate MODsuit." \ No newline at end of file From fd2f8c7c82793e5dc46500c4b08ec36cedcaf0de Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 3 Apr 2024 01:11:19 +0000 Subject: [PATCH 08/11] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1520.yml | 4 ---- html/changelogs/AutoChangeLog-pr-1548.yml | 4 ---- html/changelogs/archive/2024-04.yml | 6 ++++++ 3 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1520.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1548.yml diff --git a/html/changelogs/AutoChangeLog-pr-1520.yml b/html/changelogs/AutoChangeLog-pr-1520.yml deleted file mode 100644 index fd021f08c7e0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1520.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MilkForever" -delete-after: True -changes: - - rscadd: "Added the admin-only Waffles corporate MODsuit." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1548.yml b/html/changelogs/AutoChangeLog-pr-1548.yml deleted file mode 100644 index 1593e2c819d8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1548.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tractor Mann" -delete-after: True -changes: - - refactor: "Jukebox Beacon Code has been refactored, changes to note is that jukeboxes no longer deploy instantly and now come with a wrench." \ No newline at end of file diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml index 7e7e64a7c947..f8e2e70a91bb 100644 --- a/html/changelogs/archive/2024-04.yml +++ b/html/changelogs/archive/2024-04.yml @@ -48,3 +48,9 @@ - bugfix: The TEG now works again (still unobtainable by regular means though). - bugfix: the TEG and its circulators can now be rotated counterclockwise again. - refactor: The TEG now uses a TGUI interface rather than the old HTML one. +2024-04-03: + MilkForever: + - rscadd: Added the admin-only Waffles corporate MODsuit. + Tractor Mann: + - refactor: Jukebox Beacon Code has been refactored, changes to note is that jukeboxes + no longer deploy instantly and now come with a wrench. From 708edfe895347c8aa1a00889180d8e12e1bb8c15 Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 3 Apr 2024 00:03:26 -0400 Subject: [PATCH 09/11] Revert "Levelup ability for Bloodsuckers (#1469)" (#1567) This reverts commit fd82acb7d4aa48e1d84da116ea5053199ec3dcc2. --- .../bloodsuckers/powers/force_level.dm | 43 ------------------- tgstation.dme | 1 - 2 files changed, 44 deletions(-) delete mode 100644 monkestation/code/modules/bloodsuckers/powers/force_level.dm diff --git a/monkestation/code/modules/bloodsuckers/powers/force_level.dm b/monkestation/code/modules/bloodsuckers/powers/force_level.dm deleted file mode 100644 index b896ed2d5917..000000000000 --- a/monkestation/code/modules/bloodsuckers/powers/force_level.dm +++ /dev/null @@ -1,43 +0,0 @@ -/* PROC TO MANAGE LEVELLING UP THIS WAY */ -/datum/antagonist/bloodsucker/proc/ForcedRankUp() //I hate this. - set waitfor = FALSE - if(!owner || !owner.current) - return - bloodsucker_level_unspent ++ - // Spend Rank Immediately? - if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) //Hacky workaround. - SpendRank() - else - to_chat(owner, span_notice("You have forced your powers to further through the power of blood; Sleep within your lair to claim your boon.")) - if(bloodsucker_level_unspent >= 2) - to_chat(owner, span_notice("Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.")) - -/datum/action/cooldown/bloodsucker/levelup - name = "Forced Evolution" - desc = "Spend the lovely sanguine running through your veins; aging you at an accelerated rate." - button_icon_state = "power_feed" - var/total_uses = 1 - bloodcost = 50 - cooldown_time = 50 - power_flags = BP_AM_STATIC_COOLDOWN - check_flags = BP_CANT_USE_WHILE_STAKED|BP_CANT_USE_WHILE_INCAPACITATED|BP_CANT_USE_WHILE_UNCONSCIOUS - purchase_flags = BLOODSUCKER_CAN_BUY|BLOODSUCKER_DEFAULT_POWER - -/datum/action/cooldown/bloodsucker/levelup/ActivatePower() - if(total_uses >= 10) - to_chat(owner, span_bolddanger("The power of blood simply isn't enough to advance further... Age must suffice, from now on.")) - return - var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(/datum/antagonist/bloodsucker) - if(istype(bloodsuckerdatum)) - bloodsuckerdatum.ForcedRankUp() // Rank up! Must still be in a coffin to level! - total_uses++ - bloodcost = total_uses * 20 //By default, it's 50 blood, then 100, etc etc. - if(total_uses == 4) - to_chat(owner, span_revenbignotice("With the next use; you can't help but feel your true nature will become visible to all that gaze upon your visage! OOC: This will costitute a breach of the Masquerade and show you're a vampire!")) - if(total_uses == 5) //you're fucked. - bloodsuckerdatum.owner.current.remove_traits(TRAIT_DISFIGURED, BLOODSUCKER_TRAIT) //Disfigures them. - bloodsuckerdatum.break_masquerade() //Killing people to get this far should break the masquerade. - to_chat(owner, span_danger("You've broken the Masquerade, and revealed yourself for the blood-theiving, murdering parasite you are! Vampires and Crew will attempt to hunt you... But isn't that what you want? Fresh blood for your fangs...")) - for(var/datum/action/cooldown/bloodsucker/power as anything in bloodsuckerdatum.powers) - if(istype(power, /datum/action/cooldown/bloodsucker/masquerade) || istype(power, /datum/action/cooldown/bloodsucker/veil)) - bloodsuckerdatum.RemovePower(power) diff --git a/tgstation.dme b/tgstation.dme index 9808b909b6b2..10096cbb5b28 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6053,7 +6053,6 @@ #include "monkestation\code\modules\bloodsuckers\powers\_base_power.dm" #include "monkestation\code\modules\bloodsuckers\powers\cloak.dm" #include "monkestation\code\modules\bloodsuckers\powers\feed.dm" -#include "monkestation\code\modules\bloodsuckers\powers\force_level.dm" #include "monkestation\code\modules\bloodsuckers\powers\fortitude.dm" #include "monkestation\code\modules\bloodsuckers\powers\go_home.dm" #include "monkestation\code\modules\bloodsuckers\powers\masquerade.dm" From 4131716646dd82b51b9d838372791f0509064fbf Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 3 Apr 2024 18:51:37 -0400 Subject: [PATCH 10/11] Allow airlock helpers to work with windoors (#1568) * Allow airlock helpers to work with windoors * fix that * whoops --- .../RandomBars/Tram/tram_bar_beachside.dmm | 11 +++----- code/modules/mapping/mapping_helpers.dm | 2 ++ .../code/modules/mapping/access_helpers.dm | 15 +++++++++++ .../code/modules/mapping/mapping_helpers.dm | 27 +++++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/_maps/~monkestation/RandomBars/Tram/tram_bar_beachside.dmm b/_maps/~monkestation/RandomBars/Tram/tram_bar_beachside.dmm index 65031b8a08fa..041c608df6f3 100644 --- a/_maps/~monkestation/RandomBars/Tram/tram_bar_beachside.dmm +++ b/_maps/~monkestation/RandomBars/Tram/tram_bar_beachside.dmm @@ -426,8 +426,7 @@ "nN" = ( /obj/structure/ladder, /obj/machinery/door/window/left/directional/north{ - name = "Bar Backroom Access"; - req_one_access = list("bar") + name = "Bar Backroom Access" }, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -605,8 +604,7 @@ name = "Kitchen Counter Shutters" }, /obj/machinery/door/window/left/directional/west{ - name = "Kitchen"; - req_one_access = list("kitchen") + name = "Kitchen" }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/wood, @@ -820,7 +818,6 @@ /area/station/commons/lounge) "zo" = ( /obj/machinery/door/window/left/directional/south{ - req_one_access = list("kitchen"); name = "Kitchen" }, /obj/effect/turf_decal/siding/wood, @@ -877,8 +874,7 @@ /area/station/commons/lounge) "AC" = ( /obj/machinery/door/window/left/directional/east{ - name = "Bar"; - req_one_access = list("bar") + name = "Bar" }, /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1558,7 +1554,6 @@ /area/station/commons/lounge) "TG" = ( /obj/machinery/door/window/left/directional/south{ - req_one_access = list("kitchen"); name = "Kitchen Coldroom Access" }, /obj/effect/turf_decal/siding/wood{ diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index b7697b3cb75c..3d1065149d63 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -110,6 +110,7 @@ layer = DOOR_HELPER_LAYER late = TRUE +/* replaced in monkestation\code\modules\mapping\mapping_helpers.dm /obj/effect/mapping_helpers/airlock/Initialize(mapload) . = ..() if(!mapload) @@ -121,6 +122,7 @@ log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") else payload(airlock) +*/ /obj/effect/mapping_helpers/airlock/LateInitialize() . = ..() diff --git a/monkestation/code/modules/mapping/access_helpers.dm b/monkestation/code/modules/mapping/access_helpers.dm index e1f00e361b73..6a7dac901dfa 100644 --- a/monkestation/code/modules/mapping/access_helpers.dm +++ b/monkestation/code/modules/mapping/access_helpers.dm @@ -1,3 +1,18 @@ +/obj/effect/mapping_helpers/airlock/access/any/payload_windoor(obj/machinery/door/window/windoor) + if(windoor.req_access != null) + log_mapping("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") + else + var/list/access_list = get_access() + windoor.req_one_access += access_list + +/obj/effect/mapping_helpers/airlock/access/all/payload_windoor(obj/machinery/door/window/windoor) + if(windoor.req_one_access != null) + log_mapping("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") + else + var/list/access_list = get_access() + windoor.req_access += access_list + + /obj/effect/mapping_helpers/airlock/access/all/service/kitchen/east_offset offset_dir = EAST diff --git a/monkestation/code/modules/mapping/mapping_helpers.dm b/monkestation/code/modules/mapping/mapping_helpers.dm index 0b464f77a218..0cf47616d4d5 100644 --- a/monkestation/code/modules/mapping/mapping_helpers.dm +++ b/monkestation/code/modules/mapping/mapping_helpers.dm @@ -50,3 +50,30 @@ /obj/effect/area_power_helper/requires_power set_state = TRUE + +/obj/effect/mapping_helpers/airlock/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return + + var/turf/spot = (offset_dir ? get_step(src, offset_dir) : loc) + if(!try_for_airlock(spot) && !try_for_windoor(spot)) + log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") + +/obj/effect/mapping_helpers/airlock/proc/try_for_airlock(turf/spot) + . = FALSE + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in spot + if(!QDELETED(airlock)) + payload(airlock) + return TRUE + +/obj/effect/mapping_helpers/airlock/proc/try_for_windoor(turf/spot) + . = FALSE + var/obj/machinery/door/window/windoor = locate(/obj/machinery/door/window) in spot + if(!QDELETED(windoor)) + payload_windoor(windoor) + return TRUE + +/obj/effect/mapping_helpers/airlock/proc/payload_windoor(obj/machinery/door/window/windoor) + return From 494c5b06a808d4e7b3efcc5ba9494424b9e64eb5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 22:51:56 +0000 Subject: [PATCH 11/11] Automatic changelog for PR #1568 [ci skip] --- html/changelogs/AutoChangeLog-pr-1568.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1568.yml diff --git a/html/changelogs/AutoChangeLog-pr-1568.yml b/html/changelogs/AutoChangeLog-pr-1568.yml new file mode 100644 index 000000000000..63fafa969dac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1568.yml @@ -0,0 +1,4 @@ +author: "Absolucy" +delete-after: True +changes: + - bugfix: "Airlock mapping helpers now work with windoors." \ No newline at end of file