4
0
Fork 0
WolfBox/scripts/game_state.gd

98 lines
2.6 KiB
GDScript3
Raw Normal View History

2025-05-31 22:21:22 +01:00
extends Node
2025-06-21 14:36:09 +01:00
class_name GameState
2025-05-31 22:21:22 +01:00
2025-06-21 14:36:09 +01:00
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