From 3e4721b9d4db57b6679e3fcb0cd57d3d03e237ef Mon Sep 17 00:00:00 2001 From: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Thu, 11 Jul 2024 06:54:00 +0200 Subject: [PATCH] Incident displays: wallening edition (#84812) ## About The Pull Request Redoes the delam/tram incident displays to be wallening compatible. ![image](https://github.com/tgstation/tgstation/assets/83487515/34c4c930-7fe8-4dda-b95a-60d3011cb047) ## Why It's Good For The Game Looks better, and won't be jank when wallening comes. ## Changelog :cl: LT3 image: Incident displays got a makeover /:cl: --- _maps/map_files/Birdshot/birdshot.dmm | 2 +- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 8 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/NorthStar/north_star.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 7 +- _maps/map_files/wawastation/wawastation.dmm | 3 +- _maps/shuttles/pirate_grey.dmm | 67 ++-- .../persistence/counter_delamination.dm | 2 +- code/game/machinery/incident_display.dm | 303 +++++++++++------- .../supermatter_delamination/_sm_delam.dm | 2 +- icons/obj/machines/incident_display.dmi | Bin 5693 -> 7351 bytes .../Scripts/84812_incident_display_repath.txt | 4 + 13 files changed, 230 insertions(+), 174 deletions(-) create mode 100644 tools/UpdatePaths/Scripts/84812_incident_display_repath.txt diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index a4a6e8345d6..d6ae0288489 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -69977,7 +69977,7 @@ /obj/effect/turf_decal/siding/brown{ dir = 1 }, -/obj/machinery/incident_display/dual/directional/north, +/obj/machinery/incident_display/bridge/directional/north, /turf/open/floor/iron/smooth, /area/station/command/bridge) "wLd" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 36ed6f1f93f..75011169106 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -16232,7 +16232,7 @@ /obj/structure/table/reinforced, /obj/item/paper_bin, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/incident_display/delam/directional/south, +/obj/machinery/incident_display/bridge/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "dXO" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index c5ddd225cdf..ab3ce10a93e 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1688,10 +1688,6 @@ }, /turf/open/floor/plating, /area/station/science/robotics/lab) -"aAf" = ( -/obj/machinery/incident_display/delam, -/turf/closed/wall/r_wall, -/area/station/command/bridge) "aAi" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/table/wood/fancy/red, @@ -41645,6 +41641,7 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, +/obj/machinery/incident_display/bridge/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "mDw" = ( @@ -48144,6 +48141,7 @@ "oxe" = ( /obj/machinery/computer/cargo/request, /obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/incident_display/bridge/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "oxh" = ( @@ -242658,7 +242656,7 @@ xwC utR pAZ bln -aAf +qWZ oxe vmj aqB diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4d41b26a817..796751bc80e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -35009,7 +35009,7 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, -/obj/machinery/incident_display/delam/directional/south, +/obj/machinery/incident_display/bridge/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "mwj" = ( diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 8f7285e09da..081edcaf677 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -42273,7 +42273,7 @@ pixel_x = -22 }, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/incident_display/delam/directional/north, +/obj/machinery/incident_display/bridge/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) "kWJ" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 7df8f7ebb46..f7d2f203ba1 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -27279,7 +27279,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/incident_display/dual/directional/south, +/obj/machinery/incident_display/tram/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "iOC" = ( @@ -29067,7 +29067,7 @@ /obj/machinery/camera/directional/north{ c_tag = "Command - Bridge North" }, -/obj/machinery/incident_display/dual/directional/north, +/obj/machinery/incident_display/bridge/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "jsW" = ( @@ -31671,6 +31671,7 @@ /obj/effect/spawner/random/vending/snackvend{ pixel_x = -5 }, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "kkg" = ( @@ -59126,7 +59127,7 @@ c_tag = "Civilian - Recreational Area North-West" }, /obj/item/toy/plush/lizard_plushie/space/green, -/obj/machinery/incident_display/dual/directional/north, +/obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "tRo" = ( diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 771b7f2d6a0..d57ce84f183 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -41571,8 +41571,8 @@ /area/station/command/bridge) "oOP" = ( /obj/structure/cable, -/obj/structure/fireaxecabinet/directional/south, /obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/incident_display/bridge/directional/south, /turf/open/floor/iron, /area/station/command/bridge) "oOR" = ( @@ -62046,6 +62046,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, +/obj/structure/fireaxecabinet/directional/east, /turf/open/floor/iron, /area/station/command/bridge) "vQT" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 22356be732c..db02acbdd48 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -1495,9 +1495,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/shuttle/pirate) -"ZU" = ( -/turf/closed/wall, -/area/shuttle/pirate) (1,1,1) = {" je @@ -1671,7 +1668,7 @@ qm Ti "} (10,1,1) = {" -ZU +Pn Ut kw CH @@ -1686,7 +1683,7 @@ Yj rV Tq uE -ZU +Pn HD "} (11,1,1) = {" @@ -1705,7 +1702,7 @@ wX Oa Tq Lo -ZU +Pn ei "} (12,1,1) = {" @@ -1714,7 +1711,7 @@ sB GE Yj Nu -ZU +Pn am Eq yN @@ -1731,7 +1728,7 @@ HD HD XX vJ -ZU +Pn SB Nm Vw @@ -1743,14 +1740,14 @@ Sh gQ dd xy -ZU +Pn HD "} (14,1,1) = {" pk pS pU -ZU +Pn QO Ac Wc @@ -1766,10 +1763,10 @@ Sh zB "} (15,1,1) = {" -ZU +Pn dI Sv -ZU +Pn Bu xO yf @@ -1788,7 +1785,7 @@ zB zB vM lO -ZU +Pn tJ xO ax @@ -1852,17 +1849,17 @@ sm CY fj DG -ZU +Pn Ci Sh Gb xm -ZU +Pn je "} (20,1,1) = {" je -ZU +Pn ia NI yU @@ -1871,18 +1868,18 @@ bv aD cJ tU -ZU +Pn xl Sh AR lO -ZU +Pn je "} (21,1,1) = {" je -ZU -ZU +Pn +Pn xm yU OG @@ -1890,30 +1887,30 @@ qo pT De sh -ZU +Pn Zc -ZU +Pn pB -ZU -ZU +Pn +Pn je "} (22,1,1) = {" je je -ZU +Pn EA ll FI Hh -ZU -ZU +Pn +Pn Hh -ZU +Pn gz -ZU +Pn RX -ZU +Pn je je "} @@ -1930,8 +1927,8 @@ ti Yf FI aV -ZU -ZU +Pn +Pn je je je @@ -1949,7 +1946,7 @@ Am FT pk pk -ZU +Pn je je je @@ -1962,8 +1959,8 @@ je je pk zB -ZU -ZU +Pn +Pn zB pk pk diff --git a/code/controllers/subsystem/persistence/counter_delamination.dm b/code/controllers/subsystem/persistence/counter_delamination.dm index 81dca300c7e..dba683bc929 100644 --- a/code/controllers/subsystem/persistence/counter_delamination.dm +++ b/code/controllers/subsystem/persistence/counter_delamination.dm @@ -8,7 +8,7 @@ rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH)) if(fexists(DELAMINATION_HIGHSCORE_FILEPATH)) delam_highscore = text2num(file2text(DELAMINATION_HIGHSCORE_FILEPATH)) - for(var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + for(var/obj/machinery/incident_display/sign as anything in GLOB.map_incident_displays) sign.update_delam_count(rounds_since_engine_exploded, delam_highscore) /datum/controller/subsystem/persistence/proc/save_delamination_counter() diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm index b8452675c71..77194a26dd7 100644 --- a/code/game/machinery/incident_display.dm +++ b/code/game/machinery/incident_display.dm @@ -1,4 +1,8 @@ -GLOBAL_LIST_EMPTY(map_delamination_counters) +/** + * List of incident displays on the map + * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. + */ +GLOBAL_LIST_EMPTY(map_incident_displays) /// Display days since last delam on incident sign #define DISPLAY_DELAM (1<<0) @@ -13,25 +17,28 @@ DEFINE_BITFIELD(sign_features, list( #define TREND_RISING "rising" #define TREND_FALLING "falling" -#define NAME_DUAL "safety incident display" #define NAME_DELAM "delamination incident display" #define NAME_TRAM "tram incident display" -#define DESC_DUAL "A display that provides information on the station's safety record. Features an advert for SAFETY MOTH." #define DESC_DELAM "A signs describe how long it's been since the last delamination incident. Features an advert for SAFETY MOTH." -#define DESC_TRAM "A display that provides the number of tram related safety incidents this shift. Features an advert for SAFETY MOTH." +#define DESC_TRAM "A display that provides the number of tram related safety incidents this shift." -/** - * List of safety statistic signs on the map that have delam counting enabled. - * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. - */ +#define DISPLAY_PIXEL_1_W 21 +#define DISPLAY_PIXEL_1_Z -2 +#define DISPLAY_PIXEL_2_W 16 +#define DISPLAY_PIXEL_2_Z -2 +#define DISPLAY_BASE_ALPHA 64 +#define DISPLAY_PIXEL_ALPHA 96 + +#define LIGHT_COLOR_NORMAL "#4b4290" +#define LIGHT_COLOR_SHAME "#e24e76" /obj/machinery/incident_display name = NAME_DELAM desc = DESC_DELAM icon = 'icons/obj/machines/incident_display.dmi' - icon_preview = "stat_display_delam" - icon_state = "stat_display_delam" + icon_preview = "display_normal" + icon_state = "display_normal" verb_say = "beeps" verb_ask = "bloops" verb_exclaim = "blares" @@ -41,6 +48,10 @@ DEFINE_BITFIELD(sign_features, list( custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT * 4) /// What statistics we want the sign to display var/sign_features = DISPLAY_DELAM + /// Delam digits color + var/delam_display_color = COLOR_DISPLAY_YELLOW + /// Tram hits digits color + var/tram_display_color = COLOR_DISPLAY_BLUE /// Tram hits before hazard warning var/hit_threshold = 0 /// Tram hits @@ -49,49 +60,88 @@ DEFINE_BITFIELD(sign_features, list( var/last_delam = 0 /// Delam record high-score var/delam_record = 0 + /// If the display is currently running live updated content + var/live_display = FALSE + /// The default advert to show on this display + var/configured_advert + /// Duration of the advert set on this display + var/configured_advert_duration + /// How often to show an advert + var/advert_frequency = 30 SECONDS + /// Timer for sign currently showing an advert + COOLDOWN_DECLARE(active_advert) + /// Cooldown until next advert + COOLDOWN_DECLARE(advert_cooldown) -/obj/machinery/incident_display/dual - name = NAME_DUAL - desc = DESC_DUAL - icon_preview = "stat_display_dual" - icon_state = "stat_display_dual" - sign_features = DISPLAY_DELAM | DISPLAY_TRAM +/obj/machinery/incident_display/bridge /obj/machinery/incident_display/delam name = NAME_DELAM desc = DESC_DELAM - icon_preview = "stat_display_delam" - icon_state = "stat_display_delam" sign_features = DISPLAY_DELAM + configured_advert = "advert_meson" + configured_advert_duration = 7 SECONDS /obj/machinery/incident_display/tram name = NAME_TRAM desc = DESC_TRAM - icon_preview = "stat_display_tram" - icon_state = "stat_display_tram" sign_features = DISPLAY_TRAM -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/bridge, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/delam, 32) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/dual, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) /obj/machinery/incident_display/Initialize(mapload) ..() + register_context() return INITIALIZE_HINT_LATELOAD /obj/machinery/incident_display/post_machine_initialize() . = ..() - GLOB.map_delamination_counters += src + GLOB.map_incident_displays += src update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) RegisterSignal(SStransport, COMSIG_TRAM_COLLISION, PROC_REF(update_tram_count)) update_appearance() /obj/machinery/incident_display/Destroy() - GLOB.map_delamination_counters -= src + GLOB.map_incident_displays -= src return ..() +/obj/machinery/incident_display/process() + if(!isnull(configured_advert) && COOLDOWN_FINISHED(src, advert_cooldown))// time to show an advert + show_advert(advert = configured_advert, duration = configured_advert_duration) + COOLDOWN_START(src, advert_cooldown, rand(advert_frequency - 5 SECONDS, advert_frequency + 5 SECONDS)) + return + + if(!live_display) // displaying static content, no processing required + return + + if(machine_stat & (NOPOWER|BROKEN|MAINT)) + return + + if(COOLDOWN_FINISHED(src, active_advert)) // advert finished, revert to static content + COOLDOWN_RESET(src, active_advert) + live_display = FALSE + update_appearance() + +/obj/machinery/incident_display/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(!isliving(user)) + return + + var/mob/living/living_user = user + + if(held_item?.tool_behaviour == TOOL_WELDER && !living_user.combat_mode && atom_integrity < max_integrity) + context[SCREENTIP_CONTEXT_LMB] = "repair display" + + if(held_item?.tool_behaviour == TOOL_MULTITOOL && !living_user.combat_mode) + if(sign_features == DISPLAY_TRAM) + context[SCREENTIP_CONTEXT_LMB] = "change to delam mode" + else + context[SCREENTIP_CONTEXT_LMB] = "change to tram mode" + + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/incident_display/welder_act(mob/living/user, obj/item/tool) if(user.combat_mode) return FALSE @@ -101,7 +151,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) return TRUE balloon_alert(user, "repairing display...") - if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50)) + if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume = 50)) return TRUE balloon_alert(user, "repaired") @@ -117,35 +167,22 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) if(sign_features == DISPLAY_TRAM) tool.play_tool_sound(src) - balloon_alert(user, "set to dual") - name = NAME_DUAL - desc = DESC_DUAL - icon_state = "stat_display_dual" - sign_features = DISPLAY_DELAM | DISPLAY_TRAM + balloon_alert(user, "set to delam") + name = NAME_DELAM + desc = DESC_DELAM + sign_features = DISPLAY_DELAM update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) - update_tram_count(src, SSpersistence.tram_hits_this_round) update_appearance() return TRUE - else if(sign_features == DISPLAY_DELAM) + else tool.play_tool_sound(src) balloon_alert(user, "set to tram") name = NAME_TRAM desc = DESC_TRAM - icon_state = "stat_display_tram" sign_features = DISPLAY_TRAM update_tram_count(src, SSpersistence.tram_hits_this_round) update_appearance() return TRUE - else if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) - tool.play_tool_sound(src) - balloon_alert(user, "set to delam") - name = NAME_DELAM - desc = DESC_DELAM - icon_state = "stat_display_delam" - sign_features = DISPLAY_DELAM - update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) - update_appearance() - return TRUE // EMP causes the display to display random numbers or outright break. /obj/machinery/incident_display/emp_act(severity) @@ -154,14 +191,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) set_machine_stat(machine_stat | BROKEN) update_appearance() return - name = NAME_DUAL - desc = DESC_DUAL - icon_state = "stat_display_dual" - sign_features = DISPLAY_DELAM | DISPLAY_TRAM + hit_threshold = rand(1,99) hit_count = rand(1,99) - last_delam = rand(1,99) - delam_record = rand(1,99) + + if(prob(33)) + last_delam = 0 + delam_record = 0 + else + last_delam = rand(1,99) + delam_record = rand(1,99) + update_appearance() /obj/machinery/incident_display/on_deconstruction(disassembled) @@ -169,159 +209,165 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) +/** + * Update the delamination count on the display + * + * Use the provided args to update the incident display when in delam mode. + * Arguments: + * * new_count - number of shifts without a delam + * * record - current high score for the delam count + */ /obj/machinery/incident_display/proc/update_delam_count(new_count, record) delam_record = record last_delam = min(new_count, 199) update_appearance() +/** + * Update the tram hit count on the display + * + * Sign receives a signal from SStransport that the tram has hit someone, and updates the count. + * Arguments: + * * source - hopefully is the transport subsystem + * * tram_collisions - current number of tram hits + */ /obj/machinery/incident_display/proc/update_tram_count(source, tram_collisions) SIGNAL_HANDLER hit_count = min(tram_collisions, 199) update_appearance() -/obj/machinery/incident_display/update_appearance(updates=ALL) +/** + * Run an animated advert on the display + * + * Arguments: + * * advert - icon state to flick to + * * duration - length of the advert animation + */ +/obj/machinery/incident_display/proc/show_advert(advert, duration = 7 SECONDS) + COOLDOWN_START(src, active_advert, duration) + live_display = TRUE + update_appearance() + flick(advert, src) + +/obj/machinery/incident_display/update_appearance(updates = ALL) . = ..() if(machine_stat & NOPOWER) - icon_state = "stat_display_blank" + icon_state = "display_normal" set_light(l_on = FALSE) return - - if(machine_stat & BROKEN) - icon_state = "stat_display_broken" - else if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) - icon_state = "stat_display_dual" - else if(sign_features == DISPLAY_DELAM) - icon_state = "stat_display_delam" - else if(sign_features == DISPLAY_TRAM) - icon_state = "stat_display_tram" - - set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_FAINT_CYAN, l_on = TRUE) + else if(machine_stat & BROKEN) + icon_state = "display_broken" + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_NORMAL, l_on = TRUE) + else if((sign_features & DISPLAY_DELAM) && last_delam <= 0) // you done fucked up + icon_state = "display_shame" + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_SHAME, l_on = TRUE) + else + icon_state = "display_normal" + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_NORMAL, l_on = TRUE) /obj/machinery/incident_display/update_overlays() . = ..() if(machine_stat & (NOPOWER|BROKEN)) return - var/mutable_appearance/moff_base_emissive = emissive_appearance(icon, "moff_base_emissive", src, alpha = src.alpha) - . += moff_base_emissive + . += emissive_appearance(icon, "display_emissive", src, alpha = DISPLAY_BASE_ALPHA) + + if(COOLDOWN_STARTED(src, active_advert)) // we don't show the static content during adverts + return if(sign_features & DISPLAY_DELAM) - var/mutable_appearance/delam_base_emissive = emissive_appearance(icon, "delam_base_emissive", src, alpha = src.alpha) - var/delam_display_color - . += delam_base_emissive - if(last_delam <= 0) - delam_display_color = COLOR_DISPLAY_RED - else - delam_display_color = COLOR_DISPLAY_YELLOW + . += mutable_appearance(icon, "overlay_delam") + . += emissive_appearance(icon, "overlay_delam", src, alpha = DISPLAY_PIXEL_ALPHA) var/delam_pos1 = clamp(last_delam, 0, 199) % 10 var/mutable_appearance/delam_pos1_overlay = mutable_appearance(icon, "num_[delam_pos1]") - var/mutable_appearance/delam_pos1_emissive = emissive_appearance(icon, "num_[delam_pos1]_e", src, alpha = src.alpha) + var/mutable_appearance/delam_pos1_emissive = emissive_appearance(icon, "num_[delam_pos1]", src, alpha = DISPLAY_PIXEL_ALPHA) delam_pos1_overlay.color = delam_display_color - delam_pos1_overlay.pixel_w = 9 - delam_pos1_emissive.pixel_w = 9 - delam_pos1_overlay.pixel_z = 4 - delam_pos1_emissive.pixel_z = 4 + delam_pos1_overlay.pixel_w = DISPLAY_PIXEL_1_W + delam_pos1_emissive.pixel_w = DISPLAY_PIXEL_1_W + delam_pos1_overlay.pixel_z = DISPLAY_PIXEL_1_Z + delam_pos1_emissive.pixel_z = DISPLAY_PIXEL_1_Z . += delam_pos1_overlay . += delam_pos1_emissive var/delam_pos2 = (clamp(last_delam, 0, 199) / 10) % 10 var/mutable_appearance/delam_pos2_overlay = mutable_appearance(icon, "num_[delam_pos2]") - var/mutable_appearance/delam_pos2_emissive = emissive_appearance(icon, "num_[delam_pos2]_e", src, alpha = src.alpha) + var/mutable_appearance/delam_pos2_emissive = emissive_appearance(icon, "num_[delam_pos2]", src, alpha = DISPLAY_PIXEL_ALPHA) delam_pos2_overlay.color = delam_display_color - delam_pos2_overlay.pixel_w = 4 - delam_pos2_emissive.pixel_w = 4 - delam_pos2_overlay.pixel_z = 4 - delam_pos2_emissive.pixel_z = 4 + delam_pos2_overlay.pixel_w = DISPLAY_PIXEL_2_W + delam_pos2_emissive.pixel_w = DISPLAY_PIXEL_2_W + delam_pos2_overlay.pixel_z = DISPLAY_PIXEL_2_Z + delam_pos2_emissive.pixel_z = DISPLAY_PIXEL_2_Z . += delam_pos2_overlay . += delam_pos2_emissive if(last_delam >= 100) - var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_red") - var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_red", src, alpha = src.alpha) - . += there_i_fixed_it_overlay - . += there_i_fixed_it_emissive + . += mutable_appearance(icon, "num_100_red") + . += emissive_appearance(icon, "num_100_red", src, alpha = DISPLAY_BASE_ALPHA) if(last_delam == delam_record) var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_RISING) - var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_RISING]", src, alpha = DISPLAY_PIXEL_ALPHA) delam_trend_overlay.color = COLOR_DISPLAY_GREEN - delam_trend_overlay.pixel_w = 1 - delam_trend_emissive.pixel_w = 1 - delam_trend_overlay.pixel_z = 6 - delam_trend_emissive.pixel_z = 6 . += delam_trend_overlay . += delam_trend_emissive else var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_FALLING) - var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]", src, alpha = DISPLAY_PIXEL_ALPHA) delam_trend_overlay.color = COLOR_DISPLAY_RED - delam_trend_overlay.pixel_w = 1 - delam_trend_emissive.pixel_w = 1 - delam_trend_overlay.pixel_z = 6 - delam_trend_emissive.pixel_z = 6 . += delam_trend_overlay . += delam_trend_emissive if(sign_features & DISPLAY_TRAM) - var/mutable_appearance/tram_base_emissive = emissive_appearance(icon, "tram_base_emissive", src, alpha = src.alpha) - var/tram_display_color = COLOR_DISPLAY_BLUE + . += mutable_appearance(icon, "overlay_tram") + . += emissive_appearance(icon, "overlay_tram", src, alpha = DISPLAY_PIXEL_ALPHA) var/tram_pos1 = hit_count % 10 var/mutable_appearance/tram_pos1_overlay = mutable_appearance(icon, "num_[tram_pos1]") - var/mutable_appearance/tram_pos1_emissive = emissive_appearance(icon, "num_[tram_pos1]_e", src, alpha = src.alpha) - . += tram_base_emissive + var/mutable_appearance/tram_pos1_emissive = emissive_appearance(icon, "num_[tram_pos1]", src, alpha = DISPLAY_PIXEL_ALPHA) tram_pos1_overlay.color = tram_display_color - tram_pos1_overlay.pixel_w = 9 - tram_pos1_emissive.pixel_w = 9 - tram_pos1_overlay.pixel_z = -6 - tram_pos1_emissive.pixel_z = -6 + tram_pos1_overlay.pixel_w = DISPLAY_PIXEL_1_W + tram_pos1_emissive.pixel_w = DISPLAY_PIXEL_1_W + tram_pos1_overlay.pixel_z = DISPLAY_PIXEL_1_Z + tram_pos1_emissive.pixel_z = DISPLAY_PIXEL_1_Z . += tram_pos1_overlay . += tram_pos1_emissive var/tram_pos2 = (hit_count / 10) % 10 var/mutable_appearance/tram_pos2_overlay = mutable_appearance(icon, "num_[tram_pos2]") - var/mutable_appearance/tram_pos2_emissive = emissive_appearance(icon, "num_[tram_pos2]_e", src, alpha = src.alpha) + var/mutable_appearance/tram_pos2_emissive = emissive_appearance(icon, "num_[tram_pos2]", src, alpha = DISPLAY_PIXEL_ALPHA) tram_pos2_overlay.color = tram_display_color - tram_pos2_overlay.pixel_w = 4 - tram_pos2_emissive.pixel_w = 4 - tram_pos2_overlay.pixel_z = -6 - tram_pos2_emissive.pixel_z = -6 + tram_pos2_overlay.pixel_w = DISPLAY_PIXEL_2_W + tram_pos2_emissive.pixel_w = DISPLAY_PIXEL_2_W + tram_pos2_overlay.pixel_z = DISPLAY_PIXEL_2_Z + tram_pos2_emissive.pixel_z = DISPLAY_PIXEL_2_Z . += tram_pos2_overlay . += tram_pos2_emissive if(hit_count >= 100) - var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_blue") - var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_blue", src, alpha = src.alpha) - . += there_i_fixed_it_overlay - . += there_i_fixed_it_emissive + . += mutable_appearance(icon, "num_100_blue") + . += emissive_appearance(icon, "num_100_blue", src, alpha = DISPLAY_BASE_ALPHA) if(hit_count > SSpersistence.tram_hits_last_round) var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_RISING) - var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_RISING]", src, alpha = DISPLAY_PIXEL_ALPHA) tram_trend_overlay.color = COLOR_DISPLAY_RED - tram_trend_overlay.pixel_w = 1 - tram_trend_emissive.pixel_w = 1 - tram_trend_overlay.pixel_z = -4 - tram_trend_emissive.pixel_z = -4 . += tram_trend_overlay . += tram_trend_emissive else var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_FALLING) - var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]", src, alpha = DISPLAY_PIXEL_ALPHA) tram_trend_overlay.color = COLOR_DISPLAY_GREEN - tram_trend_overlay.pixel_w = 1 - tram_trend_emissive.pixel_w = 1 - tram_trend_overlay.pixel_z = -4 - tram_trend_emissive.pixel_z = -4 . += tram_trend_overlay . += tram_trend_emissive /obj/machinery/incident_display/examine(mob/user) . = ..() + if(atom_integrity < max_integrity) + . += span_notice("It can be repaired with a [EXAMINE_HINT("welder")].") if(sign_features & DISPLAY_DELAM) + . += span_notice("It can be changed to display tram hits with a [EXAMINE_HINT("multitool")].") if(last_delam >= 0) . += span_info("It has been [last_delam] shift\s since the last delamination event at this Nanotrasen facility.") switch(last_delam) @@ -339,6 +385,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) . += span_info("The supermatter crystal has delaminated, in case you didn't notice.") if(sign_features & DISPLAY_TRAM) + . += span_notice("It can be changed to display delam-free shifts with a [EXAMINE_HINT("multitool")].") . += span_info("The station has had [hit_count] tram incident\s this shift.") switch(hit_count) if(0) @@ -357,13 +404,21 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) #undef DISPLAY_DELAM #undef DISPLAY_TRAM -#undef NAME_DUAL #undef NAME_DELAM #undef NAME_TRAM -#undef DESC_DUAL #undef DESC_DELAM #undef DESC_TRAM #undef TREND_RISING #undef TREND_FALLING + +#undef DISPLAY_PIXEL_1_W +#undef DISPLAY_PIXEL_1_Z +#undef DISPLAY_PIXEL_2_W +#undef DISPLAY_PIXEL_2_Z +#undef DISPLAY_BASE_ALPHA +#undef DISPLAY_PIXEL_ALPHA + +#undef LIGHT_COLOR_NORMAL +#undef LIGHT_COLOR_SHAME diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm index 2e4d0671a9d..862cdb02435 100644 --- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(sm_delam_list, list( if (sm.is_main_engine) SSpersistence.delam_highscore = SSpersistence.rounds_since_engine_exploded SSpersistence.rounds_since_engine_exploded = ROUNDCOUNT_ENGINE_JUST_EXPLODED - for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + for (var/obj/machinery/incident_display/sign as anything in GLOB.map_incident_displays) sign.update_delam_count(ROUNDCOUNT_ENGINE_JUST_EXPLODED) qdel(sm) diff --git a/icons/obj/machines/incident_display.dmi b/icons/obj/machines/incident_display.dmi index 80d63134f1d0232fbb052638972a342267a98d2a..863a5001315252c20f691f023fc82465b64a71d9 100644 GIT binary patch literal 7351 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 bc!K=(FS@S+*@nRjNkBzGUB2XzS-^h)y-7@l literal 5693 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