//The UI portion. Should probably be made its own thing/made into a NanoUI thing later. /datum/controller/subsystem/events var/window_x = 700 var/window_y = 600 var/report_at_round_end = 0 var/table_options = " align='center'" var/row_options1 = " width='85px'" var/row_options2 = " width='260px'" var/row_options3 = " width='150px'" var/datum/event_container/selected_event_container = null /datum/controller/subsystem/events/proc/Interact(var/mob/living/user) var/html = GetInteractWindow() var/datum/browser/popup = new(user, "event_manager", "Event Manager", window_x, window_y) popup.set_content(html) popup.open() /datum/controller/subsystem/events/proc/GetInteractWindow() var/html = "Refresh" html += "Pause All - [config.allow_random_events ? "Pause" : "Resume"]" if(selected_event_container) var/event_time = max(0, selected_event_container.next_event_time - world.time) html += "Back
" html += "Time till start: [round(event_time / 600, 0.1)]
" html += "
" html += "

Available [severity_to_string[selected_event_container.severity]] Events (queued & running events will not be displayed)

" html += "" html += "Name Weight MinWeight MaxWeight OneShot Enabled CurrWeight Remove" var/list/active_with_role = number_active_with_role() for(var/datum/event_meta/EM in selected_event_container.available_events) html += "" html += "[EM.name]" html += "[EM.weight]" html += "[EM.min_weight]" html += "[EM.max_weight]" html += "[EM.one_shot]" html += "[EM.enabled]" html += "[selected_event_container.get_weight(EM, active_with_role)]" html += "Remove" html += "" html += "" html += "
" html += "
" html += "

Add Event

" html += "" html += "NameTypeWeightOneShot" html += "" html += "[new_event.name ? new_event.name : "Enter Event"]" html += "[new_event.event_type ? new_event.event_type : "Select Type"]" html += "[new_event.weight ? new_event.weight : 0]" html += "[new_event.one_shot]" html += "" html += "" html += "Add
" html += "
" else html += "Round End Report: [report_at_round_end ? "On": "Off"]
" html += "
" html += "

Event Start

" html += "" html += "SeverityStarts AtStarts InAdjust StartPauseInterval Mod" for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/datum/event_container/EC = event_containers[severity] var/next_event_at = max(0, EC.next_event_time - world.time) html += "" html += "[severity_to_string[severity]]" html += "[worldtime2stationtime(max(EC.next_event_time, world.time))]" html += "[round(next_event_at / 600, 0.1)]" html += "" html += "--" html += "-" html += "+" html += "++" html += "" html += "" html += "[EC.delayed ? "Resume" : "Pause"]" html += "" html += "" html += "[EC.delay_modifier]" html += "" html += "" html += "" html += "
" html += "
" html += "

Next Event

" html += "" html += "SeverityNameEvent RotationClear" for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/datum/event_container/EC = event_containers[severity] var/datum/event_meta/EM = EC.next_event html += "" html += "[severity_to_string[severity]]" html += "[EM ? EM.name : "Random"]" html += "View" html += "Clear" html += "" html += "" html += "
" html += "
" html += "

Running Events

