From 232811dd18c58b8e6e52228a4ca0486d08c0ac2b Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 23 Dec 2019 22:43:54 -0800 Subject: [PATCH] vote overhaul start --- code/controllers/subsystem/vote.dm | 52 ++++++++++++------- code/game/gamemodes/dynamic/dynamic.dm | 3 +- .../gamemodes/dynamic/dynamic_storytellers.dm | 10 +++- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 068ef2c1c0..bbe71c0f2b 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -8,11 +8,15 @@ SUBSYSTEM_DEF(vote) runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use. + +/datum/vote var/initiator = null var/started_time = null var/end_time = 0 var/mode = null var/vote_system = PLURALITY_VOTING + var/name = "Vote" var/question = null var/list/choices = list() var/list/choice_descs = list() // optional descriptions @@ -23,9 +27,11 @@ SUBSYSTEM_DEF(vote) var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes - var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use. +/datum/vote/New() + . = ..() + START_PROCESSING(SSvote,src) -/datum/controller/subsystem/vote/fire() //called by master_controller +/datum/vote/process() if(mode) if(end_time < world.time) result() @@ -43,7 +49,7 @@ SUBSYSTEM_DEF(vote) -/datum/controller/subsystem/vote/proc/reset() +/datum/vote/proc/reset() initiator = null end_time = 0 mode = null @@ -55,7 +61,7 @@ SUBSYSTEM_DEF(vote) obfuscated = FALSE //CIT CHANGE - obfuscated votes remove_action_buttons() -/datum/controller/subsystem/vote/proc/get_result() +/datum/vote/proc/get_result() //get the highest number of votes var/greatest_votes = 0 var/total_votes = 0 @@ -90,7 +96,7 @@ SUBSYSTEM_DEF(vote) . += option return . -/datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text) +/datum/vote/proc/calculate_condorcet_votes() // https://en.wikipedia.org/wiki/Schulze_method#Implementation var/list/d[][] = new/list(choices.len,choices.len) // the basic vote matrix, how many times a beats b for(var/ckey in voted) @@ -127,22 +133,19 @@ SUBSYSTEM_DEF(vote) for(var/i in 1 to choices.len) for(var/j in 1 to choices.len) if(i != j) - SSblackbox.record_feedback("nested tally","voting",p[i][j],list(blackbox_text,"Shortest Paths",choices[i],choices[j])) + SSblackbox.record_feedback("nested tally","voting",p[i][j],list(name,"Shortest Paths",choices[i],choices[j])) if(p[i][j] >= p[j][i]) choices[choices[i]]++ // higher shortest path = better candidate, so we add to choices here // choices[choices[i]] is the schulze ranking, here, rather than raw vote numbers -/datum/controller/subsystem/vote/proc/announce_result() - var/vote_title_text +/datum/vote/proc/announce_result() var/text if(question) text += "[question]" - vote_title_text = "[question]" else text += "[capitalize(mode)] Vote" - vote_title_text = "[capitalize(mode)] Vote" if(vote_system == RANKED_CHOICE_VOTING) - calculate_condorcet_votes(vote_title_text) + calculate_condorcet_votes() var/list/winners = get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) @@ -190,7 +193,7 @@ SUBSYSTEM_DEF(vote) message_admins(admintext) return . -/datum/controller/subsystem/vote/proc/result() +/datum/vote/proc/result() // TODO: update result to be different for each vote type . = announce_result() var/restart = 0 if(.) @@ -244,7 +247,7 @@ SUBSYSTEM_DEF(vote) return . -/datum/controller/subsystem/vote/proc/submit_vote(vote) +/datum/vote/proc/submit_vote(vote) if(mode) if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder) return 0 @@ -284,7 +287,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] += vote return 0 -/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, hideresults, votesystem = PLURALITY_VOTING, forced = FALSE)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes +/datum/vote/proc/initiate_vote(vote_type, initiator_key, hideresults, votesystem = PLURALITY_VOTING, forced = FALSE)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes vote_system = votesystem if(!mode) if(started_time) @@ -367,10 +370,14 @@ SUBSYSTEM_DEF(vote) popup.set_window_options("can_close=0") popup.set_content(SSvote.interface(C)) popup.open(0) + if(question) + name = "[question]" + else + name = "[capitalize(mode)] Vote" return 1 return 0 -/datum/controller/subsystem/vote/proc/interface(client/C) +/datum/vote/proc/interface(client/C) if(!C) return var/admin = 0 @@ -425,6 +432,14 @@ SUBSYSTEM_DEF(vote) . += "
" if(admin) . += "(Cancel Vote) " + . += "Close" + return . + +/datum/controller/subsystem/vote/proc/interface() + if(votes.len) + . += "

Ongoing votes: