extends Node class_name GameState var started: bool = false enum GameTime {DAY, NIGHT} enum VotingMethod {MAJORITY, PLURALITY} var phase: GameTime = GameTime.NIGHT: set(val): phase = val phase_changed.emit(phase) signal phase_changed(phase: GameTime) var time: float = 60: set(val): time = val time_changed.emit(time) var day_number: int = 0 signal time_changed(time: float) var game_in_progress: bool = false @onready var players: Players = $Players func game_reset() -> void: day_number = 0 time = 60 phase = GameTime.NIGHT players.call_on_active_players("game_reset") func day_reset() -> void: players.call_on_active_players("day_reset") func night_reset() -> void: players.call_on_active_players("night_reset") func count_votes_for_player(player: WolfPlayer) -> int: var ret: int = 0 for other_player in get_wolf_players(): var vote: String = other_player.vote if vote == player.player_name: ret += 1 return ret func count_votes() -> Dictionary: var ret: Dictionary for player in get_wolf_players(): ret[player] = count_votes_for_player(player) return ret func find_vote_winner(method: VotingMethod) -> WolfPlayer: var votes: Dictionary = count_votes() print("Vote tally:") var keys: Array = votes.keys() for player in keys: if votes[player] > 0: print("\t%s - %d" % [player.player_name.rpad(16), votes[player]]) var majority_vote_count: int = (votes.size() / 2) + 1 var plurality_winner: Player = null var plurality_vote_count: int = 0 keys.shuffle() for player in keys: var count = votes.get(player, 0) if count >= majority_vote_count: return player elif method == VotingMethod.PLURALITY: if count > plurality_vote_count: plurality_vote_count = count plurality_winner = player elif count == plurality_vote_count: plurality_winner = null # in a tie, no-one dies return plurality_winner func get_wolf_players(alive: bool = true) -> Array[WolfPlayer]: var ret: Array[WolfPlayer] = [] for player in players.get_active_players(): var wp: WolfPlayer = player as WolfPlayer if alive and !wp.alive: continue ret.append(wp) return ret func get_team_members(team: Team) -> Array[WolfPlayer]: return get_wolf_players().filter(func(player): return player.team == team) func count_team_members(team: Team) -> int: return get_team_members(team).size() func count_alive_players() -> int: return get_wolf_players().size() func is_team_night_action_used(team: Team) -> bool: for member in get_team_members(team): if !member.alive: continue if member.night_action_chosen != null and member.night_action_chosen.team_nightly_action: return true return false