diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 599563b1c81..9b191785071 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -370,8 +370,7 @@ var/datum/subsystem/ticker/ticker
world << "
[TAB]Total Population: [joined_player_list.len]"
if(station_evacuated)
world << "
[TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)"
- else
- world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)"
+ world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)"
world << "
"
//Silicon laws report
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 0ea208a2fcd..379720fcca3 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -247,10 +247,12 @@
return 0
if(isbrain(owner.current))
return 0
- if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME)
- return 0
if(!owner.current || owner.current.stat == DEAD)
return 0
+ if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith
+ return 1
+ if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME)
+ return 0
var/turf/location = get_turf(owner.current)
if(!location)
return 0
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 9d8c74ea4f8..8f57064f66d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -418,6 +418,20 @@ var/global/floorIsLava = 0
feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+/datum/admins/proc/end_round()
+ set category = "Server"
+ set name = "End Round"
+ set desc = "Attempts to produce a round end report and then restart the server organically."
+
+ if (!usr.client.holder)
+ return
+ var/confirm = alert("End the round and restart the game world?", "End Round", "Yes", "Cancel")
+ if(confirm == "Cancel")
+ return
+ if(confirm == "Yes")
+ ticker.force_ending = 1
+ feedback_add_details("admin_verb","ER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/datum/admins/proc/announce()
set category = "Special Verbs"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 194a4437e55..b6132dbf816 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -98,6 +98,7 @@ var/list/admin_verbs_spawn = list(
var/list/admin_verbs_server = list(
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
+ /datum/admins/proc/end_round,
/datum/admins/proc/delay,
/datum/admins/proc/toggleaban,
/client/proc/toggle_log_hrefs,
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 062cc7f9378..e66b3945ed7 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -352,7 +352,6 @@
message_admins("[key_name_admin(usr)] is considering ending the round.")
if(alert(usr, "This will end the round, are you SURE you want to do this?", "Confirmation", "Yes", "No") == "Yes")
- spawn(200) //I wish you would step back from that ledge my friend
if(alert(usr, "Final Confirmation: End the round NOW?", "Confirmation", "Yes", "No") == "Yes")
message_admins("[key_name_admin(usr)] has ended the round.")
ticker.force_ending = 1 //Yeah there we go APC destroyed mission accomplished