diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 7220783038..9743988875 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -489,3 +489,6 @@ datum/projectile_data rstats[i] = environment.vars[stats[i]] temps[direction] = rstats return temps + +/proc/MinutesToTicks(var/minutes as num) + return minutes * 60 * 10 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 49063999a0..098786f59b 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -156,9 +156,8 @@ var/list/contact_levels = list(1, 5) // Defines which Z-levels which, for example, a Code Red announcement may affect var/list/player_levels = list(1, 3, 4, 5, 6) // Defines all Z-levels a character can typically reach - var/const/minutes_to_ticks = 60 * 10 // Event settings - var/expected_round_length = 60 * 3 * minutes_to_ticks // 3 hours + var/expected_round_length = 3 * 60 * 60 * 10 // 3 hours // If the first delay has a custom start time // No custom time, no custom time, between 80 to 100 minutes respectively. var/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) @@ -543,31 +542,31 @@ config.player_levels = text2numlist(value, ";") if("expected_round_length") - config.expected_round_length = text2num(value) * minutes_to_ticks + config.expected_round_length = MinutesToTicks(text2num(value)) if("event_custom_start_mundane") var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks) + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) if("event_custom_start_moderate") var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks) + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) if("event_custom_start_major") var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks) + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) if("event_delay_lower") var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = values[1] * minutes_to_ticks - config.event_delay_lower[EVENT_LEVEL_MODERATE] = values[2] * minutes_to_ticks - config.event_delay_lower[EVENT_LEVEL_MAJOR] = values[3] * minutes_to_ticks + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) if("event_delay_upper") var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = values[1] * minutes_to_ticks - config.event_delay_upper[EVENT_LEVEL_MODERATE] = values[2] * minutes_to_ticks - config.event_delay_upper[EVENT_LEVEL_MAJOR] = values[3] * minutes_to_ticks + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index cae571912e..5b612da0b3 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -441,6 +441,9 @@ var/global/datum/controller/gameticker/ticker if (findtext("[handler]","auto_declare_completion_")) call(mode, handler)() + //Ask the event manager to print round end information + event_manager.RoundEnd() + //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 25d7cad6f0..67fa4a94e0 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -56,8 +56,8 @@ var/severity = 0 //Severity. Lower means less severe, higher means more severe. Does not have to be supported. Is set on New(). var/activeFor = 0 //How long the event has existed. You don't need to change this. var/isRunning = 1 //If this event is currently running. You should not change this. - var/started = 0 //When this event started. - var/ended = 0 //When this event ended. + var/startedAt = 0 //When this event started. + var/endedAt = 0 //When this event ended. var/datum/event_meta/event_meta = null /datum/event/nothing @@ -98,6 +98,9 @@ /datum/event/proc/end() return +//Returns the latest point of event processing. +/datum/event/proc/lastProcessAt() + return max(startWhen, max(announceWhen, endWhen)) //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. @@ -117,7 +120,7 @@ end() // Everything is done, let's clean up. - if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen) + if(activeFor >= lastProcessAt()) kill() activeFor++ @@ -129,7 +132,7 @@ isRunning = 0 end() - ended = world.timeofday + endedAt = world.time event_manager.active_events -= src event_manager.event_complete(src) @@ -142,7 +145,7 @@ if(severity < EVENT_LEVEL_MUNDANE) severity = EVENT_LEVEL_MUNDANE if(severity > EVENT_LEVEL_MAJOR) severity = EVENT_LEVEL_MAJOR - started = world.timeofday + startedAt = world.time setup() ..() diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 3aeec6f2f2..1021159a56 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -26,11 +26,11 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT set_event_delay() if(delayed) - next_event_time += (world.timeofday - last_world_time) - else if(world.timeofday > next_event_time) + next_event_time += (world.time - last_world_time) + else if(world.time > next_event_time) start_event() - last_world_time = world.timeofday + last_world_time = world.time /datum/event_container/proc/start_event() if(!next_event) // If non-one has explicitly set an event, randomly pick one @@ -39,7 +39,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT // Has an event been acquired? if(next_event) // Set when the event of this type was last fired, and prepare the next event start - last_event_time[next_event] = world.timeofday + last_event_time[next_event] = world.time set_event_delay() next_event.enabled = !next_event.one_shot // This event will no longer be available in the random rotation if one shot @@ -64,7 +64,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT possible_events[EM] = event_weight for(var/event_meta in last_event_time) if(possible_events[event_meta]) - var/time_passed = world.timeofday - event_last_fired[event_meta] + var/time_passed = world.time - event_last_fired[event_meta] var/weight_modifier = max(0, (config.expected_round_length - time_passed) / 300) var/new_weight = max(possible_events[event_meta] - weight_modifier, 0) @@ -87,7 +87,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT var/lower = config.event_first_run[severity]["lower"] var/upper = config.event_first_run[severity]["upper"] var/event_delay = rand(lower, upper) - next_event_time = world.timeofday + event_delay + next_event_time = world.time + event_delay // Otherwise, follow the standard setup process else var/playercount_modifier = 1 @@ -105,9 +105,9 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT playercount_modifier = playercount_modifier * delay_modifier var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier - next_event_time = world.timeofday + event_delay + next_event_time = world.time + event_delay - log_debug("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.timeofday)/600] minutes.") + log_debug("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.time)/600] minutes.") /datum/event_container/proc/SelectEvent() var/datum/event_meta/EM = input("Select an event to queue up.", "Event Selection", null) as null|anything in available_events @@ -133,7 +133,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wall rot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), ) /datum/event_container/moderate diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index fdfdb2396b..497604a9b3 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -9,7 +9,7 @@ var/datum/event_container/selected_event_container = null var/list/datum/event/active_events = list() - var/list/events_finished = list() + var/list/datum/event/finished_events = list() var/list/datum/event/allEvents var/list/datum/event_container/event_containers = list( @@ -32,18 +32,17 @@ EC.process() /datum/event_manager/proc/event_complete(var/datum/event/E) - if(!E.event_meta) // datum/event is used here and there for random reasons + if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") return - events_finished += E + finished_events += E // Add the event back to the list of available events var/datum/event_container/EC = event_containers[E.severity] EC.available_events += E.event_meta - log_debug("Event '[E.name]' has completed.") - + log_debug("Event '[E.name]' has completed at [worldtime2text()].") /datum/event_manager/proc/Interact(var/mob/living/user) @@ -53,11 +52,31 @@ popup.set_content(html) popup.open() +/datum/event_manager/proc/RoundEnd() + if(!report_at_round_end) + return + + world << "


