diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index db730a26034..8c8583cd28d 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -374,8 +374,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 179ba2c0fb1..452288e8ffd 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -280,10 +280,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..71e35f2ff89 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -221,21 +221,21 @@ var/global/floorIsLava = 0
if(6)
dat+="ERROR: Could not submit Feed story to Network.
"
if(src.admincaster_feed_channel.channel_name=="")
- dat+="•Invalid receiving channel name.
"
+ dat+="•Invalid receiving channel name.
"
if(src.admincaster_feed_message.returnBody(-1) == "" || src.admincaster_feed_message.returnBody(-1) == "\[REDACTED\]")
- dat+="•Invalid message body.
"
+ dat+="•Invalid message body.
"
dat+="
Return
"
if(7)
dat+="ERROR: Could not submit Feed Channel to Network.
"
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
- dat+="•Invalid channel name.
"
+ dat+="•Invalid channel name.
"
var/check = 0
for(var/datum/newscaster/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
if(check)
- dat+="•Channel name already in use.
"
+ dat+="•Channel name already in use.
"
dat+="
Return
"
if(9)
dat+="[admincaster_feed_channel.channel_name]: \[created by: [admincaster_feed_channel.returnAuthor(-1)]\]
"
@@ -336,9 +336,9 @@ var/global/floorIsLava = 0
if(16)
dat+="ERROR: Wanted Issue rejected by Network.
"
if(src.admincaster_wanted_message.criminal =="" || src.admincaster_wanted_message.criminal == "\[REDACTED\]")
- dat+="•Invalid name for person wanted.
"
+ dat+="•Invalid name for person wanted.
"
if(src.admincaster_wanted_message.body == "" || src.admincaster_wanted_message.body == "\[REDACTED\]")
- dat+="•Invalid description.
"
+ dat+="•Invalid description.
"
dat+="
Return
"
if(17)
dat+="Wanted Issue successfully deleted from Circulation
"
@@ -406,7 +406,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/restart()
set category = "Server"
- set name = "Restart"
+ set name = "Hard Restart"
set desc="Restarts the world immediately"
if (!usr.client.holder)
return
@@ -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"
@@ -790,4 +804,4 @@ var/global/floorIsLava = 0
tomob.ckey = frommob.ckey
qdel(frommob)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 7d0d320bbc7..e9164a44db9 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 bcc55ee136a..eec40beca16 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