From c09ddf4bdabe2815754ed85869af5f43b510eef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Mon, 6 May 2019 11:32:11 +0300 Subject: [PATCH] Add !ready and !unready --- gameloop.py | 63 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/gameloop.py b/gameloop.py index bbe07cc..157a488 100644 --- a/gameloop.py +++ b/gameloop.py @@ -5,7 +5,7 @@ from collections import namedtuple import cardcast_api class events(enum.Enum): - quit, nick_change, status, start, kill, join, leave, players, deck_add, deck_add_random, deck_remove, deck_list, limit, card, cards = range(15) + quit, nick_change, status, start, ready, unready, kill, join, leave, players, deck_add, deck_add_random, deck_remove, deck_list, limit, card, cards = range(17) class limit_types(enum.Enum): points, rounds = range(2) @@ -41,9 +41,15 @@ def get_event(): old = input('old> ') new = input('new> ') return (events.nick_change, old, new) - if t == 'start': + elif t == 'start': nick = input('nick> ') return (events.start, nick) + elif t == 'ready': + nick = input('nick> ') + return (events.ready, nick) + elif t == 'unready': + nick = input('nick> ') + return (events.unready, nick) elif t == 'status': return (events.status,) elif t == 'kill': @@ -265,12 +271,12 @@ def game(): limit_type = {limit_types.rounds: 'rounds', limit_types.points: 'points'}[limit.type] send('Limit set to %i %s' % (limit.number, limit_type)) - elif event == events.card: - # Ignore selecting cards if it's not available + elif event == events.card or event == events.cards: + # Ignore selecting and listing cards if it's not available pass - elif event == events.cards: - # Ignore listing cards if it's not available + elif event == events.ready or event == events.unready: + # Ignore readiness commands by default pass else: @@ -309,7 +315,12 @@ def game(): def game_setup(): nonlocal players + players_ready = set() + while True: + players_unready = [i for i in players.values() if i not in players_ready] + if len(players_unready) == 0: break + if len(players) == 0: send('Lost all players, quiting game setup') return no_game @@ -317,18 +328,48 @@ def game(): event, *args = get_event() if event == events.status: - send('Game setup') + if len(players_ready) == 0: + send('Game setup') + else: + send('Game setup, waiting for %s to be ready' % ', '.join(i.nick for i in players_unready)) elif event == events.start: - if len(players) < 2: - send('Not enough players') - else: - return setup_round + break + + elif event == events.ready: + nick, = args + + # Ignore if not in the game + if nick not in players: + continue + + player = players[nick] + + if player not in players_ready: + players_ready.add(player) + + elif event == events.unready: + nick, = args + + # Ignore if not in the game + if nick not in players: + continue + + player = players[nick] + + if player in players_ready: + players_ready.remove(player) else: r = common_handler(event, args) if r is not None: return r + if len(players) < 2: + send('Not enough players') + return game_setup + else: + return setup_round + def total_calls(): nonlocal decks