forked from Nekojimi/JackIt
98 lines
2.6 KiB
GDScript
98 lines
2.6 KiB
GDScript
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
|