diff --git a/code/datums/climate.dm b/code/datums/climate.dm index 387a2e98079..589e0fd6000 100644 --- a/code/datums/climate.dm +++ b/code/datums/climate.dm @@ -10,6 +10,9 @@ //Forecast will stay unchanged until there are less than PREDICTION_MINIMUM weathers, at which point it will make a new forecast //Every forecast is freshly generated, which means forecasts change! +#define INTENSIFY 1 +#define ABATE -1 + var/list/weathertracker = list() //associative list, gathers time spent one each weather for scoreboard /datum/climate @@ -38,6 +41,8 @@ var/list/weathertracker = list() //associative list, gathers time spent one each else var/datum/weather/future = new path(src) forecasts += future + if(W.next_weather.len == 1) + break //Forecast no further. cycle++ forecasts -= current_weather //remove it from our future weather @@ -57,6 +62,29 @@ var/list/weathertracker = list() //associative list, gathers time spent one each if(forecasts.len < PREDICTION_MINIMUM) forecast() +#define INVALID_STEP -1 +#define CANNOT_CHANGE -2 +//step -1 to go down a step, 1 to go up a step +/datum/climate/proc/weather_shift(var/direction = INTENSIFY) + if(direction**2 != 1) + return INVALID_STEP //must be 1 or -1 + if(current_weather) + var/weathers = current_weather.next_weather.len + if(weathers == 1) + return CANNOT_CHANGE + var/preferred_weather + if(direction == INTENSIFY) + preferred_weather = current_weather.next_weather[weathers] //the last value + else if(direction == ABATE) + preferred_weather = current_weather.next_weather[1] //the first value + if(preferred_weather == current_weather.type) + return FALSE + current_weather.timeleft = min(1 MINUTES, current_weather.timeleft) + current_weather.next_weather.Cut() + current_weather.next_weather[preferred_weather] = 100 + forecast() + return TRUE + /datum/climate/proc/change_weather(weather) if(ispath(weather)) //We have been provided a path. Let's see if it's identical to the one we have. @@ -89,6 +117,8 @@ var/list/weathertracker = list() //associative list, gathers time spent one each /datum/weather var/name = "weather" var/list/next_weather = list() //associative list + //for next_weather, order matters: put in order of weather intensity, so that step() will work + //only one in list means it can't be changed by the weather control device var/timeleft = 1 var/datum/climate/parent var/temperature = T20C diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 55f492372ed..6d991eece46 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -1496,3 +1496,15 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/capacitor = 1, ) + +/obj/item/weapon/circuitboard/weathercontrol + name = "Circuit Board (Weather Control Device)" + desc = "A circuit board used to operate a weather control device." + build_path = /obj/machinery/weathercontrol + board_type = MACHINE + origin_tech = Tc_PROGRAMMING + "=4" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin/adv/super/bluespace = 1, + /obj/item/weapon/stock_parts/micro_laser/high/ultra = 2, + /obj/item/weapon/cell/rad = 1, + ) \ No newline at end of file diff --git a/code/game/machinery/weathercontrol.dm b/code/game/machinery/weathercontrol.dm new file mode 100644 index 00000000000..38f22c9cdf9 --- /dev/null +++ b/code/game/machinery/weathercontrol.dm @@ -0,0 +1,184 @@ +/obj/machinery/weathercontrol + name = "weather control device" + desc = "A device which uses weather control techniques such as cloud seeding to manipulate atmospheric conditions. It runs on bluespace crystals." + icon = 'icons/obj/stationobjs_32x64.dmi' + icon_state = "wcd0" + use_power = 1 + density = 1 + anchored = 1 + machine_flags = SCREWTOGGLE | CROWDESTROY | WRENCHMOVE | FIXED2WORK + req_access = list(access_rnd) + idle_power_usage = 100 + var/error_message = null + var/efficiency_modifier = 0 //Subtract from crystal costs + var/crystal_reserve = 0 //Powered by bluespace crystals, this represents how much. + +/obj/machinery/weathercontrol/New() + . = ..() + component_parts = newlist( + /obj/item/weapon/circuitboard/weathercontrol, + /obj/item/weapon/cell/rad, + /obj/item/weapon/stock_parts/matter_bin/adv/super/bluespace, + /obj/item/weapon/stock_parts/micro_laser/high/ultra, + /obj/item/weapon/stock_parts/micro_laser/high/ultra) + RefreshParts() + +/obj/machinery/weathercontrol/Destroy() + if(crystal_reserve >= 300) + new /obj/item/bluespace_crystal/flawless(loc) + else + while(crystal_reserve >= 3) + new /obj/item/bluespace_crystal(loc) + crystal_reserve -= 3 + while(crystal_reserve > 0) + new /obj/item/bluespace_crystal/artificial(loc) + crystal_reserve-- + ..() + +/obj/machinery/weathercontrol/RefreshParts() + var/T = 0 + for(var/obj/item/weapon/stock_parts/micro_laser/ML in component_parts) + T += ML.rating + efficiency_modifier = (T/2)-3 + //Both tier 3: 0; one tier 4: 0.5, both tier 4: 1 + +/obj/machinery/weathercontrol/update_icon() + icon_state = "wcd[crystal_reserve > 0]" + +/obj/machinery/weathercontrol/attack_hand(mob/user) + return ui_interact(user) + +/obj/machinery/weathercontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open=NANOUI_FOCUS) + if (gcDestroyed || !get_turf(src) || !anchored) + if(!ui) + ui = nanomanager.get_open_ui(user, src, ui_key) + if(ui) + ui.close() + return + + var/data[0] + data["error"] = error_message + + if(map.climate) + var/datum/climate/C = map.climate + var/datum/weather/CW = C.current_weather + var/forecast_dat + for(var/datum/weather/W in C.forecasts) + forecast_dat += "[W.name] " + data["name"] = name + data["currentweather"] = CW + data["remaining_time"] = formatTimeDuration(CW.timeleft) + data["forecast"] = forecast_dat + data["crystals"] = crystal_reserve + else + data["error"] = "Error: No climate detected." + + // update the ui if it exists, returns null if no ui is passed/found + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "weathercontrol.tmpl", "Weather Control Device", 380, 250) + ui.set_initial_data(data) + ui.open() + +#define DISRUPT_COST 1 +#define INTENSIFY_COST 1 +#define ABATE_COST 2 + +#define SUCCESS 1 +#define NOFIRE 2 +#define NEED_CRYSTALS -3 +#define POWER_ERROR -4 +/obj/machinery/weathercontrol/Topic(href, href_list) + if(..()) + return + if(usr.incapacitated() || (!Adjacent(usr)&&!isAdminGhost(usr)) || !usr.dexterity_check() || !map.climate) + return + if(!allowed(usr) && !emagged) + to_chat(usr,"Access denied.") + return + if(stat & NOPOWER) + return + var/datum/climate/C = map.climate + var/datum/weather/CW = C.current_weather + + var/feedback = NOFIRE + var/usedcost = 0 + + if(stat & NOPOWER) + feedback = POWER_ERROR + else + if(href_list["disrupt"]) + feedback = SUCCESS + usedcost = DISRUPT_COST + if(!burn_crystals(DISRUPT_COST)) + feedback = NEED_CRYSTALS + else + if(C.current_weather.next_weather.len < 2) + feedback = CANNOT_CHANGE + else + CW.timeleft = min(1 MINUTES, CW.timeleft) + C.forecast() + if(href_list["intensify"]) + feedback = SUCCESS + usedcost = INTENSIFY_COST + if(!burn_crystals(INTENSIFY_COST)) + feedback = NEED_CRYSTALS + else + feedback = C.weather_shift(INTENSIFY) + if(href_list["abate"]) + feedback = SUCCESS + usedcost = ABATE_COST + if(!burn_crystals(ABATE_COST)) + feedback = NEED_CRYSTALS + else + feedback = C.weather_shift(ABATE) + + var/soundpath = 'sound/machines/warning-buzzer.ogg' + switch(feedback) + if(POWER_ERROR) + error_message = "Error: Unpowered." + if(NEED_CRYSTALS) + error_message = "Error: Refraction index low. Load new bluespace crystals." + if(CANNOT_CHANGE) + error_message = "Error: Cannot change weather." + refund(usedcost) + if(INVALID_STEP) + error_message = "Error: Machine malfunction." + refund(usedcost) + if(FALSE) + error_message = "Error: Weather already present." + refund(usedcost) + if(SUCCESS) + error_message = "Success: Atmoforming climate." + soundpath = 'sound/machines/hiss.ogg' + if(NOFIRE) + return + playsound(src, soundpath, vol = 50, vary = FALSE) + nanomanager.update_uis(src) + update_icon() + spawn(4 SECONDS) + error_message = null + return 1 + +/obj/machinery/weathercontrol/proc/burn_crystals(var/cost) + var/tcost = cost - efficiency_modifier + if(tcost>crystal_reserve) + return FALSE + crystal_reserve = max(0, crystal_reserve - tcost) + return TRUE + +/obj/machinery/weathercontrol/proc/refund(var/num) + var/tnum = num - efficiency_modifier + crystal_reserve += tnum + +/obj/machinery/weathercontrol/attackby(var/obj/item/I, var/mob/user) + ..() + if(istype(I, /obj/item/bluespace_crystal)) + var/obj/item/bluespace_crystal/B = I + if(user.drop_item(B, src)) + crystal_reserve += B.blueChargeValue + B.playtoolsound(src, 50) + to_chat(user, "You insert \the [B] into \the [src].") + nanomanager.update_uis(src) + qdel(B) + update_icon() \ No newline at end of file diff --git a/code/modules/research/designs/boards/machine_science.dm b/code/modules/research/designs/boards/machine_science.dm index 00448eb5152..bcb3043b46d 100644 --- a/code/modules/research/designs/boards/machine_science.dm +++ b/code/modules/research/designs/boards/machine_science.dm @@ -112,3 +112,13 @@ materials = list(MAT_GLASS = 2000, SACID = 20) category = "Console Boards" build_path = /obj/item/weapon/circuitboard/suspension_gen + +/datum/design/weathercontroldevice + name = "Circuit Design (Weather Control Device)" + desc = "The circuitboard for a weather control device." + id = "weathercontrol" + req_tech = list(Tc_PROGRAMMING = 4) + build_type = IMPRINTER + materials = list(MAT_GLASS = 2000, SACID = 20) + category = "Console Boards" + build_path = /obj/item/weapon/circuitboard/weathercontrol \ No newline at end of file diff --git a/icons/obj/stationobjs_32x64.dmi b/icons/obj/stationobjs_32x64.dmi new file mode 100644 index 00000000000..009753fc881 Binary files /dev/null and b/icons/obj/stationobjs_32x64.dmi differ diff --git a/maps/snaxi.dmm b/maps/snaxi.dmm index 09621c5bd3e..67e602b1fdd 100644 --- a/maps/snaxi.dmm +++ b/maps/snaxi.dmm @@ -23260,6 +23260,7 @@ icon_state = "1-2"; tag = "" }, +/obj/machinery/holosign/morgue, /turf/simulated/floor{ icon_state = "dark" }, @@ -36520,13 +36521,17 @@ }, /area/science/server) "boN" = ( +/obj/machinery/light{ + dir = 8 + }, /turf/simulated/floor{ - icon_state = "warnwhitecorner" + icon_state = "white" }, /area/science/lab) "boO" = ( /turf/simulated/floor{ - icon_state = "warnwhite" + dir = 1; + icon_state = "rampbottom" }, /area/science/lab) "boP" = ( @@ -37036,46 +37041,18 @@ }, /area/science/server) "bpM" = ( -/obj/structure/table, -/obj/item/clothing/suit/storage/wintercoat/medical/science, -/obj/item/clothing/suit/storage/wintercoat/medical/science, -/obj/item/clothing/suit/storage/wintercoat/medical/science, -/obj/item/clothing/suit/storage/wintercoat/medical/science, -/obj/item/clothing/suit/storage/wintercoat/medical/science, -/obj/item/clothing/suit/storage/wintercoat/medical/science, /obj/machinery/firealarm{ dir = 8; pixel_x = -24 }, /turf/simulated/floor{ - dir = 6; - icon_state = "warnwhite" + icon_state = "warnwhitecorner" }, /area/science/lab) -"bpN" = ( -/obj/machinery/r_n_d/destructive_analyzer, -/turf/simulated/floor/bluegrid, -/area/science/lab) -"bpO" = ( -/obj/machinery/constructable_frame/machine_frame, -/obj/machinery/media/receiver/boombox/wallmount/muzak{ - pixel_y = -24 - }, -/turf/simulated/floor/bluegrid, -/area/science/lab) -"bpP" = ( -/obj/machinery/computer/rdconsole/core, -/obj/machinery/light, -/turf/simulated/floor/bluegrid, -/area/science/lab) -"bpQ" = ( -/obj/machinery/r_n_d/fabricator/protolathe, -/turf/simulated/floor/bluegrid, -/area/science/lab) "bpR" = ( -/obj/machinery/r_n_d/fabricator/circuit_imprinter, -/obj/item/weapon/reagent_containers/glass/beaker/sulphuric, -/turf/simulated/floor/bluegrid, +/turf/simulated/floor{ + icon_state = "warnwhite" + }, /area/science/lab) "bpS" = ( /obj/item/clothing/glasses/simonglasses, @@ -37423,36 +37400,30 @@ /area/science/server) "bqx" = ( /obj/structure/window/reinforced{ - dir = 8 + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/full/reinforced, -/turf/simulated/floor/plating, +/obj/machinery/r_n_d/destructive_analyzer, +/turf/simulated/floor/bluegrid, /area/science/lab) "bqy" = ( /obj/structure/window/reinforced{ - dir = 1 + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" }, -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/full/reinforced, -/turf/simulated/floor/plating, +/obj/machinery/r_n_d/fabricator/protolathe, +/turf/simulated/floor/bluegrid, /area/science/lab) "bqz" = ( /obj/structure/window/reinforced{ - dir = 1 + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/grille, -/obj/structure/window/reinforced, -/obj/structure/window/full/reinforced, -/turf/simulated/floor/plating, +/obj/machinery/r_n_d/fabricator/circuit_imprinter, +/turf/simulated/floor/bluegrid, /area/science/lab) "bqA" = ( /obj/structure/bed/chair{ @@ -44596,6 +44567,7 @@ tag = "" }, /obj/machinery/door_timer/cell_1{ + dir = 1; pixel_y = 32 }, /turf/simulated/floor{ @@ -100582,6 +100554,12 @@ /area/bridge/meeting_room{ name = "\improper Security Station Bridge" }) +"dTR" = ( +/turf/simulated/floor{ + dir = 8; + icon_state = "rampbottom" + }, +/area/science/lab) "dWH" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor/border_only{ @@ -100706,6 +100684,16 @@ icon_state = "freezerfloor" }, /area/security/perma) +"eVS" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "warning"; + tag = "icon-warning" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "eYF" = ( /obj/machinery/computer/climate/wall{ pixel_x = -30 @@ -100904,6 +100892,13 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"haA" = ( +/obj/machinery/door/airlock/external{ + name = "Weather Control Access"; + req_one_access_txt = "7; 29" + }, +/turf/simulated/floor/plating, +/area/science/lab) "hiu" = ( /turf/simulated/floor{ dir = 1; @@ -100911,6 +100906,14 @@ tag = "icon-darkblue (NORTH)" }, /area/security/perma) +"hlM" = ( +/obj/effect/decal/warning_stripes{ + dir = 8; + icon_state = "warning_corner"; + tag = "icon-warning_corner (WEST)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "hrm" = ( /obj/structure/cable{ d1 = 1; @@ -100928,6 +100931,13 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"hta" = ( +/obj/effect/decal/cleanable/blood/oil{ + dir = 4; + icon_state = "floor6" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "hxZ" = ( /obj/machinery/light, /obj/machinery/media/receiver/boombox/wallmount/muzak{ @@ -101058,6 +101068,18 @@ }, /turf/simulated/floor/carpet, /area/security/hos) +"ila" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/full/reinforced, +/turf/simulated/floor/plating, +/area/science/lab) "ioN" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13;24" @@ -101152,6 +101174,10 @@ /area/engine/locker{ name = "\improper Engineering Foyer" }) +"iZe" = ( +/obj/item/weapon/storage/toolbox/mechanical, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "jcq" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -101175,12 +101201,31 @@ icon_state = "dark" }, /area/security/brig) +"jtQ" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "warning"; + tag = "icon-warning" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "sci" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "juJ" = ( /obj/machinery/computer/climate/wall{ pixel_y = -30 }, /turf/simulated/floor/plating, /area/supply/miningdelivery) +"jCa" = ( +/turf/simulated/floor{ + dir = 8; + icon_state = "neutralfull" + }, +/area/science/lab) "jCX" = ( /obj/machinery/door/airlock/vault{ name = "The Hole"; @@ -101200,6 +101245,12 @@ icon_state = "dark vault stripe" }, /area/security/perma) +"jNt" = ( +/obj/machinery/light, +/turf/simulated/floor{ + icon_state = "purple" + }, +/area/science/lab) "jTM" = ( /obj/machinery/door_control{ desc = "A remote control-switch for a door to space."; @@ -101301,6 +101352,9 @@ icon_state = "dark" }, /area/security/brig) +"kHu" = ( +/turf/simulated/floor, +/area/science/lab) "kJd" = ( /obj/structure/window/reinforced{ dir = 8 @@ -101586,6 +101640,15 @@ }, /turf/unsimulated/floor/snow, /area/surface/forest/south) +"mmF" = ( +/obj/structure/window/reinforced{ + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" + }, +/obj/machinery/computer/rdconsole/core, +/turf/simulated/floor/bluegrid, +/area/science/lab) "mwy" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8; @@ -101639,6 +101702,21 @@ icon_state = "dark" }, /area/security/perma) +"naM" = ( +/obj/structure/window/reinforced{ + dir = 8; + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" + }, +/obj/structure/window/reinforced{ + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" + }, +/obj/machinery/constructable_frame/machine_frame, +/turf/simulated/floor/bluegrid, +/area/science/lab) "ndg" = ( /obj/structure/closet/wardrobe/pjs, /obj/item/stack/sheet/wood{ @@ -101674,6 +101752,11 @@ }, /turf/simulated/floor/plating, /area/engineering/atmos) +"noa" = ( +/turf/simulated/floor{ + icon_state = "purple" + }, +/area/science/lab) "nop" = ( /obj/item/device/flashlight/lamp, /obj/structure/table/woodentable, @@ -101681,6 +101764,17 @@ /area/security/toilet{ name = "Brig Dormitories" }) +"ntc" = ( +/obj/machinery/constructable_frame/machine_frame{ + build_state = 2; + icon_state = "box_1" + }, +/obj/item/weapon/circuitboard/weathercontrol, +/obj/effect/decal/warning_stripes{ + icon_state = "bot" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "nzq" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -101719,6 +101813,18 @@ icon_state = "dark" }, /area/security/perma) +"nJG" = ( +/obj/effect/decal/warning_stripes{ + dir = 8; + icon_state = "warning"; + tag = "icon-warning (WEST)" + }, +/obj/structure/fence, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) +"nJR" = ( +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "nZp" = ( /obj/structure/cable{ d1 = 1; @@ -101890,6 +101996,18 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"pcf" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/full/reinforced, +/turf/simulated/floor/plating, +/area/science/lab) "pqb" = ( /obj/structure/cable{ d1 = 1; @@ -102033,6 +102151,13 @@ icon_state = "dark" }, /area/security/brig) +"qwz" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "warning"; + tag = "icon-warning" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "qxT" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'HIGH VOLTAGE'"; @@ -102097,6 +102222,24 @@ }, /turf/simulated/floor/plating, /area/security/perma) +"qZv" = ( +/obj/machinery/space_heater, +/obj/structure/window/reinforced{ + icon = 'icons/obj/objects.dmi'; + icon_state = "rail"; + name = "safety rail" + }, +/turf/simulated/floor{ + dir = 4; + icon_state = "purple" + }, +/area/science/lab) +"rev" = ( +/turf/simulated/floor{ + dir = 8; + icon_state = "purple" + }, +/area/science/lab) "rgk" = ( /obj/machinery/door/airlock/glass_security{ name = "Prison Medbay"; @@ -102180,6 +102323,14 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"rFQ" = ( +/obj/effect/decal/warning_stripes{ + dir = 1; + icon_state = "warning_corner"; + tag = "icon-warning_corner (NORTH)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "rGr" = ( /obj/structure/punching_bag/clown, /turf/simulated/floor{ @@ -102288,11 +102439,23 @@ }, /turf/simulated/floor/plating, /area/engineering/atmos) +"rVw" = ( +/obj/structure/hanging_lantern{ + dir = 1 + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "rXG" = ( /turf/simulated/floor{ icon_state = "freezerfloor" }, /area/security/perma) +"sdG" = ( +/obj/structure/hanging_lantern{ + dir = 4 + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "sel" = ( /obj/machinery/door/firedoor/border_only{ name = "Firelock South" @@ -102427,6 +102590,14 @@ tag = "icon-darkred (SOUTHWEST)" }, /area/security/brig) +"tYI" = ( +/obj/effect/decal/warning_stripes{ + dir = 4; + icon_state = "warning"; + tag = "icon-warning (EAST)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "ucb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -102567,6 +102738,22 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"uUg" = ( +/obj/effect/decal/warning_stripes{ + dir = 4; + icon_state = "warning_corner"; + tag = "icon-warning_corner (EAST)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) +"uWm" = ( +/obj/effect/decal/warning_stripes{ + dir = 8; + icon_state = "warning"; + tag = "icon-warning (WEST)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "vXP" = ( /obj/structure/cable{ d1 = 1; @@ -102634,6 +102821,13 @@ icon_state = "dark" }, /area/security/perma) +"wTp" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "warning_corner"; + tag = "icon-warning_corner" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "wWo" = ( /obj/structure/cable{ d1 = 1; @@ -102660,6 +102854,15 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"xiv" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/full/reinforced, +/turf/simulated/floor/plating, +/area/science/lab) "xix" = ( /obj/structure/window/reinforced{ dir = 1 @@ -102736,6 +102939,15 @@ }, /turf/simulated/floor/plating, /area/engineering/atmos) +"xvF" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/science/lab) +"xyP" = ( +/turf/simulated/wall, +/area/science/lab) "xFx" = ( /obj/structure/disposaloutlet, /obj/structure/window/reinforced{ @@ -102754,6 +102966,14 @@ /area/maintenance/fsmaint2{ name = "Auxiliary Docking" }) +"xGd" = ( +/obj/effect/decal/warning_stripes{ + dir = 1; + icon_state = "warning"; + tag = "icon-warning (NORTH)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "xIN" = ( /obj/effect/decal/warning_stripes{ icon_state = "warning"; @@ -102826,6 +103046,17 @@ }, /turf/unsimulated/floor/snow, /area/surface/forest/south) +"xTs" = ( +/obj/structure/fence/end{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + dir = 10; + icon_state = "warning"; + tag = "icon-warning (SOUTHWEST)" + }, +/turf/unsimulated/floor/snow/asphalt, +/area/science/lab) "xTt" = ( /obj/structure/cable{ d1 = 1; @@ -102853,6 +103084,7 @@ /area/security/perma) "yaW" = ( /obj/machinery/door_timer/cell_3{ + dir = 8; pixel_x = -32; pixel_y = 0 }, @@ -102862,6 +103094,22 @@ tag = "icon-darkred (WEST)" }, /area/security/brig) +"yjp" = ( +/obj/structure/table, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/item/clothing/suit/storage/wintercoat/medical/science, +/obj/machinery/media/receiver/boombox/wallmount/muzak{ + pixel_y = -24 + }, +/turf/simulated/floor{ + dir = 10; + icon_state = "purple" + }, +/area/science/lab) "ykP" = ( /obj/structure/window/reinforced{ dir = 1 @@ -126901,7 +127149,7 @@ aYZ aYZ aYZ aYZ -aYZ +aZb aYZ aYZ aZb @@ -127203,7 +127451,7 @@ aYZ aYZ aYZ aYZ -aZb +aYZ aYZ aYZ aYZ @@ -127501,11 +127749,11 @@ boL boL boL boL -aYZ -aYZ -aYZ -aYZ -aYZ +bjP +nJG +nJG +nJG +xTs aYZ aYZ aYZ @@ -127800,14 +128048,14 @@ bmX bmd boN bpM +boO +rev +yjp bjP -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ +rVw +nJR +nJR +eVS aYZ aYZ aYZ @@ -128100,19 +128348,19 @@ bkR blY bmX bmd -boO -bpO -bjP -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ +bmd +bpR +naM +kHu +noa +pcf +iZe +hta +nJR +jtQ aYZ aYZ +boz aYZ aYZ aYZ @@ -128402,16 +128650,16 @@ bkQ blX bmY bmd -boO -bpN +bmd +bpR bqx -aYZ -aYZ -aYZ -bdN -aYZ -aYZ -aYZ +kHu +noa +xiv +wTp +tYI +uUg +eVS aYZ aYZ aYZ @@ -128704,16 +128952,16 @@ bkT bma bmZ bmd -boO -bpQ +bmd +bpR bqy -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ +kHu +noa +xiv +qwz +ntc +xGd +eVS aYZ aYZ aZb @@ -129006,18 +129254,18 @@ bkS blZ bmd bmd -boO -bpP -bqy +bmd +bpR +mmF +kHu +jNt +xiv +hlM +uWm +rFQ +eVS aYZ aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -baU -aYZ boz aYZ aYZ @@ -129308,18 +129556,18 @@ bkV blY bnb bmd -boO +bmd bpR bqz +kHu +noa +ila +nJR +sdG +nJR +eVS aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -boz -aYZ +baU aYZ aYZ aYZ @@ -129612,14 +129860,14 @@ bna bnV boP boP -bnX -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ +boP +kHu +dTR +xyP +haA +xyP +nJR +eVS aYZ aYZ aYZ @@ -129914,17 +130162,17 @@ bnc bnW boP bpS -bnX -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ -aYZ +boP +qZv +jCa +haA +xvF +xyP +nJR +jtQ aYZ aYZ +bdN aYZ aYZ aYZ @@ -130216,14 +130464,14 @@ bkW bjP boP bnX +boP +boP bnX -bnX -bnX -aYZ -aYZ -aYZ -aYZ -aYZ +xyP +xyP +xyP +nJR +eVS aYZ aYZ aYZ diff --git a/nano/templates/weathercontrol.tmpl b/nano/templates/weathercontrol.tmpl new file mode 100644 index 00000000000..92dae183f6d --- /dev/null +++ b/nano/templates/weathercontrol.tmpl @@ -0,0 +1,42 @@ + +{{if data.error}} +
+
+
+ {{:data.error}} +
+
+
+{{else}} +
+
+
+
Crystal refraction:
+
{{:data.crystals}}
+
+
+
+
+
+
+
Current snowfall:
+
{{:data.currentweather}} ({{:data.remaining_time}})
+
+
+
Forecast:
+
{{:data.forecast}}
+
+
+
+
+
+
+ {{:helper.link("Disrupt", "arrowrefresh-1-w", {'disrupt': '1'})}} + {{:helper.link("Intensify", "arrowstop-1-n", {'intensify': '1'})}} + {{:helper.link("Abate", "arrowstop-1-s", {'abate': '1'})}} +
+
+
+{{/if}} \ No newline at end of file diff --git a/vgstation13.dme b/vgstation13.dme index a25c91f28ae..64963862d70 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -698,6 +698,7 @@ #include "code\game\machinery\vending.dm" #include "code\game\machinery\vending_packs.dm" #include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\weathercontrol.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\atmoalter\area_atmos_computer.dm" #include "code\game\machinery\atmoalter\canister.dm" @@ -2676,7 +2677,7 @@ #include "maprendering\maprendering.dm" #include "maps\_map.dm" #include "maps\_map_override.dm" -#include "maps\snaxi.dm" +#include "maps\tgstation.dm" #include "maps\defficiency\areas.dm" #include "maps\lampreystation\lamprey.dm" #include "maps\packedstation\telecomms.dm"