/datum/vote/New() nextvotetime = world.timeofday // + 10*config.votedelay /datum/vote/proc/canvote() var/excess = world.timeofday - vote.nextvotetime if(excess < -10000) // handle clock-wrapping problems - very long delay (>20 hrs) if wrapped vote.nextvotetime = world.timeofday return 1 return (excess >= 0) /datum/vote/proc/nextwait() return timetext( round( (nextvotetime - world.timeofday)/10) ) /datum/vote/proc/endwait() return timetext( round( (votetime - world.timeofday)/10) ) /datum/vote/proc/timetext(var/interval) var/minutes = round(interval / 60) var/seconds = round(interval % 60) var/tmin = "[minutes>0?num2text(minutes)+"min":null]" var/tsec = "[seconds>0?num2text(seconds)+"sec":null]" if(tmin && tsec) // hack to skip inter-space if either field is blank return "[tmin] [tsec]" else if(!tmin && !tsec) // return '0sec' if 0 time left return "0sec" return "[tmin][tsec]" /datum/vote/proc/getvotes() var/list/L = list() for(var/mob/M in world) if(M.client && M.client.inactivity < 1200) // clients inactive for 2 minutes don't count if (M.client.vote != "none") L[M.client.vote] += 1 return L /datum/vote/proc/endvote() if(!voting) // means that voting was aborted by an admin return world << "\red ***Voting has closed." if(config.logvote) world.log << "VOTE: Voting closed, result was [winner]" voting = 0 nextvotetime = world.timeofday + 10*config.votedelay for(var/mob/M in world) // clear vote window from all clients if(M.client) M << browse(null, "window=vote") M.client.showvote = 0 calcwin() if(mode) var/wintext = upperfirst(winner) if(winner=="default") world << "Result is \red No change." return // otherwise change mode world << "Result is change to \red [wintext]" // write resulting mode to savefile var/F = file(persistent_file) fdel(F) F << winner if(ticker) world <<"\red World will reboot in 10 seconds" sleep(100) if(config.loggame) world.log << "GAME: Rebooting due to mode vote " world.Reboot() else master_mode = winner else if(winner=="default") world << "Result is \red No restart." return world << "Result is \red Restart round." world <<"\red World will reboot in 5 seconds" sleep(50) if(config.loggame) world.log << "GAME: Rebooting due to restart vote" world.Reboot() return /datum/vote/proc/calcwin() var/list/votes = getvotes() if(vote.mode) var/best = -1 for(var/v in votes) if(v=="none") continue if(best < votes[v]) best = votes[v] var/list/winners = list() for(var/v in votes) if(votes[v] == best) winners += v var/ret = "" for(var/w in winners) if(lentext(ret) > 0) ret += "/" if(w=="default") winners = list("default") ret = "No change" break else ret += upperfirst(w) if(winners.len != 1) ret = "Tie: " + ret if(winners.len == 0) vote.winner = "default" ret = "No change" else vote.winner = pick(winners) return ret else if(votes["default"] < votes["restart"]) vote.winner = "restart" return "Restart" else vote.winner = "default" return "No restart" /mob/verb/vote() usr.client.showvote = 1 var/text = "
Current winner: [vote.calcwin()]
"
text += footer
usr << browse(text, "window=vote")
else // voting to restart
text += "Restart the world?
Current winner: [vote.calcwin()]
"
text += footer
usr << browse(text, "window=vote")
else //no vote in progress
if(!config.allowvoterestart && !config.allowvotemode)
text += "
Player voting is disabled.