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 += "
| Severity | Until start | Adjust start | Pause | Interval Mod | ||||||||||||||
| Severity | Starts At | Until Start | Adjust Start | Pause | Interval Mod | |||||||||||||
| [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 += "
|