From e80057fe96c19cf58dd5ad6931d226869d5550b0 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 13 Aug 2023 05:45:56 +0200 Subject: [PATCH] [MIRROR] Adds Mining Weather Radios [MDB IGNORE] (#23048) * Adds Mining Weather Radios * Update cargo.dm * Moves these edits to modular --------- Co-authored-by: Lamb <110322848+CoiledLamb@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 + _maps/map_files/MetaStation/MetaStation.dmm | 2 + _maps/map_files/Mining/Lavaland.dmm | 5 + _maps/map_files/NorthStar/north_star.dmm | 1 + _maps/map_files/tramstation/tramstation.dmm | 1 + code/datums/components/weatherannouncer.dm | 175 ++++++++++++++++++ .../orders/order_items/mining/order_mining.dm | 4 + code/game/machinery/mining_weather_monitor.dm | 26 +++ .../crates_lockers/closets/secure/cargo.dm | 5 +- code/modules/mining/equipment/miningradio.dm | 24 +++ icons/obj/miningradio.dmi | Bin 0 -> 3542 bytes .../structures/crates_lockers/secure/cargo.dm | 5 + tgstation.dme | 4 + 14 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 code/datums/components/weatherannouncer.dm create mode 100644 code/game/machinery/mining_weather_monitor.dm create mode 100644 code/modules/mining/equipment/miningradio.dm create mode 100644 icons/obj/miningradio.dmi create mode 100644 modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ca73059086c..4a8c0a9c3df 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -25390,8 +25390,8 @@ /area/station/science/xenobiology) "gmK" = ( /obj/structure/cable, -/obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "gmP" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ddc65ea3eec..47440827f34 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -9561,6 +9561,7 @@ req_access = list("aux_base") }, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "cRX" = ( @@ -66960,6 +66961,7 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "vtA" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 82f5a8571ea..d4f1987740e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -8468,6 +8468,7 @@ /obj/item/stack/rods/fifty, /obj/effect/spawner/random/trash/janitor_supplies, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/mining_weather_monitor/directional/east, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "dhi" = ( @@ -32330,6 +32331,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/mining_weather_monitor/directional/east, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) "lRS" = ( diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index a3097e98682..98136e8fcfb 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -259,6 +259,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) "cb" = ( @@ -1799,6 +1800,7 @@ /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/west, /turf/open/floor/iron/checker, /area/mine/cafeteria) "kV" = ( @@ -2501,6 +2503,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 }, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "nA" = ( @@ -3712,6 +3715,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "vp" = ( @@ -7016,6 +7020,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron/smooth_edge{ dir = 1 }, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 0c56241957a..d32728e3899 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -65486,6 +65486,7 @@ /area/station/service/library) "rdZ" = ( /obj/structure/cable, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 }, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 33e066a3243..98041c2caa7 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -59214,6 +59214,7 @@ dir = 9 }, /obj/machinery/light/directional/west, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "uhw" = ( diff --git a/code/datums/components/weatherannouncer.dm b/code/datums/components/weatherannouncer.dm new file mode 100644 index 00000000000..fec31ccf9d3 --- /dev/null +++ b/code/datums/components/weatherannouncer.dm @@ -0,0 +1,175 @@ +#define WEATHER_ALERT_CLEAR 0 +#define WEATHER_ALERT_INCOMING 1 +#define WEATHER_ALERT_IMMINENT_OR_ACTIVE 2 + +/// Component which makes you yell about what the weather is +/datum/component/weather_announcer + /// Currently displayed warning level + var/warning_level = WEATHER_ALERT_CLEAR + /// Whether the incoming weather is actually going to harm you + var/is_weather_dangerous = TRUE + /// Are we actually turned on right now? + var/enabled = TRUE + /// Overlay added when things are alright + var/state_normal + /// Overlay added when you should start looking for shelter + var/state_warning + /// Overlay added when you are in danger + var/state_danger + +/datum/component/weather_announcer/Initialize( + state_normal, + state_warning, + state_danger, +) + . = ..() + if (!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + START_PROCESSING(SSprocessing, src) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_RESTORED, PROC_REF(on_powered)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_lost)) + + src.state_normal = state_normal + src.state_warning = state_warning + src.state_danger = state_danger + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/Destroy(force, silent) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/// Add appropriate overlays +/datum/component/weather_announcer/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + if (!enabled || !state_normal || !state_warning || !state_danger) + return + + switch (warning_level) + if(WEATHER_ALERT_CLEAR) + overlays += state_normal + if(WEATHER_ALERT_INCOMING) + overlays += state_warning + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + overlays += (is_weather_dangerous) ? state_danger : state_warning + +/// If powered, receive updates +/datum/component/weather_announcer/proc/on_powered() + SIGNAL_HANDLER + enabled = TRUE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/// If no power, don't receive updates +/datum/component/weather_announcer/proc/on_power_lost() + SIGNAL_HANDLER + enabled = FALSE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/datum/component/weather_announcer/process(seconds_per_tick) + if (!enabled) + return + + var/previous_level = warning_level + var/previous_danger = is_weather_dangerous + set_current_alert_level() + if(previous_level == warning_level && previous_danger == is_weather_dangerous) + return // No change + var/atom/movable/speaker = parent + speaker.say(get_warning_message()) + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/proc/update_light_color() + var/atom/movable/light = parent + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + light.set_light_color(LIGHT_COLOR_GREEN) + if(WEATHER_ALERT_INCOMING) + light.set_light_color(LIGHT_COLOR_DIM_YELLOW) + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + light.set_light_color(LIGHT_COLOR_INTENSE_RED) + light.update_light() + +/// Returns a string we should display to communicate what you should be doing +/datum/component/weather_announcer/proc/get_warning_message() + if (!is_weather_dangerous) + return "No risk expected from incoming weather front." + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + return "All clear, no weather alerts to report." + if(WEATHER_ALERT_INCOMING) + return "Weather front incoming, begin to seek shelter." + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + return "Weather front imminent, find shelter immediately." + return "Error in meteorological calculation. Please report this deviation to a trained programmer." + +/datum/component/weather_announcer/proc/time_till_storm() + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + if(!length(mining_z_levels)) + return // No problems if there are no mining z levels + + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + for (var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + return 0 + + var/time_until_next = INFINITY + for(var/mining_level in mining_z_levels) + var/next_time = timeleft(SSweather.next_hit_by_zlevel["[mining_level ]"]) || INFINITY + if (next_time && next_time < time_until_next) + time_until_next = next_time + return time_until_next + +/// Polls existing weather for what kind of warnings we should be displaying. +/datum/component/weather_announcer/proc/set_current_alert_level() + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return // No problems if there are no mining z levels + if(time_until_next >= 2 MINUTES) + warning_level = WEATHER_ALERT_CLEAR + return + + if(time_until_next >= 30 SECONDS) + warning_level = WEATHER_ALERT_INCOMING + return + + // Weather is here, now we need to figure out if it is dangerous + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + for(var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + is_weather_dangerous = !check_weather.aesthetic + return + +/datum/component/weather_announcer/proc/on_examine(atom/radio, mob/examiner, list/examine_texts) + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return + if (time_until_next == 0) + examine_texts += span_warning ("A storm is currently active, please seek shelter.") + else + examine_texts += span_notice("The next storm is inbound in [DisplayTimeText(time_until_next)].") + +/datum/component/weather_announcer/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/weather_announcer/UnregisterFromParent() + .=..() + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) + +#undef WEATHER_ALERT_CLEAR +#undef WEATHER_ALERT_INCOMING +#undef WEATHER_ALERT_IMMINENT_OR_ACTIVE diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 55c6ed63a65..09bbeed2bed 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -102,3 +102,7 @@ /datum/orderable_item/mining/style_meter item_path = /obj/item/style_meter cost_per_order = 1500 + +/datum/orderable_item/mining/weather_radio + item_path = /obj/item/radio/weather_monitor + cost_per_order = 400 diff --git a/code/game/machinery/mining_weather_monitor.dm b/code/game/machinery/mining_weather_monitor.dm new file mode 100644 index 00000000000..d05d8820751 --- /dev/null +++ b/code/game/machinery/mining_weather_monitor.dm @@ -0,0 +1,26 @@ +/// Wall mounted mining weather tracker +/obj/machinery/mining_weather_monitor + name = "barometric monitor" + desc = "A machine monitoring atmospheric data from mining environments. Provides warnings about incoming weather fronts." + icon = 'icons/obj/miningradio.dmi' + icon_state = "wallmount" + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/machinery/mining_weather_monitor/Initialize(mapload, ndir, nbuild) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "wallgreen", \ + state_warning = "wallyellow", \ + state_danger = "wallred", \ + ) + +/obj/machinery/mining_weather_monitor/update_overlays() + . = ..() + if((machine_stat & BROKEN) || !powered()) + return + . += emissive_appearance(icon, "emissive", src) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/mining_weather_monitor, 28) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index dc55e46897d..2287c4f2d51 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -6,6 +6,8 @@ /obj/structure/closet/secure_closet/quartermaster/PopulateContents() ..() new /obj/item/storage/lockbox/medal/cargo(src) + new /obj/item/radio/weather_monitor (src) + new /obj/item/radio/headset/heads/qm(src) new /obj/item/megaphone/cargo(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/universal_scanner(src) @@ -13,9 +15,6 @@ new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/qm(src) new /obj/item/circuitboard/machine/ore_silo(src) - new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! - new /obj/item/cargo_teleporter(src) // SKYRAT EDIT - Adds a cargo teleporter to QM locker, so they can intice others to research it - new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) //SKYRAT EDIT - GUN CARGO new /obj/item/storage/bag/garment/quartermaster(src) /obj/structure/closet/secure_closet/quartermaster/populate_contents_immediate() diff --git a/code/modules/mining/equipment/miningradio.dm b/code/modules/mining/equipment/miningradio.dm new file mode 100644 index 00000000000..559740599db --- /dev/null +++ b/code/modules/mining/equipment/miningradio.dm @@ -0,0 +1,24 @@ +/// Portable mining radio purchasable by miners +/obj/item/radio/weather_monitor + icon = 'icons/obj/miningradio.dmi' + name = "mining weather radio" + icon_state = "miningradio" + desc = "A weather radio designed for use in inhospitable environments. Gives audible warnings when storms approach. Has access to cargo channel." + freqlock = RADIO_FREQENCY_LOCKED + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/item/radio/weather_monitor/update_overlays() + . = ..() + . += emissive_appearance(icon, "small_emissive", src, alpha = src.alpha) + +/obj/item/radio/weather_monitor/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "weatherwarning", \ + state_warning = "urgentwarning", \ + state_danger = "direwarning", \ + ) + set_frequency(FREQ_SUPPLY) diff --git a/icons/obj/miningradio.dmi b/icons/obj/miningradio.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e3d10f3b6d62e4c276ff32938328489366d1a5d1 GIT binary patch literal 3542 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 literal 0 HcmV?d00001 diff --git a/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm b/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm new file mode 100644 index 00000000000..359f964f68b --- /dev/null +++ b/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm @@ -0,0 +1,5 @@ +/obj/structure/closet/secure_closet/quartermaster/PopulateContents() + ..() + new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! + new /obj/item/cargo_teleporter(src) // Adds a cargo teleporter to QM locker, so they can entice others to research it + new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) diff --git a/tgstation.dme b/tgstation.dme index dc2230d6265..f5029530b4e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1176,6 +1176,7 @@ #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" #include "code\datums\components\wearertargeting.dm" +#include "code\datums\components\weatherannouncer.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\container_item\container_item.dm" #include "code\datums\components\container_item\tank_holder.dm" @@ -1767,6 +1768,7 @@ #include "code\game\machinery\mechlaunchpad.dm" #include "code\game\machinery\medical_kiosk.dm" #include "code\game\machinery\medipen_refiller.dm" +#include "code\game\machinery\mining_weather_monitor.dm" #include "code\game\machinery\modular_shield.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\nebula_shielding.dm" @@ -4123,6 +4125,7 @@ #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\mineral_scanner.dm" #include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\miningradio.dm" #include "code\modules\mining\equipment\resonator.dm" #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\equipment\wormhole_jaunter.dm" @@ -5689,6 +5692,7 @@ #include "modular_skyrat\master_files\code\game\objects\structures\towel_bins.dm" #include "modular_skyrat\master_files\code\game\objects\structures\trash_pile.dm" #include "modular_skyrat\master_files\code\game\objects\structures\watercloset.dm" +#include "modular_skyrat\master_files\code\game\objects\structures\crates_lockers\secure\cargo.dm" #include "modular_skyrat\master_files\code\game\turfs\closed\_closed.dm" #include "modular_skyrat\master_files\code\game\turfs\open\floor\iron_floor.dm" #include "modular_skyrat\master_files\code\game\turfs\open\space\space.dm"