Random Events This Round:" + for(var/datum/event/E in active_events|finished_events) + var/datum/event_meta/EM = E.event_meta + if(EM.name == "Nothing") + continue + var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] " + if(E.isRunning) + message += "and is still running." + else + if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes + message += "and ended at [worldtime2text(E.endedAt)]." + else + message += "and ran to completion." + + world << message + /datum/event_manager/proc/GetInteractWindow() var/html = "Refresh" if(selected_event_container) - var/event_time = max(0, selected_event_container.next_event_time - world.timeofday) + 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 += "
" @@ -70,8 +89,8 @@ html += "[EM.weight]" html += "[EM.min_weight]" html += "[EM.max_weight]" - html += "[EM.one_shot]" - html += "[EM.enabled]" + html += "[EM.one_shot]" + html += "[EM.enabled]" html += "[EM.get_weight()]" html += "Remove" html += "" @@ -92,18 +111,19 @@ html += "Add
" html += "
" else - html += "Round End Report: [report_at_round_end ? "On": "Off"]
" + html += "Round End Report: [report_at_round_end ? "On": "Off"]
" html += "
" html += "

Event Start

" html += "" - html += "SeverityUntil startAdjust startPauseInterval Mod" + html += "SeverityStarts AtUntil StartAdjust StartPauseInterval Mod" for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) var/datum/event_container/EC = event_containers[severity] - var/event_time = max(0, EC.next_event_time - world.timeofday) + var/next_event_at = max(0, EC.next_event_time - world.time) html += "" html += "[severity_to_string[severity]]" - html += "[round(event_time / 600, 0.1)]" + html += "[worldtime2text(max(EC.next_event_time, world.time))]" + html += "[round(next_event_at / 600, 0.1)]" html += "" html += "--" html += "-" @@ -138,16 +158,19 @@ html += "
" html += "

Running Events

" + html += "Estimated times, affected by master controller delays." html += "" - html += "SeverityNameEnds InStop" + 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_in = max(0, round((E.started + (E.endWhen * 10) - world.timeofday) / 600, 0.1)) + var/ends_at = E.startedAt + (E.lastProcessAt() * master_controller.minimum_ticks) // A best estimate + var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1)) html += "" html += "[severity_to_string[EM.severity]]" html += "[EM.name]" + html += "[worldtime2text(ends_at)]" html += "[ends_in]" html += "Stop" html += "" @@ -160,7 +183,11 @@ if(..()) return - if(href_list["dec_timer"]) + + if(href_list["toggle_report"]) + report_at_round_end = !report_at_round_end + admin_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 * RaiseToPower(10, text2num(href_list["dec_timer"]))) EC.next_event_time -= decrease @@ -213,13 +240,13 @@ EM.weight = weight if(EM != new_event) admin_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["set_oneshot"]) - var/datum/event_meta/EM = locate(href_list["set_oneshot"]) + 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) admin_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["set_enabled"]) - var/datum/event_meta/EM = locate(href_list["set_enabled"]) + else if(href_list["toggle_enabled"]) + var/datum/event_meta/EM = locate(href_list["toggle_enabled"]) EM.enabled = !EM.enabled admin_log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["remove"]) @@ -242,9 +269,6 @@ if(EC.next_event) admin_log_and_message_admins("has unqueued the [severity_to_string[EC.severity]] event '[EC.next_event.name]'.") EC.next_event = null - else if(href_list["report"]) - report_at_round_end = !report_at_round_end - admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") Interact(usr) diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm index 6e263aaf12..c6b0a20c3a 100644 --- a/code/modules/events/wallrot.dm +++ b/code/modules/events/wallrot.dm @@ -1,5 +1,5 @@ datum/event/wallrot/setup() - name = "Wall rot" + name = "Wallrot" announceWhen = rand(0, 300) endWhen = announceWhen + 1