#define FONT_SIZE "5pt" #define FONT_COLOR "#09f" #define FONT_STYLE "Arial Black" #define SCROLL_SPEED 2 // Status display // (formerly Countdown timer display) // Use to show shuttle ETA/ETD times // Alert status // And arbitrary messages set by comms computer /obj/machinery/status_display icon = 'icons/obj/status_display.dmi' icon_state = "frame" plane = TURF_PLANE layer = ABOVE_WINDOW_LAYER name = "status display" anchored = TRUE density = FALSE unacidable = TRUE use_power = USE_POWER_IDLE idle_power_usage = 10 circuit = /obj/item/circuitboard/status_display var/mode = 1 // 0 = Blank // 1 = Shuttle timer // 2 = Arbitrary message(s) // 3 = alert picture // 4 = Supply shuttle timer var/picture_state // icon_state of alert picture var/message1 = "" // message line 1 var/message2 = "" // message line 2 var/index1 // display index for scrolling messages or 0 if non-scrolling var/index2 var/picture = null var/frequency = DISPLAY_FREQ // radio frequency var/friendc = 0 // track if Friend Computer mode var/ignore_friendc = 0 maptext_height = 26 maptext_width = 32 var/const/CHARS_PER_LINE = 5 var/const/STATUS_DISPLAY_BLANK = 0 var/const/STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME = 1 var/const/STATUS_DISPLAY_MESSAGE = 2 var/const/STATUS_DISPLAY_ALERT = 3 var/const/STATUS_DISPLAY_TIME = 4 var/const/STATUS_DISPLAY_CUSTOM = 99 var/seclevel = "green" /obj/machinery/status_display/Destroy() if(SSradio) SSradio.remove_object(src,frequency) return ..() /obj/machinery/status_display/attackby(I as obj, user as mob) if(computer_deconstruction_screwdriver(user, I)) return else attack_hand(user) return // register for radio system /obj/machinery/status_display/Initialize(mapload) . = ..() if(SSradio) SSradio.add_object(src, frequency) // timed process /obj/machinery/status_display/process() if(stat & NOPOWER) remove_display() return update() /obj/machinery/status_display/emp_act(severity, recursive) if(stat & (BROKEN|NOPOWER)) ..(severity, recursive) return set_picture("ai_bsod") ..(severity, recursive) // set what is displayed /obj/machinery/status_display/proc/update() remove_display() if(friendc && !ignore_friendc) set_picture("ai_friend") return 1 switch(mode) if(STATUS_DISPLAY_BLANK) //blank return 1 if(STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME) //emergency shuttle timer if(!emergency_shuttle) message1 = "-ETA-" message2 = "Never" // You're here forever. return 1 if(emergency_shuttle.waiting_to_leave()) message1 = "-ETD-" if(emergency_shuttle.shuttle.is_launching()) message2 = "Launch" else message2 = get_shuttle_timer_departure() if(length(message2) > CHARS_PER_LINE) message2 = "Error" update_display(message1, message2) else if(emergency_shuttle.has_eta()) message1 = "-ETA-" message2 = get_shuttle_timer_arrival() if(length(message2) > CHARS_PER_LINE) message2 = "Error" update_display(message1, message2) return 1 if(STATUS_DISPLAY_MESSAGE) //custom messages var/line1 var/line2 if(!index1) line1 = message1 else line1 = copytext(message1+"|"+message1, index1, index1+CHARS_PER_LINE) var/message1_len = length(message1) index1 += SCROLL_SPEED if(index1 > message1_len) index1 -= message1_len if(!index2) line2 = message2 else line2 = copytext(message2+"|"+message2, index2, index2+CHARS_PER_LINE) var/message2_len = length(message2) index2 += SCROLL_SPEED if(index2 > message2_len) index2 -= message2_len update_display(line1, line2) return 1 if(STATUS_DISPLAY_ALERT) display_alert(seclevel) return 1 if(STATUS_DISPLAY_TIME) message1 = "TIME" message2 = stationtime2text() update_display(message1, message2) return 1 return 0 /obj/machinery/status_display/examine(mob/user) . = ..() if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT) . += "The display says:
\t[sanitize(message1)]
\t[sanitize(message2)]" /obj/machinery/status_display/proc/set_message(m1, m2) if(m1) index1 = (length(m1) > CHARS_PER_LINE) message1 = m1 else message1 = "" index1 = 0 if(m2) index2 = (length(m2) > CHARS_PER_LINE) message2 = m2 else message2 = "" index2 = 0 /obj/machinery/status_display/proc/display_alert(var/newlevel) remove_display() if(seclevel != newlevel) seclevel = newlevel switch(seclevel) if("green") set_light(l_range = 2, l_power = 0.25, l_color = "#00ff00") if("yellow") set_light(l_range = 2, l_power = 0.25, l_color = "#ffff00") if("violet") set_light(l_range = 2, l_power = 0.25, l_color = "#9933ff") if("orange") set_light(l_range = 2, l_power = 0.25, l_color = "#ff9900") if("blue") set_light(l_range = 2, l_power = 0.25, l_color = "#1024A9") if("red") set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000") if("delta") set_light(l_range = 4, l_power = 0.9, l_color = "#FF6633") set_picture("status_display_[seclevel]") // Called when the alert level is changed. /obj/machinery/status_display/proc/on_alert_changed(new_level) // On most alerts, this will change to a flashing alert picture in a specific color. // Doing that for green alert automatically doesn't really make sense, but it is still available on the comm consoles/PDAs. if(seclevel2num(new_level) == SEC_LEVEL_GREEN) mode = STATUS_DISPLAY_TIME set_light(0) // Remove any glow we had from the alert previously. update() return mode = STATUS_DISPLAY_ALERT display_alert(new_level) /obj/machinery/status_display/proc/set_picture(state) remove_display() if(!picture || picture_state != state) picture_state = state picture = image('icons/obj/status_display.dmi', icon_state=picture_state) add_overlay(picture) /obj/machinery/status_display/proc/update_display(line1, line2) var/new_text = {"
[line1]
[line2]
"} if(maptext != new_text) maptext = new_text /obj/machinery/status_display/proc/get_shuttle_timer_arrival() if(!emergency_shuttle) return "Error" var/timeleft = emergency_shuttle.estimate_arrival_time() if(timeleft < 0) return "" return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" /obj/machinery/status_display/proc/get_shuttle_timer_departure() if(!emergency_shuttle) return "Error" var/timeleft = emergency_shuttle.estimate_launch_time() if(timeleft < 0) return "" return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" /obj/machinery/status_display/proc/get_supply_shuttle_timer() var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle if(!shuttle) return "Error" if(shuttle.has_arrive_time()) var/timeleft = round((shuttle.arrive_time - world.time) / 10,1) if(timeleft < 0) return "Late" return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" return "" /obj/machinery/status_display/proc/remove_display() cut_overlays() if(maptext) maptext = "" /obj/machinery/status_display/receive_signal(datum/signal/signal) switch(signal.data["command"]) if("blank") mode = STATUS_DISPLAY_BLANK set_light(0) if("shuttle") mode = STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME set_light(0) if("message") mode = STATUS_DISPLAY_MESSAGE set_message(signal.data["msg1"], signal.data["msg2"]) set_light(0) if("alert") mode = STATUS_DISPLAY_ALERT set_picture(signal.data["picture_state"]) if("time") mode = STATUS_DISPLAY_TIME set_light(0) update() #undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE #undef SCROLL_SPEED