diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 0caa86f68c..4ce0ccf361 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -341,7 +341,7 @@ if(probabilities[M.config_tag]<=0) qdel(M) continue - if(M.config_tag in SSvote.stored_modetier_results && SSvote.stored_modetier_results[M.config_tag] < Get(/datum/config_entry/number/dropped_modes)) + if(CONFIG_GET(flag/modetier_voting) && !(M.config_tag in SSvote.stored_modetier_results)) qdel(M) continue if(min_pop[M.config_tag]) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 940ba52946..af1b7da8da 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -396,7 +396,6 @@ config_entry_value = TRUE /datum/config_entry/flag/modetier_voting - config_entry_value = TRUE /datum/config_entry/number/dropped_modes config_entry_value = 3 diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0948e428ff..c9562bcfd1 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -188,6 +188,12 @@ SUBSYSTEM_DEF(ticker) tipped = TRUE if(timeLeft <= 0) + if(SSvote.mode && (SSvote.mode == "roundtype" || SSvote.mode == "dynamic" || SSvote.mode == "mode tiers")) + SSvote.result() + SSpersistence.SaveSavedVotes() + for(var/client/C in SSvote.voting) + C << browse(null, "window=vote;can_close=0") + SSvote.reset() current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) if(start_immediately) @@ -221,12 +227,6 @@ SUBSYSTEM_DEF(ticker) var/init_start = world.timeofday //Create and announce mode var/list/datum/game_mode/runnable_modes - if(SSvote.mode && (SSvote.mode == "roundtype" || SSvote.mode == "dynamic" || SSvote.mode == "mode tiers")) - SSvote.result() - SSpersistence.SaveSavedVotes() - for(var/client/C in SSvote.voting) - C << browse(null, "window=vote;can_close=0") - SSvote.reset() if(GLOB.master_mode == "random" || GLOB.master_mode == "secret") runnable_modes = config.get_runnable_modes() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 66aaf317fb..c67a1620f1 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -102,17 +102,18 @@ SUBSYSTEM_DEF(vote) var/list/d[][] = new/list(choices.len,choices.len) // the basic vote matrix, how many times a beats b for(var/ckey in voted) var/list/this_vote = voted[ckey] - for(var/a in 1 to choices.len) - for(var/b in a+1 to choices.len) - var/a_rank = this_vote.Find(a) - var/b_rank = this_vote.Find(b) - a_rank = a_rank ? a_rank : choices.len+1 - b_rank = b_rank ? b_rank : choices.len+1 - if(a_rank 0) @@ -219,13 +226,20 @@ SUBSYSTEM_DEF(vote) stored_gamemode_votes = list() if(!obfuscated && vote_system == RANKED_CHOICE_VOTING) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - if(!votes) - votes = 0 - if(was_roundtype_vote) - stored_gamemode_votes[choices[i]] = votes - text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes + if(mode == "mode tiers") + for(var/score_name in scores) + var/score = scores[score_name] + if(!score) + score = 0 + text = "\n[score_name]: [obfuscated ? "???" : score]" + else + for(var/i=1,i<=choices.len,i++) + var/votes = choices[choices[i]] + if(!votes) + votes = 0 + if(was_roundtype_vote) + stored_gamemode_votes[choices[i]] = votes + text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes if(mode != "custom") if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes text = "\nVote Tied Between:" @@ -247,8 +261,9 @@ SUBSYSTEM_DEF(vote) if(RANKED_CHOICE_VOTING) for(var/i=1,i<=voted.len,i++) var/list/myvote = voted[voted[i]] - for(var/j=1,j<=myvote.len,j++) - SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) + if(islist(myvote)) + for(var/j=1,j<=myvote.len,j++) + SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" if(vote_system == RANKED_CHOICE_VOTING) @@ -276,7 +291,7 @@ SUBSYSTEM_DEF(vote) if(CONFIG_GET(flag/modetier_voting)) reset() started_time = 0 - initiate_vote("mode tiers","server",hideresults=FALSE,votesystem=RANKED_CHOICE_VOTING,forced=TRUE, vote_time = 30 MINUTES) + initiate_vote("mode tiers","server",hideresults=FALSE,votesystem=SCORE_VOTING,forced=TRUE, vote_time = 30 MINUTES) to_chat(world,"The vote will end right as the round starts.") return . if("restart") @@ -290,7 +305,14 @@ SUBSYSTEM_DEF(vote) else GLOB.master_mode = . if("mode tiers") - stored_modetier_results = choices.Copy() + var/list/raw_score_numbers = list() + for(var/score_name in scores) + sorted_insert(raw_score_numbers,scores[score_name],/proc/cmp_numeric_asc) + stored_modetier_results = scores.Copy() + for(var/score_name in stored_modetier_results) + if(stored_modetier_results[score_name] <= raw_score_numbers[CONFIG_GET(number/dropped_modes)]) + stored_modetier_results -= score_name + stored_modetier_results += "traitor" if("dynamic") if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") @@ -417,6 +439,7 @@ SUBSYSTEM_DEF(vote) for(var/tag in modes_to_add) if(probabilities[tag] <= 0) modes_to_add -= tag + modes_to_add -= "traitor" // makes it so that traitor is always available choices.Add(modes_to_add) if("dynamic") for(var/T in config.storyteller_cache) @@ -516,7 +539,7 @@ SUBSYSTEM_DEF(vote) if(RANKED_CHOICE_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) - var/vote = (myvote ? (myvote.Find(i)) : 0) + var/vote = (islist(myvote) ? (myvote.Find(i)) : 0) if(vote) . += "
  • [choices[i]] ([vote])
  • " else @@ -615,8 +638,12 @@ SUBSYSTEM_DEF(vote) if(usr.ckey in voted) if(!(usr.ckey in SSpersistence.saved_votes)) SSpersistence.saved_votes[usr.ckey] = list() - SSpersistence.saved_votes[usr.ckey][mode] = voted[usr.ckey] - saved += usr.ckey + if(islist(voted[usr.ckey])) + SSpersistence.saved_votes[usr.ckey][mode] = voted[usr.ckey] + saved += usr.ckey + else + voted[usr.ckey] = list() + to_chat(usr,"Your vote was malformed! Start over!") if("load") if(!(usr.ckey in SSpersistence.saved_votes)) SSpersistence.LoadSavedVote(usr.ckey) @@ -627,7 +654,21 @@ SUBSYSTEM_DEF(vote) else SSpersistence.saved_votes[usr.ckey][mode] = list() voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode] - saved += usr.ckey + if(islist(voted[usr.ckey])) + var/malformed = FALSE + if(vote_system == SCORE_VOTING) + for(var/thing in voted[usr.ckey]) + if(!(thing in choices)) + malformed = TRUE + if(!malformed) + saved += usr.ckey + else + to_chat(usr,"Your saved vote was malformed! Start over!") + SSpersistence.saved_votes[usr.ckey] -= mode + voted -= usr.ckey + else + to_chat(usr,"Your saved vote was malformed! Start over!") + voted -= usr.ckey else if(vote_system == SCORE_VOTING) submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))