" html += "Estimated times, affected by process scheduler delays." html += "" html += "SeverityNameEnds AtEnds InStop" for(var/datum/event/E in active_events) if(!E.event_meta) continue var/datum/event_meta/EM = E.event_meta var/ends_at = E.startedAt + (E.lastProcessAt() * 20) // A best estimate, based on how often the alarm manager processes var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1)) html += "" html += "[severity_to_string[EM.severity]]" html += "[EM.name]" html += "[worldtime2stationtime(ends_at)]" html += "[ends_in]" html += "Stop" html += "" html += "" html += "
" return html /datum/controller/subsystem/events/Topic(href, href_list) if(..()) return if(href_list["toggle_report"]) report_at_round_end = !report_at_round_end log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") else if(href_list["dec_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/decrease = 60 * (10 ** text2num(href_list["dec_timer"])) EC.next_event_time -= decrease log_and_message_admins("decreased timer for [severity_to_string[EC.severity]] events by [decrease/600] minute(s).") else if(href_list["inc_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/increase = 60 * (10 ** text2num(href_list["inc_timer"])) EC.next_event_time += increase log_and_message_admins("increased timer for [severity_to_string[EC.severity]] events by [increase/600] minute(s).") else if(href_list["select_event"]) var/datum/event_container/EC = locate(href_list["select_event"]) var/datum/event_meta/EM = EC.SelectEvent() if(EM) log_and_message_admins("has queued the [severity_to_string[EC.severity]] event '[EM.name]'.") else if(href_list["pause"]) var/datum/event_container/EC = locate(href_list["pause"]) EC.delayed = !EC.delayed log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [severity_to_string[EC.severity]] events.") else if(href_list["pause_all"]) config.allow_random_events = text2num(href_list["pause_all"]) log_and_message_admins("has [config.allow_random_events ? "resumed" : "paused"] countdown for all events.") else if(href_list["interval"]) var/delay = input(usr, "Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null if(delay && delay > 0) var/datum/event_container/EC = locate(href_list["interval"]) EC.delay_modifier = delay log_and_message_admins("has set the interval modifier for [severity_to_string[EC.severity]] events to [EC.delay_modifier].") else if(href_list["stop"]) if(tgui_alert(usr, "Stopping an event may have unintended side-effects. Continue?","Stopping Event!",list("Yes","No")) != "Yes") return var/datum/event/E = locate(href_list["stop"]) var/datum/event_meta/EM = E.event_meta log_and_message_admins("has stopped the [severity_to_string[EM.severity]] event '[EM.name]'.") E.kill() else if(href_list["view_events"]) selected_event_container = locate(href_list["view_events"]) else if(href_list["back"]) selected_event_container = null else if(href_list["set_name"]) var/name = sanitize(input(usr, "Enter event name.", "Set Name") as text|null) if(name) var/datum/event_meta/EM = locate(href_list["set_name"]) EM.name = name else if(href_list["set_type"]) var/type = tgui_input_list(usr, "Select event type.", "Select", allEvents) if(type) var/datum/event_meta/EM = locate(href_list["set_type"]) EM.event_type = type else if(href_list["set_weight"]) var/weight = input(usr, "Enter weight. A higher value means higher chance for the event of being selected.", "Set Weight") as num|null if(weight && weight > 0) var/datum/event_meta/EM = locate(href_list["set_weight"]) EM.weight = weight if(EM != new_event) log_and_message_admins("has changed the weight of the [severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].") else if(href_list["toggle_oneshot"]) var/datum/event_meta/EM = locate(href_list["toggle_oneshot"]) EM.one_shot = !EM.one_shot if(EM != new_event) log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["toggle_enabled"]) var/datum/event_meta/EM = locate(href_list["toggle_enabled"]) EM.enabled = !EM.enabled log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["remove"]) if(tgui_alert(usr, "This will remove the event from rotation. Continue?","Removing Event!",list("Yes","No")) != "Yes") return var/datum/event_meta/EM = locate(href_list["remove"]) var/datum/event_container/EC = locate(href_list["EC"]) EC.available_events -= EM log_and_message_admins("has removed the [severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["add"]) if(!new_event.name || !new_event.event_type) return if(tgui_alert(usr, "This will add a new event to the rotation. Continue?","Add Event!",list("Yes","No")) != "Yes") return new_event.severity = selected_event_container.severity selected_event_container.available_events += new_event log_and_message_admins("has added \a [severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].") new_event = new else if(href_list["clear"]) var/datum/event_container/EC = locate(href_list["clear"]) if(EC.next_event) log_and_message_admins("has dequeued the [severity_to_string[EC.severity]] event '[EC.next_event.name]'.") EC.next_event = null Interact(usr) /client/proc/forceEvent(var/type in SSevents.allEvents) set name = "Trigger Event (Debug Only)" set category = "Debug" if(!holder) return if(ispath(type)) new type(new /datum/event_meta(EVENT_LEVEL_MAJOR)) message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) /client/proc/event_manager_panel() set name = "Event Manager Panel" set category = "Admin" SSevents.Interact(usr) feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!