From d2c59b4024b127fde70d0e3468b01cd8fd749289 Mon Sep 17 00:00:00 2001 From: DreamySkrell <107256943+DreamySkrell@users.noreply.github.com> Date: Sat, 5 Aug 2023 15:36:59 +0200 Subject: [PATCH] Voting panel sorted (#16991) * a * lint * total_players_ready and total_players * lint fix --------- Co-authored-by: DreamySkrell <> --- code/controllers/subsystems/vote.dm | 16 +++++-- .../DreamySkrell-voting-panel-a.yml | 42 +++++++++++++++++++ tgui/packages/tgui/interfaces/Voting.tsx | 42 ++++++++++++++++++- 3 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 html/changelogs/DreamySkrell-voting-panel-a.yml diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 6e3c8c25b1f..376905c3f00 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -253,7 +253,7 @@ var/datum/controller/subsystem/vote/SSvote var/datum/game_mode/M = gamemode_cache[F] if(!M) continue - AddChoice(F, capitalize(M.name), "[M.required_players]") + AddChoice(F, capitalize(M.name), "", M.required_players) AddChoice(ROUNDTYPE_STR_SECRET, "Secret") if(ROUNDTYPE_STR_MIXED_SECRET in choices) AddChoice(ROUNDTYPE_STR_MIXED_SECRET, "Mixed Secret") @@ -315,10 +315,15 @@ var/datum/controller/subsystem/vote/SSvote return 1 return 0 -/datum/controller/subsystem/vote/proc/AddChoice(name, display_name, extra_text) +/datum/controller/subsystem/vote/proc/AddChoice(name, display_name, extra_text = "", required_players = 0) if(!display_name) display_name = name - choices[name] = list("name" = display_name, "extra" = extra_text, "votes" = 0) + choices[name] = list( + "name" = display_name, + "extra" = extra_text, + "required_players" = required_players, + "votes" = 0 + ) /datum/controller/subsystem/vote/ui_state(mob/user) return always_state @@ -416,7 +421,8 @@ var/datum/controller/subsystem/vote/SSvote data["choices"] += list(list( "choice" = choice, "votes" = choices[choice]["votes"], - "extra" = choices[choice]["extra"] + "extra" = choices[choice]["extra"], + "required_players" = choices[choice]["required_players"], )) data["mode"] = mode @@ -433,6 +439,8 @@ var/datum/controller/subsystem/vote/SSvote data["is_staff"] = user.client.holder && (user.client.holder.rights & (R_ADMIN|R_MOD)) var/slevel = get_security_level() data["is_code_red"] = (slevel == "red" || slevel == "delta") + data["total_players"] = SSticker.total_players + data["total_players_ready"] = SSticker.total_players_ready return data /mob/verb/vote() diff --git a/html/changelogs/DreamySkrell-voting-panel-a.yml b/html/changelogs/DreamySkrell-voting-panel-a.yml new file mode 100644 index 00000000000..376786b4d5d --- /dev/null +++ b/html/changelogs/DreamySkrell-voting-panel-a.yml @@ -0,0 +1,42 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: DreamySkrell + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Gamemodes in the mode vote panel are sorted by required players to start." + - tweak: "Gamemodes in the mode vote panel have grayed out required player numbers, if there are less players readied up than required." diff --git a/tgui/packages/tgui/interfaces/Voting.tsx b/tgui/packages/tgui/interfaces/Voting.tsx index fe642837715..ab4721e7122 100644 --- a/tgui/packages/tgui/interfaces/Voting.tsx +++ b/tgui/packages/tgui/interfaces/Voting.tsx @@ -7,6 +7,7 @@ type VoteChoice = { choice: string; votes: number; extra: string; + required_players: number; }; export type VotingData = { @@ -18,6 +19,8 @@ export type VotingData = { allow_vote_restart: boolean; allow_vote_mode: boolean; allow_extra_antags: boolean; + total_players: number; + total_players_ready: number; }; export const Voting = (props, context) => { @@ -34,6 +37,25 @@ export const Voting = (props, context) => { export const VoteWindow = (props, context) => { const { act, data } = useBackend(context); + + const extra_column = + data.choices.filter((choice) => { + return choice.extra && choice.extra !== ''; + }).length > 0; + + const required_players_column = + data.choices.filter((choice) => { + return choice.required_players && choice.required_players > 0; + }).length > 0; + + if (required_players_column) { + data.choices.sort((a, b) => { + if (a.required_players < b.required_players) return -1; + else if (a.required_players > b.required_players) return +1; + else return 0; + }); + } + return (
{ Votes - {data.mode === 'gamemode' && ( + {extra_column && } + {required_players_column && ( Minimum Players )} @@ -67,9 +90,24 @@ export const VoteWindow = (props, context) => { /> {choice.votes} - {data.mode === 'gamemode' && ( + {extra_column && ( {choice.extra} )} + {required_players_column && ( + { + if (choice.required_players < data.total_players_ready) { + return 'white'; + } else if (choice.required_players < data.total_players) { + return 'lightgray'; + } else { + return 'gray'; + } + })()}> + {choice.required_players ? choice.required_players : ''} + + )} ))}